- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / socket / tcp_socket.h
1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_EXTENSIONS_API_SOCKET_TCP_SOCKET_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_SOCKET_TCP_SOCKET_H_
7
8 #include <string>
9
10 #include "chrome/browser/extensions/api/socket/socket.h"
11
12 // This looks like it should be forward-declarable, but it does some tricky
13 // moves that make it easier to just include it.
14 #include "net/socket/tcp_client_socket.h"
15 #include "net/socket/tcp_server_socket.h"
16
17 namespace net {
18 class Socket;
19 }
20
21 namespace extensions {
22
23 class TCPSocket : public Socket {
24  public:
25   explicit TCPSocket(const std::string& owner_extension_id);
26   TCPSocket(net::TCPClientSocket* tcp_client_socket,
27             const std::string& owner_extension_id,
28             bool is_connected = false);
29
30   virtual ~TCPSocket();
31
32   virtual void Connect(const std::string& address,
33                        int port,
34                        const CompletionCallback& callback) OVERRIDE;
35   virtual void Disconnect() OVERRIDE;
36   virtual int Bind(const std::string& address, int port) OVERRIDE;
37   virtual void Read(int count,
38                     const ReadCompletionCallback& callback) OVERRIDE;
39   virtual void RecvFrom(int count,
40                         const RecvFromCompletionCallback& callback) OVERRIDE;
41   virtual void SendTo(scoped_refptr<net::IOBuffer> io_buffer,
42                       int byte_count,
43                       const std::string& address,
44                       int port,
45                       const CompletionCallback& callback) OVERRIDE;
46   virtual bool SetKeepAlive(bool enable, int delay) OVERRIDE;
47   virtual bool SetNoDelay(bool no_delay) OVERRIDE;
48   virtual int Listen(const std::string& address, int port,
49                      int backlog, std::string* error_msg) OVERRIDE;
50   virtual void Accept(const AcceptCompletionCallback &callback) OVERRIDE;
51
52   virtual bool IsConnected() OVERRIDE;
53
54   virtual bool GetPeerAddress(net::IPEndPoint* address) OVERRIDE;
55   virtual bool GetLocalAddress(net::IPEndPoint* address) OVERRIDE;
56   virtual Socket::SocketType GetSocketType() const OVERRIDE;
57
58   static TCPSocket* CreateSocketForTesting(
59       net::TCPClientSocket* tcp_client_socket,
60       const std::string& owner_extension_id,
61       bool is_connected = false);
62   static TCPSocket* CreateServerSocketForTesting(
63       net::TCPServerSocket* tcp_server_socket,
64       const std::string& owner_extension_id);
65
66  protected:
67   virtual int WriteImpl(net::IOBuffer* io_buffer,
68                         int io_buffer_size,
69                         const net::CompletionCallback& callback) OVERRIDE;
70
71  private:
72   void RefreshConnectionStatus();
73   void OnConnectComplete(int result);
74   void OnReadComplete(scoped_refptr<net::IOBuffer> io_buffer,
75                       int result);
76   void OnAccept(int result);
77
78   TCPSocket(net::TCPServerSocket* tcp_server_socket,
79             const std::string& owner_extension_id);
80
81   scoped_ptr<net::TCPClientSocket> socket_;
82   scoped_ptr<net::TCPServerSocket> server_socket_;
83
84   enum SocketMode {
85     UNKNOWN = 0,
86     CLIENT,
87     SERVER,
88   };
89   SocketMode socket_mode_;
90
91   CompletionCallback connect_callback_;
92
93   ReadCompletionCallback read_callback_;
94
95   scoped_ptr<net::StreamSocket> accept_socket_;
96   AcceptCompletionCallback accept_callback_;
97 };
98
99 // TCP Socket instances from the "sockets.tcp" namespace. These are regular
100 // socket objects with additional properties related to the behavior defined in
101 // the "sockets.tcp" namespace.
102 class ResumableTCPSocket : public TCPSocket {
103  public:
104   explicit ResumableTCPSocket(const std::string& owner_extension_id);
105   explicit ResumableTCPSocket(net::TCPClientSocket* tcp_client_socket,
106                               const std::string& owner_extension_id,
107                               bool is_connected);
108
109   // Overriden from ApiResource
110   virtual bool IsPersistent() const OVERRIDE;
111
112   const std::string& name() const { return name_; }
113   void set_name(const std::string& name) { name_ = name; }
114
115   bool persistent() const { return persistent_;  }
116   void set_persistent(bool persistent) { persistent_ = persistent; }
117
118   int buffer_size() const { return buffer_size_; }
119   void set_buffer_size(int buffer_size) { buffer_size_ = buffer_size; }
120
121   bool paused() const { return paused_; }
122   void set_paused(bool paused) { paused_ = paused; }
123
124  private:
125   friend class ApiResourceManager<ResumableTCPSocket>;
126   static const char* service_name() {
127     return "ResumableTCPSocketManager";
128   }
129
130   // Application-defined string - see sockets_tcp.idl.
131   std::string name_;
132   // Flag indicating whether the socket is left open when the application is
133   // suspended - see sockets_tcp.idl.
134   bool persistent_;
135   // The size of the buffer used to receive data - see sockets_tcp.idl.
136   int buffer_size_;
137   // Flag indicating whether a connected socket blocks its peer from sending
138   // more data - see sockets_tcp.idl.
139   bool paused_;
140 };
141
142 // TCP Socket instances from the "sockets.tcpServer" namespace. These are
143 // regular socket objects with additional properties related to the behavior
144 // defined in the "sockets.tcpServer" namespace.
145 class ResumableTCPServerSocket : public TCPSocket {
146  public:
147   explicit ResumableTCPServerSocket(const std::string& owner_extension_id);
148
149   // Overriden from ApiResource
150   virtual bool IsPersistent() const OVERRIDE;
151
152   const std::string& name() const { return name_; }
153   void set_name(const std::string& name) { name_ = name; }
154
155   bool persistent() const { return persistent_; }
156   void set_persistent(bool persistent) { persistent_ = persistent; }
157
158   bool paused() const { return paused_; }
159   void set_paused(bool paused) { paused_ = paused; }
160
161  private:
162   friend class ApiResourceManager<ResumableTCPServerSocket>;
163   static const char* service_name() {
164     return "ResumableTCPServerSocketManager";
165   }
166
167   // Application-defined string - see sockets_tcp_server.idl.
168   std::string name_;
169   // Flag indicating whether the socket is left open when the application is
170   // suspended - see sockets_tcp_server.idl.
171   bool persistent_;
172   // Flag indicating whether a connected socket blocks its peer from sending
173   // more data - see sockets_tcp_server.idl.
174   bool paused_;
175 };
176
177 }  //  namespace extensions
178
179 #endif  // CHROME_BROWSER_EXTENSIONS_API_SOCKET_TCP_SOCKET_H_