Skip to content

Commit

Permalink
Add Query() support to FileRef.
Browse files Browse the repository at this point in the history
    
This change brings Query() support back to FileRef for in-process and out-of-process plugins.
    
I've added testing for a file that exists and one that doesn't.
    
BUG=170721


Review URL: https://chromiumcodereview.appspot.com/12817009

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@191805 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
teravest@chromium.org committed Apr 2, 2013
1 parent 9c01b40 commit d4edb10
Show file tree
Hide file tree
Showing 16 changed files with 631 additions and 102 deletions.
21 changes: 20 additions & 1 deletion ppapi/api/ppb_file_ref.idl
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
*/

label Chrome {
M14 = 1.0
M14 = 1.0,
M28 = 1.1
};

/**
Expand Down Expand Up @@ -166,5 +167,23 @@ interface PPB_FileRef {
int32_t Rename([in] PP_Resource file_ref,
[in] PP_Resource new_file_ref,
[in] PP_CompletionCallback callback);

/*
* Query() queries info about a file or directory. You must have access to
* read this file or directory if it exists in the external filesystem.
*
* @param[in] file_ref A <code>PP_Resource</code> corresponding to a file
* reference.
* @param[out] info A pointer to a <code>PP_FileInfo</code> which will be
* populated with information about the file or directory.
* @param[in] callback A <code>PP_CompletionCallback</code> to be called upon
* completion of Query().
*
* @return An int32_t containing an error code from <code>pp_errors.h</code>.
*/
[version=1.1]
int32_t Query([in] PP_Resource file_ref,
[out] PP_FileInfo info,
[in] PP_CompletionCallback callback);
};

46 changes: 42 additions & 4 deletions ppapi/c/ppb_file_ref.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* found in the LICENSE file.
*/

/* From ppb_file_ref.idl modified Wed Oct 5 14:06:02 2011. */
/* From ppb_file_ref.idl modified Thu Mar 7 12:02:53 2013. */

#ifndef PPAPI_C_PPB_FILE_REF_H_
#define PPAPI_C_PPB_FILE_REF_H_
Expand All @@ -18,7 +18,8 @@
#include "ppapi/c/pp_var.h"

#define PPB_FILEREF_INTERFACE_1_0 "PPB_FileRef;1.0"
#define PPB_FILEREF_INTERFACE PPB_FILEREF_INTERFACE_1_0
#define PPB_FILEREF_INTERFACE_1_1 "PPB_FileRef;1.1"
#define PPB_FILEREF_INTERFACE PPB_FILEREF_INTERFACE_1_1

/**
* @file
Expand All @@ -36,7 +37,7 @@
* a file system. This struct contains a <code>PP_FileSystemType</code>
* identifier and a file path string.
*/
struct PPB_FileRef_1_0 {
struct PPB_FileRef_1_1 {
/**
* Create() creates a weak pointer to a file in the given file system. File
* paths are POSIX style.
Expand Down Expand Up @@ -177,9 +178,46 @@ struct PPB_FileRef_1_0 {
int32_t (*Rename)(PP_Resource file_ref,
PP_Resource new_file_ref,
struct PP_CompletionCallback callback);
/*
* Query() queries info about a file or directory. You must have access to
* read this file or directory if it exists in the external filesystem.
*
* @param[in] file_ref A <code>PP_Resource</code> corresponding to a file
* reference.
* @param[out] info A pointer to a <code>PP_FileInfo</code> which will be
* populated with information about the file or directory.
* @param[in] callback A <code>PP_CompletionCallback</code> to be called upon
* completion of Query().
*
* @return An int32_t containing an error code from <code>pp_errors.h</code>.
*/
int32_t (*Query)(PP_Resource file_ref,
struct PP_FileInfo* info,
struct PP_CompletionCallback callback);
};

typedef struct PPB_FileRef_1_0 PPB_FileRef;
typedef struct PPB_FileRef_1_1 PPB_FileRef;

struct PPB_FileRef_1_0 {
PP_Resource (*Create)(PP_Resource file_system, const char* path);
PP_Bool (*IsFileRef)(PP_Resource resource);
PP_FileSystemType (*GetFileSystemType)(PP_Resource file_ref);
struct PP_Var (*GetName)(PP_Resource file_ref);
struct PP_Var (*GetPath)(PP_Resource file_ref);
PP_Resource (*GetParent)(PP_Resource file_ref);
int32_t (*MakeDirectory)(PP_Resource directory_ref,
PP_Bool make_ancestors,
struct PP_CompletionCallback callback);
int32_t (*Touch)(PP_Resource file_ref,
PP_Time last_access_time,
PP_Time last_modified_time,
struct PP_CompletionCallback callback);
int32_t (*Delete)(PP_Resource file_ref,
struct PP_CompletionCallback callback);
int32_t (*Rename)(PP_Resource file_ref,
PP_Resource new_file_ref,
struct PP_CompletionCallback callback);
};
/**
* @}
*/
Expand Down
148 changes: 105 additions & 43 deletions ppapi/cpp/file_ref.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ template <> const char* interface_name<PPB_FileRef_1_0>() {
return PPB_FILEREF_INTERFACE_1_0;
}

template <> const char* interface_name<PPB_FileRef_1_1>() {
return PPB_FILEREF_INTERFACE_1_1;
}

} // namespace

