Torc  0.1
torcxmlserialiser.cpp
Go to the documentation of this file.
1 /* Class TorcXMLSerialiser
2 *
3 * This file is part of the Torc project.
4 *
5 * Copyright (C) Mark Kendall 2012-18
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20 * USA.
21 */
22 
23 // Torc
24 #include "torcxmlserialiser.h"
25 
34  : TorcSerialiser(),
35  m_xmlStream(),
36  m_buffer()
37 {
38 }
39 
41 {
42  return HTTPResponseXML;
43 }
44 
45 void TorcXMLSerialiser::Prepare(QByteArray &Dest)
46 {
47  m_buffer.setBuffer(&Dest);
48  m_buffer.open(QBuffer::ReadWrite);
49  m_xmlStream.setDevice(&m_buffer);
50 }
51 
52 void TorcXMLSerialiser::Begin(QByteArray &Dest)
53 {
54  (void)Dest;
55  m_xmlStream.writeStartDocument(QStringLiteral("1.0"));
56 }
57 
58 void TorcXMLSerialiser::End(QByteArray &Dest)
59 {
60  (void)Dest;
61  m_xmlStream.writeEndDocument();
62 }
63 
64 void TorcXMLSerialiser::AddProperty(QByteArray &Dest, const QString &Name, const QVariant &Value)
65 {
66  (void)Dest;
67  if (!Name.isEmpty())
68  m_xmlStream.writeStartElement(Name);
69  VariantToXML(Name, Value);
70  if (!Name.isEmpty())
71  m_xmlStream.writeEndElement();
72 }
73 
74 void TorcXMLSerialiser::VariantToXML(const QString &Name, const QVariant &Value)
75 {
76  switch(static_cast<QMetaType::Type>(Value.type()))
77  {
78  case QMetaType::QVariantList: ListToXML(Name, Value.toList()); return;
79  case QMetaType::QStringList: StringListToXML(Name, Value.toStringList()); return;
80  case QMetaType::QVariantMap: MapToXML(Name, Value.toMap()); return;
81  case (QVariant::Type)QMetaType::QDateTime:
82  {
83  QDateTime datetime(Value.toDateTime());
84  if (datetime.isNull())
85  m_xmlStream.writeAttribute(QStringLiteral("xsi:nil"), QStringLiteral("true"));
86  m_xmlStream.writeCharacters(datetime.toString(Qt::ISODate));
87  return;
88  }
89  default: m_xmlStream.writeCharacters(Value.toString()); return;
90  }
91 }
92 
93 void TorcXMLSerialiser::ListToXML(const QString &Name, const QVariantList &Value)
94 {
95  if (!Value.isEmpty())
96  {
97  int type = Value[0].type();
98  QVariantList::const_iterator it = Value.begin();
99  for ( ; it != Value.end(); ++it)
100  {
101  if ((int)(*it).type() != type)
102  {
103  VariantToXML(QStringLiteral("Error"), QVARIANT_ERROR);
104  return;
105  }
106  }
107  }
108 
109  QVariantList::const_iterator it = Value.begin();
110  for ( ; it != Value.end(); ++it)
111  {
112  m_xmlStream.writeStartElement(Name);
113  VariantToXML(Name, (*it));
114  m_xmlStream.writeEndElement();
115  }
116 }
117 
118 void TorcXMLSerialiser::StringListToXML(const QString &Name, const QStringList &Value)
119 {
120  (void)Name;
121 
122  QStringList::const_iterator it = Value.begin();
123  for ( ; it != Value.end(); ++it)
124  {
125  m_xmlStream.writeStartElement(QStringLiteral("String"));
126  m_xmlStream.writeCharacters((*it));
127  m_xmlStream.writeEndElement();
128  }
129 }
130 
131 void TorcXMLSerialiser::MapToXML(const QString &Name, const QVariantMap &Value)
132 {
133  QVariantMap::const_iterator it = Value.begin();
134  for ( ; it != Value.end(); ++it)
135  {
136  m_xmlStream.writeStartElement(it.key());
137  VariantToXML(Name, it.value());
138  m_xmlStream.writeEndElement();
139  }
140 }
141 
143 {
144  public:
145  TorcXMLSerialiserFactory() : TorcSerialiserFactory(QStringLiteral("application"), QStringLiteral("xml"), QStringLiteral("XML"))
146  {
147  }
148 
150  {
151  return new TorcXMLSerialiser();
152  }
void VariantToXML(const QString &Name, const QVariant &Value)
virtual void End(QByteArray &Dest) override
void StringListToXML(const QString &Name, const QStringList &Value)
void ListToXML(const QString &Name, const QVariantList &Value)
virtual void Begin(QByteArray &Dest) override
TorcSerialiser * Create(void)
virtual void AddProperty(QByteArray &Dest, const QString &Name, const QVariant &Value) override
HTTPResponseType
TorcXMLSerialiserFactory TorcXMLSerialiserFactory
#define QVARIANT_ERROR
void MapToXML(const QString &Name, const QVariantMap &Value)
virtual HTTPResponseType ResponseType(void) override
QXmlStreamWriter m_xmlStream
virtual void Prepare(QByteArray &Dest) override