/*
 * 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.
 */
//
// Specification of  protocol buffers that are used with the Android
// service.
//
// Note: unless otherwise specified in a comment, all fields in all messages
// are required, even though they are listed as optional.

syntax = "proto2";

package com.google.protos.ipc.invalidation;

option optimize_for = LITE_RUNTIME;

option java_outer_classname = "AndroidService";


import "client.proto";
import "client_protocol.proto";
import "java_client.proto";

// Call from application to Ticl.

message ClientDowncall {
  message StartDowncall {}
  message StopDowncall {}
  message AckDowncall {
    optional bytes ack_handle = 1;
  }
  message RegistrationDowncall {
    repeated ObjectIdP registrations = 1;
    repeated ObjectIdP unregistrations = 2;
  }

  // Serial number to prevent intent reordering.
  // TODO: use.
  optional int64 serial = 1;
  optional Version version = 2;

  // Exactly one of the following fields must be set.
  optional StartDowncall start = 3;
  optional StopDowncall stop = 4;
  optional AckDowncall ack = 5;
  optional RegistrationDowncall registrations = 6;
}

// Internal (non-public) call from application to Ticl.
message InternalDowncall {
  message ServerMessage {
    optional bytes data = 1;
  }
  message NetworkStatus {
    optional bool is_online = 1;
  }
  message CreateClient {
    optional int32 client_type = 1;  //  client type code.
    optional bytes client_name = 2;  //  application client id.
    optional ClientConfigP client_config = 3;  // Client config.

    // Whether the client should not be started on creation. Must always be
    // false for production use.
    optional bool skip_start_for_test = 4;
  }
  optional Version version = 1;

  // Exactly one must be set.
  optional ServerMessage server_message = 2;
  optional NetworkStatus network_status = 3;
  optional bool network_addr_change = 4;
  optional CreateClient create_client = 5;
}

// Upcall from Ticl to application listener.

message ListenerUpcall {
  message ReadyUpcall {}

  message InvalidateUpcall {
    // Required.
    optional bytes ack_handle = 1;

    // Exactly one must be set.
    optional InvalidationP invalidation = 2;
    optional ObjectIdP invalidate_unknown = 3;
    optional bool invalidate_all = 4;
  }

  message RegistrationStatusUpcall {
    optional ObjectIdP object_id = 1;
    optional bool is_registered = 2;
  }

  message RegistrationFailureUpcall {
    optional ObjectIdP object_id = 1;
    optional bool transient = 2;
    optional string message = 3;
  }

  message ReissueRegistrationsUpcall {
    optional bytes prefix = 1;
    optional int32 length = 2;
  }

  message ErrorUpcall {
    optional int32 error_code = 1;
    optional string error_message = 2;
    optional bool is_transient = 3;
  }

  // Serial number to prevent intent reordering. Not currently used.
  // TODO: use
  optional int64 serial = 1;
  optional Version version = 2;

  // Exactly one must be sent.
  optional ReadyUpcall ready = 3;
  optional InvalidateUpcall invalidate = 4;
  optional RegistrationStatusUpcall registration_status = 5;
  optional RegistrationFailureUpcall registration_failure = 6;
  optional ReissueRegistrationsUpcall reissue_registrations = 7;
  optional ErrorUpcall error = 8;
}

// Internal proto used by the Android scheduler to represent an event to run.
message AndroidSchedulerEvent {
  optional Version version = 1;

  // Name of the recurring task to execute.
  optional string event_name = 2;

  // Generation number of the Ticl with which this event is associated. Used to
  // prevent old events from accidentally firing on new Ticls.
  optional int64 ticl_id = 3;
}

// Internal proto used by the Android network to represent a message to send
// to the data center from the client.
message AndroidNetworkSendRequest {
  optional Version version = 1;  // Required
  optional bytes message = 2;  // Required
}

// Protocol buffer used to store state for a persisted Ticl.
message AndroidTiclState {
  message Metadata {
    // All fields are required.
    optional int32 client_type = 1;  //  client type code.
    optional bytes client_name = 2;  //  application client id.
    optional int64 ticl_id = 3;      // Ticl uniquifier.
    optional ClientConfigP client_config = 4;  //  client config.
  }
  optional Version version = 1;
  optional InvalidationClientState ticl_state = 2;  // Marshalled Ticl.
  optional Metadata metadata = 3;  // Extra state needed to construct a Ticl.
}

// An AndroidTiclState state plus a digest; this is the protocol buffer actually
// stored persistently by the service.
message AndroidTiclStateWithDigest {
  optional AndroidTiclState state = 1;
  optional bytes digest = 2;  // Digest of "state."
}
