diff options
author | siggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-15 15:14:55 +0000 |
---|---|---|
committer | siggi@chromium.org <siggi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-15 15:14:55 +0000 |
commit | 5d10081cdc1162f897d9301afadb4981206ba974 (patch) | |
tree | 4e3dd07d1ba61b8a0e8dd307026edbfc35aa7157 /ceee/ie/broker/broker_rpc_server.cc | |
parent | eb57bb21a94acdc46ab1496d103c2cb4739b158a (diff) | |
download | chromium_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.cc | 130 |
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); +} |