FileRef::FileRef(PP_Resource resource) : Resource(resource) {
Expand All @@ -28,85 +32,143 @@ 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_0>())
return;
PassRefFromConstructor(get_interface<PPB_FileRef_1_0>()->Create(
file_system.pp_resource(), path));
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>()) {
PassRefFromConstructor(get_interface<PPB_FileRef_1_0>()->Create(
file_system.pp_resource(), path));
}
}

FileRef::FileRef(const FileRef& other)
: Resource(other) {
}

PP_FileSystemType FileRef::GetFileSystemType() const {
if (!has_interface<PPB_FileRef_1_0>())
return PP_FILESYSTEMTYPE_EXTERNAL;
return get_interface<PPB_FileRef_1_0>()->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>())
return get_interface<PPB_FileRef_1_0>()->GetFileSystemType(pp_resource());
return PP_FILESYSTEMTYPE_EXTERNAL;
}

Var FileRef::GetName() const {
if (!has_interface<PPB_FileRef_1_0>())
return Var();
return Var(PASS_REF,
get_interface<PPB_FileRef_1_0>()->GetName(pp_resource()));
if (has_interface<PPB_FileRef_1_1>()) {
return Var(PASS_REF,
get_interface<PPB_FileRef_1_1>()->GetName(pp_resource()));
}
if (has_interface<PPB_FileRef_1_0>()) {
return Var(PASS_REF,
get_interface<PPB_FileRef_1_0>()->GetName(pp_resource()));
}
return Var();
}

Var FileRef::GetPath() const {
if (!has_interface<PPB_FileRef_1_0>())
return Var();
return Var(PASS_REF,
get_interface<PPB_FileRef_1_0>()->GetPath(pp_resource()));
if (has_interface<PPB_FileRef_1_1>()) {
return Var(PASS_REF,
get_interface<PPB_FileRef_1_1>()->GetPath(pp_resource()));
}
if (has_interface<PPB_FileRef_1_0>()) {
return Var(PASS_REF,
get_interface<PPB_FileRef_1_0>()->GetPath(pp_resource()));
}
return Var();
}

FileRef FileRef::GetParent() const {
if (!has_interface<PPB_FileRef_1_0>())
return FileRef();
return FileRef(PASS_REF,
get_interface<PPB_FileRef_1_0>()->GetParent(pp_resource()));
if (has_interface<PPB_FileRef_1_1>()) {
return FileRef(PASS_REF,
get_interface<PPB_FileRef_1_1>()->GetParent(pp_resource()));
}
if (has_interface<PPB_FileRef_1_0>()) {
return FileRef(PASS_REF,
get_interface<PPB_FileRef_1_0>()->GetParent(pp_resource()));
}
return FileRef();
}

int32_t FileRef::MakeDirectory(const CompletionCallback& cc) {
if (!has_interface<PPB_FileRef_1_0>())
return cc.MayForce(PP_ERROR_NOINTERFACE);
return get_interface<PPB_FileRef_1_0>()->MakeDirectory(
pp_resource(),
PP_FALSE, // make_ancestors
cc.pp_completion_callback());
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(
pp_resource(),
PP_FALSE, // make_ancestors
cc.pp_completion_callback());
}
return cc.MayForce(PP_ERROR_NOINTERFACE);
}

