1 /*
2  *  Copyright 2008 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 // MacAsyncSocket is a kind of AsyncSocket. It only creates sockets
11 // of the TCP type, and does not (yet) support listen and accept. It works
12 // asynchronously, which means that users of this socket should connect to
13 // the various events declared in asyncsocket.h to receive notifications about
14 // this socket.
15 
16 #ifndef WEBRTC_BASE_MACASYNCSOCKET_H__
17 #define WEBRTC_BASE_MACASYNCSOCKET_H__
18 
19 #include <CoreFoundation/CoreFoundation.h>
20 
21 #include "webrtc/base/asyncsocket.h"
22 #include "webrtc/base/nethelpers.h"
23 
24 namespace rtc {
25 
26 class MacBaseSocketServer;
27 
28 class MacAsyncSocket : public AsyncSocket, public sigslot::has_slots<> {
29  public:
30   MacAsyncSocket(MacBaseSocketServer* ss, int family);
31   ~MacAsyncSocket() override;
32 
valid()33   bool valid() const { return source_ != NULL; }
34 
35   // Socket interface
36   SocketAddress GetLocalAddress() const override;
37   SocketAddress GetRemoteAddress() const override;
38   int Bind(const SocketAddress& addr) override;
39   int Connect(const SocketAddress& addr) override;
40   int Send(const void* buffer, size_t length) override;
41   int SendTo(const void* buffer,
42              size_t length,
43              const SocketAddress& addr) override;
44   int Recv(void* buffer, size_t length) override;
45   int RecvFrom(void* buffer, size_t length, SocketAddress* out_addr) override;
46   int Listen(int backlog) override;
47   MacAsyncSocket* Accept(SocketAddress* out_addr) override;
48   int Close() override;
49   int GetError() const override;
50   void SetError(int error) override;
51   ConnState GetState() const override;
52   int EstimateMTU(uint16_t* mtu) override;
53   int GetOption(Option opt, int* value) override;
54   int SetOption(Option opt, int value) override;
55 
56   // For the MacBaseSocketServer to disable callbacks when process_io is false.
57   void EnableCallbacks();
58   void DisableCallbacks();
59 
60  protected:
61   void OnResolveResult(SignalThread* thread);
62   int DoConnect(const SocketAddress& addr);
63 
64  private:
65   // Creates an async socket from an existing bsd socket
66   MacAsyncSocket(MacBaseSocketServer* ss, int family, int native_socket);
67 
68    // Attaches the socket to the CFRunloop and sets the wrapped bsd socket
69   // to async mode
70   void Initialize(int family);
71 
72   // Translate the SocketAddress into a CFDataRef to pass to CF socket
73   // functions. Caller must call CFRelease on the result when done.
74   static CFDataRef CopyCFAddress(const SocketAddress& address);
75 
76   // Callback for the underlying CFSocketRef.
77   static void MacAsyncSocketCallBack(CFSocketRef s,
78                                      CFSocketCallBackType callbackType,
79                                      CFDataRef address,
80                                      const void* data,
81                                      void* info);
82 
83   MacBaseSocketServer* ss_;
84   CFSocketRef socket_;
85   int native_socket_;
86   CFRunLoopSourceRef source_;
87   int current_callbacks_;
88   bool disabled_;
89   int error_;
90   ConnState state_;
91   AsyncResolver* resolver_;
92 
93   RTC_DISALLOW_COPY_AND_ASSIGN(MacAsyncSocket);
94 };
95 
96 }  // namespace rtc
97 
98 #endif  // WEBRTC_BASE_MACASYNCSOCKET_H__
99