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