Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(645)

Unified Diff: ppapi/proxy/ppb_flash_menu_proxy.cc

Issue 7149026: Implement flash menu and net connector resources using the API/thunk model. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ppapi/proxy/ppb_flash_menu_proxy.h ('k') | ppapi/proxy/ppb_flash_net_connector_proxy.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ppapi/proxy/ppb_flash_menu_proxy.cc
===================================================================
--- ppapi/proxy/ppb_flash_menu_proxy.cc (revision 89119)
+++ ppapi/proxy/ppb_flash_menu_proxy.cc (working copy)
@@ -6,30 +6,35 @@
#include "ppapi/c/pp_errors.h"
#include "ppapi/c/private/ppb_flash_menu.h"
+#include "ppapi/proxy/enter_proxy.h"
#include "ppapi/proxy/ppapi_messages.h"
+#include "ppapi/thunk/enter.h"
+#include "ppapi/thunk/ppb_flash_menu_api.h"
+#include "ppapi/thunk/resource_creation_api.h"
+#include "ppapi/thunk/thunk.h"
+using ppapi::thunk::EnterFunctionNoLock;
+using ppapi::thunk::PPB_Flash_Menu_API;
+using ppapi::thunk::ResourceCreationAPI;
+
namespace pp {
namespace proxy {
-class FlashMenu : public PluginResource {
+class FlashMenu : public PPB_Flash_Menu_API, public PluginResource {
public:
- explicit FlashMenu(const HostResource& resource)
- : PluginResource(resource),
- callback_(PP_BlockUntilComplete()),
- selected_id_ptr_(NULL) {
- }
+ explicit FlashMenu(const HostResource& resource);
+ virtual ~FlashMenu();
- virtual ~FlashMenu() {}
+ // ResourceObjectBase overrides.
+ virtual PPB_Flash_Menu_API* AsPPB_Flash_Menu_API() OVERRIDE;
- // Resource overrides.
- virtual FlashMenu* AsFlashMenu() { return this; }
+ // PPB_Flash_Menu_API implementation.
+ virtual int32_t Show(const PP_Point* location,
+ int32_t* selected_id,
+ PP_CompletionCallback callback) OVERRIDE;
- int32_t* selected_id_ptr() const { return selected_id_ptr_; }
- void set_selected_id_ptr(int32_t* ptr) { selected_id_ptr_ = ptr; }
+ void ShowACK(int32_t selected_id, int32_t result);
- PP_CompletionCallback callback() const { return callback_; }
- void set_callback(PP_CompletionCallback cb) { callback_ = cb; }
-
private:
PP_CompletionCallback callback_;
int32_t* selected_id_ptr_;
@@ -37,61 +42,40 @@
DISALLOW_COPY_AND_ASSIGN(FlashMenu);
};
-namespace {
+FlashMenu::FlashMenu(const HostResource& resource)
+ : PluginResource(resource),
+ callback_(PP_BlockUntilComplete()),
+ selected_id_ptr_(NULL) {
+}
-PP_Resource Create(PP_Instance instance_id, const PP_Flash_Menu* menu_data) {
- PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id);
- if (!dispatcher)
- return 0;
-
- HostResource result;
- pp::proxy::SerializedFlashMenu serialized_menu;
- if (!serialized_menu.SetPPMenu(menu_data))
- return 0;
-
- dispatcher->Send(new PpapiHostMsg_PPBFlashMenu_Create(
- INTERFACE_ID_PPB_FLASH_MENU, instance_id, serialized_menu, &result));
- if (result.is_null())
- return 0;
-
- linked_ptr<FlashMenu> menu(new FlashMenu(result));
- return PluginResourceTracker::GetInstance()->AddResource(menu);
+FlashMenu::~FlashMenu() {
}
-PP_Bool IsFlashMenu(PP_Resource resource) {
- return BoolToPPBool(!!PluginResource::GetAs<FlashMenu>(resource));
+PPB_Flash_Menu_API* FlashMenu::AsPPB_Flash_Menu_API() {
+ return this;
}
-int32_t Show(PP_Resource menu_id,
- const PP_Point* location,
- int32_t* selected_id,
- PP_CompletionCallback callback) {
- FlashMenu* object = PluginResource::GetAs<FlashMenu>(menu_id);
- if (!object)
- return PP_ERROR_BADRESOURCE;
- PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(
- object->instance());
- if (!dispatcher)
- return PP_ERROR_FAILED;
-
- if (object->callback().func)
+int32_t FlashMenu::Show(const struct PP_Point* location,
+ int32_t* selected_id,
+ struct PP_CompletionCallback callback) {
+ if (callback_.func)
return PP_ERROR_INPROGRESS;
- object->set_selected_id_ptr(selected_id);
- object->set_callback(callback);
+ selected_id_ptr_ = selected_id;
+ callback_ = callback;
- dispatcher->Send(new PpapiHostMsg_PPBFlashMenu_Show(
- INTERFACE_ID_PPB_FLASH_MENU, object->host_resource(), *location));
-
+ GetDispatcher()->Send(new PpapiHostMsg_PPBFlashMenu_Show(
+ INTERFACE_ID_PPB_FLASH_MENU, host_resource(), *location));
return PP_OK_COMPLETIONPENDING;
}
-const PPB_Flash_Menu flash_menu_interface = {
- &Create,
- &IsFlashMenu,
- &Show,
-};
+void FlashMenu::ShowACK(int32_t selected_id, int32_t result) {
+ *selected_id_ptr_ = selected_id;
+ PP_RunAndClearCompletionCallback(&callback_, result);
+}
+namespace {
+
InterfaceProxy* CreateFlashMenuProxy(Dispatcher* dispatcher,
const void* target_interface) {
return new PPB_Flash_Menu_Proxy(dispatcher, target_interface);
@@ -108,9 +92,10 @@
PPB_Flash_Menu_Proxy::~PPB_Flash_Menu_Proxy() {
}
+// static
const InterfaceProxy::Info* PPB_Flash_Menu_Proxy::GetInfo() {
static const Info info = {
- &flash_menu_interface,
+ ppapi::thunk::GetPPB_Flash_Menu_Thunk(),
PPB_FLASH_MENU_INTERFACE,
INTERFACE_ID_PPB_FLASH_MENU,
true,
@@ -119,6 +104,28 @@
return &info;
}
+// static
+PP_Resource PPB_Flash_Menu_Proxy::CreateProxyResource(
+ PP_Instance instance_id,
+ const PP_Flash_Menu* menu_data) {
+ PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id);
+ if (!dispatcher)
+ return 0;
+
+ HostResource result;
+ pp::proxy::SerializedFlashMenu serialized_menu;
+ if (!serialized_menu.SetPPMenu(menu_data))
+ return 0;
+
+ dispatcher->Send(new PpapiHostMsg_PPBFlashMenu_Create(
+ INTERFACE_ID_PPB_FLASH_MENU, instance_id, serialized_menu, &result));
+ if (result.is_null())
+ return 0;
+
+ linked_ptr<FlashMenu> menu(new FlashMenu(result));
+ return PluginResourceTracker::GetInstance()->AddResource(menu);
+}
+
bool PPB_Flash_Menu_Proxy::OnMessageReceived(const IPC::Message& msg) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PPB_Flash_Menu_Proxy, msg)
@@ -135,12 +142,15 @@
return handled;
}
-void PPB_Flash_Menu_Proxy::OnMsgCreate(PP_Instance instance_id,
+void PPB_Flash_Menu_Proxy::OnMsgCreate(PP_Instance instance,
const SerializedFlashMenu& menu_data,
HostResource* result) {
- PP_Resource resource = ppb_flash_menu_target()->Create(instance_id,
- menu_data.pp_menu());
- result->SetHostResource(instance_id, resource);
+ EnterFunctionNoLock<ResourceCreationAPI> enter(instance, true);
+ if (enter.succeeded()) {
+ result->SetHostResource(
+ instance,
+ enter.functions()->CreateFlashMenu(instance, menu_data.pp_menu()));
+ }
}
struct PPB_Flash_Menu_Proxy::ShowRequest {
@@ -154,11 +164,14 @@
request->menu = menu;
CompletionCallback callback = callback_factory_.NewCallback(
&PPB_Flash_Menu_Proxy::SendShowACKToPlugin, request);
- int32_t result = ppb_flash_menu_target()->Show(
- menu.host_resource(),
- &location,
- &request->selected_id,
- callback.pp_completion_callback());
+
+ EnterHostFromHostResource<PPB_Flash_Menu_API> enter(menu);
+ int32_t result = PP_ERROR_BADRESOURCE;
+ if (enter.succeeded()) {
+ result = enter.object()->Show(&location,
+ &request->selected_id,
+ callback.pp_completion_callback());
+ }
if (result != PP_OK_COMPLETIONPENDING) {
// There was some error, so we won't get a callback. We need to now issue
// the ACK to the plugin so that it hears about the error. This will also
@@ -181,12 +194,7 @@
return;
}
- // Be careful to make the callback NULL before issuing the callback since the
- // plugin might want to show the menu again from within the callback.
- PP_CompletionCallback callback = object->callback();
- object->set_callback(PP_BlockUntilComplete());
- *(object->selected_id_ptr()) = selected_id;
- PP_RunCompletionCallback(&callback, result);
+ object->ShowACK(selected_id, result);
}
void PPB_Flash_Menu_Proxy::SendShowACKToPlugin(
« no previous file with comments | « ppapi/proxy/ppb_flash_menu_proxy.h ('k') | ppapi/proxy/ppb_flash_net_connector_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698