1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132 | /* ============================================================
*
* This file is a part of digiKam project
* https://www.digikam.org
*
* Date : 2023-05-15
* Description : geolocation engine based on Marble.
* (c) 2007-2022 Marble Team
* https://invent.kde.org/education/marble/-/raw/master/data/credits_authors.html
*
* SPDX-FileCopyrightText: 2023-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* ============================================================ */
#include "GeoWriter.h"
// Local includes
#include "GeoDocument.h"
#include "GeoTagWriter.h"
#include "KmlElementDictionary.h"
#include "DgmlElementDictionary.h"
#include "digikam_debug.h"
namespace Marble
{
GeoWriter::GeoWriter()
{
//FIXME: work out a standard way to do this.
m_documentType = QString::fromUtf8(kml::kmlTag_nameSpaceOgc22);<--- Variable 'm_documentType' is assigned in constructor body. Consider performing initialization in initialization list. [+]When an object of a class is created, the constructors of all member variables are called consecutively in the order the variables are declared, even if you don't explicitly write them to the initialization list. You could avoid assigning 'm_documentType' a value by passing the value to the constructor in the initialization list.
}
bool GeoWriter::write(QIODevice* device, const GeoNode* feature)
{
setDevice(device);
setAutoFormatting(true);
writeStartDocument();
//FIXME: write the starting tags. Possibly register a tag handler to do this
// with a null string as the object name?
GeoTagWriter::QualifiedName name(QString(), m_documentType);
const GeoTagWriter* writer = GeoTagWriter::recognizes(name);
if (writer)
{
//FIXME is this too much of a hack?
writer->write(/* node = */ nullptr, *this); // node is never used in write()
}
else
{
qCDebug(DIGIKAM_MARBLE_LOG) << "There is no GeoWriter registered for: " << name;
return false;
}
if (! writeElement(feature))
{
return false;
}
//close the document
writeEndElement();
return true;
}
bool GeoWriter::writeElement(const GeoNode* object)
{
// Add checks to see that everything is ok here
GeoTagWriter::QualifiedName name(QString::fromUtf8(object->nodeType()), m_documentType);
const GeoTagWriter* writer = GeoTagWriter::recognizes(name);
if (writer)
{
if (! writer->write(object, *this))
{
qCDebug(DIGIKAM_MARBLE_LOG) << "An error has been reported by the GeoWriter for: "
<< name;
return false;
}
}
else
{
qCDebug(DIGIKAM_MARBLE_LOG) << "There is no GeoWriter registered for: " << name;
return true;
}
return true;
}
void GeoWriter::setDocumentType(const QString& documentType)
{
m_documentType = documentType;
}
void GeoWriter::writeElement(const QString& namespaceUri, const QString& key, const QString& value)
{
writeStartElement(namespaceUri, key);
writeCharacters(value);
writeEndElement();
}
void GeoWriter::writeElement(const QString& key, const QString& value)
{
writeStartElement(key);
writeCharacters(value);
writeEndElement();
}
void GeoWriter::writeOptionalElement(const QString& key, const QString& value, const QString& defaultValue)
{
if (value != defaultValue)
{
writeElement(key, value);
}
}
void GeoWriter::writeOptionalAttribute(const QString& key, const QString& value, const QString& defaultValue)
{
if (value != defaultValue)
{
writeAttribute(key, value);
}
}
} // namespace Marble
|