CSndHandler.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. #include "../stdafx.h"
  2. #include "CSndHandler.h"
  3. CSndHandler::~CSndHandler()
  4. {
  5. entries.clear();
  6. fimap.clear();
  7. file.close();
  8. }
  9. CSndHandler::CSndHandler(std::string fname):CHUNK(65535)
  10. {
  11. file.open(fname.c_str(),std::ios::binary);
  12. if (!file.is_open())
  13. #ifndef __GNUC__
  14. throw new std::exception((std::string("Cannot open ")+fname).c_str());
  15. #else
  16. throw new std::exception();
  17. #endif
  18. int nr = readNormalNr(0,4);
  19. char tempc;
  20. for (int i=0;i<nr;i++)
  21. {
  22. Entry entry;
  23. while(true)
  24. {
  25. file.read(&tempc,1);
  26. if (tempc)
  27. entry.name+=tempc;
  28. else break;
  29. }
  30. entry.name+='.';
  31. while(true)
  32. {
  33. file.read(&tempc,1);
  34. if (tempc)
  35. entry.name+=tempc;
  36. else break;
  37. }
  38. file.seekg(40-entry.name.length()-1,std::ios_base::cur);
  39. entry.offset = readNormalNr(-1,4);
  40. entry.size = readNormalNr(-1,4);
  41. entries.push_back(entry);
  42. fimap[entry.name] = i;
  43. }
  44. }
  45. int CSndHandler::readNormalNr (int pos, int bytCon)
  46. {
  47. if (pos>=0)
  48. file.seekg(pos,std::ios_base::beg);
  49. int ret=0;
  50. int amp=1;
  51. unsigned char zcz=0;
  52. for (int i=0; i<bytCon; i++)
  53. {
  54. file.read((char*)(&zcz),1);
  55. ret+=zcz*amp;
  56. amp*=256;
  57. }
  58. return ret;
  59. }
  60. void CSndHandler::extract(int index, std::string dstfile) //saves selected file
  61. {
  62. std::ofstream out(dstfile.c_str(),std::ios_base::binary);
  63. file.seekg(entries[index].offset,std::ios_base::beg);
  64. int toRead=entries[index].size;
  65. char * buffer = new char[std::min(CHUNK,entries[index].size)];
  66. while (toRead>CHUNK)
  67. {
  68. file.read(buffer,CHUNK);
  69. out.write(buffer,CHUNK);
  70. toRead-=CHUNK;
  71. }
  72. file.read(buffer,toRead);
  73. out.write(buffer,toRead);
  74. out.close();
  75. }
  76. void CSndHandler::extract(std::string srcfile, std::string dstfile, bool caseSens) //saves selected file
  77. {
  78. if (caseSens)
  79. {
  80. for (size_t i=0;i<entries.size();++i)
  81. {
  82. if (entries[i].name==srcfile)
  83. extract(i,dstfile);
  84. }
  85. }
  86. else
  87. {
  88. std::transform(srcfile.begin(),srcfile.end(),srcfile.begin(),tolower);
  89. for (size_t i=0;i<entries.size();++i)
  90. {
  91. if (entries[i].name==srcfile)
  92. {
  93. std::string por = entries[i].name;
  94. std::transform(por.begin(),por.end(),por.begin(),tolower);
  95. if (por==srcfile)
  96. extract(i,dstfile);
  97. }
  98. }
  99. }
  100. }
  101. MemberFile CSndHandler::getFile(std::string name)
  102. {
  103. MemberFile ret;
  104. std::transform(name.begin(),name.end(),name.begin(),tolower);
  105. for (size_t i=0;i<entries.size();++i)
  106. {
  107. if (entries[i].name==name)
  108. {
  109. std::string por = entries[i].name;
  110. std::transform(por.begin(),por.end(),por.begin(),tolower);
  111. if (por==name)
  112. {
  113. ret.length=entries[i].size;
  114. file.seekg(entries[i].offset,std::ios_base::beg);
  115. ret.ifs=&file;
  116. return ret;
  117. }
  118. }
  119. }
  120. return ret;
  121. }
  122. unsigned char * CSndHandler::extract (int index, int & size)
  123. {
  124. size = entries[index].size;
  125. unsigned char * ret = new unsigned char[size];
  126. file.seekg(entries[index].offset,std::ios_base::beg);
  127. file.read((char*)ret,entries[index].size);
  128. return ret;
  129. }
  130. unsigned char * CSndHandler::extract (std::string srcName, int &size)
  131. {
  132. int index;
  133. std::map<std::string, int>::iterator fit;
  134. if ((fit = fimap.find(srcName)) != fimap.end())
  135. {
  136. index = fit->second;
  137. return this->extract(index, size);
  138. }
  139. size = 0;
  140. return NULL;
  141. }
  142. CVidHandler::~CVidHandler()
  143. {
  144. entries.clear();
  145. file.close();
  146. }
  147. CVidHandler::CVidHandler(std::string fname):CHUNK(65535)
  148. {
  149. file.open(fname.c_str(),std::ios::binary);
  150. if (!file.is_open())
  151. #ifndef __GNUC__
  152. throw new std::exception((std::string("Cannot open ")+fname).c_str());
  153. #else
  154. throw new std::exception();
  155. #endif
  156. int nr = readNormalNr(0,4);
  157. char tempc;
  158. for (int i=0;i<nr;i++)
  159. {
  160. Entry entry;
  161. while(true)
  162. {
  163. file.read(&tempc,1);
  164. if (tempc)
  165. entry.name+=tempc;
  166. else break;
  167. }
  168. entry.something=readNormalNr(-1,4);
  169. file.seekg(44-entry.name.length()-9,std::ios_base::cur);
  170. entry.offset = readNormalNr(-1,4);
  171. if (i>0)
  172. entries[i-1].size=entry.offset-entries[i-1].offset;
  173. if (i==nr-1)
  174. {
  175. file.seekg(0,std::ios::end);
  176. entry.size = ((int)file.tellg())-entry.offset;
  177. file.seekg(0,std::ios::beg);
  178. }
  179. entries.push_back(entry);
  180. }
  181. }
  182. int CVidHandler::readNormalNr (int pos, int bytCon)
  183. {
  184. if (pos>=0)
  185. file.seekg(pos,std::ios_base::beg);
  186. int ret=0;
  187. int amp=1;
  188. unsigned char zcz=0;
  189. for (int i=0; i<bytCon; i++)
  190. {
  191. file.read((char*)(&zcz),1);
  192. ret+=zcz*amp;
  193. amp*=256;
  194. }
  195. return ret;
  196. }
  197. void CVidHandler::extract(int index, std::string dstfile) //saves selected file
  198. {
  199. std::ofstream out(dstfile.c_str(),std::ios_base::binary);
  200. file.seekg(entries[index].offset,std::ios_base::beg);
  201. int toRead=entries[index].size;
  202. char * buffer = new char[std::min(CHUNK,entries[index].size)];
  203. while (toRead>CHUNK)
  204. {
  205. file.read(buffer,CHUNK);
  206. out.write(buffer,CHUNK);
  207. toRead-=CHUNK;
  208. }
  209. file.read(buffer,toRead);
  210. out.write(buffer,toRead);
  211. out.close();
  212. }
  213. void CVidHandler::extract(std::string srcfile, std::string dstfile, bool caseSens) //saves selected file
  214. {
  215. if (caseSens)
  216. {
  217. for (size_t i=0;i<entries.size();++i)
  218. {
  219. if (entries[i].name==srcfile)
  220. extract(i,dstfile);
  221. }
  222. }
  223. else
  224. {
  225. std::transform(srcfile.begin(),srcfile.end(),srcfile.begin(),tolower);
  226. for (size_t i=0;i<entries.size();++i)
  227. {
  228. if (entries[i].name==srcfile)
  229. {
  230. std::string por = entries[i].name;
  231. std::transform(por.begin(),por.end(),por.begin(),tolower);
  232. if (por==srcfile)
  233. extract(i,dstfile);
  234. }
  235. }
  236. }
  237. }
  238. MemberFile CVidHandler::getFile(std::string name)
  239. {
  240. MemberFile ret;
  241. std::transform(name.begin(),name.end(),name.begin(),tolower);
  242. for (size_t i=0;i<entries.size();++i)
  243. {
  244. if (entries[i].name==name)
  245. {
  246. std::string por = entries[i].name;
  247. std::transform(por.begin(),por.end(),por.begin(),tolower);
  248. if (por==name)
  249. {
  250. ret.length=entries[i].size;
  251. file.seekg(entries[i].offset,std::ios_base::beg);
  252. ret.ifs=&file;
  253. return ret;
  254. }
  255. }
  256. }
  257. throw ret;
  258. //return ret;
  259. }