1 /*! 2 * \copyright Copyright (c) 2014-2021 Governikus GmbH & Co. KG, Germany 3 */ 4 5 #include "PaosParser.h" 6 7 #include <QDebug> 8 9 using namespace governikus; 10 PaosParser(const QString & pMessageName)11PaosParser::PaosParser(const QString& pMessageName) 12 : ElementParser(QSharedPointer<QXmlStreamReader>::create()) 13 , mMessageName(pMessageName) 14 , mMessageID() 15 , mRelatesTo() 16 { 17 } 18 19 ~PaosParser()20PaosParser::~PaosParser() 21 { 22 } 23 24 parse(const QByteArray & pXmlData)25PaosMessage* PaosParser::parse(const QByteArray& pXmlData) 26 { 27 PaosMessage* message = nullptr; 28 29 mXmlReader->addData(pXmlData); 30 31 while (readNextStartElement()) 32 { 33 if (mXmlReader->name() == QLatin1String("Envelope")) 34 { 35 if (!assertNoDuplicateElement(message == nullptr)) 36 { 37 qCWarning(paos) << "Duplicate Envelope element"; 38 delete message; 39 return nullptr; 40 } 41 42 message = parseEnvelope(); 43 44 if (message == nullptr) 45 { 46 return nullptr; 47 } 48 } 49 else 50 { 51 mXmlReader->skipCurrentElement(); 52 } 53 } 54 55 if (mParseError) 56 { 57 delete message; 58 message = nullptr; 59 } 60 61 if (message != nullptr) 62 { 63 message->setMessageId(mMessageID); 64 message->setRelatesTo(mRelatesTo); 65 } 66 67 return message; 68 } 69 70 parseEnvelope()71PaosMessage* PaosParser::parseEnvelope() 72 { 73 PaosMessage* message = nullptr; 74 75 while (readNextStartElement()) 76 { 77 if (mXmlReader->name() == QLatin1String("Body")) 78 { 79 if (assertNoDuplicateElement(message == nullptr)) 80 { 81 message = parseBody(); 82 } 83 } 84 else if (mXmlReader->name() == QLatin1String("Header")) 85 { 86 parseHeader(); 87 } 88 else 89 { 90 mXmlReader->skipCurrentElement(); 91 } 92 } 93 94 if (!mParseError && message == nullptr) 95 { 96 qCWarning(paos) << "Element Body not found"; 97 } 98 99 return message; 100 } 101 102 parseHeader()103void PaosParser::parseHeader() 104 { 105 while (readNextStartElement()) 106 { 107 if (mXmlReader->name() == QLatin1String("MessageID")) 108 { 109 mMessageID = readElementText(); 110 } 111 else if (mXmlReader->name() == QLatin1String("RelatesTo")) 112 { 113 mRelatesTo = readElementText(); 114 } 115 else 116 { 117 mXmlReader->skipCurrentElement(); 118 } 119 } 120 } 121 122 parseBody()123PaosMessage* PaosParser::parseBody() 124 { 125 PaosMessage* message = nullptr; 126 127 while (readNextStartElement()) 128 { 129 if (mXmlReader->name() == mMessageName) 130 { 131 if (assertNoDuplicateElement(message == nullptr)) 132 { 133 message = parseMessage(); 134 } 135 } 136 else 137 { 138 mXmlReader->skipCurrentElement(); 139 } 140 } 141 142 if (!mParseError && message == nullptr) 143 { 144 qCWarning(paos) << "Element" << mMessageName << "not found"; 145 } 146 147 return message; 148 } 149