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

Side by Side Diff: webkit/plugins/ppapi/ppb_directory_reader_impl.cc

Issue 7082036: Convert more interfaces to the new thunk system. (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 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 "webkit/plugins/ppapi/ppb_directory_reader_impl.h" 5 #include "webkit/plugins/ppapi/ppb_directory_reader_impl.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/utf_string_conversions.h" 8 #include "base/utf_string_conversions.h"
9 #include "ppapi/c/pp_completion_callback.h" 9 #include "ppapi/c/pp_completion_callback.h"
10 #include "ppapi/c/pp_errors.h" 10 #include "ppapi/c/pp_errors.h"
11 #include "ppapi/c/dev/ppb_directory_reader_dev.h" 11 #include "ppapi/c/dev/ppb_directory_reader_dev.h"
12 #include "ppapi/thunk/enter.h"
13 #include "ppapi/thunk/ppb_file_ref_api.h"
12 #include "webkit/plugins/ppapi/common.h" 14 #include "webkit/plugins/ppapi/common.h"
13 #include "webkit/plugins/ppapi/file_callbacks.h" 15 #include "webkit/plugins/ppapi/file_callbacks.h"
14 #include "webkit/plugins/ppapi/plugin_delegate.h" 16 #include "webkit/plugins/ppapi/plugin_delegate.h"
15 #include "webkit/plugins/ppapi/plugin_module.h" 17 #include "webkit/plugins/ppapi/plugin_module.h"
16 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" 18 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
17 #include "webkit/plugins/ppapi/ppb_file_ref_impl.h" 19 #include "webkit/plugins/ppapi/ppb_file_ref_impl.h"
18 #include "webkit/plugins/ppapi/ppb_file_system_impl.h" 20 #include "webkit/plugins/ppapi/ppb_file_system_impl.h"
19 #include "webkit/plugins/ppapi/resource_tracker.h" 21 #include "webkit/plugins/ppapi/resource_tracker.h"
20 22
23 using ::ppapi::thunk::EnterResourceNoLock;
24 using ::ppapi::thunk::PPB_DirectoryReader_API;
25 using ::ppapi::thunk::PPB_FileRef_API;
26
21 namespace webkit { 27 namespace webkit {
22 namespace ppapi { 28 namespace ppapi {
23 29
24 namespace { 30 namespace {
25 31
26 std::string FilePathStringToUTF8String(const FilePath::StringType& str) { 32 std::string FilePathStringToUTF8String(const FilePath::StringType& str) {
27 #if defined(OS_WIN) 33 #if defined(OS_WIN)
28 return WideToUTF8(str); 34 return WideToUTF8(str);
29 #elif defined(OS_POSIX) 35 #elif defined(OS_POSIX)
30 return str; 36 return str;
31 #else 37 #else
32 #error "Unsupported platform." 38 #error "Unsupported platform."
33 #endif 39 #endif
34 } 40 }
35 41
36 FilePath::StringType UTF8StringToFilePathString(const std::string& str) { 42 FilePath::StringType UTF8StringToFilePathString(const std::string& str) {
37 #if defined(OS_WIN) 43 #if defined(OS_WIN)
38 return UTF8ToWide(str); 44 return UTF8ToWide(str);
39 #elif defined(OS_POSIX) 45 #elif defined(OS_POSIX)
40 return str; 46 return str;
41 #else 47 #else
42 #error "Unsupported platform." 48 #error "Unsupported platform."
43 #endif 49 #endif
44 } 50 }
45 51
46 PP_Resource Create(PP_Resource directory_ref_id) {
47 scoped_refptr<PPB_FileRef_Impl> directory_ref(
48 Resource::GetAs<PPB_FileRef_Impl>(directory_ref_id));
49 if (!directory_ref)
50 return 0;
51
52 PPB_DirectoryReader_Impl* reader =
53 new PPB_DirectoryReader_Impl(directory_ref);
54 return reader->GetReference();
55 }
56
57 PP_Bool IsDirectoryReader(PP_Resource resource) {
58 return BoolToPPBool(!!Resource::GetAs<PPB_DirectoryReader_Impl>(resource));
59 }
60
61 int32_t GetNextEntry(PP_Resource reader_id,
62 PP_DirectoryEntry_Dev* entry,
63 PP_CompletionCallback callback) {
64 scoped_refptr<PPB_DirectoryReader_Impl> reader(
65 Resource::GetAs<PPB_DirectoryReader_Impl>(reader_id));
66 if (!reader)
67 return PP_ERROR_BADRESOURCE;
68
69 return reader->GetNextEntry(entry, callback);
70 }
71
72 const PPB_DirectoryReader_Dev ppb_directoryreader = {
73 &Create,
74 &IsDirectoryReader,
75 &GetNextEntry
76 };
77
78 } // namespace 52 } // namespace
79 53
80 PPB_DirectoryReader_Impl::PPB_DirectoryReader_Impl( 54 PPB_DirectoryReader_Impl::PPB_DirectoryReader_Impl(
81 PPB_FileRef_Impl* directory_ref) 55 PPB_FileRef_Impl* directory_ref)
82 : Resource(directory_ref->instance()), 56 : Resource(directory_ref->instance()),
83 directory_ref_(directory_ref), 57 directory_ref_(directory_ref),
84 has_more_(true), 58 has_more_(true),
85 entry_(NULL) { 59 entry_(NULL) {
86 } 60 }
87 61
88 PPB_DirectoryReader_Impl::~PPB_DirectoryReader_Impl() { 62 PPB_DirectoryReader_Impl::~PPB_DirectoryReader_Impl() {
89 } 63 }
90 64
91 const PPB_DirectoryReader_Dev* PPB_DirectoryReader_Impl::GetInterface() { 65 // static
92 return &ppb_directoryreader; 66 PP_Resource PPB_DirectoryReader_Impl::Create(PP_Resource directory_ref) {
67 EnterResourceNoLock<PPB_FileRef_API> enter(directory_ref, true);
68 if (enter.failed())
69 return 0;
70
71 PPB_DirectoryReader_Impl* reader = new PPB_DirectoryReader_Impl(
72 static_cast<PPB_FileRef_Impl*>(enter.object()));
73 return reader->GetReference();
93 } 74 }
94 75
95 PPB_DirectoryReader_Impl* 76 PPB_DirectoryReader_Impl*
96 PPB_DirectoryReader_Impl::AsPPB_DirectoryReader_Impl() { 77 PPB_DirectoryReader_Impl::AsPPB_DirectoryReader_Impl() {
97 return this; 78 return this;
98 } 79 }
99 80
81 PPB_DirectoryReader_API* PPB_DirectoryReader_Impl::AsPPB_DirectoryReader_API() {
82 return this;
83 }
84
100 int32_t PPB_DirectoryReader_Impl::GetNextEntry( 85 int32_t PPB_DirectoryReader_Impl::GetNextEntry(
101 PP_DirectoryEntry_Dev* entry, 86 PP_DirectoryEntry_Dev* entry,
102 PP_CompletionCallback callback) { 87 PP_CompletionCallback callback) {
103 if (directory_ref_->GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) 88 if (directory_ref_->GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL)
104 return PP_ERROR_FAILED; 89 return PP_ERROR_FAILED;
105 90
106 entry_ = entry; 91 entry_ = entry;
107 if (FillUpEntry()) { 92 if (FillUpEntry()) {
108 entry_ = NULL; 93 entry_ = NULL;
109 return PP_OK; 94 return PP_OK;
110 } 95 }
111 96
112 PluginInstance* instance = directory_ref_->GetFileSystem()->instance(); 97 PluginInstance* instance = directory_ref_->instance();
113 PP_Resource resource_id = GetReferenceNoAddRef(); 98 PP_Resource resource_id = GetReferenceNoAddRef();
114 DCHECK(resource_id != 0); 99 DCHECK(resource_id != 0);
115 if (!instance->delegate()->ReadDirectory( 100 if (!instance->delegate()->ReadDirectory(
116 directory_ref_->GetFileSystemURL(), 101 directory_ref_->GetFileSystemURL(),
117 new FileCallbacks(instance->module()->AsWeakPtr(), 102 new FileCallbacks(instance->module()->AsWeakPtr(),
118 resource_id, 103 resource_id,
119 callback, NULL, NULL, this))) 104 callback, NULL, NULL, this)))
120 return PP_ERROR_FAILED; 105 return PP_ERROR_FAILED;
121 106
122 return PP_OK_COMPLETIONPENDING; 107 return PP_OK_COMPLETIONPENDING;
123 } 108 }
124 109
125 void PPB_DirectoryReader_Impl::AddNewEntries( 110 void PPB_DirectoryReader_Impl::AddNewEntries(
126 const std::vector<base::FileUtilProxy::Entry>& entries, bool has_more) { 111 const std::vector<base::FileUtilProxy::Entry>& entries, bool has_more) {
127 DCHECK(!entries.empty()); 112 DCHECK(!entries.empty());
128 has_more_ = has_more; 113 has_more_ = has_more;
129 std::string dir_path = directory_ref_->GetPath(); 114 std::string dir_path = directory_ref_->virtual_path();
130 if (dir_path[dir_path.size() - 1] != '/') 115 if (dir_path[dir_path.size() - 1] != '/')
131 dir_path += '/'; 116 dir_path += '/';
132 FilePath::StringType dir_file_path = UTF8StringToFilePathString(dir_path); 117 FilePath::StringType dir_file_path = UTF8StringToFilePathString(dir_path);
133 for (std::vector<base::FileUtilProxy::Entry>::const_iterator it = 118 for (std::vector<base::FileUtilProxy::Entry>::const_iterator it =
134 entries.begin(); it != entries.end(); it++) { 119 entries.begin(); it != entries.end(); it++) {
135 base::FileUtilProxy::Entry entry; 120 base::FileUtilProxy::Entry entry;
136 entry.name = dir_file_path + it->name; 121 entry.name = dir_file_path + it->name;
137 entry.is_directory = it->is_directory; 122 entry.is_directory = it->is_directory;
138 entries_.push(entry); 123 entries_.push(entry);
139 } 124 }
140 125
141 FillUpEntry(); 126 FillUpEntry();
142 entry_ = NULL; 127 entry_ = NULL;
143 } 128 }
144 129
145 bool PPB_DirectoryReader_Impl::FillUpEntry() { 130 bool PPB_DirectoryReader_Impl::FillUpEntry() {
146 DCHECK(entry_); 131 DCHECK(entry_);
147 if (!entries_.empty()) { 132 if (!entries_.empty()) {
148 base::FileUtilProxy::Entry dir_entry = entries_.front(); 133 base::FileUtilProxy::Entry dir_entry = entries_.front();
149 entries_.pop(); 134 entries_.pop();
150 if (entry_->file_ref) 135 if (entry_->file_ref)
151 ResourceTracker::Get()->UnrefResource(entry_->file_ref); 136 ResourceTracker::Get()->UnrefResource(entry_->file_ref);
152 PPB_FileRef_Impl* file_ref = 137 PPB_FileRef_Impl* file_ref =
153 new PPB_FileRef_Impl(instance(), directory_ref_->GetFileSystem(), 138 new PPB_FileRef_Impl(instance(), directory_ref_->file_system(),
154 FilePathStringToUTF8String(dir_entry.name)); 139 FilePathStringToUTF8String(dir_entry.name));
155 entry_->file_ref = file_ref->GetReference(); 140 entry_->file_ref = file_ref->GetReference();
156 entry_->file_type = 141 entry_->file_type =
157 (dir_entry.is_directory ? PP_FILETYPE_DIRECTORY : PP_FILETYPE_REGULAR); 142 (dir_entry.is_directory ? PP_FILETYPE_DIRECTORY : PP_FILETYPE_REGULAR);
158 return true; 143 return true;
159 } 144 }
160 145
161 if (!has_more_) { 146 if (!has_more_) {
162 entry_->file_ref = 0; 147 entry_->file_ref = 0;
163 return true; 148 return true;
164 } 149 }
165 150
166 return false; 151 return false;
167 } 152 }
168 153
169 } // namespace ppapi 154 } // namespace ppapi
170 } // namespace webkit 155 } // namespace webkit
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698