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

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

Powered by Google App Engine
This is Rietveld 408576698