file_type_conversion.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
1// Copyright (c) 2011 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/shared_impl/file_type_conversion.h" 6 7#include "base/logging.h" 8#include "ppapi/c/pp_errors.h" 9#include "ppapi/c/ppb_file_io.h" 10#include "ppapi/shared_impl/time_conversion.h" 11 12namespace ppapi { 13 14int PlatformFileErrorToPepperError(base::PlatformFileError error_code) { 15 switch (error_code) { 16 case base::PLATFORM_FILE_OK: 17 return PP_OK; 18 case base::PLATFORM_FILE_ERROR_EXISTS: 19 return PP_ERROR_FILEEXISTS; 20 case base::PLATFORM_FILE_ERROR_NOT_FOUND: 21 return PP_ERROR_FILENOTFOUND; 22 case base::PLATFORM_FILE_ERROR_ACCESS_DENIED: 23 case base::PLATFORM_FILE_ERROR_SECURITY: 24 return PP_ERROR_NOACCESS; 25 case base::PLATFORM_FILE_ERROR_NO_MEMORY: 26 return PP_ERROR_NOMEMORY; 27 case base::PLATFORM_FILE_ERROR_NO_SPACE: 28 return PP_ERROR_NOSPACE; 29 case base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY: 30 return PP_ERROR_FAILED; 31 case base::PLATFORM_FILE_ERROR_NOT_A_FILE: 32 return PP_ERROR_NOTAFILE; 33 default: 34 return PP_ERROR_FAILED; 35 } 36} 37 38bool PepperFileOpenFlagsToPlatformFileFlags(int32_t pp_open_flags, 39 int* flags_out) { 40 if (!flags_out) 41 return false; 42 43 bool pp_read = !!(pp_open_flags & PP_FILEOPENFLAG_READ); 44 bool pp_write = !!(pp_open_flags & PP_FILEOPENFLAG_WRITE); 45 bool pp_create = !!(pp_open_flags & PP_FILEOPENFLAG_CREATE); 46 bool pp_truncate = !!(pp_open_flags & PP_FILEOPENFLAG_TRUNCATE); 47 bool pp_exclusive = !!(pp_open_flags & PP_FILEOPENFLAG_EXCLUSIVE); 48 bool pp_append = !!(pp_open_flags & PP_FILEOPENFLAG_APPEND); 49 50 int flags = 0; 51 if (pp_read) 52 flags |= base::PLATFORM_FILE_READ; 53 if (pp_write) { 54 flags |= base::PLATFORM_FILE_WRITE; 55 flags |= base::PLATFORM_FILE_WRITE_ATTRIBUTES; 56 } 57 if (pp_append) { 58 if (pp_write) 59 return false; 60 flags |= base::PLATFORM_FILE_APPEND; 61 } 62 63 if (pp_truncate && !pp_write) 64 return false; 65 66 if (pp_create) { 67 if (pp_exclusive) { 68 flags |= base::PLATFORM_FILE_CREATE; 69 } else if (pp_truncate) { 70 flags |= base::PLATFORM_FILE_CREATE_ALWAYS; 71 } else { 72 flags |= base::PLATFORM_FILE_OPEN_ALWAYS; 73 } 74 } else if (pp_truncate) { 75 flags |= base::PLATFORM_FILE_OPEN_TRUNCATED; 76 } else { 77 flags |= base::PLATFORM_FILE_OPEN; 78 } 79 80 *flags_out = flags; 81 return true; 82} 83 84void PlatformFileInfoToPepperFileInfo(const base::PlatformFileInfo& info, 85 PP_FileSystemType fs_type, 86 PP_FileInfo* info_out) { 87 DCHECK(info_out); 88 info_out->size = info.size; 89 info_out->creation_time = TimeToPPTime(info.creation_time); 90 info_out->last_access_time = TimeToPPTime(info.last_accessed); 91 info_out->last_modified_time = TimeToPPTime(info.last_modified); 92 info_out->system_type = fs_type; 93 if (info.is_directory) { 94 info_out->type = PP_FILETYPE_DIRECTORY; 95 } else if (info.is_symbolic_link) { 96 DCHECK_EQ(PP_FILESYSTEMTYPE_EXTERNAL, fs_type); 97 info_out->type = PP_FILETYPE_OTHER; 98 } else { 99 info_out->type = PP_FILETYPE_REGULAR; 100 } 101} 102 103} // namespace ppapi 104