Parser.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * Copyright (c) 2021-2022, Matthew Olsson <mattco@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/SourceLocation.h>
  8. #include <AK/WeakPtr.h>
  9. #include <LibPDF/Object.h>
  10. #include <LibPDF/Operator.h>
  11. #include <LibPDF/Reader.h>
  12. #include <LibPDF/XRefTable.h>
  13. namespace PDF {
  14. template<typename T, typename... Args>
  15. static NonnullRefPtr<T> make_object(Args... args)
  16. requires(IsBaseOf<Object, T>)
  17. {
  18. return adopt_ref(*new T(forward<Args>(args)...));
  19. }
  20. class Document;
  21. class Parser {
  22. public:
  23. static PDFErrorOr<Vector<Operator>> parse_operators(Document*, ReadonlyBytes);
  24. Parser(ReadonlyBytes);
  25. Parser(Document*, ReadonlyBytes);
  26. void set_document(WeakPtr<Document> const&);
  27. ByteString parse_comment();
  28. void move_by(size_t count) { m_reader.move_by(count); }
  29. void move_to(size_t offset) { m_reader.move_to(offset); }
  30. enum class CanBeIndirectValue {
  31. No,
  32. Yes
  33. };
  34. PDFErrorOr<Value> parse_value(CanBeIndirectValue = CanBeIndirectValue::Yes);
  35. PDFErrorOr<Value> parse_possible_indirect_value_or_ref();
  36. PDFErrorOr<NonnullRefPtr<IndirectValue>> parse_indirect_value(u32 index, u32 generation);
  37. PDFErrorOr<NonnullRefPtr<IndirectValue>> parse_indirect_value();
  38. PDFErrorOr<Value> parse_number();
  39. PDFErrorOr<NonnullRefPtr<NameObject>> parse_name();
  40. PDFErrorOr<NonnullRefPtr<StringObject>> parse_string();
  41. PDFErrorOr<ByteString> parse_literal_string();
  42. PDFErrorOr<ByteString> parse_hex_string();
  43. PDFErrorOr<NonnullRefPtr<ArrayObject>> parse_array();
  44. PDFErrorOr<HashMap<DeprecatedFlyString, Value>> parse_dict_contents_until(char const*);
  45. PDFErrorOr<NonnullRefPtr<DictObject>> parse_dict();
  46. PDFErrorOr<void> unfilter_stream(NonnullRefPtr<StreamObject>);
  47. PDFErrorOr<NonnullRefPtr<StreamObject>> parse_stream(NonnullRefPtr<DictObject> dict);
  48. PDFErrorOr<Vector<Operator>> parse_operators();
  49. void set_filters_enabled(bool enabled)
  50. {
  51. m_enable_filters = enabled;
  52. }
  53. void set_encryption_enabled(bool enabled)
  54. {
  55. m_enable_encryption = enabled;
  56. }
  57. void push_reference(Reference const& ref) { m_current_reference_stack.append(ref); }
  58. void pop_reference() { m_current_reference_stack.take_last(); }
  59. protected:
  60. PDFErrorOr<NonnullRefPtr<StreamObject>> parse_inline_image();
  61. Error error(
  62. ByteString const& message
  63. #ifdef PDF_DEBUG
  64. ,
  65. SourceLocation loc = SourceLocation::current()
  66. #endif
  67. ) const;
  68. Reader m_reader;
  69. WeakPtr<Document> m_document;
  70. Vector<Reference> m_current_reference_stack;
  71. bool m_enable_encryption { true };
  72. bool m_enable_filters { true };
  73. };
  74. };