1 /* 2 SPDX-FileCopyrightText: 2015-2019 Krzysztof Nowicki <krissn@op.pl> 3 4 SPDX-License-Identifier: LGPL-2.0-or-later 5 */ 6 7 #pragma once 8 9 #include <functional> 10 11 #include <QSharedPointer> 12 #include <QXmlStreamReader> 13 #include <QXmlStreamWriter> 14 15 #include <KIO/TransferJob> 16 17 #include "ewsclient.h" 18 #include "ewsjob.h" 19 #include "ewsserverversion.h" 20 #include "ewstypes.h" 21 22 class QWidget; 23 24 class EwsRequest : public EwsJob 25 { 26 Q_OBJECT 27 public: 28 class Response 29 { 30 public: responseClass()31 EwsResponseClass responseClass() const 32 { 33 return mClass; 34 } 35 isSuccess()36 bool isSuccess() const 37 { 38 return mClass == EwsResponseSuccess; 39 } 40 responseCode()41 QString responseCode() const 42 { 43 return mCode; 44 } 45 responseMessage()46 QString responseMessage() const 47 { 48 return mMessage; 49 } 50 51 protected: 52 Response(QXmlStreamReader &reader); 53 bool readResponseElement(QXmlStreamReader &reader); 54 bool setErrorMsg(const QString &msg); 55 56 EwsResponseClass mClass; 57 QString mCode; 58 QString mMessage; 59 }; 60 61 EwsRequest(EwsClient &client, QObject *parent); 62 ~EwsRequest() override; 63 64 void setMetaData(const KIO::MetaData &md); 65 void addMetaData(const QString &key, const QString &value); 66 67 void setServerVersion(const EwsServerVersion &version); serverVersion()68 const EwsServerVersion &serverVersion() const 69 { 70 return mServerVersion; 71 } 72 73 void dump() const; 74 75 protected: 76 typedef std::function<bool(QXmlStreamReader &reader)> ContentReaderFn; 77 78 void doSend(); 79 void prepare(const QString &body); 80 virtual bool parseResult(QXmlStreamReader &reader) = 0; 81 void startSoapDocument(QXmlStreamWriter &writer); 82 void endSoapDocument(QXmlStreamWriter &writer); 83 bool parseResponseMessage(QXmlStreamReader &reader, const QString &reqName, ContentReaderFn contentReader); 84 bool readResponse(QXmlStreamReader &reader); 85 86 KIO::MetaData mMd; 87 QString mResponseData; 88 protected Q_SLOTS: 89 void requestResult(KJob *job); 90 virtual void requestData(KIO::Job *job, const QByteArray &data); 91 92 private: 93 bool readSoapBody(QXmlStreamReader &reader); 94 bool readSoapFault(QXmlStreamReader &reader); 95 bool readHeader(QXmlStreamReader &reader); 96 bool readResponseAttr(const QXmlStreamAttributes &attrs, EwsResponseClass &responseClass); 97 QString getOAuthToken(); 98 QPair<QStringRef, QString> parseNamespacedString(const QString &str, const QXmlStreamNamespaceDeclarations &namespaces); 99 EwsResponseCode parseEwsResponseCode(const QPair<QStringRef, QString> &code); 100 101 QString mBody; 102 EwsClient &mClient; 103 EwsServerVersion mServerVersion; 104 QWidget *mParentWindow; 105 }; 106 107