Home | History | Annotate | Download | only in cpp
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ppapi/cpp/file_ref.h"
      6 
      7 #include "ppapi/c/pp_bool.h"
      8 #include "ppapi/c/pp_errors.h"
      9 #include "ppapi/cpp/completion_callback.h"
     10 #include "ppapi/cpp/directory_entry.h"
     11 #include "ppapi/cpp/file_system.h"
     12 #include "ppapi/cpp/module_impl.h"
     13 
     14 namespace pp {
     15 
     16 namespace {
     17 
     18 template <> const char* interface_name<PPB_FileRef_1_0>() {
     19   return PPB_FILEREF_INTERFACE_1_0;
     20 }
     21 
     22 template <> const char* interface_name<PPB_FileRef_1_1>() {
     23   return PPB_FILEREF_INTERFACE_1_1;
     24 }
     25 
     26 template <> const char* interface_name<PPB_FileRef_1_2>() {
     27   return PPB_FILEREF_INTERFACE_1_2;
     28 }
     29 
     30 }  // namespace
     31 
     32 FileRef::FileRef(PP_Resource resource) : Resource(resource) {
     33 }
     34 
     35 FileRef::FileRef(PassRef, PP_Resource resource) : Resource(PASS_REF, resource) {
     36 }
     37 
     38 FileRef::FileRef(const FileSystem& file_system,
     39                  const char* path) {
     40   if (has_interface<PPB_FileRef_1_2>()) {
     41     PassRefFromConstructor(get_interface<PPB_FileRef_1_2>()->Create(
     42         file_system.pp_resource(), path));
     43   } else if (has_interface<PPB_FileRef_1_1>()) {
     44     PassRefFromConstructor(get_interface<PPB_FileRef_1_1>()->Create(
     45         file_system.pp_resource(), path));
     46   } else if (has_interface<PPB_FileRef_1_0>()) {
     47     PassRefFromConstructor(get_interface<PPB_FileRef_1_0>()->Create(
     48         file_system.pp_resource(), path));
     49   }
     50 }
     51 
     52 FileRef::FileRef(const FileRef& other)
     53     : Resource(other) {
     54 }
     55 
     56 PP_FileSystemType FileRef::GetFileSystemType() const {
     57   if (has_interface<PPB_FileRef_1_2>())
     58     return get_interface<PPB_FileRef_1_2>()->GetFileSystemType(pp_resource());
     59   if (has_interface<PPB_FileRef_1_1>())
     60     return get_interface<PPB_FileRef_1_1>()->GetFileSystemType(pp_resource());
     61   if (has_interface<PPB_FileRef_1_0>())
     62     return get_interface<PPB_FileRef_1_0>()->GetFileSystemType(pp_resource());
     63   return PP_FILESYSTEMTYPE_EXTERNAL;
     64 }
     65 
     66 Var FileRef::GetName() const {
     67   if (has_interface<PPB_FileRef_1_2>()) {
     68     return Var(PASS_REF,
     69                get_interface<PPB_FileRef_1_2>()->GetName(pp_resource()));
     70   }
     71   if (has_interface<PPB_FileRef_1_1>()) {
     72     return Var(PASS_REF,
     73                get_interface<PPB_FileRef_1_1>()->GetName(pp_resource()));
     74   }
     75   if (has_interface<PPB_FileRef_1_0>()) {
     76     return Var(PASS_REF,
     77                get_interface<PPB_FileRef_1_0>()->GetName(pp_resource()));
     78   }
     79   return Var();
     80 }
     81 
     82 Var FileRef::GetPath() const {
     83   if (has_interface<PPB_FileRef_1_2>()) {
     84     return Var(PASS_REF,
     85                get_interface<PPB_FileRef_1_2>()->GetPath(pp_resource()));
     86   }
     87   if (has_interface<PPB_FileRef_1_1>()) {
     88     return Var(PASS_REF,
     89                get_interface<PPB_FileRef_1_1>()->GetPath(pp_resource()));
     90   }
     91   if (has_interface<PPB_FileRef_1_0>()) {
     92     return Var(PASS_REF,
     93                get_interface<PPB_FileRef_1_0>()->GetPath(pp_resource()));
     94   }
     95   return Var();
     96 }
     97 
     98 FileRef FileRef::GetParent() const {
     99   if (has_interface<PPB_FileRef_1_2>()) {
    100     return FileRef(PASS_REF,
    101                    get_interface<PPB_FileRef_1_2>()->GetParent(pp_resource()));
    102   }
    103   if (has_interface<PPB_FileRef_1_1>()) {
    104     return FileRef(PASS_REF,
    105                    get_interface<PPB_FileRef_1_1>()->GetParent(pp_resource()));
    106   }
    107   if (has_interface<PPB_FileRef_1_0>()) {
    108     return FileRef(PASS_REF,
    109                    get_interface<PPB_FileRef_1_0>()->GetParent(pp_resource()));
    110   }
    111   return FileRef();
    112 }
    113 
    114 int32_t FileRef::MakeDirectory(int32_t make_directory_flags,
    115                                const CompletionCallback& cc) {
    116   if (has_interface<PPB_FileRef_1_2>()) {
    117     return get_interface<PPB_FileRef_1_2>()->MakeDirectory(
    118         pp_resource(),
    119         make_directory_flags,
    120         cc.pp_completion_callback());
    121   }
    122   if (has_interface<PPB_FileRef_1_1>()) {
    123     if (make_directory_flags & ~PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS)
    124       return cc.MayForce(PP_ERROR_NOTSUPPORTED);
    125     return get_interface<PPB_FileRef_1_1>()->MakeDirectory(
    126         pp_resource(),
    127         PP_FromBool(make_directory_flags & PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS),
    128         cc.pp_completion_callback());
    129   }
    130   if (has_interface<PPB_FileRef_1_0>()) {
    131     if (make_directory_flags & ~PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS)
    132       return cc.MayForce(PP_ERROR_NOTSUPPORTED);
    133     return get_interface<PPB_FileRef_1_0>()->MakeDirectory(
    134         pp_resource(),
    135         PP_FromBool(make_directory_flags & PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS),
    136         cc.pp_completion_callback());
    137   }
    138   return cc.MayForce(PP_ERROR_NOINTERFACE);
    139 }
    140 
    141 int32_t FileRef::Touch(PP_Time last_access_time,
    142                        PP_Time last_modified_time,
    143                        const CompletionCallback& cc) {
    144   if (has_interface<PPB_FileRef_1_2>()) {
    145     return get_interface<PPB_FileRef_1_2>()->Touch(
    146         pp_resource(), last_access_time, last_modified_time,
    147         cc.pp_completion_callback());
    148   }
    149   if (has_interface<PPB_FileRef_1_1>()) {
    150     return get_interface<PPB_FileRef_1_1>()->Touch(
    151         pp_resource(), last_access_time, last_modified_time,
    152         cc.pp_completion_callback());
    153   }
    154   if (has_interface<PPB_FileRef_1_0>()) {
    155     return get_interface<PPB_FileRef_1_0>()->Touch(
    156         pp_resource(), last_access_time, last_modified_time,
    157         cc.pp_completion_callback());
    158   }
    159   return cc.MayForce(PP_ERROR_NOINTERFACE);
    160 }
    161 
    162 int32_t FileRef::Delete(const CompletionCallback& cc) {
    163   if (has_interface<PPB_FileRef_1_2>()) {
    164     return get_interface<PPB_FileRef_1_2>()->Delete(
    165         pp_resource(), cc.pp_completion_callback());
    166   }
    167   if (has_interface<PPB_FileRef_1_1>()) {
    168     return get_interface<PPB_FileRef_1_1>()->Delete(
    169         pp_resource(), cc.pp_completion_callback());
    170   }
    171   if (has_interface<PPB_FileRef_1_0>()) {
    172     return get_interface<PPB_FileRef_1_0>()->Delete(
    173         pp_resource(), cc.pp_completion_callback());
    174   }
    175   return cc.MayForce(PP_ERROR_NOINTERFACE);
    176 }
    177 
    178 int32_t FileRef::Rename(const FileRef& new_file_ref,
    179                         const CompletionCallback& cc) {
    180   if (has_interface<PPB_FileRef_1_2>()) {
    181     return get_interface<PPB_FileRef_1_2>()->Rename(
    182         pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback());
    183   }
    184   if (has_interface<PPB_FileRef_1_1>()) {
    185     return get_interface<PPB_FileRef_1_1>()->Rename(
    186         pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback());
    187   }
    188   if (has_interface<PPB_FileRef_1_0>()) {
    189     return get_interface<PPB_FileRef_1_0>()->Rename(
    190         pp_resource(), new_file_ref.pp_resource(), cc.pp_completion_callback());
    191   }
    192   return cc.MayForce(PP_ERROR_NOINTERFACE);
    193 }
    194 
    195 int32_t FileRef::Query(const CompletionCallbackWithOutput<PP_FileInfo>& cc) {
    196   if (has_interface<PPB_FileRef_1_2>()) {
    197     return get_interface<PPB_FileRef_1_2>()->Query(
    198         pp_resource(), cc.output(), cc.pp_completion_callback());
    199   }
    200   if (has_interface<PPB_FileRef_1_1>()) {
    201     return get_interface<PPB_FileRef_1_1>()->Query(
    202         pp_resource(), cc.output(), cc.pp_completion_callback());
    203   }
    204   return cc.MayForce(PP_ERROR_NOINTERFACE);
    205 }
    206 
    207 int32_t FileRef::ReadDirectoryEntries(
    208     const CompletionCallbackWithOutput<std::vector<DirectoryEntry> >&
    209         callback) {
    210   if (has_interface<PPB_FileRef_1_2>()) {
    211     return get_interface<PPB_FileRef_1_2>()->ReadDirectoryEntries(
    212         pp_resource(), callback.output(), callback.pp_completion_callback());
    213   }
    214   if (has_interface<PPB_FileRef_1_1>()) {
    215     return get_interface<PPB_FileRef_1_1>()->ReadDirectoryEntries(
    216         pp_resource(), callback.output(), callback.pp_completion_callback());
    217   }
    218   return callback.MayForce(PP_ERROR_NOINTERFACE);
    219 }
    220 
    221 }  // namespace pp
    222