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