blob: 58f80c52322ec38125e1acbe3fda1120f64aa912 [file] [log] [blame]
rvargas@google.comb1ae3192013-11-28 10:31:31 +09001// 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
rvargas@chromium.org12938d72013-12-04 09:46:32 +09005#include "base/files/file.h"
rvargas@chromium.org4826afb2014-06-24 14:40:09 +09006#include "base/files/file_path.h"
dbeamfe14ece2015-05-11 16:53:47 +09007#include "base/files/file_tracing.h"
tnagel7eaf4772015-04-03 19:11:46 +09008#include "base/metrics/histogram.h"
9#include "base/timer/elapsed_timer.h"
rvargas@google.comb1ae3192013-11-28 10:31:31 +090010
11namespace base {
12
rvargas@chromium.org12938d72013-12-04 09:46:32 +090013File::Info::Info()
rvargas@google.comb1ae3192013-11-28 10:31:31 +090014 : size(0),
15 is_directory(false),
16 is_symbolic_link(false) {
17}
18
rvargas@chromium.org12938d72013-12-04 09:46:32 +090019File::Info::~Info() {
20}
21
22File::File()
rvargas@chromium.org4826afb2014-06-24 14:40:09 +090023 : error_details_(FILE_ERROR_FAILED),
rvargas@chromium.org12938d72013-12-04 09:46:32 +090024 created_(false),
25 async_(false) {
26}
rvargas@google.comb1ae3192013-11-28 10:31:31 +090027
28#if !defined(OS_NACL)
dbeamfe14ece2015-05-11 16:53:47 +090029File::File(const FilePath& path, uint32 flags)
rvargas@chromium.org4826afb2014-06-24 14:40:09 +090030 : error_details_(FILE_OK),
rvargas@chromium.org12938d72013-12-04 09:46:32 +090031 created_(false),
32 async_(false) {
dbeamfe14ece2015-05-11 16:53:47 +090033 Initialize(path, flags);
rvargas@google.comb1ae3192013-11-28 10:31:31 +090034}
35#endif
36
rvargas@chromium.orge207eae2014-01-04 07:14:15 +090037File::File(PlatformFile platform_file)
38 : file_(platform_file),
rvargas@chromium.org9cce0322014-01-09 07:30:21 +090039 error_details_(FILE_OK),
rvargas@chromium.orge207eae2014-01-04 07:14:15 +090040 created_(false),
41 async_(false) {
zmo@chromium.org536b9a92014-03-18 11:39:03 +090042#if defined(OS_POSIX)
43 DCHECK_GE(platform_file, -1);
44#endif
rvargas@chromium.orge207eae2014-01-04 07:14:15 +090045}
46
rvargas@chromium.orgca704f42014-03-26 18:59:31 +090047File::File(Error error_details)
rvargas@chromium.org4826afb2014-06-24 14:40:09 +090048 : error_details_(error_details),
rvargas@chromium.orgca704f42014-03-26 18:59:31 +090049 created_(false),
50 async_(false) {
51}
52
rvargas@chromium.org12938d72013-12-04 09:46:32 +090053File::File(RValue other)
54 : file_(other.object->TakePlatformFile()),
dbeamfe14ece2015-05-11 16:53:47 +090055 path_(other.object->path_),
rvargas@chromium.org9cce0322014-01-09 07:30:21 +090056 error_details_(other.object->error_details()),
rvargas@chromium.org12938d72013-12-04 09:46:32 +090057 created_(other.object->created()),
58 async_(other.object->async_) {
59}
60
61File::~File() {
rvargas@chromium.orge60d9672014-05-06 09:55:35 +090062 // Go through the AssertIOAllowed logic.
63 Close();
rvargas@chromium.org12938d72013-12-04 09:46:32 +090064}
65
66File& File::operator=(RValue other) {
67 if (this != other.object) {
68 Close();
69 SetPlatformFile(other.object->TakePlatformFile());
dbeamfe14ece2015-05-11 16:53:47 +090070 path_ = other.object->path_;
rvargas@chromium.org9cce0322014-01-09 07:30:21 +090071 error_details_ = other.object->error_details();
rvargas@chromium.org12938d72013-12-04 09:46:32 +090072 created_ = other.object->created();
73 async_ = other.object->async_;
74 }
75 return *this;
76}
77
rvargas@chromium.orge207eae2014-01-04 07:14:15 +090078#if !defined(OS_NACL)
dbeamfe14ece2015-05-11 16:53:47 +090079void File::Initialize(const FilePath& path, uint32 flags) {
80 if (path.ReferencesParent()) {
rvargas@chromium.org9cce0322014-01-09 07:30:21 +090081 error_details_ = FILE_ERROR_ACCESS_DENIED;
rvargas@chromium.orge207eae2014-01-04 07:14:15 +090082 return;
83 }
dbeamfe14ece2015-05-11 16:53:47 +090084 path_ = path;
85 SCOPED_FILE_TRACE("Initialize");
86 DoInitialize(flags);
rvargas@chromium.orge207eae2014-01-04 07:14:15 +090087}
88#endif
89
mtomasz@chromium.orga5d9be82014-05-30 19:07:30 +090090std::string File::ErrorToString(Error error) {
91 switch (error) {
92 case FILE_OK:
93 return "FILE_OK";
94 case FILE_ERROR_FAILED:
95 return "FILE_ERROR_FAILED";
96 case FILE_ERROR_IN_USE:
97 return "FILE_ERROR_IN_USE";
98 case FILE_ERROR_EXISTS:
99 return "FILE_ERROR_EXISTS";
100 case FILE_ERROR_NOT_FOUND:
101 return "FILE_ERROR_NOT_FOUND";
102 case FILE_ERROR_ACCESS_DENIED:
103 return "FILE_ERROR_ACCESS_DENIED";
104 case FILE_ERROR_TOO_MANY_OPENED:
105 return "FILE_ERROR_TOO_MANY_OPENED";
106 case FILE_ERROR_NO_MEMORY:
107 return "FILE_ERROR_NO_MEMORY";
108 case FILE_ERROR_NO_SPACE:
109 return "FILE_ERROR_NO_SPACE";
110 case FILE_ERROR_NOT_A_DIRECTORY:
111 return "FILE_ERROR_NOT_A_DIRECTORY";
112 case FILE_ERROR_INVALID_OPERATION:
113 return "FILE_ERROR_INVALID_OPERATION";
114 case FILE_ERROR_SECURITY:
115 return "FILE_ERROR_SECURITY";
116 case FILE_ERROR_ABORT:
117 return "FILE_ERROR_ABORT";
118 case FILE_ERROR_NOT_A_FILE:
119 return "FILE_ERROR_NOT_A_FILE";
120 case FILE_ERROR_NOT_EMPTY:
121 return "FILE_ERROR_NOT_EMPTY";
122 case FILE_ERROR_INVALID_URL:
123 return "FILE_ERROR_INVALID_URL";
124 case FILE_ERROR_IO:
125 return "FILE_ERROR_IO";
126 case FILE_ERROR_MAX:
127 break;
128 }
129
130 NOTREACHED();
131 return "";
132}
133
tnagel7eaf4772015-04-03 19:11:46 +0900134bool File::Flush() {
135 ElapsedTimer timer;
dbeamfe14ece2015-05-11 16:53:47 +0900136 SCOPED_FILE_TRACE("Flush");
tnagel7eaf4772015-04-03 19:11:46 +0900137 bool return_value = DoFlush();
138 UMA_HISTOGRAM_TIMES("PlatformFile.FlushTime", timer.Elapsed());
139 return return_value;
140}
141
rvargas@google.comb1ae3192013-11-28 10:31:31 +0900142} // namespace base