int32_t FileRef::MakeDirectoryIncludingAncestors(
const CompletionCallback& cc) {
if (!has_interface<PPB_FileRef_1_0>())
return cc.MayForce(PP_ERROR_NOINTERFACE);
return get_interface<PPB_FileRef_1_0>()->MakeDirectory(
pp_resource(),
PP_TRUE, // make_ancestors
cc.pp_completion_callback());
if (has_interface<PPB_FileRef_1_1>()) {
return get_interface<PPB_FileRef_1_1>()->MakeDirectory(
pp_resource(),
PP_TRUE, // make_ancestors
cc.pp_completion_callback());
}
if (has_interface<PPB_FileRef_1_0>()) {
return get_interface<PPB_FileRef_1_0>()->MakeDirectory(
pp_resource(),
PP_TRUE, // make_ancestors
cc.pp_completion_callback());
}
return cc.MayForce(PP_ERROR_NOINTERFACE);
}

int32_t FileRef::Touch(PP_Time last_access_time,
PP_Time last_modified_time,
const CompletionCallback& cc) {
if (!has_interface<PPB_FileRef_1_0>())
return cc.MayForce(PP_ERROR_NOINTERFACE);
return get_interface<PPB_FileRef_1_0>()->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,
cc.pp_completion_callback());
}
if (has_interface<PPB_FileRef_1_0>()) {
return get_interface<PPB_FileRef_1_0>()->Touch(
pp_resource(), last_access_time, last_modified_time,
cc.pp_completion_callback());
}
return cc.MayForce(PP_ERROR_NOINTERFACE);
}

int32_t FileRef::Delete(const CompletionCallback& cc) {
if (!has_interface<PPB_FileRef_1_0>())
return cc.MayForce(PP_ERROR_NOINTERFACE);
return get_interface<PPB_FileRef_1_0>()->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());
}
if (has_interface<PPB_FileRef_1_0>()) {
return get_interface<PPB_FileRef_1_0>()->Delete(
pp_resource(), cc.pp_completion_callback());
}
return cc.MayForce(PP_ERROR_NOINTERFACE);
}

int32_t FileRef::Rename(const FileRef& new_file_ref,
const CompletionCallback& cc) {
if (!has_interface<PPB_FileRef_1_0>())
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());
}
if (has_interface<PPB_FileRef_1_0>()) {
return get_interface<PPB_FileRef_1_0>()->Rename(
pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback());
}
return cc.MayForce(PP_ERROR_NOINTERFACE);
}

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_0>()->Rename(
pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback());
return get_interface<PPB_FileRef_1_1>()->Query(
pp_resource(), cc.output(), cc.pp_completion_callback());
}


} // namespace pp
14 changes: 13 additions & 1 deletion ppapi/cpp/file_ref.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#ifndef PPAPI_CPP_FILE_REF_H_
#define PPAPI_CPP_FILE_REF_H_

#include "ppapi/c/pp_file_info.h"
#include "ppapi/c/pp_stdint.h"
#include "ppapi/c/ppb_file_ref.h"
#include "ppapi/cpp/resource.h"
Expand All @@ -16,8 +17,9 @@

namespace pp {

class CompletionCallback;
class FileSystem;
class CompletionCallback;
template <typename T> class CompletionCallbackWithOutput;

/// The <code>FileRef</code> class represents a "weak pointer" to a file in
/// a file system.
Expand Down Expand Up @@ -143,6 +145,16 @@ class FileRef : public Resource {
///
/// @return An int32_t containing an error code from <code>pp_errors.h</code>.
int32_t Rename(const FileRef& new_file_ref, const CompletionCallback& cc);

///
/// Query() queries info about a file or directory. You must have access to
/// read this file or directory if it exists in the external filesystem.
///
/// @param[in] callback A <code>CompletionCallbackWithOutput</code>
/// to be called upon completion of Query().
///
/// @return An int32_t containing an error code from <code>pp_errors.h</code>.
int32_t Query(const CompletionCallbackWithOutput<PP_FileInfo>& callback);
};

} // namespace pp
Expand Down
Loading

0 comments on commit d4edb10

Please sign in to comment.