// Copyright (c) 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef PPAPI_PROXY_VPN_PROVIDER_RESOURCE_H_ #define PPAPI_PROXY_VPN_PROVIDER_RESOURCE_H_ #include #include "base/containers/queue.h" #include "ppapi/proxy/plugin_resource.h" #include "ppapi/shared_impl/tracked_callback.h" #include "ppapi/shared_impl/var.h" #include "ppapi/shared_impl/vpn_provider_util.h" #include "ppapi/thunk/ppb_vpn_provider_api.h" namespace ppapi { namespace proxy { class PPAPI_PROXY_EXPORT VpnProviderResource : public PluginResource, public thunk::PPB_VpnProvider_API { public: VpnProviderResource(Connection connection, PP_Instance instance); virtual ~VpnProviderResource(); // PluginResource implementation. virtual thunk::PPB_VpnProvider_API* AsPPB_VpnProvider_API() override; // PPB_VpnProvider_API implementation. virtual int32_t Bind(const PP_Var& configuration_id, const PP_Var& configuration_name, const scoped_refptr& callback) override; virtual int32_t SendPacket( const PP_Var& packet, const scoped_refptr& callback) override; virtual int32_t ReceivePacket( PP_Var* packet, const scoped_refptr& callback) override; private: // PluginResource overrides. virtual void OnReplyReceived(const ResourceMessageReplyParams& params, const IPC::Message& msg) override; // PPB_VpnProvider IPC Replies void OnPluginMsgBindReply(const ResourceMessageReplyParams& params, uint32_t queue_size, uint32_t max_packet_size, int32_t result); void OnPluginMsgSendPacketReply(const ResourceMessageReplyParams& params, uint32_t id); // Browser callbacks void OnPluginMsgOnUnbindReceived(const ResourceMessageReplyParams& params); void OnPluginMsgOnPacketReceived(const ResourceMessageReplyParams& params, uint32_t packet_size, uint32_t id); // Picks up a received packet and moves it to user buffer. This method is used // in both ReceivePacket() for fast returning path, and in // OnPluginMsgOnPacketReceived() for delayed callback invocations. void WritePacket(); // Sends a packet to the browser. This method is used in both SendPacket() for // fast path, and in OnPluginMsgSendPacketReply for processing previously // queued packets. int32_t DoSendPacket(const PP_Var& packet, uint32_t id); scoped_refptr bind_callback_; scoped_refptr send_packet_callback_; scoped_refptr receive_packet_callback_; // Keeps a pointer to the provided callback variable. Received packet will be // copied to this variable on ready. PP_Var* receive_packet_callback_var_; std::unique_ptr send_packet_buffer_; std::unique_ptr recv_packet_buffer_; base::queue send_packets_; base::queue> received_packets_; // Connection bound state bool bound_; DISALLOW_COPY_AND_ASSIGN(VpnProviderResource); }; } // namespace proxy } // namespace ppapi #endif // PPAPI_PROXY_VPN_PROVIDER_RESOURCE_H_