diff options
Diffstat (limited to 'remoting/host/plugin/host_script_object.h')
-rw-r--r-- | remoting/host/plugin/host_script_object.h | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/remoting/host/plugin/host_script_object.h b/remoting/host/plugin/host_script_object.h new file mode 100644 index 0000000..47e4fb4 --- /dev/null +++ b/remoting/host/plugin/host_script_object.h @@ -0,0 +1,149 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef REMOTING_HOST_PLUGIN_HOST_SCRIPT_OBJECT_H_ +#define REMOTING_HOST_PLUGIN_HOST_SCRIPT_OBJECT_H_ + +#include <string> +#include <vector> + +#include "base/compiler_specific.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/ref_counted.h" +#include "base/synchronization/cancellation_flag.h" +#include "base/synchronization/waitable_event.h" +#include "base/threading/platform_thread.h" +#include "remoting/host/chromoting_host_context.h" +#include "remoting/host/host_status_observer.h" +#include "third_party/npapi/bindings/npapi.h" +#include "third_party/npapi/bindings/npfunctions.h" +#include "third_party/npapi/bindings/npruntime.h" + +class Task; + +namespace tracked_objects { +class Location; +} // namespace tracked_objects + +namespace remoting { + +class ChromotingHost; +class MutableHostConfig; +class RegisterSupportHostRequest; +class SignalStrategy; +class SupportAccessVerifier; + +// NPAPI plugin implementation for remoting host script object. +// HostNPScriptObject creates threads that are required to run +// ChromotingHost and starts/stops the host on those threads. When +// destroyed it sychronously shuts down the host and all threads. +class HostNPScriptObject : public HostStatusObserver { + public: + HostNPScriptObject(NPP plugin, NPObject* parent); + virtual ~HostNPScriptObject(); + + bool Init(); + + bool HasMethod(const std::string& method_name); + bool InvokeDefault(const NPVariant* args, + uint32_t argCount, + NPVariant* result); + bool Invoke(const std::string& method_name, + const NPVariant* args, + uint32_t argCount, + NPVariant* result); + bool HasProperty(const std::string& property_name); + bool GetProperty(const std::string& property_name, NPVariant* result); + bool SetProperty(const std::string& property_name, const NPVariant* value); + bool RemoveProperty(const std::string& property_name); + bool Enumerate(std::vector<std::string>* values); + + // remoting::HostStatusObserver implementation. + virtual void OnSignallingConnected(remoting::SignalStrategy* signal_strategy, + const std::string& full_jid) OVERRIDE; + virtual void OnSignallingDisconnected() OVERRIDE; + virtual void OnAccessDenied() OVERRIDE; + virtual void OnAuthenticatedClientsChanged(int clients_connected) OVERRIDE; + virtual void OnShutdown() OVERRIDE; + + private: + enum State { + kDisconnected, + kRequestedAccessCode, + kReceivedAccessCode, + kConnected, + kAffirmingConnection, + kError + }; + + // Start connection. args are: + // string uid, string auth_token + // No result. + bool Connect(const NPVariant* args, uint32_t argCount, NPVariant* result); + + // Disconnect. No arguments or result. + bool Disconnect(const NPVariant* args, uint32_t argCount, NPVariant* result); + + // Call LogDebugInfo handler if there is one. + void LogDebugInfo(const std::string& message); + + // Call OnStateChanged handler if there is one. + void OnStateChanged(State state); + + // Callbacks invoked during session setup. + void OnReceivedSupportID(remoting::SupportAccessVerifier* access_verifier, + bool success, + const std::string& support_id); + + // Helper functions that run on main thread. Can be called on any + // other thread. + void ConnectInternal(const std::string& uid, + const std::string& auth_token, + const std::string& auth_service); + void DisconnectInternal(); + + // Callback for ChromotingHost::Shutdown(). + void OnShutdownFinished(); + + // Call a JavaScript function wrapped as an NPObject. + // If result is non-null, the result of the call will be stored in it. + // Caller is responsible for releasing result if they ask for it. + static bool CallJSFunction(NPObject* func, + const NPVariant* args, + uint32_t argCount, + NPVariant* result); + + // Posts a task on the main NP thread. + void PostTaskToNPThread(const tracked_objects::Location& from_here, + Task* task); + + // Utility function for PostTaskToNPThread. + static void NPTaskSpringboard(void* task); + + // Set an exception for the current call. + void SetException(const std::string& exception_string); + + NPP plugin_; + NPObject* parent_; + int state_; + std::string access_code_; + NPObject* log_debug_info_func_; + NPObject* on_state_changed_func_; + base::PlatformThreadId np_thread_id_; + + scoped_ptr<RegisterSupportHostRequest> register_request_; + scoped_refptr<ChromotingHost> host_; + scoped_refptr<MutableHostConfig> host_config_; + ChromotingHostContext host_context_; + int failed_login_attempts_; + + base::WaitableEvent disconnected_event_; + base::CancellationFlag destructing_; +}; + +} // namespace remoting + +DISABLE_RUNNABLE_METHOD_REFCOUNT(remoting::HostNPScriptObject); + +#endif // REMOTING_HOST_HOST_SCRIPT_OBJECT_H_ |