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 #include "fakeewsserver.h"
0008 
0009 #include "fakeewsconnection.h"
0010 #include "fakeewsserver_debug.h"
0011 #include <QRandomGenerator>
0012 #include <QThread>
0013 
0014 const FakeEwsServer::DialogEntry::HttpResponse FakeEwsServer::EmptyResponse = {QString(), 0};
0015 
0016 FakeEwsServer::FakeEwsServer(QObject *parent)
0017     : QTcpServer(parent)
0018     , mPortNumber(0)
0019 {
0020 }
0021 
0022 FakeEwsServer::~FakeEwsServer()
0023 {
0024     qCInfoNC(EWSFAKE_LOG) << QStringLiteral("Stopping fake EWS server.");
0025 }
0026 
0027 bool FakeEwsServer::start()
0028 {
0029     QMutexLocker lock(&mMutex);
0030 
0031     int retries = 3;
0032     bool ok;
0033     auto generator = QRandomGenerator::global();
0034     do {
0035         mPortNumber = (generator->bounded(10000)) + 10000;
0036         qCInfoNC(EWSFAKE_LOG) << QStringLiteral("Starting fake EWS server at 127.0.0.1:%1").arg(mPortNumber);
0037         ok = listen(QHostAddress::LocalHost, mPortNumber);
0038         if (!ok) {
0039             qCWarningNC(EWSFAKE_LOG) << QStringLiteral("Failed to start server");
0040         }
0041     } while (!ok && --retries);
0042 
0043     if (ok) {
0044         connect(this, &QTcpServer::newConnection, this, &FakeEwsServer::newConnectionReceived);
0045     }
0046 
0047     return ok;
0048 }
0049 
0050 void FakeEwsServer::setDialog(const DialogEntry::List &dialog)
0051 {
0052     QMutexLocker lock(&mMutex);
0053 
0054     mDialog = dialog;
0055 }
0056 
0057 void FakeEwsServer::setDefaultReplyCallback(const DialogEntry::ReplyCallback &defaultReplyCallback)
0058 {
0059     QMutexLocker lock(&mMutex);
0060 
0061     mDefaultReplyCallback = defaultReplyCallback;
0062 }
0063 
0064 void FakeEwsServer::setOverrideReplyCallback(const DialogEntry::ReplyCallback &overrideReplyCallback)
0065 {
0066     QMutexLocker lock(&mMutex);
0067 
0068     mOverrideReplyCallback = overrideReplyCallback;
0069 }
0070 
0071 void FakeEwsServer::queueEventsXml(const QStringList &events)
0072 {
0073     if (QThread::currentThread() != thread()) {
0074         qCWarningNC(EWSFAKE_LOG) << QStringLiteral(
0075             "queueEventsXml called from wrong thread "
0076             "(called from ") << QThread::currentThread()
0077                                  << QStringLiteral(", should be ") << thread() << QStringLiteral(")");
0078         return;
0079     }
0080     mEventQueue += events;
0081 
0082     if (mStreamingEventsConnection) {
0083         mStreamingEventsConnection->sendEvents(mEventQueue);
0084         mEventQueue.clear();
0085     }
0086 }
0087 
0088 QStringList FakeEwsServer::retrieveEventsXml()
0089 {
0090     QStringList events = mEventQueue;
0091     mEventQueue.clear();
0092     return events;
0093 }
0094 
0095 void FakeEwsServer::newConnectionReceived()
0096 {
0097     QTcpSocket *sock = nextPendingConnection();
0098 
0099     auto conn = new FakeEwsConnection(sock, this);
0100     connect(conn, &FakeEwsConnection::streamingRequestStarted, this, &FakeEwsServer::streamingConnectionStarted);
0101 }
0102 
0103 const FakeEwsServer::DialogEntry::List FakeEwsServer::dialog() const
0104 {
0105     QMutexLocker lock(&mMutex);
0106 
0107     return mDialog;
0108 }
0109 
0110 const FakeEwsServer::DialogEntry::ReplyCallback FakeEwsServer::defaultReplyCallback() const
0111 {
0112     QMutexLocker lock(&mMutex);
0113 
0114     return mDefaultReplyCallback;
0115 }
0116 
0117 const FakeEwsServer::DialogEntry::ReplyCallback FakeEwsServer::overrideReplyCallback() const
0118 {
0119     QMutexLocker lock(&mMutex);
0120 
0121     return mOverrideReplyCallback;
0122 }
0123 
0124 void FakeEwsServer::streamingConnectionStarted(FakeEwsConnection *conn)
0125 {
0126     if (mStreamingEventsConnection) {
0127         qCWarningNC(EWSFAKE_LOG) << QStringLiteral("Got new streaming connection while existing one is active - terminating existing one");
0128         mStreamingEventsConnection->deleteLater();
0129     }
0130 
0131     mStreamingEventsConnection = conn;
0132 }
0133 
0134 ushort FakeEwsServer::portNumber() const
0135 {
0136     QMutexLocker lock(&mMutex);
0137 
0138     return mPortNumber;
0139 }
0140 
0141 #include "moc_fakeewsserver.cpp"