/************************************************************
* Details: 消息队列循环处理机制
* Encode: UTF-8
* Platform: Android & Linux
* Author: R&D 2
* Date: 2018-4-2
************************************************************/
#ifndef __GT_CORE_MESSAGE_LOOP_H__
#define __GT_CORE_MESSAGE_LOOP_H__

#include "gtmessagequeue.h"

class GtMessageLoop
{
    public:
        virtual ~GtMessageLoop();
        static GtMessageLoop *instance();

        /************************************************************
        *功能：创建消息队列
        *输入：size队列长度
        *输出：无
        *返回：true,false
        */
        bool initMessage(int size);

        /************************************************************
        *功能：停止消息队列
        *输入：无
        *输出：无
        *返回：无
        */
        void stop();

        /************************************************************
        *功能：消息队列循环处理
        *输入：无
        *输出：无
        *返回：无
        */
        void loop();


    private:
        GtMessageLoop();
        static GtMessageLoop *_instance;
        int _serverSocket;
        char _serverIP[128];
        int _serverPort;
        unsigned int _operatorID;
        unsigned long _terminalID;
        int _trainingMode;
        bool _runFlag;
        time_t _keepTime;
        const int _readTimeout;
        unsigned long _lastSN;

        /************************************************************
        *功能：消息队列数据处理，包括超时、服务器请求、应答等
        *输入：无
        *输出：无
        *返回：无
        */
        void handleMessage();

        /************************************************************
        *功能：连接后台服务器
        *输入：data服务器配置数据
        *输出：无
        *返回：!=0错误
        */
        int serverLink(char *data);

        int reconnectServer();

        void keepServerConnect();

        void updateKeepTime();

        /************************************************************
        *功能：返回本地应答
        *输入：socketFd返回数据链路，msg队列消息
        *输出：无
        *返回：true,false
        */
        bool localResponse(int socketFd, stMessage *msg);

        /************************************************************
        *功能：本地正常应答
        *输入：item队列节点，data应答内容，dataLength数据长度
        *输出：无
        *返回：!=0错误
        */
        int normalResponse(stMessageItem *item, unsigned char *data, int dataLength);

        /************************************************************
        *功能：本地错误应答
        *输入：item队列节点，errorCode错误码，errorString错误内容
        *输出：无
        *返回：!=0错误
        */
        int errorResponse(stMessageItem *item, int errorCode, char *errorString);

        /************************************************************
        *功能：服务器应答数据校验
        *输入：msg应答数据
        *输出：无
        *返回：true,false
        */
        bool checkServerResponse(stMessage *msg);

        void writeTradingLog(char *data, int size);
};

#endif
