Libraries/UPnP/src/include/Network/UPnP/Device.h
Go to the documentation of this file.
1 /****
2  * Device.h
3  *
4  * Copyright 2019 mikee47 <mike@sillyhouse.net>
5  *
6  * This file is part of the Sming UPnP Library
7  *
8  * This library is free software: you can redistribute it and/or modify it under the terms of the
9  * GNU General Public License as published by the Free Software Foundation, version 3 or later.
10  *
11  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  * See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along with this library.
16  * If not, see <https://www.gnu.org/licenses/>.
17  *
18  ****/
19 
20 #pragma once
21 
22 #include "Service.h"
23 
24 #define UPNP_DEVICE_FIELD_MAP(XX) \
25  XX(deviceType, required) \
26  XX(friendlyName, required) \
27  XX(manufacturer, required) \
28  XX(manufacturerURL, allowed) \
29  XX(modelDescription, recommended) \
30  XX(modelName, required) \
31  XX(modelNumber, recommended) \
32  XX(modelURL, allowed) \
33  XX(serialNumber, recommended) \
34  XX(UDN, required) \
35  XX(presentationURL, recommended) \
36  XX(domain, custom) \
37  XX(type, custom_required) \
38  XX(version, custom) \
39  XX(serverId, custom) \
40  XX(productNameAndVersion, custom) \
41  XX(URLBase, deprecated) \
42  XX(descriptionURL, custom)
43 
44 namespace UPnP
45 {
46 struct SpecVersion {
47  uint8_t major;
48  uint8_t minor;
49 };
50 
51 class Device;
52 class Request;
53 
57 class Device : public ObjectTemplate<Device, Object>
58 {
59 public:
60  enum class Field {
61 #define XX(name, req) name,
63 #undef XX
64  customStart = domain,
65  MAX
66  };
67 
70 
71  Device(Device& parent) : parent_(parent)
72  {
73  }
74 
75  Device(Device* parent = nullptr) : parent_(*(parent ?: this))
76  {
77  }
78 
79  String caption() const
80  {
81  String s;
82  s += friendlyName();
83  s += " {";
84  s += getField(Field::UDN);
85  s += '}';
86  return s;
87  }
88 
92  virtual String getUrl(const String& path) const;
93 
97  virtual String getUrlBasePath() const;
98 
102  String resolvePath(const String& path) const;
103 
105 
106  const Device& root() const
107  {
108  return const_cast<Device*>(this)->root();
109  }
110 
111  bool isRoot() const
112  {
113  return this == &parent_;
114  }
115 
116  template <class S, typename T> S* getService(const T& serviceType)
117  {
118  return reinterpret_cast<S*>(services_.find(serviceType));
119  }
120 
121  template <typename T> Service* getService(const T& serviceType)
122  {
123  return getService<Service>(serviceType);
124  }
125 
126  template <class D, typename T> D* getDevice(const T& deviceType)
127  {
128  return reinterpret_cast<D*>(devices_.find(deviceType));
129  }
130 
131  template <typename T> Device* getDevice(const T& deviceType)
132  {
133  return getDevice<Device>(deviceType);
134  }
135 
136  void search(const SearchFilter& filter) override;
137  bool formatMessage(Message& msg, MessageSpec& ms) override;
138 
139  virtual String getField(Field desc) const;
140 
141  Urn objectType() const override
142  {
143  return DeviceUrn(getField(Field::domain), getField(Field::type), version());
144  }
145 
147  {
148  return getField(Field::friendlyName);
149  }
150 
151  bool onHttpRequest(HttpServerConnection& connection) override;
152 
153  void addDevice(Device* device)
154  {
155  devices_.add(device);
156  }
157 
158  void addService(Service* service)
159  {
160  services_.add(service);
161  }
162 
163  XML::Node* getDescription(XML::Document& doc, DescType descType) const override;
164 
166 
167  ItemEnumerator* getList(unsigned index, String& name) override;
168 
169  void sendXml(HttpResponse& response, IDataSourceStream* content);
170 
172  {
173  return parent_;
174  }
175 
177  {
178  return services_;
179  }
180 
182  {
183  return devices_;
184  }
185 
186 private:
187  Device& parent_;
188  Service::OwnedList services_;
189  Device::OwnedList devices_;
190 };
191 
192 } // namespace UPnP
193 
195 
196 bool fromString(const char* name, UPnP::Device::Field& field);
197 
198 inline bool fromString(const String& name, UPnP::Device::Field& field)
199 {
200  return fromString(name.c_str(), field);
201 }
#define UPNP_DEVICE_FIELD_MAP(XX)
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:24
String toString(UPnP::Device::Field &field)
bool fromString(const char *name, UPnP::Device::Field &field)
A UPnP Device URN.
Definition: Urn.h:168
Represents either an incoming or outgoing response to a HTTP request.
Definition: HttpResponse.h:26
Definition: HttpServerConnection.h:34
Base class for read-only stream.
Definition: DataSourceStream.h:46
Defines the information used to create an outgoing message.
Definition: MessageSpec.h:75
Message using regular HTTP header management class.
Definition: SSDP/src/include/Network/SSDP/Message.h:72
The String class.
Definition: WString.h:137
Represents any kind of device, including a root device.
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:58
D * getDevice(const T &deviceType)
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:126
ItemEnumerator * getList(unsigned index, String &name) override
void addDevice(Device *device)
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:153
void addService(Service *service)
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:158
S * getService(const T &serviceType)
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:116
virtual String getUrlBasePath() const
Get the base URL path.
Service * getService(const T &serviceType)
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:121
String resolvePath(const String &path) const
Resolve a path (relative or absolute) into an absolute path.
String caption() const
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:79
Urn objectType() const override
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:141
Device(Device *parent=nullptr)
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:75
Device(Device &parent)
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:71
IDataSourceStream * createDescription() override
Called by framework to construct a device description response stream.
bool formatMessage(Message &msg, MessageSpec &ms) override
Standard fields have been completed.
Service::OwnedList & services()
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:176
String friendlyName() const
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:146
const Device & root() const
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:106
void sendXml(HttpResponse &response, IDataSourceStream *content)
virtual String getUrl(const String &path) const
Get fully qualified URL.
Device & parent()
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:171
OwnedList & devices()
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:181
void search(const SearchFilter &filter) override
Called during SSDP search operation.
Device * getDevice(const T &deviceType)
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:131
bool isRoot() const
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:111
XML::Node * getDescription(XML::Document &doc, DescType descType) const override
Field
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:60
virtual String getField(Field desc) const
bool onHttpRequest(HttpServerConnection &connection) override
Called by framework to handle an incoming HTTP request.
Device & root()
Definition: ItemEnumerator.h:30
bool add(LinkedItem *item)
ObjectType * find(const T &objectType)
Search list for matching entry.
Definition: ObjectList.h:73
Base class template for linked items with type casting.
Definition: BaseObject.h:80
virtual Version version() const
Definition: Libraries/UPnP/src/include/Network/UPnP/Object.h:69
Represents any kind of device, including a root device.
Definition: UPnP/src/include/Network/UPnP/Service.h:47
Structure for UPnP URNs.
Definition: Urn.h:41
Definition: ActionRequest.h:25
DescType
When building descriptions this qualifies what information is required.
Definition: Item.h:32
rapidxml::xml_node< char > Node
Definition: RapidXML.h:37
rapidxml::xml_document< char > Document
Definition: RapidXML.h:36
Definition: BaseObject.h:39
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:46
uint8_t major
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:47
uint8_t minor
Definition: Libraries/UPnP/src/include/Network/UPnP/Device.h:48