FileSystem.cpp revision a6fe345be955368a13aea76aefb4db821aad11df
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)) {
35a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski        return util::make_unique<MmappedData>(std::move(map.value()));
36a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    }
37a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return {};
38a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
39a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
40a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinskiconst Source& RegularFile::getSource() const {
41a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return mSource;
42a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
43a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
44a6fe345be955368a13aea76aefb4db821aad11dfAdam LesinskiFileCollectionIterator::FileCollectionIterator(FileCollection* collection) :
45a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski        mCurrent(collection->mFiles.begin()), mEnd(collection->mFiles.end()) {
46a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
47a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
48a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinskibool FileCollectionIterator::hasNext() {
49a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return mCurrent != mEnd;
50a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
51a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
52a6fe345be955368a13aea76aefb4db821aad11dfAdam LesinskiIFile* FileCollectionIterator::next() {
53a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    IFile* result = mCurrent->second.get();
54a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    ++mCurrent;
55a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return result;
56a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
57a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
58a6fe345be955368a13aea76aefb4db821aad11dfAdam LesinskiIFile* FileCollection::insertFile(const StringPiece& path) {
59a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return (mFiles[path.toString()] = util::make_unique<RegularFile>(Source(path))).get();
60a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
61a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
62a6fe345be955368a13aea76aefb4db821aad11dfAdam LesinskiIFile* FileCollection::findFile(const StringPiece& path) {
63a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    auto iter = mFiles.find(path.toString());
64a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    if (iter != mFiles.end()) {
65a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski        return iter->second.get();
66a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    }
67a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return nullptr;
68a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
69a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
70a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinskistd::unique_ptr<IFileCollectionIterator> FileCollection::iterator() {
71a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski    return util::make_unique<FileCollectionIterator>(this);
72a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski}
73a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski
74a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski} // namespace io
75a6fe345be955368a13aea76aefb4db821aad11dfAdam Lesinski} // namespace aapt
76