Ejemplo n.º 1
0
int handleService(ServiceRequest& req, MessageSender& sender, MessageReceiver& receiver, MessageReceiver& dataReceiver) {
    sender.sendCoreMessage(req, SESSION_ID);
    ServiceResponse* serviceResponse = dynamic_cast<ServiceResponse*>(receiver.getNextCoreMessage(1500));
    if (serviceResponse == 0) {
        std::cout << "Failure: No response to service request" << std::endl;
        return 1;
    }
    if (serviceResponse->isSuccessful()) {
            std::cout << "Request successful" << std::endl;
        if (serviceResponse->hasData()) {
            std::cout << "Response has associated data" << std::endl;
            DataResponse* dataResponse = dynamic_cast<DataResponse*>(dataReceiver.getNextCoreMessage(1500));
            if (dataResponse == 0) {
                std::cout << "Failure: Associated data not available" << std::endl;
                return 1;
            }
            std::cout << "Response data: " << dataResponse->data() << std::endl;
            delete dataResponse;
        }
    }
    else {
        std::cout << "Request unsuccessful" << std::endl;
        std::cout << "Error code: " << serviceResponse->errorCode() << std::endl;
        std::cout << "Error message: " << serviceResponse->errorMessage() << std::endl;
    }
    delete serviceResponse;
    return 0;
}
Ejemplo n.º 2
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();
}