// 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_POLOWIREINTERFACE_H_
#define POLO_WIRE_POLOWIREINTERFACE_H_

#include <stddef.h>
#include <vector>

#include "polo/wire/polowirelistener.h"
#include "polo/util/macros.h"

namespace polo {
namespace wire {

// An interface for sending and receiving raw data for a Polo pairing session.
class PoloWireInterface {
 public:
  PoloWireInterface() {}
  virtual ~PoloWireInterface() {}

  // Sets the listener that will receive incoming data and error notifications.
  // @param listener the listener to set for this interface
  void set_listener(PoloWireListener* listener) { listener_ = listener; }

  // Sends data over the interface.
  // @param data the bytes to send
  virtual void Send(const std::vector<uint8_t>& data) = 0;

  // Receives the given number of bytes from the interface asynchronously. The
  // listener will be notified when the data is received.
  // @param num_bytes the number of bytes to receive
  virtual void Receive(size_t num_bytes) = 0;

 protected:
  // Gets the listener that will receive incoming data and error notifications.
  PoloWireListener* listener() const { return listener_; }

 private:
  PoloWireListener* listener_;

  DISALLOW_COPY_AND_ASSIGN(PoloWireInterface);
};

}  // namespace wire
}  // namespace polo

#endif  // POLO_WIRE_POLOWIREINTERFACE_H_