chromoting_jni_instance.h revision 116680a4aac90f2aa7413d9095a592090648e557
17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file. 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#ifndef REMOTING_CLIENT_CHROMOTING_JNI_INSTANCE_H_ 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define REMOTING_CLIENT_CHROMOTING_JNI_INSTANCE_H_ 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <string> 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/ref_counted.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/scoped_ptr.h" 129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/memory/weak_ptr.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/message_loop/message_loop.h" 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "remoting/client/chromoting_client.h" 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "remoting/client/client_context.h" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "remoting/client/client_user_interface.h" 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "remoting/client/frame_consumer_proxy.h" 189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "remoting/client/jni/jni_frame_consumer.h" 19a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "remoting/protocol/clipboard_stub.h" 20a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "remoting/protocol/cursor_shape_stub.h" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "remoting/signaling/xmpp_signal_strategy.h" 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace remoting { 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 25a3f7b4e666c476898878fa745f637129375cd889Ben Murdochnamespace protocol { 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ClipboardEvent; 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class CursorShapeInfo; 28a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} // namespace protocol 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ClientStatusLogger; 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class VideoRenderer; 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class TokenFetcherProxy; 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// ClientUserInterface that indirectly makes and receives JNI calls. 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass ChromotingJniInstance 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : public ClientUserInterface, 37a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch public protocol::ClipboardStub, 38a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch public protocol::CursorShapeStub, 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public base::RefCountedThreadSafe<ChromotingJniInstance> { 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Initiates a connection with the specified host. Call from the UI thread. 42bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // The instance does not take ownership of |jni_runtime|. To connect with an 43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // unpaired host, pass in |pairing_id| and |pairing_secret| as empty strings. 44bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ChromotingJniInstance(ChromotingJniRuntime* jni_runtime, 45bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const char* username, 46bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const char* auth_token, 47bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const char* host_jid, 48bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const char* host_id, 49bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const char* host_pubkey, 50bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const char* pairing_id, 51bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const char* pairing_secret); 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Terminates the current connection (if it hasn't already failed) and cleans 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // up. Must be called before destruction. 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void Cleanup(); 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Requests the android app to fetch a third-party token. 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void FetchThirdPartyToken( 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const GURL& token_url, 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& client_id, 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const std::string& scope, 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::WeakPtr<TokenFetcherProxy> token_fetcher_proxy); 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Called by the android app when the token is fetched. 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void HandleOnThirdPartyTokenFetched(const std::string& token, 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& shared_secret); 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Provides the user's PIN and resumes the host authentication attempt. Call 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // on the UI thread once the user has finished entering this PIN into the UI, 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // but only after the UI has been asked to provide a PIN (via FetchSecret()). 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ProvideSecret(const std::string& pin, bool create_pair, 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& device_name); 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 749ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // Schedules a redraw on the display thread. May be called from any thread. 759ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch void RedrawDesktop(); 769ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 77a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Moves the host's cursor to the specified coordinates, optionally with some 78a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // mouse button depressed. If |button| is BUTTON_UNDEFINED, no click is made. 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void SendMouseEvent(int x, int y, 80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch protocol::MouseEvent_MouseButton button, 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool button_down); 82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void SendMouseWheelEvent(int delta_x, int delta_y); 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Sends the provided keyboard scan code to the host. 856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool SendKeyEvent(int key_code, bool key_down); 86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void SendTextEvent(const std::string& text); 88a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Records paint time for statistics logging, if enabled. May be called from 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // any thread. 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void RecordPaintTime(int64 paint_time_ms); 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // ClientUserInterface implementation. 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnConnectionState( 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protocol::ConnectionToHost::State state, 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protocol::ErrorCode error) OVERRIDE; 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnConnectionReady(bool ready) OVERRIDE; 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnRouteChanged(const std::string& channel_name, 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const protocol::TransportRoute& route) OVERRIDE; 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetCapabilities(const std::string& capabilities) OVERRIDE; 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetPairingResponse( 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const protocol::PairingResponse& response) OVERRIDE; 103c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual void DeliverHostMessage( 104c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch const protocol::ExtensionMessage& message) OVERRIDE; 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual protocol::ClipboardStub* GetClipboardStub() OVERRIDE; 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual protocol::CursorShapeStub* GetCursorShapeStub() OVERRIDE; 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 108a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // CursorShapeStub implementation. 109a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch virtual void InjectClipboardEvent( 110a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const protocol::ClipboardEvent& event) OVERRIDE; 111a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 112a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // ClipboardStub implementation. 113a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch virtual void SetCursorShape(const protocol::CursorShapeInfo& shape) OVERRIDE; 114a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // This object is ref-counted, so it cleans itself up. 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~ChromotingJniInstance(); 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void ConnectToHostOnDisplayThread(); 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void ConnectToHostOnNetworkThread(); 1219ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch void DisconnectFromHostOnNetworkThread(); 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Notifies the user interface that the user needs to enter a PIN. The 1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // current authentication attempt is put on hold until |callback| is invoked. 1259ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // May be called on any thread. 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void FetchSecret(bool pairable, 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const protocol::SecretFetchedCallback& callback); 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sets the device name. Can be called on any thread. 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void SetDeviceName(const std::string& device_name); 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void SendKeyEventInternal(int usb_key_code, bool key_down); 1336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Enables or disables periodic logging of performance statistics. Called on 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the network thread. 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void EnableStatsLogging(bool enabled); 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If logging is enabled, logs the current connection statistics, and 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // triggers another call to this function after the logging time interval. 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Called on the network thread. 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void LogPerfStats(); 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 143bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Used to obtain task runner references and make calls to Java methods. 144bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ChromotingJniRuntime* jni_runtime_; 145bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // ID of the host we are connecting to. 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string host_id_; 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string host_jid_; 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1509ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch // This group of variables is to be used on the display thread. 1517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<FrameConsumerProxy> frame_consumer_; 1529ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch scoped_ptr<JniFrameConsumer> view_; 1539ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch scoped_ptr<base::WeakPtrFactory<JniFrameConsumer> > view_weak_factory_; 1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // This group of variables is to be used on the network thread. 1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<ClientContext> client_context_; 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<VideoRenderer> video_renderer_; 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<protocol::Authenticator> authenticator_; 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<ChromotingClient> client_; 1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) XmppSignalStrategy::XmppServerConfig xmpp_config_; 1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<XmppSignalStrategy> signaling_; // Must outlive client_ 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ClientStatusLogger> client_status_logger_; 163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::WeakPtr<TokenFetcherProxy> token_fetcher_proxy_; 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Pass this the user's PIN once we have it. To be assigned and accessed on 1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // the UI thread, but must be posted to the network thread to call it. 1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protocol::SecretFetchedCallback pin_callback_; 1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 169bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // Indicates whether to establish a new pairing with this host. This is 170bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // modified in ProvideSecret(), but thereafter to be used only from the 171bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // network thread. (This is safe because ProvideSecret() is invoked at most 172bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // once per run, and always before any reference to this flag.) 173bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool create_pairing_; 1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The device name to appear in the paired-clients list. Accessed on the 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // network thread. 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string device_name_; 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If this is true, performance statistics will be periodically written to 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the Android log. Used on the network thread. 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool stats_logging_enabled_; 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch friend class base::RefCountedThreadSafe<ChromotingJniInstance>; 1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::WeakPtrFactory<ChromotingJniInstance> weak_factory_; 186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ChromotingJniInstance); 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace remoting 1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 193