diff options
Diffstat (limited to 'ppapi/proxy')
-rw-r--r-- | ppapi/proxy/directory_reader_resource.cc | 78 | ||||
-rw-r--r-- | ppapi/proxy/directory_reader_resource.h | 23 |
2 files changed, 37 insertions, 64 deletions
diff --git a/ppapi/proxy/directory_reader_resource.cc b/ppapi/proxy/directory_reader_resource.cc index 99075a3..17826d03 100644 --- a/ppapi/proxy/directory_reader_resource.cc +++ b/ppapi/proxy/directory_reader_resource.cc @@ -21,13 +21,22 @@ using ppapi::proxy::PPB_FileRef_Proxy; namespace ppapi { namespace proxy { +namespace { + +void ReleaseEntries(const std::vector<PP_DirectoryEntry_Dev>& entries) { + ResourceTracker* tracker = PpapiGlobals::Get()->GetResourceTracker(); + for (std::vector<PP_DirectoryEntry_Dev>::const_iterator it = entries.begin(); + it != entries.end(); ++it) + tracker->ReleaseResource(it->file_ref); +} + +} // namespace + DirectoryReaderResource::DirectoryReaderResource( Connection connection, PP_Instance instance, PP_Resource directory_ref) - : PluginResource(connection, instance), - output_(NULL), - did_receive_get_entries_reply_(false) { + : PluginResource(connection, instance) { directory_resource_ = PpapiGlobals::Get()->GetResourceTracker()->GetResource(directory_ref); } @@ -40,18 +49,14 @@ DirectoryReaderResource::AsPPB_DirectoryReader_API() { return this; } -int32_t DirectoryReaderResource::GetNextEntry( - PP_DirectoryEntry_Dev* entry, +int32_t DirectoryReaderResource::ReadEntries( + const PP_ArrayOutput& output, scoped_refptr<TrackedCallback> callback) { if (TrackedCallback::IsPending(callback_)) return PP_ERROR_INPROGRESS; - output_ = entry; callback_ = callback; - if (FillUpEntry()) - return PP_OK; - if (!sent_create_to_renderer()) SendCreate(RENDERER, PpapiHostMsg_DirectoryReader_Create()); @@ -59,61 +64,44 @@ int32_t DirectoryReaderResource::GetNextEntry( directory_resource_->host_resource()); Call<PpapiPluginMsg_DirectoryReader_GetEntriesReply>( RENDERER, msg, - base::Bind(&DirectoryReaderResource::OnPluginMsgGetEntriesReply, this)); + base::Bind(&DirectoryReaderResource::OnPluginMsgGetEntriesReply, + this, output)); return PP_OK_COMPLETIONPENDING; } void DirectoryReaderResource::OnPluginMsgGetEntriesReply( + const PP_ArrayOutput& output, const ResourceMessageReplyParams& params, const std::vector<ppapi::PPB_FileRef_CreateInfo>& infos, const std::vector<PP_FileType>& file_types) { CHECK_EQ(infos.size(), file_types.size()); - did_receive_get_entries_reply_ = true; + std::vector<PP_DirectoryEntry_Dev> entries; for (std::vector<ppapi::PPB_FileRef_CreateInfo>::size_type i = 0; i < infos.size(); ++i) { - DirectoryEntry entry; - entry.file_resource = ScopedPPResource( - ScopedPPResource::PassRef(), - PPB_FileRef_Proxy::DeserializeFileRef(infos[i])); + PP_DirectoryEntry_Dev entry; + entry.file_ref = PPB_FileRef_Proxy::DeserializeFileRef(infos[i]); entry.file_type = file_types[i]; - entries_.push(entry); + entries.push_back(entry); } - if (!TrackedCallback::IsPending(callback_)) + if (!TrackedCallback::IsPending(callback_)) { + ReleaseEntries(entries); + entries.clear(); return; - - FillUpEntry(); - callback_->Run(params.result()); -} - -bool DirectoryReaderResource::FillUpEntry() { - DCHECK(output_); - - if (!did_receive_get_entries_reply_) - return false; - - if (output_->file_ref) { - // Release an existing file reference before the next reference is stored. - // (see the API doc) - PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource( - output_->file_ref); } - if (!entries_.empty()) { - DirectoryEntry entry = entries_.front(); - entries_.pop(); - output_->file_ref = entry.file_resource.Release(); - output_->file_type = entry.file_type; - output_ = NULL; - return true; + ArrayWriter writer(output); + if (!writer.is_valid()) { + ReleaseEntries(entries); + entries.clear(); + callback_->Run(PP_ERROR_FAILED); + return; } - // Set the reference to zero to indicates reaching the end of the directory. - output_->file_ref = 0; - output_->file_type = PP_FILETYPE_OTHER; - output_ = NULL; - return true; + writer.StoreVector(entries); + entries.clear(); + callback_->Run(params.result()); } } // namespace proxy diff --git a/ppapi/proxy/directory_reader_resource.h b/ppapi/proxy/directory_reader_resource.h index b79993a..e532414 100644 --- a/ppapi/proxy/directory_reader_resource.h +++ b/ppapi/proxy/directory_reader_resource.h @@ -5,16 +5,15 @@ #ifndef PPAPI_PROXY_DIRECTORY_READER_RESOURCE_H_ #define PPAPI_PROXY_DIRECTORY_READER_RESOURCE_H_ -#include <queue> #include <vector> #include "base/basictypes.h" #include "base/memory/ref_counted.h" #include "ppapi/proxy/plugin_resource.h" #include "ppapi/proxy/ppapi_proxy_export.h" +#include "ppapi/shared_impl/array_writer.h" #include "ppapi/shared_impl/ppb_file_ref_shared.h" #include "ppapi/shared_impl/resource.h" -#include "ppapi/shared_impl/scoped_pp_resource.h" #include "ppapi/thunk/ppb_directory_reader_api.h" namespace ppapi { @@ -36,32 +35,18 @@ class PPAPI_PROXY_EXPORT DirectoryReaderResource virtual thunk::PPB_DirectoryReader_API* AsPPB_DirectoryReader_API() OVERRIDE; // PPB_DirectoryReader_API. - virtual int32_t GetNextEntry( - PP_DirectoryEntry_Dev* entry, + virtual int32_t ReadEntries( + const PP_ArrayOutput& output, scoped_refptr<TrackedCallback> callback) OVERRIDE; private: - struct DirectoryEntry { - ScopedPPResource file_resource; - PP_FileType file_type; - }; - void OnPluginMsgGetEntriesReply( + const PP_ArrayOutput& output, const ResourceMessageReplyParams& params, const std::vector<ppapi::PPB_FileRef_CreateInfo>& infos, const std::vector<PP_FileType>& file_types); - // Fills up an output with the next entry in the directory. If the plugin - // resource did not receive directory entries from the host side, returns - // false. - bool FillUpEntry(); - scoped_refptr<Resource> directory_resource_; - std::queue<DirectoryEntry> entries_; - - PP_DirectoryEntry_Dev* output_; - bool did_receive_get_entries_reply_; - scoped_refptr<TrackedCallback> callback_; DISALLOW_COPY_AND_ASSIGN(DirectoryReaderResource); |