Guest User

Untitled

a guest
Jul 9th, 2011
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.98 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <tchar.h>
  6. #ifndef _unzip_H
  7. #define _unzip_H
  8.  
  9. // UNZIPPING functions -- for unzipping.
  10. // This file is a repackaged form of extracts from the zlib code available
  11. // at www.gzip.org/zlib, by Jean-Loup Gailly and Mark Adler. The original
  12. // copyright notice may be found in unzip.cpp. The repackaging was done
  13. // by Lucian Wischik to simplify and extend its use in Windows/C++. Also
  14. // encryption and unicode filenames have been added.
  15.  
  16.  
  17. #ifndef _zip_H
  18. DECLARE_HANDLE(HZIP);
  19. #endif
  20. // An HZIP identifies a zip file that has been opened
  21.  
  22. typedef DWORD ZRESULT;
  23. // return codes from any of the zip functions. Listed later.
  24.  
  25. typedef struct
  26. { int index;                 // index of this file within the zip
  27.   TCHAR name[MAX_PATH];      // filename within the zip
  28.   DWORD attr;                // attributes, as in GetFileAttributes.
  29.   FILETIME atime,ctime,mtime;// access, create, modify filetimes
  30.   long comp_size;            // sizes of item, compressed and uncompressed. These
  31.   long unc_size;             // may be -1 if not yet known (e.g. being streamed in)
  32. } ZIPENTRY;
  33.  
  34.  
  35. HZIP OpenZip(const TCHAR *fn, const char *password);
  36. HZIP OpenZip(void *z,unsigned int len, const char *password);
  37. HZIP OpenZipHandle(HANDLE h, const char *password);
  38. // OpenZip - opens a zip file and returns a handle with which you can
  39. // subsequently examine its contents. You can open a zip file from:
  40. // from a pipe:             OpenZipHandle(hpipe_read,0);
  41. // from a file (by handle): OpenZipHandle(hfile,0);
  42. // from a file (by name):   OpenZip("c:\\test.zip","password");
  43. // from a memory block:     OpenZip(bufstart, buflen,0);
  44. // If the file is opened through a pipe, then items may only be
  45. // accessed in increasing order, and an item may only be unzipped once,
  46. // although GetZipItem can be called immediately before and after unzipping
  47. // it. If it's opened in any other way, then full random access is possible.
  48. // Note: pipe input is not yet implemented.
  49. // Note: zip passwords are ascii, not unicode.
  50. // Note: for windows-ce, you cannot close the handle until after CloseZip.
  51. // but for real windows, the zip makes its own copy of your handle, so you
  52. // can close yours anytime.
  53.  
  54. ZRESULT GetZipItem(HZIP hz, int index, ZIPENTRY *ze);
  55. // GetZipItem - call this to get information about an item in the zip.
  56. // If index is -1 and the file wasn't opened through a pipe,
  57. // then it returns information about the whole zipfile
  58. // (and in particular ze.index returns the number of index items).
  59. // Note: the item might be a directory (ze.attr & FILE_ATTRIBUTE_DIRECTORY)
  60. // See below for notes on what happens when you unzip such an item.
  61. // Note: if you are opening the zip through a pipe, then random access
  62. // is not possible and GetZipItem(-1) fails and you can't discover the number
  63. // of items except by calling GetZipItem on each one of them in turn,
  64. // starting at 0, until eventually the call fails. Also, in the event that
  65. // you are opening through a pipe and the zip was itself created into a pipe,
  66. // then then comp_size and sometimes unc_size as well may not be known until
  67. // after the item has been unzipped.
  68.  
  69. ZRESULT FindZipItem(HZIP hz, const TCHAR *name, bool ic, int *index, ZIPENTRY *ze);
  70. // FindZipItem - finds an item by name. ic means 'insensitive to case'.
  71. // It returns the index of the item, and returns information about it.
  72. // If nothing was found, then index is set to -1 and the function returns
  73. // an error code.
  74.  
  75. ZRESULT UnzipItem(HZIP hz, int index, const TCHAR *fn);
  76. ZRESULT UnzipItem(HZIP hz, int index, void *z,unsigned int len);
  77. ZRESULT UnzipItemHandle(HZIP hz, int index, HANDLE h);
  78. // UnzipItem - given an index to an item, unzips it. You can unzip to:
  79. // to a pipe:             UnzipItemHandle(hz,i, hpipe_write);
  80. // to a file (by handle): UnzipItemHandle(hz,i, hfile);
  81. // to a file (by name):   UnzipItem(hz,i, ze.name);
  82. // to a memory block:     UnzipItem(hz,i, buf,buflen);
  83. // In the final case, if the buffer isn't large enough to hold it all,
  84. // then the return code indicates that more is yet to come. If it was
  85. // large enough, and you want to know precisely how big, GetZipItem.
  86. // Note: zip files are normally stored with relative pathnames. If you
  87. // unzip with ZIP_FILENAME a relative pathname then the item gets created
  88. // relative to the current directory - it first ensures that all necessary
  89. // subdirectories have been created. Also, the item may itself be a directory.
  90. // If you unzip a directory with ZIP_FILENAME, then the directory gets created.
  91. // If you unzip it to a handle or a memory block, then nothing gets created
  92. // and it emits 0 bytes.
  93. ZRESULT SetUnzipBaseDir(HZIP hz, const TCHAR *dir);
  94. // if unzipping to a filename, and it's a relative filename, then it will be relative to here.
  95. // (defaults to current-directory).
  96.  
  97.  
  98. ZRESULT CloseZip(HZIP hz);
  99. // CloseZip - the zip handle must be closed with this function.
  100.  
  101. unsigned int FormatZipMessage(ZRESULT code, TCHAR *buf,unsigned int len);
  102. // FormatZipMessage - given an error code, formats it as a string.
  103. // It returns the length of the error message. If buf/len points
  104. // to a real buffer, then it also writes as much as possible into there.
  105.  
  106.  
  107. // These are the result codes:
  108. #define ZR_OK         0x00000000     // nb. the pseudo-code zr-recent is never returned,
  109. #define ZR_RECENT     0x00000001     // but can be passed to FormatZipMessage.
  110. // The following come from general system stuff (e.g. files not openable)
  111. #define ZR_GENMASK    0x0000FF00
  112. #define ZR_NODUPH     0x00000100     // couldn't duplicate the handle
  113. #define ZR_NOFILE     0x00000200     // couldn't create/open the file
  114. #define ZR_NOALLOC    0x00000300     // failed to allocate some resource
  115. #define ZR_WRITE      0x00000400     // a general error writing to the file
  116. #define ZR_NOTFOUND   0x00000500     // couldn't find that file in the zip
  117. #define ZR_MORE       0x00000600     // there's still more data to be unzipped
  118. #define ZR_CORRUPT    0x00000700     // the zipfile is corrupt or not a zipfile
  119. #define ZR_READ       0x00000800     // a general error reading the file
  120. #define ZR_PASSWORD   0x00001000     // we didn't get the right password to unzip the file
  121. // The following come from mistakes on the part of the caller
  122. #define ZR_CALLERMASK 0x00FF0000
  123. #define ZR_ARGS       0x00010000     // general mistake with the arguments
  124. #define ZR_NOTMMAP    0x00020000     // tried to ZipGetMemory, but that only works on mmap zipfiles, which yours wasn't
  125. #define ZR_MEMSIZE    0x00030000     // the memory size is too small
  126. #define ZR_FAILED     0x00040000     // the thing was already failed when you called this function
  127. #define ZR_ENDED      0x00050000     // the zip creation has already been closed
  128. #define ZR_MISSIZE    0x00060000     // the indicated input file size turned out mistaken
  129. #define ZR_PARTIALUNZ 0x00070000     // the file had already been partially unzipped
  130. #define ZR_ZMODE      0x00080000     // tried to mix creating/opening a zip
  131. // The following come from bugs within the zip library itself
  132. #define ZR_BUGMASK    0xFF000000
  133. #define ZR_NOTINITED  0x01000000     // initialisation didn't work
  134. #define ZR_SEEK       0x02000000     // trying to seek in an unseekable file
  135. #define ZR_NOCHANGE   0x04000000     // changed its mind on storage, but not allowed
  136. #define ZR_FLATE      0x05000000     // an internal error in the de/inflation code
  137.  
  138.  
  139.  
  140.  
  141.  
  142. // e.g.
  143. //
  144. // SetCurrentDirectory("c:\\docs\\stuff");
  145. // HZIP hz = OpenZip("c:\\stuff.zip",0);
  146. // ZIPENTRY ze; GetZipItem(hz,-1,&ze); int numitems=ze.index;
  147. // for (int i=0; i<numitems; i++)
  148. // { GetZipItem(hz,i,&ze);
  149. //   UnzipItem(hz,i,ze.name);
  150. // }
  151. // CloseZip(hz);
  152. //
  153. //
  154. // HRSRC hrsrc = FindResource(hInstance,MAKEINTRESOURCE(1),RT_RCDATA);
  155. // HANDLE hglob = LoadResource(hInstance,hrsrc);
  156. // void *zipbuf=LockResource(hglob);
  157. // unsigned int ziplen=SizeofResource(hInstance,hrsrc);
  158. // HZIP hz = OpenZip(zipbuf, ziplen, 0);
  159. //   - unzip to a membuffer -
  160. // ZIPENTRY ze; int i; FindZipItem(hz,"file.dat",true,&i,&ze);
  161. // char *ibuf = new char[ze.unc_size];
  162. // UnzipItem(hz,i, ibuf, ze.unc_size);
  163. // delete[] ibuf;
  164. //   - unzip to a fixed membuff -
  165. // ZIPENTRY ze; int i; FindZipItem(hz,"file.dat",true,&i,&ze);
  166. // char ibuf[1024]; ZRESULT zr=ZR_MORE; unsigned long totsize=0;
  167. // while (zr==ZR_MORE)
  168. // { zr = UnzipItem(hz,i, ibuf,1024);
  169. //   unsigned long bufsize=1024; if (zr==ZR_OK) bufsize=ze.unc_size-totsize;
  170. //   totsize+=bufsize;
  171. // }
  172. //   - unzip to a pipe -
  173. // HANDLE hwrite; HANDLE hthread=CreateWavReaderThread(&hwrite);
  174. // int i; ZIPENTRY ze; FindZipItem(hz,"sound.wav",true,&i,&ze);
  175. // UnzipItemHandle(hz,i, hwrite);
  176. // CloseHandle(hwrite);
  177. // WaitForSingleObject(hthread,INFINITE);
  178. // CloseHandle(hwrite); CloseHandle(hthread);
  179. //   - finished -
  180. // CloseZip(hz);
  181. // // note: no need to free resources obtained through Find/Load/LockResource
  182. //
  183. //
  184. // SetCurrentDirectory("c:\\docs\\pipedzipstuff");
  185. // HANDLE hread,hwrite; CreatePipe(&hread,&hwrite,0,0);
  186. // CreateZipWriterThread(hwrite);
  187. // HZIP hz = OpenZipHandle(hread,0);
  188. // for (int i=0; ; i++)
  189. // { ZIPENTRY ze;
  190. //   ZRESULT zr=GetZipItem(hz,i,&ze); if (zr!=ZR_OK) break; // no more
  191. //   UnzipItem(hz,i, ze.name);
  192. // }
  193. // CloseZip(hz);
  194. //
  195. //
  196.  
  197.  
  198.  
  199.  
  200. // Now we indulge in a little skullduggery so that the code works whether
  201. // the user has included just zip or both zip and unzip.
  202. // Idea: if header files for both zip and unzip are present, then presumably
  203. // the cpp files for zip and unzip are both present, so we will call
  204. // one or the other of them based on a dynamic choice. If the header file
  205. // for only one is present, then we will bind to that particular one.
  206. ZRESULT CloseZipU(HZIP hz);
  207. unsigned int FormatZipMessageU(ZRESULT code, TCHAR *buf,unsigned int len);
  208. bool IsZipHandleU(HZIP hz);
  209. #ifdef _zip_H
  210. #undef CloseZip
  211. #define CloseZip(hz) (IsZipHandleU(hz)?CloseZipU(hz):CloseZipZ(hz))
  212. #else
  213. #define CloseZip CloseZipU
  214. #define FormatZipMessage FormatZipMessageU
  215. #endif
  216.  
  217.  
  218.  
  219. #endif // _unzip_H
Advertisement
Add Comment
Please, Sign In to add comment