CSndHandler.cpp 5.8 KB

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