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