Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2006-2008 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/platform_file.h"
      6 
      7 #include "base/file_path.h"
      8 #include "base/logging.h"
      9 
     10 namespace base {
     11 
     12 PlatformFile CreatePlatformFile(const FilePath& name,
     13                                 int flags,
     14                                 bool* created) {
     15   DWORD disposition = 0;
     16 
     17   if (flags & PLATFORM_FILE_OPEN)
     18     disposition = OPEN_EXISTING;
     19 
     20   if (flags & PLATFORM_FILE_CREATE) {
     21     DCHECK(!disposition);
     22     disposition = CREATE_NEW;
     23   }
     24 
     25   if (flags & PLATFORM_FILE_OPEN_ALWAYS) {
     26     DCHECK(!disposition);
     27     disposition = OPEN_ALWAYS;
     28   }
     29 
     30   if (flags & PLATFORM_FILE_CREATE_ALWAYS) {
     31     DCHECK(!disposition);
     32     disposition = CREATE_ALWAYS;
     33   }
     34 
     35   if (!disposition) {
     36     NOTREACHED();
     37     return NULL;
     38   }
     39 
     40   DWORD access = (flags & PLATFORM_FILE_READ) ? GENERIC_READ : 0;
     41   if (flags & PLATFORM_FILE_WRITE)
     42     access |= GENERIC_WRITE;
     43 
     44   DWORD sharing = (flags & PLATFORM_FILE_EXCLUSIVE_READ) ? 0 : FILE_SHARE_READ;
     45   if (!(flags & PLATFORM_FILE_EXCLUSIVE_WRITE))
     46     sharing |= FILE_SHARE_WRITE;
     47 
     48   DWORD create_flags = 0;
     49   if (flags & PLATFORM_FILE_ASYNC)
     50     create_flags |= FILE_FLAG_OVERLAPPED;
     51   if (flags & PLATFORM_FILE_TEMPORARY)
     52     create_flags |= FILE_ATTRIBUTE_TEMPORARY;
     53   if (flags & PLATFORM_FILE_HIDDEN)
     54     create_flags |= FILE_ATTRIBUTE_HIDDEN;
     55   if (flags & PLATFORM_FILE_DELETE_ON_CLOSE)
     56     create_flags |= FILE_FLAG_DELETE_ON_CLOSE;
     57 
     58   HANDLE file = CreateFile(name.value().c_str(), access, sharing, NULL,
     59                            disposition, create_flags, NULL);
     60 
     61   if ((flags & PLATFORM_FILE_OPEN_ALWAYS) && created &&
     62       INVALID_HANDLE_VALUE != file) {
     63     *created = (ERROR_ALREADY_EXISTS != GetLastError());
     64   }
     65 
     66   return file;
     67 }
     68 
     69 PlatformFile CreatePlatformFile(const std::wstring& name, int flags,
     70                                 bool* created) {
     71   return CreatePlatformFile(FilePath::FromWStringHack(name), flags, created);
     72 }
     73 
     74 bool ClosePlatformFile(PlatformFile file) {
     75   return (CloseHandle(file) == 0);
     76 }
     77 
     78 }  // namespace disk_cache
     79