//
// Created by Ht on 2019/8/8.
//

#ifndef JSONPROTOCOL_JRPACKAGE_H
#define JSONPROTOCOL_JRPACKAGE_H

#include "JRDpBaseObj.h"

using namespace jedp;

namespace jedp {

    static const char* vkey_dp_msg_type = "type";

    class JE_API JRBuffer {
    public:
        QByte * buffer;
        size_t  len;
    };

    class JE_API JRPackage :
            public JRDpBaseObj {

    protected:
        bool mValid = false;
        std::vector<QByte *> mMarkedBuffers;
        std::unordered_map<string, const QByte *> mFieldBuffers;
        std::unordered_map<string, size_t > mVarSizeMap;           //记录变化长度Field的长度

    public:
        JRPackage();
        explicit JRPackage(const Json::Value &value);
        ~JRPackage() override;

        string getPackageType() const;
        void setValid(bool valid);
        bool isValid() const;

        /**
         *      记录需要被释放的缓冲区，当Package被释放时， 释放这些内存
         * @param buffer
         */
        void markBufferToRelease(QByte* buffer);

        /**
         *      复制子包的buffer表，也要包括markedBuffer, varField的size表等
         * @param fieldKey
         * @param package
         */
        void pullOrgBuff(const string& fieldKey, JRPackage& package);

        /**
         *      记录Field的缓存
         * @param fieldKey
         * @param fieldBuff
         */
        void putOriginalBuff(const string& fieldKey, const QByte* fieldBuff);

        /**
         *      记录变化长度的Field的缓存指针及其Byte长度
         * @param fieldKey
         * @param fieldBuff
         */
        void putVarSizeOriginalBuff(const string& fieldKey, const QByte* fieldBuff, size_t bitLen);

        /**
         *      做package池时较为常用，不删除对象，但清理其缓存数据
         *      复用Package需要做锁
         */
        void clearPackage();

    };

}
#endif //JSONPROTOCOL_JRPACKAGE_H
