1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#ifndef NET_SOCKET_TCP_SERVER_SOCKET_WIN_H_
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#define NET_SOCKET_TCP_SERVER_SOCKET_WIN_H_
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <winsock2.h>
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/message_loop.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/scoped_ptr.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/win/object_watcher.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/threading/non_thread_safe.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/base/net_log.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "net/socket/server_socket.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace net {
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass IPEndPoint;
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass TCPServerSocketWin : public ServerSocket,
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           public base::NonThreadSafe,
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           public base::win::ObjectWatcher::Delegate  {
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TCPServerSocketWin(net::NetLog* net_log,
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     const net::NetLog::Source& source);
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ~TCPServerSocketWin();
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // net::ServerSocket implementation.
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int Listen(const net::IPEndPoint& address, int backlog);
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int GetLocalAddress(IPEndPoint* address) const;
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int Accept(scoped_ptr<ClientSocket>* socket,
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                     CompletionCallback* callback);
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // base::ObjectWatcher::Delegate implementation.
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnObjectSignaled(HANDLE object);
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int AcceptInternal(scoped_ptr<ClientSocket>* socket);
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void Close();
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SOCKET socket_;
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  HANDLE socket_event_;
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::win::ObjectWatcher accept_watcher_;
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<ClientSocket>* accept_socket_;
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CompletionCallback* accept_callback_;
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BoundNetLog net_log_;
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace net
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif  // NET_SOCKET_TCP_SERVER_SOCKET_WIN_H_
56