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
24namespace rtc {
25
26class MacBaseSocketServer;
27
28class MacAsyncSocket : public AsyncSocket, public sigslot::has_slots<> {
29 public:
30  MacAsyncSocket(MacBaseSocketServer* ss, int family);
31  virtual ~MacAsyncSocket();
32
33  bool valid() const { return source_ != NULL; }
34
35  // Socket interface
36  virtual SocketAddress GetLocalAddress() const;
37  virtual SocketAddress GetRemoteAddress() const;
38  virtual int Bind(const SocketAddress& addr);
39  virtual int Connect(const SocketAddress& addr);
40  virtual int Send(const void* buffer, size_t length);
41  virtual int SendTo(const void* buffer, size_t length,
42                     const SocketAddress& addr);
43  virtual int Recv(void* buffer, size_t length);
44  virtual int RecvFrom(void* buffer, size_t length, SocketAddress* out_addr);
45  virtual int Listen(int backlog);
46  virtual MacAsyncSocket* Accept(SocketAddress* out_addr);
47  virtual int Close();
48  virtual int GetError() const;
49  virtual void SetError(int error);
50  virtual ConnState GetState() const;
51  virtual int EstimateMTU(uint16* mtu);
52  virtual int GetOption(Option opt, int* value);
53  virtual int SetOption(Option opt, int value);
54
55  // For the MacBaseSocketServer to disable callbacks when process_io is false.
56  void EnableCallbacks();
57  void DisableCallbacks();
58
59 protected:
60  void OnResolveResult(SignalThread* thread);
61  int DoConnect(const SocketAddress& addr);
62
63 private:
64  // Creates an async socket from an existing bsd socket
65  MacAsyncSocket(MacBaseSocketServer* ss, int family, int native_socket);
66
67   // Attaches the socket to the CFRunloop and sets the wrapped bsd socket
68  // to async mode
69  void Initialize(int family);
70
71  // Translate the SocketAddress into a CFDataRef to pass to CF socket
72  // functions. Caller must call CFRelease on the result when done.
73  static CFDataRef CopyCFAddress(const SocketAddress& address);
74
75  // Callback for the underlying CFSocketRef.
76  static void MacAsyncSocketCallBack(CFSocketRef s,
77                                     CFSocketCallBackType callbackType,
78                                     CFDataRef address,
79                                     const void* data,
80                                     void* info);
81
82  MacBaseSocketServer* ss_;
83  CFSocketRef socket_;
84  int native_socket_;
85  CFRunLoopSourceRef source_;
86  int current_callbacks_;
87  bool disabled_;
88  int error_;
89  ConnState state_;
90  AsyncResolver* resolver_;
91
92  DISALLOW_EVIL_CONSTRUCTORS(MacAsyncSocket);
93};
94
95}  // namespace rtc
96
97#endif  // WEBRTC_BASE_MACASYNCSOCKET_H__
98