11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef COMPONENTS_PROXIMITY_AUTH_CONNECTION_H
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define COMPONENTS_PROXIMITY_AUTH_CONNECTION_H
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/macros.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/ref_counted.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/observer_list.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/proximity_auth/remote_device.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace proximity_auth {
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ConnectionObserver;
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass WireMessage;
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Base class representing a connection with a remote device, which is a
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// persistent bidirectional channel for sending and receiving wire messages.
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass Connection {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum Status {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DISCONNECTED,
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    IN_PROGRESS,
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CONNECTED,
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Constructs a connection to the given |remote_device|.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit Connection(const RemoteDevice& remote_device);
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~Connection();
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns true iff the connection's status is CONNECTED.
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool IsConnected() const;
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Sends a message to the remote device.
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |OnSendCompleted()| will be called for all observers upon completion with
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // either success or failure.
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SendMessage(scoped_ptr<WireMessage> message);
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AddObserver(ConnectionObserver* observer);
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void RemoveObserver(ConnectionObserver* observer);
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const RemoteDevice& remote_device() const { return remote_device_; }
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Abstract methods that subclasses should implement:
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Attempts to connect to the remote device if not already connected.
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void Connect() = 0;
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Disconnects from the remote device.
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void Disconnect() = 0;
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Sets the connection's status to |status|. If this is different from the
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // previous status, notifies observers of the change in status.
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Virtual for testing.
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SetStatus(Status status);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Status status() const { return status_; }
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Called after attempting to send bytes over the connection, whether the
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // message was successfully sent or not.
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Virtual for testing.
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnDidSendMessage(const WireMessage& message, bool success);
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Called when bytes are read from the connection. There should not be a send
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // in progress when this function is called.
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Virtual for testing.
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnBytesReceived(const std::string& bytes);
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Sends bytes over the connection. The implementing class should call
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // OnSendCompleted() once the send succeeds or fails. At most one send will be
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // in progress.
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SendMessageImpl(scoped_ptr<WireMessage> message) = 0;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Deserializes the |recieved_bytes_| and returns the resulting WireMessage,
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // or NULL if the message is malformed. Sets |is_incomplete_message| to true
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // if the |serialized_message| does not have enough data to parse the header,
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // or if the message length encoded in the message header exceeds the size of
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the |serialized_message|. Exposed for testing.
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual scoped_ptr<WireMessage> DeserializeWireMessage(
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool* is_incomplete_message);
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The remote device corresponding to this connection.
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const RemoteDevice remote_device_;
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The current status of the connection.
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Status status_;
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The registered observers of the connection.
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ObserverList<ConnectionObserver> observers_;
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // A temporary buffer storing bytes received before a received message can be
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // fully constructed.
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string received_bytes_;
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Whether a message is currently in the process of being sent.
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_sending_message_;
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(Connection);
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace proximity_auth
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // COMPONENTS_PROXIMITY_AUTH_CONNECTION_H
108