CasePacker.h 1.58 KB
Newer Older
Valentin Platzgummer's avatar
Valentin Platzgummer committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#pragma once
#include "ros_bridge/include/MessageBaseClass.h"
#include "ros_bridge/include/MessageTag.h"
#include "ros_bridge/include/TypeFactory.h"
#include "ros_bridge/include/JsonFactory.h"

#include <memory>
#include "rapidjson/include/rapidjson/document.h"

namespace ROSBridge {

class CasePacker
{
    typedef MessageTag Tag;
    typedef rapidjson::Document JsonDoc;
    typedef std::unique_ptr<JsonDoc> JsonDocUPtr;
public:
Valentin Platzgummer's avatar
Valentin Platzgummer committed
18 19
    CasePacker() = delete;
    CasePacker(TypeFactory *typeFactory, JsonFactory *jsonFactory);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
20 21

    template<class T>
Valentin Platzgummer's avatar
Valentin Platzgummer committed
22
    JsonDocUPtr pack(const T &msg, const std::string &topic) const
Valentin Platzgummer's avatar
Valentin Platzgummer committed
23
    {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
24
        JsonDocUPtr docPt(_jsonFactory->create(msg));
Valentin Platzgummer's avatar
Valentin Platzgummer committed
25
        std::string messageType = T::Group::messageType();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
26
        addTag(docPt, topic, messageType.c_str());
Valentin Platzgummer's avatar
Valentin Platzgummer committed
27 28 29 30
        return docPt;
    }

    template<class T>
Valentin Platzgummer's avatar
Valentin Platzgummer committed
31 32
    bool unpack(JsonDocUPtr &pDoc, T &msg) const {
        removeTag(pDoc);
33
        return _typeFactory->create(*pDoc.get(), msg);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
34 35 36
    }


Valentin Platzgummer's avatar
Valentin Platzgummer committed
37 38
    bool getTag(const JsonDocUPtr &pDoc, Tag &tag) const;
    void addTag        (JsonDocUPtr &doc,
Valentin Platzgummer's avatar
Valentin Platzgummer committed
39
                         const std::string &topic,
Valentin Platzgummer's avatar
Valentin Platzgummer committed
40
                         const std::string &messageType) const;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
41 42 43 44
    void addTag        (JsonDocUPtr &doc, const Tag &tag) const;
    void removeTag     (JsonDocUPtr &pDoc) const;
    bool getTopic      (const JsonDocUPtr &pDoc, std::string &topic) const;
    bool getMessageType(const JsonDocUPtr &pDoc, std::string &messageType) const;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
45 46 47

    static const char* topicKey;
    static const char* messageTypeKey;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
48 49

private:
Valentin Platzgummer's avatar
Valentin Platzgummer committed
50 51
    TypeFactory *_typeFactory;
    JsonFactory *_jsonFactory;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
52 53 54
};
}