1 #include "BinaryBlob.h"
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 /* FIXME: Abstract to FileSystemUtils! */
8 #include <physfs.h>
9
binaryBlob()10 binaryBlob::binaryBlob()
11 {
12 numberofHeaders = 0;
13 for (int i = 0; i < 128; i += 1)
14 {
15 m_headers[i].valid = false;
16
17 for (int j = 0; j < 48; j += 1)
18 {
19 m_headers[i].name[j] = '\0';
20 }
21 }
22 }
23
24 #ifdef VVV_COMPILEMUSIC
AddFileToBinaryBlob(const char * _path)25 void binaryBlob::AddFileToBinaryBlob(const char* _path)
26 {
27 long size;
28 char * memblock;
29
30 FILE *file = fopen(_path, "rb");
31 if (file != NULL)
32 {
33 fseek(file, 0, SEEK_END);
34 size = ftell(file);
35 fseek(file, 0, SEEK_SET);
36
37 memblock = (char*) malloc(size);
38 fread(memblock, 1, size, file);
39
40 fclose(file);
41
42 printf("The complete file size: %li\n", size);
43
44 m_memblocks[numberofHeaders] = memblock;
45 for (int i = 0; _path[i]; i += 1)
46 {
47 m_headers[numberofHeaders].name[i] = _path[i];
48 }
49
50 m_headers[numberofHeaders].valid = true;
51 m_headers[numberofHeaders].size = size;
52 numberofHeaders += 1;
53 }
54 else
55 {
56 printf("Unable to open file\n");
57 }
58 }
59
writeBinaryBlob(const char * _name)60 void binaryBlob::writeBinaryBlob(const char* _name)
61 {
62 FILE *file = fopen(_name, "wb");
63 if (file != NULL)
64 {
65 fwrite((char*) &m_headers, 1, sizeof(resourceheader) * 128, file);
66
67 for (int i = 0; i < numberofHeaders; i += 1)
68 {
69 fwrite(m_memblocks[i], 1, m_headers[i].size, file);
70 }
71
72 fclose(file);
73 }
74 else
75 {
76 printf("Unable to open new file for writing. Feels bad.\n");
77 }
78 }
79 #endif
80
unPackBinary(const char * name)81 bool binaryBlob::unPackBinary(const char* name)
82 {
83 PHYSFS_sint64 size;
84
85 PHYSFS_File *handle = PHYSFS_openRead(name);
86 if (handle == NULL)
87 {
88 printf("Unable to open file %s\n", name);
89 return false;
90 }
91
92 size = PHYSFS_fileLength(handle);
93
94 PHYSFS_read(handle, &m_headers, 1, sizeof(resourceheader) * 128);
95
96 int offset = 0 + (sizeof(resourceheader) * 128);
97
98 for (int i = 0; i < 128; i += 1)
99 {
100 if (m_headers[i].valid)
101 {
102 PHYSFS_seek(handle, offset);
103 m_memblocks[i] = (char*) malloc(m_headers[i].size);
104 PHYSFS_read(handle, m_memblocks[i], 1, m_headers[i].size);
105 offset += m_headers[i].size;
106 }
107 }
108 PHYSFS_close(handle);
109
110 printf("The complete reloaded file size: %li\n", size);
111
112 for (int i = 0; i < 128; i += 1)
113 {
114 if (m_headers[i].valid == false)
115 {
116 break;
117 }
118
119 printf("%s unpacked\n", m_headers[i].name);
120 }
121
122 return true;
123 }
124
getIndex(const char * _name)125 int binaryBlob::getIndex(const char* _name)
126 {
127 for (int i = 0; i < 128; i += 1)
128 {
129 if (strcmp(_name, m_headers[i].name) == 0)
130 {
131 return i;
132 }
133 }
134 return -1;
135 }
136
getSize(int _index)137 int binaryBlob::getSize(int _index)
138 {
139 return m_headers[_index].size;
140 }
141
getAddress(int _index)142 char* binaryBlob::getAddress(int _index)
143 {
144 return m_memblocks[_index];
145 }
146