1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef AAPT_IO_ZIPARCHIVE_H 18#define AAPT_IO_ZIPARCHIVE_H 19 20#include "io/File.h" 21#include "util/StringPiece.h" 22 23#include <map> 24#include <ziparchive/zip_archive.h> 25 26namespace aapt { 27namespace io { 28 29/** 30 * An IFile representing a file within a ZIP archive. If the file is compressed, it is uncompressed 31 * and copied into memory when opened. Otherwise it is mmapped from the ZIP archive. 32 */ 33class ZipFile : public IFile { 34public: 35 ZipFile(ZipArchiveHandle handle, const ZipEntry& entry, const Source& source); 36 37 std::unique_ptr<IData> openAsData() override; 38 const Source& getSource() const override; 39 40private: 41 ZipArchiveHandle mZipHandle; 42 ZipEntry mZipEntry; 43 Source mSource; 44}; 45 46class ZipFileCollection; 47 48class ZipFileCollectionIterator : public IFileCollectionIterator { 49public: 50 ZipFileCollectionIterator(ZipFileCollection* collection); 51 52 bool hasNext() override; 53 io::IFile* next() override; 54 55private: 56 std::map<std::string, std::unique_ptr<IFile>>::const_iterator mCurrent, mEnd; 57}; 58 59/** 60 * An IFileCollection that represents a ZIP archive and the entries within it. 61 */ 62class ZipFileCollection : public IFileCollection { 63public: 64 static std::unique_ptr<ZipFileCollection> create(const StringPiece& path, 65 std::string* outError); 66 67 io::IFile* findFile(const StringPiece& path) override; 68 std::unique_ptr<IFileCollectionIterator> iterator() override; 69 70 ~ZipFileCollection() override; 71 72private: 73 friend class ZipFileCollectionIterator; 74 ZipFileCollection(); 75 76 ZipArchiveHandle mHandle; 77 std::map<std::string, std::unique_ptr<IFile>> mFiles; 78}; 79 80} // namespace io 81} // namespace aapt 82 83#endif /* AAPT_IO_ZIPARCHIVE_H */ 84