// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_ZUCCHINI_PATCH_READER_H_ #define COMPONENTS_ZUCCHINI_PATCH_READER_H_ #include <stddef.h> #include <stdint.h> #include <map> #include <optional> #include <vector> #include "base/debug/stack_trace.h" #include "base/logging.h" #include "base/numerics/checked_math.h" #include "components/zucchini/buffer_source.h" #include "components/zucchini/buffer_view.h" #include "components/zucchini/image_utils.h" #include "components/zucchini/patch_utils.h" namespace zucchini { namespace patch { // The Parse*() functions below attempt to extract data of a specific type from // the beginning of |source|. A parse function: On success, consumes the used // portion of |source|, writes data into the output parameter, and returns // true. Otherwise returns false and does not consume |source|. // Parses |source| for the next ElementMatch. bool ParseElementMatch(BufferSource* source, ElementMatch* element_match); // Parses |source| for the next embedded BufferSource. bool ParseBuffer(BufferSource* source, BufferSource* buffer); // Parses |source| for the next VarUInt. template <class T> bool ParseVarUInt(BufferSource* source, T* value) { … } // Parses |source| for the next VarInt. template <class T> bool ParseVarInt(BufferSource* source, T* value) { … } } // namespace patch // The *Source classes below are light-weight (i.e., allows copying) visitors to // read patch data. Each of them has an associated "main type", and performs the // following: // - Consumes portions of a BufferSource (required to remain valid for the // lifetime of the object). // - Decodes consumed data, which represent a list of items with "main type". // - Dispenses "main type" elements (hence "Source" in the name). // // Common "core functions" implemented by *Source classes are: // - bool Initialize(BufferSource* source): Consumes data from BufferSource and // initializes internal states. Returns true if successful, and false // otherwise (|source| may be partially consumed). // - std::optional<MAIN_TYPE> GetNext(OPT_PARAMS): Decodes consumed data and // returns the next item as std::optional (returns std::nullopt on failure). // - bool Done() const: Returns true if no more items remain; otherwise false. // // Usage of *Source instances don't mix, and GetNext() have dissimilar // interfaces. Therefore we do not use inheritance to relate *Source classes, // and simply implement "core functions" with matching names. // Source for Equivalences. class EquivalenceSource { … }; // Source for extra data. class ExtraDataSource { … }; // Source for raw delta. class RawDeltaSource { … }; // Source for reference delta. class ReferenceDeltaSource { … }; // Source for additional targets. class TargetSource { … }; // Following are utility classes providing a structured view on data forming a // patch. // Utility to read a patch element. A patch element contains all the information // necessary to patch a single element. This class provide access // to the multiple streams of data forming the patch element. class PatchElementReader { … }; // Utility to read a Zucchini ensemble patch. An ensemble patch is the // concatenation of a patch header with a vector of patch elements. class EnsemblePatchReader { … }; } // namespace zucchini #endif // COMPONENTS_ZUCCHINI_PATCH_READER_H_