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 "net/disk_cache/mapped_file.h"
6
7#include "base/file_path.h"
8#include "base/logging.h"
9#include "net/disk_cache/disk_cache.h"
10
11namespace disk_cache {
12
13void* MappedFile::Init(const FilePath& name, size_t size) {
14  DCHECK(!init_);
15  if (init_ || !File::Init(name))
16    return NULL;
17
18  buffer_ = NULL;
19  init_ = true;
20  section_ = CreateFileMapping(platform_file(), NULL, PAGE_READWRITE, 0,
21                               static_cast<DWORD>(size), NULL);
22  if (!section_)
23    return NULL;
24
25  buffer_ = MapViewOfFile(section_, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, size);
26  DCHECK(buffer_);
27  view_size_ = size;
28
29  return buffer_;
30}
31
32MappedFile::~MappedFile() {
33  if (!init_)
34    return;
35
36  if (buffer_) {
37    BOOL ret = UnmapViewOfFile(buffer_);
38    DCHECK(ret);
39  }
40
41  if (section_)
42    CloseHandle(section_);
43}
44
45bool MappedFile::Load(const FileBlock* block) {
46  size_t offset = block->offset() + view_size_;
47  return Read(block->buffer(), block->size(), offset);
48}
49
50bool MappedFile::Store(const FileBlock* block) {
51  size_t offset = block->offset() + view_size_;
52  return Write(block->buffer(), block->size(), offset);
53}
54
55}  // namespace disk_cache
56