MythTV master
upnpdevice.h
Go to the documentation of this file.
1
2// Program Name: upnpdevice.h
3// Created : Oct. 24, 2005
4//
5// Purpose : UPnp Device Description parser/generator
6//
7// Copyright (c) 2005 David Blain <dblain@mythtv.org>
8//
9// Licensed under the GPL v2 or later, see LICENSE for details
10//
12
13#ifndef UPNPDEVICE_H
14#define UPNPDEVICE_H
15
16#include <utility>
17
18// Qt headers
19#include <QDomDocument>
20#include <QList>
21#include <QString>
22#include <QUrl>
23#include <QUrlQuery>
24
25// MythTV headers
26#include "libmythbase/compat.h"
30
31#include "upnpexp.h"
32#include "upnputil.h"
33
34class UPnpDeviceDesc;
35class UPnpDevice;
36class UPnpService;
37class UPnpIcon;
38class QTextStream;
39
41// Typedefs
43
44using UPnpDeviceList = QList< UPnpDevice* >;
45using UPnpServiceList = QList< UPnpService* >;
46using UPnpIconList = QList< UPnpIcon* >;
47
49//
51
53{
54 public:
55 QString m_sURL;
56 QString m_sMimeType;
57 int m_nWidth { 0 };
58 int m_nHeight { 0 };
59 int m_nDepth { 0 };
60
61 UPnpIcon() = default;
62
63 QString toString(uint padding) const
64 {
65 QString pad;
66 for (uint i = 0; i < padding; i++)
67 pad += " ";
68 return QString("%0Icon %1 %2x%3^%4 %5")
69 .arg(pad, m_sURL).arg(m_nWidth).arg(m_nHeight)
70 .arg(m_nDepth).arg(m_sMimeType);
71 }
72};
73
75
77{
78 public:
80 QString m_sServiceId;
81 QString m_sSCPDURL;
84
85 UPnpService() = default;
86
87 QString toString(uint padding) const
88 {
89 QString pad;
90 for (uint i = 0; i < padding; i++)
91 pad += " ";
92 return
93 QString("%0Service %1\n"
94 "%0 id: %2\n"
95 "%0 SCPD URL: %3\n"
96 "%0 Control URL: %4\n"
97 "%0 Event Sub URL: %5")
98 .arg(pad, m_sEventSubURL, m_sServiceType, m_sServiceId,
99 m_sSCPDURL, m_sControlURL, m_sEventSubURL);
100 }
101};
102
104
106{
107 public:
108
116 QString m_sModelURL;
118 QString m_sUPC;
120 mutable QString m_sUDN;
121
123
125 bool m_securityPin { false };
127
131
132 public:
133 UPnpDevice();
134 ~UPnpDevice();
135
136 QString GetUDN(void) const;
137
138 void toMap(InfoMap &map) const;
139
140 UPnpService GetService(const QString &urn, bool *found = nullptr) const;
141
142 QString toString(uint padding = 0) const;
143};
144
145
148//
149//
150//
153
155{
156 public:
157
159 QString m_sHostName;
161
162 protected:
163
164 void InternalLoad( QDomNode oNode, UPnpDevice *pCurDevice );
165
166 static void ProcessIconList ( const QDomNode& oListNode, UPnpDevice *pDevice );
167 static void ProcessServiceList( const QDomNode& oListNode, UPnpDevice *pDevice );
168 void ProcessDeviceList ( const QDomNode& oListNode, UPnpDevice *pDevice );
169
170 void OutputDevice( QTextStream &os,
171 UPnpDevice *pDevice,
172 const QString &sUserAgent = "" );
173
174 static void SetStrValue ( const QDomNode &n, QString &sValue );
175 static void SetNumValue ( const QDomNode &n, int &nValue );
176 static void SetBoolValue( const QDomNode &n, bool &nValue );
177
178 static QString FormatValue ( const NameValue &node );
179 static QString FormatValue ( const QString &sName, const QString &sValue );
180 static QString FormatValue ( const QString &sName, int nValue );
181
182 QString GetHostName () const;
183
184 public:
185
186 UPnpDeviceDesc() = default;
187 virtual ~UPnpDeviceDesc() = default;
188
189 bool Load ( const QString &sFileName );
190 bool Load ( const QDomDocument &xmlDevDesc );
191
192 void GetValidXML( const QString &sBaseAddress, int nPort, QTextStream &os, const QString &sUserAgent = "" );
193 QString GetValidXML( const QString &sBaseAddress, int nPort );
194
195 QString FindDeviceUDN( UPnpDevice *pDevice, QString sST );
196
197 UPnpDevice *FindDevice( const QString &sURI );
198
199 static UPnpDevice *FindDevice( UPnpDevice *pDevice, const QString &sURI );
200 static UPnpDeviceDesc *Retrieve ( QString &sURL );
201
202 void toMap(InfoMap &map) const
203 {
204 map["hostname"] = m_sHostName;
205 m_rootDevice.toMap(map);
206 }
207};
208
210// DeviceLocation Class Definition/Implementation
212
214{
215 public:
216
217 static int g_nAllocated; // Debugging only
218
219 protected:
220
221 // ==================================================================
222 // Destructor protected to force use of Release Method
223 // ==================================================================
224
226 {
227 // Should be atomic decrement
228 g_nAllocated--;
229
230 delete m_pDeviceDesc;
231 }
232
233 UPnpDeviceDesc *m_pDeviceDesc { nullptr }; // We take ownership of this pointer.
234
235 public:
236
237 QString m_sURI; // Service Type URI
238 QString m_sUSN; // Unique Service Name
239 QString m_sLocation; // URL to Device Description
240 std::chrono::microseconds m_ttExpires;
241 QString m_sSecurityPin; // Use for MythXML methods needed pin
242
243 public:
244
245 // ==================================================================
246
247 DeviceLocation( QString sURI,
248 QString sUSN,
249 QString sLocation,
250 std::chrono::microseconds ttExpires ) : ReferenceCounter(
251 "DeviceLocation" ),
252 m_sURI (std::move( sURI )),
253 m_sUSN (std::move( sUSN )),
254 m_sLocation (std::move( sLocation )),
255 m_ttExpires ( ttExpires )
256 {
257 // Should be atomic increment
258 g_nAllocated++;
259 }
260
261 // ==================================================================
262
263 std::chrono::seconds ExpiresInSecs(void) const
264 {
265 auto ttNow = nowAsDuration<std::chrono::microseconds>();
266 return duration_cast<std::chrono::seconds>(m_ttExpires - ttNow);
267 }
268
269 // ==================================================================
270
272 {
273 if (m_pDeviceDesc == nullptr)
274 m_pDeviceDesc = UPnpDeviceDesc::Retrieve( m_sLocation );
275
276 return m_pDeviceDesc;
277 }
278
279 // ==================================================================
280
281 QString GetFriendlyName(void)
282 {
283 UPnpDeviceDesc *pDevice = GetDeviceDesc();
284
285 if ( pDevice == nullptr)
286 return "<Unknown>";
287
288 QString sName = pDevice->m_rootDevice.m_sFriendlyName;
289
290 if (sName == "mythtv: MythTV AV Media Server")
291 return sName + " (" + pDevice->m_sHostName + ")";
292
293 return sName;
294 }
295
296 QString GetNameAndDetails(void)
297 {
298 UPnpDeviceDesc *pDevice = GetDeviceDesc();
299
300 if ( pDevice == nullptr)
301 return "<Unknown> (" + m_sLocation + ")";
302
303 return pDevice->m_rootDevice.m_sFriendlyName
304 + " (" + pDevice->m_sHostName + "), "
305 + pDevice->m_rootDevice.m_sUDN;
306 }
307
309 {
310 map["location"] = m_sLocation;
311
312 UPnpDeviceDesc *pDevice = GetDeviceDesc();
313 if (!pDevice)
314 return;
315
316 pDevice->toMap(map);
317 }
318
320 {
321 UPnpDeviceDesc *pDevice = GetDeviceDesc();
322 if (!pDevice)
323 return false;
324
325 return pDevice->m_rootDevice.m_securityPin;
326 }
327
328 QString toString() const
329 {
330 return QString("\nURI:%1\nUSN:%2\nDeviceXML:%3\n"
331 "Expires:%4\nMythTV PIN:%5")
332 .arg(m_sURI, m_sUSN, m_sLocation,
333 QString::number(ExpiresInSecs().count()),
334 m_sSecurityPin);
335 }
336};
337
338#endif // UPNPDEVICE_H
UPnpDeviceDesc * GetDeviceDesc(void)
Definition: upnpdevice.h:271
void GetDeviceDetail(InfoMap &map)
Definition: upnpdevice.h:308
QString GetFriendlyName(void)
Definition: upnpdevice.h:281
~DeviceLocation() override
Definition: upnpdevice.h:225
QString m_sLocation
Definition: upnpdevice.h:239
bool NeedSecurityPin(void)
Definition: upnpdevice.h:319
std::chrono::seconds ExpiresInSecs(void) const
Definition: upnpdevice.h:263
QString toString() const
Definition: upnpdevice.h:328
DeviceLocation(QString sURI, QString sUSN, QString sLocation, std::chrono::microseconds ttExpires)
Definition: upnpdevice.h:247
QString GetNameAndDetails(void)
Definition: upnpdevice.h:296
QString m_sSecurityPin
Definition: upnpdevice.h:241
static int g_nAllocated
Definition: upnpdevice.h:217
QString m_sUSN
Definition: upnpdevice.h:238
QString m_sURI
Definition: upnpdevice.h:237
std::chrono::microseconds m_ttExpires
Definition: upnpdevice.h:240
General purpose reference counter.
UPnpDevice m_rootDevice
Definition: upnpdevice.h:158
static UPnpDeviceDesc * Retrieve(QString &sURL)
Definition: upnpdevice.cpp:631
QString m_sHostName
Definition: upnpdevice.h:159
void toMap(InfoMap &map) const
Definition: upnpdevice.h:202
UPnpDeviceDesc()=default
virtual ~UPnpDeviceDesc()=default
NameValues m_lstExtra
Definition: upnpdevice.h:122
QString m_sModelDescription
Definition: upnpdevice.h:113
QString m_sDeviceType
Definition: upnpdevice.h:109
QString m_sUDN
Definition: upnpdevice.h:120
QString m_sModelName
Definition: upnpdevice.h:114
QString m_sPresentationURL
Definition: upnpdevice.h:119
void toMap(InfoMap &map) const
Definition: upnpdevice.cpp:788
QString m_sModelURL
Definition: upnpdevice.h:116
QString m_sManufacturerURL
Definition: upnpdevice.h:112
UPnpIconList m_listIcons
Definition: upnpdevice.h:128
QString m_sSerialNumber
Definition: upnpdevice.h:117
QString m_sUPC
Definition: upnpdevice.h:118
QString m_sModelNumber
Definition: upnpdevice.h:115
bool m_securityPin
MythTV specific information.
Definition: upnpdevice.h:125
QString m_protocolVersion
Definition: upnpdevice.h:126
UPnpServiceList m_listServices
Definition: upnpdevice.h:129
QString m_sManufacturer
Definition: upnpdevice.h:111
QString m_sFriendlyName
Definition: upnpdevice.h:110
UPnpDeviceList m_listDevices
Definition: upnpdevice.h:130
UPnpIcon()=default
QString toString(uint padding) const
Definition: upnpdevice.h:63
QString m_sMimeType
Definition: upnpdevice.h:56
QString m_sURL
Definition: upnpdevice.h:55
QString toString(uint padding) const
Definition: upnpdevice.h:87
QString m_sServiceType
Definition: upnpdevice.h:79
UPnpService()=default
QString m_sEventSubURL
Definition: upnpdevice.h:83
QString m_sControlURL
Definition: upnpdevice.h:82
QString m_sSCPDURL
Definition: upnpdevice.h:81
QString m_sServiceId
Definition: upnpdevice.h:80
unsigned int uint
Definition: freesurround.h:24
static const QString sLocation
Definition: mythcontext.cpp:71
QHash< QString, QString > InfoMap
Definition: mythtypes.h:15
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
Definition: mythdate.cpp:93
STL namespace.
QList< UPnpService * > UPnpServiceList
Definition: upnpdevice.h:45
QList< UPnpDevice * > UPnpDeviceList
Definition: upnpdevice.h:44
QList< UPnpIcon * > UPnpIconList
Definition: upnpdevice.h:46
#define UPNP_PUBLIC
Definition: upnpexp.h:9