// Copyright 2017 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef _BSDIFF_BSDIFF_ARGUMENTS_H_ #define _BSDIFF_BSDIFF_ARGUMENTS_H_ #include <stdint.h> #include <set> #include <string> #include <vector> #include "bsdiff/constants.h" #include "bsdiff/patch_writer_interface.h" namespace bsdiff { // Class to store the patch writer options about format, type and // brotli_quality. class BsdiffArguments { public: BsdiffArguments() : format_(BsdiffFormat::kLegacy), brotli_quality_(-1) { compressor_types_.emplace(CompressorType::kBZ2); } BsdiffArguments(BsdiffFormat format, std::set<CompressorType> types, int brotli_quality) : format_(format), compressor_types_(std::move(types)), brotli_quality_(brotli_quality) {} // Check if the compressor type is compatible with the bsdiff format. bool IsValid() const; // Getter functions. BsdiffFormat format() const { return format_; } int min_length() const { return min_length_; } std::vector<CompressorType> compressor_types() const; int brotli_quality() const { return brotli_quality_; } // Parse the command line arguments of the main function and set all the // fields accordingly. bool ParseCommandLine(int argc, char** argv); // Parse the compression type from string. static bool ParseCompressorTypes(const std::string& str, std::set<CompressorType>* types); // Parse the minimum length parameter from string. static bool ParseMinLength(const std::string& str, size_t* len); // Parse the bsdiff format from string. static bool ParseBsdiffFormat(const std::string& str, BsdiffFormat* format); // Parse the compression quality (for brotli) from string; also check if the // value is within the valid range. static bool ParseQuality(const std::string& str, int* quality, int min, int max); private: bool IsCompressorSupported(CompressorType type) const; // Current format supported are the legacy "BSDIFF40" or "BSDF2". BsdiffFormat format_; // The algorithms to compress the patch, e.g. bz2, brotli. std::set<CompressorType> compressor_types_; // The quality of brotli compressor. int brotli_quality_; size_t min_length_{0}; }; } // namespace bsdiff #endif // _BSDIFF_BSDIFF_ARGUMENTS_H_