147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_WIN32SOCKETSERVER_H_ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_WIN32SOCKETSERVER_H_ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/asyncsocket.h" 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/criticalsection.h" 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/messagequeue.h" 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socketserver.h" 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socketfactory.h" 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socket.h" 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/thread.h" 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/win32window.h" 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Win32Socket 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Win32Socket : public AsyncSocket { 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Win32Socket(); 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~Win32Socket(); 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool CreateT(int family, int type); 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int Attach(SOCKET s); 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void SetTimeout(int ms); 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // AsyncSocket Interface 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual SocketAddress GetLocalAddress() const; 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual SocketAddress GetRemoteAddress() const; 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Bind(const SocketAddress& addr); 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Connect(const SocketAddress& addr); 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Send(const void *buffer, size_t length); 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int SendTo(const void *buffer, size_t length, const SocketAddress& addr); 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Recv(void *buffer, size_t length); 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int RecvFrom(void *buffer, size_t length, SocketAddress *out_addr); 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Listen(int backlog); 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual Win32Socket *Accept(SocketAddress *out_addr); 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int Close(); 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int GetError() const; 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void SetError(int error); 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ConnState GetState() const; 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int EstimateMTU(uint16* mtu); 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int GetOption(Option opt, int* value); 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int SetOption(Option opt, int value); 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void CreateSink(); 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool SetAsync(int events); 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int DoConnect(const SocketAddress& addr); 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool HandleClosed(int close_error); 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void PostClosed(); 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void UpdateLastError(); 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static int TranslateOption(Option opt, int* slevel, int* sopt); 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnSocketNotify(SOCKET socket, int event, int error); 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnDnsNotify(HANDLE task, int error); 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SOCKET socket_; 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int error_; 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ConnState state_; 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SocketAddress addr_; // address that we connected to (see DoConnect) 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org uint32 connect_time_; 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool closing_; 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int close_error_; 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org class EventSink; 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org friend class EventSink; 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EventSink * sink_; 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org struct DnsLookup; 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DnsLookup * dns_; 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Win32SocketServer 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Win32SocketServer : public SocketServer { 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit Win32SocketServer(MessageQueue* message_queue); 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~Win32SocketServer(); 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void set_modeless_dialog(HWND hdlg) { 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org hdlg_ = hdlg; 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // SocketServer Interface 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual Socket* CreateSocket(int type); 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual Socket* CreateSocket(int family, int type); 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual AsyncSocket* CreateAsyncSocket(int type); 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual AsyncSocket* CreateAsyncSocket(int family, int type); 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void SetMessageQueue(MessageQueue* queue); 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool Wait(int cms, bool process_io); 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void WakeUp(); 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Pump(); 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org HWND handle() { return wnd_.handle(); } 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org class MessageWindow : public Win32Window { 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit MessageWindow(Win32SocketServer* ss) : ss_(ss) {} 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT& result); 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Win32SocketServer* ss_; 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org }; 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static const TCHAR kWindowName[]; 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org MessageQueue *message_queue_; 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org MessageWindow wnd_; 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org CriticalSection cs_; 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool posted_; 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org HWND hdlg_; 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Win32Thread. Automatically pumps Windows messages. 13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Win32Thread : public Thread { 13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Win32Thread() : ss_(this), id_(0) { 13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org set_socketserver(&ss_); 14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~Win32Thread() { 14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Stop(); 14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org set_socketserver(NULL); 14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void Run() { 14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org id_ = GetCurrentThreadId(); 14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Thread::Run(); 14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org id_ = 0; 14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void Quit() { 15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org PostThreadMessage(id_, WM_QUIT, 0, 0); 15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Win32SocketServer ss_; 15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DWORD id_; 15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/////////////////////////////////////////////////////////////////////////////// 15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_WIN 16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_WIN32SOCKETSERVER_H_ 165