File indexing completed on 2025-02-16 04:50:06

0001 /*
0002     SPDX-FileCopyrightText: 2015-2019 Krzysztof Nowicki <krissn@op.pl>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include <functional>
0010 
0011 #include "fakeewsserver_export.h"
0012 
0013 #include <QMutex>
0014 #include <QPointer>
0015 #include <QTcpServer>
0016 class QTcpSocket;
0017 
0018 class FakeEwsConnection;
0019 class QXmlResultItems;
0020 class QXmlNamePool;
0021 
0022 class FAKEEWSSERVER_EXPORT FakeEwsServer : public QTcpServer
0023 {
0024     Q_OBJECT
0025 public:
0026     class FAKEEWSSERVER_EXPORT DialogEntry
0027     {
0028     public:
0029         using HttpResponse = QPair<QString, ushort>;
0030         using ReplyCallback = std::function<HttpResponse(const QString &, QXmlResultItems &, const QXmlNamePool &)>;
0031         QString xQuery;
0032         ReplyCallback replyCallback;
0033         QString description;
0034 
0035         using List = QList<DialogEntry>;
0036     };
0037 
0038     static const DialogEntry::HttpResponse EmptyResponse;
0039 
0040     explicit FakeEwsServer(QObject *parent);
0041     ~FakeEwsServer() override;
0042     bool start();
0043     void setDefaultReplyCallback(const DialogEntry::ReplyCallback &defaultReplyCallback);
0044     void setOverrideReplyCallback(const DialogEntry::ReplyCallback &overrideReplyCallback);
0045     void queueEventsXml(const QStringList &events);
0046     void setDialog(const DialogEntry::List &dialog);
0047     ushort portNumber() const;
0048 private Q_SLOTS:
0049     void newConnectionReceived();
0050     void streamingConnectionStarted(FakeEwsConnection *conn);
0051 
0052 private:
0053     void dataAvailable(QTcpSocket *sock);
0054     void sendError(QTcpSocket *sock, const QString &msg, ushort code = 500);
0055     const DialogEntry::List dialog() const;
0056     const DialogEntry::ReplyCallback defaultReplyCallback() const;
0057     const DialogEntry::ReplyCallback overrideReplyCallback() const;
0058     QStringList retrieveEventsXml();
0059 
0060     DialogEntry::List mDialog;
0061     DialogEntry::ReplyCallback mDefaultReplyCallback;
0062     DialogEntry::ReplyCallback mOverrideReplyCallback;
0063     QStringList mEventQueue;
0064     QPointer<FakeEwsConnection> mStreamingEventsConnection;
0065     ushort mPortNumber;
0066     mutable QMutex mMutex;
0067 
0068     friend class FakeEwsConnection;
0069 };