Index: net/base/tcp_client_socket.h |
=================================================================== |
--- net/base/tcp_client_socket.h (revision 2361) |
+++ net/base/tcp_client_socket.h (working copy) |
@@ -5,11 +5,21 @@ |
#ifndef NET_BASE_TCP_CLIENT_SOCKET_H_ |
#define NET_BASE_TCP_CLIENT_SOCKET_H_ |
+#include "build/build_config.h" |
+ |
+#if defined(OS_WIN) |
#include <ws2tcpip.h> |
+#include "base/object_watcher.h" |
+#elif defined(OS_POSIX) |
+struct event; // From libevent |
+#define SOCKET int |
+#include "base/message_pump_libevent.h" |
+#endif |
-#include "base/object_watcher.h" |
+#include "base/scoped_ptr.h" |
#include "net/base/address_list.h" |
#include "net/base/client_socket.h" |
+#include "net/base/completion_callback.h" |
namespace net { |
@@ -18,7 +28,12 @@ |
// NOTE: The implementation supports half duplex only. Read and Write calls |
// must not be in progress at the same time. |
class TCPClientSocket : public ClientSocket, |
- public base::ObjectWatcher::Delegate { |
+#if defined(OS_WIN) |
+ public base::ObjectWatcher::Delegate |
+#elif defined(OS_POSIX) |
+ public base::MessagePumpLibevent::Watcher |
+#endif |
+{ |
public: |
// The IP address(es) and port number to connect to. The TCP socket will try |
// each IP address in the list until it succeeds in establishing a |
@@ -34,31 +49,23 @@ |
virtual bool IsConnected() const; |
// Socket methods: |
+ // Try to transfer buf_len bytes to/from socket. |
+ // If a result is available now, return it; else call back later with one. |
+ // Do not call again until a result is returned! |
+ // If any bytes were transferred, the result is the byte count. |
+ // On error, result is a negative error code; see net/base/net_error_list.h |
+ // TODO: what would a zero return value indicate? |
+ // TODO: support multiple outstanding requests? |
virtual int Read(char* buf, int buf_len, CompletionCallback* callback); |
virtual int Write(const char* buf, int buf_len, CompletionCallback* callback); |
private: |
- int CreateSocket(const struct addrinfo* ai); |
- void DoCallback(int rv); |
- void DidCompleteConnect(); |
- void DidCompleteIO(); |
- |
- // base::ObjectWatcher::Delegate methods: |
- virtual void OnObjectSignaled(HANDLE object); |
- |
SOCKET socket_; |
- OVERLAPPED overlapped_; |
- WSABUF buffer_; |
- base::ObjectWatcher watcher_; |
- |
- CompletionCallback* callback_; |
- |
// The list of addresses we should try in order to establish a connection. |
AddressList addresses_; |
- // The addrinfo that we are attempting to use or NULL if all addrinfos have |
- // been tried. |
+ // Where we are in above list, or NULL if all addrinfos have been tried. |
const struct addrinfo* current_ai_; |
enum WaitState { |
@@ -68,6 +75,34 @@ |
WAITING_WRITE |
}; |
WaitState wait_state_; |
+ |
+#if defined(OS_WIN) |
+ // base::ObjectWatcher::Delegate methods: |
+ virtual void OnObjectSignaled(HANDLE object); |
+ |
+ OVERLAPPED overlapped_; |
+ WSABUF buffer_; |
+ |
+ base::ObjectWatcher watcher_; |
+#elif defined(OS_POSIX) |
+ // The socket's libevent wrapper |
+ scoped_ptr<event> event_; |
+ |
+ // Called by MessagePumpLibevent when the socket is ready to do I/O |
+ void OnSocketReady(short flags); |
+ |
+ // The buffer used by OnSocketReady to retry Read and Write requests |
+ char* buf_; |
+ int buf_len_; |
+#endif |
+ |
+ // External callback; called when read or write is complete. |
+ CompletionCallback* callback_; |
+ |
+ int CreateSocket(const struct addrinfo* ai); |
+ void DoCallback(int rv); |
+ void DidCompleteConnect(); |
+ void DidCompleteIO(); |
}; |
} // namespace net |