15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef REMOTING_PROTOCOL_CONNECTION_TO_HOST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REMOTING_PROTOCOL_CONNECTION_TO_HOST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/non_thread_safe.h"
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/timer/timer.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/jingle_glue/signal_strategy.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/proto/internal.pb.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/clipboard_filter.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/errors.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/input_filter.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/message_reader.h"
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "remoting/protocol/monitored_video_stub.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/session.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/session_manager.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class XmppProxy;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoPacket;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioReader;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioStub;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Authenticator;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClientControlDispatcher;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClientEventDispatcher;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClientStub;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClipboardStub;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostStub;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InputStub;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SessionConfig;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransportFactory;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoReader;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoStub;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ConnectionToHost : public SignalStrategy::Listener,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         public SessionManager::Listener,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         public Session::EventHandler,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         public base::NonThreadSafe {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // The UI implementations maintain corresponding definitions of this
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // enumeration in webapp/client_session.js and
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // android/java/src/org/chromium/chromoting/jni/JniInterface.java. Be sure to
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // update these locations if you make any changes to the ordering.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INITIALIZING,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CONNECTING,
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    AUTHENTICATED,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CONNECTED,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAILED,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CLOSED,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class HostEventCallback {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~HostEventCallback() {}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when state of the connection changes.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnConnectionState(State state, ErrorCode error) = 0;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when ready state of the connection changes. When |ready|
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // is set to false some data sent by the peers may be
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // delayed. This is used to indicate in the UI when connection is
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // temporarily broken.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnConnectionReady(bool ready) = 0;
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Called when the route type (direct vs. STUN vs. proxied) changes.
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    virtual void OnRouteChanged(const std::string& channel_name,
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                const protocol::TransportRoute& route) = 0;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConnectionToHost(bool allow_nat_traversal);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ConnectionToHost();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set the stubs which will handle messages from the host.
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The caller must ensure that stubs out-live the connection.
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Unless otherwise specified, all stubs must be set before Connect()
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // is called.
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void set_client_stub(ClientStub* client_stub);
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void set_clipboard_stub(ClipboardStub* clipboard_stub);
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void set_video_stub(VideoStub* video_stub);
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If no audio stub is specified then audio will not be requested.
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void set_audio_stub(AudioStub* audio_stub);
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Initiates a connection to the host specified by |host_jid|.
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // |signal_strategy| is used to signal to the host, and must outlive the
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // connection. Data channels will be negotiated over |transport_factory|.
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // |authenticator| will be used to authenticate the session and data channels.
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // |event_callback| will be notified of changes in the state of the connection
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // and must outlive the ConnectionToHost.
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Caller must set stubs (see below) before calling Connect.
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void Connect(SignalStrategy* signal_strategy,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       scoped_ptr<TransportFactory> transport_factory,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       scoped_ptr<Authenticator> authenticator,
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       const std::string& host_jid,
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       const std::string& host_public_key,
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       HostEventCallback* event_callback);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Returns the session configuration that was negotiated with the host.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const SessionConfig& config();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stubs for sending data to the host.
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ClipboardStub* clipboard_forwarder();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual HostStub* host_stub();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual InputStub* input_stub();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SignalStrategy::StatusObserver interface.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSignalStrategyStateChange(
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SignalStrategy::State state) OVERRIDE;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnSignalStrategyIncomingStanza(
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const buzz::XmlElement* stanza) OVERRIDE;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SessionManager::Listener interface.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSessionManagerReady() OVERRIDE;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnIncomingSession(
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Session* session,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SessionManager::IncomingSessionResponse* response) OVERRIDE;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Session::EventHandler interface.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSessionStateChange(Session::State state) OVERRIDE;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSessionRouteChange(const std::string& channel_name,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const TransportRoute& route) OVERRIDE;
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // MonitoredVideoStub::EventHandler interface.
1365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void OnVideoChannelStatus(bool active);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the current state of ConnectionToHost.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State state() const;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callbacks for channel initialization
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnChannelInitialized(bool successful);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyIfChannelsReady();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseOnError(ErrorCode error);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stops writing in the channels.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseChannels();
1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetState(State state, ErrorCode error);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_nat_traversal_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host_jid_;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host_public_key_;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Authenticator> authenticator_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostEventCallback* event_callback_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stub for incoming messages.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientStub* client_stub_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardStub* clipboard_stub_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AudioStub* audio_stub_;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SignalStrategy* signal_strategy_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SessionManager> session_manager_;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Session> session_;
1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<MonitoredVideoStub> monitored_video_stub_;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<VideoReader> video_reader_;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<AudioReader> audio_reader_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ClientControlDispatcher> control_dispatcher_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ClientEventDispatcher> event_dispatcher_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClipboardFilter clipboard_forwarder_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputFilter event_forwarder_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Internal state of the connection.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State state_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ErrorCode error_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ConnectionToHost);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protocol
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace remoting
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // REMOTING_PROTOCOL_CONNECTION_TO_HOST_H_
191