diff options
Diffstat (limited to 'src/Common/XmlData.cpp')
-rw-r--r-- | src/Common/XmlData.cpp | 43 |
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 { |