// Copyright 2009 Google Inc. All Rights Reserved.

package polo.wire.protobuf;

//removing deprecated option.
//refer go/namespacing-nano for additional details.
//option javanano_use_deprecated_package = true;
option java_outer_classname = "PoloProto";
option java_package = "com.google.polo.wire.protobuf";
option optimize_for = LITE_RUNTIME;

// OuterMessage - base outer message type used in the protocol.

message OuterMessage {

  // MessageType indicates the type of the enclosed message (serialized in the
  // `payload` field)
  enum MessageType {
    // Initialization phase
    MESSAGE_TYPE_PAIRING_REQUEST = 10;
    MESSAGE_TYPE_PAIRING_REQUEST_ACK = 11;

    // Configuration phase
    MESSAGE_TYPE_OPTIONS = 20;
    MESSAGE_TYPE_CONFIGURATION = 30;
    MESSAGE_TYPE_CONFIGURATION_ACK = 31;

    // Pairing phase
    MESSAGE_TYPE_SECRET = 40;
    MESSAGE_TYPE_SECRET_ACK = 41;
  }

  // Protocol status states.
  enum Status {
    STATUS_OK = 200;
    STATUS_ERROR = 400;
    STATUS_BAD_CONFIGURATION = 401;
    STATUS_BAD_SECRET = 402;
  }

  required uint32 protocol_version = 1 [default = 1];

  // Protocol status. Any status other than STATUS_OK implies a fault.
  required Status status = 2;

  // Encapsulated message.  These fields are required if status is STATUS_OK.
  optional MessageType type = 3;
  optional bytes payload = 4;

}


//
// Initialization messages
//

message PairingRequest {
  // String name of the service to pair with.  The name used should be an
  // established convention of the application protocol.
  required string service_name = 1;

  // Descriptive name of the client.
  optional string client_name = 2;
}

message PairingRequestAck {
  // Descriptive name of the server.
  optional string server_name = 1;
}


//
// Configuration messages
//

message Options {
  message Encoding {
    enum EncodingType {
      ENCODING_TYPE_UNKNOWN = 0;
      ENCODING_TYPE_ALPHANUMERIC = 1;
      ENCODING_TYPE_NUMERIC = 2;
      ENCODING_TYPE_HEXADECIMAL = 3;
      ENCODING_TYPE_QRCODE = 4;
    }

    required EncodingType type = 1;
    required uint32 symbol_length = 2;
  }

  enum RoleType {
    ROLE_TYPE_UNKNOWN = 0;
    ROLE_TYPE_INPUT = 1;
    ROLE_TYPE_OUTPUT = 2;
  }

  // List of encodings this endpoint accepts when serving as an input device.
  repeated Encoding input_encodings = 1;

  // List of encodings this endpoint can generate as an output device.
  repeated Encoding output_encodings = 2;

  // Preferred role, if any.
  optional RoleType preferred_role = 3;
}

message Configuration {
  // The encoding to be used in this session.
  required Options.Encoding encoding = 1;

  // The role of the client (ie, the one initiating pairing). This implies the
  // peer (server) acts as the complementary role.
  required Options.RoleType client_role = 2;
}

message ConfigurationAck {
}


//
// Pairing messages
//

message Secret {
  required bytes secret = 1;
}

message SecretAck {
  required bytes secret = 1;
}

