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 "io/FileStream.h"
24 #include "util/Files.h"
25 #include "util/Maybe.h"
26 #include "util/Util.h"
27 
28 using ::android::StringPiece;
29 
30 namespace aapt {
31 namespace io {
32 
RegularFile(const Source & source)33 RegularFile::RegularFile(const Source& source) : source_(source) {}
34 
OpenAsData()35 std::unique_ptr<IData> RegularFile::OpenAsData() {
36   android::FileMap map;
37   if (Maybe<android::FileMap> map = file::MmapPath(source_.path, nullptr)) {
38     if (map.value().getDataPtr() && map.value().getDataLength() > 0) {
39       return util::make_unique<MmappedData>(std::move(map.value()));
40     }
41     return util::make_unique<EmptyData>();
42   }
43   return {};
44 }
45 
OpenInputStream()46 std::unique_ptr<io::InputStream> RegularFile::OpenInputStream() {
47   return util::make_unique<FileInputStream>(source_.path);
48 }
49 
GetSource() const50 const Source& RegularFile::GetSource() const {
51   return source_;
52 }
53 
FileCollectionIterator(FileCollection * collection)54 FileCollectionIterator::FileCollectionIterator(FileCollection* collection)
55     : current_(collection->files_.begin()), end_(collection->files_.end()) {}
56 
HasNext()57 bool FileCollectionIterator::HasNext() {
58   return current_ != end_;
59 }
60 
Next()61 IFile* FileCollectionIterator::Next() {
62   IFile* result = current_->second.get();
63   ++current_;
64   return result;
65 }
66 
InsertFile(const StringPiece & path)67 IFile* FileCollection::InsertFile(const StringPiece& path) {
68   return (files_[path.to_string()] = util::make_unique<RegularFile>(Source(path))).get();
69 }
70 
FindFile(const StringPiece & path)71 IFile* FileCollection::FindFile(const StringPiece& path) {
72   auto iter = files_.find(path.to_string());
73   if (iter != files_.end()) {
74     return iter->second.get();
75   }
76   return nullptr;
77 }
78 
Iterator()79 std::unique_ptr<IFileCollectionIterator> FileCollection::Iterator() {
80   return util::make_unique<FileCollectionIterator>(this);
81 }
82 
83 }  // namespace io
84 }  // namespace aapt
85