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