summaryrefslogtreecommitdiffstats
path: root/net/base/tcp_client_socket.h
diff options
context:
space:
mode:
Diffstat (limited to 'net/base/tcp_client_socket.h')
-rw-r--r--net/base/tcp_client_socket.h71
1 files changed, 53 insertions, 18 deletions
diff --git a/net/base/tcp_client_socket.h b/net/base/tcp_client_socket.h
index 06a57fe..96589464 100644
--- a/net/base/tcp_client_socket.h
+++ b/net/base/tcp_client_socket.h
@@ -5,11 +5,21 @@
#ifndef NET_BASE_TCP_CLIENT_SOCKET_H_
#define NET_BASE_TCP_CLIENT_SOCKET_H_
-#include <ws2tcpip.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/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 @@ namespace net {
// 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 @@ class TCPClientSocket : public ClientSocket,
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 @@ class TCPClientSocket : public ClientSocket,
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