1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef NET_SOCKET_UNIX_DOMAIN_CLIENT_SOCKET_POSIX_H_
6#define NET_SOCKET_UNIX_DOMAIN_CLIENT_SOCKET_POSIX_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/macros.h"
12#include "base/memory/scoped_ptr.h"
13#include "net/base/completion_callback.h"
14#include "net/base/net_export.h"
15#include "net/base/net_log.h"
16#include "net/socket/socket_descriptor.h"
17#include "net/socket/stream_socket.h"
18
19namespace net {
20
21class SocketLibevent;
22struct SockaddrStorage;
23
24// A client socket that uses unix domain socket as the transport layer.
25class NET_EXPORT UnixDomainClientSocket : public StreamSocket {
26 public:
27  // Builds a client socket with |socket_path|. The caller should call Connect()
28  // to connect to a server socket.
29  UnixDomainClientSocket(const std::string& socket_path,
30                         bool use_abstract_namespace);
31  // Builds a client socket with socket libevent which is already connected.
32  // UnixDomainServerSocket uses this after it accepts a connection.
33  explicit UnixDomainClientSocket(scoped_ptr<SocketLibevent> socket);
34
35  virtual ~UnixDomainClientSocket();
36
37  // Fills |address| with |socket_path| and its length. For Android or Linux
38  // platform, this supports abstract namespaces.
39  static bool FillAddress(const std::string& socket_path,
40                          bool use_abstract_namespace,
41                          SockaddrStorage* address);
42
43  // StreamSocket implementation.
44  virtual int Connect(const CompletionCallback& callback) OVERRIDE;
45  virtual void Disconnect() OVERRIDE;
46  virtual bool IsConnected() const OVERRIDE;
47  virtual bool IsConnectedAndIdle() const OVERRIDE;
48  virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE;
49  virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE;
50  virtual const BoundNetLog& NetLog() const OVERRIDE;
51  virtual void SetSubresourceSpeculation() OVERRIDE;
52  virtual void SetOmniboxSpeculation() OVERRIDE;
53  virtual bool WasEverUsed() const OVERRIDE;
54  virtual bool UsingTCPFastOpen() const OVERRIDE;
55  virtual bool WasNpnNegotiated() const OVERRIDE;
56  virtual NextProto GetNegotiatedProtocol() const OVERRIDE;
57  virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE;
58
59  // Socket implementation.
60  virtual int Read(IOBuffer* buf, int buf_len,
61                   const CompletionCallback& callback) OVERRIDE;
62  virtual int Write(IOBuffer* buf, int buf_len,
63                    const CompletionCallback& callback) OVERRIDE;
64  virtual int SetReceiveBufferSize(int32 size) OVERRIDE;
65  virtual int SetSendBufferSize(int32 size) OVERRIDE;
66
67  // Releases ownership of underlying SocketDescriptor to caller.
68  // Internal state is reset so that this object can be used again.
69  // Socket must be connected in order to release it.
70  SocketDescriptor ReleaseConnectedSocket();
71
72 private:
73  const std::string socket_path_;
74  const bool use_abstract_namespace_;
75  scoped_ptr<SocketLibevent> socket_;
76  // This net log is just to comply StreamSocket::NetLog(). It throws away
77  // everything.
78  BoundNetLog net_log_;
79
80  DISALLOW_COPY_AND_ASSIGN(UnixDomainClientSocket);
81};
82
83}  // namespace net
84
85#endif  // NET_SOCKET_UNIX_DOMAIN_CLIENT_SOCKET_POSIX_H_
86