Chromium Code Reviews| Index: extensions/browser/api/copresence_socket/copresence_socket_api.cc |
| diff --git a/extensions/browser/api/copresence_socket/copresence_socket_api.cc b/extensions/browser/api/copresence_socket/copresence_socket_api.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..518ddd4fcde12cd3acaa393462c6bee573f23093 |
| --- /dev/null |
| +++ b/extensions/browser/api/copresence_socket/copresence_socket_api.cc |
| @@ -0,0 +1,217 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "extensions/browser/api/copresence_socket/copresence_socket_api.h" |
| + |
| +#include "base/lazy_instance.h" |
| +#include "components/copresence_sockets/public/copresence_peer.h" |
| +#include "components/copresence_sockets/public/copresence_socket.h" |
| +#include "content/public/browser/browser_context.h" |
| +#include "extensions/browser/event_router.h" |
| +#include "extensions/common/api/copresence_socket.h" |
| + |
| +using copresence_sockets::CopresencePeer; |
| +using copresence_sockets::CopresenceSocket; |
| + |
| +namespace extensions { |
| + |
| +class CopresencePeerResource : public ApiResource { |
| + public: |
| + // 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.
|
| + CopresencePeerResource(const std::string& owner_extension_id, |
| + copresence_sockets::CopresencePeer* peer) |
| + : ApiResource(owner_extension_id), peer_(peer) {} |
| + |
| + virtual ~CopresencePeerResource() { delete peer_; } |
| + |
| + copresence_sockets::CopresencePeer* peer() { return peer_; } |
| + |
| + static const content::BrowserThread::ID kThreadId = |
| + content::BrowserThread::UI; |
| + |
| + private: |
| + copresence_sockets::CopresencePeer* peer_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(CopresencePeerResource); |
| +}; |
| + |
| +class CopresenceSocketResource : public ApiResource { |
| + public: |
| + // Takes ownership of socket. |
| + CopresenceSocketResource(const std::string& owner_extension_id, |
| + copresence_sockets::CopresenceSocket* socket) |
| + : ApiResource(owner_extension_id), socket_(socket) {} |
| + |
| + virtual ~CopresenceSocketResource() { delete socket_; } |
| + |
| + copresence_sockets::CopresenceSocket* socket() { return socket_; } |
| + |
| + static const content::BrowserThread::ID kThreadId = |
| + content::BrowserThread::UI; |
| + |
| + private: |
| + copresence_sockets::CopresenceSocket* socket_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(CopresenceSocketResource); |
| +}; |
| + |
| +CopresenceSocketFunction::CopresenceSocketFunction() |
| + : peers_manager_(nullptr), sockets_manager_(nullptr) { |
| +} |
| + |
| +CopresenceSocketFunction::~CopresenceSocketFunction() { |
| + delete peers_manager_; |
| + delete sockets_manager_; |
| +} |
| + |
| +void CopresenceSocketFunction::Initialize() { |
| + peers_manager_ = |
| + new ApiResourceManager<CopresencePeerResource>(browser_context()); |
| + sockets_manager_ = |
| + new ApiResourceManager<CopresenceSocketResource>(browser_context()); |
| +} |
| + |
| +int CopresenceSocketFunction::AddPeer(CopresencePeerResource* peer) { |
| + return peers_manager_->Add(peer); |
| +} |
| + |
| +int CopresenceSocketFunction::AddSocket(CopresenceSocketResource* socket) { |
| + return sockets_manager_->Add(socket); |
| +} |
| + |
| +void CopresenceSocketFunction::ReplacePeer(const std::string& extension_id, |
| + int peer_id, |
| + CopresencePeerResource* peer) { |
| + peers_manager_->Replace(extension_id, peer_id, peer); |
| +} |
| + |
| +CopresencePeerResource* CopresenceSocketFunction::GetPeer(int peer_id) { |
| + return peers_manager_->Get(extension_id(), peer_id); |
| +} |
| + |
| +CopresenceSocketResource* CopresenceSocketFunction::GetSocket(int socket_id) { |
| + return sockets_manager_->Get(extension_id(), socket_id); |
| +} |
| + |
| +void CopresenceSocketFunction::RemovePeer(int peer_id) { |
| + peers_manager_->Remove(extension_id(), peer_id); |
| +} |
| + |
| +void CopresenceSocketFunction::RemoveSocket(int socket_id) { |
| + sockets_manager_->Remove(extension_id(), socket_id); |
| +} |
| + |
| +void CopresenceSocketFunction::DispatchOnReceiveEvent(int socket_id, |
| + const std::string& data) { |
| + core_api::copresence_socket::ReceiveInfo info; |
| + info.socket_id = socket_id; |
| + info.data = data; |
| + // Send the data to the client app. |
| + scoped_ptr<Event> event( |
| + new Event(core_api::copresence_socket::OnReceive::kEventName, |
| + core_api::copresence_socket::OnReceive::Create(info), |
| + browser_context())); |
| + EventRouter::Get(browser_context()) |
| + ->DispatchEventToExtension(extension_id(), event.Pass()); |
| + VLOG(2) << "Dispatched OnReceive event: socketId = " << socket_id |
| + << " and data = " << data; |
| +} |
| + |
| +void CopresenceSocketFunction::DispatchOnConnectedEvent( |
| + int peer_id, |
| + CopresenceSocket* socket) { |
| + int socket_id = |
| + AddSocket(new CopresenceSocketResource(extension_id(), socket)); |
| + |
| + // Send the messages to the client app. |
| + scoped_ptr<Event> event(new Event( |
| + core_api::copresence_socket::OnConnected::kEventName, |
| + core_api::copresence_socket::OnConnected::Create(peer_id, socket_id), |
| + browser_context())); |
| + EventRouter::Get(browser_context()) |
| + ->DispatchEventToExtension(extension_id(), event.Pass()); |
| + VLOG(2) << "Dispatched OnConnected event: peerId = " << peer_id |
| + << " and socketId = " << socket_id; |
| + |
| + socket->Receive(base::Bind(base::Bind( |
| + &CopresenceSocketFunction::DispatchOnReceiveEvent, this, peer_id))); |
| +} |
| + |
| +ExtensionFunction::ResponseAction CopresenceSocketFunction::Run() { |
| + Initialize(); |
| + return Execute(); |
| +} |
| + |
| +// CopresenceSocketCreatePeerFunction implementation: |
| +ExtensionFunction::ResponseAction |
| +CopresenceSocketCreatePeerFunction::Execute() { |
| + // Add an empty peer to create a placeholder peer_id. We will need to bind |
| + // this id to the OnConnected event dispatcher, so we need it before we |
| + // create the actual peer. Once we have the peer created, we'll replace the |
| + // placeholder with the actual peer object. |
| + int peer_id = AddPeer(new CopresencePeerResource(extension_id(), nullptr)); |
| + |
| + CopresencePeer* peer = new CopresencePeer( |
| + base::Bind(&CopresenceSocketCreatePeerFunction::OnCreated, this, peer_id), |
| + base::Bind( |
| + &CopresenceSocketFunction::DispatchOnConnectedEvent, this, peer_id)); |
| + |
| + ReplacePeer(extension_id(), |
| + peer_id, |
| + new CopresencePeerResource(extension_id(), peer)); |
| + |
| + return RespondLater(); |
| +} |
| + |
| +void CopresenceSocketCreatePeerFunction::OnCreated(int peer_id, |
| + const std::string& locator) { |
| + core_api::copresence_socket::PeerInfo peer_info; |
| + peer_info.peer_id = peer_id; |
| + peer_info.locator = locator; |
| + Respond(ArgumentList( |
| + core_api::copresence_socket::CreatePeer::Results::Create(peer_info))); |
| +} |
| + |
| +// CopresenceSocketDestroyPeerFunction implementation: |
| +ExtensionFunction::ResponseAction |
| +CopresenceSocketDestroyPeerFunction::Execute() { |
| + scoped_ptr<core_api::copresence_socket::DestroyPeer::Params> params( |
| + core_api::copresence_socket::DestroyPeer::Params::Create(*args_)); |
| + EXTENSION_FUNCTION_VALIDATE(params.get()); |
| + |
| + RemovePeer(params->peer_id); |
| + return RespondNow(NoArguments()); |
| +} |
| + |
| +// CopresenceSocketSendFunction implementation: |
| +ExtensionFunction::ResponseAction CopresenceSocketSendFunction::Execute() { |
| + scoped_ptr<core_api::copresence_socket::Send::Params> params( |
| + core_api::copresence_socket::Send::Params::Create(*args_)); |
| + EXTENSION_FUNCTION_VALIDATE(params.get()); |
| + |
| + CopresenceSocketResource* socket = GetSocket(params->socket_id); |
| + if (!socket) { |
| + VLOG(1) << "Socket not found. ID = " << params->socket_id; |
| + return RespondNow( |
| + ArgumentList(core_api::copresence_socket::Send::Results::Create( |
| + core_api::copresence_socket::SOCKET_STATUS_INVALID_SOCKET))); |
| + } |
| + |
| + socket->socket()->Send(params->data); |
| + return RespondNow( |
| + ArgumentList(core_api::copresence_socket::Send::Results::Create( |
| + core_api::copresence_socket::SOCKET_STATUS_NO_ERROR))); |
| +} |
| + |
| +// CopresenceSocketDisconnectFunction implementation: |
| +ExtensionFunction::ResponseAction |
| +CopresenceSocketDisconnectFunction::Execute() { |
| + scoped_ptr<core_api::copresence_socket::Disconnect::Params> params( |
| + core_api::copresence_socket::Disconnect::Params::Create(*args_)); |
| + EXTENSION_FUNCTION_VALIDATE(params.get()); |
| + |
| + return RespondLater(); |
| +} |
| + |
| +} // namespace extensions |