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