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