MythTV master
ssdpextension.cpp
Go to the documentation of this file.
1#include "ssdpextension.h"
2
3#include <QString>
4#include <QStringList>
5#include <QTextStream>
6
9
10#include "ssdpcache.h"
11#include "upnp.h"
12#include "upnputil.h"
13
14SSDPExtension::SSDPExtension( int nServicePort , const QString &sSharePath)
15 : HttpServerExtension( "SSDP" , sSharePath),
16 m_nServicePort(nServicePort)
17{
20}
21
23{
24 if (sURI == "getDeviceDesc" ) return( SSDPM_GetDeviceDesc );
25 if (sURI == "getDeviceList" ) return( SSDPM_GetDeviceList );
26
27 return( SSDPM_Unknown );
28}
29
31{
32 // -=>TODO: This is very inefficient... should look into making
33 // it a unique path.
34
35 return QStringList( "/" );
36}
37
39{
40 if (pRequest)
41 {
42 if ( pRequest->m_sBaseUrl != "/")
43 return( false );
44
45 switch( GetMethod( pRequest->m_sMethod ))
46 {
47 case SSDPM_GetDeviceDesc: GetDeviceDesc( pRequest ); return( true );
48 case SSDPM_GetDeviceList: GetDeviceList( pRequest ); return( true );
49
50 default: break;
51 }
52 }
53
54 return( false );
55}
56
58{
60
61 QString sUserAgent = pRequest->GetRequestHeader( "User-Agent", "" );
62
63 LOG(VB_UPNP, LOG_DEBUG, "SSDPExtension::GetDeviceDesc - " +
64 QString( "Host=%1 Port=%2 UserAgent=%3" )
65 .arg(pRequest->GetHostAddress()) .arg(m_nServicePort)
66 .arg(sUserAgent));
67
68 QTextStream stream( &(pRequest->m_response) );
69
72 stream,
73 sUserAgent );
74}
75
76void SSDPExtension::GetFile( HTTPRequest *pRequest, const QString& sFileName )
77{
79
80 pRequest->m_sFileName = m_sUPnpDescPath + sFileName;
81
82 if (QFile::exists( pRequest->m_sFileName ))
83 {
84 LOG(VB_UPNP, LOG_DEBUG,
85 QString("SSDPExtension::GetFile( %1 ) - Exists")
86 .arg(pRequest->m_sFileName));
87
89 pRequest->m_nResponseStatus = 200;
90 pRequest->m_mapRespHeaders[ "Cache-Control" ]
91 = "no-cache=\"Ext\", max-age = 7200"; // 2 hours
92 }
93 else
94 {
95 pRequest->m_nResponseStatus = 404;
96 pRequest->m_response.write( pRequest->GetResponsePage() );
97 LOG(VB_UPNP, LOG_ERR,
98 QString("SSDPExtension::GetFile( %1 ) - Not Found")
99 .arg(pRequest->m_sFileName));
100 }
101
102}
103
105{
106 LOG(VB_UPNP, LOG_DEBUG, "SSDPExtension::GetDeviceList");
107
108 QString sXML;
109 QTextStream os(&sXML, QIODevice::WriteOnly);
110
111 uint nDevCount = 0;
112 uint nEntryCount = 0;
113 SSDPCache::Instance()->OutputXML(os, &nDevCount, &nEntryCount);
114
115 NameValues list;
116 list.push_back(
117 NameValue("DeviceCount", (int)nDevCount));
118 list.push_back(
119 NameValue("DevicesAllocated", SSDPCacheEntries::g_nAllocated));
120 list.push_back(
121 NameValue("CacheEntriesFound", (int)nEntryCount));
122 list.push_back(
123 NameValue("CacheEntriesAllocated", DeviceLocation::g_nAllocated));
124 list.push_back(
125 NameValue("DeviceList", sXML));
126
127 pRequest->FormatActionResponse(list);
128
130 pRequest->m_nResponseStatus = 200;
131}
static int g_nAllocated
Definition: upnpdevice.h:217
QByteArray GetResponsePage(void)
HttpResponseType m_eResponseType
Definition: httprequest.h:150
QString m_sFileName
Definition: httprequest.h:156
long m_nResponseStatus
Definition: httprequest.h:153
virtual QString GetHostAddress()=0
QString m_sMethod
Definition: httprequest.h:130
QString GetRequestHeader(const QString &sKey, const QString &sDefault)
void FormatActionResponse(Serializer *ser)
QStringMap m_mapRespHeaders
Definition: httprequest.h:154
QString m_sBaseUrl
Definition: httprequest.h:128
QBuffer m_response
Definition: httprequest.h:158
QString m_sSharePath
Definition: httpserver.h:74
static int g_nAllocated
Definition: ssdpcache.h:68
QTextStream & OutputXML(QTextStream &os, uint *pnDevCount=nullptr, uint *pnEntryCount=nullptr) const
Outputs the XML for this device.
Definition: ssdpcache.cpp:590
static SSDPCache * Instance()
Definition: ssdpcache.cpp:285
static SSDPMethod GetMethod(const QString &sURI)
QString m_sUPnpDescPath
Definition: ssdpextension.h:16
void GetFile(HTTPRequest *pRequest, const QString &sFileName)
void GetDeviceDesc(HTTPRequest *pRequest) const
static void GetDeviceList(HTTPRequest *pRequest)
SSDPExtension(int nServicePort, const QString &sSharePath)
bool ProcessRequest(HTTPRequest *pRequest) override
QStringList GetBasePaths() override
void GetValidXML(const QString &sBaseAddress, int nPort, QTextStream &os, const QString &sUserAgent="")
Definition: upnpdevice.cpp:333
static UPnpDeviceDesc g_UPnpDeviceDesc
Definition: upnp.h:107
QString GetValue(const QString &setting)
unsigned int uint
Definition: compat.h:68
@ ResponseTypeFile
Definition: httprequest.h:85
@ ResponseTypeHTML
Definition: httprequest.h:80
@ ResponseTypeXML
Definition: httprequest.h:79
@ RequestTypeMSearch
Definition: httprequest.h:58
@ RequestTypeNotify
Definition: httprequest.h:61
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
bool exists(str path)
Definition: xbmcvfs.py:51