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 
19 namespace rtc {
20 
21 ///////////////////////////////////////////////////////////////////////////////
22 // MacBaseSocketServer
23 ///////////////////////////////////////////////////////////////////////////////
24 class MacAsyncSocket;
25 
26 class 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);
sockets()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.
65 class 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.
91 class 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.
114 class 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