1 /*
2     SPDX-FileCopyrightText: 2017-2019 Krzysztof Nowicki <krissn@op.pl>
3 
4     SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "fakeewsserverthread.h"
8 
9 #include <QEventLoop>
10 
11 #include "fakeewsserver_debug.h"
12 
FakeEwsServerThread(QObject * parent)13 FakeEwsServerThread::FakeEwsServerThread(QObject *parent)
14     : QThread(parent)
15     , mPortNumber(0)
16     , mIsRunning(0)
17 {
18 }
19 
~FakeEwsServerThread()20 FakeEwsServerThread::~FakeEwsServerThread()
21 {
22 }
23 
run()24 void FakeEwsServerThread::run()
25 {
26     qCInfoNC(EWSFAKE_LOG) << QStringLiteral("Starting fake server thread");
27     mMutex.lock();
28     mServer.reset(new FakeEwsServer(nullptr));
29     bool ok = mServer->start();
30     mMutex.unlock();
31 
32     if (ok) {
33         qCInfoNC(EWSFAKE_LOG) << QStringLiteral("Fake server thread started.");
34         mPortNumber = mServer->portNumber();
35         Q_EMIT serverStarted(ok);
36         mIsRunning = 1;
37         exec();
38         qCInfoNC(EWSFAKE_LOG) << QStringLiteral("Fake server thread terminating.");
39     } else {
40         Q_EMIT serverStarted(ok);
41         qCInfoNC(EWSFAKE_LOG) << QStringLiteral("Fake server thread start failed.");
42     }
43 
44     mMutex.lock();
45     mServer.reset();
46     mMutex.unlock();
47 }
48 
setDialog(const FakeEwsServer::DialogEntry::List & dialog)49 void FakeEwsServerThread::setDialog(const FakeEwsServer::DialogEntry::List &dialog)
50 {
51     QMutexLocker lock(&mMutex);
52 
53     if (mServer) {
54         mServer->setDialog(dialog);
55     }
56 }
57 
setDefaultReplyCallback(const FakeEwsServer::DialogEntry::ReplyCallback & defaultReplyCallback)58 void FakeEwsServerThread::setDefaultReplyCallback(const FakeEwsServer::DialogEntry::ReplyCallback &defaultReplyCallback)
59 {
60     QMutexLocker lock(&mMutex);
61 
62     if (mServer) {
63         mServer->setDefaultReplyCallback(defaultReplyCallback);
64     }
65 }
66 
setOverrideReplyCallback(const FakeEwsServer::DialogEntry::ReplyCallback & overrideReplyCallback)67 void FakeEwsServerThread::setOverrideReplyCallback(const FakeEwsServer::DialogEntry::ReplyCallback &overrideReplyCallback)
68 {
69     QMutexLocker lock(&mMutex);
70 
71     if (mServer) {
72         mServer->setOverrideReplyCallback(overrideReplyCallback);
73     }
74 }
75 
queueEventsXml(const QStringList & events)76 void FakeEwsServerThread::queueEventsXml(const QStringList &events)
77 {
78     QMutexLocker lock(&mMutex);
79 
80     if (mServer) {
81         metaObject()->invokeMethod(this, "doQueueEventsXml", Q_ARG(QStringList, events));
82     }
83 }
84 
doQueueEventsXml(const QStringList & events)85 void FakeEwsServerThread::doQueueEventsXml(const QStringList &events)
86 {
87     mServer->queueEventsXml(events);
88 }
89 
waitServerStarted() const90 bool FakeEwsServerThread::waitServerStarted() const
91 {
92     QEventLoop loop;
93     {
94         QMutexLocker lock(&mMutex);
95         if (isFinished()) {
96             return false;
97         }
98         if (mIsRunning) {
99             return true;
100         }
101         connect(this, &FakeEwsServerThread::serverStarted, this, [&loop](bool ok) {
102             loop.exit(ok ? 1 : 0);
103         });
104     }
105     return loop.exec();
106 }
107