aboutsummaryrefslogtreecommitdiff
path: root/c/data.h
blob: 4e25251c3b9e04022af5cfb9478d897ec7e8486f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#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<int*>(&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