1f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org/*
2f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *
4f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org */
10f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
11f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#ifndef WEBRTC_BASE_WIN32SOCKETSERVER_H_
12f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#define WEBRTC_BASE_WIN32SOCKETSERVER_H_
13f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
14f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#if defined(WEBRTC_WIN)
15f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/asyncsocket.h"
16f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/criticalsection.h"
17f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/messagequeue.h"
18f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/socketserver.h"
19f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/socketfactory.h"
20f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/socket.h"
21f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/thread.h"
22f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#include "webrtc/base/win32window.h"
23f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
24f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgnamespace rtc {
25f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
26f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org///////////////////////////////////////////////////////////////////////////////
27f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Win32Socket
28f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org///////////////////////////////////////////////////////////////////////////////
29f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
30f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Win32Socket : public AsyncSocket {
31f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
32f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Win32Socket();
33f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual ~Win32Socket();
34f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
35f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool CreateT(int family, int type);
36f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
37f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int Attach(SOCKET s);
38f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void SetTimeout(int ms);
39f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
40f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // AsyncSocket Interface
41f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual SocketAddress GetLocalAddress() const;
42f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual SocketAddress GetRemoteAddress() const;
43f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual int Bind(const SocketAddress& addr);
44f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual int Connect(const SocketAddress& addr);
45f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual int Send(const void *buffer, size_t length);
46f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual int SendTo(const void *buffer, size_t length, const SocketAddress& addr);
47f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual int Recv(void *buffer, size_t length);
48f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual int RecvFrom(void *buffer, size_t length, SocketAddress *out_addr);
49f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual int Listen(int backlog);
50f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual Win32Socket *Accept(SocketAddress *out_addr);
51f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual int Close();
52f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual int GetError() const;
53f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual void SetError(int error);
54f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual ConnState GetState() const;
550c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  virtual int EstimateMTU(uint16_t* mtu);
56f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual int GetOption(Option opt, int* value);
57f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual int SetOption(Option opt, int value);
58f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
59f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
60f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void CreateSink();
61f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool SetAsync(int events);
62f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int DoConnect(const SocketAddress& addr);
63f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool HandleClosed(int close_error);
64f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void PostClosed();
65f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void UpdateLastError();
66f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  static int TranslateOption(Option opt, int* slevel, int* sopt);
67f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
68f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void OnSocketNotify(SOCKET socket, int event, int error);
69f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void OnDnsNotify(HANDLE task, int error);
70f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
71f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SOCKET socket_;
72f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int error_;
73f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  ConnState state_;
74f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  SocketAddress addr_;         // address that we connected to (see DoConnect)
750c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström  uint32_t connect_time_;
76f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool closing_;
77f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  int close_error_;
78f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
79f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  class EventSink;
80f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  friend class EventSink;
81f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  EventSink * sink_;
82f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
83f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  struct DnsLookup;
84f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  DnsLookup * dns_;
85f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
86f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
87f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org///////////////////////////////////////////////////////////////////////////////
88f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Win32SocketServer
89f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org///////////////////////////////////////////////////////////////////////////////
90f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
91f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Win32SocketServer : public SocketServer {
92f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
93f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  explicit Win32SocketServer(MessageQueue* message_queue);
94f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual ~Win32SocketServer();
95f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
96f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void set_modeless_dialog(HWND hdlg) {
97f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    hdlg_ = hdlg;
98f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
99f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
100f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  // SocketServer Interface
101f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual Socket* CreateSocket(int type);
102f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual Socket* CreateSocket(int family, int type);
103f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
104f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual AsyncSocket* CreateAsyncSocket(int type);
105f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual AsyncSocket* CreateAsyncSocket(int family, int type);
106f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
107f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual void SetMessageQueue(MessageQueue* queue);
108f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual bool Wait(int cms, bool process_io);
109f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual void WakeUp();
110f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
111f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  void Pump();
112f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
113f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HWND handle() { return wnd_.handle(); }
114f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
115f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
116f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  class MessageWindow : public Win32Window {
117f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org   public:
118f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    explicit MessageWindow(Win32SocketServer* ss) : ss_(ss) {}
119f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org   private:
120f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    virtual bool OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT& result);
121f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Win32SocketServer* ss_;
122f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  };
123f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
124f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  static const TCHAR kWindowName[];
125f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MessageQueue *message_queue_;
126f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  MessageWindow wnd_;
127f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  CriticalSection cs_;
128f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  bool posted_;
129f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  HWND hdlg_;
130f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
131f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
132f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org///////////////////////////////////////////////////////////////////////////////
133f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org// Win32Thread. Automatically pumps Windows messages.
134f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org///////////////////////////////////////////////////////////////////////////////
135f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
136f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.orgclass Win32Thread : public Thread {
137f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org public:
138f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Win32Thread() : ss_(this), id_(0) {
139f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    set_socketserver(&ss_);
140f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
141f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual ~Win32Thread() {
142f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Stop();
143f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    set_socketserver(NULL);
144f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
145f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual void Run() {
146f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    id_ = GetCurrentThreadId();
147f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    Thread::Run();
148f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    id_ = 0;
149f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
150f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  virtual void Quit() {
151f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org    PostThreadMessage(id_, WM_QUIT, 0, 0);
152f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  }
153f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org private:
154f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  Win32SocketServer ss_;
155f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org  DWORD id_;
156f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org};
157f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
158f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org///////////////////////////////////////////////////////////////////////////////
159f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
160f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org}  // namespace rtc
161f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
162f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif  // WEBRTC_WIN
163f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org
164f048872e915a3ee229044ec4bc541f6cbf9e4de1henrike@webrtc.org#endif  // WEBRTC_BASE_WIN32SOCKETSERVER_H_
165