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