1/*
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
11#ifndef WEBRTC_BASE_PHYSICALSOCKETSERVER_H__
12#define WEBRTC_BASE_PHYSICALSOCKETSERVER_H__
13
14#include <vector>
15
16#include "webrtc/base/asyncfile.h"
17#include "webrtc/base/scoped_ptr.h"
18#include "webrtc/base/socketserver.h"
19#include "webrtc/base/criticalsection.h"
20
21#if defined(WEBRTC_POSIX)
22typedef int SOCKET;
23#endif // WEBRTC_POSIX
24
25namespace rtc {
26
27// Event constants for the Dispatcher class.
28enum DispatcherEvent {
29  DE_READ    = 0x0001,
30  DE_WRITE   = 0x0002,
31  DE_CONNECT = 0x0004,
32  DE_CLOSE   = 0x0008,
33  DE_ACCEPT  = 0x0010,
34};
35
36class Signaler;
37#if defined(WEBRTC_POSIX)
38class PosixSignalDispatcher;
39#endif
40
41class Dispatcher {
42 public:
43  virtual ~Dispatcher() {}
44  virtual uint32 GetRequestedEvents() = 0;
45  virtual void OnPreEvent(uint32 ff) = 0;
46  virtual void OnEvent(uint32 ff, int err) = 0;
47#if defined(WEBRTC_WIN)
48  virtual WSAEVENT GetWSAEvent() = 0;
49  virtual SOCKET GetSocket() = 0;
50  virtual bool CheckSignalClose() = 0;
51#elif defined(WEBRTC_POSIX)
52  virtual int GetDescriptor() = 0;
53  virtual bool IsDescriptorClosed() = 0;
54#endif
55};
56
57// A socket server that provides the real sockets of the underlying OS.
58class PhysicalSocketServer : public SocketServer {
59 public:
60  PhysicalSocketServer();
61  virtual ~PhysicalSocketServer();
62
63  // SocketFactory:
64  virtual Socket* CreateSocket(int type);
65  virtual Socket* CreateSocket(int family, int type);
66
67  virtual AsyncSocket* CreateAsyncSocket(int type);
68  virtual AsyncSocket* CreateAsyncSocket(int family, int type);
69
70  // Internal Factory for Accept
71  AsyncSocket* WrapSocket(SOCKET s);
72
73  // SocketServer:
74  virtual bool Wait(int cms, bool process_io);
75  virtual void WakeUp();
76
77  void Add(Dispatcher* dispatcher);
78  void Remove(Dispatcher* dispatcher);
79
80#if defined(WEBRTC_POSIX)
81  AsyncFile* CreateFile(int fd);
82
83  // Sets the function to be executed in response to the specified POSIX signal.
84  // The function is executed from inside Wait() using the "self-pipe trick"--
85  // regardless of which thread receives the signal--and hence can safely
86  // manipulate user-level data structures.
87  // "handler" may be SIG_IGN, SIG_DFL, or a user-specified function, just like
88  // with signal(2).
89  // Only one PhysicalSocketServer should have user-level signal handlers.
90  // Dispatching signals on multiple PhysicalSocketServers is not reliable.
91  // The signal mask is not modified. It is the caller's responsibily to
92  // maintain it as desired.
93  virtual bool SetPosixSignalHandler(int signum, void (*handler)(int));
94
95 protected:
96  Dispatcher* signal_dispatcher();
97#endif
98
99 private:
100  typedef std::vector<Dispatcher*> DispatcherList;
101  typedef std::vector<size_t*> IteratorList;
102
103#if defined(WEBRTC_POSIX)
104  static bool InstallSignal(int signum, void (*handler)(int));
105
106  scoped_ptr<PosixSignalDispatcher> signal_dispatcher_;
107#endif
108  DispatcherList dispatchers_;
109  IteratorList iterators_;
110  Signaler* signal_wakeup_;
111  CriticalSection crit_;
112  bool fWait_;
113#if defined(WEBRTC_WIN)
114  WSAEVENT socket_ev_;
115#endif
116};
117
118} // namespace rtc
119
120#endif // WEBRTC_BASE_PHYSICALSOCKETSERVER_H__
121