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