aboutsummaryrefslogtreecommitdiff
path: root/c/data.cpp
diff options
context:
space:
mode:
authorJohn Ankarström <john@ankarstrom.se>2022-08-16 04:37:48 +0200
committerJohn Ankarström <john@ankarstrom.se>2022-08-16 04:37:48 +0200
commit5095c2e2ba9aadf468514804fb3a872d10fdc17d (patch)
tree6683057496648797923ce686440c101510d9bc87 /c/data.cpp
parentafd245c205e2787e54cb7e2fd34de617eeceed25 (diff)
downloadEpisodeBrowser-5095c2e2ba9aadf468514804fb3a872d10fdc17d.tar.gz
Implement preliminary IO.
It might be a good idea to eschew the structs and access the data directly from the view. Alternatively, the serialization functions might be rewritten to simply memcpy the structs, after either adding __attribute__((packed)) or ensuring consistent padding.
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';