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