blob: ce29bc500316b160a7caf1d23df527fbc53432bb [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef RTC_BASE_WIN32SOCKETSERVER_H_
12#define RTC_BASE_WIN32SOCKETSERVER_H_
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000013
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020014#if defined(WEBRTC_WIN)
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "rtc_base/asyncsocket.h"
16#include "rtc_base/criticalsection.h"
17#include "rtc_base/messagequeue.h"
18#include "rtc_base/socket.h"
19#include "rtc_base/socketfactory.h"
20#include "rtc_base/socketserver.h"
21#include "rtc_base/thread.h"
22#include "rtc_base/win32window.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000023
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020024namespace rtc {
25
26///////////////////////////////////////////////////////////////////////////////
27// Win32Socket
28///////////////////////////////////////////////////////////////////////////////
29
30class Win32Socket : public AsyncSocket {
31 public:
32 Win32Socket();
Steve Anton9de3aac2017-10-24 10:08:26 -070033 ~Win32Socket() override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020034
35 bool CreateT(int family, int type);
36
37 int Attach(SOCKET s);
38 void SetTimeout(int ms);
39
40 // AsyncSocket Interface
Steve Anton9de3aac2017-10-24 10:08:26 -070041 SocketAddress GetLocalAddress() const override;
42 SocketAddress GetRemoteAddress() const override;
43 int Bind(const SocketAddress& addr) override;
44 int Connect(const SocketAddress& addr) override;
45 int Send(const void* buffer, size_t length) override;
46 int SendTo(const void* buffer,
47 size_t length,
48 const SocketAddress& addr) override;
49 int Recv(void* buffer, size_t length, int64_t* timestamp) override;
50 int RecvFrom(void* buffer,
51 size_t length,
52 SocketAddress* out_addr,
53 int64_t* timestamp) override;
54 int Listen(int backlog) override;
55 Win32Socket* Accept(SocketAddress* out_addr) override;
56 int Close() override;
57 int GetError() const override;
58 void SetError(int error) override;
59 ConnState GetState() const override;
60 int GetOption(Option opt, int* value) override;
61 int SetOption(Option opt, int value) override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020062
63 private:
64 void CreateSink();
65 bool SetAsync(int events);
66 int DoConnect(const SocketAddress& addr);
67 bool HandleClosed(int close_error);
68 void PostClosed();
69 void UpdateLastError();
70 static int TranslateOption(Option opt, int* slevel, int* sopt);
71
72 void OnSocketNotify(SOCKET socket, int event, int error);
73 void OnDnsNotify(HANDLE task, int error);
74
75 SOCKET socket_;
76 int error_;
77 ConnState state_;
78 SocketAddress addr_; // address that we connected to (see DoConnect)
79 uint32_t connect_time_;
80 bool closing_;
81 int close_error_;
82
83 class EventSink;
84 friend class EventSink;
85 EventSink * sink_;
86
87 struct DnsLookup;
88 DnsLookup * dns_;
89};
90
91///////////////////////////////////////////////////////////////////////////////
92// Win32SocketServer
93///////////////////////////////////////////////////////////////////////////////
94
95class Win32SocketServer : public SocketServer {
96 public:
97 Win32SocketServer();
Steve Anton9de3aac2017-10-24 10:08:26 -070098 ~Win32SocketServer() override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020099
100 void set_modeless_dialog(HWND hdlg) {
101 hdlg_ = hdlg;
102 }
103
104 // SocketServer Interface
Steve Anton9de3aac2017-10-24 10:08:26 -0700105 Socket* CreateSocket(int type) override;
106 Socket* CreateSocket(int family, int type) override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200107
Steve Anton9de3aac2017-10-24 10:08:26 -0700108 AsyncSocket* CreateAsyncSocket(int type) override;
109 AsyncSocket* CreateAsyncSocket(int family, int type) override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200110
Steve Anton9de3aac2017-10-24 10:08:26 -0700111 void SetMessageQueue(MessageQueue* queue) override;
112 bool Wait(int cms, bool process_io) override;
113 void WakeUp() override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200114
115 void Pump();
116
117 HWND handle() { return wnd_.handle(); }
118
119 private:
120 class MessageWindow : public Win32Window {
121 public:
122 explicit MessageWindow(Win32SocketServer* ss) : ss_(ss) {}
123 private:
Steve Anton9de3aac2017-10-24 10:08:26 -0700124 bool OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT& result) override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200125 Win32SocketServer* ss_;
126 };
127
128 static const TCHAR kWindowName[];
129 MessageQueue *message_queue_;
130 MessageWindow wnd_;
131 CriticalSection cs_;
132 bool posted_;
133 HWND hdlg_;
134};
135
136///////////////////////////////////////////////////////////////////////////////
137// Win32Thread. Automatically pumps Windows messages.
138///////////////////////////////////////////////////////////////////////////////
139
140class Win32Thread : public Thread {
141 public:
Steve Anton9de3aac2017-10-24 10:08:26 -0700142 explicit Win32Thread(SocketServer* ss);
143 ~Win32Thread() override;
144
145 void Run() override;
146 void Quit() override;
147
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200148 private:
149 DWORD id_;
150};
151
152///////////////////////////////////////////////////////////////////////////////
153
154} // namespace rtc
155
156#endif // WEBRTC_WIN
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000157
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200158#endif // RTC_BASE_WIN32SOCKETSERVER_H_