Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Side by Side Diff: extensions/browser/api/copresence_socket/copresence_socket_api.cc

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

Powered by Google App Engine
This is Rietveld 408576698