Coverage Report

Created: 2026-03-12 06:42

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libqxp/src/lib/QXPDetector.cpp
Line
Count
Source
1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/*
3
 * This file is part of the libqxp project.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 */
9
10
#include "QXPDetector.h"
11
12
#include "QXP1Header.h"
13
#include "QXP33Header.h"
14
#include "QXP3HeaderBase.h"
15
#include "QXP4Header.h"
16
#include "QXPMacFileParser.h"
17
#include "QXPParser.h"
18
19
namespace libqxp
20
{
21
22
namespace
23
{
24
25
class QXP3Detector : public QXP3HeaderBase
26
{
27
public:
28
  bool isSupported()
29
9.84k
  {
30
9.84k
    switch (m_version)
31
9.84k
    {
32
3.03k
    case QXPVersion::QXP_31_MAC:
33
3.07k
    case QXPVersion::QXP_31:
34
3.71k
    case QXPVersion::QXP_33:
35
5.91k
    case QXPVersion::QXP_4:
36
5.91k
      return m_signature == "XPR";
37
3.92k
    default:
38
3.92k
      return false;
39
9.84k
    }
40
9.84k
  }
41
42
  std::shared_ptr<QXPHeader> createHeader(const boost::optional<QXPDocument::Type> type = boost::none)
43
5.88k
  {
44
5.88k
    switch (m_version)
45
5.88k
    {
46
3.02k
    case QXPVersion::QXP_31_MAC:
47
3.05k
    case QXPVersion::QXP_31:
48
3.69k
    case QXPVersion::QXP_33:
49
3.69k
      return std::make_shared<QXP33Header>(type);
50
2.18k
    case QXPVersion::QXP_4:
51
2.18k
      return std::make_shared<QXP4Header>(type);
52
0
    default:
53
0
      return nullptr;
54
5.88k
    }
55
5.88k
  }
56
57
private:
58
  QXPDocument::Type getType() const override
59
0
  {
60
0
    return QXPDocument::TYPE_UNKNOWN;
61
0
  }
62
63
  std::unique_ptr<QXPParser> createParser(const std::shared_ptr<librevenge::RVNGInputStream> &, librevenge::RVNGDrawingInterface *) override
64
0
  {
65
0
    return nullptr;
66
0
  }
67
};
68
69
}
70
71
QXPDetector::QXPDetector()
72
10.0k
  : m_input()
73
10.0k
  , m_header()
74
10.0k
  , m_type(QXPDocument::TYPE_UNKNOWN)
75
10.0k
  , m_supported(false)
76
10.0k
{
77
10.0k
}
78
79
void QXPDetector::detect(const std::shared_ptr<librevenge::RVNGInputStream> &input)
80
10.0k
{
81
10.0k
  boost::optional<QXPDocument::Type> docType;
82
83
10.0k
  std::shared_ptr<librevenge::RVNGInputStream> docStream;
84
10.0k
  std::string type;
85
10.0k
  std::string creator;
86
10.0k
  QXPMacFileParser macFile(docStream, type, creator);
87
10.0k
  if (macFile.parse(input))
88
400
  {
89
400
    if (creator == "XPR3")
90
21
    {
91
21
      if (type == "XDOC")
92
1
        docType = QXPDocument::TYPE_DOCUMENT;
93
20
      else if (type == "XTMP")
94
1
        docType = QXPDocument::TYPE_TEMPLATE;
95
19
      else if (type == "XBOK")
96
1
        docType = QXPDocument::TYPE_BOOK;
97
18
      else if (type == "XLIB")
98
1
        docType = QXPDocument::TYPE_LIBRARY;
99
21
    }
100
379
    else if (creator == "XPRS" && type == "XDOC")
101
218
    {
102
218
      m_input = docStream;
103
218
      m_header = std::make_shared<QXP1Header>();
104
218
    }
105
400
  }
106
9.68k
  else
107
9.68k
  {
108
9.68k
    docStream = input;
109
9.68k
  }
110
111
10.0k
  if (!m_header)
112
9.86k
  {
113
9.86k
    QXP3Detector detector;
114
9.86k
    if (detector.load(docStream) && detector.isSupported())
115
5.88k
    {
116
5.88k
      m_input = docStream;
117
5.88k
      m_header = detector.createHeader(docType);
118
5.88k
    }
119
9.86k
  }
120
121
10.0k
  if (bool(m_header))
122
6.09k
  {
123
6.09k
    m_input->seek(0, librevenge::RVNG_SEEK_SET);
124
6.09k
    m_header->load(m_input);
125
6.09k
    m_type = m_header->getType();
126
6.09k
    m_supported = m_type != QXPDocument::TYPE_UNKNOWN;
127
6.09k
  }
128
10.0k
}
129
130
const std::shared_ptr<librevenge::RVNGInputStream> &QXPDetector::input() const
131
5.99k
{
132
5.99k
  return m_input;
133
5.99k
}
134
135
const std::shared_ptr<QXPHeader> &QXPDetector::header() const
136
5.99k
{
137
5.99k
  return m_header;
138
5.99k
}
139
140
bool QXPDetector::isSupported() const
141
9.98k
{
142
9.98k
  return m_supported;
143
9.98k
}
144
145
QXPDocument::Type QXPDetector::type() const
146
6.08k
{
147
6.08k
  return m_type;
148
6.08k
}
149
150
} // namespace libqxp
151
152
/* vim:set shiftwidth=2 softtabstop=2 expandtab: */