OLD | NEW |
| (Empty) |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "media/remoting/rpc/rpc_broker.h" | |
6 | |
7 #include <utility> | |
8 | |
9 #include "base/logging.h" | |
10 #include "media/base/bind_to_current_loop.h" | |
11 | |
12 namespace media { | |
13 namespace remoting { | |
14 | |
15 namespace { | |
16 | |
17 std::ostream& operator<<(std::ostream& out, const pb::RpcMessage& message) { | |
18 out << "handle=" << message.handle() << ", proc=" << message.proc(); | |
19 switch (message.rpc_oneof_case()) { | |
20 case pb::RpcMessage::kIntegerValue: | |
21 out << ", integer_value=" << message.integer_value(); | |
22 break; | |
23 case pb::RpcMessage::kInteger64Value: | |
24 out << ", integer64_value=" << message.integer64_value(); | |
25 break; | |
26 case pb::RpcMessage::kDoubleValue: | |
27 out << ", double_value=" << message.double_value(); | |
28 break; | |
29 case pb::RpcMessage::kBooleanValue: | |
30 out << ", boolean_value=" << message.boolean_value(); | |
31 break; | |
32 case pb::RpcMessage::kStringValue: | |
33 out << ", string_value=" << message.string_value(); | |
34 break; | |
35 default: | |
36 out << ", rpc_oneof=" << message.rpc_oneof_case(); | |
37 break; | |
38 } | |
39 return out; | |
40 } | |
41 | |
42 } // namespace | |
43 | |
44 RpcBroker::RpcBroker(const SendMessageCallback& send_message_cb) | |
45 : next_handle_(kReceiverHandle + 1), | |
46 send_message_cb_(send_message_cb), | |
47 weak_factory_(this) {} | |
48 | |
49 RpcBroker::~RpcBroker() { | |
50 DCHECK(thread_checker_.CalledOnValidThread()); | |
51 receive_callbacks_.clear(); | |
52 } | |
53 | |
54 int RpcBroker::GetUniqueHandle() { | |
55 DCHECK(thread_checker_.CalledOnValidThread()); | |
56 return next_handle_++; | |
57 } | |
58 | |
59 void RpcBroker::RegisterMessageReceiverCallback( | |
60 int handle, | |
61 const ReceiveMessageCallback& callback) { | |
62 VLOG(2) << __func__ << "handle=" << handle; | |
63 DCHECK(thread_checker_.CalledOnValidThread()); | |
64 DCHECK(receive_callbacks_.find(handle) == receive_callbacks_.end()); | |
65 receive_callbacks_[handle] = callback; | |
66 } | |
67 | |
68 void RpcBroker::UnregisterMessageReceiverCallback(int handle) { | |
69 VLOG(2) << __func__ << " handle=" << handle; | |
70 DCHECK(thread_checker_.CalledOnValidThread()); | |
71 receive_callbacks_.erase(handle); | |
72 } | |
73 | |
74 void RpcBroker::ProcessMessageFromRemote( | |
75 std::unique_ptr<pb::RpcMessage> message) { | |
76 DCHECK(message); | |
77 DCHECK(thread_checker_.CalledOnValidThread()); | |
78 VLOG(3) << __func__ << ": " << *message; | |
79 const auto entry = receive_callbacks_.find(message->handle()); | |
80 if (entry == receive_callbacks_.end()) { | |
81 LOG(ERROR) << "unregistered handle: " << message->handle(); | |
82 return; | |
83 } | |
84 entry->second.Run(std::move(message)); | |
85 } | |
86 | |
87 void RpcBroker::SendMessageToRemote(std::unique_ptr<pb::RpcMessage> message) { | |
88 DCHECK(thread_checker_.CalledOnValidThread()); | |
89 DCHECK(message); | |
90 VLOG(3) << __func__ << ": " << *message; | |
91 std::unique_ptr<std::vector<uint8_t>> serialized_message( | |
92 new std::vector<uint8_t>(message->ByteSize())); | |
93 CHECK(message->SerializeToArray(serialized_message->data(), | |
94 serialized_message->size())); | |
95 send_message_cb_.Run(std::move(serialized_message)); | |
96 } | |
97 | |
98 base::WeakPtr<RpcBroker> RpcBroker::GetWeakPtr() { | |
99 return weak_factory_.GetWeakPtr(); | |
100 } | |
101 | |
102 void RpcBroker::SetMessageCallbackForTesting( | |
103 const SendMessageCallback& send_message_cb) { | |
104 DCHECK(thread_checker_.CalledOnValidThread()); | |
105 send_message_cb_ = send_message_cb; | |
106 } | |
107 | |
108 } // namespace remoting | |
109 } // namespace media | |
OLD | NEW |