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