/************************************************************
* Details: 网络队列
* Encode: UTF-8
* Platform: Android & Linux
* Author: R&D 2
* Date: 2018-4-2
************************************************************/
#ifndef __GT_CORE_NETWORK_QUEUE_H__
#define __GT_CORE_NETWORK_QUEUE_H__

typedef struct __stNetworkItem
{
    int nSocketFd;//链路socket
    unsigned int unType;//1-本地监听socket,2-本地通信socket
    long lConnectTime;//接入时间
}stNetworkItem;

typedef struct __stNetworkQueue
{
    stNetworkItem item;
    struct __stNetworkQueue *next;
}stNetworkQueue;

class GtNetworkQueue
{
    public:
        GtNetworkQueue();
        virtual ~GtNetworkQueue();
        enum NetType
        {
            NET_TYPE_LOCAL_LISTEN = 1,
            NET_TYPE_LOCAL_CONNECT
        };
        /************************************************************
        *功能：构建网络队列
        *输入：maxSize网络队列最大长度
        *输出：无
        *返回：true or false
        */
        bool initNetworkQueue(int maxSize);

        /************************************************************
        *功能：释放网络队列
        *输入：无
        *输出：无
        *返回：无
        */
        void releaseNetworkQueue();

        /************************************************************
        *功能：获取网络队列中空的节点
        *输入：无
        *输出：无
        *返回：true or false
        */
        bool getEmptyNode(int *offset, stNetworkItem *item);

        /************************************************************
        *功能：获取指定位置的网络队列节点
        *输入：index网络队列索引
        *输出：attr网络队列节点属性
        *返回：true or false
        */
        bool getNode(int index, stNetworkItem *item);

        /************************************************************
        *功能：设置指定位置的网络队列节点
        *输入：index网络队列索引
        *输入：attr网络队列节点属性
        *输出：无
        *返回：true or false
        */
        bool setNode(int index, stNetworkItem *item);

        /************************************************************
        *功能：将指定位置的网络节点移动到网络队列末尾，并清除其属性数据
        *输入：index网络队列索引
        *输出：无
        *返回：!=0错误
        */
        bool recycleNode(int index);

        /************************************************************
        *功能：获取网络队列长度
        *输入：无
        *输出：无
        *返回：队列长度
        */
        int size();

        /************************************************************
        *功能：获取网络有效的节点数
        *输入：无
        *输出：无
        *返回：节点数
        */
        int validNodeSize();

    private:
        stNetworkQueue *_networkQueue;
        /************************************************************
        *功能：插入网络节点到网络队列末尾
        *输入：node网络节点
        *输出：无
        *返回：true or false
        */
        bool appendNode(stNetworkQueue *node);
};

#endif
