|  | /* | 
|  | *  Copyright 2008 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. | 
|  | */ | 
|  | // MacAsyncSocket is a kind of AsyncSocket. It only creates sockets | 
|  | // of the TCP type, and does not (yet) support listen and accept. It works | 
|  | // asynchronously, which means that users of this socket should connect to | 
|  | // the various events declared in asyncsocket.h to receive notifications about | 
|  | // this socket. | 
|  |  | 
|  | #ifndef WEBRTC_BASE_MACASYNCSOCKET_H__ | 
|  | #define WEBRTC_BASE_MACASYNCSOCKET_H__ | 
|  |  | 
|  | #include <CoreFoundation/CoreFoundation.h> | 
|  |  | 
|  | #include "webrtc/base/asyncsocket.h" | 
|  | #include "webrtc/base/nethelpers.h" | 
|  |  | 
|  | namespace rtc { | 
|  |  | 
|  | class MacBaseSocketServer; | 
|  |  | 
|  | class MacAsyncSocket : public AsyncSocket, public sigslot::has_slots<> { | 
|  | public: | 
|  | MacAsyncSocket(MacBaseSocketServer* ss, int family); | 
|  | virtual ~MacAsyncSocket(); | 
|  |  | 
|  | bool valid() const { return source_ != NULL; } | 
|  |  | 
|  | // Socket interface | 
|  | virtual SocketAddress GetLocalAddress() const; | 
|  | virtual SocketAddress GetRemoteAddress() const; | 
|  | virtual int Bind(const SocketAddress& addr); | 
|  | virtual int Connect(const SocketAddress& addr); | 
|  | virtual int Send(const void* buffer, size_t length); | 
|  | virtual int SendTo(const void* buffer, size_t length, | 
|  | const SocketAddress& addr); | 
|  | virtual int Recv(void* buffer, size_t length); | 
|  | virtual int RecvFrom(void* buffer, size_t length, SocketAddress* out_addr); | 
|  | virtual int Listen(int backlog); | 
|  | virtual MacAsyncSocket* Accept(SocketAddress* out_addr); | 
|  | virtual int Close(); | 
|  | virtual int GetError() const; | 
|  | virtual void SetError(int error); | 
|  | virtual ConnState GetState() const; | 
|  | virtual int EstimateMTU(uint16* mtu); | 
|  | virtual int GetOption(Option opt, int* value); | 
|  | virtual int SetOption(Option opt, int value); | 
|  |  | 
|  | // For the MacBaseSocketServer to disable callbacks when process_io is false. | 
|  | void EnableCallbacks(); | 
|  | void DisableCallbacks(); | 
|  |  | 
|  | protected: | 
|  | void OnResolveResult(SignalThread* thread); | 
|  | int DoConnect(const SocketAddress& addr); | 
|  |  | 
|  | private: | 
|  | // Creates an async socket from an existing bsd socket | 
|  | MacAsyncSocket(MacBaseSocketServer* ss, int family, int native_socket); | 
|  |  | 
|  | // Attaches the socket to the CFRunloop and sets the wrapped bsd socket | 
|  | // to async mode | 
|  | void Initialize(int family); | 
|  |  | 
|  | // Translate the SocketAddress into a CFDataRef to pass to CF socket | 
|  | // functions. Caller must call CFRelease on the result when done. | 
|  | static CFDataRef CopyCFAddress(const SocketAddress& address); | 
|  |  | 
|  | // Callback for the underlying CFSocketRef. | 
|  | static void MacAsyncSocketCallBack(CFSocketRef s, | 
|  | CFSocketCallBackType callbackType, | 
|  | CFDataRef address, | 
|  | const void* data, | 
|  | void* info); | 
|  |  | 
|  | MacBaseSocketServer* ss_; | 
|  | CFSocketRef socket_; | 
|  | int native_socket_; | 
|  | CFRunLoopSourceRef source_; | 
|  | int current_callbacks_; | 
|  | bool disabled_; | 
|  | int error_; | 
|  | ConnState state_; | 
|  | AsyncResolver* resolver_; | 
|  |  | 
|  | DISALLOW_EVIL_CONSTRUCTORS(MacAsyncSocket); | 
|  | }; | 
|  |  | 
|  | }  // namespace rtc | 
|  |  | 
|  | #endif  // WEBRTC_BASE_MACASYNCSOCKET_H__ |