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_PHYSICALSOCKETSERVER_H__
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_PHYSICALSOCKETSERVER_H__
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <vector>
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/asyncfile.h"
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/scoped_ptr.h"
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socketserver.h"
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/criticalsection.h"
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX)
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef int SOCKET;
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_POSIX
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Event constants for the Dispatcher class.
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgenum DispatcherEvent {
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DE_READ    = 0x0001,
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DE_WRITE   = 0x0002,
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DE_CONNECT = 0x0004,
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DE_CLOSE   = 0x0008,
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DE_ACCEPT  = 0x0010,
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Signaler;
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX)
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass PosixSignalDispatcher;
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Dispatcher {
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual ~Dispatcher() {}
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual uint32 GetRequestedEvents() = 0;
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual void OnPreEvent(uint32 ff) = 0;
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual void OnEvent(uint32 ff, int err) = 0;
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN)
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual WSAEVENT GetWSAEvent() = 0;
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual SOCKET GetSocket() = 0;
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual bool CheckSignalClose() = 0;
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#elif defined(WEBRTC_POSIX)
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual int GetDescriptor() = 0;
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual bool IsDescriptorClosed() = 0;
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// A socket server that provides the real sockets of the underlying OS.
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass PhysicalSocketServer : public SocketServer {
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  PhysicalSocketServer();
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual ~PhysicalSocketServer();
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // SocketFactory:
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual Socket* CreateSocket(int type);
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual Socket* CreateSocket(int family, int type);
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual AsyncSocket* CreateAsyncSocket(int type);
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual AsyncSocket* CreateAsyncSocket(int family, int type);
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Internal Factory for Accept
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  AsyncSocket* WrapSocket(SOCKET s);
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // SocketServer:
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual bool Wait(int cms, bool process_io);
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual void WakeUp();
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  void Add(Dispatcher* dispatcher);
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  void Remove(Dispatcher* dispatcher);
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX)
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  AsyncFile* CreateFile(int fd);
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Sets the function to be executed in response to the specified POSIX signal.
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // The function is executed from inside Wait() using the "self-pipe trick"--
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // regardless of which thread receives the signal--and hence can safely
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // manipulate user-level data structures.
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // "handler" may be SIG_IGN, SIG_DFL, or a user-specified function, just like
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // with signal(2).
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Only one PhysicalSocketServer should have user-level signal handlers.
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Dispatching signals on multiple PhysicalSocketServers is not reliable.
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // The signal mask is not modified. It is the caller's responsibily to
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // maintain it as desired.
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual bool SetPosixSignalHandler(int signum, void (*handler)(int));
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected:
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Dispatcher* signal_dispatcher();
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private:
10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  typedef std::vector<Dispatcher*> DispatcherList;
10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  typedef std::vector<size_t*> IteratorList;
10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX)
10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static bool InstallSignal(int signum, void (*handler)(int));
10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  scoped_ptr<PosixSignalDispatcher> signal_dispatcher_;
10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  DispatcherList dispatchers_;
10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IteratorList iterators_;
11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Signaler* signal_wakeup_;
11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  CriticalSection crit_;
11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool fWait_;
11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN)
11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  WSAEVENT socket_ev_;
11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc
11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_PHYSICALSOCKETSERVER_H__
121