From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/filereader/ResourceReader.cpp | 115 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 Src/filereader/ResourceReader.cpp (limited to 'Src/filereader/ResourceReader.cpp') diff --git a/Src/filereader/ResourceReader.cpp b/Src/filereader/ResourceReader.cpp new file mode 100644 index 00000000..a00e4776 --- /dev/null +++ b/Src/filereader/ResourceReader.cpp @@ -0,0 +1,115 @@ +#include "ResourceReader.h" + +ResourceReader::ResourceReader() : data(NULL), g(NULL), ptr(0) +{} + +int ResourceReader::open(const wchar_t *filename, int mode) +{ + if (_wcsnicmp(filename, L"res://", 6)) return 0; + filename += 6; + wchar_t blah[MAX_PATH]; + lstrcpynW(blah, filename, MAX_PATH); + + wchar_t *p = blah; + while (p && *p && *p != ',') p++; + if (p && *p != ',') return 0; + if (p) *p++ = 0; + HINSTANCE hInst = (HINSTANCE)_wtoi64(blah); + int id = _wtoi(p); + + HRSRC r = FindResource(hInst, MAKEINTRESOURCE(id), RT_RCDATA); + if (r == NULL) return 0; + g = LoadResource(hInst, r); + if (g == NULL) return 0; + data = (char*)LockResource(g); + if (data == NULL) + { + FreeResource(g); // see win32 doc + g = NULL; + return 0; + } + size = SizeofResource(hInst, r); + ptr = 0; + + return 1; +} + +size_t ResourceReader::read(__int8 *buffer, size_t length) +{ + size_t s = min(size - ptr, length); + if (s) + memcpy(buffer, data + ptr, s); + ptr += s; + return s; +} + +size_t ResourceReader::write(const __int8 *buffer, size_t length) +{ + + return 0; +} + +void ResourceReader::close() +{ + if (g) + { + UnlockResource(g); + FreeResource(g); // see win32 doc + g = NULL; + data = NULL; + } +} + +unsigned __int64 ResourceReader::getPos() +{ + return ptr; +} + +unsigned __int64 ResourceReader::getLength() +{ + return size; +} + +int ResourceReader::canSeek() +{ + return 1; +} + +int ResourceReader::seek(unsigned __int64 position) +{ + ptr = (size_t)min(position, size); + return 1; +} + +int ResourceReader::exists(const wchar_t *filename) +{ + return 1; +} // always exists if open succeeded + + +#define CBCLASS ResourceReader +START_DISPATCH; +// CB(ISMINE, isMine); + CB(OPEN, open); + CB(READ, read); + CB(WRITE, write); + VCB(CLOSE, close); +// VCB(ABORT, abort); + CB(GETLENGTH, getLength); + CB(GETPOS, getPos); + CB(CANSEEK, canSeek); +// CB(SEEK, seek); +// CB(HASHEADERS,hasHeaders); +// CB(GETHEADER,getHeader); + CB(EXISTS,exists); +// CB(REMOVE,remove); +// CB(REMOVEUNDOABLE,removeUndoable); +// CB(MOVE,move); +// CB(BYTESAVAILABLE,bytesAvailable); +// VCB(SETMETADATACALLBACK,setMetaDataCallback); +// CB(CANPREFETCH,canPrefetch); +// CB(CANSETEOF, canSetEOF); +// CB(SETEOF, setEOF); +END_DISPATCH; +#undef CBCLASS + -- cgit