void FileTransferModule_Impl::_sendfileResponse(IN std::string& body)
{
    IM::File::IMFileRsp imFileRsp;
    if (!imFileRsp.ParseFromString(body))
    {
        LOG__(ERR, _T("parse failed,body:%s"), util::stringToCString(body));
        return;
    }

    UInt32 nResult = imFileRsp.result_code();
    if (nResult != 0)
    {
        LOG__(ERR, _T("_sendfileResponse result != 0"));
        module::getFileTransferModule()->asynNotifyObserver(module::KEY_FILESEVER_UPLOAD_FAILED);
    }

    TransferFileEntity fileEntity;
    fileEntity.sTaskID = imFileRsp.task_id();
    assert(!fileEntity.sTaskID.empty());
    fileEntity.sFromID = util::uint32ToString(imFileRsp.from_user_id());
    fileEntity.sToID = util::uint32ToString(imFileRsp.to_user_id());
    fileEntity.sFileName = imFileRsp.file_name();
    fileEntity.setSaveFilePath(util::stringToCString(fileEntity.sFileName));//发送方文件地址,就是保存地址
    fileEntity.time = static_cast<UInt32>(time(0));
    uint32_t transMode = imFileRsp.trans_mode();
    if (IM::BaseDefine::FileType::FILE_TYPE_ONLINE == transMode)
    {
        fileEntity.nClientMode = IM::BaseDefine::ClientFileRole::CLIENT_REALTIME_SENDER;
    }
    else if (IM::BaseDefine::FileType::FILE_TYPE_OFFLINE == transMode)
    {
        fileEntity.nClientMode = IM::BaseDefine::ClientFileRole::CLIENT_OFFLINE_UPLOAD;
    }
    fileEntity.pFileObject = new TransferFile(util::stringToCString(fileEntity.sFileName),FALSE);
    if (fileEntity.pFileObject)
    {
        fileEntity.nFileSize = fileEntity.pFileObject->length();
    }

    UINT32 nIPCount = imFileRsp.ip_addr_list_size();
    if (nIPCount <= 0)
    {
        return;
    }
    const IM::BaseDefine::IpAddr& ipAdd = imFileRsp.ip_addr_list(0);
    fileEntity.sIP = ipAdd.ip();
    fileEntity.nPort = ipAdd.port();

    if (!TransferFileEntityManager::getInstance()->pushTransferFileEntity(fileEntity))
        TransferFileEntityManager::getInstance()->updateFileInfoBysTaskID(fileEntity);

    LOG__(DEBG, _T("FileTransferSevice_Impl::准备连接文件服务器 sTaskId = %s"), util::stringToCString(fileEntity.sTaskID));
    TransferFileEntityManager::getInstance()->openFileSocketByTaskId(fileEntity.sTaskID);
}
BOOL DatabaseModule_Impl::sqlGetFileTransferHistory(OUT std::vector<TransferFileEntity>& fileList)
{
    try
    {
        CppSQLite3Statement stmt;
        stmt = m_pSqliteDB->compileStatement(getFileTransferHistoryBySIdSql.c_str());
        stmt.bind(1, 20);

        CppSQLite3Query query = stmt.execQuery();
        while (!query.eof())
        {
            TransferFileEntity fileInfo;
            fileInfo.sTaskID = query.getStringField(1);
            fileInfo.sFromID = query.getStringField(2);
            fileInfo.sFileName = query.getStringField(3);
            CString strSavePath = util::stringToCString(query.getStringField(7));
            fileInfo.setSaveFilePath(strSavePath);
            fileInfo.nFileSize = query.getIntField(8);
            fileInfo.time = query.getIntField(9);
            fileList.push_back(fileInfo);
            query.nextRow();
        }
    }
    catch (CppSQLite3Exception& sqliteException)
    {
#ifdef _DEBUG
        MessageBoxA(0, sqliteException.errorMessage(), "BD ERROR", MB_OK | MB_ICONHAND);
#endif
        CString csErrMsg = util::stringToCString(sqliteException.errorMessage(), CP_UTF8);
        LOG__(ERR, _T("db failed,error msg:%s"),
            csErrMsg);
        return FALSE;
    }
    catch (...)
    {
        return FALSE;
    }

    return TRUE;
}