Home | History | Annotate | Download | only in base
      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);
     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