1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/files/file.h"
6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// TODO(rvargas): remove this (needed for kInvalidPlatformFileValue).
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/platform_file.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace base {
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)File::Info::Info()
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : size(0),
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      is_directory(false),
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      is_symbolic_link(false) {
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)File::Info::~Info() {
19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)File::File()
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : file_(kInvalidPlatformFileValue),
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      error_details_(FILE_ERROR_FAILED),
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      created_(false),
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      async_(false) {
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(OS_NACL)
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)File::File(const FilePath& name, uint32 flags)
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : file_(kInvalidPlatformFileValue),
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      error_details_(FILE_OK),
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      created_(false),
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      async_(false) {
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Initialize(name, flags);
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)File::File(PlatformFile platform_file)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : file_(platform_file),
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      error_details_(FILE_OK),
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      created_(false),
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      async_(false) {
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_POSIX)
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_GE(platform_file, -1);
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
48effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochFile::File(Error error_details)
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    : file_(kInvalidPlatformFileValue),
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      error_details_(error_details),
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      created_(false),
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      async_(false) {
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)File::File(RValue other)
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : file_(other.object->TakePlatformFile()),
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      error_details_(other.object->error_details()),
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      created_(other.object->created()),
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      async_(other.object->async_) {
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)File::~File() {
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Go through the AssertIOAllowed logic.
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Close();
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)File& File::operator=(RValue other) {
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (this != other.object) {
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Close();
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SetPlatformFile(other.object->TakePlatformFile());
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    error_details_ = other.object->error_details();
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    created_ = other.object->created();
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    async_ = other.object->async_;
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return *this;
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_NACL)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void File::Initialize(const FilePath& name, uint32 flags) {
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (name.ReferencesParent()) {
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    error_details_ = FILE_ERROR_ACCESS_DENIED;
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitializeUnsafe(name, flags);
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string File::ErrorToString(Error error) {
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (error) {
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_OK:
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_OK";
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_FAILED:
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_FAILED";
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_IN_USE:
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_IN_USE";
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_EXISTS:
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_EXISTS";
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_NOT_FOUND:
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_NOT_FOUND";
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_ACCESS_DENIED:
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_ACCESS_DENIED";
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_TOO_MANY_OPENED:
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_TOO_MANY_OPENED";
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_NO_MEMORY:
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_NO_MEMORY";
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_NO_SPACE:
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_NO_SPACE";
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_NOT_A_DIRECTORY:
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_NOT_A_DIRECTORY";
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_INVALID_OPERATION:
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_INVALID_OPERATION";
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_SECURITY:
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_SECURITY";
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_ABORT:
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_ABORT";
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_NOT_A_FILE:
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_NOT_A_FILE";
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_NOT_EMPTY:
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_NOT_EMPTY";
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_INVALID_URL:
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_INVALID_URL";
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_IO:
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "FILE_ERROR_IO";
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case FILE_ERROR_MAX:
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NOTREACHED();
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return "";
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace base
133