1 /*
2    SPDX-FileCopyrightText: 2015 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr>
3 
4    SPDX-License-Identifier: LGPL-3.0-or-later
5  */
6 
7 #include "upnpcontrolcontentdirectory.h"
8 
9 #include "upnpLogging.h"
10 
11 #include "upnpcontrolabstractservicereply.h"
12 
13 #include <KDSoapClient/KDSoapPendingCall.h>
14 #include <KDSoapClient/KDSoapPendingCallWatcher.h>
15 
16 #include <QLoggingCategory>
17 
18 class UpnpControlContentDirectoryPrivate
19 {
20 public:
21 
22     QString mSearchCapabilities;
23 
24     QString mTransferIDs;
25 
26     QString mSortCapabilities;
27 
28     int mSystemUpdateID;
29 
30     bool mHasTransferIDs;
31 
32 };
33 
UpnpControlContentDirectory(QObject * parent)34 UpnpControlContentDirectory::UpnpControlContentDirectory(QObject *parent) : UpnpControlAbstractService(parent), d(new UpnpControlContentDirectoryPrivate)
35 {
36 }
37 
38 UpnpControlContentDirectory::~UpnpControlContentDirectory()
39 = default;
40 
searchCapabilities() const41 const QString &UpnpControlContentDirectory::searchCapabilities() const
42 {
43     return d->mSearchCapabilities;
44 }
45 
transferIDs() const46 const QString &UpnpControlContentDirectory::transferIDs() const
47 {
48     return d->mTransferIDs;
49 }
50 
hasTransferIDs() const51 bool UpnpControlContentDirectory::hasTransferIDs() const
52 {
53     return d->mHasTransferIDs;
54 }
55 
sortCapabilities() const56 const QString &UpnpControlContentDirectory::sortCapabilities() const
57 {
58     return d->mSortCapabilities;
59 }
60 
systemUpdateID() const61 int UpnpControlContentDirectory::systemUpdateID() const
62 {
63     return d->mSystemUpdateID;
64 }
65 
getSearchCapabilities()66 UpnpControlAbstractServiceReply *UpnpControlContentDirectory::getSearchCapabilities()
67 {
68     auto pendingAnswer = callAction(QStringLiteral("GetSearchCapabilities"), {});
69 
70     return pendingAnswer;
71 }
72 
getSortCapabilities()73 UpnpControlAbstractServiceReply *UpnpControlContentDirectory::getSortCapabilities()
74 {
75     auto pendingAnswer = callAction(QStringLiteral("GetSortCapabilities"), {});
76 
77     return pendingAnswer;
78 }
79 
getSystemUpdateID()80 UpnpControlAbstractServiceReply *UpnpControlContentDirectory::getSystemUpdateID()
81 {
82     auto pendingAnswer = callAction(QStringLiteral("GetSystemUpdateID"), {});
83 
84     return pendingAnswer;
85 }
86 
search(const QString & objectID,const QString & searchCriteria,const QString & filter,int startingIndex,int requestedCount,const QString & sortCriteria)87 UpnpControlAbstractServiceReply *UpnpControlContentDirectory::search(const QString &objectID, const QString &searchCriteria,
88                                          const QString &filter, int startingIndex,
89                                          int requestedCount, const QString &sortCriteria)
90 {
91     qDebug() << "UpnpControlContentDirectory::search" << objectID << searchCriteria << filter << startingIndex << requestedCount << sortCriteria;
92     auto pendingAnswer = callAction(QStringLiteral("Search"), {{{}, objectID},
93                                                                {{}, searchCriteria},
94                                                                {{}, filter},
95                                                                {{}, startingIndex},
96                                                                {{}, requestedCount},
97                                                                {{}, sortCriteria}});
98 
99     return pendingAnswer;
100 }
101 
browse(const QString & objectID,const QString & browseFlag,const QString & filter,int startingIndex,int requestedCount,const QString & sortCriteria)102 UpnpControlAbstractServiceReply *UpnpControlContentDirectory::browse(const QString &objectID, const QString &browseFlag,
103                                          const QString &filter, int startingIndex,
104                                          int requestedCount, const QString &sortCriteria)
105 {
106     auto pendingAnswer = callAction(QStringLiteral("Browse"), {{QStringLiteral("ObjectID"), objectID},
107                                                                {QStringLiteral("BrowseFlag"), browseFlag},
108                                                                {QStringLiteral("Filter"), filter},
109                                                                {QStringLiteral("StartingIndex"), startingIndex},
110                                                                {QStringLiteral("RequestedCount"), requestedCount},
111                                                                {QStringLiteral("SortCriteria"), sortCriteria}});
112 
113     return pendingAnswer;
114 }
115 
116 #if 0
117 void UpnpControlContentDirectory::finishedGetSearchCapabilitiesCall(KDSoapPendingCallWatcher *self)
118 {
119     self->deleteLater();
120 
121     auto answer = self->returnMessage();
122     auto allValues = answer.childValues();
123     QString searchCaps;
124 
125     for (KDSoapValue oneValue : allValues) {
126         if (oneValue.name() == QLatin1String("SearchCaps")) {
127             searchCaps = oneValue.value().toString();
128         }
129     }
130 
131     qCDebug(orgKdeElisaUpnp()) << "SearchCaps:" << searchCaps;
132 
133     //Q_EMIT getSearchCapabilitiesFinished(searchCaps, !self->returnMessage().isFault());
134 }
135 
136 void UpnpControlContentDirectory::finishedGetSortCapabilitiesCall(KDSoapPendingCallWatcher *self)
137 {
138     self->deleteLater();
139 
140     auto answer = self->returnMessage();
141     auto allValues = answer.childValues();
142     QString sortCaps;
143 
144     for (KDSoapValue oneValue : allValues) {
145         if (oneValue.name() == QLatin1String("SortCaps")) {
146             sortCaps = oneValue.value().toString();
147         }
148     }
149 
150     qCDebug(orgKdeElisaUpnp()) << "SortCaps:" << sortCaps;
151 
152     //Q_EMIT getSortCapabilitiesFinished(sortCaps, !self->returnMessage().isFault());
153 }
154 
155 void UpnpControlContentDirectory::finishedGetSystemUpdateIDCall(KDSoapPendingCallWatcher *self)
156 {
157     self->deleteLater();
158 
159     auto answer = self->returnMessage();
160     auto allValues = answer.childValues();
161 
162     for (KDSoapValue oneValue : allValues) {
163         if (oneValue.name() == QLatin1String("Id")) {
164             d->mSystemUpdateID = oneValue.value().toInt();
165         }
166     }
167 
168     qCDebug(orgKdeElisaUpnp()) << "Id:" << d->mSystemUpdateID;
169 
170     //Q_EMIT getSystemUpdateIDFinished(d->mSystemUpdateID, !self->returnMessage().isFault());
171 }
172 
173 void UpnpControlContentDirectory::finishedSearchCall(KDSoapPendingCallWatcher *self)
174 {
175     qCDebug(orgKdeElisaUpnp()) << "UpnpControlContentDirectory::finishedSearchCall";
176     self->deleteLater();
177 
178     auto answer = self->returnMessage();
179     auto allValues = answer.childValues();
180     QString result;
181     int numberReturned = 0;
182     int totalMatches = 0;
183 
184     for (KDSoapValue oneValue : allValues) {
185         if (oneValue.name() == QLatin1String("Result")) {
186             result = oneValue.value().toString();
187         }
188         if (oneValue.name() == QLatin1String("NumberReturned")) {
189             numberReturned = oneValue.value().toInt();
190         }
191         if (oneValue.name() == QLatin1String("TotalMatches")) {
192             totalMatches = oneValue.value().toInt();
193         }
194         if (oneValue.name() == QLatin1String("UpdateID")) {
195             d->mSystemUpdateID = oneValue.value().toInt();
196         }
197     }
198 
199     //qCDebug(orgKdeElisaUpnp()) << "Result:" << result;
200     qCDebug(orgKdeElisaUpnp()) << "NumberReturned:" << numberReturned;
201     qCDebug(orgKdeElisaUpnp()) << "TotalMatches:" << totalMatches;
202     qCDebug(orgKdeElisaUpnp()) << "UpdateID:" << d->mSystemUpdateID;
203 
204     //Q_EMIT searchFinished(result, numberReturned, totalMatches, d->mSystemUpdateID, !self->returnMessage().isFault());
205 }
206 
207 void UpnpControlContentDirectory::finishedBrowseCall(KDSoapPendingCallWatcher *self)
208 {
209     self->deleteLater();
210 
211     auto answer = self->returnMessage();
212     auto allValues = answer.childValues();
213     QString result;
214     int numberReturned = 0;
215     int totalMatches = 0;
216 
217     for (KDSoapValue oneValue : allValues) {
218         if (oneValue.name() == QLatin1String("Result")) {
219             result = oneValue.value().toString();
220         }
221         if (oneValue.name() == QLatin1String("NumberReturned")) {
222             numberReturned = oneValue.value().toInt();
223         }
224         if (oneValue.name() == QLatin1String("TotalMatches")) {
225             totalMatches = oneValue.value().toInt();
226         }
227         if (oneValue.name() == QLatin1String("UpdateID")) {
228             d->mSystemUpdateID = oneValue.value().toInt();
229         }
230     }
231 
232     //qCDebug(orgKdeElisaUpnp()) << "Result:" << result;
233     //qCDebug(orgKdeElisaUpnp()) << "NumberReturned:" << numberReturned;
234     //qCDebug(orgKdeElisaUpnp()) << "TotalMatches:" << totalMatches;
235     //qCDebug(orgKdeElisaUpnp()) << "UpdateID:" << d->mSystemUpdateID;
236 
237     //Q_EMIT browseFinished(result, numberReturned, totalMatches, d->mSystemUpdateID, !self->returnMessage().isFault());
238 }
239 #endif
240 
parseServiceDescription(QIODevice * serviceDescriptionContent)241 void UpnpControlContentDirectory::parseServiceDescription(QIODevice *serviceDescriptionContent)
242 {
243     UpnpControlAbstractService::parseServiceDescription(serviceDescriptionContent);
244 
245     const QList<QString> &allVariables(stateVariables());
246 
247     d->mHasTransferIDs = allVariables.contains(QStringLiteral("TransferIDs"));
248     Q_EMIT hasTransferIDsChanged();
249 
250     //const QList<QString> &allActions(actions());
251 }
252 
parseEventNotification(const QString & eventName,const QString & eventValue)253 void UpnpControlContentDirectory::parseEventNotification(const QString &eventName, const QString &eventValue)
254 {
255     if (eventName == QLatin1String("TransferIDs")) {
256         d->mTransferIDs = eventValue;
257         Q_EMIT transferIDsChanged(d->mTransferIDs);
258     }
259     if (eventName == QLatin1String("SystemUpdateID")) {
260         d->mSystemUpdateID = eventValue.toInt();
261         Q_EMIT systemUpdateIDChanged(d->mSystemUpdateID);
262     }
263 }
264 
265 #include "moc_upnpcontrolcontentdirectory.cpp"
266