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

Unified Diff: ppapi/proxy/ppb_file_chooser_proxy.cc

Issue 10544089: Implement the file chooser as a new resource "host" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 5 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
Index: ppapi/proxy/ppb_file_chooser_proxy.cc
diff --git a/ppapi/proxy/ppb_file_chooser_proxy.cc b/ppapi/proxy/ppb_file_chooser_proxy.cc
deleted file mode 100644
index 26ab43045425e6b58a645c68b0e1e141322fe608..0000000000000000000000000000000000000000
--- a/ppapi/proxy/ppb_file_chooser_proxy.cc
+++ /dev/null
@@ -1,311 +0,0 @@
-// Copyright (c) 2012 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.
-
-#include "ppapi/proxy/ppb_file_chooser_proxy.h"
-
-#include <queue>
-
-#include "base/bind.h"
-#include "ppapi/c/dev/ppb_file_chooser_dev.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/c/private/ppb_proxy_private.h"
-#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"
-#include "ppapi/proxy/enter_proxy.h"
-#include "ppapi/proxy/host_dispatcher.h"
-#include "ppapi/proxy/plugin_dispatcher.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/ppb_file_ref_proxy.h"
-#include "ppapi/proxy/serialized_var.h"
-#include "ppapi/shared_impl/array_writer.h"
-#include "ppapi/shared_impl/ppapi_globals.h"
-#include "ppapi/shared_impl/resource_tracker.h"
-#include "ppapi/shared_impl/tracked_callback.h"
-#include "ppapi/shared_impl/var.h"
-#include "ppapi/thunk/resource_creation_api.h"
-#include "ppapi/thunk/thunk.h"
-
-using ppapi::thunk::PPB_FileChooser_API;
-
-namespace ppapi {
-namespace proxy {
-
-namespace {
-InterfaceProxy* CreateFileChooserProxy(Dispatcher* dispatcher) {
- return new PPB_FileChooser_Proxy(dispatcher);
-}
-
-class FileChooser : public Resource,
- public PPB_FileChooser_API {
- public:
- FileChooser(const HostResource& resource);
- virtual ~FileChooser();
-
- // Resource overrides.
- virtual PPB_FileChooser_API* AsPPB_FileChooser_API() OVERRIDE;
-
- // PPB_FileChooser_API implementation.
- virtual int32_t Show(const PP_ArrayOutput& output,
- scoped_refptr<TrackedCallback> callback) OVERRIDE;
- virtual int32_t ShowWithoutUserGesture(
- PP_Bool save_as,
- PP_Var suggested_file_name,
- const PP_ArrayOutput& output,
- scoped_refptr<TrackedCallback> callback);
- virtual int32_t Show0_5(scoped_refptr<TrackedCallback> callback) OVERRIDE;
- virtual PP_Resource GetNextChosenFile() OVERRIDE;
- virtual int32_t ShowWithoutUserGesture0_5(
- PP_Bool save_as,
- PP_Var suggested_file_name,
- scoped_refptr<TrackedCallback> callback) OVERRIDE;
-
- // Handles the choose complete notification from the host.
- void ChooseComplete(
- int32_t result_code,
- const std::vector<PPB_FileRef_CreateInfo>& chosen_files);
-
- private:
- int32_t Show(bool require_user_gesture,
- PP_Bool save_as,
- PP_Var suggested_file_name,
- scoped_refptr<TrackedCallback> callback);
-
- // When using v0.6 of the API, contains the array output info.
- ArrayWriter output_;
-
- scoped_refptr<TrackedCallback> current_show_callback_;
-
- // When using v0.5 of the API, contains all files returned by the current
- // show callback that haven't yet been given to the plugin. The plugin will
- // repeatedly call us to get the next file, and we'll vend those out of this
- // queue, removing them when ownership has transferred to the plugin.
- std::queue<PP_Resource> file_queue_;
-
- DISALLOW_COPY_AND_ASSIGN(FileChooser);
-};
-
-FileChooser::FileChooser(const HostResource& resource)
- : Resource(OBJECT_IS_PROXY, resource) {
-}
-
-FileChooser::~FileChooser() {
- // Any existing files we haven't transferred ownership to the plugin need
- // to be freed.
- ResourceTracker* tracker = PpapiGlobals::Get()->GetResourceTracker();
- while (!file_queue_.empty()) {
- tracker->ReleaseResource(file_queue_.front());
- file_queue_.pop();
- }
-}
-
-PPB_FileChooser_API* FileChooser::AsPPB_FileChooser_API() {
- return this;
-}
-
-int32_t FileChooser::Show(const PP_ArrayOutput& output,
- scoped_refptr<TrackedCallback> callback) {
- int32_t result = Show(true, PP_FALSE, PP_MakeUndefined(), callback);
- if (result == PP_OK_COMPLETIONPENDING)
- output_.set_pp_array_output(output);
- return result;
-}
-
-int32_t FileChooser::ShowWithoutUserGesture(
- PP_Bool save_as,
- PP_Var suggested_file_name,
- const PP_ArrayOutput& output,
- scoped_refptr<TrackedCallback> callback) {
- int32_t result = Show(false, save_as, suggested_file_name, callback);
- if (result == PP_OK_COMPLETIONPENDING)
- output_.set_pp_array_output(output);
- return result;
-}
-
-int32_t FileChooser::Show0_5(scoped_refptr<TrackedCallback> callback) {
- return Show(true, PP_FALSE, PP_MakeUndefined(), callback);
-}
-
-int32_t FileChooser::ShowWithoutUserGesture0_5(
- PP_Bool save_as,
- PP_Var suggested_file_name,
- scoped_refptr<TrackedCallback> callback) {
- return Show(false, save_as, suggested_file_name, callback);
-}
-
-int32_t FileChooser::Show(bool require_user_gesture,
- PP_Bool save_as,
- PP_Var suggested_file_name,
- scoped_refptr<TrackedCallback> callback) {
- if (TrackedCallback::IsPending(current_show_callback_))
- return PP_ERROR_INPROGRESS; // Can't show more than once.
-
- current_show_callback_ = callback;
- PluginDispatcher* dispatcher = PluginDispatcher::GetForResource(this);
- dispatcher->Send(
- new PpapiHostMsg_PPBFileChooser_Show(
- API_ID_PPB_FILE_CHOOSER,
- host_resource(),
- save_as,
- SerializedVarSendInput(dispatcher, suggested_file_name),
- require_user_gesture));
- return PP_OK_COMPLETIONPENDING;
-}
-
-PP_Resource FileChooser::GetNextChosenFile() {
- if (file_queue_.empty())
- return 0;
-
- // Return the next resource in the queue. These resource have already been
- // addrefed (they're currently owned by the FileChooser) and returning them
- // transfers ownership of that reference to the plugin.
- PP_Resource next = file_queue_.front();
- file_queue_.pop();
- return next;
-}
-
-void FileChooser::ChooseComplete(
- int32_t result_code,
- const std::vector<PPB_FileRef_CreateInfo>& chosen_files) {
- if (output_.is_valid()) {
- // Using v0.6 of the API with the output array.
- std::vector<PP_Resource> files;
- for (size_t i = 0; i < chosen_files.size(); i++)
- files.push_back(PPB_FileRef_Proxy::DeserializeFileRef(chosen_files[i]));
- output_.StoreResourceVector(files);
- } else {
- // Convert each of the passed in file infos to resources. These will be
- // owned by the FileChooser object until they're passed to the plugin.
- DCHECK(file_queue_.empty());
- for (size_t i = 0; i < chosen_files.size(); i++) {
- file_queue_.push(PPB_FileRef_Proxy::DeserializeFileRef(
- chosen_files[i]));
- }
- }
-
- // Notify the plugin of the new data.
- TrackedCallback::ClearAndRun(&current_show_callback_, result_code);
- // DANGER: May delete |this|!
-}
-
-} // namespace
-
-PPB_FileChooser_Proxy::PPB_FileChooser_Proxy(Dispatcher* dispatcher)
- : InterfaceProxy(dispatcher),
- callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
-}
-
-PPB_FileChooser_Proxy::~PPB_FileChooser_Proxy() {
-}
-
-// static
-PP_Resource PPB_FileChooser_Proxy::CreateProxyResource(
- PP_Instance instance,
- PP_FileChooserMode_Dev mode,
- const char* accept_types) {
- Dispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
- if (!dispatcher)
- return 0;
-
- HostResource result;
- dispatcher->Send(new PpapiHostMsg_PPBFileChooser_Create(
- API_ID_PPB_FILE_CHOOSER, instance,
- mode,
- accept_types ? accept_types : "",
- &result));
-
- if (result.is_null())
- return 0;
- return (new FileChooser(result))->GetReference();
-}
-
-bool PPB_FileChooser_Proxy::OnMessageReceived(const IPC::Message& msg) {
- bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(PPB_FileChooser_Proxy, msg)
- // Plugin -> host messages.
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileChooser_Create, OnMsgCreate)
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileChooser_Show, OnMsgShow)
-
- // Host -> plugin messages.
- IPC_MESSAGE_HANDLER(PpapiMsg_PPBFileChooser_ChooseComplete,
- OnMsgChooseComplete)
- IPC_MESSAGE_UNHANDLED(handled = false)
- IPC_END_MESSAGE_MAP()
- return handled;
-}
-
-void PPB_FileChooser_Proxy::OnMsgCreate(
- PP_Instance instance,
- int mode,
- std::string accept_types,
- HostResource* result) {
- thunk::EnterResourceCreation enter(instance);
- if (enter.succeeded()) {
- result->SetHostResource(instance, enter.functions()->CreateFileChooser(
- instance,
- static_cast<PP_FileChooserMode_Dev>(mode),
- accept_types.c_str()));
- }
-}
-
-void PPB_FileChooser_Proxy::OnMsgShow(
- const HostResource& chooser,
- PP_Bool save_as,
- SerializedVarReceiveInput suggested_file_name,
- bool require_user_gesture) {
- scoped_refptr<RefCountedArrayOutputAdapter<PP_Resource> > output(
- new RefCountedArrayOutputAdapter<PP_Resource>);
- EnterHostFromHostResourceForceCallback<PPB_FileChooser_API> enter(
- chooser,
- callback_factory_.NewOptionalCallback(
- &PPB_FileChooser_Proxy::OnShowCallback, output, chooser));
- if (enter.succeeded()) {
- if (require_user_gesture) {
- enter.SetResult(enter.object()->Show(output->pp_array_output(),
- enter.callback()));
- } else {
- enter.SetResult(enter.object()->ShowWithoutUserGesture(
- save_as,
- suggested_file_name.Get(dispatcher()),
- output->pp_array_output(),
- enter.callback()));
- }
- }
-}
-
-void PPB_FileChooser_Proxy::OnMsgChooseComplete(
- const HostResource& chooser,
- int32_t result_code,
- const std::vector<PPB_FileRef_CreateInfo>& chosen_files) {
- EnterPluginFromHostResource<PPB_FileChooser_API> enter(chooser);
- if (enter.succeeded()) {
- static_cast<FileChooser*>(enter.object())->ChooseComplete(
- result_code, chosen_files);
- }
-}
-
-void PPB_FileChooser_Proxy::OnShowCallback(
- int32_t result,
- scoped_refptr<RefCountedArrayOutputAdapter<PP_Resource> >
- output,
- HostResource chooser) {
- EnterHostFromHostResource<PPB_FileChooser_API> enter(chooser);
-
- std::vector<PPB_FileRef_CreateInfo> files;
- if (enter.succeeded() && result == PP_OK) {
- PPB_FileRef_Proxy* file_ref_proxy = static_cast<PPB_FileRef_Proxy*>(
- dispatcher()->GetInterfaceProxy(API_ID_PPB_FILE_REF));
-
- // Convert the returned files to the serialized info.
- for (size_t i = 0; i < output->output().size(); i++) {
- PPB_FileRef_CreateInfo cur_create_info;
- file_ref_proxy->SerializeFileRef(output->output()[i], &cur_create_info);
- files.push_back(cur_create_info);
- }
- }
-
- dispatcher()->Send(new PpapiMsg_PPBFileChooser_ChooseComplete(
- API_ID_PPB_FILE_CHOOSER, chooser, result, files));
-}
-
-} // namespace proxy
-} // namespace ppapi

Powered by Google App Engine
This is Rietveld 408576698