12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef BASE_FILES_MEMORY_MAPPED_FILE_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define BASE_FILES_MEMORY_MAPPED_FILE_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/base_export.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/platform_file.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "build/build_config.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <windows.h>
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BASE_EXPORT MemoryMappedFile {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The default constructor sets all members to invalid/null values.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MemoryMappedFile();
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~MemoryMappedFile();
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Opens an existing file and maps it into memory. Access is restricted to
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // read only. If this object already points to a valid memory mapped file
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // then this method will fail and return false. If it cannot open the file,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the file does not exist, or the memory mapping fails, it will return false.
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Later we may want to allow the user to specify access.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool Initialize(const FilePath& file_name);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // As above, but works with an already-opened file. MemoryMappedFile will take
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ownership of |file| and close it when done.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool Initialize(PlatformFile file);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Opens an existing file and maps it as an image section. Please refer to
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the Initialize function above for additional information.
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool InitializeAsImageSection(const FilePath& file_name);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // OS_WIN
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const uint8* data() const { return data_; }
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t length() const { return length_; }
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Is file_ a valid file handle that points to an open, memory mapped file?
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsValid() const;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Open the given file and pass it to MapFileToMemoryInternal().
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool MapFileToMemory(const FilePath& file_name);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Map the file to memory, set data_ to that memory address. Return true on
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // success, false on any kind of failure. This is a helper for Initialize().
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool MapFileToMemoryInternal();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Closes all open handles. Later we may want to make this public.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CloseHandles();
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // MapFileToMemoryInternal calls this function. It provides the ability to
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // pass in flags which control the mapped section.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool MapFileToMemoryInternalEx(int flags);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HANDLE file_mapping_;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PlatformFile file_;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint8* data_;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t length_;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MemoryMappedFile);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace base
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // BASE_FILES_MEMORY_MAPPED_FILE_H_
77