CSndHandler.cpp 5.5 KB

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