|
@@ -0,0 +1,104 @@
|
|
|
|
|
+#include "stdafx.h"
|
|
|
|
|
+#include "CSndHandler.h"
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+CSndHandler::~CSndHandler()
|
|
|
|
|
+{
|
|
|
|
|
+ entries.clear();
|
|
|
|
|
+ file.close();
|
|
|
|
|
+}
|
|
|
|
|
+CSndHandler::CSndHandler(std::string fname):CHUNK(65535)
|
|
|
|
|
+{
|
|
|
|
|
+ file.open(fname.c_str(),std::ios::binary);
|
|
|
|
|
+ if (!file.is_open())
|
|
|
|
|
+ throw new std::exception((std::string("Cannot open ")+fname).c_str());
|
|
|
|
|
+ int nr = readNormalNr(0,4);
|
|
|
|
|
+ char tempc;
|
|
|
|
|
+ for (int i=0;i<nr;i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ Entry entry;
|
|
|
|
|
+ while(true)
|
|
|
|
|
+ {
|
|
|
|
|
+ file.read(&tempc,1);
|
|
|
|
|
+ if (tempc)
|
|
|
|
|
+ entry.name+=tempc;
|
|
|
|
|
+ else break;
|
|
|
|
|
+ }
|
|
|
|
|
+ entry.name+='.';
|
|
|
|
|
+ while(true)
|
|
|
|
|
+ {
|
|
|
|
|
+ file.read(&tempc,1);
|
|
|
|
|
+ if (tempc)
|
|
|
|
|
+ entry.name+=tempc;
|
|
|
|
|
+ else break;
|
|
|
|
|
+ }
|
|
|
|
|
+ file.seekg(40-entry.name.length()-1,std::ios_base::cur);
|
|
|
|
|
+ entry.offset = readNormalNr(-1,4);
|
|
|
|
|
+ entry.size = readNormalNr(-1,4);
|
|
|
|
|
+ entries.push_back(entry);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+int CSndHandler::readNormalNr (int pos, int bytCon)
|
|
|
|
|
+{
|
|
|
|
|
+ if (pos>=0)
|
|
|
|
|
+ file.seekg(pos,std::ios_base::beg);
|
|
|
|
|
+ int ret=0;
|
|
|
|
|
+ int amp=1;
|
|
|
|
|
+ unsigned char zcz=0;
|
|
|
|
|
+ for (int i=0; i<bytCon; i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ file.read((char*)(&zcz),1);
|
|
|
|
|
+ ret+=zcz*amp;
|
|
|
|
|
+ amp*=256;
|
|
|
|
|
+ }
|
|
|
|
|
+ return ret;
|
|
|
|
|
+}
|
|
|
|
|
+void CSndHandler::extract(int index, std::string dstfile) //saves selected file
|
|
|
|
|
+{
|
|
|
|
|
+ std::ofstream out(dstfile.c_str(),std::ios_base::binary);
|
|
|
|
|
+ file.seekg(entries[index].offset,std::ios_base::beg);
|
|
|
|
|
+ int toRead=entries[index].size;
|
|
|
|
|
+ char * buffer = new char[std::min(CHUNK,entries[index].size)];
|
|
|
|
|
+ while (toRead>CHUNK)
|
|
|
|
|
+ {
|
|
|
|
|
+ file.read(buffer,CHUNK);
|
|
|
|
|
+ out.write(buffer,CHUNK);
|
|
|
|
|
+ toRead-=CHUNK;
|
|
|
|
|
+ }
|
|
|
|
|
+ file.read(buffer,toRead);
|
|
|
|
|
+ out.write(buffer,toRead);
|
|
|
|
|
+ out.close();
|
|
|
|
|
+}
|
|
|
|
|
+void CSndHandler::extract(std::string srcfile, std::string dstfile, bool caseSens) //saves selected file
|
|
|
|
|
+{
|
|
|
|
|
+ if (caseSens)
|
|
|
|
|
+ {
|
|
|
|
|
+ for (int i=0;i<entries.size();i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (entries[i].name==srcfile)
|
|
|
|
|
+ extract(i,dstfile);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ std::transform(srcfile.begin(),srcfile.end(),srcfile.begin(),tolower);
|
|
|
|
|
+ for (int i=0;i<entries.size();i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (entries[i].name==srcfile)
|
|
|
|
|
+ {
|
|
|
|
|
+ std::string por = entries[i].name;
|
|
|
|
|
+ std::transform(por.begin(),por.end(),por.begin(),tolower);
|
|
|
|
|
+ if (por==srcfile)
|
|
|
|
|
+ extract(i,dstfile);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+unsigned char * CSndHandler::extract (int index, int & size)
|
|
|
|
|
+{
|
|
|
|
|
+ size = entries[index].size;
|
|
|
|
|
+ unsigned char * ret = new unsigned char[size];
|
|
|
|
|
+ file.seekg(entries[index].offset,std::ios_base::beg);
|
|
|
|
|
+ file.read((char*)ret,entries[index].size);
|
|
|
|
|
+ return ret;
|
|
|
|
|
+}
|