| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ppapi/shared_impl/file_type_conversion.h" |
| |
| #include "base/logging.h" |
| #include "ppapi/c/pp_errors.h" |
| #include "ppapi/c/ppb_file_io.h" |
| #include "ppapi/shared_impl/time_conversion.h" |
| |
| namespace ppapi { |
| |
| int FileErrorToPepperError(base::File::Error error_code) { |
| switch (error_code) { |
| case base::File::FILE_OK: |
| return PP_OK; |
| case base::File::FILE_ERROR_EXISTS: |
| return PP_ERROR_FILEEXISTS; |
| case base::File::FILE_ERROR_NOT_FOUND: |
| return PP_ERROR_FILENOTFOUND; |
| case base::File::FILE_ERROR_ACCESS_DENIED: |
| case base::File::FILE_ERROR_SECURITY: |
| return PP_ERROR_NOACCESS; |
| case base::File::FILE_ERROR_NO_MEMORY: |
| return PP_ERROR_NOMEMORY; |
| case base::File::FILE_ERROR_NO_SPACE: |
| return PP_ERROR_NOSPACE; |
| case base::File::FILE_ERROR_NOT_A_DIRECTORY: |
| return PP_ERROR_FAILED; |
| case base::File::FILE_ERROR_NOT_A_FILE: |
| return PP_ERROR_NOTAFILE; |
| default: |
| return PP_ERROR_FAILED; |
| } |
| } |
| |
| bool PepperFileOpenFlagsToPlatformFileFlags(int32_t pp_open_flags, |
| int* flags_out) { |
| bool pp_read = !!(pp_open_flags & PP_FILEOPENFLAG_READ); |
| bool pp_write = !!(pp_open_flags & PP_FILEOPENFLAG_WRITE); |
| bool pp_create = !!(pp_open_flags & PP_FILEOPENFLAG_CREATE); |
| bool pp_truncate = !!(pp_open_flags & PP_FILEOPENFLAG_TRUNCATE); |
| bool pp_exclusive = !!(pp_open_flags & PP_FILEOPENFLAG_EXCLUSIVE); |
| bool pp_append = !!(pp_open_flags & PP_FILEOPENFLAG_APPEND); |
| |
| // Pepper allows Touch on any open file, so always set this Windows-only flag. |
| int flags = base::File::FLAG_WRITE_ATTRIBUTES; |
| |
| if (pp_read) |
| flags |= base::File::FLAG_READ; |
| if (pp_write) { |
| flags |= base::File::FLAG_WRITE; |
| } |
| if (pp_append) { |
| if (pp_write) |
| return false; |
| flags |= base::File::FLAG_APPEND; |
| } |
| |
| if (pp_truncate && !pp_write) |
| return false; |
| |
| if (pp_create) { |
| if (pp_exclusive) { |
| flags |= base::File::FLAG_CREATE; |
| } else if (pp_truncate) { |
| flags |= base::File::FLAG_CREATE_ALWAYS; |
| } else { |
| flags |= base::File::FLAG_OPEN_ALWAYS; |
| } |
| } else if (pp_truncate) { |
| flags |= base::File::FLAG_OPEN_TRUNCATED; |
| } else { |
| flags |= base::File::FLAG_OPEN; |
| } |
| |
| if (flags_out) |
| *flags_out = flags; |
| return true; |
| } |
| |
| void FileInfoToPepperFileInfo(const base::File::Info& info, |
| PP_FileSystemType fs_type, |
| PP_FileInfo* info_out) { |
| DCHECK(info_out); |
| info_out->size = info.size; |
| info_out->creation_time = TimeToPPTime(info.creation_time); |
| info_out->last_access_time = TimeToPPTime(info.last_accessed); |
| info_out->last_modified_time = TimeToPPTime(info.last_modified); |
| info_out->system_type = fs_type; |
| if (info.is_directory) { |
| info_out->type = PP_FILETYPE_DIRECTORY; |
| } else if (info.is_symbolic_link) { |
| DCHECK_EQ(PP_FILESYSTEMTYPE_EXTERNAL, fs_type); |
| info_out->type = PP_FILETYPE_OTHER; |
| } else { |
| info_out->type = PP_FILETYPE_REGULAR; |
| } |
| } |
| |
| } // namespace ppapi |