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

📄 net.c

📁 这一款新闻类业务的源码
💻 C
📖 第 1 页 / 共 2 页
字号:

//接收服务器端传送的内容
void RecvWebBody(void *p)
{
	Newsddt * pme = (Newsddt *)p;
	WebRespInfo * pwri;
	int32	dwSize;
	char *	pszC = NULL;

	if(!pme->m_bWeb)
		return;
	pwri = IWEBRESP_GetInfo(pme->m_pIWebResp);
	ISHELL_SetTimer(pme->a.m_pIShell, WEB_TIMEOUT, (PFNNOTIFY)Net_Timeout, pme);
	if(pme->m_pWebBody == NULL)
	{
		if(pwri->lContentLength > 0)
		{
			pme->m_pWebBody = MALLOC(pwri->lContentLength + 1);
			MEMSET(pme->m_pWebBody, 0, pwri->lContentLength);
		}
		else if(pwri->lContentLength == 0)
		{
			if(pme->m_pIWebResp)
				IWEBRESP_Release(pme->m_pIWebResp);
			pme->m_pIWebResp = NULL;
			ISHELL_CancelTimer(pme->a.m_pIShell, (PFNNOTIFY)Net_Timeout, pme);
			AnalyzeResponse(pme);
			return;
		}
		else
		{
			ShowErrMsg(pme, IDS_ERR_LENGTH, 0);
			if(pme->m_pIWebResp)
				IWEBRESP_Release(pme->m_pIWebResp);
			pme->m_pIWebResp = NULL;
			return;
		}
	}

	dwSize = ISOURCE_Read(pwri->pisMessage,
                         (char *)pme->m_pWebBody + pme->m_dwRecvSize,
                         (int)pwri->lContentLength - pme->m_dwRecvSize);
	if(dwSize > 0)
		pme->m_dwRecvSize += dwSize;
	DrawStatus(pme);
	//DBGPRINTF("Recv Size:%d", pme->m_dwRecvSize);
	switch(dwSize)
	{
	case ISOURCE_WAIT:
		CALLBACK_Init(&pme->m_cbWebBody, RecvWebBody, pme);
		ISOURCE_Readable(pwri->pisMessage, &pme->m_cbWebBody);
		break;
	case ISOURCE_ERROR:	//出现错误
		ShowErrMsg(pme, IDS_ERR_ISOUCE, 0);
		break;
	default:
		if(dwSize != ISOURCE_END && (long)pme->m_dwRecvSize < pwri->lContentLength)
		{
			//DBGPRINTF("Length is%d", pwri->lContentLength);
			CALLBACK_Init(&pme->m_cbWebBody, RecvWebBody, pme);
			ISOURCE_Readable(pwri->pisMessage, &pme->m_cbWebBody);
			break;
		}
		//接收完毕,调用相应的内容处理程序
		//pme->m_dwRecvSize = 0;
		if(pme->m_pIWebResp)
			IWEBRESP_Release(pme->m_pIWebResp);
		pme->m_pIWebResp = NULL;
		pme->m_bWeb = FALSE;
		ISHELL_CancelTimer(pme->a.m_pIShell, (PFNNOTIFY)Net_Timeout, pme);
	
		pszC = GetPartString(pme->m_pszContentType , '#' , 0);
        if (pszC && !STRCMP(pszC,"@35"))
        {
            ReadyDownload(pme);
            FREEIF(pszC);
            pme->m_dwRecvSize = 0;
            FREEIF(pme->m_pWebBody);
            Net_Stop(pme);
            break;
        }
		switch ( ATOI(pszC) )
		{
        case SERVERNOTIFY_RecomandList:     //精彩推荐列表:
		case SERVERNOTIFY_ListItem:         //取系统列表
        case SERVERNOTIFY_ListCate:         //取系统列表分类
        case SERVERNOTIFY_VaneSearch:       //风向标搜索
            pme->m_eInpType = INPUTTEXT_NULL;//必须先接收完后台信息才能改变输入框状态
			AnalyzeResponse(pme);
            break;
        case SERVERNOTIFY_CustomList:       //栏目定制
            pme->m_enCustState = CUST_STATE_AddChannel;//这种类似的问题都要在获取了后台提供的列表后再改变状态
            if (pme->m_nIdx>=1)
            {
                List_DeleteAll(pme,pme->m_nIdx);
                pme->m_nIdx--;
            }
            AnalyzeResponse(pme);
            break;
        case SERVERNOTIFY_HotSearch:        //热点搜索
            if(pme->m_pWebBody == NULL)
            {
                ShowErrMsg(pme, IDS_ERR_RESPNULL, 0);
                return;
            }
            List_Save(pme,LIST_HotSearch);
            if(!PROMPTBOX_IsActive(pme->m_ppbMsg))
                List_Show(pme);
            FREEIF(pme->m_pWebBody);
            break;
		case SERVERNOTIFY_ChatList:         //新闻评论列表
            pme->m_eInpType = INPUTTEXT_NULL;//必须先接收完后台信息才能改变输入框状态
            List_DeleteAll(pme,pme->m_nIdx);
            pme->m_nIdx--;
            AnalyzeResponse(pme);
            break;
        case SERVERNOTIFY_KeySearch:        //关键字搜索
            pme->m_eInpType = INPUTTEXT_NULL;//必须先接收完后台信息才能改变输入框状态
            if(pme->m_pWebBody == NULL)
            {
                ShowErrMsg(pme, IDS_ERR_RESPNULL, 0);
                return;
            }
            List_Save(pme,LIST_SearchRes);
            if(!PROMPTBOX_IsActive(pme->m_ppbMsg))
                List_Show(pme);
            FREEIF(pme->m_pWebBody);
            break;
		case SERVERNOTIFY_File:             //取系统文件
			ReadyDownload(pme);
			break;
        case SERVERNOTIFY_Help:             //帮助
            ShowText(pme,(char*)pme->m_pWebBody,IDS_HELP_TITLE);
            break;
        case SERVERNOTIFY_Chat:             //新闻评论
            {
                AECHAR *    pHelpTxt = NULL;
                CtlAddItem  ai = {0};

                pme->m_bNewsComment = TRUE;
                if (pme->m_pList[pme->m_nIdx])
                {
                    IMENUCTL_GetItem(pme->m_pList[pme->m_nIdx],IMENUCTL_GetSel(pme->m_pList[pme->m_nIdx]),&ai);
                    if(pme->m_nIdx>=0)
                        IMENUCTL_SetActive(pme->m_pList[pme->m_nIdx], FALSE);
                }
                pHelpTxt = GetWSTR((const byte *)pme->m_pWebBody,pHelpTxt);
                if(pHelpTxt && PROMPTBOX_SetText(pme->m_ppbMsg,(AECHAR*)ai.pText,pHelpTxt))
                    PROMPTBOX_SetActive(pme->m_ppbMsg, TRUE);

                //设置Softkey
                Newsddt_SetSoftkey(pme);
                FREEIF(pHelpTxt);
            }
            break;
        case SERVERNOTIFY_Err:              //= -1 后台返回的错误信息
            pme->m_nDataType = -1;
            AnalyzeResponse(pme);
            break;
        case SERVERNOTIFY_PublicOK:         //= -2 评论发表成功
            pme->m_eInpType = INPUTTEXT_NULL;//必须先接收完后台信息才能改变输入框状态
            ShowErrMsg(pme, IDS_OPERATION_OK, 0);
            break;
		default:    //错误
			ShowErrMsg(pme, IDS_ERR_RESPFORMAT, 0);
			break;
		}
		FREEIF(pszC);
		pme->m_dwRecvSize = 0;
        FREEIF(pme->m_pWebBody);
		Net_Stop(pme);
		break;
	}

}

