15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PPAPI_PROXY_FILE_CHOOSER_RESOURCE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_PROXY_FILE_CHOOSER_RESOURCE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_resource.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_proxy_export.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/array_writer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/tracked_callback.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_file_chooser_api.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)struct FileRefCreateInfo;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PPAPI_PROXY_EXPORT FileChooserResource
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public PluginResource,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public NON_EXPORTED_BASE(thunk::PPB_FileChooser_API) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FileChooserResource(Connection connection,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      PP_Instance instance,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      PP_FileChooserMode_Dev mode,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const std::string& accept_types);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FileChooserResource();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resource overrides.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual thunk::PPB_FileChooser_API* AsPPB_FileChooser_API() OVERRIDE;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PPB_FileChooser_API.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t Show(const PP_ArrayOutput& output,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       scoped_refptr<TrackedCallback> callback) OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t ShowWithoutUserGesture(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Bool save_as,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Var suggested_file_name,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PP_ArrayOutput& output,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<TrackedCallback> callback) OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t Show0_5(scoped_refptr<TrackedCallback> callback) OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_Resource GetNextChosenFile() OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t ShowWithoutUserGesture0_5(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Bool save_as,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Var suggested_file_name,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<TrackedCallback> callback) OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses the accept string into the given vector.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void PopulateAcceptTypes(const std::string& input,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  std::vector<std::string>* output);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPluginMsgShowReply(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ResourceMessageReplyParams& params,
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      const std::vector<FileRefCreateInfo>& chosen_files);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t ShowInternal(PP_Bool save_as,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const PP_Var& suggested_file_name,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       scoped_refptr<TrackedCallback> callback);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_FileChooserMode_Dev mode_;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> accept_types_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When using v0.6 of the API, contains the array output info.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ArrayWriter output_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When using v0.5 of the API, contains all files returned by the current
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // show callback that haven't yet been given to the plugin. The plugin will
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // repeatedly call us to get the next file, and we'll vend those out of this
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // queue, removing them when ownership has transferred to the plugin.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::queue<PP_Resource> file_queue_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TrackedCallback> callback_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FileChooserResource);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // PPAPI_PROXY_FILE_CHOOSER_RESOURCE_H_
86