| 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(¤t_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
|
|
|