Server.cpp 2.92 KB
Newer Older
1 2
#include "Server.h"

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
#include "rapidjson/include/rapidjson/ostreamwrapper.h"

ROSBridge::ComPrivate::Server::Server(CasePacker &casePacker, RosbridgeWsClient &rbc) :
    _rbc(rbc)
  , _casePacker(casePacker)
{

}

void ROSBridge::ComPrivate::Server::advertiseService(const std::string &service,
                                                     const std::string &type,
                                                     const Server::CallbackType &userCallback)
{
    std::string clientName = _serviceAdvertiserKey + service;
    auto it = std::find(_clientList.begin(), _clientList.end(), clientName);
    if (it != _clientList.end())
        return; // Service allready advertised.
    _clientList.push_back(clientName);
    _rbc.addClient(clientName);

    auto rbc = &_rbc;
    auto casePacker = &_casePacker;
    _rbc.advertiseService(clientName, service, type,
                          [userCallback, rbc, casePacker](
                          std::shared_ptr<WsClient::Connection>,
                          std::shared_ptr<WsClient::InMessage> in_message){
        // message->string() is destructive, so we have to buffer it first
        std::string messagebuf = in_message->string();
        //std::cout << "advertiseServiceCallback(): Message Received: "
                 // << messagebuf << std::endl;

        rapidjson::Document document;
        if (document.Parse(messagebuf.c_str()).HasParseError())
        {
          std::cerr << "advertiseServiceCallback(): Error in parsing service request message: "
                    << messagebuf << std::endl;
          return;
        }

        // Extract message and call callback.
        if ( !document.HasMember("args") || !document["args"].IsObject()){
            std::cerr << "advertiseServiceCallback(): message has no args: "
                      << messagebuf << std::endl;
            return;
        }
        JsonDocUPtr pDoc(new JsonDoc());
        std::cout << "args member count: " << document["args"].MemberCount();
        if ( document["args"].MemberCount() > 0)
            pDoc->CopyFrom(document["args"].Move(), document.GetAllocator());
        JsonDocUPtr pDocResponse = userCallback(std::move(pDoc));

        rapidjson::OStreamWrapper out(std::cout);
        // Write document...
        rapidjson::Writer<rapidjson::OStreamWrapper> writer(out);
        std::cout << "Ros Server: ";
        (*pDocResponse).Accept(writer);
        std::cout << std::endl;

        rbc->serviceResponse(
                    document["service"].GetString(),
                    document["id"].GetString(),
                    true,
                    *pDocResponse);

        return;

    });
}

ROSBridge::ComPrivate::Server::~Server()
73
{
74 75
    this->reset();
}
76

77 78 79 80 81 82 83 84 85 86 87 88
void ROSBridge::ComPrivate::Server::start()
{
    _running = true;
}

void ROSBridge::ComPrivate::Server::reset()
{
    if (!_running)
        return;
    for (const auto& str : _clientList)
        _rbc.removeClient(str);
    _clientList.clear();
89
}