+\r
+\r
+#include "app.h"\r
+#include "Unzip.h"\r
+#include "zlib.h"\r
+\r
+// Decompress a 'deflate' compressed buffer\r
+static int Inflate(unsigned char *dest,int destLen, unsigned char *src,int srcLen)\r
+{\r
+ z_stream stream;\r
+\r
+ memset(&stream,0,sizeof(stream));\r
+\r
+ stream.next_in =src;\r
+ stream.avail_in =srcLen;\r
+ stream.next_out =dest;\r
+ stream.avail_out=destLen;\r
+ inflateInit2(&stream,-15);\r
+ inflate(&stream,Z_FINISH);\r
+ inflateEnd(&stream);\r
+\r
+ return 0;\r
+}\r
+\r
+static int Get32(unsigned char *src)\r
+{\r
+ return src[0] | (src[1]<<8) | (src[2]<<16) | (src[3]<<24);\r
+}\r
+\r
+// --------------------------------------------------------------\r
+Unzip::Unzip()\r
+{\r
+ memset(this,0,sizeof(*this));\r
+}\r
+\r
+int Unzip::gotoFirstFile()\r
+{\r
+ headerPos=0;\r
+ return 0;\r
+}\r
+\r
+int Unzip::fileOpen()\r
+{\r
+ int ret=0,okay=0;\r
+\r
+ fseek(file,headerPos,SEEK_SET);\r
+\r
+ // Read in file entry header:\r
+ ret=fread(head,1,sizeof(head),file);\r
+ if (ret!=sizeof(head)) return 1;\r
+\r
+ // Check header:\r
+ if (head[0]=='P' && head[1]=='K' && head[2]==3 && head[3]==4) okay=1;\r
+ if (okay==0) return 1;\r
+\r
+ // Get compressed and uncompressed sizes:\r
+ srcLen =Get32(head+0x12);\r
+ dataLen=Get32(head+0x16);\r
+\r
+ // Get size of name and extra fields:\r
+ nameLen=Get32(head+0x1a);\r
+ extraLen=nameLen>>16; nameLen&=0xffff;\r
+\r
+ // Read in name:\r
+ name=(char *)malloc(nameLen+1); if (name==NULL) return 1;\r
+ memset(name,0,nameLen+1);\r
+ fread(name,1,nameLen,file);\r
+\r
+ // Find position of compressed data in the file\r
+ compPos=headerPos+sizeof(head);\r
+ compPos+=nameLen+extraLen;\r
+\r
+ return 0;\r
+}\r
+\r
+int Unzip::fileClose()\r
+{\r
+ free(name); name=NULL;\r
+\r
+ // Go to next header:\r
+ headerPos=compPos+srcLen;\r
+\r
+ srcLen=dataLen=0;\r
+ nameLen=extraLen=0;\r
+\r
+ return 0;\r
+}\r
+\r
+int Unzip::fileDecode(unsigned char *data)\r
+{\r
+ unsigned char *src=NULL;\r
+\r
+ // Go to compressed data:\r
+ fseek(file,compPos,SEEK_SET);\r
+\r
+ // Allocate memory:\r
+ src=(unsigned char *)malloc(srcLen);\r
+ if (src==NULL) { fclose(file); return 1; }\r
+ memset(src,0,srcLen);\r
+\r
+ // Read in compressed version and decompress\r
+ fread(src,1,srcLen,file);\r
+\r
+ Inflate(data,dataLen, src,srcLen);\r
+\r
+ free(src); src=NULL; srcLen=0;\r
+\r
+ return 0;\r
+}\r