4#include "Stroika/Frameworks/StroikaPreComp.h"
8#include "Stroika/Foundation/DataExchange/ObjectVariantMapper.h"
23using Memory::MakeSharedPtr;
25using namespace Stroika::Frameworks;
26using namespace Stroika::Frameworks::UPnP;
32 const IO::Network::URI kServiceNamespace_{
"urn:schemas-upnp-org:service-1-0"sv};
37 template <
typename CLASS>
41 VVMap_ m = v->
As<VVMap_> ();
55 mapper.
Add<SD_::Argument::Direction> (
57 return VariantValue{*d == SD_::Argument::Direction::eIn ?
"in"sv :
"out"sv};
60 *d = v.
As<
String> ().Trim () ==
"out"sv ? SD_::Argument::Direction::eOut : SD_::Argument::Direction::eIn;
63 {
"name"sv, &SD_::Argument::fName},
64 {
"direction"sv, &SD_::Argument::fDirection},
65 {
"retval"sv, &SD_::Argument::fRetval},
66 {
"relatedStateVariable"sv, &SD_::Argument::fRelatedStateVariable},
70 mapper.
AddClass<SD_::Action> ({{
"name"sv, &SD_::Action::fName}, {
"argumentList"sv, &SD_::Action::fArguments}},
71 {.fAfterFrom = LeaveOutIfEmpty_<SD_::Action> (
"argumentList"sv)});
75 {
"maximum"sv, &SD_::AllowedValueRange::fMaximum},
76 {
"step"sv, &SD_::AllowedValueRange::fStep}});
88 {
"sendEvents"sv, &SD_::StateVariable::fSendEvents, kYesNo},
89 {
"name"sv, &SD_::StateVariable::fName},
90 {
"dataType"sv, &SD_::StateVariable::fDataType},
91 {
"defaultValue"sv, &SD_::StateVariable::fDefaultValue},
92 {
"allowedValueList"sv, &SD_::StateVariable::fAllowedValues},
93 {
"allowedValueRange"sv, &SD_::StateVariable::fAllowedValueRange},
95 {.fAfterFrom = LeaveOutIfEmpty_<SD_::StateVariable> (
"allowedValueList"sv)});
98 mapper.
AddClass<
SD_> ({{
"actionList"sv, &SD_::fActions}, {
"serviceStateTable"sv, &SD_::fStateVariables}},
100 LeaveOutIfEmpty_<SD_> (
"actionList"sv) (m, sd, v);
101 VVMap_ vm = v->As<VVMap_> ();
103 vm.Add (
"specVersion"sv,
122 static const Binding kBinding_ = [] () {
123 constexpr auto kSkip = Binding::UndeclaredMembers::eSkip;
124 auto text = [] () {
return Binding{.
fType = VariantValue::eString}; };
125 auto list = [] (
const Binding& item) {
126 return Binding{.fType = VariantValue::eArray,
127 .fUndeclaredMembers = Binding::UndeclaredMembers::eSkip,
128 .fItems = MakeSharedPtr<Binding> (item)};
130 Binding argument{.fName =
"argument"sv,
131 .fType = VariantValue::eMap,
132 .fMembers = {{
"name"sv, text ()},
133 {
"direction"sv, text ()},
134 {
"retval"sv, Binding{.fKind = Binding::Kind::ePresenceMarker, .fType = VariantValue::eBoolean}},
135 {
"relatedStateVariable"sv, text ()}},
136 .fUndeclaredMembers = kSkip};
137 Binding action{.fName =
"action"sv,
138 .fType = VariantValue::eMap,
139 .fMembers = {{
"name"sv, text ()}, {
"argumentList"sv, list (argument)}},
140 .fUndeclaredMembers = kSkip};
141 Binding allowedValue{.fName =
"allowedValue"sv, .fType = VariantValue::eString};
142 Binding stateVariable{
143 .fName =
"stateVariable"sv,
144 .fType = VariantValue::eMap,
145 .fMembers = {{
"sendEvents"sv, Binding{.fKind = Binding::Kind::eAttribute, .fType = VariantValue::eString}},
147 {
"dataType"sv, text ()},
148 {
"defaultValue"sv, text ()},
149 {
"allowedValueList"sv, list (allowedValue)},
150 {
"allowedValueRange"sv, Binding{.fType = VariantValue::eMap,
151 .fMembers = {{
"minimum"sv, text ()}, {
"maximum"sv, text ()}, {
"step"sv, text ()}},
152 .fUndeclaredMembers = kSkip}}},
153 .fUndeclaredMembers = kSkip};
154 Binding specVersion{.fType = VariantValue::eMap, .fMembers = {{
"major"sv, text ()}, {
"minor"sv, text ()}}, .fUndeclaredMembers = kSkip};
156 .fType = VariantValue::eMap,
157 .fMembers = {{
"specVersion"sv, specVersion}, {
"actionList"sv, list (action)}, {
"serviceStateTable"sv, list (stateVariable)}},
158 .fUndeclaredMembers = kSkip};
159 Ensure (scpd.IsComplete ());
175 sb <<
"Name: "sv << fName;
176 sb <<
", Direction: "sv << (fDirection == Direction::eIn ?
"in"sv :
"out"sv);
194 sb <<
"Name: "sv << fName;
195 sb <<
", Arguments: "sv << fArguments;
209 sb <<
"Minimum: "sv << fMinimum;
210 sb <<
", Maximum: "sv << fMaximum;
212 sb <<
", Step: "sv << *fStep;
227 sb <<
"Name: "sv << fName;
230 sb <<
", Default-Value: "sv << *fDefaultValue;
252 sb <<
"Actions: "sv << fActions;
253 sb <<
", State-Variables: "sv << fStateVariables;
267 Memory::BLOB result = kWriter_.WriteAsBLOB (Mapper_ ().FromObject (sd));
268#if qStroika_Foundation_DataExchange_XML_SupportParsing and qStroika_Foundation_DataExchange_XML_SupportSchema and qStroika_Foundation_DataExchange_XML_SupportDOM
269 if (options.fValidateWrite) {
271 options.fXMLOptions);
#define RequireNotNull(p)
Similar to String, but intended to more efficiently construct a String. Mutable type (String is large...
String is like std::u32string, except it is much easier to use, often much more space efficient,...
A Mapping uniquely associates two elements: a key and a value (use Assocation to allow multiple value...
nonvirtual CONTAINER_OF_Key_T As() const
A generalization of a vector: a container whose elements are keyed by the natural numbers.
ObjectVariantMapper can be used to map C++ types to and from variant-union types, which can be transp...
nonvirtual void AddClass(const Traversal::Iterable< StructFieldInfo > &fieldDescriptions, const ClassMapperOptions< CLASS > &mapperOptions={})
function< VariantValue(const ObjectVariantMapper &mapper, const T *objOfType)> FromObjectMapperType
nonvirtual void AddCommonType(ARGS &&... args)
function< void(const ObjectVariantMapper &mapper, const VariantValue &d, T *into)> ToObjectMapperType
nonvirtual void Add(const TypeMappingDetails &s)
Read XML as a VariantValue - the inverse of Variant::XML::Writer, whose documentation has the shape.
Write a VariantValue as XML - an object's member is an element, an array is repeated elements.
Simple variant-value (case variant union) object, with (variant) basic types analogous to a value in ...
nonvirtual RETURNTYPE As() const
How a VariantValue is to be written as XML, and read back, where the default shape (.
optional< VariantValue::Type > fType
An element's or attribute's name (local-name, not including a prefix), plus the namespace that name i...
String fRelatedStateVariable
What Serialize and DeSerialize of an SCPD are told - defaulted, so a caller says only what it wants d...
Foundation::DataExchange::XML::Schema::Ptr fValidateReadAgainst
Check an SCPD being read against this schema - ServiceDescriptionSchema - throwing where it does not ...
Foundation::DataExchange::XML::Options fXMLOptions
The XML provider that reads, and that checks what is written - by default, Stroika's default provider...
optional< AllowedValueRange > fAllowedValueRange
Sequence< String > fAllowedValues
A service's description - its SCPD (UPnP Device Architecture 1.1, section 2.5): its actions,...
nonvirtual String ToString() const