File indexing completed on 2024-04-28 04:49:05
0001 /* 0002 SPDX-FileCopyrightText: 2015 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr> 0003 0004 SPDX-License-Identifier: LGPL-3.0-or-later 0005 */ 0006 0007 #include "upnpcontrolconnectionmanager.h" 0008 0009 #include "upnpLogging.h" 0010 0011 #include <KDSoapClient/KDSoapPendingCall.h> 0012 #include <KDSoapClient/KDSoapPendingCallWatcher.h> 0013 0014 0015 class UpnpControlConnectionManagerPrivate 0016 { 0017 public: 0018 0019 QString mSourceProtocolInfo; 0020 0021 QString mSinkProtocolInfo; 0022 0023 QString mCurrentConnectionIDs; 0024 0025 bool mHasPrepareForConnection; 0026 0027 bool mHasConnectionComplete; 0028 0029 }; 0030 0031 UpnpControlConnectionManager::UpnpControlConnectionManager(QObject *parent) : UpnpControlAbstractService(parent), d(new UpnpControlConnectionManagerPrivate) 0032 { 0033 } 0034 0035 UpnpControlConnectionManager::~UpnpControlConnectionManager() 0036 = default; 0037 0038 const QString &UpnpControlConnectionManager::sourceProtocolInfo() const 0039 { 0040 return d->mSourceProtocolInfo; 0041 } 0042 0043 const QString &UpnpControlConnectionManager::sinkProtocolInfo() const 0044 { 0045 return d->mSinkProtocolInfo; 0046 } 0047 0048 const QString &UpnpControlConnectionManager::currentConnectionIDs() const 0049 { 0050 return d->mCurrentConnectionIDs; 0051 } 0052 0053 bool UpnpControlConnectionManager::hasPrepareForConnection() const 0054 { 0055 return d->mHasPrepareForConnection; 0056 } 0057 0058 bool UpnpControlConnectionManager::hasConnectionComplete() const 0059 { 0060 return d->mHasConnectionComplete; 0061 } 0062 0063 UpnpControlAbstractServiceReply *UpnpControlConnectionManager::getProtocolInfo() 0064 { 0065 auto pendingAnswer = callAction(QStringLiteral("GetProtocolInfo"), {}); 0066 0067 return pendingAnswer; 0068 } 0069 0070 UpnpControlAbstractServiceReply *UpnpControlConnectionManager::prepareForConnection(const QString &remoteProtocolInfo, 0071 const QString &remoteUDN, 0072 const QString &remoteServiceID, 0073 int remotePeerConnectionID, 0074 const QString &connectionDirection) 0075 { 0076 Q_UNUSED(remoteProtocolInfo) 0077 0078 const QString &remoteConnectionManager(remoteUDN + QStringLiteral("/") + remoteServiceID); 0079 0080 auto pendingAnswer = callAction(QStringLiteral("PrepareForConnection"), 0081 {{{}, remoteConnectionManager}, {{}, remotePeerConnectionID}, {{}, connectionDirection}}); 0082 0083 return pendingAnswer; 0084 } 0085 0086 UpnpControlAbstractServiceReply *UpnpControlConnectionManager::connectionComplete(int currentConnectionID) 0087 { 0088 auto pendingAnswer = callAction(QStringLiteral("ConnectionComplete"), {{{}, currentConnectionID}}); 0089 0090 return pendingAnswer; 0091 } 0092 0093 UpnpControlAbstractServiceReply *UpnpControlConnectionManager::getCurrentConnectionIDs() 0094 { 0095 auto pendingAnswer = callAction(QStringLiteral("GetCurrentConnectionIDs"), {}); 0096 0097 return pendingAnswer; 0098 } 0099 0100 UpnpControlAbstractServiceReply *UpnpControlConnectionManager::getCurrentConnectionInfo(int currentConnectionID) 0101 { 0102 auto pendingAnswer = callAction(QStringLiteral("GetCurrentConnectionInfo"), {{{}, currentConnectionID}}); 0103 0104 return pendingAnswer; 0105 } 0106 0107 #if 0 0108 void UpnpControlConnectionManager::finishedGetProtocolInfoCall(KDSoapPendingCallWatcher *self) 0109 { 0110 self->deleteLater(); 0111 0112 auto answer = self->returnMessage(); 0113 auto allValues = answer.childValues(); 0114 for (KDSoapValue oneValue : allValues) { 0115 if (oneValue.name() == QLatin1String("Source")) { 0116 d->mSourceProtocolInfo = oneValue.value().toString(); 0117 } 0118 if (oneValue.name() == QLatin1String("Sink")) { 0119 d->mSinkProtocolInfo = oneValue.value().toString(); 0120 } 0121 } 0122 0123 qCDebug(orgKdeElisaUpnp()) << "SourceProtocolInfo:" << d->mSourceProtocolInfo; 0124 qCDebug(orgKdeElisaUpnp()) << "SinkProtocolInfo:" << d->mSinkProtocolInfo; 0125 0126 Q_EMIT getProtocolInfoFinished(!self->returnMessage().isFault()); 0127 } 0128 0129 void UpnpControlConnectionManager::finishedPrepareForConnectionCall(KDSoapPendingCallWatcher *self) 0130 { 0131 self->deleteLater(); 0132 0133 qCDebug(orgKdeElisaUpnp()) << self->returnValue(); 0134 0135 Q_EMIT prepareForConnectionFinished(!self->returnMessage().isFault()); 0136 } 0137 0138 void UpnpControlConnectionManager::finishedConnectionCompleteCall(KDSoapPendingCallWatcher *self) 0139 { 0140 self->deleteLater(); 0141 0142 qCDebug(orgKdeElisaUpnp()) << self->returnValue(); 0143 0144 Q_EMIT connectionCompleteFinished(!self->returnMessage().isFault()); 0145 } 0146 0147 void UpnpControlConnectionManager::finishedGetCurrentConnectionIDsCall(KDSoapPendingCallWatcher *self) 0148 { 0149 self->deleteLater(); 0150 0151 qCDebug(orgKdeElisaUpnp()) << self->returnValue(); 0152 d->mCurrentConnectionIDs = self->returnValue().toString(); 0153 Q_EMIT currentConnectionIDsChanged(d->mCurrentConnectionIDs); 0154 0155 Q_EMIT getCurrentConnectionIDsFinished(!self->returnMessage().isFault()); 0156 } 0157 0158 void UpnpControlConnectionManager::finishedGetCurrentConnectionInfoCall(KDSoapPendingCallWatcher *self) 0159 { 0160 self->deleteLater(); 0161 0162 auto answer = self->returnMessage(); 0163 auto allValues = answer.childValues(); 0164 int rcsID = -1; 0165 int avTransportID = -1; 0166 QString protocolInfo; 0167 QString connectionManager; 0168 int peerConnectionID = -1; 0169 QString direction; 0170 QString connectionStatus; 0171 0172 for (KDSoapValue oneValue : allValues) { 0173 if (oneValue.name() == QLatin1String("RcsID")) { 0174 rcsID = oneValue.value().toInt(); 0175 } 0176 if (oneValue.name() == QLatin1String("AVTransportID")) { 0177 avTransportID = oneValue.value().toInt(); 0178 } 0179 if (oneValue.name() == QLatin1String("protocolInfo")) { 0180 protocolInfo = oneValue.value().toInt(); 0181 } 0182 if (oneValue.name() == QLatin1String("PeerConnectionManager")) { 0183 connectionManager = oneValue.value().toInt(); 0184 } 0185 if (oneValue.name() == QLatin1String("PeerConnectionID")) { 0186 peerConnectionID = oneValue.value().toInt(); 0187 } 0188 if (oneValue.name() == QLatin1String("Direction")) { 0189 direction = oneValue.value().toInt(); 0190 } 0191 if (oneValue.name() == QLatin1String("Status")) { 0192 connectionStatus = oneValue.value().toInt(); 0193 } 0194 } 0195 0196 qCDebug(orgKdeElisaUpnp()) << "RcsID:" << rcsID; 0197 qCDebug(orgKdeElisaUpnp()) << "AVTransportID:" << avTransportID; 0198 qCDebug(orgKdeElisaUpnp()) << "protocolInfo:" << protocolInfo; 0199 qCDebug(orgKdeElisaUpnp()) << "PeerConnectionManager:" << connectionManager; 0200 qCDebug(orgKdeElisaUpnp()) << "PeerConnectionID:" << peerConnectionID; 0201 qCDebug(orgKdeElisaUpnp()) << "Direction:" << direction; 0202 qCDebug(orgKdeElisaUpnp()) << "Status:" << connectionStatus; 0203 0204 Q_EMIT getCurrentConnectionInfoFinished(rcsID, avTransportID, protocolInfo, connectionManager, peerConnectionID, 0205 direction, connectionStatus, !self->returnMessage().isFault()); 0206 } 0207 #endif 0208 0209 void UpnpControlConnectionManager::parseServiceDescription(QIODevice *serviceDescriptionContent) 0210 { 0211 UpnpControlAbstractService::parseServiceDescription(serviceDescriptionContent); 0212 0213 const QList<QString> &allActions(actions()); 0214 0215 d->mHasPrepareForConnection = allActions.contains(QStringLiteral("PrepareForConnection")); 0216 Q_EMIT hasPrepareForConnectionChanged(); 0217 0218 d->mHasConnectionComplete = allActions.contains(QStringLiteral("ConnectionComplete")); 0219 Q_EMIT hasConnectionCompleteChanged(); 0220 } 0221 0222 void UpnpControlConnectionManager::parseEventNotification(const QString &eventName, const QString &eventValue) 0223 { 0224 if (eventName == QLatin1String("SourceProtocolInfo")) { 0225 d->mSourceProtocolInfo = eventValue; 0226 Q_EMIT sourceProtocolInfoChanged(d->mSourceProtocolInfo); 0227 } 0228 if (eventName == QLatin1String("SinkProtocolInfo")) { 0229 d->mSinkProtocolInfo = eventValue; 0230 Q_EMIT sinkProtocolInfoChanged(d->mSinkProtocolInfo); 0231 } 0232 if (eventName == QLatin1String("CurrentConnectionIDs")) { 0233 d->mCurrentConnectionIDs = eventValue; 0234 Q_EMIT currentConnectionIDsChanged(d->mCurrentConnectionIDs); 0235 } 0236 } 0237 0238 #include "moc_upnpcontrolconnectionmanager.cpp"