From 7bb09341a01fb2a8fa965fd975fab2580d5ac35c Mon Sep 17 00:00:00 2001 From: Frank Zago Date: Fri, 19 Jun 2009 04:27:12 +0000 Subject: [PATCH] Derive CSndHandler and CVidHandler from new class CMediaHandler. --- hch/CSndHandler.cpp | 323 +++++++++++++++++--------------------------- hch/CSndHandler.h | 39 ++---- 2 files changed, 141 insertions(+), 221 deletions(-) diff --git a/hch/CSndHandler.cpp b/hch/CSndHandler.cpp index 60910e7e6..26b9bb8db 100644 --- a/hch/CSndHandler.cpp +++ b/hch/CSndHandler.cpp @@ -13,7 +13,7 @@ * */ -CSndHandler::~CSndHandler() +CMediaHandler::~CMediaHandler() { entries.clear(); fimap.clear(); @@ -25,7 +25,7 @@ CSndHandler::~CSndHandler() // a simple structure. However, some post treatment would be necessary: file // size and offsets are little endian, and filename have a NUL in // them. */ -CSndHandler::CSndHandler(std::string fname) +CMediaHandler::CMediaHandler(std::string fname) { try //c-tor of mapped_file_source throws exception on failure { @@ -36,7 +36,97 @@ CSndHandler::CSndHandler(std::string fname) tlog1 << "Cannot open " << fname << std::endl; throw std::string("Cannot open ")+fname; } +} +// Reads a 4 byte integer. Format on file is little endian. +unsigned int CMediaHandler::readNormalNr (const unsigned char *p) +{ + return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); +} + +void CMediaHandler::extract(int index, std::string dstfile) //saves selected file +{ + std::ofstream out(dstfile.c_str(),std::ios_base::binary); + const char *data = mfile->data(); + + out.write(&data[entries[index].offset], entries[index].size); + out.close(); +} + +void CMediaHandler::extract(std::string srcfile, std::string dstfile, bool caseSens) //saves selected file +{ + if (caseSens) + { + for (size_t i=0;idata(); + + return &data[entries[index].offset]; +} + +const char * CMediaHandler::extract (std::string srcName, int &size) +{ + int index; + std::map::iterator fit; + if ((fit = fimap.find(srcName)) != fimap.end()) + { + index = fit->second; + return this->extract(index, size); + } + size = 0; + return NULL; +} + +CSndHandler::CSndHandler(std::string fname) : CMediaHandler::CMediaHandler(fname) +{ const unsigned char *data = (const unsigned char *)mfile->data(); unsigned int numFiles = readNormalNr(&data[0]); @@ -75,209 +165,48 @@ CSndHandler::CSndHandler(std::string fname) } } -// Reads a 4 byte integer. Format on file is little endian. -unsigned int CSndHandler::readNormalNr (const unsigned char *p) +CVidHandler::CVidHandler(std::string fname) : CMediaHandler::CMediaHandler(fname) { - return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); -} + const unsigned char *data = (const unsigned char *)mfile->data(); -void CSndHandler::extract(int index, std::string dstfile) //saves selected file -{ - std::ofstream out(dstfile.c_str(),std::ios_base::binary); - const char *data = mfile->data(); - - out.write(&data[entries[index].offset], entries[index].size); - out.close(); -} + unsigned int numFiles = readNormalNr(&data[0]); -void CSndHandler::extract(std::string srcfile, std::string dstfile, bool caseSens) //saves selected file -{ - if (caseSens) - { - for (size_t i=0;idata(); - - return &data[entries[index].offset]; -} - -const char * CSndHandler::extract (std::string srcName, int &size) -{ - int index; - std::map::iterator fit; - if ((fit = fimap.find(srcName)) != fimap.end()) - { - index = fit->second; - return this->extract(index, size); - } - size = 0; - return NULL; -} - - -CVidHandler::~CVidHandler() -{ - entries.clear(); - file.close(); -} -CVidHandler::CVidHandler(std::string fname):CHUNK(65535) -{ - file.open(fname.c_str(),std::ios::binary); - if (!file.is_open()) -#ifndef __GNUC__ - throw new std::exception((std::string("Cannot open ")+fname).c_str()); -#else - throw new std::exception(); -#endif - int nr = readNormalNr(0,4); - char tempc; - for (int i=0;i0) - entries[i-1].size=entry.offset-entries[i-1].offset; - if (i==nr-1) + + entry.name+='.'; + p++; + + while(*p) { - file.seekg(0,std::ios::end); - entry.size = ((int)file.tellg())-entry.offset; - file.seekg(0,std::ios::beg); + entry.name += *p; + p++; } + + // Read offset and size + p = &data[4+44*i+40]; + entry.offset = readNormalNr(p); + + // There is no size, so check where the next file is + if (i == numFiles - 1) { + entry.size = mfile->size() - entry.offset; + } else { + p = &data[4+44*(i+1)+40]; + int next_offset = readNormalNr(p); + entry.size = next_offset - entry.offset; + } + entries.push_back(entry); + fimap[entry.name] = i; } } -int CVidHandler::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; iCHUNK) - { - file.read(buffer,CHUNK); - out.write(buffer,CHUNK); - toRead-=CHUNK; - } - file.read(buffer,toRead); - out.write(buffer,toRead); - out.close(); -} -void CVidHandler::extract(std::string srcfile, std::string dstfile, bool caseSens) //saves selected file -{ - if (caseSens) - { - for (size_t i=0;i entries; - std::map fimap; // map of wav file and index - ~CSndHandler(); //d-tor - CSndHandler(std::string fname); //c-tor + std::map fimap; // map of file and index + ~CMediaHandler(); //d-tor + CMediaHandler(std::string fname); //c-tor void extract(std::string srcfile, std::string dstfile, bool caseSens=true); //saves selected file const char * extract (std::string srcfile, int & size); //return selecte file data, NULL if file doesn't exist void extract(int index, std::string dstfile); //saves selected file MemberFile getFile(std::string name);//nie testowane - sprawdzic const char * extract (int index, int & size); //return selecte file - NIE TESTOWANE }; -class CVidHandler + +class CSndHandler: public CMediaHandler { -protected: - const int CHUNK; - struct Entry - { - std::string name; - int size, offset, something; - }; - std::ifstream file; - int readNormalNr (int pos, int bytCon); - bool opened; public: - std::vector entries; - ~CVidHandler(); //d-tor - CVidHandler(std::string fname); //c-tor - std::ifstream & extract(std::string srcfile); - void extract(std::string srcfile, std::string dstfile, bool caseSens=true); //saves selected file - unsigned char * extract (std::string srcfile, int & size); //return selecte file, - void extract(int index, std::string dstfile); //saves selected file - MemberFile getFile(std::string name); //nie testowane - sprawdzic + CSndHandler(std::string fname); +}; + +class CVidHandler: public CMediaHandler +{ +public: + CVidHandler(std::string fname); };