• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Storage(const base::FilePath & path,int32 size)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 
Init()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 
~Storage()43 Storage::~Storage() {
44   base::ClosePlatformFile(file_);
45 }
46 
Read(void * buffer,int32 size,int32 offset)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 
Write(const void * buffer,int32 size,int32 offset)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