// Copyright 2012 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 SYNC_JS_SYNC_JS_CONTROLLER_H_ #define SYNC_JS_SYNC_JS_CONTROLLER_H_ #include #include #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "sync/base/sync_export.h" #include "sync/internal_api/public/util/weak_handle.h" #include "sync/js/js_arg_list.h" #include "sync/js/js_controller.h" #include "sync/js/js_event_handler.h" namespace syncer { class JsBackend; // A class that mediates between the sync JsEventHandlers and the sync // JsBackend. class SYNC_EXPORT SyncJsController : public JsController, public JsEventHandler, public base::SupportsWeakPtr { public: SyncJsController(); virtual ~SyncJsController(); // Sets the backend to route all messages to (if initialized). // Sends any queued-up messages if |backend| is initialized. void AttachJsBackend(const WeakHandle& js_backend); // JsController implementation. virtual void AddJsEventHandler(JsEventHandler* event_handler) OVERRIDE; virtual void RemoveJsEventHandler(JsEventHandler* event_handler) OVERRIDE; // Queues up any messages that are sent when there is no attached // initialized backend. virtual void ProcessJsMessage( const std::string& name, const JsArgList& args, const WeakHandle& reply_handler) OVERRIDE; // JsEventHandler implementation. virtual void HandleJsEvent(const std::string& name, const JsEventDetails& details) OVERRIDE; private: // A struct used to hold the arguments to ProcessJsMessage() for // future invocation. struct PendingJsMessage { std::string name; JsArgList args; WeakHandle reply_handler; PendingJsMessage(const std::string& name, const JsArgList& args, const WeakHandle& reply_handler); ~PendingJsMessage(); }; typedef std::vector PendingJsMessageList; // Sets |js_backend_|'s event handler depending on how many // underlying event handlers we have. void UpdateBackendEventHandler(); WeakHandle js_backend_; ObserverList js_event_handlers_; PendingJsMessageList pending_js_messages_; DISALLOW_COPY_AND_ASSIGN(SyncJsController); }; } // namespace syncer #endif // SYNC_JS_SYNC_JS_CONTROLLER_H_