// Windows/FileMapping.h

#ifndef __WINDOWS_FILEMAPPING_H
#define __WINDOWS_FILEMAPPING_H

#include "../Common/MyTypes.h"

#include "Handle.h"

namespace NWindows {

class CFileMapping: public CHandle
{
public:
  WRes Create(DWORD protect, UInt64 maxSize, LPCTSTR name)
  {
    _handle = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, protect, (DWORD)(maxSize >> 32), (DWORD)maxSize, name);
    return ::GetLastError();
  }

  WRes Open(DWORD
      #ifndef UNDER_CE
      desiredAccess
      #endif
      , LPCTSTR name)
  {
    #ifdef UNDER_CE
    WRes res = Create(PAGE_READONLY, 0, name);
    if (res == ERROR_ALREADY_EXISTS)
      return 0;
    Close();
    if (res == 0)
      res = ERROR_FILE_NOT_FOUND;
    return res;
    #else
    _handle = ::OpenFileMapping(desiredAccess, FALSE, name);
    if (_handle != 0)
      return 0;
    return ::GetLastError();
    #endif
  }

  LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap)
  {
    return ::MapViewOfFile(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap);
  }

  #ifndef UNDER_CE
  LPVOID Map(DWORD desiredAccess, UInt64 fileOffset, SIZE_T numberOfBytesToMap, LPVOID baseAddress)
  {
    return ::MapViewOfFileEx(_handle, desiredAccess, (DWORD)(fileOffset >> 32), (DWORD)fileOffset, numberOfBytesToMap, baseAddress);
  }
  #endif
};

class CFileUnmapper
{
  const void *_data;
public:
  CFileUnmapper(const void *data) : _data(data) {}
  ~CFileUnmapper() { ::UnmapViewOfFile(_data); }
};

}

#endif
