/* * Copyright (c) 2021-2022, Matthew Olsson * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace PDF { template static NonnullRefPtr make_object(Args... args) requires(IsBaseOf) { return adopt_ref(*new T(forward(args)...)); } class Document; class Parser { public: static PDFErrorOr> parse_operators(Document*, ReadonlyBytes); Parser(ReadonlyBytes); Parser(Document*, ReadonlyBytes); void set_document(WeakPtr const&); ByteString parse_comment(); void move_by(size_t count) { m_reader.move_by(count); } void move_to(size_t offset) { m_reader.move_to(offset); } enum class CanBeIndirectValue { No, Yes }; PDFErrorOr parse_value(CanBeIndirectValue = CanBeIndirectValue::Yes); PDFErrorOr parse_possible_indirect_value_or_ref(); PDFErrorOr> parse_indirect_value(u32 index, u32 generation); PDFErrorOr> parse_indirect_value(); PDFErrorOr parse_number(); PDFErrorOr> parse_name(); PDFErrorOr> parse_string(); PDFErrorOr parse_literal_string(); PDFErrorOr parse_hex_string(); PDFErrorOr> parse_array(); PDFErrorOr> parse_dict_contents_until(char const*); PDFErrorOr> parse_dict(); PDFErrorOr unfilter_stream(NonnullRefPtr); PDFErrorOr> parse_stream(NonnullRefPtr dict); PDFErrorOr> parse_operators(); void set_filters_enabled(bool enabled) { m_enable_filters = enabled; } void set_encryption_enabled(bool enabled) { m_enable_encryption = enabled; } void push_reference(Reference const& ref) { m_current_reference_stack.append(ref); } void pop_reference() { m_current_reference_stack.take_last(); } protected: PDFErrorOr> parse_inline_image(); Error error( ByteString const& message #ifdef PDF_DEBUG , SourceLocation loc = SourceLocation::current() #endif ) const; Reader m_reader; WeakPtr m_document; Vector m_current_reference_stack; bool m_enable_encryption { true }; bool m_enable_filters { true }; }; };