Chromium Code Reviews| Index: ppapi/proxy/ppb_flash_net_connector_proxy.cc |
| =================================================================== |
| --- ppapi/proxy/ppb_flash_net_connector_proxy.cc (revision 88835) |
| +++ ppapi/proxy/ppb_flash_net_connector_proxy.cc (working copy) |
| @@ -8,11 +8,20 @@ |
| #include "ppapi/c/pp_errors.h" |
| #include "ppapi/c/private/ppb_flash_net_connector.h" |
| +#include "ppapi/thunk/ppb_flash_net_connector_api.h" |
|
yzshen1
2011/06/15 01:12:44
Please arrange them alphabetically.
|
| +#include "ppapi/proxy/enter_proxy.h" |
| #include "ppapi/proxy/plugin_dispatcher.h" |
| #include "ppapi/proxy/plugin_resource.h" |
| #include "ppapi/proxy/ppapi_messages.h" |
| #include "ppapi/proxy/serialized_var.h" |
| +#include "ppapi/thunk/enter.h" |
| +#include "ppapi/thunk/resource_creation_api.h" |
| +#include "ppapi/thunk/thunk.h" |
| +using ppapi::thunk::EnterFunctionNoLock; |
| +using ppapi::thunk::PPB_Flash_NetConnector_API; |
| +using ppapi::thunk::ResourceCreationAPI; |
| + |
| namespace pp { |
| namespace proxy { |
| @@ -39,169 +48,147 @@ |
| PP_CompletionCallback callback_; |
| }; |
| -class FlashNetConnector : public PluginResource { |
| +class FlashNetConnector : public PPB_Flash_NetConnector_API, |
| + public PluginResource { |
| public: |
| - FlashNetConnector(const HostResource& resource) |
| - : PluginResource(resource), |
| - callback_(PP_BlockUntilComplete()), |
| - local_addr_out_(NULL), |
| - remote_addr_out_(NULL) { |
| - } |
| - ~FlashNetConnector() { |
| - if (callback_.func) { |
| - MessageLoop::current()->PostTask(FROM_HERE, |
| - new AbortCallbackTask(callback_)); |
| - } |
| - } |
| + FlashNetConnector(const HostResource& resource); |
|
yzshen1
2011/06/15 01:12:44
Please add "explicit".
|
| + virtual ~FlashNetConnector(); |
| - // Resource overrides. |
| - virtual FlashNetConnector* AsFlashNetConnector() { |
| - return this; |
| - } |
| + // ResourceObjectBase overrides. |
| + virtual PPB_Flash_NetConnector_API* AsPPB_Flash_NetConnector_API() OVERRIDE; |
| - bool HasCallback() const { |
| - return callback_.func != NULL; |
| - } |
| + // PPB_Flash_NetConnector_API implementation. |
| + virtual int32_t ConnectTcp(const char* host, |
| + uint16_t port, |
| + PP_FileHandle* socket_out, |
| + PP_Flash_NetAddress* local_addr_out, |
| + PP_Flash_NetAddress* remote_addr_out, |
| + PP_CompletionCallback callback) OVERRIDE; |
| + virtual int32_t ConnectTcpAddress(const PP_Flash_NetAddress* addr, |
| + PP_FileHandle* socket_out, |
| + PP_Flash_NetAddress* local_addr_out, |
| + PP_Flash_NetAddress* remote_addr_out, |
| + PP_CompletionCallback callback) OVERRIDE; |
| - void SetCallback(const PP_CompletionCallback& callback, |
| - PP_FileHandle* socket_out, |
| - PP_Flash_NetAddress* local_addr_out, |
| - PP_Flash_NetAddress* remote_addr_out) { |
| - callback_ = callback; |
| - socket_out_ = socket_out; |
| - local_addr_out_ = local_addr_out; |
| - remote_addr_out_ = remote_addr_out; |
| - } |
| - |
| void ConnectComplete(int32_t result, |
| base::PlatformFile file, |
| const std::string& local_addr_as_string, |
| - const std::string& remote_addr_as_string) { |
| - if (!callback_.func) { |
| - base::ClosePlatformFile(file); |
| - return; |
| - } |
| + const std::string& remote_addr_as_string); |
| - *socket_out_ = static_cast<PP_FileHandle>(file); |
| - StringToNetAddress(local_addr_as_string, local_addr_out_); |
| - StringToNetAddress(remote_addr_as_string, remote_addr_out_); |
| + private: |
| + // Backend for both ConnectTcp and ConnectTcpAddress. To keep things generic, |
| + // the message is passed in (on error, it's deleted). |
| + int32_t ConnectWithMessage(IPC::Message* msg, |
| + PP_FileHandle* socket_out, |
| + struct PP_Flash_NetAddress* local_addr_out, |
|
yzshen1
2011/06/15 01:12:44
You could probably remove "struct".
|
| + struct PP_Flash_NetAddress* remote_addr_out, |
| + struct PP_CompletionCallback callback); |
| - PP_RunAndClearCompletionCallback(&callback_, result); |
| - } |
| - |
| - private: |
| PP_CompletionCallback callback_; |
| PP_FileHandle* socket_out_; |
| PP_Flash_NetAddress* local_addr_out_; |
| PP_Flash_NetAddress* remote_addr_out_; |
| }; |
| -// Contains the data that the host interface will write to so we can send it |
| -// to the plugin. This is created when a request is initiated, and deleted in |
| -// the callback handler. |
| -struct PPB_Flash_NetConnector_Proxy::ConnectCallbackInfo { |
| - ConnectCallbackInfo(const HostResource& r) : resource(r), handle(0) { |
| - local_addr.size = 0; |
| - remote_addr.size = 0; |
| +FlashNetConnector::FlashNetConnector(const HostResource& resource) |
| + : PluginResource(resource), |
| + callback_(PP_BlockUntilComplete()), |
| + local_addr_out_(NULL), |
| + remote_addr_out_(NULL) { |
| +} |
| + |
| +FlashNetConnector::~FlashNetConnector() { |
| + if (callback_.func) { |
| + MessageLoop::current()->PostTask(FROM_HERE, |
| + new AbortCallbackTask(callback_)); |
| } |
| +} |
| - HostResource resource; |
| +PPB_Flash_NetConnector_API* FlashNetConnector::AsPPB_Flash_NetConnector_API() { |
| + return this; |
| +} |
| - PP_FileHandle handle; |
| - PP_Flash_NetAddress local_addr; |
| - PP_Flash_NetAddress remote_addr; |
| -}; |
| +int32_t FlashNetConnector::ConnectTcp( |
| + const char* host, |
| + uint16_t port, |
| + PP_FileHandle* socket_out, |
| + PP_Flash_NetAddress* local_addr_out, |
| + PP_Flash_NetAddress* remote_addr_out, |
| + PP_CompletionCallback callback) { |
| + return ConnectWithMessage( |
| + new PpapiHostMsg_PPBFlashNetConnector_ConnectTcp( |
| + INTERFACE_ID_PPB_FLASH_NETCONNECTOR, host_resource(), host, port), |
| + socket_out, local_addr_out, remote_addr_out, callback); |
| +} |
| -namespace { |
| +int32_t FlashNetConnector::ConnectTcpAddress( |
| + const PP_Flash_NetAddress* addr, |
| + PP_FileHandle* socket_out, |
| + PP_Flash_NetAddress* local_addr_out, |
| + PP_Flash_NetAddress* remote_addr_out, |
| + PP_CompletionCallback callback) { |
| + return ConnectWithMessage( |
| + new PpapiHostMsg_PPBFlashNetConnector_ConnectTcpAddress( |
| + INTERFACE_ID_PPB_FLASH_NETCONNECTOR, |
| + host_resource(), NetAddressToString(*addr)), |
| + socket_out, local_addr_out, remote_addr_out, callback); |
| +} |
| -PP_Resource Create(PP_Instance instance_id) { |
| - PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id); |
| - if (!dispatcher) |
| - return 0; |
| +void FlashNetConnector::ConnectComplete( |
| + int32_t result, |
| + base::PlatformFile file, |
| + const std::string& local_addr_as_string, |
| + const std::string& remote_addr_as_string) { |
| + if (!callback_.func) { |
| + base::ClosePlatformFile(file); |
| + return; |
| + } |
| - HostResource result; |
| - dispatcher->Send(new PpapiHostMsg_PPBFlashNetConnector_Create( |
| - INTERFACE_ID_PPB_FLASH_NETCONNECTOR, instance_id, &result)); |
| - if (result.is_null()) |
| - return 0; |
| + *socket_out_ = static_cast<PP_FileHandle>(file); |
| + StringToNetAddress(local_addr_as_string, local_addr_out_); |
| + StringToNetAddress(remote_addr_as_string, remote_addr_out_); |
| - linked_ptr<FlashNetConnector> object(new FlashNetConnector(result)); |
| - return PluginResourceTracker::GetInstance()->AddResource(object); |
| + PP_RunAndClearCompletionCallback(&callback_, result); |
| } |
| -PP_Bool IsFlashNetConnector(PP_Resource resource_id) { |
| - FlashNetConnector* object = |
| - PluginResource::GetAs<FlashNetConnector>(resource_id); |
| - return BoolToPPBool(!!object); |
| -} |
| - |
| -// Backend for both ConnectTcp and ConnectTcpAddress. To keep things generic, |
| -// the message is passed in (on error, it's deleted). |
| -int32_t ConnectWithMessage(FlashNetConnector* object, |
| - IPC::Message* msg, |
| - PP_FileHandle* socket_out, |
| - struct PP_Flash_NetAddress* local_addr_out, |
| - struct PP_Flash_NetAddress* remote_addr_out, |
| - struct PP_CompletionCallback callback) { |
| +int32_t FlashNetConnector::ConnectWithMessage( |
| + IPC::Message* msg, |
| + PP_FileHandle* socket_out, |
| + PP_Flash_NetAddress* local_addr_out, |
| + PP_Flash_NetAddress* remote_addr_out, |
| + PP_CompletionCallback callback) { |
| scoped_ptr<IPC::Message> msg_deletor(msg); |
| - if (object->HasCallback()) |
| + if (callback_.func != NULL) |
| return PP_ERROR_INPROGRESS; // Can only have one pending request. |
| // Send the request, it will call us back via ConnectACK. |
| - PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance( |
| - object->instance()); |
| - if (!dispatcher) |
| - return PP_ERROR_BADARGUMENT; |
| - dispatcher->Send(msg_deletor.release()); |
| + GetDispatcher()->Send(msg_deletor.release()); |
| - object->SetCallback(callback, socket_out, local_addr_out, remote_addr_out); |
| + callback_ = callback; |
| + socket_out_ = socket_out; |
| + local_addr_out_ = local_addr_out; |
| + remote_addr_out_ = remote_addr_out; |
| return PP_OK_COMPLETIONPENDING; |
| } |
| -int32_t ConnectTcp(PP_Resource connector_id, |
| - const char* host, |
| - uint16_t port, |
| - PP_FileHandle* socket_out, |
| - struct PP_Flash_NetAddress* local_addr_out, |
| - struct PP_Flash_NetAddress* remote_addr_out, |
| - struct PP_CompletionCallback callback) { |
| - FlashNetConnector* object = |
| - PluginResource::GetAs<FlashNetConnector>(connector_id); |
| - if (!object) |
| - return PP_ERROR_BADARGUMENT; |
| - return ConnectWithMessage( |
| - object, |
| - new PpapiHostMsg_PPBFlashNetConnector_ConnectTcp( |
| - INTERFACE_ID_PPB_FLASH_NETCONNECTOR, |
| - object->host_resource(), host, port), |
| - socket_out, local_addr_out, remote_addr_out, callback); |
| -} |
| +// Contains the data that the host interface will write to so we can send it |
| +// to the plugin. This is created when a request is initiated, and deleted in |
| +// the callback handler. |
| +struct PPB_Flash_NetConnector_Proxy::ConnectCallbackInfo { |
| + ConnectCallbackInfo(const HostResource& r) : resource(r), handle(0) { |
| + local_addr.size = 0; |
| + remote_addr.size = 0; |
| + } |
| -int32_t ConnectTcpAddress(PP_Resource connector_id, |
| - const struct PP_Flash_NetAddress* addr, |
| - PP_FileHandle* socket_out, |
| - struct PP_Flash_NetAddress* local_addr_out, |
| - struct PP_Flash_NetAddress* remote_addr_out, |
| - struct PP_CompletionCallback callback) { |
| - FlashNetConnector* object = |
| - PluginResource::GetAs<FlashNetConnector>(connector_id); |
| - if (!object) |
| - return PP_ERROR_BADARGUMENT; |
| - return ConnectWithMessage( |
| - object, |
| - new PpapiHostMsg_PPBFlashNetConnector_ConnectTcpAddress( |
| - INTERFACE_ID_PPB_FLASH_NETCONNECTOR, |
| - object->host_resource(), NetAddressToString(*addr)), |
| - socket_out, local_addr_out, remote_addr_out, callback); |
| -} |
| + HostResource resource; |
| -const PPB_Flash_NetConnector flash_netconnector_interface = { |
| - &Create, |
| - &IsFlashNetConnector, |
| - &ConnectTcp, |
| - &ConnectTcpAddress |
| + PP_FileHandle handle; |
| + PP_Flash_NetAddress local_addr; |
| + PP_Flash_NetAddress remote_addr; |
| }; |
| +namespace { |
| + |
| InterfaceProxy* CreateFlashNetConnectorProxy(Dispatcher* dispatcher, |
| const void* target_interface) { |
| return new PPB_Flash_NetConnector_Proxy(dispatcher, target_interface); |
| @@ -221,7 +208,7 @@ |
| // static |
| const InterfaceProxy::Info* PPB_Flash_NetConnector_Proxy::GetInfo() { |
| static const Info info = { |
| - &flash_netconnector_interface, |
| + ppapi::thunk::GetPPB_Flash_NetConnector_Thunk(), |
| PPB_FLASH_NETCONNECTOR_INTERFACE, |
| INTERFACE_ID_PPB_FLASH_NETCONNECTOR, |
| false, |
| @@ -230,6 +217,23 @@ |
| return &info; |
| } |
| +// static |
| +PP_Resource PPB_Flash_NetConnector_Proxy::CreateProxyResource( |
| + PP_Instance instance) { |
| + PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
| + if (!dispatcher) |
| + return 0; |
| + |
| + HostResource result; |
| + dispatcher->Send(new PpapiHostMsg_PPBFlashNetConnector_Create( |
| + INTERFACE_ID_PPB_FLASH_NETCONNECTOR, instance, &result)); |
| + if (result.is_null()) |
| + return 0; |
| + |
| + linked_ptr<FlashNetConnector> object(new FlashNetConnector(result)); |
| + return PluginResourceTracker::GetInstance()->AddResource(object); |
| +} |
| + |
| bool PPB_Flash_NetConnector_Proxy::OnMessageReceived(const IPC::Message& msg) { |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(PPB_Flash_NetConnector_Proxy, msg) |
| @@ -246,11 +250,14 @@ |
| return handled; |
| } |
| -void PPB_Flash_NetConnector_Proxy::OnMsgCreate(PP_Instance instance_id, |
| +void PPB_Flash_NetConnector_Proxy::OnMsgCreate(PP_Instance instance, |
| HostResource* result) { |
| - result->SetHostResource( |
| - instance_id, |
| - ppb_flash_net_connector_target()->Create(instance_id)); |
| + EnterFunctionNoLock<ResourceCreationAPI> enter(instance, true); |
| + if (enter.succeeded()) { |
| + result->SetHostResource( |
| + instance, |
| + enter.functions()->CreateFlashNetConnector(instance)); |
| + } |
|
yzshen1
2011/06/15 01:12:44
Please set |result| properly if enter fails.
|
| } |
| void PPB_Flash_NetConnector_Proxy::OnMsgConnectTcp( |
| @@ -261,10 +268,13 @@ |
| CompletionCallback callback = callback_factory_.NewCallback( |
| &PPB_Flash_NetConnector_Proxy::OnCompleteCallbackInHost, info); |
| - int32_t result = ppb_flash_net_connector_target()->ConnectTcp( |
| - resource.host_resource(), host.c_str(), port, |
| - &info->handle, &info->local_addr, &info->remote_addr, |
| - callback.pp_completion_callback()); |
| + EnterHostFromHostResource<PPB_Flash_NetConnector_API> enter(resource); |
| + int32_t result = PP_ERROR_BADRESOURCE; |
| + if (enter.succeeded()) { |
| + result = enter.object()->ConnectTcp( |
| + host.c_str(), port, &info->handle, &info->local_addr, |
| + &info->remote_addr, callback.pp_completion_callback()); |
| + } |
| if (result != PP_OK_COMPLETIONPENDING) |
| OnCompleteCallbackInHost(result, info); |
| } |
| @@ -279,10 +289,13 @@ |
| PP_Flash_NetAddress net_address; |
| StringToNetAddress(net_address_as_string, &net_address); |
| - int32_t result = ppb_flash_net_connector_target()->ConnectTcpAddress( |
| - resource.host_resource(), &net_address, |
| - &info->handle, &info->local_addr, &info->remote_addr, |
| - callback.pp_completion_callback()); |
| + EnterHostFromHostResource<PPB_Flash_NetConnector_API> enter(resource); |
| + int32_t result = PP_ERROR_BADRESOURCE; |
| + if (enter.succeeded()) { |
| + result = enter.object()->ConnectTcpAddress( |
| + &net_address, &info->handle, &info->local_addr, &info->remote_addr, |
| + callback.pp_completion_callback()); |
| + } |
| if (result != PP_OK_COMPLETIONPENDING) |
| OnCompleteCallbackInHost(result, info); |
| } |
| @@ -296,20 +309,12 @@ |
| base::PlatformFile platform_file = |
| IPC::PlatformFileForTransitToPlatformFile(handle); |
| - PP_Resource plugin_resource = |
| - PluginResourceTracker::GetInstance()->PluginResourceForHostResource( |
| - host_resource); |
| - if (!plugin_resource) { |
| + EnterPluginFromHostResource<PPB_Flash_NetConnector_API> enter(host_resource); |
| + if (enter.failed()) { |
| base::ClosePlatformFile(platform_file); |
| return; |
| } |
| - FlashNetConnector* object = |
| - PluginResource::GetAs<FlashNetConnector>(plugin_resource); |
| - if (!object) { |
| - base::ClosePlatformFile(platform_file); |
| - return; |
| - } |
| - |
| + FlashNetConnector* object = static_cast<FlashNetConnector*>(enter.object()); |
| object->ConnectComplete(result, platform_file, |
| load_addr_as_string, remote_addr_as_string); |
| } |