/*
 * 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.
 */
//
// Common utilities used by all channel related protos.
// This is also publicly visible to all channel implementors.

syntax = "proto2";

package com.google.protos.ipc.invalidation;

option optimize_for = LITE_RUNTIME;

option java_outer_classname = "ChannelCommon";




message ChannelMessageEncoding {
    // What kind of encoding is used for network_message
  enum MessageEncoding {
    // Raw proto encoding
    PROTOBUF_BINARY_FORMAT = 1;

  }
}

message NetworkEndpointId {
  enum NetworkAddress {
    TEST = 1;  // A delivery service for testing

    // Low numbers reserved.
    ANDROID = 113;  // Android delivery service using c2dm / http.
    LCS = 114;  // Lightweight connection service () channel.
  }
  optional NetworkAddress network_address = 1;
  optional bytes client_address = 2;

  // Optional. When true, the client is considered offline but the
  // client_address is maintained so that the client can potentially be reached.
  // When false or undefined, the client is considered online.
  optional bool is_offline = 3;
}
