#ifndef DATA_H #define DATA_H #include "pl.h" #include "util.h" #include "wcharptr.h" /* ElvData and DlvData are written as-is to disk; note the careful * alignment. */ struct ElvData { unsigned char version = 'a'; /* 0-1 */ unsigned char rating = 0; /* 1-2 */ unsigned char bWatched = 0; /* 2-3 */ unsigned char bTVOriginal = 0; /* 3-4 */ wchar_t sRating[4] = {0}; /* 4-12 */ wchar_t siEp[6] = {0}; /* 12-24 */ wchar_t title[128] = {0}; /* 24-280 */ }; struct DlvData { wchar_t date[64] = {0}; wchar_t source[64] = {0}; wchar_t screenwriter[64] = {0}; wchar_t hint[128] = {0}; wchar_t wiki[128] = {0}; }; struct FileView { FileView(const wchar_t* filename, size_t cb); ~FileView(); inline operator unsigned char*() { return view; } HANDLE hf; HANDLE hm; unsigned char* view; /* TODO: Handle exceptions on read and write... */ }; void Write(unsigned char* buf, const ElvData& e); ElvData* Read(unsigned char* buf); inline int FromWeb(const int iEp, ElvData& e, DlvData& d) noexcept { WcharPtr title, wiki, date, source, hint; const int r = Pl("episode_data","fetch_episode_data",iEp,&title,&wiki,&date,&source,&hint); if (title) Wcscpy(e.title, title); if (wiki) Wcscpy(d.wiki, wiki); if (date) Wcscpy(d.date, date); if (source) Wcscpy(d.source, source); if (hint) Wcscpy(d.hint, hint); return r; } inline bool FromProlog(const int iEp, ElvData& e) noexcept { if (WcharPtr title; Pl("episode_data","episode_title",iEp,&title)) Wcscpy(e.title, title); else return false; if (Pl("episode_data","episode_rating",iEp,reinterpret_cast(&e.rating))) Swprintf(e.sRating, L"%d", e.rating); if (Pl("episode_data","tv_original",iEp)) e.bTVOriginal = true; if (Pl("track_episodes","watched",iEp)) e.bWatched = true; Swprintf(e.siEp, L"%d", iEp); return true; } inline void FromProlog(const int iEp, DlvData& d) noexcept { if (WcharPtr wiki; Pl("episode_data","episode_wiki",iEp,&wiki)) Wcscpy(d.wiki, wiki); if (WcharPtr screenwriter; Pl("episode_data","episode_datum",iEp,"Screenwriter",&screenwriter)) Wcscpy(d.screenwriter, screenwriter); if (WcharPtr date; Pl("episode_data","episode_datum",iEp,"Date",&date)) Wcscpy(d.date, date); if (WcharPtr source; Pl("episode_data","episode_datum",iEp,"Source",&source)) Wcscpy(d.source, source); if (WcharPtr hint; Pl("episode_data","episode_datum",iEp,"Hint",&hint)) Wcscpy(d.hint, hint); } #endif