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