17c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// Copyright 2012 Google Inc. All Rights Reserved. 27c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// 37c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// Licensed under the Apache License, Version 2.0 (the "License"); 47c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// you may not use this file except in compliance with the License. 57c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// You may obtain a copy of the License at 67c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// 77c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// http://www.apache.org/licenses/LICENSE-2.0 87c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// 97c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// Unless required by applicable law or agreed to in writing, software 107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// distributed under the License is distributed on an "AS IS" BASIS, 117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// See the License for the specific language governing permissions and 137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// limitations under the License. 147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#ifndef POLO_WIRE_PROTOBUF_PROTOBUFWIREADAPTER_H_ 167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#define POLO_WIRE_PROTOBUF_PROTOBUFWIREADAPTER_H_ 177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#include <string> 197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#include <vector> 207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#include "polo/wire/polowireadapter.h" 227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#include "polo/wire/protobuf/polo.pb.h" 237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetnamespace polo { 257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetnamespace wire { 267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetnamespace protobuf { 277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// Polo wire adapter that transmits Polo messages using protocol buffers. 297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetclass ProtobufWireAdapter : public PoloWireAdapter { 307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet public: 317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Creates a new protocol buffer adapter on the given interface 327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // @param interface the wire interface used to send and receive data 337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet explicit ProtobufWireAdapter(PoloWireInterface* interface); 347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet virtual ~ProtobufWireAdapter() {} 357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet /** @override */ 377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet virtual void GetNextMessage(); 387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet /** @override */ 407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet virtual void SendConfigurationMessage( 417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet const pairing::message::ConfigurationMessage& message); 427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet /** @override */ 447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet virtual void SendConfigurationAckMessage( 457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet const pairing::message::ConfigurationAckMessage& message); 467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet /** @override */ 487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet virtual void SendOptionsMessage( 497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet const pairing::message::OptionsMessage& message); 507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet /** @override */ 527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet virtual void SendPairingRequestMessage( 537c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet const pairing::message::PairingRequestMessage& message); 547c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 557c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet /** @override */ 567c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet virtual void SendPairingRequestAckMessage( 577c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet const pairing::message::PairingRequestAckMessage& message); 587c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 597c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet /** @override */ 607c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet virtual void SendSecretMessage( 617c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet const pairing::message::SecretMessage& message); 627c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 637c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet /** @override */ 647c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet virtual void SendSecretAckMessage( 657c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet const pairing::message::SecretAckMessage& message); 667c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 677c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet /** @override */ 687c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet virtual void SendErrorMessage(pairing::PoloError error); 697c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 707c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet /** @override */ 717c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet virtual void OnBytesReceived(const std::vector<uint8_t>& data); 727c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 737c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet /** @override */ 747c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet virtual void OnError(); 757c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 767c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet private: 777c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // The current read state. 787c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet enum ReadState { 797c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // There is no read operation in progress. 807c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet kNone, 817c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 827c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Waiting to read the message preamble which is 4 bytes representing 837c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // the size of the next message. 847c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet kPreamble, 857c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 867c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Waiting to read the message. 877c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet kMessage, 887c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet }; 897c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 907c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Sends a message with the given type and payload. The payload should be 917c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // the serialized string representation of a protobuf message of the given 927c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // type. 937c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet void SendMessagePayload(OuterMessage_MessageType type, 947c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet const std::string& payload); 957c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 967c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Sends the given outer message. 977c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet void SendOuterMessage(const OuterMessage& message); 987c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 997c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Parses a received protobuf message. 1007c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet void ParseMessage(const std::vector<uint8_t>& data); 1017c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1027c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Parses a configuration message from a serialized protobuf string. 1037c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet void ParseConfigurationMessage(const std::string& payload); 1047c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1057c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Parses a configuration ack message from a serialized protobuf string. 1067c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet void ParseConfigurationAckMessage(const std::string& payload); 1077c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1087c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Parses an options messages from a serialized protobuf string. 1097c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet void ParseOptionsMessage(const std::string& payload); 1107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Parses a pairing request message from a serialized protobuf string. 1127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet void ParsePairingRequestMessage(const std::string& payload); 1137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Parses a pairing request ack message from a serialized protobuf string. 1157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet void ParsePairingRequestAckMessage(const std::string& payload); 1167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Parses a secret message from a serialized protobuf string. 1187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet void ParseSecretMessage(const std::string& payload); 1197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Parses a secret ack message from a serialized protobuf string. 1217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet void ParseSecretAckMessage(const std::string& payload); 1227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Converts an encoding type from the internal representation to the protobuf 1247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // representation. 1257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet Options_Encoding_EncodingType EncodingTypeToProto( 1267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet encoding::EncodingOption::EncodingType type); 1277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Converts an encoding type from the protobuf representation to the internal 1297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // representation. 1307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet encoding::EncodingOption::EncodingType EncodingTypeFromProto( 1317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet Options_Encoding_EncodingType type); 1327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Converts a role type from the internal representation to the protobuf 1347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // representation. 1357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet Options_RoleType RoleToProto( 1367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet pairing::message::OptionsMessage::ProtocolRole role); 1377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // Converts a role type from the protobuf representation to the internal 1397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet // representation. 1407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet pairing::message::OptionsMessage::ProtocolRole RoleFromProto( 1417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet Options_RoleType role); 1427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1437c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet ReadState read_state_; 1447c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1457c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet DISALLOW_COPY_AND_ASSIGN(ProtobufWireAdapter); 1467c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet}; 1477c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1487c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet} // namespace protobuf 1497c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet} // namespace wire 1507c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet} // namespace polo 1517c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet 1527c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet#endif // POLO_WIRE_PROTOBUF_PROTOBUFWIREADAPTER_H_ 153