MythTV master
upnpcmgr.cpp
Go to the documentation of this file.
1
2// Program Name: UPnpCMGR.cpp
3// Created : Dec. 28, 2006
4//
5// Purpose : uPnp Connection Manager Service
6//
7// Copyright (c) 2006 David Blain <dblain@mythtv.org>
8//
9// Licensed under the GPL v2 or later, see LICENSE for details
10//
12#include "upnpcmgr.h"
13
16
17#include "httprequest.h"
18#include "upnpresultcode.h"
19
21//
23
25 const QString &sSharePath,
26 const QString &sSourceProtocols,
27 const QString &sSinkProtocols )
28 : Eventing( "UPnpCMGR", "CMGR_Event", sSharePath)
29 , m_sControlUrl("/CMGR_Control")
30{
31 AddVariable( new StateVariable< QString >( "SourceProtocolInfo" , true ) );
32 AddVariable( new StateVariable< QString >( "SinkProtocolInfo" , true ) );
33 AddVariable( new StateVariable< QString >( "CurrentConnectionIDs", true ) );
34 AddVariable( new StateVariable< QString >( "FeatureList" , true ) );
35
36 SetValue< QString >( "CurrentConnectionIDs", "0" );
37 SetValue< QString >( "SourceProtocolInfo" , sSourceProtocols );
38 SetValue< QString >( "SinkProtocolInfo" , sSinkProtocols );
39 SetValue< QString >( "FeatureList" , "" );
40
41 QString sUPnpDescPath = XmlConfiguration().GetValue( "UPnP/DescXmlPath", m_sSharePath);
42 m_sServiceDescFileName = sUPnpDescPath + "CMGR_scpd.xml";
43
44 // Add our Service Definition to the device.
45
46 RegisterService( pDevice );
47
48 // ConnectionManager uses a different schema definition for the FeatureList
49 // to the ContentDirectoryService
51 "urn:schemas-upnp-org:av:cm-featureList" ));
53 "http://www.w3.org/2001/XMLSchema-instance" ));
54 m_features.AddAttribute(NameValue( "xsi:schemaLocation",
55 "urn:schemas-upnp-org:av:cm-featureList "
56 "http://www.upnp.org/schemas/av/cm-featureList.xsd" ));
57}
58
60//
62
63void UPnpCMGR::AddSourceProtocol( const QString &sProtocol )
64{
65 auto sValue = GetValue< QString >( "SourceProtocolInfo" );
66
67 if (sValue.length() > 0 )
68 sValue += ',';
69
70 sValue += sProtocol;
71
72 SetValue< QString >( "SourceProtocolInfo", sValue );
73}
74
76//
78
79void UPnpCMGR::AddSinkProtocol( const QString &sProtocol )
80{
81 auto sValue = GetValue< QString >( "SinkProtocolInfo" );
82
83 if (sValue.length() > 0 )
84 sValue += ',';
85
86 sValue += sProtocol;
87
88 SetValue< QString >( "SinkProtocolInfo", sValue );
89}
90
91
93//
95
96UPnpCMGRMethod UPnpCMGR::GetMethod( const QString &sURI )
97{
98 if (sURI == "GetServDesc" ) return CMGRM_GetServiceDescription ;
99 if (sURI == "GetProtocolInfo" ) return CMGRM_GetProtocolInfo ;
100 if (sURI == "GetCurrentConnectionInfo" ) return CMGRM_GetCurrentConnectionInfo;
101 if (sURI == "GetCurrentConnectionIDs" ) return CMGRM_GetCurrentConnectionIDs ;
102 if (sURI == "GetFeatureList" ) return CMGRM_GetFeatureList ;
103
104 return CMGRM_Unknown;
105}
106
108//
110
112{
114}
115
117//
119
121{
122 if (pRequest)
123 {
124 if (Eventing::ProcessRequest( pRequest ))
125 return true;
126
127 if ( pRequest->m_sBaseUrl != m_sControlUrl )
128 {
129#if 0
130 LOG(VB_UPNP, LOG_DEBUG,
131 QString("UPnpCMGR::ProcessRequest - BaseUrl (%1) not ours...")
132 .arg(pRequest->m_sBaseUrl));
133#endif
134 return false;
135 }
136
137 LOG(VB_UPNP, LOG_INFO,
138 QString("UPnpCMGR::ProcessRequest - Method (%1)")
139 .arg(pRequest->m_sMethod));
140
141 switch( GetMethod( pRequest->m_sMethod ) )
142 {
145 break;
147 HandleGetProtocolInfo( pRequest );
148 break;
151 break;
154 break;
156 HandleGetFeatureList( pRequest );
157 break;
158 default:
160 break;
161 }
162 return true;
163 }
164
165 return false;
166}
167
169//
171
173{
174 NameValues list;
175
176 list.push_back(
177 NameValue("Source", GetValue<QString>("SourceProtocolInfo")));
178 list.push_back(
179 NameValue("Sink", GetValue<QString>("SinkProtocolInfo")));
180
181 pRequest->FormatActionResponse(list);
182}
183
185//
187
189{
190 unsigned short nId = pRequest->m_mapParams[ "ConnectionID" ].toUShort();
191
192 if ( nId != 0)
193 {
195 return;
196 }
197
198 NameValues list;
199
200 list.push_back(NameValue( "RcsID" , "-1" , true));
201 list.push_back(NameValue( "AVTransportID" , "-1" , true));
202 list.push_back(NameValue( "ProtocolInfo" , "http-get:*:*:*" , true));
203 list.push_back(NameValue( "PeerConnectionManager", "/" , true));
204 list.push_back(NameValue( "PeerConnectionID" , "-1" , true));
205 list.push_back(NameValue( "Direction" , "Output" , true));
206 list.push_back(NameValue( "Status" , "Unknown" , true));
207
208 pRequest->FormatActionResponse(list);
209}
210
212//
214
216{
217 NameValues list;
218
219 list.push_back(
220 NameValue("ConnectionIDs", GetValue<QString>("CurrentConnectionIDs")));
221
222 pRequest->FormatActionResponse(list);
223}
224
226{
227 NameValues list;
228
229 QString sResults = m_features.toXML();
230
231 list.push_back(NameValue("FeatureList", sResults));
232
233 pRequest->FormatActionResponse(list);
234}
bool ProcessRequest(HTTPRequest *pRequest) override
Definition: eventing.cpp:148
QStringList GetBasePaths() override
Definition: eventing.cpp:136
void FormatErrorResponse(bool bServerError, const QString &sFaultString, const QString &sDetails)
QString m_sMethod
Definition: httprequest.h:131
void FormatFileResponse(const QString &sFileName)
void FormatActionResponse(Serializer *ser)
QString m_sBaseUrl
Definition: httprequest.h:129
QStringMap m_mapParams
Definition: httprequest.h:133
QString m_sSharePath
Definition: httpserver.h:78
void AddVariable(StateVariableBase *pBase)
Definition: eventing.h:186
void AddAttribute(const NameValue &attribute)
QString m_sServiceDescFileName
Definition: upnpcmgr.h:52
static void HandleGetCurrentConnectionInfo(HTTPRequest *pRequest)
Definition: upnpcmgr.cpp:188
void AddSinkProtocol(const QString &sProtocol)
Definition: upnpcmgr.cpp:79
QString m_sControlUrl
Definition: upnpcmgr.h:53
void HandleGetCurrentConnectionIDs(HTTPRequest *pRequest)
Definition: upnpcmgr.cpp:215
void AddSourceProtocol(const QString &sProtocol)
Definition: upnpcmgr.cpp:63
void HandleGetProtocolInfo(HTTPRequest *pRequest)
Definition: upnpcmgr.cpp:172
void HandleGetFeatureList(HTTPRequest *pRequest)
Definition: upnpcmgr.cpp:225
bool ProcessRequest(HTTPRequest *pRequest) override
Definition: upnpcmgr.cpp:120
UPnpCMGR(UPnpDevice *pDevice, const QString &sSharePath, const QString &sSourceProtocols="", const QString &sSinkProtocols="")
Definition: upnpcmgr.cpp:24
UPnPFeatureList m_features
Definition: upnpcmgr.h:55
static UPnpCMGRMethod GetMethod(const QString &sURI)
Definition: upnpcmgr.cpp:96
QStringList GetBasePaths() override
Definition: upnpcmgr.cpp:111
void RegisterService(UPnpDevice *device)
Creates a UPnpService and adds it to the UPnpDevice's list of services.
QString GetValue(const QString &setting)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
UPnpCMGRMethod
Definition: upnpcmgr.h:20
@ CMGRM_GetServiceDescription
Definition: upnpcmgr.h:22
@ CMGRM_GetFeatureList
Definition: upnpcmgr.h:26
@ CMGRM_GetCurrentConnectionIDs
Definition: upnpcmgr.h:25
@ CMGRM_GetProtocolInfo
Definition: upnpcmgr.h:23
@ CMGRM_GetCurrentConnectionInfo
Definition: upnpcmgr.h:24
@ CMGRM_Unknown
Definition: upnpcmgr.h:21
@ UPnPResult_CMGR_InvalidConnectionRef
@ UPnPResult_InvalidAction