chromium/chromeos/printing/ppd_line_reader.h

// 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 CHROMEOS_PRINTING_PPD_LINE_READER_H_
#define CHROMEOS_PRINTING_PPD_LINE_READER_H_

#include <memory>
#include <string>

#include "base/component_export.h"

namespace chromeos {

// Class supporting line-oriented input from unencoded and gzip-encoded PPDs.
// Decompression, when required, is streamed to avoid excessive memory usage due
// to malicious gzip contents.
class COMPONENT_EXPORT(CHROMEOS_PRINTING) PpdLineReader {
 public:
  // Create a new PpdLineReader using ppd contents in |contents|.  The max
  // allowed line length in the ppd is also parameterized.  The default value
  // was taken from "PostScript Printer Description File Format Specification"
  // in version 4.3.
  //
  // |contents| may or may not be gzip-compressed, and must remain valid and
  // unchanged while the Created PpdReader exists.
  static std::unique_ptr<PpdLineReader> Create(const std::string& contents,
                                               size_t max_line_length = 255);

  // Checks to see whether the file contents in |contents| contains the magic
  // number which is found at the beginning of every PPD file. To verify this,
  // a line reader is created which simply attempts to read the first line and
  // checks whether it contains the magic number.
  static bool ContainsMagicNumber(const std::string& contents,
                                  size_t max_line_length);

  virtual ~PpdLineReader() = default;

  // Get the contents of the next non-empty line from the ppd into |line|.
  // Returns true on success, false if there was nothing left to read or an
  // error occurred.  Lines longer than max_line_length are skipped.  To
  // distinguish between end of input and error, use Error().
  virtual bool NextLine(std::string* line) = 0;

  // Return everything from the current position to the end of the PPD file or
  // to the first error. Validity of the read content is not verified (lengths
  // of lines are not checked). To distinguish between end of input and error,
  // use Error().
  virtual std::string RemainingContent() = 0;

  // Return true if we encountered an error while reading.
  virtual bool Error() const = 0;
};

}  // namespace chromeos

#endif  // CHROMEOS_PRINTING_PPD_LINE_READER_H_