/*
 * Copyright 2011 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
//
// The Android delivery service's network endpoint id descriptor.
// This proto is internal to the Android channel.

syntax = "proto2";

package com.google.protos.ipc.invalidation;

option optimize_for = LITE_RUNTIME;



option java_outer_classname = "NanoAndroidChannel";
option java_package = "com.google.protos.ipc.invalidation";


import "client_protocol.proto";

// Defines the valid major versions of the android channel protocol.  The
// channel version controls the expected envelope syntax and semantics of
// http and c2dm messages sent between the client and server.
enum MajorVersion {

  // The initial version of the android channel protocol.  Inbound and
  // outbound channel packets contained a single binary protocol message only.
  INITIAL = 0;

  // Adds batching (multiple protocol messages in a single channel message)
  BATCH = 1;

  // The default channel version used by Android clients.   Lower major numbers
  // will represent earlier versions and higher numbers will represent
  // experimental versions that are not yet released.
  DEFAULT = 0;

  // The minimum and maximum supported channel major versions.  Used to validate
  // incoming requests, so update as new versions are added or old versions are
  // no longer supported.
  MIN_SUPPORTED = 0;
  MAX_SUPPORTED = 1;
}

// An id that specifies how to route a message to a Ticl on an Android device
// via C2DM.
message AndroidEndpointId {
  // Field 1 was once the ProtocolVersion of this message.

  // The "registration_id" returned when the client registers with c2dm.  This
  // id is required by c2dm in order to send a message to the device.
  optional string c2dm_registration_id = 2;

  // A key identifying a specific client on a device.
  optional string client_key = 3;

  // The C2DM sender ID to use to deliver messages to the endpoint.
  optional string sender_id = 4 [deprecated = true];

  // Defines the expected channel version generated by the network endpoint or
  // expected in messages sent from the server.
  optional Version channel_version = 5;

  // The package name of the Android application that will receive the messages.
  // Replaces sender_id. Must be set (unless sender_id is set; in which case it
  // must not be set).
  optional string package_name = 6;
}

// A message addressed to a particular Ticl on an Android device.
message AddressedAndroidMessage {
  // Client on the device to which the message is destined.
  optional string client_key = 1;

  // Message contents (serialized ServerToClientMessage).
  optional bytes message = 2;
}

// A batch of messages addressed to potentially-different Ticls on the same
// Android device.
message AddressedAndroidMessageBatch {
  repeated AddressedAndroidMessage addressed_message = 1;
}
