Parent: [6e6611] (diff)

Download this file

description.hxx    162 lines (145 with data), 5.0 kB

  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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/* Copyright (C) 2013 J.F.Dockes
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _UPNPDEV_HXX_INCLUDED_
#define _UPNPDEV_HXX_INCLUDED_
/**
* UPnP Description phase: interpreting the device description which we
* downloaded from the URL obtained by the discovery phase.
*/
#include <vector>
#include <unordered_map>
#include <string>
#include <sstream>
namespace UPnPClient {
/**
* Data holder for a UPnP service, parsed from the XML description
* downloaded after discovery yielded its URL.
*/
class UPnPServiceDesc {
public:
// e.g. urn:schemas-upnp-org:service:ConnectionManager:1
std::string serviceType;
// Unique Id inside device: e.g here THE ConnectionManager
std::string serviceId; // e.g. urn:upnp-org:serviceId:ConnectionManager
std::string SCPDURL; // Service description URL. e.g.: cm.xml
std::string controlURL; // e.g.: /upnp/control/cm
std::string eventSubURL; // e.g.: /upnp/event/cm
void clear()
{
serviceType.clear();
serviceId.clear();
SCPDURL.clear();
controlURL.clear();
eventSubURL.clear();
}
std::string dump() const
{
std::ostringstream os;
os << "SERVICE {serviceType [" << serviceType <<
"] serviceId [" << serviceId <<
"] SCPDURL [" << SCPDURL <<
"] controlURL [" << controlURL <<
"] eventSubURL [" << eventSubURL <<
"] }" << std::endl;
return os.str();
}
struct Argument {
std::string name;
bool todevice;
std::string relatedVariable;
void clear() {
name.clear();
todevice = true;
relatedVariable.clear();
}
};
struct Action {
std::string name;
std::vector<Argument> argList;
void clear() {
name.clear();
argList.clear();
}
};
struct StateVariable {
std::string name;
bool sendEvents;
std::string dataType;
bool hasValueRange;
int minimum;
int maximum;
int step;
void clear() {
name.clear();
sendEvents = false;
dataType.clear();
hasValueRange = false;
}
};
struct Parsed {
std::unordered_map<std::string, Action> actionList;
std::unordered_map<std::string, StateVariable> stateTable;
};
bool fetchAndParseDesc(const std::string&, Parsed& parsed) const;
};
/**
* Data holder for a UPnP device, parsed from the XML description obtained
* during discovery.
* A device may include several services. To be of interest to us,
* one of them must be a ContentDirectory.
*/
class UPnPDeviceDesc {
public:
/** Build device from xml description downloaded from discovery
* @param url where the description came from
* @param description the xml device description
*/
UPnPDeviceDesc(const std::string& url, const std::string& description);
UPnPDeviceDesc() : ok(false) {}
bool ok;
// e.g. urn:schemas-upnp-org:device:MediaServer:1
std::string deviceType;
// e.g. MediaTomb
std::string friendlyName;
// Unique device number. This should match the deviceID in the
// discovery message. e.g. uuid:a7bdcd12-e6c1-4c7e-b588-3bbc959eda8d
std::string UDN;
// Base for all relative URLs. e.g. http://192.168.4.4:49152/
std::string URLBase;
// Manufacturer: e.g. D-Link, PacketVideo ("manufacturer")
std::string manufacturer;
// Model name: e.g. MediaTomb, DNS-327L ("modelName")
std::string modelName;
// Services provided by this device.
std::vector<UPnPServiceDesc> services;
std::string dump() const
{
std::ostringstream os;
os << "DEVICE " << " {deviceType [" << deviceType <<
"] friendlyName [" << friendlyName <<
"] UDN [" << UDN <<
"] URLBase [" << URLBase << "] Services:" << std::endl;
for (auto it = services.begin(); it != services.end(); it++) {
os << " " << it->dump();
}
os << "}" << std::endl;
return os.str();
}
};
typedef std::vector<UPnPServiceDesc>::iterator DevServIt;
} // namespace
#endif /* _UPNPDEV_HXX_INCLUDED_ */