1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_UDP_SOCKET_MESSAGE_FILTER_H_
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_UDP_SOCKET_MESSAGE_FILTER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/content_export.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/process_type.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/completion_callback.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/ip_endpoint.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_instance.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_stdint.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/ppb_udp_socket.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/resource_message_filter.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct PP_NetAddress_Private;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IOBuffer;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IOBufferWithSize;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class UDPServerSocket;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi {
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SocketOptionData;
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace host {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct ReplyMessageContext;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BrowserPpapiHostImpl;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct SocketPermissionRequest;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass CONTENT_EXPORT PepperUDPSocketMessageFilter
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public ppapi::host::ResourceMessageFilter {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PepperUDPSocketMessageFilter(BrowserPpapiHostImpl* host,
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               PP_Instance instance,
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               bool private_api);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  static size_t GetNumInstances();
542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~PepperUDPSocketMessageFilter();
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ppapi::host::ResourceMessageFilter overrides.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_refptr<base::TaskRunner> OverrideTaskRunnerForMessage(
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const IPC::Message& message) OVERRIDE;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int32_t OnResourceMessageReceived(
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const IPC::Message& msg,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ppapi::host::HostMessageContext* context) OVERRIDE;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int32_t OnMsgSetOption(const ppapi::host::HostMessageContext* context,
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         PP_UDPSocket_Option name,
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         const ppapi::SocketOptionData& value);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t OnMsgBind(const ppapi::host::HostMessageContext* context,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    const PP_NetAddress_Private& addr);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t OnMsgSendTo(const ppapi::host::HostMessageContext* context,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const std::string& data,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const PP_NetAddress_Private& addr);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t OnMsgClose(const ppapi::host::HostMessageContext* context);
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int32_t OnMsgRecvSlotAvailable(
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const ppapi::host::HostMessageContext* context);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoBind(const ppapi::host::ReplyMessageContext& context,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              const PP_NetAddress_Private& addr);
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void DoRecvFrom();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoSendTo(const ppapi::host::ReplyMessageContext& context,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                const std::string& data,
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                const PP_NetAddress_Private& addr);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Close();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnRecvFromCompleted(int net_result);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnSendToCompleted(const ppapi::host::ReplyMessageContext& context,
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         int net_result);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendBindReply(const ppapi::host::ReplyMessageContext& context,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     int32_t result,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     const PP_NetAddress_Private& addr);
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SendRecvFromResult(int32_t result,
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          const std::string& data,
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          const PP_NetAddress_Private& addr);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendSendToReply(const ppapi::host::ReplyMessageContext& context,
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       int32_t result,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       int32_t bytes_written);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendBindError(const ppapi::host::ReplyMessageContext& context,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     int32_t result);
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SendRecvFromError(int32_t result);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendSendToError(const ppapi::host::ReplyMessageContext& context,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       int32_t result);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool allow_address_reuse_;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool allow_broadcast_;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<net::UDPServerSocket> socket_;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool closed_;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<net::IOBuffer> recvfrom_buffer_;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<net::IOBufferWithSize> sendto_buffer_;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::IPEndPoint recvfrom_address_;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t remaining_recv_slots_;
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool external_plugin_;
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool private_api_;
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int render_process_id_;
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int render_frame_id_;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(PepperUDPSocketMessageFilter);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // CONTENT_BROWSER_RENDERER_HOST_PEPPER_PEPPER_UDP_SOCKET_MESSAGE_FILTER_H_
131