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