Chromium Code Reviews| Index: sky/services/inspector/server.cc |
| diff --git a/sky/services/inspector/server.cc b/sky/services/inspector/server.cc |
| index d052cc257b01185058697692dd63ab94c2dfa6b9..2c9dd655bbbc68a408fb2dc6bbf16df2ebbd3f7d 100644 |
| --- a/sky/services/inspector/server.cc |
| +++ b/sky/services/inspector/server.cc |
| @@ -2,36 +2,125 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include "base/lazy_instance.h" |
|
abarth-chromium
2014/11/11 02:53:57
I don't think this is needed now.
|
| #include "mojo/application/application_runner_chromium.h" |
| #include "mojo/public/c/system/main.h" |
| #include "mojo/public/cpp/application/application_delegate.h" |
| #include "mojo/public/cpp/application/application_impl.h" |
| +#include "net/server/http_server.h" |
| +#include "net/socket/tcp_server_socket.h" |
| #include "sky/services/inspector/inspector_frontend_impl.h" |
| namespace sky { |
| namespace inspector { |
| -class Server : public mojo::ApplicationDelegate { |
| +namespace { |
| +const int kNotConnected = -1; |
| +} |
| + |
| +class Server : public mojo::ApplicationDelegate, |
| + public InspectorFrontendImpl::Delegate, |
| + public mojo::InterfaceFactory<InspectorFrontendImpl>, |
| + public net::HttpServer::Delegate { |
| public: |
| - Server() {} |
| + Server() : connection_id_(kNotConnected) {} |
| virtual ~Server() {} |
| private: |
| - // Overridden from mojo::ApplicationDelegate: |
| - virtual void Initialize(mojo::ApplicationImpl* app) override { |
| + // mojo::ApplicationDelegate: |
| + void Initialize(mojo::ApplicationImpl* app) override { |
| } |
| - |
| - virtual bool ConfigureIncomingConnection( |
| + bool ConfigureIncomingConnection( |
| mojo::ApplicationConnection* connection) override { |
| - connection->AddService(&frontend_factory_); |
| + connection->AddService(this); |
| return true; |
| } |
| - InspectorFrontendFactory frontend_factory_; |
| + // InterfaceFactory<InspectorFrontendImpl>: |
| + void Create(mojo::ApplicationConnection* connection, |
| + mojo::InterfaceRequest<InspectorFrontendImpl> request) override { |
| + BindToRequest(new InspectorFrontendImpl(this), &request); |
| + } |
| + |
| + // InspectorFrontendImpl::Delegate: |
| + void Register(InspectorFrontendImpl*) override; |
| + void Unregister(InspectorFrontendImpl*) override; |
| + |
| + void Listen(int32_t port) override; |
| + void SendMessage(const mojo::String& message) override; |
| + |
| + // From net::HttpServer::Delegate |
| + void OnConnect(int connection_id) override; |
| + void OnHttpRequest( |
| + int connection_id, const net::HttpServerRequestInfo& info) override; |
| + void OnWebSocketRequest( |
| + int connection_id, const net::HttpServerRequestInfo& info) override; |
| + void OnWebSocketMessage( |
| + int connection_id, const std::string& data) override; |
| + void OnClose(int connection_id) override; |
| + |
| + int connection_id_; |
| + scoped_ptr<net::HttpServer> web_server_; |
| + // TODO(eseidel): The server should control the lifetime of these agents. |
| + ObserverList<InspectorFrontendImpl> agents_; |
| DISALLOW_COPY_AND_ASSIGN(Server); |
| }; |
| +void Server::OnConnect(int connection_id) { |
| +} |
| + |
| +void Server::OnHttpRequest( |
| + int connection_id, const net::HttpServerRequestInfo& info) { |
| + web_server_->Send500(connection_id, "websockets protocol only"); |
| +} |
| + |
| +void Server::OnWebSocketRequest( |
| + int connection_id, const net::HttpServerRequestInfo& info) { |
| + if (connection_id_ != kNotConnected) { |
| + web_server_->Close(connection_id); |
| + return; |
| + } |
| + web_server_->AcceptWebSocket(connection_id, info); |
| + connection_id_ = connection_id; |
| + FOR_EACH_OBSERVER(InspectorFrontendImpl, agents_, client()->OnConnect()); |
| +} |
| + |
| +void Server::OnWebSocketMessage( |
| + int connection_id, const std::string& data) { |
| + DCHECK_EQ(connection_id, connection_id_); |
| + FOR_EACH_OBSERVER(InspectorFrontendImpl, agents_, client()->OnMessage(data)); |
| +} |
| + |
| +void Server::OnClose(int connection_id) { |
| + if (connection_id != connection_id_) |
| + return; |
| + connection_id_ = kNotConnected; |
| + FOR_EACH_OBSERVER(InspectorFrontendImpl, agents_, client()->OnDisconnect()); |
| +} |
| + |
| +void Server::Register(InspectorFrontendImpl* agent) { |
| + agents_.AddObserver(agent); |
| +} |
| + |
| +void Server::Unregister(InspectorFrontendImpl* agent) { |
| + agents_.RemoveObserver(agent); |
| +} |
| + |
| +void Server::Listen(int32_t port) { |
| + web_server_.reset(); // Tear down any existing connection first. |
| + scoped_ptr<net::ServerSocket> server_socket( |
| + new net::TCPServerSocket(NULL, net::NetLog::Source())); |
| + server_socket->ListenWithAddressAndPort("0.0.0.0", port, 1); |
| + web_server_.reset(new net::HttpServer(server_socket.Pass(), this)); |
| +} |
| + |
| +void Server::SendMessage(const mojo::String& message) { |
| + if (connection_id_ == kNotConnected) |
| + return; |
| + web_server_->SendOverWebSocket(connection_id_, message); |
| +} |
| + |
| } // namespace inspector |
| } // namespace sky |