Add:maptool:Preparation of zip64 bit support
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Thu, 12 Nov 2009 22:04:25 +0000 (22:04 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Thu, 12 Nov 2009 22:04:25 +0000 (22:04 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk/navit@2748 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/maptool/maptool.h
navit/maptool/zip.c
navit/zipfile.h

index 46a8586..3a9165a 100644 (file)
@@ -76,6 +76,7 @@ struct zip_info {
        long long offset;
        int compression_level;
        int maxnamelen;
+       int zip64;
        FILE *res;
        FILE *index;
        FILE *dir;
index 7bce411..3863afe 100644 (file)
@@ -99,6 +99,11 @@ write_zipmember(struct zip_info *zip_info, char *name, int filelen, char *data,
                0x0,
                zip_info->offset,
        };
+       struct zip_cd_ext cd_ext = {
+               0x1,
+               0x8,
+               zip_info->offset,
+       };
        char filename[filelen+1];
        int error,crc,len,comp_size=data_size;
        uLongf destlen=data_size+data_size/500+12;
@@ -133,6 +138,10 @@ write_zipmember(struct zip_info *zip_info, char *name, int filelen, char *data,
        cd.zipcsiz=comp_size;
        cd.zipcunc=data_size;
        cd.zipcmthd=zip_info->compression_level ? 8:0;
+       if (zip_info->zip64) {
+               cd.zipofst=0xffffffff;
+               cd.zipcxtl=sizeof(cd_ext);
+       }
        strcpy(filename, name);
        len=strlen(filename);
        while (len < filelen) {
@@ -146,6 +155,10 @@ write_zipmember(struct zip_info *zip_info, char *name, int filelen, char *data,
        fwrite(&cd, sizeof(cd), 1, zip_info->dir);
        fwrite(filename, filelen, 1, zip_info->dir);
        zip_info->dir_size+=sizeof(cd)+filelen;
+       if (zip_info->zip64) {
+               fwrite(&cd_ext, sizeof(cd_ext), 1, zip_info->dir);
+               zip_info->dir_size+=sizeof(cd_ext);
+       }
        
        free(compbuffer);
 }
index 6453890..402c074 100644 (file)
@@ -69,6 +69,12 @@ struct zip_cd {
 
 #define zip_eoc_sig 0x6054b50
 
+struct zip_cd_ext {
+       short tag;
+       short size;
+       unsigned long long zipofst;
+} __attribute__ ((packed));
+
 struct zip_eoc {
        int zipesig;
        unsigned short zipedsk;