/* * Copyright (C) 2022 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 SRC_TRACE_PROCESSOR_UTIL_ZIP_READER_H_ #define SRC_TRACE_PROCESSOR_UTIL_ZIP_READER_H_ #include <cstddef> #include <cstdint> #include <functional> #include <optional> #include <string> #include <utility> #include <vector> #include "perfetto/base/status.h" #include "perfetto/ext/base/status_or.h" #include "perfetto/ext/base/string_view.h" #include "perfetto/trace_processor/trace_blob_view.h" #include "src/trace_processor/util/gzip_utils.h" #include "src/trace_processor/util/trace_blob_view_reader.h" // ZipReader allows to read Zip files in a streaming fashion. // Key features: // - Read-only access, there is no ZipWriter. // - Files can be processed as they are seen in the zip archive, without needing // to see the whole .zip file first. // - It does not read the final zip central directory. Only the metadata in the // inline file headers is exposed. // - Only the compressed payload is kept around in memory. // - Supports line-based streaming for compressed text files (e.g. logs). This // enables line-based processing of compressed logs without having to // decompress fully the individual text file in memory. // - Does NOT support zip64, encryption and other advanced zip file features. // - It is not suitable for security-sensitive contexts. E.g. it doesn't deal // with zip path traversal attacks (the same file showing up twice with two // different payloads). // // Possible future features: // - The user could setup a filter (a glob, or a callback) to select the // interesting files (e.g. *.txt) and skip the appending of the other entries. // This would avoid completely the cost of keeping in memory the compressed // payload of unwanted files (e.g. dumpstate.bin in BRs). namespace perfetto::trace_processor::util { class ZipReader; constexpr size_t kZipFileHdrSize = …; // Holds the metadata and compressed payload of a zip file and allows // decompression. The lifecycle of a ZipFile is completely independent of the // ZipReader that created it. ZipFile(s) can be std::move(d) around and even // outlive the ZipReader. class ZipFile { … }; class ZipReader { … }; } // namespace perfetto::trace_processor::util #endif // SRC_TRACE_PROCESSOR_UTIL_ZIP_READER_H_