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