/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef AAPT_IO_FILE_H #define AAPT_IO_FILE_H #include #include #include #include "android-base/macros.h" #include "Source.h" #include "io/Data.h" #include "util/Files.h" #include "util/Util.h" namespace aapt { namespace io { // Interface for a file, which could be a real file on the file system, or a // file inside a ZIP archive. class IFile { public: virtual ~IFile() = default; // Open the file and return it as a block of contiguous memory. How this // occurs is implementation dependent. For example, if this is a file on the file // system, it may simply mmap the contents. If this file represents a compressed file in a // ZIP archive, it may need to inflate it to memory, incurring a copy. // Returns nullptr on failure. virtual std::unique_ptr OpenAsData() = 0; virtual std::unique_ptr OpenInputStream() = 0; // Returns the source of this file. This is for presentation to the user and // may not be a valid file system path (for example, it may contain a '@' sign to separate // the files within a ZIP archive from the path to the containing ZIP archive. virtual const Source& GetSource() const = 0; IFile* CreateFileSegment(size_t offset, size_t len); // Returns whether the file was compressed before it was stored in memory. virtual bool WasCompressed() { return false; } private: // Any segments created from this IFile need to be owned by this IFile, so // keep them // in a list. This will never be read, so we prefer better insertion // performance // than cache locality, hence the list. std::list> segments_; }; // An IFile that wraps an underlying IFile but limits it to a subsection of that file. class FileSegment : public IFile { public: explicit FileSegment(IFile* file, size_t offset, size_t len) : file_(file), offset_(offset), len_(len) {} std::unique_ptr OpenAsData() override; std::unique_ptr OpenInputStream() override; const Source& GetSource() const override { return file_->GetSource(); } private: DISALLOW_COPY_AND_ASSIGN(FileSegment); IFile* file_; size_t offset_; size_t len_; }; class IFileCollectionIterator { public: virtual ~IFileCollectionIterator() = default; virtual bool HasNext() = 0; virtual IFile* Next() = 0; }; // Interface for a collection of files, all of which share a common source. That source may // simply be the filesystem, or a ZIP archive. class IFileCollection { public: virtual ~IFileCollection() = default; virtual IFile* FindFile(const android::StringPiece& path) = 0; virtual std::unique_ptr Iterator() = 0; virtual char GetDirSeparator() = 0; }; } // namespace io } // namespace aapt #endif /* AAPT_IO_FILE_H */