Exemplo n.º 1
0
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();
}