📄 net.c
字号:
//接收服务器端传送的内容
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 + -