📄 net.c
字号:
#include "newsddt.h"
boolean Net_Init(Newsddt * pme)
{
WebOpt awo[12];
int i = 0;
AECHAR wszVer[16];
char szVer[16];
char szPLAT[16];
char szIMSI[32];
//char szPT[16];
//char szLT[16];
//AEERect rc;
if(pme->m_pIWeb)
IWEB_Release(pme->m_pIWeb);
ISHELL_CreateInstance(pme->a.m_pIShell, AEECLSID_WEB, (void **)(&pme->m_pIWeb));
awo[i].nId = WEBOPT_FLAGS;
awo[i].pVal = (void *)(WEBREQUEST_REDIRECT | WEBREQUEST_FORCENEWCONN);
i++;
awo[i].nId = WEBOPT_USERAGENT;
awo[i].pVal = (void *)"JTB";
i++;
awo[i].nId = WEBOPT_HEADER;
awo[i].pVal = (void *)"Content-Type:application/x-www-form-urlencoded";
i++;
awo[i].nId = WEBOPT_HEADER;
SPRINTF(szPLAT, "PLAT:%d\r\n", pme->m_dwPlatformID);
awo[i].pVal = (void *)szPLAT;
i++;
awo[i].nId = WEBOPT_HEADER;
ISHELL_GetAppVersion(pme->a.m_pIShell, wszVer, sizeof(wszVer));
STRCPY(szVer, "VER:");
WSTRTOSTR(wszVer, szVer + STRLEN(szVer), sizeof(szVer) - STRLEN(szVer));
STRCAT(szVer, "\r\n");
awo[i].pVal = (void *)szVer;
i++;
awo[i].nId = WEBOPT_HEADER;
#ifdef AEE_SIMULATOR
SPRINTF(szIMSI, "IMSI:%s\r\n", "460030900000000");
#else
SPRINTF(szIMSI, "IMSI:%s\r\n", pme->m_szMobileID);
#endif
awo[i].pVal = (void *)szIMSI;
i++;
//awo[i].nId = WEBOPT_HEADER;
//SPRINTF(szPT, "PT:%d\r\n", pme->m_pt);
//awo[i].pVal = (void *)szPT;
//i++;
//awo[i].nId = WEBOPT_HEADER;
//SPRINTF(szLT, "LT:%d\r\n", pme->m_lt);
//awo[i].pVal = (void *)szLT;
//i++;
awo[i].nId = WEBOPT_END;
IWEB_AddOpt(pme->m_pIWeb, awo);
ISHELL_CreateInstance(pme->a.m_pIShell, AEECLSID_WEBUTIL, (void **)(&pme->m_pIWebUtil));
pme->m_pIWebResp = NULL;
pme->m_pWebBody = NULL;
pme->m_pszLocation = NULL;
pme->m_pszContentType = NULL;
pme->m_pszParam = NULL;
//载入状态字符串
return TRUE;
}
void Net_Free(Newsddt * pme)
{
FREEIF(pme->m_pszParam);
pme->m_pszParam = NULL;
Net_Stop(pme);
if(pme->m_pIWeb)
IWEB_Release(pme->m_pIWeb);
pme->m_pIWeb = NULL;
if(pme->m_pIWebUtil)
IWEBUTIL_Release(pme->m_pIWebUtil);
pme->m_pIWebUtil = NULL;
FREEIF(pme->m_pszLocation);
pme->m_pszLocation = NULL;
FREEIF(pme->m_pszContentType);
pme->m_pszContentType = NULL;
}
void Net_Stop(Newsddt * pme)
{
ISHELL_CancelTimer(pme->a.m_pIShell, (PFNNOTIFY)Net_Timeout, pme);
if(!pme->m_bWeb)
return;
if(pme->m_cbWebBody.pfnCancel != NULL)
{
CALLBACK_Cancel(&pme->m_cbWebBody);
}
if(pme->m_cbWebResp.pfnCancel != NULL)
{
CALLBACK_Cancel(&pme->m_cbWebResp);
}
if(pme->m_pIWebResp != NULL)
{
IWEBRESP_Release(pme->m_pIWebResp);
pme->m_pIWebResp = NULL;
}
FREEIF(pme->m_pWebBody);
pme->m_pWebBody = NULL;
pme->m_dwRecvSize = 0;
pme->m_bWeb = FALSE;
}
boolean MakeURL(Newsddt * pme, const char * cpszParam)
{
//精彩推荐
char *pWebHost = NULL;
if (pme->m_eAppState == APP_STATE_Recomand)
{
pWebHost = WEB_HOST_RECOMMEND;
}
else
{
pWebHost = WEB_HOST;
}
if(cpszParam && (pme->m_pszParam != cpszParam))
{
FREEIF(pme->m_pszParam);
pme->m_pszParam = STRDUP(cpszParam);
}
if(pme->m_pszLocation)
{
if(!STRBEGINS("http://", pme->m_pszLocation))
{
SPRINTF(pme->m_pszURL, "%s%s", pWebHost, cpszParam); //精彩推荐
}
else
{
SPRINTF(pme->m_pszURL, "%s%s", pWebHost, pme->m_pszParam);
}
}
else
SPRINTF(pme->m_pszURL, "%s%s", pWebHost, cpszParam); //精彩推荐
DBGPRINTF("**%s**",pme->m_pszURL);
return TRUE;
}
boolean SendRequest(Newsddt * pme)
{
CALLBACK_Init(&pme->m_cbWebResp, GotResponse, pme);
IWEB_GetResponse(pme->m_pIWeb,
(pme->m_pIWeb, &pme->m_pIWebResp, &pme->m_cbWebResp, pme->m_pszURL,
WEBOPT_HANDLERDATA, pme,
WEBOPT_HEADER, "X-Method: GET\r\n",
WEBOPT_HEADERHANDLER, GotHeader,
WEBOPT_STATUSHANDLER, GotStatus,
WEBOPT_END));
pme->m_bWeb = TRUE;
ISHELL_SetTimer(pme->a.m_pIShell, WEB_TIMEOUT, (PFNNOTIFY)Net_Timeout, pme);
return TRUE;
}
void GotHeader(void *p, const char *cpszName, GetLine *pglVal)
{
Newsddt * pme = (Newsddt *)p;
if(!pme->m_bWeb)
return;
if ((char *)0 != cpszName)
{
ISHELL_SetTimer(pme->a.m_pIShell, WEB_TIMEOUT, (PFNNOTIFY)Net_Timeout, pme);
//DBGPRINTF("GotHeader: %s = %s", cpszName, pglVal->psz);
//精彩推荐
if(0 == STRICMP(cpszName, "Notify"))
{
pme->m_nDataType = ATOI(pglVal->psz);
}
else if(0 == STRICMP(cpszName, "Location"))
{
if(pme->m_pszLocation == NULL || 0 != STRICMP(pme->m_pszLocation, pglVal->psz))
{
FREEIF(pme->m_pszLocation);
pme->m_pszLocation = STRDUP(pglVal->psz);
return;
}
}
if(0 == STRICMP(cpszName, "Content-Length"))
{
pme->m_dwContentSize = STRTOUL(pglVal->psz, NULL, 0);
return;
}
/*
if(0 == STRICMP(cpszName, "Content-Type"))
{
if(pme->m_pszContentType == NULL || 0 != STRICMP(pme->m_pszContentType, pglVal->psz))
{
FREEIF(pme->m_pszContentType);
pme->m_pszContentType = GetPartString(STRLOWER(pglVal->psz), ';', 0);
return;
}
}
*/
if ( 0 == STRICMP(cpszName, "Notify") )
{
if(pme->m_pszContentType == NULL || 0 != STRICMP(pme->m_pszContentType, pglVal->psz))
{
FREEIF(pme->m_pszContentType);
pme->m_pszContentType = GetPartString(STRLOWER(pglVal->psz), ';', 0);
return;
}
}
}
}
void GotStatus(void *p, WebStatus ws, void *pVal)
{
Newsddt * pme = (Newsddt *)p;
ISHELL_SetTimer(pme->a.m_pIShell, WEB_TIMEOUT, (PFNNOTIFY)Net_Timeout, pme);
pme->m_ws = ws;
DrawStatus(pme);
}
void DrawStatus(Newsddt * pme)
{
AECHAR szText[16]={0};
AEERect rc;
rc.x = 0;
rc.dy = BAR_BOTTOM;
rc.y = pme->m_nDevHeight - rc.dy;
rc.dx = pme->m_nDevWidth;
switch(pme->m_ws)
{
case WEBS_STARTING:
WSTRCPY(szText, pme->m_wszCon);
break;
case WEBS_GETHOSTBYNAME:
WSTRCPY(szText, pme->m_wszCon);
break;
case WEBS_CONNECT:
WSTRCPY(szText, pme->m_wszCon);
break;
case WEBS_SENDREQUEST:
WSTRCPY(szText, pme->m_wszSend);
break;
case WEBS_READRESPONSE:
WSTRCPY(szText, pme->m_wszRecv);
if(pme->m_dwContentSize > 0)
{
char szTmp[8];
SPRINTF(szTmp, "(%d%%)", pme->m_dwRecvSize * 100 / pme->m_dwContentSize);
STRTOWSTR(szTmp, szText + WSTRLEN(szText), sizeof(szText));
}
break;
default:
break;
}
if(WSTRLEN(szText) > 0)
{
RGBVAL rgb;
IDISPLAY_DrawRect(pme->a.m_pIDisplay, &rc, RGB_TEXT, RGB_BK, IDF_RECT_FRAME | IDF_RECT_FILL);
rgb = IDISPLAY_SetColor(pme->a.m_pIDisplay, CLR_USER_TEXT, RGB_TEXT);
IDISPLAY_DrawText(pme->a.m_pIDisplay, AEE_FONT_NORMAL, szText, -1, rc.x + 2, rc.y, &rc, IDF_ALIGN_LEFT | IDF_TEXT_TRANSPARENT);
IDISPLAY_SetColor(pme->a.m_pIDisplay, CLR_USER_TEXT, rgb);
IDISPLAY_Update(pme->a.m_pIDisplay);
}
}
void GotResponse(void *p)
{
Newsddt * pme = (Newsddt *)p;
WebRespInfo * pwri;
if(!pme->m_bWeb)
return;
pwri = IWEBRESP_GetInfo(pme->m_pIWebResp);
//DBGPRINTF("GotResponse: %d", pwri->nCode);
switch(pwri->nCode)
{
case 302: //重定向处理,仅登录的时候可能
if(pme->m_pIWebResp)
IWEBRESP_Release(pme->m_pIWebResp);
pme->m_pIWebResp = NULL;
MakeURL(pme, pme->m_pszParam);
SendRequest(pme);
break;
case 200: //正确,接收
RecvWebBody(pme);
return;
case 404: //出现错误(不存在、超时等)
ShowErrMsg(pme, IDS_ERR_404, 0);
break;
default:
ShowErrMsg(pme, IDS_ERR_WEB, pwri->nCode);
break;
}
if(pme->m_pIWebResp)
{
IWEBRESP_Release(pme->m_pIWebResp);
pme->m_pIWebResp = NULL;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -