summaryrefslogtreecommitdiffstats
path: root/src/Common/XmlData.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common/XmlData.cpp')
-rw-r--r--src/Common/XmlData.cpp43
1 files changed, 37 insertions, 6 deletions
diff --git a/src/Common/XmlData.cpp b/src/Common/XmlData.cpp
index de9588a..956117f 100644
--- a/src/Common/XmlData.cpp
+++ b/src/Common/XmlData.cpp
@@ -38,6 +38,10 @@ void XmlData::Element::updateStr() {
str = Base64Encoder::encode(boost::get<std::vector<boost::uint8_t> >(value)).c_str();
typeStr = "binary";
}
+ else if(type == TIME) {
+ str = Core::String::fromString(boost::posix_time::to_iso_string(boost::get<boost::posix_time::ptime>(value)));
+ typeStr = "time";
+ }
else if(type != STRING) {
std::ostringstream buf;
@@ -69,7 +73,10 @@ void XmlData::Element::updateStr() {
case LONGDOUBLE:
buf << boost::get<long double>(value);
typeStr = "longdouble";
- default:
+ case BINARY:
+ case STRING:
+ case TIME:
+ case NONE:
break;
}
@@ -78,13 +85,13 @@ void XmlData::Element::updateStr() {
else
typeStr = "string";
- xmlNodePtr newNode = xmlNewText((xmlChar*)str.extractUTF8().c_str());
+ xmlNodePtr newNode = xmlNewText((xmlChar*)str.toUTF8().c_str());
xmlNodePtr oldNode = elementNode->children;
xmlReplaceNode(oldNode, newNode);
xmlFreeNode(oldNode);
- xmlSetProp(elementNode, (xmlChar*)"type", (xmlChar*)typeStr.extractUTF8().c_str());
+ xmlSetProp(elementNode, (xmlChar*)"type", (xmlChar*)typeStr.toUTF8().c_str());
}
XmlData::Element::Element(xmlNodePtr node) : elementNode(node), type(NONE) {
@@ -102,12 +109,22 @@ XmlData::Element::Element(xmlNodePtr node) : elementNode(node), type(NONE) {
}
str = Core::String::fromUTF8((char*)content);
- std::istringstream buf(str.extract());
+ std::istringstream buf(str.toString());
if(!xmlStrcmp(typestr, (xmlChar*)"binary")) {
type = BINARY;
- value = Base64Encoder::decode(str.extract());
+ value = Base64Encoder::decode(str.toString());
+ }
+ else if(!xmlStrcmp(typestr, (xmlChar*)"time")) {
+ type = TIME;
+
+ try {
+ value = boost::posix_time::from_iso_string(str.toString());
+ }
+ catch(...) {
+ value = boost::posix_time::ptime(boost::posix_time::not_a_date_time);
+ }
}
else if(!xmlStrcmp(typestr, (xmlChar*)"int")) {
type = INT;
@@ -240,6 +257,20 @@ const std::vector<boost::uint8_t>& XmlData::Entry::get<const std::vector<unsigne
}
}
+template <>
+boost::posix_time::ptime XmlData::Entry::get<boost::posix_time::ptime>(const Core::String &name) const {
+ Element *element = getElement(name);
+ if(!element)
+ return boost::posix_time::ptime(boost::posix_time::not_a_date_time);
+
+ switch(element->type) {
+ case Element::TIME:
+ return boost::get<boost::posix_time::ptime>(element->value);
+ default:
+ return boost::posix_time::ptime(boost::posix_time::not_a_date_time);
+ }
+}
+
XmlData::List::List(xmlNodePtr node) : elementNode(node) {
for(xmlNodePtr entry = node->children; entry != 0; entry = entry->next) {
if(entry->type != XML_ELEMENT_NODE || xmlStrcmp(entry->name, (xmlChar*)"entry"))
@@ -301,7 +332,7 @@ Core::String XmlData::getType() const {
}
void XmlData::setType(const Core::String &type) {
- xmlSetProp(rootNode, (xmlChar*)"type", (xmlChar*)type.extractUTF8().c_str());
+ xmlSetProp(rootNode, (xmlChar*)"type", (xmlChar*)type.toUTF8().c_str());
}
Net::Packet XmlData::toPacket(boost::uint16_t requestId) const {