You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
1.6 KiB
C++

#include "webcc/soap_request.h"
#include "webcc/soap_xml.h"
namespace webcc {
void SoapRequest::AddParameter(const SoapParameter& parameter) {
parameters_.push_back(parameter);
}
void SoapRequest::AddParameter(SoapParameter&& parameter) {
parameters_.push_back(std::move(parameter));
}
const std::string& SoapRequest::GetParameter(const std::string& key) const {
for (const SoapParameter& p : parameters_) {
if (p.key() == key) {
return p.value();
}
}
static const std::string kEmptyValue;
return kEmptyValue;
}
void SoapRequest::ToXmlBody(pugi::xml_node xbody) {
pugi::xml_node xop = soap_xml::AddChild(xbody, service_ns_.name, operation_);
soap_xml::AddNSAttr(xop, service_ns_.name, service_ns_.url);
for (SoapParameter& p : parameters_) {
pugi::xml_node xparam = soap_xml::AddChild(xop, service_ns_.name, p.key());
// xparam.text().set() also works for PCDATA.
xparam.append_child(p.as_cdata() ? pugi::node_cdata : pugi::node_pcdata)
.set_value(p.c_value());
}
}
bool SoapRequest::FromXmlBody(pugi::xml_node xbody) {
pugi::xml_node xoperation = xbody.first_child();
if (!xoperation) {
return false;
}
soap_xml::SplitName(xoperation, &service_ns_.name, &operation_);
service_ns_.url = soap_xml::GetNSAttr(xoperation, service_ns_.name);
pugi::xml_node xparameter = xoperation.first_child();
while (xparameter) {
parameters_.push_back({
soap_xml::GetNameNoPrefix(xparameter),
// xparameter.text().get/as_string() also works.
std::string(xparameter.child_value())
});
xparameter = xparameter.next_sibling();
}
return true;
}
} // namespace webcc