Coverage Report

Created: 2026-04-29 07:28

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
10.8k
  {
30
10.8k
    switch (m_version)
31
10.8k
    {
32
3.36k
    case QXPVersion::QXP_31_MAC:
33
3.40k
    case QXPVersion::QXP_31:
34
4.17k
    case QXPVersion::QXP_33:
35
6.58k
    case QXPVersion::QXP_4:
36
6.58k
      return m_signature == "XPR";
37
4.25k
    default:
38
4.25k
      return false;
39
10.8k
    }
40
10.8k
  }
41
42
  std::shared_ptr<QXPHeader> createHeader(const boost::optional<QXPDocument::Type> type = boost::none)
43
6.53k
  {
44
6.53k
    switch (m_version)
45
6.53k
    {
46
3.34k
    case QXPVersion::QXP_31_MAC:
47
3.37k
    case QXPVersion::QXP_31:
48
4.13k
    case QXPVersion::QXP_33:
49
4.13k
      return std::make_shared<QXP33Header>(type);
50
2.39k
    case QXPVersion::QXP_4:
51
2.39k
      return std::make_shared<QXP4Header>(type);
52
0
    default:
53
0
      return nullptr;
54
6.53k
    }
55
6.53k
  }
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
11.1k
  : m_input()
73
11.1k
  , m_header()
74
11.1k
  , m_type(QXPDocument::TYPE_UNKNOWN)
75
11.1k
  , m_supported(false)
76
11.1k
{
77
11.1k
}
78
79
void QXPDetector::detect(const std::shared_ptr<librevenge::RVNGInputStream> &input)
80
11.1k
{
81
11.1k
  boost::optional<QXPDocument::Type> docType;
82
83
11.1k
  std::shared_ptr<librevenge::RVNGInputStream> docStream;
84
11.1k
  std::string type;
85
11.1k
  std::string creator;
86
11.1k
  QXPMacFileParser macFile(docStream, type, creator);
87
11.1k
  if (macFile.parse(input))
88
435
  {
89
435
    if (creator == "XPR3")
90
22
    {
91
22
      if (type == "XDOC")
92
1
        docType = QXPDocument::TYPE_DOCUMENT;
93
21
      else if (type == "XTMP")
94
1
        docType = QXPDocument::TYPE_TEMPLATE;
95
20
      else if (type == "XBOK")
96
1
        docType = QXPDocument::TYPE_BOOK;
97
19
      else if (type == "XLIB")
98
1
        docType = QXPDocument::TYPE_LIBRARY;
99
22
    }
100
413
    else if (creator == "XPRS" && type == "XDOC")
101
245
    {
102
245
      m_input = docStream;
103
245
      m_header = std::make_shared<QXP1Header>();
104
245
    }
105
435
  }
106
10.6k
  else
107
10.6k
  {
108
10.6k
    docStream = input;
109
10.6k
  }
110
111
11.1k
  if (!m_header)
112
10.8k
  {
113
10.8k
    QXP3Detector detector;
114
10.8k
    if (detector.load(docStream) && detector.isSupported())
115
6.53k
    {
116
6.53k
      m_input = docStream;
117
6.53k
      m_header = detector.createHeader(docType);
118
6.53k
    }
119
10.8k
  }
120
121
11.1k
  if (bool(m_header))
122
6.77k
  {
123
6.77k
    m_input->seek(0, librevenge::RVNG_SEEK_SET);
124
6.77k
    m_header->load(m_input);
125
6.77k
    m_type = m_header->getType();
126
6.77k
    m_supported = m_type != QXPDocument::TYPE_UNKNOWN;
127
6.77k
  }
128
11.1k
}
129
130
const std::shared_ptr<librevenge::RVNGInputStream> &QXPDetector::input() const
131
6.67k
{
132
6.67k
  return m_input;
133
6.67k
}
134
135
const std::shared_ptr<QXPHeader> &QXPDetector::header() const
136
6.67k
{
137
6.67k
  return m_header;
138
6.67k
}
139
140
bool QXPDetector::isSupported() const
141
11.0k
{
142
11.0k
  return m_supported;
143
11.0k
}
144
145
QXPDocument::Type QXPDetector::type() const
146
6.77k
{
147
6.77k
  return m_type;
148
6.77k
}
149
150
} // namespace libqxp
151
152
/* vim:set shiftwidth=2 softtabstop=2 expandtab: */