resource.cpp
上传用户:maxiaolivb
上传日期:2022-06-07
资源大小:915k
文件大小:6k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.5
  3. ** Copyright (C) 2003-2004, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** Core functions implementation: resources management
  7. */
  8. #include "hge_impl.h"
  9. #define NOCRYPT
  10. //#define NOUNCRYPT
  11. #include "ZLIBunzip.h"
  12. bool CALL HGE_Impl::Resource_AttachPack(const char *filename, const char *password)
  13. {
  14. char *szName;
  15. CResourceList *resItem=res;
  16. unzFile zip;
  17. szName=Resource_MakePath(filename);
  18. strupr(szName);
  19. while(resItem)
  20. {
  21. if(!strcmp(szName,resItem->filename)) return false;
  22. resItem=resItem->next;
  23. }
  24. zip=unzOpen(szName);
  25. if(!zip) return false;
  26. unzClose(zip);
  27. resItem=new CResourceList;
  28. strcpy(resItem->filename, szName);
  29. if(password) strcpy(resItem->password, password);
  30. else resItem->password[0]=0;
  31. resItem->next=res;
  32. res=resItem;
  33. return true;
  34. }
  35. void CALL HGE_Impl::Resource_RemovePack(const char *filename)
  36. {
  37. char *szName;
  38. CResourceList *resItem=res, *resPrev=0;
  39. szName=Resource_MakePath(filename);
  40. strupr(szName);
  41. while(resItem)
  42. {
  43. if(!strcmp(szName,resItem->filename))
  44. {
  45. if(resPrev) resPrev->next=resItem->next;
  46. else res=resItem->next;
  47. delete resItem;
  48. break;
  49. }
  50. resPrev=resItem;
  51. resItem=resItem->next;
  52. }
  53. }
  54. void CALL HGE_Impl::Resource_RemoveAllPacks()
  55. {
  56. CResourceList *resItem=res, *resNextItem;
  57. while(resItem)
  58. {
  59. resNextItem=resItem->next;
  60. delete resItem;
  61. resItem=resNextItem;
  62. }
  63. res=0;
  64. }
  65. void* CALL HGE_Impl::Resource_Load(const char *filename, DWORD *size)
  66. {
  67. static char *res_err="Can't load resource: %s";
  68. CResourceList *resItem=res;
  69. char szName[_MAX_PATH];
  70. char szZipName[_MAX_PATH];
  71. unzFile zip;
  72. unz_file_info file_info;
  73. int done, i;
  74. void *ptr;
  75. HANDLE hF;
  76. if(filename[0]=='\' || filename[0]=='/' || filename[1]==':') goto _fromfile; // skip absolute paths
  77. // Load from pack
  78.  
  79. strcpy(szName,filename);
  80. strupr(szName);
  81. for(i=0; szName[i]; i++) { if(szName[i]=='/') szName[i]='\'; }
  82. while(resItem)
  83. {
  84. zip=unzOpen(resItem->filename);
  85. done=unzGoToFirstFile(zip);
  86. while(done==UNZ_OK)
  87. {
  88. unzGetCurrentFileInfo(zip, &file_info, szZipName, sizeof(szZipName), NULL, 0, NULL, 0);
  89. strupr(szZipName);
  90. for(i=0; szZipName[i]; i++) { if(szZipName[i]=='/') szZipName[i]='\'; }
  91. if(!strcmp(szName,szZipName))
  92. {
  93. if(unzOpenCurrentFilePassword(zip, resItem->password[0] ? resItem->password : 0) != UNZ_OK)
  94. {
  95. unzClose(zip);
  96. sprintf(szName, res_err, filename);
  97. _PostError(szName);
  98. return 0;
  99. }
  100. ptr = malloc(file_info.uncompressed_size);
  101. if(!ptr)
  102. {
  103. unzCloseCurrentFile(zip);
  104. unzClose(zip);
  105. sprintf(szName, res_err, filename);
  106. _PostError(szName);
  107. return 0;
  108. }
  109. if(unzReadCurrentFile(zip, ptr, file_info.uncompressed_size) < 0)
  110. {
  111. unzCloseCurrentFile(zip);
  112. unzClose(zip);
  113. free(ptr);
  114. sprintf(szName, res_err, filename);
  115. _PostError(szName);
  116. return 0;
  117. }
  118. unzCloseCurrentFile(zip);
  119. unzClose(zip);
  120. if(size) *size=file_info.uncompressed_size;
  121. return ptr;
  122. }
  123. done=unzGoToNextFile(zip);
  124. }
  125. unzClose(zip);
  126. resItem=resItem->next;
  127. }
  128. // Load from file
  129. _fromfile:
  130. hF = CreateFile(Resource_MakePath(filename), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
  131. if(hF == INVALID_HANDLE_VALUE)
  132. {
  133. sprintf(szName, res_err, filename);
  134. _PostError(szName);
  135. return 0;
  136. }
  137. file_info.uncompressed_size = GetFileSize(hF, NULL);
  138. ptr = malloc(file_info.uncompressed_size);
  139. if(!ptr)
  140. {
  141. CloseHandle(hF);
  142. sprintf(szName, res_err, filename);
  143. _PostError(szName);
  144. return 0;
  145. }
  146. if(ReadFile(hF, ptr, file_info.uncompressed_size, &file_info.uncompressed_size, NULL ) == 0)
  147. {
  148. CloseHandle(hF);
  149. free(ptr);
  150. sprintf(szName, res_err, filename);
  151. _PostError(szName);
  152. return 0;
  153. }
  154. CloseHandle(hF);
  155. if(size) *size=file_info.uncompressed_size;
  156. return ptr;
  157. }
  158. void CALL HGE_Impl::Resource_Free(void *res)
  159. {
  160. if(res) free(res);
  161. }
  162. char* CALL HGE_Impl::Resource_MakePath(const char *filename)
  163. {
  164. int i;
  165. if(filename[0]=='\' || filename[0]=='/' || filename[1]==':') strcpy(szTmpFilename, filename);
  166. else
  167. {
  168. strcpy(szTmpFilename, szAppPath);
  169. if(filename) strcat(szTmpFilename, filename);
  170. }
  171. for(i=0; szTmpFilename[i]; i++) { if(szTmpFilename[i]=='/') szTmpFilename[i]='\'; }
  172. return szTmpFilename;
  173. }
  174. char* CALL HGE_Impl::Resource_EnumFiles(const char *wildcard)
  175. {
  176. if(wildcard)
  177. {
  178. if(hSearch) { FindClose(hSearch); hSearch=0; }
  179. hSearch=FindFirstFile(Resource_MakePath(wildcard), &SearchData);
  180. if(hSearch==INVALID_HANDLE_VALUE) { hSearch=0; return 0; }
  181. if(!(SearchData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) return SearchData.cFileName;
  182. else return Resource_EnumFiles();
  183. }
  184. else
  185. {
  186. if(!hSearch) return 0;
  187. for(;;)
  188. {
  189. if(!FindNextFile(hSearch, &SearchData)) { FindClose(hSearch); hSearch=0; return 0; }
  190. if(!(SearchData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) return SearchData.cFileName;
  191. }
  192. }
  193. }
  194. char* CALL HGE_Impl::Resource_EnumFolders(const char *wildcard)
  195. {
  196. if(wildcard)
  197. {
  198. if(hSearch) { FindClose(hSearch); hSearch=0; }
  199. hSearch=FindFirstFile(Resource_MakePath(wildcard), &SearchData);
  200. if(hSearch==INVALID_HANDLE_VALUE) { hSearch=0; return 0; }
  201. if((SearchData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
  202.    strcmp(SearchData.cFileName,".") && strcmp(SearchData.cFileName,".."))
  203. return SearchData.cFileName;
  204. else return Resource_EnumFolders();
  205. }
  206. else
  207. {
  208. if(!hSearch) return 0;
  209. for(;;)
  210. {
  211. if(!FindNextFile(hSearch, &SearchData)) { FindClose(hSearch); hSearch=0; return 0; }
  212. if((SearchData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
  213.    strcmp(SearchData.cFileName,".") && strcmp(SearchData.cFileName,".."))
  214. return SearchData.cFileName;
  215. }
  216. }
  217. }