// Copyright 2012 Google Inc. All Rights Reserved. // // 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. #ifndef POLO_WIRE_PROTOBUF_PROTOBUFWIREADAPTER_H_ #define POLO_WIRE_PROTOBUF_PROTOBUFWIREADAPTER_H_ #include <string> #include <vector> #include "polo/wire/polowireadapter.h" #include "polo/wire/protobuf/polo.pb.h" namespace polo { namespace wire { namespace protobuf { // Polo wire adapter that transmits Polo messages using protocol buffers. class ProtobufWireAdapter : public PoloWireAdapter { public: // Creates a new protocol buffer adapter on the given interface // @param interface the wire interface used to send and receive data explicit ProtobufWireAdapter(PoloWireInterface* interface); virtual ~ProtobufWireAdapter() {} /** @override */ virtual void GetNextMessage(); /** @override */ virtual void SendConfigurationMessage( const pairing::message::ConfigurationMessage& message); /** @override */ virtual void SendConfigurationAckMessage( const pairing::message::ConfigurationAckMessage& message); /** @override */ virtual void SendOptionsMessage( const pairing::message::OptionsMessage& message); /** @override */ virtual void SendPairingRequestMessage( const pairing::message::PairingRequestMessage& message); /** @override */ virtual void SendPairingRequestAckMessage( const pairing::message::PairingRequestAckMessage& message); /** @override */ virtual void SendSecretMessage( const pairing::message::SecretMessage& message); /** @override */ virtual void SendSecretAckMessage( const pairing::message::SecretAckMessage& message); /** @override */ virtual void SendErrorMessage(pairing::PoloError error); /** @override */ virtual void OnBytesReceived(const std::vector<uint8_t>& data); /** @override */ virtual void OnError(); private: // The current read state. enum ReadState { // There is no read operation in progress. kNone, // Waiting to read the message preamble which is 4 bytes representing // the size of the next message. kPreamble, // Waiting to read the message. kMessage, }; // Sends a message with the given type and payload. The payload should be // the serialized string representation of a protobuf message of the given // type. void SendMessagePayload(OuterMessage_MessageType type, const std::string& payload); // Sends the given outer message. void SendOuterMessage(const OuterMessage& message); // Parses a received protobuf message. void ParseMessage(const std::vector<uint8_t>& data); // Parses a configuration message from a serialized protobuf string. void ParseConfigurationMessage(const std::string& payload); // Parses a configuration ack message from a serialized protobuf string. void ParseConfigurationAckMessage(const std::string& payload); // Parses an options messages from a serialized protobuf string. void ParseOptionsMessage(const std::string& payload); // Parses a pairing request message from a serialized protobuf string. void ParsePairingRequestMessage(const std::string& payload); // Parses a pairing request ack message from a serialized protobuf string. void ParsePairingRequestAckMessage(const std::string& payload); // Parses a secret message from a serialized protobuf string. void ParseSecretMessage(const std::string& payload); // Parses a secret ack message from a serialized protobuf string. void ParseSecretAckMessage(const std::string& payload); // Converts an encoding type from the internal representation to the protobuf // representation. Options_Encoding_EncodingType EncodingTypeToProto( encoding::EncodingOption::EncodingType type); // Converts an encoding type from the protobuf representation to the internal // representation. encoding::EncodingOption::EncodingType EncodingTypeFromProto( Options_Encoding_EncodingType type); // Converts a role type from the internal representation to the protobuf // representation. Options_RoleType RoleToProto( pairing::message::OptionsMessage::ProtocolRole role); // Converts a role type from the protobuf representation to the internal // representation. pairing::message::OptionsMessage::ProtocolRole RoleFromProto( Options_RoleType role); ReadState read_state_; DISALLOW_COPY_AND_ASSIGN(ProtobufWireAdapter); }; } // namespace protobuf } // namespace wire } // namespace polo #endif // POLO_WIRE_PROTOBUF_PROTOBUFWIREADAPTER_H_