📄 dload.c
字号:
/***********************************************************************
* 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 + -