Index: ceee/ie/broker/broker_rpc_server.cc |
=================================================================== |
--- ceee/ie/broker/broker_rpc_server.cc (revision 0) |
+++ ceee/ie/broker/broker_rpc_server.cc (revision 0) |
@@ -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); |
+} |
Property changes on: ceee\ie\broker\broker_rpc_server.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |