/* * Copyright 2007 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef WEBRTC_BASE_MACSOCKETSERVER_H__ #define WEBRTC_BASE_MACSOCKETSERVER_H__ #include #if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) // Invalid on IOS #include #endif #include "webrtc/base/physicalsocketserver.h" namespace rtc { /////////////////////////////////////////////////////////////////////////////// // MacBaseSocketServer /////////////////////////////////////////////////////////////////////////////// class MacAsyncSocket; class MacBaseSocketServer : public PhysicalSocketServer { public: MacBaseSocketServer(); ~MacBaseSocketServer() override; // SocketServer Interface Socket* CreateSocket(int type) override; Socket* CreateSocket(int family, int type) override; AsyncSocket* CreateAsyncSocket(int type) override; AsyncSocket* CreateAsyncSocket(int family, int type) override; bool Wait(int cms, bool process_io) override = 0; void WakeUp() override = 0; void RegisterSocket(MacAsyncSocket* socket); void UnregisterSocket(MacAsyncSocket* socket); // PhysicalSocketServer Overrides bool SetPosixSignalHandler(int signum, void (*handler)(int)) override; protected: void EnableSocketCallbacks(bool enable); const std::set& sockets() { return sockets_; } private: static void FileDescriptorCallback(CFFileDescriptorRef ref, CFOptionFlags flags, void* context); std::set sockets_; }; // Core Foundation implementation of the socket server. While idle it // will run the current CF run loop. When the socket server has work // to do the run loop will be paused. Does not support Carbon or Cocoa // UI interaction. class MacCFSocketServer : public MacBaseSocketServer { public: MacCFSocketServer(); ~MacCFSocketServer() override; // SocketServer Interface bool Wait(int cms, bool process_io) override; void WakeUp() override; void OnWakeUpCallback(); private: CFRunLoopRef run_loop_; CFRunLoopSourceRef wake_up_; }; #ifndef CARBON_DEPRECATED /////////////////////////////////////////////////////////////////////////////// // MacCarbonSocketServer /////////////////////////////////////////////////////////////////////////////// // Interacts with the Carbon event queue. While idle it will block, // waiting for events. When the socket server has work to do, it will // post a 'wake up' event to the queue, causing the thread to exit the // event loop until the next call to Wait. Other events are dispatched // to their target. Supports Carbon and Cocoa UI interaction. class MacCarbonSocketServer : public MacBaseSocketServer { public: MacCarbonSocketServer(); virtual ~MacCarbonSocketServer(); // SocketServer Interface virtual bool Wait(int cms, bool process_io); virtual void WakeUp(); private: EventQueueRef event_queue_; EventRef wake_up_; }; /////////////////////////////////////////////////////////////////////////////// // MacCarbonAppSocketServer /////////////////////////////////////////////////////////////////////////////// // Runs the Carbon application event loop on the current thread while // idle. When the socket server has work to do, it will post an event // to the queue, causing the thread to exit the event loop until the // next call to Wait. Other events are automatically dispatched to // their target. class MacCarbonAppSocketServer : public MacBaseSocketServer { public: MacCarbonAppSocketServer(); virtual ~MacCarbonAppSocketServer(); // SocketServer Interface virtual bool Wait(int cms, bool process_io); virtual void WakeUp(); private: static OSStatus WakeUpEventHandler(EventHandlerCallRef next, EventRef event, void *data); static void TimerHandler(EventLoopTimerRef timer, void *data); EventQueueRef event_queue_; EventHandlerRef event_handler_; EventLoopTimerRef timer_; }; #endif } // namespace rtc #endif // WEBRTC_BASE_MACSOCKETSERVER_H__