KD SOAP API Documentation 2.1
Loading...
Searching...
No Matches
KDSoapServerThread.cpp
Go to the documentation of this file.
1/****************************************************************************
2**
3** This file is part of the KD Soap project.
4**
5** SPDX-FileCopyrightText: 2010-2023 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
6**
7** SPDX-License-Identifier: MIT
8**
9****************************************************************************/
10#include "KDSoapServer.h"
13#include "KDSoapSocketList_p.h"
14
15#include <QMetaType>
16
18 : QThread(parent)
19 , d(nullptr)
20{
21 qRegisterMetaType<KDSoapServer *>("KDSoapServer*");
23}
24
28
30{
32 d = &impl;
33 m_semaphore.release();
34 exec();
35 d = nullptr;
36}
37
39{
40 if (d) {
41 return d->socketCount();
42 }
43 return 0;
44}
45
47{
48 if (d) {
49 return d->socketCountForServer(server);
50 }
51 return 0;
52}
53
55{
56 if (d) {
57 return d->totalConnectionCountForServer(server);
58 }
59 return 0;
60}
61
68
70{
71 if (d) {
72 QMetaObject::invokeMethod(d, "disconnectSocketsForServer", Q_ARG(KDSoapServer *, server), Q_ARG(QSemaphore *, &semaphore));
73 }
74}
75
77{
79 m_semaphore.acquire(); // wait for init to be done
80}
81
86
88{
90 QMetaObject::invokeMethod(d, "handleIncomingConnection", Q_ARG(int, socketDescriptor), Q_ARG(KDSoapServer *, server));
91}
92
94
96 : QObject(nullptr)
97 , m_incomingConnectionCount(0)
98{
99}
100
105
106// Called from main thread!
108{
109 QMutexLocker lock(&m_socketListMutex);
110 int sc = 0;
111 for (KDSoapSocketList *socketList : qAsConst(m_socketLists)) {
112 sc += socketList->socketCount();
113 }
114 sc += m_incomingConnectionCount.loadAcquire();
115 return sc;
116}
117
118KDSoapSocketList *KDSoapServerThreadImpl::socketListForServer(KDSoapServer *server)
119{
120 KDSoapSocketList *sockets = m_socketLists.value(server);
121 if (sockets) {
122 return sockets;
123 }
124
125 sockets = new KDSoapSocketList(server); // creates the server object
126 m_socketLists.insert(server, sockets);
127 return sockets;
128}
129
131{
132 m_incomingConnectionCount.fetchAndAddAcquire(1);
133}
134
135// Called in the thread itself so that the socket list and server object
136// are created in the thread.
138{
139 QMutexLocker lock(&m_socketListMutex);
140 KDSoapSocketList *sockets = socketListForServer(server);
141 KDSoapServerSocket *socket = sockets->handleIncomingConnection(socketDescriptor);
142 Q_UNUSED(socket);
143 m_incomingConnectionCount.fetchAndAddAcquire(-1);
144}
145
147{
148 thread()->quit();
149}
150
152{
153 QMutexLocker lock(&m_socketListMutex);
154 KDSoapSocketList *sockets = m_socketLists.value(const_cast<KDSoapServer *>(server));
155 return sockets ? sockets->socketCount() : 0;
156}
157
159{
160 QMutexLocker lock(&m_socketListMutex);
161 KDSoapSocketList *sockets = m_socketLists.value(server);
162 if (sockets) {
163 sockets->disconnectAll();
164 }
165 semaphore->release();
166}
167
169{
170 QMutexLocker lock(&m_socketListMutex);
171 KDSoapSocketList *sockets = m_socketLists.value(const_cast<KDSoapServer *>(server));
172 return sockets ? sockets->totalConnectionCount() : 0;
173}
174
176{
177 QMutexLocker lock(&m_socketListMutex);
178 KDSoapSocketList *sockets = m_socketLists.value(const_cast<KDSoapServer *>(server));
179 if (sockets) {
180 sockets->resetTotalConnectionCount();
181 }
182}
int totalConnectionCountForServer(const KDSoapServer *server)
void disconnectSocketsForServer(KDSoapServer *server, QSemaphore *semaphore)
void resetTotalConnectionCountForServer(const KDSoapServer *server)
int socketCountForServer(const KDSoapServer *server)
void handleIncomingConnection(int socketDescriptor, KDSoapServer *server)
int socketCountForServer(const KDSoapServer *server) const
void disconnectSocketsForServer(KDSoapServer *server, QSemaphore &semaphore)
KDSoapServerThread(QObject *parent=0)
int totalConnectionCountForServer(const KDSoapServer *server) const
void resetTotalConnectionCountForServer(const KDSoapServer *server)
virtual void run() override
void handleIncomingConnection(int socketDescriptor, KDSoapServer *server)
T fetchAndAddAcquire(T valueToAdd)
T loadAcquire() const const
QHash::iterator insert(const Key &key, const T &value)
const T value(const Key &key) const const
QList< T > values() const const
bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericArgument val0, QGenericArgument val1, QGenericArgument val2, QGenericArgument val3, QGenericArgument val4, QGenericArgument val5, QGenericArgument val6, QGenericArgument val7, QGenericArgument val8, QGenericArgument val9)
T qobject_cast(QObject *object)
QThread * thread() const const
void acquire(int n)
void release(int n)
int exec()
void quit()
void start(QThread::Priority priority)

© 2010-2023 Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
https://www.kdab.com/development-resources/qt-tools/kd-soap/
Generated on Tue Dec 26 2023 00:00:25 for KD SOAP API Documentation by doxygen 1.9.8