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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#include "fileload.h"
extern "C" void UncompressBackward(void *bottom);
void *LoadFile(FileHandle *handle, const char *name) {
int entryNum = DVDConvertPathToEntrynum(name);
DVDHandle dvdhandle;
if (!DVDFastOpen(entryNum, &dvdhandle)) {
return 0;
}
handle->length = dvdhandle.length;
handle->filePtr = EGG__Heap__alloc((handle->length+0x1F) & ~0x1F, 0x20, GetArchiveHeap());
int ret = DVDReadPrio(&dvdhandle, handle->filePtr, (handle->length+0x1F) & ~0x1F, 0, 2);
DVDClose(&dvdhandle);
return handle->filePtr;
}
/*void *LoadCompressedFile(FileHandle *handle, const char *name) {
int entryNum = DVDConvertPathToEntrynum(name);
DVDHandle dvdhandle;
if (!DVDFastOpen(entryNum, &dvdhandle)) {
return 0;
}
u32 infoBlock[0x20 / sizeof(u32)] __attribute__ ((aligned(32)));
DVDReadPrio(&dvdhandle, infoBlock, 0x20, dvdhandle.length - 8, 2);
// Reverse it!
infoBlock[1] = (infoBlock[1] >> 24) | ((infoBlock[1] >> 8) & 0xFF00) | ((infoBlock[1] & 0xFF00) << 8) | ((infoBlock[1] & 0xFF) << 24);
u32 uncompSize = dvdhandle.length + infoBlock[1];
handle->length = uncompSize;
handle->filePtr = EGG__Heap__alloc((uncompSize+0x1F) & ~0x1F, 0x20, GetArchiveHeap());
int ret = DVDReadPrio(&dvdhandle, handle->filePtr, (dvdhandle.length+0x1F) & ~0x1F, 0, 2);
DVDClose(&dvdhandle);
UncompressBackward((void*)((u32)handle->filePtr + dvdhandle.length));
return handle->filePtr;
}*/
bool FreeFile(FileHandle *handle) {
if (!handle) return false;
if (handle->filePtr) {
EGG__Heap__free(handle->filePtr, GetArchiveHeap());
}
handle->filePtr = 0;
handle->length = 0;
return true;
}
File::File() {
m_loaded = false;
}
File::~File() {
close();
}
bool File::open(const char *filename) {
if (m_loaded)
close();
void *ret = LoadFile(&m_handle, filename);
if (ret != 0)
m_loaded = true;
return (ret != 0);
}
/*bool File::openCompressed(const char *filename) {
if (m_loaded)
close();
void *ret = LoadCompressedFile(&m_handle, filename);
if (ret != 0)
m_loaded = true;
return (ret != 0);
}*/
void File::close() {
if (!m_loaded)
return;
m_loaded = false;
FreeFile(&m_handle);
}
bool File::isOpen() {
return m_loaded;
}
void *File::ptr() {
if (m_loaded)
return m_handle.filePtr;
else
return 0;
}
u32 File::length() {
if (m_loaded)
return m_handle.length;
else
return 0xFFFFFFFF;
}
|