⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dload.c

📁 linux下http和ftp下载工具
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************
* File name: dload.c
* Author: Version: Date: likun
* Description: 下载管理模块的实现
*
* Others:
* Function List:
* 1. ....
* History:
* 1. Date:2008-3-31
* Author:likun create this file
* Modification:
* 2. ...
*************************************************************************/
#include <stdio.h>
#include <dirent.h>  
#include "hos.h"
#include "DownFromFTP.h"
#include "DownFromHTTP.h"

#ifdef __cplusplus

extern "C" {
#endif

#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif

int fnScanTaskAndStart(void *para);
int fnScanTaskAndStart(void *para);
DLOAD_PROTOCOL DLoadParseProtocol(const char *url);


/*下载任务列表全局变量*/
THList g_DLoadList;    /*下载任务列表*/
int g_DLoadTaskNum = 0;       /*当前下载任务的个数*/

int fnFindTaskByProtocolHandle(void *para, THListNode *pstRegList)
{
    HDLProtocolHandle ProtocolInfo;
    DLoadTaskPrivateInfo *pTaskInfo = NULL;
    if(!para)
        return -1;

    ProtocolInfo = *((HDLProtocolHandle *)para);    
    pTaskInfo = (DLoadTaskPrivateInfo *)(pstRegList->pUserData);

    if(ProtocolInfo == pTaskInfo->pProtocolInfo)
    {
        return 0;
    }
    else
        return -1;
}


int DLoadFinishNotify(void * para)
{
    THListNode *pstTmpNode;
    HDLProtocolHandle ProtocolInfo;

    ProtocolInfo = *(HDLProtocolHandle*)para;
    pstTmpNode = HList_Find(&g_DLoadList, 
                        &ProtocolInfo, fnFindTaskByProtocolHandle);    

    if(pstTmpNode)
    {
        DLoadTaskPrivateInfo *pTmpTaskInfo = 
                (DLoadTaskPrivateInfo *)pstTmpNode->pUserData;
        pTmpTaskInfo->CurStat = DLOAD_STAT_FINISH;
        g_DLoadTaskNum--;
        DLoadStartWaitTask();
    }
    
    return 0;
}

void* DLoadReciveMsgTask(void *param)
{
    TMsg *pMsg = NULL;    
    HMSGQ hMsgHandle;

    if(!param)
        return;
    hMsgHandle = (HMSGQ)param;
    if(NULL == (pMsg = (TMsg *)HOS_Malloc(DLOAD_MSG_MAXSIZE)))
        return NULL;

    while(1)
    {
         /*接收并处理消息*/
         HOS_Memset(pMsg,0,DLOAD_MSG_MAXSIZE);
         HOS_MsgRcv(hMsgHandle, pMsg, DLOAD_MSG_MAXSIZE, HOS_TRUE);
         DLoadMsgProc(pMsg);
    }
} 

int DLoadSaveHistory()
{
           
}

int DLoadGetHistory()
{
    
}

int DLoadInit(void *param)
{
    int bBootDload = FALSE; /*是否开机后自动下载*/
    //THList *pDLoadList = NULL;    /*下载任务列表*/
    //int DloadTaskN = 0;    /*当前下载任务个数*/
	char path[DLOAD_MAX_HOSTNAME] = DLOAD_RECORD_FILE;
    HMSGQ hMsgHandle = NULL;
    TMsg *pMyMsg = NULL;
    int ulVarLen; 
    TASK_ID hTaskId;
    
    DLOAD_PRINT("DLoad enter ...");
    /*初始化下载任务列表*/
    HList_Init(&g_DLoadList);
    DLoadInitList(&g_DLoadList, path);
        
    /* likun 读取配置项,开机是否启动下载,该处实现放在
    消息处理函数里面,当am广播业务开始才开始下载*/
    //CONFIG_ReadVarValue( , &bBootDload, sizeof(int));
    bBootDload = TRUE;
    if(bBootDload)
    {
        HList_Scan(&g_DLoadList, fnScanTaskAndStart);
    }

   /*创建消息队列*/
    hMsgHandle = HOS_MsgQCreate(MODULEID_DLOAD, DLOAD_INST_ID, 
                    DLOAD_MSG_MAXNUM, DLOAD_MSG_MAXSIZE);
   if(!hMsgHandle)
   {
        DLOAD_PRINT("Init DLoad Msg Failed!");
        return -1;
   }
   HOS_TaskCreate("DLoadReciveMsg",HOS_DETACH, 60, 32*1024, DLoadReciveMsgTask, hMsgHandle, &hTaskId);
   amNotifyStartupSucc(MODULEID_DLOAD);
   DLOAD_PRINT("DLOAD init success...");
   return 0;
}

/*获取断点续传任务的信息,
记录断点续传信息的文件扩展名命名规则如下:
BT: *.btbrfile
FTP: *.ftpbrfile
HTTP: *.httpbrfile
*/
int DLoadInitList(THList *pDLoadList, char *path)
{    
	int i, num;
	char *p;
    THListNode *pstTmpNode = NULL;
    //FtpHttpDLoadInfo *pstDLoadInfo = NULL;
    DLoadTaskPrivateInfo *pstDLoadTaskInfo = NULL;
    char filename[DLOAD_MAX_HOSTNAME];
    struct dirent **namelist;

    chdir(path);
    num = scandir(".", &namelist, 0 , alphasort);
    
	for(i = 0; i < num; i++) 
    {    
        strcpy(filename, namelist[i]->d_name);
        p = rindex(filename, '.');
		if(p++) 
        {                
			if(strcasecmp(p, DLOAD_HTTPFILE_EXT) == 0)
            {
                pstTmpNode = (THListNode *)malloc(sizeof(THListNode));
                if(!pstTmpNode)
                    return -1;
                memset(pstTmpNode, 0, sizeof(THListNode));
                pstDLoadTaskInfo = (DLoadTaskPrivateInfo *)malloc(sizeof(DLoadTaskPrivateInfo));
                if(NULL == pstDLoadTaskInfo)
                {
                    free(pstTmpNode);
                    return -1;
                }
                memset(pstDLoadTaskInfo, 0, sizeof(DLoadTaskPrivateInfo));
                HttpInitFileInfoFromFile(&(pstDLoadTaskInfo->pProtocolInfo), filename);
                HttpRegFinishCallback(pstDLoadTaskInfo->pProtocolInfo, DLoadFinishNotify);
                DLOAD_PRINT("Break Point: %d",pstDLoadTaskInfo->pProtocolInfo);
                HttpInitFnPlug(&(pstDLoadTaskInfo->fnPlug));
                pstDLoadTaskInfo->CurStat = DLOAD_STAT_PAUSE;
                pstDLoadTaskInfo->hDloadTaskHandle = DLoadTaskHandleCreat();
                pstTmpNode->pUserData = pstDLoadTaskInfo;                
                HList_AddTail(pDLoadList, pstTmpNode);
            }
            else if(strcasecmp(p, DLOAD_FTPBRFILE_EXT) == 0)
           {
                pstTmpNode = (THListNode *)malloc(sizeof(THListNode));
                if(!pstTmpNode)
                    return -1;
                memset(pstTmpNode, 0, sizeof(THListNode));
                pstDLoadTaskInfo = (DLoadTaskPrivateInfo *)malloc(sizeof(DLoadTaskPrivateInfo));
                if(NULL == pstDLoadTaskInfo)
                {
                    free(pstTmpNode);
                    return -1;
                }
                memset(pstDLoadTaskInfo, 0, sizeof(DLoadTaskPrivateInfo));
                FtpInitFileInfoFromFile(&(pstDLoadTaskInfo->pProtocolInfo),filename);
                FtpRegFinishCallback(pstDLoadTaskInfo->pProtocolInfo, DLoadFinishNotify);
                FtpInitFnPlug(&(pstDLoadTaskInfo->fnPlug));
                pstDLoadTaskInfo->CurStat = DLOAD_STAT_PAUSE;
                pstDLoadTaskInfo->hDloadTaskHandle = DLoadTaskHandleCreat();
                pstTmpNode->pUserData = pstDLoadTaskInfo;                
                HList_AddTail(pDLoadList, pstTmpNode);
            }
            else if(strcasecmp(p, DLOAD_BTBRFILE_EXT) == 0)
            {
                DLOAD_PRINT("BT protocol not be supported");
            }
            else
            {
                DLOAD_PRINT("wrong break-point notes file");
            }
             
        }
   }

   return 0;
}

int fnFindTaskByHandle(void *para, THListNode *pstRegList)
{
    DLoadTaskHandle HTaskHandle;
    DLoadTaskPrivateInfo *pTaskInfo = NULL;
    if(!para)
        return -1;

    HTaskHandle = *((DLoadTaskHandle *)para);
    pTaskInfo = (DLoadTaskPrivateInfo *)(pstRegList->pUserData);
    if(HTaskHandle == pTaskInfo->hDloadTaskHandle)
    {
        return 0;
    }
    else
        return -1;
}

int fnFindTaskByStat(void *para, THListNode *pstRegList)
{
    DLoadTaskStat CruStat;
    DLoadTaskPrivateInfo *pTaskInfo = NULL;
    if(!para)
        return -1;

    CruStat = *((DLoadTaskStat *)para);
    pTaskInfo = (DLoadTaskPrivateInfo *)(pstRegList->pUserData);
    if(CruStat == pTaskInfo->CurStat)
    {
        return 0;
    }
    else
        return -1;
}

/* likun 可以考虑统一使用开始接口*/
int fnScanTaskAndStart(void *para)
{
    DLOAD_PRINT("Start Break point transer");
    if(para)
    {
        DLoadTaskPrivateInfo *pstTmp = (DLoadTaskPrivateInfo *)para;
        if(g_DLoadTaskNum<DLOAD_MAX_TASK)
        {
            pstTmp->CurStat = DLOAD_STAT_DOING;
            pstTmp->fnPlug.fnStartTask(pstTmp->pProtocolInfo);
            g_DLoadTaskNum++;
        }
        else
        {
            pstTmp->CurStat = DLOAD_STAT_WAIT;
        }
        return 0;
    }

    return -1;
}


/*开始下载一个在等待的任务*/
int DLoadStartWaitTask()
{
    THListNode *pstTmpNode = NULL;
    DLoadTaskStat taskStat = DLOAD_STAT_WAIT;
    
    pstTmpNode = HList_Find(&g_DLoadList, 
                &taskStat,fnFindTaskByStat);
    if(pstTmpNode)
    {
        DLoadTaskPrivateInfo *pTmpTaskInfo = 
                (DLoadTaskPrivateInfo *)pstTmpNode->pUserData;
        pTmpTaskInfo->fnPlug.fnStartTask(pTmpTaskInfo->pProtocolInfo);
        pTmpTaskInfo->CurStat = DLOAD_STAT_DOING;
        g_DLoadTaskNum++;
    }
    return 0;
}

/*likun 后续实现*/
int DLoadGetFileInfoByFileID(DLoadNewTask *pNewTask, DLoadUrlInfo *pUrlInfo)
{
    DLOAD_PRINT("FileID: %s", pNewTask->FileID);
    if(0==strcmp(pNewTask->FileID, "http1"))
    {
        strcpy(pUrlInfo->DownloadUrl,"http://dx2.ylmf.org/YlmF_Vista_Lite_1.0/YlmF_Vista_Lite_1.0.iso");
        strcpy(pUrlInfo->FilePath, "/mnt/film/");
        pUrlInfo->protocolType = DLOAD_PROTOCOL_HTTP;
        pUrlInfo->threadNum = 10;
    }
    else if(0==strcmp(pNewTask->FileID, "http2"))
    {
        strcpy(pUrlInfo->DownloadUrl,"http://dl_dir.qq.com/qqfile/qq/QQ2008beta1efg/QQ2008Beta1_BlessingKB1.exe");
        strcpy(pUrlInfo->FilePath, "/mnt/film/");
        pUrlInfo->protocolType = DLOAD_PROTOCOL_HTTP;
        pUrlInfo->threadNum = 10;
    }
    else if(0==strcmp(pNewTask->FileID, "ftp1"))
    {
        strcpy(pUrlInfo->DownloadUrl,"ftp://61.184.100.17/北塔里的米字玛.mp3");
        strcpy(pUrlInfo->FilePath, "/mnt/film/");
        strcpy(pUrlInfo->Account, "fodian_user");
        strcpy(pUrlInfo->Password, "namofofa");
        pUrlInfo->protocolType = DLOAD_PROTOCOL_FTP;
        pUrlInfo->threadNum = 2;
    }
    else if(0==strcmp(pNewTask->FileID, "ftp2"))
    {
        strcpy(pUrlInfo->DownloadUrl,"ftp://ftp.stlinux.com/pub/stlinux/2.3/updates/RPMS/sh4/stlinux23-cross-sh4-gdb-6.5-27.i386.rpm");
        strcpy(pUrlInfo->FilePath, "/mnt/film/");
        //strcpy(pUrlInfo->Account, "fodian_user");
        //strcpy(pUrlInfo->Password, "namofofa");
        pUrlInfo->protocolType = DLOAD_PROTOCOL_FTP;
        pUrlInfo->threadNum = 10;
    }
    else
    {
        DLOAD_PRINT("Not surport protocol");
    }
    return 0;
}

int DLoadMsgProc(TMsg *pMsg)
{
    int ulMsgType;
    ulMsgType = pMsg->stMsgHdl.ulMsgType;

    switch(ulMsgType)
    {
        /*处理控制命令消息*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -