diff options
author | nhiroki@chromium.org <nhiroki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-10 11:34:12 +0000 |
---|---|---|
committer | nhiroki@chromium.org <nhiroki@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-10 11:34:12 +0000 |
commit | 491af3c6d9727468104785d3df5b0583025f7420 (patch) | |
tree | 09e29b9e6d59220c7c22db94bbd869c9ddd62dd5 /ppapi/cpp/file_ref.cc | |
parent | 021b50df6cc6fa48432c664cdb04219edde01cac (diff) | |
download | chromium_src-491af3c6d9727468104785d3df5b0583025f7420.zip chromium_src-491af3c6d9727468104785d3df5b0583025f7420.tar.gz chromium_src-491af3c6d9727468104785d3df5b0583025f7420.tar.bz2 |
[Retry] PPAPI: Add new PPB_FileRef.MakeDirectory to support exclusive operation
Original Review: https://codereview.chromium.org/113363004/
Current PPB_FileRef.MakeDirectory returns PP_OK if a directory exists on
the given path. This makes it difficult to create POSIX compatible API on
top of PPAPI.
This change introduces new PPB_FileRef.MakeDirectory as dev channel API.
That makes a new directory according to the given PP_MakeDirectoryFlags
values. The flags provide exclusive operation option. If exclusive flag
is specified and a directory exists on the given path, the function fails
and returns PP_ERROR_FILEEXISTS.
BUG=314879
TEST=browser_tests
TBR=dmichael@chromium.org,yzshen@chromium.org,tsepez@chromium.org
Review URL: https://codereview.chromium.org/131403004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@244148 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/cpp/file_ref.cc')
-rw-r--r-- | ppapi/cpp/file_ref.cc | 91 |
1 files changed, 65 insertions, 26 deletions
diff --git a/ppapi/cpp/file_ref.cc b/ppapi/cpp/file_ref.cc index 0bc9487..f9294a7 100644 --- a/ppapi/cpp/file_ref.cc +++ b/ppapi/cpp/file_ref.cc @@ -4,6 +4,7 @@ #include "ppapi/cpp/file_ref.h" +#include "ppapi/c/pp_bool.h" #include "ppapi/c/pp_errors.h" #include "ppapi/cpp/completion_callback.h" #include "ppapi/cpp/directory_entry.h" @@ -22,6 +23,10 @@ template <> const char* interface_name<PPB_FileRef_1_1>() { return PPB_FILEREF_INTERFACE_1_1; } +template <> const char* interface_name<PPB_FileRef_1_2>() { + return PPB_FILEREF_INTERFACE_1_2; +} + } // namespace FileRef::FileRef(PP_Resource resource) : Resource(resource) { @@ -32,7 +37,10 @@ FileRef::FileRef(PassRef, PP_Resource resource) : Resource(PASS_REF, resource) { FileRef::FileRef(const FileSystem& file_system, const char* path) { - if (has_interface<PPB_FileRef_1_1>()) { + if (has_interface<PPB_FileRef_1_2>()) { + PassRefFromConstructor(get_interface<PPB_FileRef_1_2>()->Create( + file_system.pp_resource(), path)); + } else if (has_interface<PPB_FileRef_1_1>()) { PassRefFromConstructor(get_interface<PPB_FileRef_1_1>()->Create( file_system.pp_resource(), path)); } else if (has_interface<PPB_FileRef_1_0>()) { @@ -46,6 +54,8 @@ FileRef::FileRef(const FileRef& other) } PP_FileSystemType FileRef::GetFileSystemType() const { + if (has_interface<PPB_FileRef_1_2>()) + return get_interface<PPB_FileRef_1_2>()->GetFileSystemType(pp_resource()); if (has_interface<PPB_FileRef_1_1>()) return get_interface<PPB_FileRef_1_1>()->GetFileSystemType(pp_resource()); if (has_interface<PPB_FileRef_1_0>()) @@ -54,6 +64,10 @@ PP_FileSystemType FileRef::GetFileSystemType() const { } Var FileRef::GetName() const { + if (has_interface<PPB_FileRef_1_2>()) { + return Var(PASS_REF, + get_interface<PPB_FileRef_1_2>()->GetName(pp_resource())); + } if (has_interface<PPB_FileRef_1_1>()) { return Var(PASS_REF, get_interface<PPB_FileRef_1_1>()->GetName(pp_resource())); @@ -66,6 +80,10 @@ Var FileRef::GetName() const { } Var FileRef::GetPath() const { + if (has_interface<PPB_FileRef_1_2>()) { + return Var(PASS_REF, + get_interface<PPB_FileRef_1_2>()->GetPath(pp_resource())); + } if (has_interface<PPB_FileRef_1_1>()) { return Var(PASS_REF, get_interface<PPB_FileRef_1_1>()->GetPath(pp_resource())); @@ -78,6 +96,10 @@ Var FileRef::GetPath() const { } FileRef FileRef::GetParent() const { + if (has_interface<PPB_FileRef_1_2>()) { + return FileRef(PASS_REF, + get_interface<PPB_FileRef_1_2>()->GetParent(pp_resource())); + } if (has_interface<PPB_FileRef_1_1>()) { return FileRef(PASS_REF, get_interface<PPB_FileRef_1_1>()->GetParent(pp_resource())); @@ -89,34 +111,28 @@ FileRef FileRef::GetParent() const { return FileRef(); } -int32_t FileRef::MakeDirectory(const CompletionCallback& cc) { - if (has_interface<PPB_FileRef_1_1>()) { - return get_interface<PPB_FileRef_1_1>()->MakeDirectory( - pp_resource(), - PP_FALSE, // make_ancestors - cc.pp_completion_callback()); - } - if (has_interface<PPB_FileRef_1_0>()) { - return get_interface<PPB_FileRef_1_0>()->MakeDirectory( +int32_t FileRef::MakeDirectory(int32_t make_directory_flags, + const CompletionCallback& cc) { + if (has_interface<PPB_FileRef_1_2>()) { + return get_interface<PPB_FileRef_1_2>()->MakeDirectory( pp_resource(), - PP_FALSE, // make_ancestors + make_directory_flags, cc.pp_completion_callback()); } - return cc.MayForce(PP_ERROR_NOINTERFACE); -} - -int32_t FileRef::MakeDirectoryIncludingAncestors( - const CompletionCallback& cc) { if (has_interface<PPB_FileRef_1_1>()) { + if (make_directory_flags & ~PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS) + return cc.MayForce(PP_ERROR_NOTSUPPORTED); return get_interface<PPB_FileRef_1_1>()->MakeDirectory( pp_resource(), - PP_TRUE, // make_ancestors + PP_FromBool(make_directory_flags & PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS), cc.pp_completion_callback()); } if (has_interface<PPB_FileRef_1_0>()) { + if (make_directory_flags & ~PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS) + return cc.MayForce(PP_ERROR_NOTSUPPORTED); return get_interface<PPB_FileRef_1_0>()->MakeDirectory( pp_resource(), - PP_TRUE, // make_ancestors + PP_FromBool(make_directory_flags & PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS), cc.pp_completion_callback()); } return cc.MayForce(PP_ERROR_NOINTERFACE); @@ -125,6 +141,11 @@ int32_t FileRef::MakeDirectoryIncludingAncestors( int32_t FileRef::Touch(PP_Time last_access_time, PP_Time last_modified_time, const CompletionCallback& cc) { + if (has_interface<PPB_FileRef_1_2>()) { + return get_interface<PPB_FileRef_1_2>()->Touch( + pp_resource(), last_access_time, last_modified_time, + cc.pp_completion_callback()); + } if (has_interface<PPB_FileRef_1_1>()) { return get_interface<PPB_FileRef_1_1>()->Touch( pp_resource(), last_access_time, last_modified_time, @@ -139,6 +160,10 @@ int32_t FileRef::Touch(PP_Time last_access_time, } int32_t FileRef::Delete(const CompletionCallback& cc) { + if (has_interface<PPB_FileRef_1_2>()) { + return get_interface<PPB_FileRef_1_2>()->Delete( + pp_resource(), cc.pp_completion_callback()); + } if (has_interface<PPB_FileRef_1_1>()) { return get_interface<PPB_FileRef_1_1>()->Delete( pp_resource(), cc.pp_completion_callback()); @@ -152,6 +177,10 @@ int32_t FileRef::Delete(const CompletionCallback& cc) { int32_t FileRef::Rename(const FileRef& new_file_ref, const CompletionCallback& cc) { + if (has_interface<PPB_FileRef_1_2>()) { + return get_interface<PPB_FileRef_1_2>()->Rename( + pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback()); + } if (has_interface<PPB_FileRef_1_1>()) { return get_interface<PPB_FileRef_1_1>()->Rename( pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback()); @@ -164,19 +193,29 @@ int32_t FileRef::Rename(const FileRef& new_file_ref, } int32_t FileRef::Query(const CompletionCallbackWithOutput<PP_FileInfo>& cc) { - if (!has_interface<PPB_FileRef_1_1>()) - return cc.MayForce(PP_ERROR_NOINTERFACE); - return get_interface<PPB_FileRef_1_1>()->Query( - pp_resource(), cc.output(), cc.pp_completion_callback()); + if (has_interface<PPB_FileRef_1_2>()) { + return get_interface<PPB_FileRef_1_2>()->Query( + pp_resource(), cc.output(), cc.pp_completion_callback()); + } + if (has_interface<PPB_FileRef_1_1>()) { + return get_interface<PPB_FileRef_1_1>()->Query( + pp_resource(), cc.output(), cc.pp_completion_callback()); + } + return cc.MayForce(PP_ERROR_NOINTERFACE); } int32_t FileRef::ReadDirectoryEntries( const CompletionCallbackWithOutput<std::vector<DirectoryEntry> >& callback) { - if (!has_interface<PPB_FileRef_1_1>()) - return callback.MayForce(PP_ERROR_NOINTERFACE); - return get_interface<PPB_FileRef_1_1>()->ReadDirectoryEntries( - pp_resource(), callback.output(), callback.pp_completion_callback()); + if (has_interface<PPB_FileRef_1_2>()) { + return get_interface<PPB_FileRef_1_2>()->ReadDirectoryEntries( + pp_resource(), callback.output(), callback.pp_completion_callback()); + } + if (has_interface<PPB_FileRef_1_1>()) { + return get_interface<PPB_FileRef_1_1>()->ReadDirectoryEntries( + pp_resource(), callback.output(), callback.pp_completion_callback()); + } + return callback.MayForce(PP_ERROR_NOINTERFACE); } } // namespace pp |