61 lines
1.6 KiB
C++
Executable File
61 lines
1.6 KiB
C++
Executable File
#ifdef READER_CPP
|
|
#include "zipreader.hpp"
|
|
|
|
unsigned ZipReader::size() {
|
|
return filesize;
|
|
}
|
|
|
|
uint8_t* ZipReader::read(unsigned length) {
|
|
if(!filesize) return 0;
|
|
|
|
uint8_t *data = 0;
|
|
if(length <= filesize) {
|
|
//read the entire file into RAM
|
|
data = new(zeromemory) uint8_t[filesize];
|
|
unzReadCurrentFile(zipfile, data, filesize);
|
|
} else { /* length > filesize */
|
|
//read the entire file into RAM, pad the rest with 0x00s
|
|
data = new(zeromemory) uint8_t[length];
|
|
unzReadCurrentFile(zipfile, data, filesize);
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
bool ZipReader::ready() {
|
|
return zipready;
|
|
}
|
|
|
|
ZipReader::ZipReader(const char *fn) : filesize(0), zipready(false) {
|
|
unz_file_info cFileInfo; //Create variable to hold info for a compressed file
|
|
char cFileName[sizeof(cname)];
|
|
|
|
if(zipfile = unzOpen(fn)) { //Open zip file
|
|
for(int cFile = unzGoToFirstFile(zipfile); cFile == UNZ_OK; cFile = unzGoToNextFile(zipfile)) {
|
|
//Gets info on current file, and places it in cFileInfo
|
|
unzGetCurrentFileInfo(zipfile, &cFileInfo, cFileName, sizeof(cname), 0, 0, 0, 0);
|
|
|
|
//verify uncompressed file is not bigger than max ROM size
|
|
if((cFileInfo.uncompressed_size <= 0x1000000 + 512) && (cFileInfo.uncompressed_size > filesize)) {
|
|
strcpy(cname, cFileName);
|
|
filesize = cFileInfo.uncompressed_size;
|
|
}
|
|
}
|
|
|
|
if(filesize) {
|
|
unzLocateFile(zipfile, cname, 1);
|
|
unzOpenCurrentFile(zipfile);
|
|
zipready = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
ZipReader::~ZipReader() {
|
|
if(zipfile) {
|
|
unzCloseCurrentFile(zipfile);
|
|
unzClose(zipfile);
|
|
}
|
|
}
|
|
|
|
#endif //ifdef READER_CPP
|