blob: 6f89baaf5d565c8f04058fa58fd80454735a065f [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 family, int type) override;
Steve Anton9de3aac2017-10-24 10:08:26 -0700106 AsyncSocket* CreateAsyncSocket(int family, int type) override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200107
Steve Anton9de3aac2017-10-24 10:08:26 -0700108 void SetMessageQueue(MessageQueue* queue) override;
109 bool Wait(int cms, bool process_io) override;
110 void WakeUp() override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200111
112 void Pump();
113
114 HWND handle() { return wnd_.handle(); }
115
116 private:
117 class MessageWindow : public Win32Window {
118 public:
119 explicit MessageWindow(Win32SocketServer* ss) : ss_(ss) {}
120 private:
Steve Anton9de3aac2017-10-24 10:08:26 -0700121 bool OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT& result) override;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200122 Win32SocketServer* ss_;
123 };
124
125 static const TCHAR kWindowName[];
126 MessageQueue *message_queue_;
127 MessageWindow wnd_;
128 CriticalSection cs_;
129 bool posted_;
130 HWND hdlg_;
131};
132
133///////////////////////////////////////////////////////////////////////////////
134// Win32Thread. Automatically pumps Windows messages.
135///////////////////////////////////////////////////////////////////////////////
136
137class Win32Thread : public Thread {
138 public:
Steve Anton9de3aac2017-10-24 10:08:26 -0700139 explicit Win32Thread(SocketServer* ss);
140 ~Win32Thread() override;
141
142 void Run() override;
143 void Quit() override;
144
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200145 private:
146 DWORD id_;
147};
148
149///////////////////////////////////////////////////////////////////////////////
150
151} // namespace rtc
152
153#endif // WEBRTC_WIN
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000154
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200155#endif // RTC_BASE_WIN32SOCKETSERVER_H_