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