1/*
2 *  Copyright 2007 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#ifndef WEBRTC_BASE_MACSOCKETSERVER_H__
11#define WEBRTC_BASE_MACSOCKETSERVER_H__
12
13#include <set>
14#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) // Invalid on IOS
15#include <Carbon/Carbon.h>
16#endif
17#include "webrtc/base/physicalsocketserver.h"
18
19namespace rtc {
20
21///////////////////////////////////////////////////////////////////////////////
22// MacBaseSocketServer
23///////////////////////////////////////////////////////////////////////////////
24class MacAsyncSocket;
25
26class MacBaseSocketServer : public PhysicalSocketServer {
27 public:
28  MacBaseSocketServer();
29  ~MacBaseSocketServer() override;
30
31  // SocketServer Interface
32  Socket* CreateSocket(int type) override;
33  Socket* CreateSocket(int family, int type) override;
34
35  AsyncSocket* CreateAsyncSocket(int type) override;
36  AsyncSocket* CreateAsyncSocket(int family, int type) override;
37
38  bool Wait(int cms, bool process_io) override = 0;
39  void WakeUp() override = 0;
40
41  void RegisterSocket(MacAsyncSocket* socket);
42  void UnregisterSocket(MacAsyncSocket* socket);
43
44  // PhysicalSocketServer Overrides
45  bool SetPosixSignalHandler(int signum, void (*handler)(int)) override;
46
47 protected:
48  void EnableSocketCallbacks(bool enable);
49  const std::set<MacAsyncSocket*>& sockets() {
50    return sockets_;
51  }
52
53 private:
54  static void FileDescriptorCallback(CFFileDescriptorRef ref,
55                                     CFOptionFlags flags,
56                                     void* context);
57
58  std::set<MacAsyncSocket*> sockets_;
59};
60
61// Core Foundation implementation of the socket server. While idle it
62// will run the current CF run loop. When the socket server has work
63// to do the run loop will be paused. Does not support Carbon or Cocoa
64// UI interaction.
65class MacCFSocketServer : public MacBaseSocketServer {
66 public:
67  MacCFSocketServer();
68  ~MacCFSocketServer() override;
69
70  // SocketServer Interface
71  bool Wait(int cms, bool process_io) override;
72  void WakeUp() override;
73  void OnWakeUpCallback();
74
75 private:
76  CFRunLoopRef run_loop_;
77  CFRunLoopSourceRef wake_up_;
78};
79
80#ifndef CARBON_DEPRECATED
81
82///////////////////////////////////////////////////////////////////////////////
83// MacCarbonSocketServer
84///////////////////////////////////////////////////////////////////////////////
85
86// Interacts with the Carbon event queue. While idle it will block,
87// waiting for events. When the socket server has work to do, it will
88// post a 'wake up' event to the queue, causing the thread to exit the
89// event loop until the next call to Wait. Other events are dispatched
90// to their target. Supports Carbon and Cocoa UI interaction.
91class MacCarbonSocketServer : public MacBaseSocketServer {
92 public:
93  MacCarbonSocketServer();
94  virtual ~MacCarbonSocketServer();
95
96  // SocketServer Interface
97  virtual bool Wait(int cms, bool process_io);
98  virtual void WakeUp();
99
100 private:
101  EventQueueRef event_queue_;
102  EventRef wake_up_;
103};
104
105///////////////////////////////////////////////////////////////////////////////
106// MacCarbonAppSocketServer
107///////////////////////////////////////////////////////////////////////////////
108
109// Runs the Carbon application event loop on the current thread while
110// idle. When the socket server has work to do, it will post an event
111// to the queue, causing the thread to exit the event loop until the
112// next call to Wait. Other events are automatically dispatched to
113// their target.
114class MacCarbonAppSocketServer : public MacBaseSocketServer {
115 public:
116  MacCarbonAppSocketServer();
117  virtual ~MacCarbonAppSocketServer();
118
119  // SocketServer Interface
120  virtual bool Wait(int cms, bool process_io);
121  virtual void WakeUp();
122
123 private:
124  static OSStatus WakeUpEventHandler(EventHandlerCallRef next, EventRef event,
125                                     void *data);
126  static void TimerHandler(EventLoopTimerRef timer, void *data);
127
128  EventQueueRef event_queue_;
129  EventHandlerRef event_handler_;
130  EventLoopTimerRef timer_;
131};
132
133#endif
134} // namespace rtc
135
136#endif  // WEBRTC_BASE_MACSOCKETSERVER_H__
137