/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

//
// Class to rewrite zip file headers to remove dynamic timestamps.
//
#ifndef __LIBS_ZIPFILE_H
#define __LIBS_ZIPFILE_H

#include <stdio.h>

#include "ZipEntry.h"

namespace android {

/*
 * Manipulate a Zip archive.
 */
class ZipFile {
public:
    ZipFile(void) : mZipFp(NULL) {}
    ~ZipFile(void) {
        if (mZipFp != NULL)
            fclose(mZipFp);
    }

    /*
     * Rewrite an archive's headers to remove dynamic timestamps.
     */
    status_t rewrite(const char* zipFileName);

private:
    /* these are private and not defined */
    ZipFile(const ZipFile& src);
    ZipFile& operator=(const ZipFile& src);

    class EndOfCentralDir {
    public:
        EndOfCentralDir(void) : mTotalNumEntries(0), mCentralDirOffset(0) {}

        status_t readBuf(const unsigned char* buf, int len);

        unsigned short  mTotalNumEntries;
        unsigned long   mCentralDirOffset;      // offset from first disk

        enum {
            kSignature      = 0x06054b50,
            kEOCDLen        = 22,       // EndOfCentralDir len, excl. comment

            kMaxCommentLen  = 65535,    // longest possible in ushort
            kMaxEOCDSearch  = kMaxCommentLen + EndOfCentralDir::kEOCDLen,

        };
    };

    /* read all entries in the central dir */
    status_t rewriteCentralDir(void);

    /*
     * We use stdio FILE*, which gives us buffering but makes dealing
     * with files >2GB awkward.  Until we support Zip64, we're fine.
     */
    FILE*           mZipFp;             // Zip file pointer

    /* one of these per file */
    EndOfCentralDir mEOCD;
};

}; // namespace android

#endif // __LIBS_ZIPFILE_H