//对接收到的图书内容进行处理
void ReadyDownload(Newsddt * pme)
{
    uint32      nTxtSize = 0;
    uint32      nTxtLen = 0;
    AECHAR *    pNewsText = NULL;
    FileError   FileErrInfo = FI_SUCCESS;
    boolean     bFileExist = FALSE;

    //清除临时文件
    DelTemp(pme);

    {//过滤新闻内容中的<img...>和<br/>
        char *pTmNews = NULL;
        pTmNews = STRSTR((char*)pme->m_pWebBody,"<br/>");
        while (pTmNews)
        {
            MEMSET(pTmNews,' ',5);
            *(pTmNews+4) = '\n';
            pTmNews = STRSTR((char*)pme->m_pWebBody,"<br/>");
        }
        pTmNews = STRSTR((char*)pme->m_pWebBody,"<img");
        while (pTmNews&&STRLEN(pTmNews)>0)
        {
            char *pTmStart = pTmNews;
            char *pImgEnd = STRCHR((char*)pTmNews,'>');

            if (!pImgEnd)
            {
                break;
            }
            pImgEnd += 1;
            while(*pImgEnd!='\0')
            {
                *pTmStart = *pImgEnd;
                pTmStart++;
                pImgEnd++;
            }

            pTmNews = STRSTR((char*)pTmNews,"<img");
            *(pTmStart)='\0';//在新闻的最后加入结束符号
        }
    }

    pNewsText = GetWSTR((const byte*)pme->m_pWebBody,pNewsText);
    if (!pNewsText)
    {
        //显示错误信息
        ShowErrMsg(pme,IDS_ERR_SAVEBOOK,0);//show message
        goto end;
    }


    //确定转换后的内容的size
    nTxtLen = WSTRLEN(pNewsText);
    nTxtSize = nTxtLen*sizeof(AECHAR);
    if(nTxtSize == 0)
    {
        //显示错误信息
        ShowErrMsg(pme,IDS_ERR_SAVEBOOK,0);//show message
        goto end;
    }

    //保存文件
	FileErrInfo = SaveBufToFile(pme->m_pFileMgr, TEMPSAVEF, pNewsText, nTxtSize, NULL,NULL);

    switch(FileErrInfo)
    {
    case FI_FAILED:          //失败
    case FI_NOCREATE:        //创建失败
        //显示错误信息
        ShowErrMsg(pme,IDS_ERR_SAVEBOOK,0);//show message
        goto end;
    case FI_NOSPACE:         //空间不足
        //显示错误信息
        ShowErrMsg(pme,IDS_ERR_NOSPACE,0);//show message
        goto end;
    case FI_EXIST:           //文件已经存在
        //说明此文件已经存在于收藏夹中
        bFileExist = TRUE;
        break;
    case FI_SUCCESS:         //成功
    default:
        break;
    }

    //设置阅读文件
    ReadText_SetReadFile(pme,TEMPSAVEF,0);
end:
    FREEIF(pme->m_pWebBody);    //释放接收到的内容
    FREEIF(pNewsText);          //释放临时分配的资源
}

