Index: mojo/spy/websocket_server.cc |
diff --git a/mojo/spy/websocket_server.cc b/mojo/spy/websocket_server.cc |
index 649a135c13e81fb363db3b878ad8833343ce515c..baa87095cbccd9b6ca302cef67ecab006f2c3e80 100644 |
--- a/mojo/spy/websocket_server.cc |
+++ b/mojo/spy/websocket_server.cc |
@@ -4,20 +4,29 @@ |
#include "mojo/spy/websocket_server.h" |
+#include <string> |
+ |
#include "base/bind.h" |
#include "base/strings/stringprintf.h" |
+ |
+#include "mojo/public/cpp/bindings/message.h" |
+ |
#include "net/base/ip_endpoint.h" |
#include "net/base/net_errors.h" |
#include "net/server/http_server_request_info.h" |
#include "net/server/http_server_response_info.h" |
#include "net/socket/tcp_listen_socket.h" |
-namespace spy { |
+namespace mojo { |
const int kNotConnected = -1; |
-WebSocketServer::WebSocketServer(int port) |
- : port_(port), connection_id_(kNotConnected) { |
+WebSocketServer::WebSocketServer(int port, |
+ mojo::ScopedMessagePipeHandle server_pipe) |
+ : port_(port), |
+ connection_id_(kNotConnected), |
+ spy_server_(MakeProxy<spy_api::SpyServer>(server_pipe.Pass())) { |
+ spy_server_.set_client(this); |
} |
WebSocketServer::~WebSocketServer() { |
@@ -25,9 +34,9 @@ WebSocketServer::~WebSocketServer() { |
bool WebSocketServer::Start() { |
net::TCPListenSocketFactory factory("0.0.0.0", port_); |
- server_ = new net::HttpServer(factory, this); |
+ web_server_ = new net::HttpServer(factory, this); |
net::IPEndPoint address; |
- int error = server_->GetLocalAddress(&address); |
+ int error = web_server_->GetLocalAddress(&address); |
port_ = address.port(); |
return (error == net::OK); |
} |
@@ -35,7 +44,7 @@ bool WebSocketServer::Start() { |
void WebSocketServer::OnHttpRequest( |
int connection_id, |
const net::HttpServerRequestInfo& info) { |
- server_->Send500(connection_id, "websockets protocol only"); |
+ web_server_->Send500(connection_id, "websockets protocol only"); |
} |
void WebSocketServer::OnWebSocketRequest( |
@@ -45,26 +54,63 @@ void WebSocketServer::OnWebSocketRequest( |
// Reject connection since we already have our client. |
base::MessageLoop::current()->PostTask( |
FROM_HERE, |
- base::Bind(&net::HttpServer::Close, server_, connection_id)); |
+ base::Bind(&net::HttpServer::Close, web_server_, connection_id)); |
return; |
} |
// Accept the connection. |
- server_->AcceptWebSocket(connection_id, info); |
+ web_server_->AcceptWebSocket(connection_id, info); |
connection_id_ = connection_id; |
} |
void WebSocketServer::OnWebSocketMessage( |
int connection_id, |
const std::string& data) { |
- // TODO(cpu): remove this test code soon. |
- if (data == "\"hello\"") |
- server_->SendOverWebSocket(connection_id, "\"hi there!\""); |
+ |
+ if (data == "\"start\"") { |
+ spy_api::VersionPtr ver = spy_api::Version::New(); |
+ ver->v_major = 0; |
+ ver->v_minor = 1; |
+ spy_server_->StartSession( |
+ ver.Pass(), |
+ base::Bind(&WebSocketServer::OnStartSession, base::Unretained(this))); |
+ } else if (data == "\"stop\"") { |
+ spy_server_->StopSession( |
+ base::Bind(&WebSocketServer::OnSessionEnd, base::Unretained(this))); |
+ } |
+} |
+ |
+void WebSocketServer::OnFatalError(spy_api::Result result) { |
+ web_server_->SendOverWebSocket(connection_id_, "\"fatal error\""); |
} |
void WebSocketServer::OnClose( |
int connection_id) { |
- if (connection_id == connection_id_) |
- connection_id_ = kNotConnected; |
+ if (connection_id != connection_id_) |
+ return; |
+ connection_id_ = kNotConnected; |
+ |
+ spy_server_->StopSession( |
+ base::Bind(&WebSocketServer::OnSessionEnd, base::Unretained(this))); |
+} |
+ |
+void WebSocketServer::OnSessionEnd(spy_api::Result result) { |
+ // Called when the spy session (not the websocket) ends. |
+} |
+ |
+void WebSocketServer::OnClientConnection( |
+ const mojo::String& name, |
+ uint32_t id, |
+ spy_api::ConnectionOptions options) { |
+ std::string cc("\""); |
+ cc += name.To<std::string>() + "\""; |
+ web_server_->SendOverWebSocket(connection_id_, cc); |
+} |
+ |
+void WebSocketServer::OnMessage(spy_api::MessagePtr message) { |
+} |
+ |
+void WebSocketServer::OnStartSession(spy_api::Result, mojo::String) { |
+ web_server_->SendOverWebSocket(connection_id_, "\"ok start\""); |
} |
-} // namespace spy |
+} // namespace mojo |