// Copyright 2016 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. #include "media/remoting/rpc_broker.h" #include #include "base/logging.h" #include "media/base/bind_to_current_loop.h" namespace media { namespace remoting { namespace { std::ostream& operator<<(std::ostream& out, const pb::RpcMessage& message) { out << "handle=" << message.handle() << ", proc=" << message.proc(); switch (message.rpc_oneof_case()) { case pb::RpcMessage::kIntegerValue: out << ", integer_value=" << message.integer_value(); break; case pb::RpcMessage::kInteger64Value: out << ", integer64_value=" << message.integer64_value(); break; case pb::RpcMessage::kDoubleValue: out << ", double_value=" << message.double_value(); break; case pb::RpcMessage::kBooleanValue: out << ", boolean_value=" << message.boolean_value(); break; case pb::RpcMessage::kStringValue: out << ", string_value=" << message.string_value(); break; default: out << ", rpc_oneof=" << message.rpc_oneof_case(); break; } return out; } } // namespace RpcBroker::RpcBroker(const SendMessageCallback& send_message_cb) : next_handle_(kFirstHandle), send_message_cb_(send_message_cb), weak_factory_(this) {} RpcBroker::~RpcBroker() { DCHECK(thread_checker_.CalledOnValidThread()); receive_callbacks_.clear(); } int RpcBroker::GetUniqueHandle() { DCHECK(thread_checker_.CalledOnValidThread()); return next_handle_++; } void RpcBroker::RegisterMessageReceiverCallback( int handle, const ReceiveMessageCallback& callback) { VLOG(2) << __func__ << "handle=" << handle; DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(receive_callbacks_.find(handle) == receive_callbacks_.end()); receive_callbacks_[handle] = callback; } void RpcBroker::UnregisterMessageReceiverCallback(int handle) { VLOG(2) << __func__ << " handle=" << handle; DCHECK(thread_checker_.CalledOnValidThread()); receive_callbacks_.erase(handle); } void RpcBroker::ProcessMessageFromRemote( std::unique_ptr message) { DCHECK(message); DCHECK(thread_checker_.CalledOnValidThread()); VLOG(3) << __func__ << ": " << *message; const auto entry = receive_callbacks_.find(message->handle()); if (entry == receive_callbacks_.end()) { VLOG(1) << "unregistered handle: " << message->handle(); return; } entry->second.Run(std::move(message)); } void RpcBroker::SendMessageToRemote(std::unique_ptr message) { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(message); VLOG(3) << __func__ << ": " << *message; std::unique_ptr> serialized_message( new std::vector(message->ByteSize())); CHECK(message->SerializeToArray(serialized_message->data(), serialized_message->size())); send_message_cb_.Run(std::move(serialized_message)); } base::WeakPtr RpcBroker::GetWeakPtr() { return weak_factory_.GetWeakPtr(); } void RpcBroker::SetMessageCallbackForTesting( const SendMessageCallback& send_message_cb) { DCHECK(thread_checker_.CalledOnValidThread()); send_message_cb_ = send_message_cb; } } // namespace remoting } // namespace media