MythTV  master
upnpdevice.h
Go to the documentation of this file.
1 // 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"
27 #include "libmythbase/mythchrono.h"
28 #include "libmythbase/mythtypes.h"
30 
31 #include "upnpexp.h"
32 #include "upnputil.h"
33 
34 class UPnpDeviceDesc;
35 class UPnpDevice;
36 class UPnpService;
37 class UPnpIcon;
38 class QTextStream;
39 
41 // Typedefs
43 
44 using UPnpDeviceList = QList< UPnpDevice* >;
45 using UPnpServiceList = QList< UPnpService* >;
46 using 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:
79  QString m_sServiceType;
80  QString m_sServiceId;
81  QString m_sSCPDURL;
82  QString m_sControlURL;
83  QString m_sEventSubURL;
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 
109  QString m_sDeviceType;
114  QString m_sModelName;
115  QString m_sModelNumber;
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;
160  QUrl m_hostUrl;
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 
225  ~DeviceLocation() override
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 
319  bool NeedSecurityPin(void)
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
UPnpDevice::m_sModelURL
QString m_sModelURL
Definition: upnpdevice.h:116
NameValue
Definition: upnputil.h:36
DeviceLocation::g_nAllocated
static int g_nAllocated
Definition: upnpdevice.h:217
UPnpDevice::m_sManufacturer
QString m_sManufacturer
Definition: upnpdevice.h:111
MythDate::toString
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
Definition: mythdate.cpp:93
UPnpDevice::m_listIcons
UPnpIconList m_listIcons
Definition: upnpdevice.h:128
UPnpDeviceDesc::Retrieve
static UPnpDeviceDesc * Retrieve(QString &sURL)
Definition: upnpdevice.cpp:631
UPnpIcon::m_sMimeType
QString m_sMimeType
Definition: upnpdevice.h:56
UPnpDevice::m_listServices
UPnpServiceList m_listServices
Definition: upnpdevice.h:129
UPnpDevice::m_sUPC
QString m_sUPC
Definition: upnpdevice.h:118
DeviceLocation::DeviceLocation
DeviceLocation(QString sURI, QString sUSN, QString sLocation, std::chrono::microseconds ttExpires)
Definition: upnpdevice.h:247
DeviceLocation::m_sURI
QString m_sURI
Definition: upnpdevice.h:237
UPnpDeviceDesc
Definition: upnpdevice.h:154
UPnpIcon::m_sURL
QString m_sURL
Definition: upnpdevice.h:55
DeviceLocation::GetFriendlyName
QString GetFriendlyName(void)
Definition: upnpdevice.h:281
UPnpDevice::m_sDeviceType
QString m_sDeviceType
Definition: upnpdevice.h:109
UPnpIconList
QList< UPnpIcon * > UPnpIconList
Definition: upnpdevice.h:46
UPnpService::m_sEventSubURL
QString m_sEventSubURL
Definition: upnpdevice.h:83
UPnpServiceList
QList< UPnpService * > UPnpServiceList
Definition: upnpdevice.h:45
DeviceLocation::GetDeviceDesc
UPnpDeviceDesc * GetDeviceDesc(void)
Definition: upnpdevice.h:271
DeviceLocation
Definition: upnpdevice.h:213
UPnpDevice::m_sUDN
QString m_sUDN
Definition: upnpdevice.h:120
DeviceLocation::~DeviceLocation
~DeviceLocation() override
Definition: upnpdevice.h:225
InfoMap
QHash< QString, QString > InfoMap
Definition: mythtypes.h:15
DeviceLocation::NeedSecurityPin
bool NeedSecurityPin(void)
Definition: upnpdevice.h:319
DeviceLocation::m_sSecurityPin
QString m_sSecurityPin
Definition: upnpdevice.h:241
NameValues
Definition: upnputil.h:73
UPnpDeviceDesc::m_rootDevice
UPnpDevice m_rootDevice
Definition: upnpdevice.h:158
UPnpIcon::toString
QString toString(uint padding) const
Definition: upnpdevice.h:63
UPnpService::m_sServiceType
QString m_sServiceType
Definition: upnpdevice.h:79
UPnpDevice::toMap
void toMap(InfoMap &map) const
Definition: upnpdevice.cpp:788
UPnpDeviceDesc::toMap
void toMap(InfoMap &map) const
Definition: upnpdevice.h:202
UPnpDevice::m_sModelName
QString m_sModelName
Definition: upnpdevice.h:114
DeviceLocation::m_ttExpires
std::chrono::microseconds m_ttExpires
Definition: upnpdevice.h:240
DeviceLocation::m_sUSN
QString m_sUSN
Definition: upnpdevice.h:238
UPnpDevice::m_securityPin
bool m_securityPin
MythTV specific information.
Definition: upnpdevice.h:125
UPnpDeviceDesc::m_sHostName
QString m_sHostName
Definition: upnpdevice.h:159
UPnpDevice::m_sModelNumber
QString m_sModelNumber
Definition: upnpdevice.h:115
UPnpDevice::m_lstExtra
NameValues m_lstExtra
Definition: upnpdevice.h:122
UPnpIcon
Definition: upnpdevice.h:52
UPnpService::toString
QString toString(uint padding) const
Definition: upnpdevice.h:87
compat.h
UPnpDevice::m_sSerialNumber
QString m_sSerialNumber
Definition: upnpdevice.h:117
UPnpDevice::m_listDevices
UPnpDeviceList m_listDevices
Definition: upnpdevice.h:130
DeviceLocation::m_sLocation
QString m_sLocation
Definition: upnpdevice.h:239
mythtypes.h
UPnpDevice
Definition: upnpdevice.h:105
UPnpDevice::m_sFriendlyName
QString m_sFriendlyName
Definition: upnpdevice.h:110
UPnpDeviceDesc::m_hostUrl
QUrl m_hostUrl
Definition: upnpdevice.h:160
sLocation
static const QString sLocation
Definition: mythcontext.cpp:71
DeviceLocation::ExpiresInSecs
std::chrono::seconds ExpiresInSecs(void) const
Definition: upnpdevice.h:263
UPnpDeviceList
QList< UPnpDevice * > UPnpDeviceList
Definition: upnpdevice.h:44
UPnpService::m_sControlURL
QString m_sControlURL
Definition: upnpdevice.h:82
referencecounter.h
UPnpService::m_sServiceId
QString m_sServiceId
Definition: upnpdevice.h:80
UPnpService
Definition: upnpdevice.h:76
UPnpDevice::m_sModelDescription
QString m_sModelDescription
Definition: upnpdevice.h:113
mythchrono.h
UPNP_PUBLIC
#define UPNP_PUBLIC
Definition: upnpexp.h:9
UPnpDevice::m_sManufacturerURL
QString m_sManufacturerURL
Definition: upnpdevice.h:112
UPnpDevice::m_protocolVersion
QString m_protocolVersion
Definition: upnpdevice.h:126
UPnpDevice::m_sPresentationURL
QString m_sPresentationURL
Definition: upnpdevice.h:119
DeviceLocation::GetNameAndDetails
QString GetNameAndDetails(void)
Definition: upnpdevice.h:296
upnputil.h
DeviceLocation::toString
QString toString() const
Definition: upnpdevice.h:328
UPnpService::m_sSCPDURL
QString m_sSCPDURL
Definition: upnpdevice.h:81
ReferenceCounter
General purpose reference counter.
Definition: referencecounter.h:26
uint
unsigned int uint
Definition: freesurround.h:24
upnpexp.h
DeviceLocation::GetDeviceDetail
void GetDeviceDetail(InfoMap &map)
Definition: upnpdevice.h:308