1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
/*
* mediaReceiverRegistrar.cpp
*
* Created on: 28.04.2013
* Author: savop
*/
#include "../include/server.h"
#include "../include/mediaReceiverRegistrar.h"
#include <sstream>
#include <time.h>
namespace upnp {
#define X_MS_MRR_ACTION_ISAUTHORIZED "IsAuthorized"
#define X_MS_MRR_ACTION_ISVALIDATED "IsValidated"
#define X_MS_MRR_ACTION_REGISTERDEVICE "RegisterDevice"
cMediaReceiverRegistrar::cMediaReceiverRegistrar()
: cUPnPService(
cUPnPService::Description(
"urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1",
"urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar",
"x_mrr_scpd.xml",
"x_mrr_control",
"x_mrr_event"
)),
authorizationGrantedUpdateID((uint32_t)time(NULL)),
authorizationDeniedUpdateID((uint32_t)time(NULL))
{
}
cMediaReceiverRegistrar::~cMediaReceiverRegistrar(){
}
int cMediaReceiverRegistrar::Subscribe(Upnp_Subscription_Request* request){
IXML_Document* PropertySet = NULL;
/* UpdateID for granted authorizations */
UpnpAddToPropertySet(&PropertySet, "AuthorizationGrantedUpdateID", tools::ToString(authorizationGrantedUpdateID).c_str());
/* UpdateID for denied authorizations */
UpnpAddToPropertySet(&PropertySet, "AuthorizationDeniedUpdateID", tools::ToString(authorizationDeniedUpdateID).c_str());
// Accept subscription
int ret = UpnpAcceptSubscriptionExt(this->mDeviceHandle, request->UDN, request->ServiceId, PropertySet, request->Sid);
if(ret != UPNP_E_SUCCESS){
esyslog("UPnP\tSubscription failed (Error code: %d)", ret);
}
ixmlDocument_free(PropertySet);
return ret;
}
int cMediaReceiverRegistrar::Execute(Upnp_Action_Request* request){
if (request == NULL) {
esyslog("UPnP\tCMS Action Handler - request is null");
return UPNP_E_BAD_REQUEST;
}
if(!strcmp(request->ActionName, X_MS_MRR_ACTION_ISAUTHORIZED))
return this->IsAuthorized(request);
if(!strcmp(request->ActionName, X_MS_MRR_ACTION_ISVALIDATED))
return this->IsValidated(request);
if(!strcmp(request->ActionName, X_MS_MRR_ACTION_REGISTERDEVICE))
return this->RegisterDevice(request);
return UPNP_E_BAD_REQUEST;
}
int cMediaReceiverRegistrar::UpdateDeniedUpdateID(){
authorizationDeniedUpdateID = (uint32_t)time(NULL);
return TriggerNotificationForUpdateIDs();
}
int cMediaReceiverRegistrar::UpdateGrantedUpdateID(){
authorizationGrantedUpdateID = (uint32_t)time(NULL);
return TriggerNotificationForUpdateIDs();
}
int cMediaReceiverRegistrar::TriggerNotificationForUpdateIDs(){
IXML_Document* PropertySet = NULL;
/* UpdateID for granted authorizations */
UpnpAddToPropertySet(&PropertySet, "AuthorizationGrantedUpdateID", tools::ToString(authorizationGrantedUpdateID).c_str());
/* UpdateID for denied authorizations */
UpnpAddToPropertySet(&PropertySet, "AuthorizationDeniedUpdateID", tools::ToString(authorizationDeniedUpdateID).c_str());
// Trigger notification
int ret = UpnpNotifyExt(this->mDeviceHandle, this->mMediaServer->GetDeviceUUID().c_str(),
this->mServiceDescription.serviceID.c_str(), PropertySet);
if(ret != UPNP_E_SUCCESS){
esyslog("UPnP\tNotification failed (Error code: %d)", ret);
}
ixmlDocument_free(PropertySet);
return ret;
}
int cMediaReceiverRegistrar::IsAuthorized(Upnp_Action_Request* request){
std::stringstream ss;
ss << "<u:" << request->ActionName << "Response xmlns:u=\"" << GetServiceDescription().serviceType << "\">"
<< " <Result>" << 1 << "</Result>"
<< "</u:" << request->ActionName << "Response>";
request->ActionResult = ixmlParseBuffer(ss.str().c_str());
request->ErrCode = UPNP_E_SUCCESS;
return request->ErrCode;
}
int cMediaReceiverRegistrar::RegisterDevice(Upnp_Action_Request* request){
SetError(request, UPNP_SOAP_E_ACTION_NOT_IMPLEMENTED);
return request->ErrCode;
}
int cMediaReceiverRegistrar::IsValidated(Upnp_Action_Request* request){
SetError(request, UPNP_SOAP_E_ACTION_NOT_IMPLEMENTED);
return request->ErrCode;
}
} // namespace upnp
|