1a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski/*
2a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski * Copyright (C) 2015 The Android Open Source Project
3a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski *
4a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski * you may not use this file except in compliance with the License.
6a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski * You may obtain a copy of the License at
7a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski *
8a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski *
10a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski * See the License for the specific language governing permissions and
14a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski * limitations under the License.
15a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski */
16a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
17a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski#include "Source.h"
18a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski#include "io/FileSystem.h"
19a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski#include "util/Files.h"
20a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski#include "util/Maybe.h"
21a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski#include "util/StringPiece.h"
22a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski#include "util/Util.h"
23a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
24a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski#include <utils/FileMap.h>
25a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
26a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinskinamespace aapt {
27a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinskinamespace io {
28a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
29a6fe345be955368a13aea76aefb4db821aad11dfAdam LesinskiRegularFile::RegularFile(const Source& source) : mSource(source) {
30a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
31a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
32a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinskistd::unique_ptr<IData> RegularFile::openAsData() {
33a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    android::FileMap map;
34a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    if (Maybe<android::FileMap> map = file::mmapPath(mSource.path, nullptr)) {
3552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        if (map.value().getDataPtr() && map.value().getDataLength() > 0) {
3652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski            return util::make_unique<MmappedData>(std::move(map.value()));
3752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        }
3852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        return util::make_unique<EmptyData>();
39a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    }
40a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return {};
41a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
42a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
43a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinskiconst Source& RegularFile::getSource() const {
44a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return mSource;
45a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
46a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
47a6fe345be955368a13aea76aefb4db821aad11dfAdam LesinskiFileCollectionIterator::FileCollectionIterator(FileCollection* collection) :
48a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski        mCurrent(collection->mFiles.begin()), mEnd(collection->mFiles.end()) {
49a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
50a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
51a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinskibool FileCollectionIterator::hasNext() {
52a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return mCurrent != mEnd;
53a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
54a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
55a6fe345be955368a13aea76aefb4db821aad11dfAdam LesinskiIFile* FileCollectionIterator::next() {
56a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    IFile* result = mCurrent->second.get();
57a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    ++mCurrent;
58a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return result;
59a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
60a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
61a6fe345be955368a13aea76aefb4db821aad11dfAdam LesinskiIFile* FileCollection::insertFile(const StringPiece& path) {
62a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return (mFiles[path.toString()] = util::make_unique<RegularFile>(Source(path))).get();
63a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
64a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
65a6fe345be955368a13aea76aefb4db821aad11dfAdam LesinskiIFile* FileCollection::findFile(const StringPiece& path) {
66a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    auto iter = mFiles.find(path.toString());
67a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    if (iter != mFiles.end()) {
68a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski        return iter->second.get();
69a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    }
70a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return nullptr;
71a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
72a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
73a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinskistd::unique_ptr<IFileCollectionIterator> FileCollection::iterator() {
74a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return util::make_unique<FileCollectionIterator>(this);
75a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
76a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
77a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski} // namespace io
78a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski} // namespace aapt
79