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