OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2014 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 "extensions/browser/api/copresence_socket/copresence_socket_api.h" | |
6 | |
7 #include "base/lazy_instance.h" | |
8 #include "components/copresence_sockets/public/copresence_peer.h" | |
9 #include "components/copresence_sockets/public/copresence_socket.h" | |
10 #include "content/public/browser/browser_context.h" | |
11 #include "extensions/browser/event_router.h" | |
12 #include "extensions/common/api/copresence_socket.h" | |
13 | |
14 using copresence_sockets::CopresencePeer; | |
15 using copresence_sockets::CopresenceSocket; | |
16 | |
17 namespace extensions { | |
18 | |
19 class CopresencePeerResource : public ApiResource { | |
20 public: | |
21 // Takes ownership of peer. | |
Ken Rockot(use gerrit already)
2014/09/30 17:26:04
Can you document this by using a scoped_ptr instea
rkc
2014/10/01 19:08:24
Done.
| |
22 CopresencePeerResource(const std::string& owner_extension_id, | |
23 copresence_sockets::CopresencePeer* peer) | |
24 : ApiResource(owner_extension_id), peer_(peer) {} | |
25 | |
26 virtual ~CopresencePeerResource() { delete peer_; } | |
27 | |
28 copresence_sockets::CopresencePeer* peer() { return peer_; } | |
29 | |
30 static const content::BrowserThread::ID kThreadId = | |
31 content::BrowserThread::UI; | |
32 | |
33 private: | |
34 copresence_sockets::CopresencePeer* peer_; | |
35 | |
36 DISALLOW_COPY_AND_ASSIGN(CopresencePeerResource); | |
37 }; | |
38 | |
39 class CopresenceSocketResource : public ApiResource { | |
40 public: | |
41 // Takes ownership of socket. | |
42 CopresenceSocketResource(const std::string& owner_extension_id, | |
43 copresence_sockets::CopresenceSocket* socket) | |
44 : ApiResource(owner_extension_id), socket_(socket) {} | |
45 | |
46 virtual ~CopresenceSocketResource() { delete socket_; } | |
47 | |
48 copresence_sockets::CopresenceSocket* socket() { return socket_; } | |
49 | |
50 static const content::BrowserThread::ID kThreadId = | |
51 content::BrowserThread::UI; | |
52 | |
53 private: | |
54 copresence_sockets::CopresenceSocket* socket_; | |
55 | |
56 DISALLOW_COPY_AND_ASSIGN(CopresenceSocketResource); | |
57 }; | |
58 | |
59 CopresenceSocketFunction::CopresenceSocketFunction() | |
60 : peers_manager_(nullptr), sockets_manager_(nullptr) { | |
61 } | |
62 | |
63 CopresenceSocketFunction::~CopresenceSocketFunction() { | |
64 delete peers_manager_; | |
65 delete sockets_manager_; | |
66 } | |
67 | |
68 void CopresenceSocketFunction::Initialize() { | |
69 peers_manager_ = | |
70 new ApiResourceManager<CopresencePeerResource>(browser_context()); | |
71 sockets_manager_ = | |
72 new ApiResourceManager<CopresenceSocketResource>(browser_context()); | |
73 } | |
74 | |
75 int CopresenceSocketFunction::AddPeer(CopresencePeerResource* peer) { | |
76 return peers_manager_->Add(peer); | |
77 } | |
78 | |
79 int CopresenceSocketFunction::AddSocket(CopresenceSocketResource* socket) { | |
80 return sockets_manager_->Add(socket); | |
81 } | |
82 | |
83 void CopresenceSocketFunction::ReplacePeer(const std::string& extension_id, | |
84 int peer_id, | |
85 CopresencePeerResource* peer) { | |
86 peers_manager_->Replace(extension_id, peer_id, peer); | |
87 } | |
88 | |
89 CopresencePeerResource* CopresenceSocketFunction::GetPeer(int peer_id) { | |
90 return peers_manager_->Get(extension_id(), peer_id); | |
91 } | |
92 | |
93 CopresenceSocketResource* CopresenceSocketFunction::GetSocket(int socket_id) { | |
94 return sockets_manager_->Get(extension_id(), socket_id); | |
95 } | |
96 | |
97 void CopresenceSocketFunction::RemovePeer(int peer_id) { | |
98 peers_manager_->Remove(extension_id(), peer_id); | |
99 } | |
100 | |
101 void CopresenceSocketFunction::RemoveSocket(int socket_id) { | |
102 sockets_manager_->Remove(extension_id(), socket_id); | |
103 } | |
104 | |
105 void CopresenceSocketFunction::DispatchOnReceiveEvent(int socket_id, | |
106 const std::string& data) { | |
107 core_api::copresence_socket::ReceiveInfo info; | |
108 info.socket_id = socket_id; | |
109 info.data = data; | |
110 // Send the data to the client app. | |
111 scoped_ptr<Event> event( | |
112 new Event(core_api::copresence_socket::OnReceive::kEventName, | |
113 core_api::copresence_socket::OnReceive::Create(info), | |
114 browser_context())); | |
115 EventRouter::Get(browser_context()) | |
116 ->DispatchEventToExtension(extension_id(), event.Pass()); | |
117 VLOG(2) << "Dispatched OnReceive event: socketId = " << socket_id | |
118 << " and data = " << data; | |
119 } | |
120 | |
121 void CopresenceSocketFunction::DispatchOnConnectedEvent( | |
122 int peer_id, | |
123 CopresenceSocket* socket) { | |
124 int socket_id = | |
125 AddSocket(new CopresenceSocketResource(extension_id(), socket)); | |
126 | |
127 // Send the messages to the client app. | |
128 scoped_ptr<Event> event(new Event( | |
129 core_api::copresence_socket::OnConnected::kEventName, | |
130 core_api::copresence_socket::OnConnected::Create(peer_id, socket_id), | |
131 browser_context())); | |
132 EventRouter::Get(browser_context()) | |
133 ->DispatchEventToExtension(extension_id(), event.Pass()); | |
134 VLOG(2) << "Dispatched OnConnected event: peerId = " << peer_id | |
135 << " and socketId = " << socket_id; | |
136 | |
137 socket->Receive(base::Bind(base::Bind( | |
138 &CopresenceSocketFunction::DispatchOnReceiveEvent, this, peer_id))); | |
139 } | |
140 | |
141 ExtensionFunction::ResponseAction CopresenceSocketFunction::Run() { | |
142 Initialize(); | |
143 return Execute(); | |
144 } | |
145 | |
146 // CopresenceSocketCreatePeerFunction implementation: | |
147 ExtensionFunction::ResponseAction | |
148 CopresenceSocketCreatePeerFunction::Execute() { | |
149 // Add an empty peer to create a placeholder peer_id. We will need to bind | |
150 // this id to the OnConnected event dispatcher, so we need it before we | |
151 // create the actual peer. Once we have the peer created, we'll replace the | |
152 // placeholder with the actual peer object. | |
153 int peer_id = AddPeer(new CopresencePeerResource(extension_id(), nullptr)); | |
154 | |
155 CopresencePeer* peer = new CopresencePeer( | |
156 base::Bind(&CopresenceSocketCreatePeerFunction::OnCreated, this, peer_id), | |
157 base::Bind( | |
158 &CopresenceSocketFunction::DispatchOnConnectedEvent, this, peer_id)); | |
159 | |
160 ReplacePeer(extension_id(), | |
161 peer_id, | |
162 new CopresencePeerResource(extension_id(), peer)); | |
163 | |
164 return RespondLater(); | |
165 } | |
166 | |
167 void CopresenceSocketCreatePeerFunction::OnCreated(int peer_id, | |
168 const std::string& locator) { | |
169 core_api::copresence_socket::PeerInfo peer_info; | |
170 peer_info.peer_id = peer_id; | |
171 peer_info.locator = locator; | |
172 Respond(ArgumentList( | |
173 core_api::copresence_socket::CreatePeer::Results::Create(peer_info))); | |
174 } | |
175 | |
176 // CopresenceSocketDestroyPeerFunction implementation: | |
177 ExtensionFunction::ResponseAction | |
178 CopresenceSocketDestroyPeerFunction::Execute() { | |
179 scoped_ptr<core_api::copresence_socket::DestroyPeer::Params> params( | |
180 core_api::copresence_socket::DestroyPeer::Params::Create(*args_)); | |
181 EXTENSION_FUNCTION_VALIDATE(params.get()); | |
182 | |
183 RemovePeer(params->peer_id); | |
184 return RespondNow(NoArguments()); | |
185 } | |
186 | |
187 // CopresenceSocketSendFunction implementation: | |
188 ExtensionFunction::ResponseAction CopresenceSocketSendFunction::Execute() { | |
189 scoped_ptr<core_api::copresence_socket::Send::Params> params( | |
190 core_api::copresence_socket::Send::Params::Create(*args_)); | |
191 EXTENSION_FUNCTION_VALIDATE(params.get()); | |
192 | |
193 CopresenceSocketResource* socket = GetSocket(params->socket_id); | |
194 if (!socket) { | |
195 VLOG(1) << "Socket not found. ID = " << params->socket_id; | |
196 return RespondNow( | |
197 ArgumentList(core_api::copresence_socket::Send::Results::Create( | |
198 core_api::copresence_socket::SOCKET_STATUS_INVALID_SOCKET))); | |
199 } | |
200 | |
201 socket->socket()->Send(params->data); | |
202 return RespondNow( | |
203 ArgumentList(core_api::copresence_socket::Send::Results::Create( | |
204 core_api::copresence_socket::SOCKET_STATUS_NO_ERROR))); | |
205 } | |
206 | |
207 // CopresenceSocketDisconnectFunction implementation: | |
208 ExtensionFunction::ResponseAction | |
209 CopresenceSocketDisconnectFunction::Execute() { | |
210 scoped_ptr<core_api::copresence_socket::Disconnect::Params> params( | |
211 core_api::copresence_socket::Disconnect::Params::Create(*args_)); | |
212 EXTENSION_FUNCTION_VALIDATE(params.get()); | |
213 | |
214 return RespondLater(); | |
215 } | |
216 | |
217 } // namespace extensions | |
OLD | NEW |