summaryrefslogtreecommitdiff
path: root/server/mediaReceiverRegistrar.cpp
blob: 4326bdd0c68f542875ed5184223272dd9b01235a (plain)
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