Home | History | Annotate | Download | only in flash
      1 // Copyright (c) 2012 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 "net/disk_cache/flash/storage.h"
      6 
      7 #include <fcntl.h>
      8 
      9 #include "base/logging.h"
     10 #include "base/platform_file.h"
     11 #include "net/base/net_errors.h"
     12 #include "net/disk_cache/flash/format.h"
     13 
     14 namespace disk_cache {
     15 
     16 Storage::Storage(const base::FilePath& path,
     17                  int32 size)
     18     : path_(path), size_(size) {
     19   COMPILE_ASSERT(kFlashPageSize % 2 == 0, invalid_page_size);
     20   COMPILE_ASSERT(kFlashBlockSize % kFlashPageSize == 0, invalid_block_size);
     21   DCHECK(size_ % kFlashBlockSize == 0);
     22 }
     23 
     24 bool Storage::Init() {
     25   int flags = base::PLATFORM_FILE_READ |
     26               base::PLATFORM_FILE_WRITE |
     27               base::PLATFORM_FILE_OPEN_ALWAYS;
     28 
     29   file_ = base::CreatePlatformFile(path_, flags, NULL, NULL);
     30   if (file_ == base::kInvalidPlatformFileValue)
     31     return false;
     32 
     33   // TODO(agayev): if file already exists, do some validation and return either
     34   // true or false based on the result.
     35 
     36 #if defined(OS_LINUX)
     37   fallocate(file_, 0, 0, size_);
     38 #endif
     39 
     40   return true;
     41 }
     42 
     43 Storage::~Storage() {
     44   base::ClosePlatformFile(file_);
     45 }
     46 
     47 bool Storage::Read(void* buffer, int32 size, int32 offset) {
     48   DCHECK(offset >= 0 && offset + size <= size_);
     49 
     50   int rv = base::ReadPlatformFile(file_, offset, static_cast<char*>(buffer),
     51                                   size);
     52   return rv == size;
     53 }
     54 
     55 bool Storage::Write(const void* buffer, int32 size, int32 offset) {
     56   DCHECK(offset >= 0 && offset + size <= size_);
     57 
     58   int rv = base::WritePlatformFile(file_, offset,
     59                                    static_cast<const char*>(buffer), size);
     60   return rv == size;
     61 }
     62 
     63 }  // namespace disk_cache
     64