#ifndef __GT_CORE_FILE_TRANSFER_H__
#define __GT_CORE_FILE_TRANSFER_H__
#include "gtftnetwork.h"

typedef struct __stFileAttr
{
    unsigned long ulFileSize;
    unsigned long ulFileBlockSN;
    long lFileBlockCRC;
    unsigned int unFileBlockSize;
    char strFileName[512];
    unsigned char strFileMD5[16];
}stFileAttr;

class GtFileTransfer
{
    public:
        GtFileTransfer();
        virtual ~GtFileTransfer();

        /************************************************************
        *功能：连接文件服务器
        *输入：serverIP=服务器IP
        *输入：port=服务器端口
        *输出：无
        *返回：!=0错误
        */
        int fileServerLink(char *serverIP, unsigned short port);

        /************************************************************
        *功能：关闭文件服务器
        *输入：无
        *输出：无
        *返回：!=0错误
        */
        void closeFileServerLink();

        /************************************************************
        *功能：文件下载网络接口
        *输入：tradingCode=交易码
        *输入：inBuf=请求数据
        *输入：inLen=请求数据长度
        *输出：outBuf=应答数据
        *输出：outBufLen=应答数据长度
        *返回：!=0错误
        */
        int callNetwork(unsigned long tradingCode, char *inBuf, int inLen, char *outBuf, int *outBufLen);

        /************************************************************
        *功能：下载文件
        *输入：env=JVM环境
        *输入：serverFile=下载文件服务器路径
        *输入：localFile=本地文件存储路径
        *输入：isBP=0-不支持断点续传，1-支持断点续传
        *输出：无
        *返回：!=0错误
        */
        int downloadFile(JNIEnv *env, char *serverFile, char *localFile, int isBP);

        /************************************************************
        *功能：上传文件
        *输入：env=JVM环境
        *输入：serverFile=上传文件服务器存储路径
        *输入：localFile=本地文件路径
        *输出：无
        *返回：!=0错误
        */
        int uploadFile(JNIEnv *env, char *serverFile, char *localFile);

    private:
        GtFTNetwork *_ftNetwork;
        int compareMD5TmpFile(char *fileName, unsigned char md5Sum[16]);
        int writeMD5TmpFile(char *fileName, unsigned char md5[16]);
        int delMD5TmpFile(char *fileName);
        int getBreakPointBlock(char *file, int blockSize, int *block);
        int getFileInfo(unsigned long tradingCode, stFileAttr *fileAttr);
        int getFileBlock(unsigned long tradingCode, stFileAttr *fileAttr, char *buf, int bufLen);
        int callbackDownloadProgress(JNIEnv *env, char *fileName, int progress);
        int uploadFileRequest(unsigned long tradingCode, stFileAttr *fileAttr);
        int uploadFileData(unsigned long tradingCode, stFileAttr *fileAttr, char *buf, int dataLen);
        int uploadFileCompleted(unsigned long tradingCode, stFileAttr *fileAttr);
        bool isRepeatFile(char *file, int size);
};

#endif