12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/flash_file_resource.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ipc/ipc_message.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/file_type_conversion.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_var.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/var.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/enter.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace proxy {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the path that a PPB_FileRef resource references as long as it is an
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PP_FILESYSTEMTYPE_EXTERNAL path. Returns an empty string on error.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string GetPathFromFileRef(PP_Resource file_ref) {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  thunk::EnterResourceNoLock<thunk::PPB_FileRef_API> enter(file_ref, true);
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (enter.failed())
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return std::string();
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (enter.object()->GetFileSystemType() != PP_FILESYSTEMTYPE_EXTERNAL)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return std::string();
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedPPVar var(ScopedPPVar::PassRef(), enter.object()->GetAbsolutePath());
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringVar* string_var = StringVar::FromPPVar(var.get());
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!string_var)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return std::string();
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return string_var->value();
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FlashFileResource::FlashFileResource(Connection connection,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     PP_Instance instance)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : PluginResource(connection, instance) {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SendCreate(BROWSER, PpapiHostMsg_FlashFile_Create());
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FlashFileResource::~FlashFileResource() {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)thunk::PPB_Flash_File_API* FlashFileResource::AsPPB_Flash_File_API() {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return this;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FlashFileResource::OpenFile(PP_Instance /*instance*/,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    const char* path,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    int32_t mode,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    PP_FileHandle* file) {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return OpenFileHelper(path, PepperFilePath::DOMAIN_MODULE_LOCAL, mode, file);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FlashFileResource::RenameFile(PP_Instance /*instance*/,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const char* path_from,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const char* path_to) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PepperFilePath pepper_from(PepperFilePath::DOMAIN_MODULE_LOCAL,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             base::FilePath::FromUTF8Unsafe(path_from));
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PepperFilePath pepper_to(PepperFilePath::DOMAIN_MODULE_LOCAL,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           base::FilePath::FromUTF8Unsafe(path_to));
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t error = SyncCall<IPC::Message>(
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BROWSER, PpapiHostMsg_FlashFile_RenameFile(pepper_from, pepper_to));
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return error;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FlashFileResource::DeleteFileOrDir(PP_Instance /*instance*/,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           const char* path,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           PP_Bool recursive) {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PepperFilePath pepper_path(PepperFilePath::DOMAIN_MODULE_LOCAL,
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             base::FilePath::FromUTF8Unsafe(path));
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t error = SyncCall<IPC::Message>(
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BROWSER, PpapiHostMsg_FlashFile_DeleteFileOrDir(pepper_path,
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      PP_ToBool(recursive)));
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return error;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FlashFileResource::CreateDir(PP_Instance /*instance*/,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const char* path) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PepperFilePath pepper_path(PepperFilePath::DOMAIN_MODULE_LOCAL,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             base::FilePath::FromUTF8Unsafe(path));
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t error = SyncCall<IPC::Message>(BROWSER,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PpapiHostMsg_FlashFile_CreateDir(pepper_path));
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return error;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FlashFileResource::QueryFile(PP_Instance /*instance*/,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const char* path,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     PP_FileInfo* info) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return QueryFileHelper(path, PepperFilePath::DOMAIN_MODULE_LOCAL, info);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FlashFileResource::GetDirContents(PP_Instance /*instance*/,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const char* path,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          PP_DirContents_Dev** contents) {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ppapi::DirContents entries;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PepperFilePath pepper_path(PepperFilePath::DOMAIN_MODULE_LOCAL,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             base::FilePath::FromUTF8Unsafe(path));
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t error = SyncCall<PpapiPluginMsg_FlashFile_GetDirContentsReply>(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      BROWSER, PpapiHostMsg_FlashFile_GetDirContents(pepper_path), &entries);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (error == PP_OK) {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Copy the serialized dir entries to the output struct.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *contents = new PP_DirContents_Dev;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    (*contents)->count = static_cast<int32_t>(entries.size());
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    (*contents)->entries = new PP_DirEntry_Dev[entries.size()];
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < entries.size(); i++) {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ppapi::DirEntry& source = entries[i];
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PP_DirEntry_Dev* dest = &(*contents)->entries[i];
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::string name = source.name.AsUTF8Unsafe();
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      char* name_copy = new char[name.size() + 1];
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      memcpy(name_copy, name.c_str(), name.size() + 1);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dest->name = name_copy;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dest->is_dir = PP_FromBool(source.is_dir);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return error;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FlashFileResource::FreeDirContents(PP_Instance /*instance*/,
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        PP_DirContents_Dev* contents) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int32_t i = 0; i < contents->count; ++i)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delete[] contents->entries[i].name;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delete[] contents->entries;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delete contents;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FlashFileResource::CreateTemporaryFile(PP_Instance /*instance*/,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               PP_FileHandle* file) {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!file)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ERROR_BADARGUMENT;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC::Message unused;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceMessageReplyParams reply_params;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t error = GenericSyncCall(BROWSER,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PpapiHostMsg_FlashFile_CreateTemporaryFile(), &unused, &reply_params);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (error != PP_OK)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC::PlatformFileForTransit transit_file;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!reply_params.TakeFileHandleAtIndex(0, &transit_file))
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ERROR_FAILED;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *file = IPC::PlatformFileForTransitToPlatformFile(transit_file);
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PP_OK;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FlashFileResource::OpenFileRef(PP_Instance /*instance*/,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       PP_Resource file_ref,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       int32_t mode,
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       PP_FileHandle* file) {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return OpenFileHelper(GetPathFromFileRef(file_ref),
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        PepperFilePath::DOMAIN_ABSOLUTE, mode, file);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FlashFileResource::QueryFileRef(PP_Instance /*instance*/,
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        PP_Resource file_ref,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        PP_FileInfo* info) {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return QueryFileHelper(GetPathFromFileRef(file_ref),
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         PepperFilePath::DOMAIN_ABSOLUTE, info);
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FlashFileResource::OpenFileHelper(const std::string& path,
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          PepperFilePath::Domain domain_type,
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          int32_t mode,
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          PP_FileHandle* file) {
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (path.empty() ||
180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      !ppapi::PepperFileOpenFlagsToPlatformFileFlags(mode, NULL) ||
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !file)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ERROR_BADARGUMENT;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PepperFilePath pepper_path(domain_type, base::FilePath::FromUTF8Unsafe(path));
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC::Message unused;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceMessageReplyParams reply_params;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t error = GenericSyncCall(BROWSER,
189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      PpapiHostMsg_FlashFile_OpenFile(pepper_path, mode), &unused,
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &reply_params);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (error != PP_OK)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return error;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC::PlatformFileForTransit transit_file;
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!reply_params.TakeFileHandleAtIndex(0, &transit_file))
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ERROR_FAILED;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *file = IPC::PlatformFileForTransitToPlatformFile(transit_file);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PP_OK;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FlashFileResource::QueryFileHelper(const std::string& path,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           PepperFilePath::Domain domain_type,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           PP_FileInfo* info) {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (path.empty() || !info)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ERROR_BADARGUMENT;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::PlatformFileInfo file_info;
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PepperFilePath pepper_path(domain_type, base::FilePath::FromUTF8Unsafe(path));
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t error = SyncCall<PpapiPluginMsg_FlashFile_QueryFileReply>(BROWSER,
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PpapiHostMsg_FlashFile_QueryFile(pepper_path), &file_info);
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (error == PP_OK) {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->size = file_info.size;
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->creation_time = TimeToPPTime(file_info.creation_time);
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->last_access_time = TimeToPPTime(file_info.last_accessed);
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->last_modified_time = TimeToPPTime(file_info.last_modified);
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    info->system_type = PP_FILESYSTEMTYPE_EXTERNAL;
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (file_info.is_directory)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info->type = PP_FILETYPE_DIRECTORY;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      info->type = PP_FILETYPE_REGULAR;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return error;
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace proxy
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ppapi
231