blob: b6af0fe5f925db40ae27ff36c986ca8e1df4fa74 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/disk_cache/flash/storage.h"
#include <fcntl.h>
#include "base/logging.h"
#include "base/platform_file.h"
#include "net/base/net_errors.h"
#include "net/disk_cache/flash/format.h"
namespace disk_cache {
Storage::Storage(const FilePath& path, int32 size) : path_(path), size_(size) {
COMPILE_ASSERT(kFlashPageSize % 2 == 0, invalid_page_size);
COMPILE_ASSERT(kFlashBlockSize % kFlashPageSize == 0, invalid_block_size);
DCHECK(size_ % kFlashBlockSize == 0);
}
bool Storage::Init() {
int flags = base::PLATFORM_FILE_READ |
base::PLATFORM_FILE_WRITE |
base::PLATFORM_FILE_OPEN_ALWAYS;
file_ = base::CreatePlatformFile(path_, flags, NULL, NULL);
if (file_ == base::kInvalidPlatformFileValue)
return false;
// TODO(agayev): if file already exists, do some validation and return either
// true or false based on the result.
#if defined(OS_LINUX)
fallocate(file_, 0, 0, size_);
#endif
return true;
}
Storage::~Storage() {
base::ClosePlatformFile(file_);
}
bool Storage::Read(void* buffer, int32 size, int32 offset) {
DCHECK(offset >= 0 && offset + size <= size_);
int rv = base::ReadPlatformFile(file_, offset, static_cast<char*>(buffer),
size);
return rv == size;
}
bool Storage::Write(const void* buffer, int32 size, int32 offset) {
DCHECK(offset >= 0 && offset + size <= size_);
int rv = base::WritePlatformFile(file_, offset,
static_cast<const char*>(buffer), size);
return rv == size;
}
} // namespace disk_cache