19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Zip archive entries.
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// The ZipEntry class is tightly meshed with the ZipFile class.
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef __LIBS_ZIPENTRY_H
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define __LIBS_ZIPENTRY_H
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2555e3d60da5626752ffe1d15150d35ccb8fa644e7Mathias Agopian#include <utils/Errors.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
29df7707cb4f34138b423dde493fccfa4e7fb50c20Mathias Agopian#include <time.h>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ZipFile;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ZipEntry objects represent a single entry in a Zip archive.
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can use one of these to get or set information about an entry, but
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * there are no functions here for accessing the data itself.  (We could
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tuck a pointer to the ZipFile in here for convenience, but that raises
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the likelihood of using ZipEntry objects after discarding the ZipFile.)
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * File information is stored in two places: next to the file data (the Local
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * File Header, and possibly a Data Descriptor), and at the end of the file
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (the Central Directory Entry).  The two must be kept in sync.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ZipEntry {
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    friend class ZipFile;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ZipEntry(void)
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        : mDeleted(false), mMarked(false)
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {}
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ~ZipEntry(void) {}
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns "true" if the data is compressed.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool isCompressed(void) const {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCDE.mCompressionMethod != kCompressStored;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int getCompressionMethod(void) const { return mCDE.mCompressionMethod; }
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the uncompressed length.
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    off_t getUncompressedLen(void) const { return mCDE.mUncompressedSize; }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the compressed length.  For uncompressed data, this returns
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the same thing as getUncompresesdLen().
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    off_t getCompressedLen(void) const { return mCDE.mCompressedSize; }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
76fb2a9467ad77336edbf2a1a272dbe6ec30ef8a1bKenny Root     * Return the offset of the local file header.
77fb2a9467ad77336edbf2a1a272dbe6ec30ef8a1bKenny Root     */
78fb2a9467ad77336edbf2a1a272dbe6ec30ef8a1bKenny Root    off_t getLFHOffset(void) const { return mCDE.mLocalHeaderRelOffset; }
79fb2a9467ad77336edbf2a1a272dbe6ec30ef8a1bKenny Root
80fb2a9467ad77336edbf2a1a272dbe6ec30ef8a1bKenny Root    /*
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the absolute file offset of the start of the compressed or
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * uncompressed data.
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    off_t getFileOffset(void) const {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCDE.mLocalHeaderRelOffset +
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                LocalFileHeader::kLFHLen +
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLFH.mFileNameLength +
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLFH.mExtraFieldLength;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the data CRC.
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    unsigned long getCRC32(void) const { return mCDE.mCRC32; }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return file modification time in UNIX seconds-since-epoch.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    time_t getModWhen(void) const;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the archived file name.
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* getFileName(void) const { return (const char*) mCDE.mFileName; }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Application-defined "mark".  Can be useful when synchronizing the
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * contents of an archive with contents on disk.
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool getMarked(void) const { return mMarked; }
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setMarked(bool val) { mMarked = val; }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Some basic functions for raw data manipulation.  "LE" means
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Little Endian.
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static inline unsigned short getShortLE(const unsigned char* buf) {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buf[0] | (buf[1] << 8);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static inline unsigned long getLongLE(const unsigned char* buf) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static inline void putShortLE(unsigned char* buf, short val) {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        buf[0] = (unsigned char) val;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        buf[1] = (unsigned char) (val >> 8);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static inline void putLongLE(unsigned char* buf, long val) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        buf[0] = (unsigned char) val;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        buf[1] = (unsigned char) (val >> 8);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        buf[2] = (unsigned char) (val >> 16);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        buf[3] = (unsigned char) (val >> 24);
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* defined for Zip archives */
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kCompressStored     = 0,        // no compression
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // shrunk           = 1,
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // reduced 1        = 2,
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // reduced 2        = 3,
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // reduced 3        = 4,
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // reduced 4        = 5,
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // imploded         = 6,
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // tokenized        = 7,
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kCompressDeflated   = 8,        // standard deflate
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Deflate64        = 9,
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // lib imploded     = 10,
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // reserved         = 11,
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // bzip2            = 12,
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Deletion flag.  If set, the entry will be removed on the next
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call to "flush".
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool getDeleted(void) const { return mDeleted; }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected:
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initialize the structure from the file, which is pointing at
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * our Central Directory entry.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t initFromCDE(FILE* fp);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initialize the structure for a new file.  We need the filename
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and comment so that we can properly size the LFH area.  The
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * filename is mandatory, the comment is optional.
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void initNew(const char* fileName, const char* comment);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initialize the structure with the contents of a ZipEntry from
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * another file.
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t initFromExternal(const ZipFile* pZipFile, const ZipEntry* pEntry);
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add some pad bytes to the LFH.  We do this by adding or resizing
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the "extra" field.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t addPadding(int padding);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set information about the data for this entry.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setDataInfo(long uncompLen, long compLen, unsigned long crc32,
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int compressionMethod);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the modification date.
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setModWhen(time_t when);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the offset of the local file header, relative to the start of
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the current file.
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setLFHOffset(off_t offset) {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCDE.mLocalHeaderRelOffset = (long) offset;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* mark for deletion; used by ZipFile::remove() */
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setDeleted(void) { mDeleted = true; }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* these are private and not defined */
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ZipEntry(const ZipEntry& src);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ZipEntry& operator=(const ZipEntry& src);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* returns "true" if the CDE and the LFH agree */
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool compareHeaders(void) const;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void copyCDEtoLFH(void);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool        mDeleted;       // set if entry is pending deletion
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bool        mMarked;        // app-defined marker
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Every entry in the Zip archive starts off with one of these.
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class LocalFileHeader {
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LocalFileHeader(void) :
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVersionToExtract(0),
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mGPBitFlag(0),
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCompressionMethod(0),
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastModFileTime(0),
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastModFileDate(0),
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCRC32(0),
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCompressedSize(0),
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUncompressedSize(0),
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFileNameLength(0),
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExtraFieldLength(0),
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFileName(NULL),
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExtraField(NULL)
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {}
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ~LocalFileHeader(void) {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delete[] mFileName;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delete[] mExtraField;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t read(FILE* fp);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t write(FILE* fp);
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // unsigned long mSignature;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mVersionToExtract;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mGPBitFlag;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mCompressionMethod;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mLastModFileTime;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mLastModFileDate;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned long   mCRC32;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned long   mCompressedSize;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned long   mUncompressedSize;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mFileNameLength;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mExtraFieldLength;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned char*  mFileName;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned char*  mExtraField;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enum {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            kSignature      = 0x04034b50,
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            kLFHLen         = 30,       // LocalFileHdr len, excl. var fields
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void dump(void) const;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Every entry in the Zip archive has one of these in the "central
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * directory" at the end of the file.
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class CentralDirEntry {
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CentralDirEntry(void) :
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVersionMadeBy(0),
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mVersionToExtract(0),
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mGPBitFlag(0),
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCompressionMethod(0),
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastModFileTime(0),
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastModFileDate(0),
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCRC32(0),
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCompressedSize(0),
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUncompressedSize(0),
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFileNameLength(0),
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExtraFieldLength(0),
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFileCommentLength(0),
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDiskNumberStart(0),
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mInternalAttrs(0),
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExternalAttrs(0),
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLocalHeaderRelOffset(0),
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFileName(NULL),
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExtraField(NULL),
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFileComment(NULL)
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {}
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        virtual ~CentralDirEntry(void) {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delete[] mFileName;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delete[] mExtraField;
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delete[] mFileComment;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t read(FILE* fp);
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t write(FILE* fp);
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3022412f84064c26b643c722ce914a97c4ec7776c69Andreas Gampe        CentralDirEntry& operator=(const CentralDirEntry& src);
3032412f84064c26b643c722ce914a97c4ec7776c69Andreas Gampe
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // unsigned long mSignature;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mVersionMadeBy;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mVersionToExtract;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mGPBitFlag;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mCompressionMethod;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mLastModFileTime;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mLastModFileDate;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned long   mCRC32;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned long   mCompressedSize;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned long   mUncompressedSize;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mFileNameLength;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mExtraFieldLength;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mFileCommentLength;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mDiskNumberStart;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned short  mInternalAttrs;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned long   mExternalAttrs;
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned long   mLocalHeaderRelOffset;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned char*  mFileName;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned char*  mExtraField;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        unsigned char*  mFileComment;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void dump(void) const;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enum {
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            kSignature      = 0x02014b50,
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            kCDELen         = 46,       // CentralDirEnt len, excl. var fields
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    enum {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //kDataDescriptorSignature  = 0x08074b50,   // currently unused
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kDataDescriptorLen  = 16,           // four 32-bit fields
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kDefaultVersion     = 20,           // need deflate, nothing much else
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kDefaultMadeBy      = 0x0317,       // 03=UNIX, 17=spec v2.3
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        kUsesDataDescr      = 0x0008,       // GPBitFlag bit 3
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LocalFileHeader     mLFH;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    CentralDirEntry     mCDE;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // __LIBS_ZIPENTRY_H
349