KD SOAP API Documentation  2.1
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-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
6 **
7 ** SPDX-License-Identifier: MIT
8 **
9 ****************************************************************************/
10 #include "KDSoapServer.h"
11 #include "KDSoapServerSocket_p.h"
12 #include "KDSoapServerThread_p.h"
13 #include "KDSoapSocketList_p.h"
14 
15 #include <QMetaType>
16 
18  : QThread(parent)
19  , d(nullptr)
20 {
21  qRegisterMetaType<KDSoapServer *>("KDSoapServer*");
22  qRegisterMetaType<QSemaphore *>("QSemaphore*");
23 }
24 
26 {
27 }
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 
63 {
64  if (d) {
66  }
67 }
68 
70 {
71  if (d) {
72  QMetaObject::invokeMethod(d, "disconnectSocketsForServer", Q_ARG(KDSoapServer *, server), Q_ARG(QSemaphore *, &semaphore));
73  }
74 }
75 
77 {
78  QThread::start();
79  m_semaphore.acquire(); // wait for init to be done
80 }
81 
83 {
84  QMetaObject::invokeMethod(d, "quit");
85 }
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 
102 {
103  qDeleteAll(m_socketLists.values());
104 }
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 
118 KDSoapSocketList *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)
int totalConnectionCount() const
KDSoapServerSocket * handleIncomingConnection(int socketDescriptor)
void resetTotalConnectionCount()
int socketCount() const

© 2010-2022 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 Jun 13 2023 12:18:34 for KD SOAP API Documentation by doxygen 1.9.1