117 lines
3 KiB
C
117 lines
3 KiB
C
|
/*
|
||
|
* 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.
|
||
|
*/
|
||
|
|
||
|
//
|
||
|
// Zip archive entries.
|
||
|
//
|
||
|
// The ZipEntry class is tightly meshed with the ZipFile class.
|
||
|
//
|
||
|
#ifndef __LIBS_ZIPENTRY_H
|
||
|
#define __LIBS_ZIPENTRY_H
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
typedef int status_t;
|
||
|
|
||
|
namespace android {
|
||
|
|
||
|
class ZipFile;
|
||
|
|
||
|
/*
|
||
|
* ZipEntry objects represent a single entry in a Zip archive.
|
||
|
*
|
||
|
* File information is stored in two places: next to the file data (the Local
|
||
|
* File Header, and possibly a Data Descriptor), and at the end of the file
|
||
|
* (the Central Directory Entry). The two must be kept in sync.
|
||
|
*/
|
||
|
class ZipEntry {
|
||
|
public:
|
||
|
friend class ZipFile;
|
||
|
|
||
|
ZipEntry(void) {}
|
||
|
~ZipEntry(void) {}
|
||
|
|
||
|
/*
|
||
|
* Some basic functions for raw data manipulation. "LE" means
|
||
|
* Little Endian.
|
||
|
*/
|
||
|
static inline unsigned short getShortLE(const unsigned char* buf) {
|
||
|
return buf[0] | (buf[1] << 8);
|
||
|
}
|
||
|
static inline unsigned long getLongLE(const unsigned char* buf) {
|
||
|
return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
|
||
|
}
|
||
|
static inline void putShortLE(unsigned char* buf, short val) {
|
||
|
buf[0] = (unsigned char) val;
|
||
|
buf[1] = (unsigned char) (val >> 8);
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
/*
|
||
|
* Initialize the structure from the file, which is pointing at
|
||
|
* our Central Directory entry. And rewrite it.
|
||
|
*/
|
||
|
status_t initAndRewriteFromCDE(FILE* fp);
|
||
|
|
||
|
private:
|
||
|
/* these are private and not defined */
|
||
|
ZipEntry(const ZipEntry& src);
|
||
|
ZipEntry& operator=(const ZipEntry& src);
|
||
|
|
||
|
/*
|
||
|
* Every entry in the Zip archive starts off with one of these.
|
||
|
*/
|
||
|
class LocalFileHeader {
|
||
|
public:
|
||
|
LocalFileHeader(void) {}
|
||
|
|
||
|
status_t rewrite(FILE* fp);
|
||
|
|
||
|
enum {
|
||
|
kSignature = 0x04034b50,
|
||
|
kLFHLen = 30, // LocalFileHdr len, excl. var fields
|
||
|
};
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* Every entry in the Zip archive has one of these in the "central
|
||
|
* directory" at the end of the file.
|
||
|
*/
|
||
|
class CentralDirEntry {
|
||
|
public:
|
||
|
CentralDirEntry(void) :
|
||
|
mLocalHeaderRelOffset(0)
|
||
|
{}
|
||
|
|
||
|
status_t rewrite(FILE* fp);
|
||
|
|
||
|
unsigned long mLocalHeaderRelOffset;
|
||
|
|
||
|
enum {
|
||
|
kSignature = 0x02014b50,
|
||
|
kCDELen = 46, // CentralDirEnt len, excl. var fields
|
||
|
};
|
||
|
};
|
||
|
|
||
|
LocalFileHeader mLFH;
|
||
|
CentralDirEntry mCDE;
|
||
|
};
|
||
|
|
||
|
}; // namespace android
|
||
|
|
||
|
#endif // __LIBS_ZIPENTRY_H
|