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"