// 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_POLOWIREADAPTER_H_
#define POLO_WIRE_POLOWIREADAPTER_H_
#include "polo/wire/polowireinterface.h"
#include "polo/pairing/message/messagelistener.h"
namespace polo {
namespace wire {
// Abstract class for protocol adapters that send and receive Polo messages. The
// adapter is responsible for serializing and deserializing messages sent and
// received from the supplied PoloWireInterface.
class PoloWireAdapter : public PoloWireListener {
public:
// Creates a new adapter on the given interface. The interface should only
// exist in the context of this adapter and will be freed when this adapter is
// freed.
// @param interface the interface used to send and receive data
explicit PoloWireAdapter(PoloWireInterface* interface);
virtual ~PoloWireAdapter() {}
// Sets the listener that will receive incoming Polo messages. A listener
// must be set before using this adapter.
void set_listener(pairing::message::MessageListener* listener);
// Gets the next message from the interface asynchronously. The listener
// will be invoked when a message has been received. An error will occur if
// this method is invoked again before a message or error is received by
// the listener.
virtual void GetNextMessage() = 0;
// Sends a configuration message to the peer.
virtual void SendConfigurationMessage(
const pairing::message::ConfigurationMessage& message) = 0;
// Sends a configuration acknowledgment to the peer.
virtual void SendConfigurationAckMessage(
const pairing::message::ConfigurationAckMessage& message) = 0;
// Sends an options message to the peer.
virtual void SendOptionsMessage(
const pairing::message::OptionsMessage& message) = 0;
// Sends a pairing request message to the peer.
virtual void SendPairingRequestMessage(
const pairing::message::PairingRequestMessage& message) = 0;
// Sends a pairing request acknowledgment to the peer.
virtual void SendPairingRequestAckMessage(
const pairing::message::PairingRequestAckMessage& message) = 0;
// Sends a secret message to the peer.
virtual void SendSecretMessage(
const pairing::message::SecretMessage& message) = 0;
// Sends a secret acknowledgment to the peer.
virtual void SendSecretAckMessage(
const pairing::message::SecretAckMessage& message) = 0;
// Sends an error message to the peer.
virtual void SendErrorMessage(pairing::PoloError error) = 0;
protected:
// Gets the Polo wire interface used to send and receive data.
PoloWireInterface* interface() { return interface_; }
// Get the listener that will be notified of received Polo messages.
pairing::message::MessageListener* listener() { return listener_; }
private:
PoloWireInterface* interface_;
pairing::message::MessageListener* listener_;
DISALLOW_COPY_AND_ASSIGN(PoloWireAdapter);
};
} // namespace wire
} // namespace polo
#endif // POLO_WIRE_POLOWIREADAPTER_H_