summaryrefslogtreecommitdiffstats
path: root/ceee/ie/broker/broker_rpc_server.cc
diff options
context:
space:
mode:
authorsiggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-15 15:14:55 +0000
committersiggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-15 15:14:55 +0000
commit5d10081cdc1162f897d9301afadb4981206ba974 (patch)
tree4e3dd07d1ba61b8a0e8dd307026edbfc35aa7157 /ceee/ie/broker/broker_rpc_server.cc
parenteb57bb21a94acdc46ab1496d103c2cb4739b158a (diff)
downloadchromium_src-5d10081cdc1162f897d9301afadb4981206ba974.zip
chromium_src-5d10081cdc1162f897d9301afadb4981206ba974.tar.gz
chromium_src-5d10081cdc1162f897d9301afadb4981206ba974.tar.bz2
COM replaced with RPC for firing events in broker.
Sumbmitting for Vitaly Buka, see original change at http://codereview.chromium.org/4508002/. BUG=none TEST=Unittests in this change. Review URL: http://codereview.chromium.org/5010001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@66121 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ceee/ie/broker/broker_rpc_server.cc')
-rw-r--r--ceee/ie/broker/broker_rpc_server.cc130
1 files changed, 130 insertions, 0 deletions
diff --git a/ceee/ie/broker/broker_rpc_server.cc b/ceee/ie/broker/broker_rpc_server.cc
new file mode 100644
index 0000000..b4286c4
--- /dev/null
+++ b/ceee/ie/broker/broker_rpc_server.cc
@@ -0,0 +1,130 @@
+// Copyright (c) 2010 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.
+//
+// Broker RPC Server implementation.
+
+#include "ceee/ie/broker/broker_rpc_server.h"
+
+#include "base/atomic_sequence_num.h"
+#include "base/logging.h"
+#include "base/win_util.h"
+#include "broker_rpc_lib.h" // NOLINT
+#include "ceee/common/com_utils.h"
+#include "ceee/ie/broker/broker_module_util.h"
+#include "ceee/ie/broker/broker_rpc_utils.h"
+#include "ceee/ie/broker/chrome_postman.h"
+
+BrokerRpcServer::BrokerRpcServer()
+ : is_started_(false),
+ current_thread_(::GetCurrentThreadId()) {
+}
+
+BrokerRpcServer::~BrokerRpcServer() {
+ DCHECK(current_thread_ == ::GetCurrentThreadId());
+ Stop();
+}
+
+bool BrokerRpcServer::Start() {
+ DCHECK(current_thread_ == ::GetCurrentThreadId());
+
+ if (is_started())
+ return true;
+
+ std::wstring end_point = GetRpcEndPointAddress();
+ std::wstring protocol = kRpcProtocol;
+ DCHECK(!protocol.empty());
+ DCHECK(!end_point.empty());
+ if (protocol.empty() || end_point.empty())
+ return false;
+
+ LOG(INFO) << "RPC server is starting. Endpoint: " << end_point;
+ // Tell RPC runtime to use local interprocess communication for given
+ // end point.
+ RPC_STATUS status = ::RpcServerUseProtseqEp(
+ reinterpret_cast<RPC_WSTR>(&protocol[0]),
+ RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
+ reinterpret_cast<RPC_WSTR>(&end_point[0]),
+ NULL);
+ LOG_IF(ERROR, RPC_S_OK != status && RPC_S_DUPLICATE_ENDPOINT != status) <<
+ "Failed to set protocol for RPC end point. RPC_STATUS=0x" <<
+ com::LogWe(status);
+ if (RPC_S_OK == status || RPC_S_DUPLICATE_ENDPOINT == status) {
+ // Register RPC interface with the RPC runtime.
+ status = ::RpcServerRegisterIfEx(BrokerRpcServer_CeeeBroker_v1_1_s_ifspec,
+ NULL, NULL, 0, RPC_C_LISTEN_MAX_CALLS_DEFAULT, NULL);
+ LOG_IF(ERROR, RPC_S_OK != status) <<
+ "Failed to register RPC interface. RPC_STATUS=0x" << com::LogWe(status);
+ if (RPC_S_OK == status) {
+ // Start listen for RPC calls.
+ status = ::RpcServerListen(1, RPC_C_LISTEN_MAX_CALLS_DEFAULT, TRUE);
+ LOG_IF(ERROR, RPC_S_OK != status) <<
+ "Failed to start listening. RPC_STATUS=0x" << com::LogWe(status);
+ if (RPC_S_OK == status) {
+ LOG(INFO) << "RPC server is started. Endpoint: " << end_point;
+ is_started_ = true;
+ }
+ }
+ }
+ if (!is_started())
+ Stop();
+
+ return is_started();
+}
+
+bool BrokerRpcServer::Stop() {
+ DCHECK(current_thread_ == ::GetCurrentThreadId());
+ is_started_ = false;
+ // Stop server listening for RPC.
+ RPC_STATUS status = ::RpcMgmtStopServerListening(NULL);
+ LOG_IF(WARNING, RPC_S_OK != status) <<
+ "Failed to stop listening. RPC_STATUS=0x" << com::LogWe(status);
+ // Wait while server stops listening threads.
+ status = ::RpcMgmtWaitServerListen();
+ LOG_IF(WARNING, RPC_S_OK != status) <<
+ "Failed to wait server listen. RPC_STATUS=0x" << com::LogWe(status);
+ // Unregister RPC interface.
+ status = ::RpcServerUnregisterIf(
+ BrokerRpcServer_CeeeBroker_v1_1_s_ifspec, NULL, FALSE);
+ LOG_IF(WARNING, RPC_S_OK != status) <<
+ "Failed to unregister interface. RPC_STATUS=0x" << com::LogWe(status);
+ return RPC_S_OK == status;
+}
+
+bool BrokerRpcServer::is_started() const {
+ DCHECK(current_thread_ == ::GetCurrentThreadId());
+ return is_started_;
+}
+
+static base::AtomicSequenceNumber current_broker_rpc_context(
+ base::LINKER_INITIALIZED);
+
+BrokerContextHandle BrokerRpcServer_Connect(handle_t binding_handle) {
+ // TODO(vitalybuka@google.com): Add client identity check.
+ ceee_module_util::LockModule();
+ return reinterpret_cast<void*>(current_broker_rpc_context.GetNext() + 1);
+}
+
+void BrokerRpcServer_Disconnect(
+ handle_t binding_handle,
+ BrokerContextHandle* context) {
+ DCHECK(context != NULL);
+ if (context)
+ *context = NULL;
+ ceee_module_util::UnlockModule();
+}
+
+// Called when client process terminated without releasing context handle.
+void __RPC_USER BrokerContextHandle_rundown(BrokerContextHandle context) {
+ DCHECK(context != NULL);
+ ceee_module_util::UnlockModule();
+}
+
+void BrokerRpcServer_FireEvent(
+ handle_t binding_handle,
+ BSTR event_name,
+ BSTR event_args) {
+ DCHECK(ChromePostman::GetInstance());
+ if (ChromePostman::GetInstance())
+ ChromePostman::GetInstance()->FireEvent(event_name, event_args);
+}