KD SOAP API Documentation  2.2
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"
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  // clang-format off
73  QMetaObject::invokeMethod(d, "disconnectSocketsForServer", Q_ARG(KDSoapServer*, server), Q_ARG(QSemaphore*, &semaphore));
74  // clang-format on
75  }
76 }
77 
79 {
80  QThread::start();
81  m_semaphore.acquire(); // wait for init to be done
82 }
83 
85 {
86  QMetaObject::invokeMethod(d, "quit");
87 }
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 
106 {
107  qDeleteAll(m_socketLists);
108 }
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 
122 KDSoapSocketList *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)
int totalConnectionCount() const
KDSoapServerSocket * handleIncomingConnection(int socketDescriptor)
void resetTotalConnectionCount()
int socketCount() const

© 2010-2024 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 by doxygen 1.9.1