CSndHandler.cpp 5.9 KB

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