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