123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #ifndef _MAPFILE_HPP_
- #define _MAPFILE_HPP_
- #ifdef HAVE_CONFIG_H
- # include "config.h"
- #endif
- #ifdef HAVE_MMAP
- # include <sys/types.h>
- # include <fcntl.h>
- # include <sys/mman.h>
- #endif
- #ifdef _WIN32
- # include <windows.h>
- #endif
- #include <glib.h>
- class MapFile
- {
- public:
- MapFile(void) :
- data(NULL),
- #ifdef HAVE_MMAP
- mmap_fd( -1)
- #elif defined(_WIN32)
- hFile(0),
- hFileMap(0)
- #endif
- {
- }
- ~MapFile();
- bool open(const char *file_name, unsigned long file_size);
- inline gchar *begin(void)
- {
- return data;
- }
- private:
- char *data;
- unsigned long size;
- #ifdef HAVE_MMAP
- int mmap_fd;
- #elif defined(_WIN32)
- HANDLE hFile;
- HANDLE hFileMap;
- #endif
- };
- inline bool MapFile::open(const char *file_name, unsigned long file_size)
- {
- size = file_size;
- #ifdef HAVE_MMAP
- if ((mmap_fd = ::open(file_name, O_RDONLY)) < 0)
- {
- //g_print("Open file %s failed!\n",fullfilename);
- return false;
- }
- data = (gchar *)mmap( NULL, file_size, PROT_READ, MAP_SHARED, mmap_fd, 0);
- if ((void *)data == (void *)( -1))
- {
- //g_print("mmap file %s failed!\n",idxfilename);
- data = NULL;
- return false;
- }
- #elif defined( _WIN32)
- #ifdef UNICODE
- gunichar2 *fn = g_utf8_to_utf16(file_name, -1, NULL, NULL, NULL);
- #else // UNICODE
- gchar *fn = file_name;
- #endif // UNICODE
- hFile = CreateFile(fn, GENERIC_READ, 0, NULL, OPEN_ALWAYS,
- FILE_ATTRIBUTE_NORMAL, 0);
- #ifdef UNICODE
- g_free(fn);
- #endif // UNICODE
- hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0,
- file_size, NULL);
- data = (gchar *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, file_size);
- #else // defined( _WIN32)
- gsize read_len;
- if (!g_file_get_contents(file_name, &data, &read_len, NULL))
- return false;
- if (read_len != file_size)
- return false;
- #endif
- return true;
- }
- inline MapFile::~MapFile()
- {
- if (!data)
- return ;
- #ifdef HAVE_MMAP
- munmap(data, size);
- close(mmap_fd);
- #else
- # ifdef _WIN32
- UnmapViewOfFile(data);
- CloseHandle(hFileMap);
- CloseHandle(hFile);
- # else
- g_free(data);
- # endif
- #endif
- }
- #endif//!_MAPFILE_HPP_
|