Coverage Report

Created: 2026-09-14 06:37

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
11.8k
  {
30
11.8k
    switch (m_version)
31
11.8k
    {
32
3.71k
    case QXPVersion::QXP_31_MAC:
33
3.75k
    case QXPVersion::QXP_31:
34
4.56k
    case QXPVersion::QXP_33:
35
7.24k
    case QXPVersion::QXP_4:
36
7.24k
      return m_signature == "XPR";
37
4.63k
    default:
38
4.63k
      return false;
39
11.8k
    }
40
11.8k
  }
41
42
  std::shared_ptr<QXPHeader> createHeader(const boost::optional<QXPDocument::Type> type = boost::none)
43
7.20k
  {
44
7.20k
    switch (m_version)
45
7.20k
    {
46
3.70k
    case QXPVersion::QXP_31_MAC:
47
3.73k
    case QXPVersion::QXP_31:
48
4.54k
    case QXPVersion::QXP_33:
49
4.54k
      return std::make_shared<QXP33Header>(type);
50
2.66k
    case QXPVersion::QXP_4:
51
2.66k
      return std::make_shared<QXP4Header>(type);
52
0
    default:
53
0
      return nullptr;
54
7.20k
    }
55
7.20k
  }
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
12.1k
  : m_input()
73
12.1k
  , m_header()
74
12.1k
  , m_type(QXPDocument::TYPE_UNKNOWN)
75
12.1k
  , m_supported(false)
76
12.1k
{
77
12.1k
}
78
79
void QXPDetector::detect(const std::shared_ptr<librevenge::RVNGInputStream> &input)
80
12.1k
{
81
12.1k
  boost::optional<QXPDocument::Type> docType;
82
83
12.1k
  std::shared_ptr<librevenge::RVNGInputStream> docStream;
84
12.1k
  std::string type;
85
12.1k
  std::string creator;
86
12.1k
  QXPMacFileParser macFile(docStream, type, creator);
87
12.1k
  if (macFile.parse(input))
88
481
  {
89
481
    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
460
    else if (creator == "XPRS" && type == "XDOC")
101
269
    {
102
269
      m_input = docStream;
103
269
      m_header = std::make_shared<QXP1Header>();
104
269
    }
105
481
  }
106
11.6k
  else
107
11.6k
  {
108
11.6k
    docStream = input;
109
11.6k
  }
110
111
12.1k
  if (!m_header)
112
11.9k
  {
113
11.9k
    QXP3Detector detector;
114
11.9k
    if (detector.load(docStream) && detector.isSupported())
115
7.20k
    {
116
7.20k
      m_input = docStream;
117
7.20k
      m_header = detector.createHeader(docType);
118
7.20k
    }
119
11.9k
  }
120
121
12.1k
  if (bool(m_header))
122
7.47k
  {
123
7.47k
    m_input->seek(0, librevenge::RVNG_SEEK_SET);
124
7.47k
    m_header->load(m_input);
125
7.47k
    m_type = m_header->getType();
126
7.47k
    m_supported = m_type != QXPDocument::TYPE_UNKNOWN;
127
7.47k
  }
128
12.1k
}
129
130
const std::shared_ptr<librevenge::RVNGInputStream> &QXPDetector::input() const
131
7.33k
{
132
7.33k
  return m_input;
133
7.33k
}
134
135
const std::shared_ptr<QXPHeader> &QXPDetector::header() const
136
7.33k
{
137
7.33k
  return m_header;
138
7.33k
}
139
140
bool QXPDetector::isSupported() const
141
12.0k
{
142
12.0k
  return m_supported;
143
12.0k
}
144
145
QXPDocument::Type QXPDetector::type() const
146
7.44k
{
147
7.44k
  return m_type;
148
7.44k
}
149
150
} // namespace libqxp
151
152
/* vim:set shiftwidth=2 softtabstop=2 expandtab: */