You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@corinthia.apache.org by ja...@apache.org on 2015/07/31 21:10:02 UTC

incubator-corinthia git commit: Search for endRecord works in 32/64 bit

Repository: incubator-corinthia
Updated Branches:
  refs/heads/newZipExperiment 91a88b6d0 -> d0ceb0e00


Search for endRecord works in 32/64 bit


Project: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/commit/d0ceb0e0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/tree/d0ceb0e0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/diff/d0ceb0e0

Branch: refs/heads/newZipExperiment
Commit: d0ceb0e009f58527418f00dccf427aa4d0bd8d30
Parents: 91a88b6
Author: jani <ja...@apache.org>
Authored: Fri Jul 31 21:09:16 2015 +0200
Committer: jani <ja...@apache.org>
Committed: Fri Jul 31 21:09:16 2015 +0200

----------------------------------------------------------------------
 DocFormats/headers/DFPlatform.h       |  3 ++
 DocFormats/platform/src/Wrapper_zip.c | 51 ++++++++++++++----------------
 2 files changed, 26 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/d0ceb0e0/DocFormats/headers/DFPlatform.h
----------------------------------------------------------------------
diff --git a/DocFormats/headers/DFPlatform.h b/DocFormats/headers/DFPlatform.h
index cd947b1..09e3b71 100644
--- a/DocFormats/headers/DFPlatform.h
+++ b/DocFormats/headers/DFPlatform.h
@@ -71,6 +71,9 @@ void DFInitOnce(DFOnce *once, DFOnceFunction fun);
 // Zip functions
 typedef struct {
 	FILE *zipFile;
+	int   zipFileCount;
+	int   zipDirSize;
+	int   zipDirOffset;
 } DFextZipHandle;
 typedef DFextZipHandle * DFextZipHandleP;
 

http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/d0ceb0e0/DocFormats/platform/src/Wrapper_zip.c
----------------------------------------------------------------------
diff --git a/DocFormats/platform/src/Wrapper_zip.c b/DocFormats/platform/src/Wrapper_zip.c
index 0066254..8da5664 100644
--- a/DocFormats/platform/src/Wrapper_zip.c
+++ b/DocFormats/platform/src/Wrapper_zip.c
@@ -34,13 +34,16 @@ typedef struct {
    	                                     // Followed by .ZIP file comment (variable size)
 } ZipEndRecord;
 #pragma pack()
-#define WORK_BUF_SIZE 65535
-     
+static const uint32_t ZipEndRecord_signature = 0x06054B50;
+
+
 
 static int readEndRecord(FILE *zipFile, DFextZipHandleP zipHandle)
 {
 	unsigned long fileSize, readBytes, i;
-	unsigned char workBuf[WORK_BUF_SIZE];
+	unsigned char workBuf[1024];
+	ZipEndRecord *rec;
+
 
 	// find end of file, and calculate size
 	if (fseek(zipFile, 0, SEEK_END))
@@ -49,12 +52,27 @@ static int readEndRecord(FILE *zipFile, DFextZipHandleP zipHandle)
 	if ( fileSize <= sizeof(ZipEndRecord) )
 		return -1;
 
-	// Read WORK_BUF_SIZE of filesize from end of file to locate EndRecord
+	// Read size of workBuf of filesize from end of file to locate EndRecord
 	readBytes = (fileSize < sizeof(workBuf)) ? fileSize : sizeof(workBuf);
 	if (fseek(zipFile, fileSize - readBytes, SEEK_SET))
 		return -1;
 	if (fread(workBuf, 1, readBytes, zipFile) < readBytes)
 		return -1;
+
+	// search for EndRecord signature
+	for (i = readBytes - sizeof(ZipEndRecord); i >= 0; i--) {
+		rec = (ZipEndRecord *)(workBuf + i);
+		if (rec->signature == ZipEndRecord_signature)
+			break;
+	}
+	if (i < 0)
+		return -1;
+
+	// update zipHandle
+	zipHandle->zipFileCount = rec->numEntries;
+	zipHandle->zipDirSize   = rec->centralDirectorySize;
+	zipHandle->zipDirOffset = rec->centralDirectoryOffset;
+	return 0;
 }
 
 
@@ -65,35 +83,12 @@ DFextZipHandleP DFextZipOpen(const char *zipFilename) {
 	// open zip file for reading
 	zipHandle->zipFile = fopen(zipFilename, "rb");
 	if (zipHandle->zipFile &&
-		readEndRecord(zipHandle->zipFile, zipHandle)) {
+		!readEndRecord(zipHandle->zipFile, zipHandle)) {
 		return zipHandle;
 	}
 
 
 
-#if 0
-		// Naively assume signature can only be found in one place...
-		for (i = readBytes - sizeof(JZEndRecord); i >= 0; i--) {
-			er = (JZEndRecord *)(jzBuffer + i);
-			if (er->signature == 0x06054B50)
-				break;
-		}
-
-		if (i < 0) {
-			fprintf(stderr, "End record signature not found in zip!");
-			return Z_ERRNO;
-		}
-
-		memcpy(endRecord, er, sizeof(JZEndRecord));
-
-		if (endRecord->diskNumber || endRecord->centralDirectoryDiskNumber ||
-			endRecord->numEntries != endRecord->numEntriesThisDisk) {
-			fprintf(stderr, "Multifile zips not supported!");
-			return Z_ERRNO;
-		}
-
-		return Z_OK;
-#endif
 
 
 	// release memory