const std::string CoreMessageXmlSerializer::serialize(const CoreMessage& message) const { pugi::xml_document doc; pugi::xml_node msgNode = doc.append_child(); msgNode.set_name("coreMessage"); msgNode.append_child().set_name("sessionId"); msgNode.child("sessionId").append_child(pugi::node_pcdata).set_value(message.sessionId().c_str()); msgNode.append_child().set_name("messageType"); std::string typeName = CoreMessage::lookupTypeName(message.messageType()); msgNode.child("messageType").append_child(pugi::node_pcdata).set_value(typeName.c_str()); msgNode.append_child().set_name("guid"); msgNode.child("guid").append_child(pugi::node_pcdata).set_value(message.guid().c_str()); msgNode.append_child().set_name("choreography"); msgNode.child("choreography").append_child(pugi::node_pcdata).set_value(message.choreography().c_str()); msgNode.append_child().set_name("description"); msgNode.child("description").append_child(pugi::node_pcdata).set_value(message.description().c_str()); msgNode.append_child().set_name("timeStamp"); msgNode.child("timeStamp").append_child(pugi::node_pcdata).set_value(message.timeStampString().c_str()); switch (message.messageType()) { case CoreMessage::INITIATE_SESSION_RESPONSE: //Fall-through case CoreMessage::KILL_SESSION_RESPONSE: { impl_->addResponseNodes(msgNode, message); break; } case CoreMessage::SERVICE_REQUEST: { const ServiceRequest req = dynamic_cast<const ServiceRequest&>(message); msgNode.append_child().set_name("function"); msgNode.child("function").append_child(pugi::node_pcdata).set_value(req.functionName().c_str()); pugi::xml_node params = msgNode.append_child(); params.set_name("parameters"); std::vector<std::string>::const_iterator end = req.parameterNames().end(); for (std::vector<std::string>::const_iterator it = req.parameterNames().begin(); it != end; ++it) { pugi::xml_node param = params.append_child(); param.set_name("parameter"); param.append_child().set_name("name"); param.child("name").append_child(pugi::node_pcdata).set_value(it->c_str()); param.append_child().set_name("value"); param.child("value").append_child(pugi::node_pcdata).set_value(req.parameterValue(*it).c_str()); } break; } case CoreMessage::SERVICE_RESPONSE: { impl_->addResponseNodes(msgNode, message); const ServiceResponse resp = dynamic_cast<const ServiceResponse&>(message); msgNode.append_child().set_name("hasData"); std::string hasData = boost::lexical_cast<std::string>(resp.hasData()); msgNode.child("hasData").append_child(pugi::node_pcdata).set_value(hasData.c_str()); break; } case CoreMessage::DATA_RESPONSE: { impl_->addResponseNodes(msgNode, message); const DataResponse resp = dynamic_cast<const DataResponse&>(message); msgNode.append_child().set_name("data"); msgNode.child("data").append_child(pugi::node_pcdata).set_value(resp.data().c_str()); break; } default: break; } std::stringstream ss; pugi::xml_writer_stream writer(ss); doc.print(writer); return ss.str(); }