d4066a4ac5
Change the way zip archives are handled. This is necessary to deal with very large (~1GB) APK files, for which our current approach of mapping the entire file falls over. We now do the classic scavenger hunt for the End Of Central Directory magic on a buffer of data read from the file, instead of a memory-mapped section. We use what we find to create a map that covers the Central Directory only. If the caller is interested in unpacking the file contents, we have to do an additional file read to discover the size of the Local File Header section so we can skip past it. This is based on Change I745fb15abb in the dalvik tree. Both implementations share a common ancestry, but the cost of unifying them outweighs the benefits of wrapping C calls. Change-Id: Iddacb50fe913917c2845708a530872d65fdbe620
60 lines
1.6 KiB
C
60 lines
1.6 KiB
C
/*
|
|
* Copyright (C) 2008 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.
|
|
*/
|
|
|
|
//
|
|
// C API for ead-only access to Zip archives, with minimal heap allocation.
|
|
//
|
|
#ifndef __LIBS_ZIPFILECRO_H
|
|
#define __LIBS_ZIPFILECRO_H
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
* Trivial typedef to ensure that ZipFileCRO is not treated as a simple integer.
|
|
*/
|
|
typedef void* ZipFileCRO;
|
|
|
|
/*
|
|
* Trivial typedef to ensure that ZipEntryCRO is not treated as a simple
|
|
* integer. We use NULL to indicate an invalid value.
|
|
*/
|
|
typedef void* ZipEntryCRO;
|
|
|
|
extern ZipFileCRO ZipFileXRO_open(const char* path);
|
|
|
|
extern void ZipFileCRO_destroy(ZipFileCRO zip);
|
|
|
|
extern ZipEntryCRO ZipFileCRO_findEntryByName(ZipFileCRO zip,
|
|
const char* fileName);
|
|
|
|
extern bool ZipFileCRO_getEntryInfo(ZipFileCRO zip, ZipEntryCRO entry,
|
|
int* pMethod, size_t* pUncompLen,
|
|
size_t* pCompLen, off_t* pOffset, long* pModWhen, long* pCrc32);
|
|
|
|
extern bool ZipFileCRO_uncompressEntry(ZipFileCRO zip, ZipEntryCRO entry, int fd);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /*__LIBS_ZIPFILECRO_H*/
|