Home | History | Annotate | Download | only in files
      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 "base/files/file.h"
      6 #include "base/files/file_path.h"
      7 #include "base/files/file_tracing.h"
      8 #include "base/metrics/histogram.h"
      9 #include "base/timer/elapsed_timer.h"
     10 #include "build/build_config.h"
     11 
     12 namespace base {
     13 
     14 File::Info::Info()
     15     : size(0),
     16       is_directory(false),
     17       is_symbolic_link(false) {
     18 }
     19 
     20 File::Info::~Info() {
     21 }
     22 
     23 File::File()
     24     : error_details_(FILE_ERROR_FAILED),
     25       created_(false),
     26       async_(false) {
     27 }
     28 
     29 #if !defined(OS_NACL)
     30 File::File(const FilePath& path, uint32_t flags)
     31     : error_details_(FILE_OK), created_(false), async_(false) {
     32   Initialize(path, flags);
     33 }
     34 #endif
     35 
     36 File::File(PlatformFile platform_file)
     37     : file_(platform_file),
     38       error_details_(FILE_OK),
     39       created_(false),
     40       async_(false) {
     41 #if defined(OS_POSIX)
     42   DCHECK_GE(platform_file, -1);
     43 #endif
     44 }
     45 
     46 File::File(Error error_details)
     47     : error_details_(error_details),
     48       created_(false),
     49       async_(false) {
     50 }
     51 
     52 File::File(File&& other)
     53     : file_(other.TakePlatformFile()),
     54       tracing_path_(other.tracing_path_),
     55       error_details_(other.error_details()),
     56       created_(other.created()),
     57       async_(other.async_) {}
     58 
     59 File::~File() {
     60   // Go through the AssertIOAllowed logic.
     61   Close();
     62 }
     63 
     64 // static
     65 File File::CreateForAsyncHandle(PlatformFile platform_file) {
     66   File file(platform_file);
     67   // It would be nice if we could validate that |platform_file| was opened with
     68   // FILE_FLAG_OVERLAPPED on Windows but this doesn't appear to be possible.
     69   file.async_ = true;
     70   return file;
     71 }
     72 
     73 File& File::operator=(File&& other) {
     74   DCHECK_NE(this, &other);
     75   Close();
     76   SetPlatformFile(other.TakePlatformFile());
     77   tracing_path_ = other.tracing_path_;
     78   error_details_ = other.error_details();
     79   created_ = other.created();
     80   async_ = other.async_;
     81   return *this;
     82 }
     83 
     84 #if !defined(OS_NACL)
     85 void File::Initialize(const FilePath& path, uint32_t flags) {
     86   if (path.ReferencesParent()) {
     87     error_details_ = FILE_ERROR_ACCESS_DENIED;
     88     return;
     89   }
     90   if (FileTracing::IsCategoryEnabled())
     91     tracing_path_ = path;
     92   SCOPED_FILE_TRACE("Initialize");
     93   DoInitialize(path, flags);
     94 }
     95 #endif
     96 
     97 std::string File::ErrorToString(Error error) {
     98   switch (error) {
     99     case FILE_OK:
    100       return "FILE_OK";
    101     case FILE_ERROR_FAILED:
    102       return "FILE_ERROR_FAILED";
    103     case FILE_ERROR_IN_USE:
    104       return "FILE_ERROR_IN_USE";
    105     case FILE_ERROR_EXISTS:
    106       return "FILE_ERROR_EXISTS";
    107     case FILE_ERROR_NOT_FOUND:
    108       return "FILE_ERROR_NOT_FOUND";
    109     case FILE_ERROR_ACCESS_DENIED:
    110       return "FILE_ERROR_ACCESS_DENIED";
    111     case FILE_ERROR_TOO_MANY_OPENED:
    112       return "FILE_ERROR_TOO_MANY_OPENED";
    113     case FILE_ERROR_NO_MEMORY:
    114       return "FILE_ERROR_NO_MEMORY";
    115     case FILE_ERROR_NO_SPACE:
    116       return "FILE_ERROR_NO_SPACE";
    117     case FILE_ERROR_NOT_A_DIRECTORY:
    118       return "FILE_ERROR_NOT_A_DIRECTORY";
    119     case FILE_ERROR_INVALID_OPERATION:
    120       return "FILE_ERROR_INVALID_OPERATION";
    121     case FILE_ERROR_SECURITY:
    122       return "FILE_ERROR_SECURITY";
    123     case FILE_ERROR_ABORT:
    124       return "FILE_ERROR_ABORT";
    125     case FILE_ERROR_NOT_A_FILE:
    126       return "FILE_ERROR_NOT_A_FILE";
    127     case FILE_ERROR_NOT_EMPTY:
    128       return "FILE_ERROR_NOT_EMPTY";
    129     case FILE_ERROR_INVALID_URL:
    130       return "FILE_ERROR_INVALID_URL";
    131     case FILE_ERROR_IO:
    132       return "FILE_ERROR_IO";
    133     case FILE_ERROR_MAX:
    134       break;
    135   }
    136 
    137   NOTREACHED();
    138   return "";
    139 }
    140 
    141 }  // namespace base
    142