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"