Imported version 0.2-1
[mstardict] / src / lib / mapfile.hpp
1 #ifndef _MAPFILE_HPP_
2 #define _MAPFILE_HPP_
3
4 #ifdef HAVE_CONFIG_H
5 #  include "config.h"
6 #endif
7
8 #ifdef HAVE_MMAP
9 #  include <sys/types.h>
10 #  include <fcntl.h>
11 #  include <sys/mman.h>
12 #  include <unistd.h>
13 #endif
14 #ifdef _WIN32
15 #  include <windows.h>
16 #endif
17 #include <glib.h>
18
19 class MapFile {
20 public:
21   MapFile(void) : 
22 #ifdef HAVE_MMAP
23                 mmap_fd(-1),
24 #elif defined(_WIN32)
25                 hFile(0),
26                 hFileMap(0),
27 #endif
28                 data(NULL)
29         {
30         }
31   ~MapFile();
32   inline bool open(const char *file_name, unsigned long file_size);
33   inline void close();
34   inline gchar *begin(void) { return data; }
35 private:
36 #ifdef HAVE_MMAP
37   int mmap_fd;
38 #elif defined(_WIN32)
39   HANDLE hFile;
40   HANDLE hFileMap;
41 #endif
42   char *data;
43   unsigned long size;
44 };
45
46 inline bool MapFile::open(const char *file_name, unsigned long file_size)
47 {
48   size=file_size;
49 #ifdef HAVE_MMAP
50   if ((mmap_fd = ::open(file_name, O_RDONLY)) < 0) {
51     //g_print("Open file %s failed!\n",fullfilename);
52     return false;
53   }
54   data = (gchar *)mmap( NULL, file_size, PROT_READ, MAP_SHARED, mmap_fd, 0);
55   if ((void *)data == (void *)(-1)) {
56     //g_print("mmap file %s failed!\n",idxfilename);
57     ::close(mmap_fd);
58     data=NULL;
59     return false;
60   }
61 #elif defined( _WIN32)
62   hFile = CreateFile(file_name, GENERIC_READ, 0, NULL, OPEN_ALWAYS, 
63                      FILE_ATTRIBUTE_NORMAL, 0);
64   hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0,  
65                                file_size, NULL);
66   data = (gchar *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, file_size);
67 #else
68   gsize read_len;
69   if (!g_file_get_contents(file_name, &data, &read_len, NULL))
70     return false;
71
72   if (read_len!=file_size)
73     return false;               
74 #endif
75
76   return true;
77 }
78
79 inline void MapFile::close()
80 {
81   if (!data)
82     return;
83 #ifdef HAVE_MMAP
84   munmap(data, size);
85   ::close(mmap_fd);
86 #else
87 #  ifdef _WIN32
88   UnmapViewOfFile(data);
89   CloseHandle(hFileMap);
90   CloseHandle(hFile);
91 #  else
92   g_free(data);
93 #  endif
94 #endif                  
95   data=NULL;
96 }
97
98 inline MapFile::~MapFile()
99 {
100   close();
101 }
102
103 #endif//!_MAPFILE_HPP_