aboutsummaryrefslogtreecommitdiff
path: root/c/data.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'c/data.cpp')
-rw-r--r--c/data.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/c/data.cpp b/c/data.cpp
index e28378e..1a78ef2 100644
--- a/c/data.cpp
+++ b/c/data.cpp
@@ -1,6 +1,8 @@
#include <memory>
+#include <vector>
#include "data.h"
+#include "win.h"
template <typename T>
inline unsigned char* ValToBuf(const T& val, unsigned char* const buf)
@@ -16,6 +18,40 @@ inline unsigned char* BufToVal(unsigned char* const buf, T& val)
return buf+sizeof(val);
}
+DatView::DatView(const wchar_t* const filename, const size_t cb)
+{
+ hf = CreateFile(filename, GENERIC_READ|GENERIC_WRITE,
+ 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
+ if (hf == INVALID_HANDLE_VALUE) {
+ if (GetLastError() == ERROR_FILE_NOT_FOUND) {
+ hf = CreateFile(filename, GENERIC_READ|GENERIC_WRITE,
+ 0, nullptr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr);
+ if (hf == INVALID_HANDLE_VALUE)
+ throw Win32Error{};
+ } else
+ throw Win32Error{};
+ }
+
+ LARGE_INTEGER cbMap;
+ cbMap.QuadPart = cb;
+ hm = CreateFileMapping(hf, nullptr, PAGE_READWRITE,
+ cbMap.HighPart, cbMap.LowPart, nullptr);
+ if (!hm)
+ throw Win32Error{};
+
+ view = MapViewOfFile(hm, FILE_MAP_ALL_ACCESS, 0, 0, 0);
+ if (!view)
+ throw Win32Error{};
+}
+
+DatView::~DatView()
+{
+ FlushViewOfFile(view, 0);
+ UnmapViewOfFile(view);
+ CloseHandle(hm);
+ CloseHandle(hf);
+}
+
unsigned char* Serialize(const ElvData& e, unsigned char* buf)
{
unsigned char version = 'a';