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 EXTENSIONS_BROWSER_API_SOCKET_UDP_SOCKET_H_
6#define EXTENSIONS_BROWSER_API_SOCKET_UDP_SOCKET_H_
7
8#include <string>
9#include <vector>
10
11#include "extensions/browser/api/socket/socket.h"
12#include "net/udp/udp_socket.h"
13
14namespace extensions {
15
16class UDPSocket : public Socket {
17 public:
18  explicit UDPSocket(const std::string& owner_extension_id);
19  virtual ~UDPSocket();
20
21  virtual void Connect(const std::string& address,
22                       int port,
23                       const CompletionCallback& callback) OVERRIDE;
24  virtual void Disconnect() OVERRIDE;
25  virtual int Bind(const std::string& address, int port) OVERRIDE;
26  virtual void Read(int count, const ReadCompletionCallback& callback) OVERRIDE;
27  virtual void RecvFrom(int count,
28                        const RecvFromCompletionCallback& callback) OVERRIDE;
29  virtual void SendTo(scoped_refptr<net::IOBuffer> io_buffer,
30                      int byte_count,
31                      const std::string& address,
32                      int port,
33                      const CompletionCallback& callback) OVERRIDE;
34
35  virtual bool IsConnected() OVERRIDE;
36
37  virtual bool GetPeerAddress(net::IPEndPoint* address) OVERRIDE;
38  virtual bool GetLocalAddress(net::IPEndPoint* address) OVERRIDE;
39  virtual Socket::SocketType GetSocketType() const OVERRIDE;
40
41  bool IsBound();
42
43  int JoinGroup(const std::string& address);
44  int LeaveGroup(const std::string& address);
45
46  int SetMulticastTimeToLive(int ttl);
47  int SetMulticastLoopbackMode(bool loopback);
48
49  const std::vector<std::string>& GetJoinedGroups() const;
50
51 protected:
52  virtual int WriteImpl(net::IOBuffer* io_buffer,
53                        int io_buffer_size,
54                        const net::CompletionCallback& callback) OVERRIDE;
55
56 private:
57  // Make net::IPEndPoint can be refcounted
58  typedef base::RefCountedData<net::IPEndPoint> IPEndPoint;
59
60  void OnReadComplete(scoped_refptr<net::IOBuffer> io_buffer, int result);
61  void OnRecvFromComplete(scoped_refptr<net::IOBuffer> io_buffer,
62                          scoped_refptr<IPEndPoint> address,
63                          int result);
64  void OnSendToComplete(int result);
65
66  net::UDPSocket socket_;
67
68  ReadCompletionCallback read_callback_;
69
70  RecvFromCompletionCallback recv_from_callback_;
71
72  CompletionCallback send_to_callback_;
73
74  std::vector<std::string> multicast_groups_;
75};
76
77// UDP Socket instances from the "sockets.udp" namespace. These are regular
78// socket objects with additional properties related to the behavior defined in
79// the "sockets.udp" namespace.
80class ResumableUDPSocket : public UDPSocket {
81 public:
82  explicit ResumableUDPSocket(const std::string& owner_extension_id);
83
84  // Overriden from ApiResource
85  virtual bool IsPersistent() const OVERRIDE;
86
87  const std::string& name() const { return name_; }
88  void set_name(const std::string& name) { name_ = name; }
89
90  bool persistent() const { return persistent_; }
91  void set_persistent(bool persistent) { persistent_ = persistent; }
92
93  int buffer_size() const { return buffer_size_; }
94  void set_buffer_size(int buffer_size) { buffer_size_ = buffer_size; }
95
96  bool paused() const { return paused_; }
97  void set_paused(bool paused) { paused_ = paused; }
98
99 private:
100  friend class ApiResourceManager<ResumableUDPSocket>;
101  static const char* service_name() { return "ResumableUDPSocketManager"; }
102
103  // Application-defined string - see sockets_udp.idl.
104  std::string name_;
105  // Flag indicating whether the socket is left open when the application is
106  // suspended - see sockets_udp.idl.
107  bool persistent_;
108  // The size of the buffer used to receive data - see sockets_udp.idl.
109  int buffer_size_;
110  // Flag indicating whether a connected socket blocks its peer from sending
111  // more data - see sockets_udp.idl.
112  bool paused_;
113};
114
115}  //  namespace extensions
116
117#endif  // EXTENSIONS_BROWSER_API_SOCKET_UDP_SOCKET_H_
118