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 "upnp.h"
18
20//
22
24 const QString &sSharePath,
25 const QString &sSourceProtocols,
26 const QString &sSinkProtocols )
27 : Eventing( "UPnpCMGR", "CMGR_Event", sSharePath)
28 , m_sControlUrl("/CMGR_Control")
29{
30 AddVariable( new StateVariable< QString >( "SourceProtocolInfo" , true ) );
31 AddVariable( new StateVariable< QString >( "SinkProtocolInfo" , true ) );
32 AddVariable( new StateVariable< QString >( "CurrentConnectionIDs", true ) );
33 AddVariable( new StateVariable< QString >( "FeatureList" , true ) );
34
35 SetValue< QString >( "CurrentConnectionIDs", "0" );
36 SetValue< QString >( "SourceProtocolInfo" , sSourceProtocols );
37 SetValue< QString >( "SinkProtocolInfo" , sSinkProtocols );
38 SetValue< QString >( "FeatureList" , "" );
39
40 QString sUPnpDescPath = XmlConfiguration().GetValue( "UPnP/DescXmlPath", m_sSharePath);
41 m_sServiceDescFileName = sUPnpDescPath + "CMGR_scpd.xml";
42
43 // Add our Service Definition to the device.
44
45 RegisterService( pDevice );
46
47 // ConnectionManager uses a different schema definition for the FeatureList
48 // to the ContentDirectoryService
50 "urn:schemas-upnp-org:av:cm-featureList" ));
52 "http://www.w3.org/2001/XMLSchema-instance" ));
53 m_features.AddAttribute(NameValue( "xsi:schemaLocation",
54 "urn:schemas-upnp-org:av:cm-featureList "
55 "http://www.upnp.org/schemas/av/cm-featureList.xsd" ));
56}
57
59//
61
62void UPnpCMGR::AddSourceProtocol( const QString &sProtocol )
63{
64 auto sValue = GetValue< QString >( "SourceProtocolInfo" );
65
66 if (sValue.length() > 0 )
67 sValue += ',';
68
69 sValue += sProtocol;
70
71 SetValue< QString >( "SourceProtocolInfo", sValue );
72}
73
75//
77
78void UPnpCMGR::AddSinkProtocol( const QString &sProtocol )
79{
80 auto sValue = GetValue< QString >( "SinkProtocolInfo" );
81
82 if (sValue.length() > 0 )
83 sValue += ',';
84
85 sValue += sProtocol;
86
87 SetValue< QString >( "SinkProtocolInfo", sValue );
88}
89
90
92//
94
95UPnpCMGRMethod UPnpCMGR::GetMethod( const QString &sURI )
96{
97 if (sURI == "GetServDesc" ) return CMGRM_GetServiceDescription ;
98 if (sURI == "GetProtocolInfo" ) return CMGRM_GetProtocolInfo ;
99 if (sURI == "GetCurrentConnectionInfo" ) return CMGRM_GetCurrentConnectionInfo;
100 if (sURI == "GetCurrentConnectionIDs" ) return CMGRM_GetCurrentConnectionIDs ;
101 if (sURI == "GetFeatureList" ) return CMGRM_GetFeatureList ;
102
103 return CMGRM_Unknown;
104}
105
107//
109
111{
113}
114
116//
118
120{
121 if (pRequest)
122 {
123 if (Eventing::ProcessRequest( pRequest ))
124 return true;
125
126 if ( pRequest->m_sBaseUrl != m_sControlUrl )
127 {
128#if 0
129 LOG(VB_UPNP, LOG_DEBUG,
130 QString("UPnpCMGR::ProcessRequest - BaseUrl (%1) not ours...")
131 .arg(pRequest->m_sBaseUrl));
132#endif
133 return false;
134 }
135
136 LOG(VB_UPNP, LOG_INFO,
137 QString("UPnpCMGR::ProcessRequest - Method (%1)")
138 .arg(pRequest->m_sMethod));
139
140 switch( GetMethod( pRequest->m_sMethod ) )
141 {
144 break;
146 HandleGetProtocolInfo( pRequest );
147 break;
150 break;
153 break;
155 HandleGetFeatureList( pRequest );
156 break;
157 default:
159 break;
160 }
161 return true;
162 }
163
164 return false;
165}
166
168//
170
172{
173 NameValues list;
174
175 list.push_back(
176 NameValue("Source", GetValue<QString>("SourceProtocolInfo")));
177 list.push_back(
178 NameValue("Sink", GetValue<QString>("SinkProtocolInfo")));
179
180 pRequest->FormatActionResponse(list);
181}
182
184//
186
188{
189 unsigned short nId = pRequest->m_mapParams[ "ConnectionID" ].toUShort();
190
191 if ( nId != 0)
192 {
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:147
QStringList GetBasePaths() override
Definition: eventing.cpp:135
QString m_sMethod
Definition: httprequest.h:130
void FormatFileResponse(const QString &sFileName)
void FormatActionResponse(Serializer *ser)
QString m_sBaseUrl
Definition: httprequest.h:128
QStringMap m_mapParams
Definition: httprequest.h:132
QString m_sSharePath
Definition: httpserver.h:74
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:187
void AddSinkProtocol(const QString &sProtocol)
Definition: upnpcmgr.cpp:78
QString m_sControlUrl
Definition: upnpcmgr.h:53
void HandleGetCurrentConnectionIDs(HTTPRequest *pRequest)
Definition: upnpcmgr.cpp:215
void AddSourceProtocol(const QString &sProtocol)
Definition: upnpcmgr.cpp:62
void HandleGetProtocolInfo(HTTPRequest *pRequest)
Definition: upnpcmgr.cpp:171
void HandleGetFeatureList(HTTPRequest *pRequest)
Definition: upnpcmgr.cpp:225
bool ProcessRequest(HTTPRequest *pRequest) override
Definition: upnpcmgr.cpp:119
UPnpCMGR(UPnpDevice *pDevice, const QString &sSharePath, const QString &sSourceProtocols="", const QString &sSinkProtocols="")
Definition: upnpcmgr.cpp:23
UPnPFeatureList m_features
Definition: upnpcmgr.h:55
static UPnpCMGRMethod GetMethod(const QString &sURI)
Definition: upnpcmgr.cpp:95
QStringList GetBasePaths() override
Definition: upnpcmgr.cpp:110
void RegisterService(UPnpDevice *device)
Creates a UPnpService and adds it to the UPnpDevice's list of services.
static void FormatErrorResponse(HTTPRequest *pRequest, UPnPResultCode eCode, const QString &sMsg="")
Definition: upnp.cpp:242
QString GetValue(const QString &setting)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
@ UPnPResult_CMGR_InvalidConnectionRef
Definition: upnp.h:79
@ UPnPResult_InvalidAction
Definition: upnp.h:37
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