KD SOAP API Documentation 2.2
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 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 // clang-format off
73 QMetaObject::invokeMethod(d, "disconnectSocketsForServer", Q_ARG(KDSoapServer*, server), Q_ARG(QSemaphore*, &semaphore));
74 // clang-format on
75 }
76}
77
79{
81 m_semaphore.acquire(); // wait for init to be done
82}
83
88
90{
92 // clang-format off
93 QMetaObject::invokeMethod(d, "handleIncomingConnection", Q_ARG(int, socketDescriptor), Q_ARG(KDSoapServer*, server));
94 // clang-format on
95}
96
98
100 : QObject(nullptr)
101 , m_incomingConnectionCount(0)
102{
103}
104
109
110// Called from main thread!
112{
113 QMutexLocker lock(&m_socketListMutex);
114 int sc = 0;
115 for (KDSoapSocketList *socketList : qAsConst(m_socketLists)) {
116 sc += socketList->socketCount();
117 }
118 sc += m_incomingConnectionCount.loadAcquire();
119 return sc;
120}
121
122KDSoapSocketList *KDSoapServerThreadImpl::socketListForServer(KDSoapServer *server)
123{
124 KDSoapSocketList *sockets = m_socketLists.value(server);
125 if (sockets) {
126 return sockets;
127 }
128
129 sockets = new KDSoapSocketList(server); // creates the server object
130 m_socketLists.insert(server, sockets);
131 return sockets;
132}
133
135{
136 m_incomingConnectionCount.fetchAndAddAcquire(1);
137}
138
139// Called in the thread itself so that the socket list and server object
140// are created in the thread.
142{
143 QMutexLocker lock(&m_socketListMutex);
144 KDSoapSocketList *sockets = socketListForServer(server);
145 KDSoapServerSocket *socket = sockets->handleIncomingConnection(socketDescriptor);
146 Q_UNUSED(socket);
147 m_incomingConnectionCount.fetchAndAddAcquire(-1);
148}
149
151{
152 thread()->quit();
153}
154
156{
157 QMutexLocker lock(&m_socketListMutex);
158 KDSoapSocketList *sockets = m_socketLists.value(const_cast<KDSoapServer *>(server));
159 return sockets ? sockets->socketCount() : 0;
160}
161
163{
164 QMutexLocker lock(&m_socketListMutex);
165 KDSoapSocketList *sockets = m_socketLists.value(server);
166 if (sockets) {
167 sockets->disconnectAll();
168 }
169 semaphore->release();
170}
171
173{
174 QMutexLocker lock(&m_socketListMutex);
175 KDSoapSocketList *sockets = m_socketLists.value(const_cast<KDSoapServer *>(server));
176 return sockets ? sockets->totalConnectionCount() : 0;
177}
178
180{
181 QMutexLocker lock(&m_socketListMutex);
182 KDSoapSocketList *sockets = m_socketLists.value(const_cast<KDSoapServer *>(server));
183 if (sockets) {
184 sockets->resetTotalConnectionCount();
185 }
186}
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
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)

© 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 Sat Apr 20 2024 00:04:25 for KD SOAP API Documentation by doxygen 1.9.8