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

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.
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698