Parent: [c2b48d] (diff)

Download this file

description.hxx    207 lines (185 with data), 7.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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/* Copyright (C) 2006-2016 J.F.Dockes
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
#ifndef _UPNPDEV_HXX_INCLUDED_
#define _UPNPDEV_HXX_INCLUDED_
#include "libupnpp/config.h"
/**
* UPnP Description phase: interpreting the device description which we
* downloaded from the URL obtained by the discovery phase.
*/
#include <unordered_map>
#include <vector>
#include <string>
#include <sstream>
namespace UPnPClient {
/** Data holder for a UPnP service, parsed from the device XML description.
* The discovery code does not download the service description
* documents, and the only set values after discovery are those available from
* the device description (serviceId, SCPDURL, controlURL, eventSubURL).
* You can call fetchAndParseDesc() to obtain a parsed version of the
* service description document, with all the actions and state
* variables. This is mostly useful if you need to retrieve some min/max values
* for the state variable, in case there is no action defined to
* retrieve them (e.g. min/max volume values for AVT RenderingControl).
* Also, if you wanted to define dynamic methods from the description data.
*/
class UPnPServiceDesc {
public:
/// Service Type e.g. urn:schemas-upnp-org:service:ConnectionManager:1
std::string serviceType;
/// Service Id inside device: e.g. urn:upnp-org:serviceId:ConnectionManager
std::string serviceId;
/// Service description URL.
std::string SCPDURL;
/// Service control URL.
std::string controlURL;
/// Service event URL.
std::string eventSubURL;
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();
}
/** Description of an action argument: name, direction, state
variable it relates to (which will yield the type) */
struct Argument {
std::string name;
bool todevice;
std::string relatedVariable;
void clear() {
name.clear();
todevice = true;
relatedVariable.clear();
}
};
/** UPnP service action descriptor, from the service description document*/
struct Action {
std::string name;
std::vector<Argument> argList;
void clear() {
name.clear();
argList.clear();
}
};
/** Holder for all the attributes of an UPnP service state variable */
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;
}
};
/** Service description as parsed from the service XML document: actions
* and state variables */
struct Parsed {
std::unordered_map<std::string, Action> actionList;
std::unordered_map<std::string, StateVariable> stateTable;
};
/** Fetch the service description document and parse it.
* @param urlbase The URL base is found in the device description
* @param[out] parsed The resulting parsed Action and Variable lists.
* @param[out] XMLText The raw downloaded XML text.
*/
bool fetchAndParseDesc(const std::string& urlbase, Parsed& parsed,
std::string *XMLText = 0) const;
};
/**
* Data holder for a UPnP device, parsed from the XML description obtained
* during discovery. The object is built by the discovery code.
* User-level code gets access to the data by using the device directory
* traversal methods.
*/
class UPnPDeviceDesc {
public:
/** Build device from the XML description downloaded during discovery.
* This is an internal library call, used from the discovery module.
* The user code gets access to an initialized Device Description
* object through the device directory traversal methods.
* @param url where the description came from
* @param description the xml device description
*/
UPnPDeviceDesc(const std::string& url, const std::string& description);
UPnPDeviceDesc() {}
/// Parse success status.
bool ok{false};
/// Device Type: e.g. urn:schemas-upnp-org:device:MediaServer:1
std::string deviceType;
/// User-configurable name (usually), e.g. Lounge-streamer
std::string friendlyName;
/// Unique Device Number. This is the same as 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
std::string manufacturer;
/// Model name: e.g. MediaTomb, DNS-327L
std::string modelName;
/// Raw downloaded document.
std::string XMLText;
/// Services provided by this device.
std::vector<UPnPServiceDesc> services;
/// Embedded devices. We use UPnPDeviceDesc for convenience, but
/// they can't recursively have embedded devices (and they just get
/// a copy of the root URLBase).
std::vector<UPnPDeviceDesc> embedded;
void clear() {
*this = UPnPDeviceDesc();
}
std::string dump() const
{
std::ostringstream os;
os << "DEVICE " << " {deviceType [" << deviceType <<
"] friendlyName [" << friendlyName <<
"] UDN [" << UDN <<
"] URLBase [" << URLBase << "] Services:" << std::endl;
for (std::vector<UPnPServiceDesc>::const_iterator it = services.begin();
it != services.end(); it++) {
os << " " << it->dump();
}
for (const auto& it: embedded) {
os << it.dump();
}
os << "}" << std::endl;
return os.str();
}
};
} // namespace
#endif /* _UPNPDEV_HXX_INCLUDED_ */