summaryrefslogtreecommitdiffstats
path: root/src/cc4group.h
blob: ef3a55de85804f325a6eb6c07358dc9144b9ac20 (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
93
94
95
96
97
#pragma once

#ifdef __cplusplus
extern "C" {
#define this this_
#define new new_
#define delete delete_
#endif

#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>

typedef struct {
	const char* fileName;
	int32_t modified;
	const char* author;
	size_t size;
	size_t totalSize;
	bool executable;
	bool directory;
	bool official;
} CC4Group_EntryInfo;

typedef struct CC4Group_t CC4Group;

typedef void(*CC4Group_CleanupFunc)(void* data);
typedef struct {
	CC4Group_CleanupFunc func;
	void* data;
} CC4Group_CleanupJob;
typedef void* (*CC4Group_TmpMemoryStrategy)(CC4Group* const this, const size_t size, CC4Group_CleanupJob* cleanupJob);

typedef struct {
	CC4Group* (*new)(void);
	bool (*create)(CC4Group* const this);
	void (*delete)(CC4Group* const this);

	// only open an existing group on a frehsly created group object
	bool (*openExisting)(CC4Group* const this, const char* const path);

	bool (*save)(CC4Group* const this, const char* const path);
	bool (*saveOverwrite)(CC4Group* const this, const char* const path);

	// extraction to disk
	bool (*extractAll)(CC4Group* const this, const char* const targetPath);
	bool (*extractSingle)(CC4Group* const this, const char* const entryPath, const char* const targetPath);

	// the group owns the data pointed to. the pointer is valid until the group destructor is called
	bool (*getEntryData)(const CC4Group* const this, const char* const entryPath, const void** const data, size_t* const size);

	// the returned error message pointer is valid until the next call to getErrorMessage is issued or the group is destructed
	const char* (*getErrorMessage)(CC4Group* const this);

	int32_t (*getErrorCode)(const CC4Group* const this);

	const char* (*getErrorMethod)(const CC4Group* const this);
	const char* (*getErrorCauser)(const CC4Group* const this);

	struct {
		CC4Group_TmpMemoryStrategy Memory;
		CC4Group_TmpMemoryStrategy File;
		CC4Group_TmpMemoryStrategy Auto;
	} const TmpMemoryStrategies;

	void (*setTmpMemoryStrategy)(const CC4Group_TmpMemoryStrategy strategy);

	// group metadata handling
	bool (*setMaker)(CC4Group* const this, const char* const maker, const char* const path, bool const recursive);
	bool (*setCreation)(CC4Group* const this, int32_t const creation, const char* const path, bool const recursive);
	bool (*setOfficial)(CC4Group* const this, bool const official, const char* const path, bool const recursive);
	bool (*setExecutable)(CC4Group* const this, bool const executable, const char* const path);

	bool (*getEntryInfo)(CC4Group* const this, const char* const path, CC4Group_EntryInfo* const info);
	bool (*getEntryInfos)(CC4Group* const this, const char* const path, CC4Group_EntryInfo** const infos, size_t* const size);

	// modifying the group
	bool (*deleteEntry)(CC4Group* const this, const char* const path, bool const recursive);
	bool (*renameEntry)(CC4Group* const this, const char* const oldPath, const char* const newPath);
	bool (*createDirectory)(CC4Group* const this, const char* const path);

	// ownership of the data is taken by the group
	bool (*createFile)(CC4Group* const this, const char* const path, void* const data, size_t const size);
	// ownership of the data is taken by the group
	bool (*setEntryData)(const CC4Group* const this, const char* const entryPath, void* const data, size_t const size);
} const CC4Group_API;

#ifndef CC4GROUP_DYNAMIC_LOAD
extern CC4Group_API cc4group;
#endif

#ifdef __cplusplus
}
#undef this
#undef new
#undef delete
#endif