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 PPAPI_PROXY_UDP_SOCKET_RESOURCE_BASE_H_ 6 #define PPAPI_PROXY_UDP_SOCKET_RESOURCE_BASE_H_ 7 8 #include <queue> 9 #include <string> 10 11 #include "base/basictypes.h" 12 #include "base/compiler_specific.h" 13 #include "base/memory/ref_counted.h" 14 #include "ppapi/c/ppb_udp_socket.h" 15 #include "ppapi/c/private/ppb_net_address_private.h" 16 #include "ppapi/proxy/plugin_resource.h" 17 #include "ppapi/proxy/ppapi_proxy_export.h" 18 #include "ppapi/shared_impl/tracked_callback.h" 19 20 namespace ppapi { 21 namespace proxy { 22 23 class ResourceMessageReplyParams; 24 25 class PPAPI_PROXY_EXPORT UDPSocketResourceBase: public PluginResource { 26 public: 27 // The maximum number of bytes that each 28 // PpapiPluginMsg_PPBUDPSocket_PushRecvResult message is allowed to carry. 29 static const int32_t kMaxReadSize; 30 // The maximum number of bytes that each PpapiHostMsg_PPBUDPSocket_SendTo 31 // message is allowed to carry. 32 static const int32_t kMaxWriteSize; 33 34 // The maximum number that we allow for setting 35 // PP_UDPSOCKET_OPTION_SEND_BUFFER_SIZE. This number is only for input 36 // argument sanity check, it doesn't mean the browser guarantees to support 37 // such a buffer size. 38 static const int32_t kMaxSendBufferSize; 39 // The maximum number that we allow for setting 40 // PP_UDPSOCKET_OPTION_RECV_BUFFER_SIZE. This number is only for input 41 // argument sanity check, it doesn't mean the browser guarantees to support 42 // such a buffer size. 43 static const int32_t kMaxReceiveBufferSize; 44 45 // The maximum number of received packets that we allow instances of this 46 // class to buffer. 47 static const size_t kPluginReceiveBufferSlots; 48 49 protected: 50 UDPSocketResourceBase(Connection connection, 51 PP_Instance instance, 52 bool private_api); 53 virtual ~UDPSocketResourceBase(); 54 55 int32_t SetOptionImpl(PP_UDPSocket_Option name, 56 const PP_Var& value, 57 scoped_refptr<TrackedCallback> callback); 58 int32_t BindImpl(const PP_NetAddress_Private* addr, 59 scoped_refptr<TrackedCallback> callback); 60 PP_Bool GetBoundAddressImpl(PP_NetAddress_Private* addr); 61 // |addr| could be NULL to indicate that an output value is not needed. 62 int32_t RecvFromImpl(char* buffer, 63 int32_t num_bytes, 64 PP_Resource* addr, 65 scoped_refptr<TrackedCallback> callback); 66 PP_Bool GetRecvFromAddressImpl(PP_NetAddress_Private* addr); 67 int32_t SendToImpl(const char* buffer, 68 int32_t num_bytes, 69 const PP_NetAddress_Private* addr, 70 scoped_refptr<TrackedCallback> callback); 71 void CloseImpl(); 72 73 private: 74 struct RecvBuffer { 75 int32_t result; 76 std::string data; 77 PP_NetAddress_Private addr; 78 }; 79 80 // Resource overrides. 81 virtual void OnReplyReceived(const ResourceMessageReplyParams& params, 82 const IPC::Message& msg) OVERRIDE; 83 84 void PostAbortIfNecessary(scoped_refptr<TrackedCallback>* callback); 85 86 // IPC message handlers. 87 void OnPluginMsgSetOptionReply(scoped_refptr<TrackedCallback> callback, 88 const ResourceMessageReplyParams& params); 89 void OnPluginMsgBindReply(const ResourceMessageReplyParams& params, 90 const PP_NetAddress_Private& bound_addr); 91 void OnPluginMsgPushRecvResult(const ResourceMessageReplyParams& params, 92 int32_t result, 93 const std::string& data, 94 const PP_NetAddress_Private& addr); 95 void OnPluginMsgSendToReply(const ResourceMessageReplyParams& params, 96 int32_t bytes_written); 97 98 void RunCallback(scoped_refptr<TrackedCallback> callback, int32_t pp_result); 99 100 // Callers must ensure that |output_buffer| is big enough to store |data|. 101 int32_t SetRecvFromOutput(int32_t browser_result, 102 const std::string& data, 103 const PP_NetAddress_Private& addr, 104 char* output_buffer, 105 int32_t num_bytes, 106 PP_Resource* output_addr); 107 108 bool private_api_; 109 bool bound_; 110 bool closed_; 111 112 scoped_refptr<TrackedCallback> bind_callback_; 113 scoped_refptr<TrackedCallback> recvfrom_callback_; 114 scoped_refptr<TrackedCallback> sendto_callback_; 115 116 char* read_buffer_; 117 int32_t bytes_to_read_; 118 PP_Resource* recvfrom_addr_resource_; 119 120 PP_NetAddress_Private recvfrom_addr_; 121 PP_NetAddress_Private bound_addr_; 122 123 std::queue<RecvBuffer> recv_buffers_; 124 125 DISALLOW_COPY_AND_ASSIGN(UDPSocketResourceBase); 126 }; 127 128 } // namespace proxy 129 } // namespace ppapi 130 131 #endif // PPAPI_PROXY_UDP_SOCKET_RESOURCE_BASE_H_ 132