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

Side by Side Diff: ppapi/cpp/dev/file_chooser_dev.cc

Issue 9728001: Make the file chooser use PP_ArrayOutput (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ppapi/cpp/dev/file_chooser_dev.h" 5 #include "ppapi/cpp/dev/file_chooser_dev.h"
6 6
7 #include "ppapi/c/dev/ppb_file_chooser_dev.h" 7 #include "ppapi/c/dev/ppb_file_chooser_dev.h"
8 #include "ppapi/c/pp_errors.h" 8 #include "ppapi/c/pp_errors.h"
9 #include "ppapi/cpp/completion_callback.h" 9 #include "ppapi/cpp/completion_callback.h"
10 #include "ppapi/cpp/file_ref.h" 10 #include "ppapi/cpp/file_ref.h"
11 #include "ppapi/cpp/instance_handle.h" 11 #include "ppapi/cpp/instance_handle.h"
12 #include "ppapi/cpp/module.h" 12 #include "ppapi/cpp/module.h"
13 #include "ppapi/cpp/module_impl.h" 13 #include "ppapi/cpp/module_impl.h"
14 14
15 namespace pp { 15 namespace pp {
16 16
17 namespace { 17 namespace {
18 18
19 template <> const char* interface_name<PPB_FileChooser_Dev>() { 19 template <> const char* interface_name<PPB_FileChooser_Dev_0_5>() {
20 return PPB_FILECHOOSER_DEV_INTERFACE; 20 return PPB_FILECHOOSER_DEV_INTERFACE_0_5;
21 }
22
23 template <> const char* interface_name<PPB_FileChooser_Dev_0_6>() {
24 return PPB_FILECHOOSER_DEV_INTERFACE_0_6;
21 } 25 }
22 26
23 } // namespace 27 } // namespace
24 28
25 FileChooser_Dev::FileChooser_Dev(const InstanceHandle& instance, 29 FileChooser_Dev::FileChooser_Dev(const InstanceHandle& instance,
26 PP_FileChooserMode_Dev mode, 30 PP_FileChooserMode_Dev mode,
27 const Var& accept_mime_types) { 31 const Var& accept_mime_types) {
28 if (!has_interface<PPB_FileChooser_Dev>()) 32 if (has_interface<PPB_FileChooser_Dev_0_5>()) {
29 return; 33 PassRefFromConstructor(get_interface<PPB_FileChooser_Dev_0_5>()->Create(
30 PassRefFromConstructor(get_interface<PPB_FileChooser_Dev>()->Create( 34 instance.pp_instance(), mode, accept_mime_types.pp_var()));
31 instance.pp_instance(), mode, accept_mime_types.pp_var())); 35 } else if (has_interface<PPB_FileChooser_Dev_0_6>()) {
36 PassRefFromConstructor(get_interface<PPB_FileChooser_Dev_0_6>()->Create(
37 instance.pp_instance(), mode, accept_mime_types.pp_var()));
38 }
32 } 39 }
33 40
34 FileChooser_Dev::FileChooser_Dev(const FileChooser_Dev& other) 41 FileChooser_Dev::FileChooser_Dev(const FileChooser_Dev& other)
35 : Resource(other) { 42 : Resource(other) {
36 } 43 }
37 44
38 int32_t FileChooser_Dev::Show(const CompletionCallback& cc) { 45 int32_t FileChooser_Dev::Show(
39 if (!has_interface<PPB_FileChooser_Dev>()) 46 const CompletionCallbackWithOutput< std::vector<FileRef> >& callback) {
40 return cc.MayForce(PP_ERROR_NOINTERFACE); 47 if (has_interface<PPB_FileChooser_Dev_0_6>()) {
41 return get_interface<PPB_FileChooser_Dev>()->Show( 48 return get_interface<PPB_FileChooser_Dev_0_6>()->Show(
42 pp_resource(), cc.pp_completion_callback()); 49 pp_resource(),
50 callback.output(),
51 callback.pp_completion_callback());
52 } else if (has_interface<PPB_FileChooser_Dev_0_5>()) {
viettrungluu 2012/03/26 16:55:19 Nit: no |else| needed.
53 // Data for out callback. The callback handler will delete it.
viettrungluu 2012/03/26 16:55:19 "out"?
54 ChooseCallbackData0_5* data = new ChooseCallbackData0_5;
55 data->file_chooser = pp_resource();
56 data->output = callback.output();
57 data->original_callback = callback.pp_completion_callback();
58
59 return get_interface<PPB_FileChooser_Dev_0_5>()->Show(
60 pp_resource(), PP_MakeCompletionCallback(&CallbackConverter, data));
61 }
62 return callback.MayForce(PP_ERROR_NOINTERFACE);
43 } 63 }
44 64
45 FileRef FileChooser_Dev::GetNextChosenFile() const { 65 // static
46 if (!has_interface<PPB_FileChooser_Dev>()) 66 void FileChooser_Dev::CallbackConverter(void* user_data, int32_t result) {
47 return FileRef(); 67 ChooseCallbackData0_5* data = static_cast<ChooseCallbackData0_5*>(user_data);
48 return FileRef(PASS_REF, 68
49 get_interface<PPB_FileChooser_Dev>()->GetNextChosenFile(pp_resource())); 69 // Get all of the selected file resources using the iterator API.
70 std::vector<PP_Resource> selected_files;
71 if (result == PP_OK) {
72 const PPB_FileChooser_Dev_0_5* chooser =
73 get_interface<PPB_FileChooser_Dev_0_5>();
74 while (PP_Resource cur = chooser->GetNextChosenFile(data->file_chooser))
75 selected_files.push_back(cur);
76 }
77
78 // Need to issue the "GetDataBuffer" even for error cases & when the
79 // number of items is 0.
80 void* output_buf = data->output.GetDataBuffer(
81 data->output.user_data,
82 selected_files.size(), sizeof(PP_Resource));
83 if (output_buf) {
84 if (!selected_files.empty()) {
85 memcpy(output_buf, &selected_files[0],
86 sizeof(PP_Resource) * selected_files.size());
87 }
88 } else {
89 // Error allocating, need to free the resource IDs.
90 for (size_t i = 0; i < selected_files.size(); i++)
91 Module::Get()->core()->ReleaseResource(selected_files[i]);
92 }
93
94 // Now execute the original callback.
95 PP_RunCompletionCallback(&data->original_callback, result);
96 delete data;
50 } 97 }
51 98
52 } // namespace pp 99 } // namespace pp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698