1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #ifndef AAPT_IO_FILE_H 18*d57664e9SAndroid Build Coastguard Worker #define AAPT_IO_FILE_H 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include <list> 21*d57664e9SAndroid Build Coastguard Worker #include <memory> 22*d57664e9SAndroid Build Coastguard Worker #include <vector> 23*d57664e9SAndroid Build Coastguard Worker 24*d57664e9SAndroid Build Coastguard Worker #include "android-base/macros.h" 25*d57664e9SAndroid Build Coastguard Worker #include "androidfw/Source.h" 26*d57664e9SAndroid Build Coastguard Worker #include "io/Data.h" 27*d57664e9SAndroid Build Coastguard Worker #include "util/Files.h" 28*d57664e9SAndroid Build Coastguard Worker #include "util/Util.h" 29*d57664e9SAndroid Build Coastguard Worker 30*d57664e9SAndroid Build Coastguard Worker namespace aapt { 31*d57664e9SAndroid Build Coastguard Worker namespace io { 32*d57664e9SAndroid Build Coastguard Worker 33*d57664e9SAndroid Build Coastguard Worker // Interface for a file, which could be a real file on the file system, or a 34*d57664e9SAndroid Build Coastguard Worker // file inside a ZIP archive. 35*d57664e9SAndroid Build Coastguard Worker class IFile { 36*d57664e9SAndroid Build Coastguard Worker public: 37*d57664e9SAndroid Build Coastguard Worker virtual ~IFile() = default; 38*d57664e9SAndroid Build Coastguard Worker 39*d57664e9SAndroid Build Coastguard Worker // Open the file and return it as a block of contiguous memory. How this 40*d57664e9SAndroid Build Coastguard Worker // occurs is implementation dependent. For example, if this is a file on the file 41*d57664e9SAndroid Build Coastguard Worker // system, it may simply mmap the contents. If this file represents a compressed file in a 42*d57664e9SAndroid Build Coastguard Worker // ZIP archive, it may need to inflate it to memory, incurring a copy. 43*d57664e9SAndroid Build Coastguard Worker // Returns nullptr on failure. 44*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<IData> OpenAsData() = 0; 45*d57664e9SAndroid Build Coastguard Worker 46*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<android::InputStream> OpenInputStream() = 0; 47*d57664e9SAndroid Build Coastguard Worker 48*d57664e9SAndroid Build Coastguard Worker // Returns the source of this file. This is for presentation to the user and 49*d57664e9SAndroid Build Coastguard Worker // may not be a valid file system path (for example, it may contain a '@' sign to separate 50*d57664e9SAndroid Build Coastguard Worker // the files within a ZIP archive from the path to the containing ZIP archive. 51*d57664e9SAndroid Build Coastguard Worker virtual const android::Source& GetSource() const = 0; 52*d57664e9SAndroid Build Coastguard Worker 53*d57664e9SAndroid Build Coastguard Worker IFile* CreateFileSegment(size_t offset, size_t len); 54*d57664e9SAndroid Build Coastguard Worker 55*d57664e9SAndroid Build Coastguard Worker // Returns whether the file was compressed before it was stored in memory. WasCompressed()56*d57664e9SAndroid Build Coastguard Worker virtual bool WasCompressed() { 57*d57664e9SAndroid Build Coastguard Worker return false; 58*d57664e9SAndroid Build Coastguard Worker } 59*d57664e9SAndroid Build Coastguard Worker 60*d57664e9SAndroid Build Coastguard Worker // Fills in buf with the last modification time of the file. Returns true if successful, 61*d57664e9SAndroid Build Coastguard Worker // otherwise false (i.e., the operation is not supported or the file system is unable to provide 62*d57664e9SAndroid Build Coastguard Worker // a last modification time). 63*d57664e9SAndroid Build Coastguard Worker virtual bool GetModificationTime(struct tm* buf) const = 0; 64*d57664e9SAndroid Build Coastguard Worker 65*d57664e9SAndroid Build Coastguard Worker private: 66*d57664e9SAndroid Build Coastguard Worker // Any segments created from this IFile need to be owned by this IFile, so 67*d57664e9SAndroid Build Coastguard Worker // keep them 68*d57664e9SAndroid Build Coastguard Worker // in a list. This will never be read, so we prefer better insertion 69*d57664e9SAndroid Build Coastguard Worker // performance 70*d57664e9SAndroid Build Coastguard Worker // than cache locality, hence the list. 71*d57664e9SAndroid Build Coastguard Worker std::list<std::unique_ptr<IFile>> segments_; 72*d57664e9SAndroid Build Coastguard Worker }; 73*d57664e9SAndroid Build Coastguard Worker 74*d57664e9SAndroid Build Coastguard Worker // An IFile that wraps an underlying IFile but limits it to a subsection of that file. 75*d57664e9SAndroid Build Coastguard Worker class FileSegment : public IFile { 76*d57664e9SAndroid Build Coastguard Worker public: FileSegment(IFile * file,size_t offset,size_t len)77*d57664e9SAndroid Build Coastguard Worker explicit FileSegment(IFile* file, size_t offset, size_t len) 78*d57664e9SAndroid Build Coastguard Worker : file_(file), offset_(offset), len_(len) {} 79*d57664e9SAndroid Build Coastguard Worker 80*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<IData> OpenAsData() override; 81*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<android::InputStream> OpenInputStream() override; 82*d57664e9SAndroid Build Coastguard Worker GetSource()83*d57664e9SAndroid Build Coastguard Worker const android::Source& GetSource() const override { 84*d57664e9SAndroid Build Coastguard Worker return file_->GetSource(); 85*d57664e9SAndroid Build Coastguard Worker } 86*d57664e9SAndroid Build Coastguard Worker GetModificationTime(struct tm * buf)87*d57664e9SAndroid Build Coastguard Worker bool GetModificationTime(struct tm* buf) const override { 88*d57664e9SAndroid Build Coastguard Worker return file_->GetModificationTime(buf); 89*d57664e9SAndroid Build Coastguard Worker }; 90*d57664e9SAndroid Build Coastguard Worker 91*d57664e9SAndroid Build Coastguard Worker private: 92*d57664e9SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(FileSegment); 93*d57664e9SAndroid Build Coastguard Worker 94*d57664e9SAndroid Build Coastguard Worker IFile* file_; 95*d57664e9SAndroid Build Coastguard Worker size_t offset_; 96*d57664e9SAndroid Build Coastguard Worker size_t len_; 97*d57664e9SAndroid Build Coastguard Worker }; 98*d57664e9SAndroid Build Coastguard Worker 99*d57664e9SAndroid Build Coastguard Worker class IFileCollectionIterator { 100*d57664e9SAndroid Build Coastguard Worker public: 101*d57664e9SAndroid Build Coastguard Worker virtual ~IFileCollectionIterator() = default; 102*d57664e9SAndroid Build Coastguard Worker 103*d57664e9SAndroid Build Coastguard Worker virtual bool HasNext() = 0; 104*d57664e9SAndroid Build Coastguard Worker virtual IFile* Next() = 0; 105*d57664e9SAndroid Build Coastguard Worker }; 106*d57664e9SAndroid Build Coastguard Worker 107*d57664e9SAndroid Build Coastguard Worker // Interface for a collection of files, all of which share a common source. That source may 108*d57664e9SAndroid Build Coastguard Worker // simply be the filesystem, or a ZIP archive. 109*d57664e9SAndroid Build Coastguard Worker class IFileCollection { 110*d57664e9SAndroid Build Coastguard Worker public: 111*d57664e9SAndroid Build Coastguard Worker virtual ~IFileCollection() = default; 112*d57664e9SAndroid Build Coastguard Worker 113*d57664e9SAndroid Build Coastguard Worker virtual IFile* FindFile(android::StringPiece path) = 0; 114*d57664e9SAndroid Build Coastguard Worker virtual std::unique_ptr<IFileCollectionIterator> Iterator() = 0; 115*d57664e9SAndroid Build Coastguard Worker virtual char GetDirSeparator() = 0; 116*d57664e9SAndroid Build Coastguard Worker }; 117*d57664e9SAndroid Build Coastguard Worker 118*d57664e9SAndroid Build Coastguard Worker } // namespace io 119*d57664e9SAndroid Build Coastguard Worker } // namespace aapt 120*d57664e9SAndroid Build Coastguard Worker 121*d57664e9SAndroid Build Coastguard Worker #endif /* AAPT_IO_FILE_H */ 122