1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_DEBUGGER_DEVTOOLS_REMOTE_LISTEN_SOCKET_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_DEBUGGER_DEVTOOLS_REMOTE_LISTEN_SOCKET_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/debugger/devtools_remote_message.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/listen_socket.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DevToolsRemoteListener;
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Listens to remote debugger incoming connections, handles the V8ARDP protocol
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// socket input and invokes the message handler when appropriate.
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DevToolsRemoteListenSocket : public ListenSocket,
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   public ListenSocket::ListenSocketDelegate {
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Listen on port for the specified IP address.  Use 127.0.0.1 to only
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // accept local connections.
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static DevToolsRemoteListenSocket* Listen(
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const std::string& ip,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int port,
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DevToolsRemoteListener* message_listener);
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void Listen();
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Accept();
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Close();
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SendInternal(const char* bytes, int len);
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~DevToolsRemoteListenSocket();
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ListenSocket::ListenSocketDelegate interface
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DidAccept(ListenSocket *server, ListenSocket *connection);
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DidRead(ListenSocket *connection, const char* data, int len);
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DidClose(ListenSocket *connection);
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The protocol states while reading socket input
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum State {
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    INVALID = 0,  // Bad handshake message received, retry
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    HANDSHAKE = 1,  // Receiving handshake message
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    HEADERS = 2,  // Receiving protocol headers
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    PAYLOAD = 3  // Receiving payload
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DevToolsRemoteListenSocket(SOCKET s,
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             DevToolsRemoteListener *listener);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StartNextField();
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void HandleMessage();
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DispatchField();
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& GetHeader(const std::string& header_name,
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               const std::string& default_value) const;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  State state_;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DevToolsRemoteMessage::HeaderMap header_map_;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string protocol_field_;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string payload_;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int32 remaining_payload_length_;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DevToolsRemoteListener* message_listener_;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool cr_received_;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(DevToolsRemoteListenSocket);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_DEBUGGER_DEVTOOLS_REMOTE_LISTEN_SOCKET_H_
70