1// Copyright 2013 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 CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_UDP_SOCKET_MESSAGE_FILTER_H_
6#define CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_UDP_SOCKET_MESSAGE_FILTER_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "base/callback.h"
12#include "base/compiler_specific.h"
13#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_ptr.h"
15#include "content/common/content_export.h"
16#include "content/public/common/process_type.h"
17#include "net/base/completion_callback.h"
18#include "net/base/ip_endpoint.h"
19#include "ppapi/c/pp_instance.h"
20#include "ppapi/c/pp_stdint.h"
21#include "ppapi/c/ppb_udp_socket.h"
22#include "ppapi/host/resource_message_filter.h"
23
24struct PP_NetAddress_Private;
25
26namespace net {
27class IOBuffer;
28class IOBufferWithSize;
29class UDPServerSocket;
30}
31
32namespace ppapi {
33
34class SocketOptionData;
35
36namespace host {
37struct ReplyMessageContext;
38}
39}
40
41namespace content {
42
43class BrowserPpapiHostImpl;
44struct SocketPermissionRequest;
45
46class CONTENT_EXPORT PepperUDPSocketMessageFilter
47    : public ppapi::host::ResourceMessageFilter {
48 public:
49  PepperUDPSocketMessageFilter(BrowserPpapiHostImpl* host,
50                               PP_Instance instance,
51                               bool private_api);
52
53  static size_t GetNumInstances();
54
55 protected:
56  virtual ~PepperUDPSocketMessageFilter();
57
58 private:
59  // ppapi::host::ResourceMessageFilter overrides.
60  virtual scoped_refptr<base::TaskRunner> OverrideTaskRunnerForMessage(
61      const IPC::Message& message) OVERRIDE;
62  virtual int32_t OnResourceMessageReceived(
63      const IPC::Message& msg,
64      ppapi::host::HostMessageContext* context) OVERRIDE;
65
66  int32_t OnMsgSetOption(const ppapi::host::HostMessageContext* context,
67                         PP_UDPSocket_Option name,
68                         const ppapi::SocketOptionData& value);
69  int32_t OnMsgBind(const ppapi::host::HostMessageContext* context,
70                    const PP_NetAddress_Private& addr);
71  int32_t OnMsgSendTo(const ppapi::host::HostMessageContext* context,
72                      const std::string& data,
73                      const PP_NetAddress_Private& addr);
74  int32_t OnMsgClose(const ppapi::host::HostMessageContext* context);
75  int32_t OnMsgRecvSlotAvailable(
76      const ppapi::host::HostMessageContext* context);
77
78  void DoBind(const ppapi::host::ReplyMessageContext& context,
79              const PP_NetAddress_Private& addr);
80  void DoRecvFrom();
81  void DoSendTo(const ppapi::host::ReplyMessageContext& context,
82                const std::string& data,
83                const PP_NetAddress_Private& addr);
84  void Close();
85
86  void OnRecvFromCompleted(int net_result);
87  void OnSendToCompleted(const ppapi::host::ReplyMessageContext& context,
88                         int net_result);
89
90  void SendBindReply(const ppapi::host::ReplyMessageContext& context,
91                     int32_t result,
92                     const PP_NetAddress_Private& addr);
93  void SendRecvFromResult(int32_t result,
94                          const std::string& data,
95                          const PP_NetAddress_Private& addr);
96  void SendSendToReply(const ppapi::host::ReplyMessageContext& context,
97                       int32_t result,
98                       int32_t bytes_written);
99
100  void SendBindError(const ppapi::host::ReplyMessageContext& context,
101                     int32_t result);
102  void SendRecvFromError(int32_t result);
103  void SendSendToError(const ppapi::host::ReplyMessageContext& context,
104                       int32_t result);
105
106  bool allow_address_reuse_;
107  bool allow_broadcast_;
108
109  scoped_ptr<net::UDPServerSocket> socket_;
110  bool closed_;
111
112  scoped_refptr<net::IOBuffer> recvfrom_buffer_;
113  scoped_refptr<net::IOBufferWithSize> sendto_buffer_;
114
115  net::IPEndPoint recvfrom_address_;
116
117  size_t remaining_recv_slots_;
118
119  bool external_plugin_;
120  bool private_api_;
121
122  int render_process_id_;
123  int render_frame_id_;
124
125  DISALLOW_COPY_AND_ASSIGN(PepperUDPSocketMessageFilter);
126};
127
128}  // namespace content
129
130#endif  // CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_UDP_SOCKET_MESSAGE_FILTER_H_
131