//分析接收到的BODY
void AnalyzeResponse(Newsddt * pme)
{
	if(pme->m_pWebBody == NULL)
	{
		ShowErrMsg(pme, IDS_ERR_RESPNULL, 0);
		return;
	}
    //精彩推荐
    if (pme->m_eAppState == APP_STATE_Recomand && pme->m_nDataType == -1)
    {
        AECHAR * pszW1 = NULL;
        AECHAR * pszW2 = NULL;
        CtlAddItem ai = {0};

        if(pme->m_nIdx>=0) IMENUCTL_SetActive(pme->m_pList[pme->m_nIdx], FALSE);

        //标题
        IMENUCTL_GetItem(pme->m_pList[pme->m_nIdx],IMENUCTL_GetSel(pme->m_pList[pme->m_nIdx]),&ai);
        //内容
        pszW2 = GetWSTR((const byte*)pme->m_pWebBody, NULL);
        if (ai.pText)
        {
            if(PROMPTBOX_SetText(pme->m_ppbMsg, pszW1, pszW2))
            {
                PROMPTBOX_SetActive(pme->m_ppbMsg, TRUE);
            }
        }

        //设置Softkey
        Newsddt_SetSoftkey(pme);
        FREEIF(pszW2);
    }
    else if (pme->m_eAppState != APP_STATE_Recomand && pme->m_nDataType == -1)
    {
        ShowText(pme,(char*)pme->m_pWebBody,IDS_SUC_TITLE);
    }
    else
    {
	    List_Save(pme,LIST_Default);
	    if(!PROMPTBOX_IsActive(pme->m_ppbMsg))
		    List_Show(pme);
    }

	FREEIF(pme->m_pWebBody);
	pme->m_pWebBody = NULL;
	return;
}


void Net_Timeout(Newsddt * pme)
{
	if(!pme->m_bWeb)
		return;
	//DBGPRINTF("Net_Timeout");
	Net_Stop(pme);
	//Web_Init(pme);
	ShowErrMsg(pme, IDS_ERR_WEBTIMEOUT, 0);
}

⌨️ 快捷键说明

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