📄 network.cpp
字号:
/*
* ============================================================================
* Name : CNetwork from Network.cpp
* Part of : Engine
* Created : 2004-11-16 by Chen Yong
* Description:
* Implement main function of the network.
* Version :
* Copyright: Gameloft S.A.
* ============================================================================
*/
// INCLUDE FILES
#include "AEEWeb.h"
#include "AEETAPI.h"
#include "Network.h"
#include "..\game\game.h"
#include "engine.h"
CNetwork::CNetwork(CEngine *p)
{
m_pEngine = p;
bnickName = false;
buserID = false;
STRCPY(userID, "");
STRCPY(gameID, "");
STRCPY(nextSEQ, "");
STRCPY(webStatus, "");
//STRCPY(originURL, "http://10.35.199.244/bowling2d/new/bowling.php");
if( !getUrl(originURL) )
STRCPY(originURL, "http://10.35.199.244/bowling2d/new/bowling.php");
resultSize = 0;
resultOK = false;
statusOfLink = LINK_NONE;
statusOfWeb = WEB_MURL;
bOpponent = false;
bWopponent = false;
OpAveRank = 0;
OpWinRank = 0;
OpHighscore = 0;
bChallenge = true;
current_turn = 1;// the first turn of the game
statusOfOnline = WEB_STATE_NONE;
connecttime = 0;
m_bTimeOut = false;
m_nTickTime = 0;
m_nErrorType = -1;
errorcode = 0;
blogin = false;
m_Win = 0;
m_Loss = 0;
m_Draw = 0;
m_highScore = 0;
m_winRank = 0;
m_aveRank = 0;
bValidInfo = false;
bHighRankValid = false;
bAveRankValid = false;
bWinRankValid = false;
bgetGameResult = false;
STRCPY(nickName,"");
STRCPY(userID,"");
STRCPY(gameID,"");
STRCPY(nextSEQ,"");
STRCPY(OpuserID,"");
STRCPY(OpnickName,"");
MEMSET(pAveRank,0,sizeof(RANK_DATA)*MAX_RANK_NUM);
MEMSET(pWinRank,0,sizeof(RANK_DATA)*MAX_RANK_NUM);
}
CNetwork::~CNetwork()
{
CALLBACK_Cancel(&m_pEngine->m_Callback); // hint: prove to cancel the callback (maybe when the user press the end key when network still waitting for the call function)
}
void WebAction_Status(void *p, WebStatus ws, void *pVal)
{
CEngine* m_pEngine = (CEngine*) p;
CNetwork *pNetwork = m_pEngine->GetNetwork();
(void)pVal;
STRCPY(pNetwork->webStatus, "");
switch (ws) {
case WEBS_CANCELLED:
STRCPY(pNetwork->webStatus, "** cancelled...\n");
break;
case WEBS_GETHOSTBYNAME:
STRCPY(pNetwork->webStatus, "** finding host...\n");
break;
case WEBS_CONNECT:
STRCPY(pNetwork->webStatus, "** connecting...\n");
break;
case WEBS_SENDREQUEST:
STRCPY(pNetwork->webStatus, "** sending...\n");
break;
case WEBS_READRESPONSE:
STRCPY(pNetwork->webStatus, "** receiving...\n");
break;
case WEBS_GOTREDIRECT:
STRCPY(pNetwork->webStatus, "** redirect...\n");
break;
case WEBS_CACHEHIT:
STRCPY(pNetwork->webStatus, "** cache hit...\n");
break;
}
// show that status!
}
bool CNetwork::OpenUrl()
{
IWEBUTIL_MakeUrl( m_pEngine->m_pIWebUtil, originURL, url, allurl, 250);
DBGPRINTF("allurl %s" , allurl);
STRCPY(m_pEngine->GetNetwork()->result,"");
CALLBACK_Init(&m_pEngine->m_Callback, Webread , m_pEngine);
IWEB_GetResponse( m_pEngine->m_pIWeb, (m_pEngine->m_pIWeb,&m_pEngine->m_pIWebResp, &m_pEngine->m_Callback, allurl,
WEBOPT_HANDLERDATA, m_pEngine,
WEBOPT_HANDLERDATA, m_pEngine,
// WEBOPT_HEADERHANDLER, WebAction_Header,
WEBOPT_STATUSHANDLER, WebAction_Status,
WEBOPT_END));
return true;
}
void Webread(void *cxt)
{
CEngine* m_pEngine = (CEngine*) cxt;
CNetwork* m_pNetwork = m_pEngine->GetNetwork();
WebRespInfo * pWebRespInfo = IWEBRESP_GetInfo(m_pEngine->m_pIWebResp);
int ByteCount;
char buf[200];
STRCPY( m_pNetwork->webStatus, "");
if (pWebRespInfo && WEB_ERROR_SUCCEEDED(pWebRespInfo->nCode))
{
ISource* pISource = pWebRespInfo->pisMessage;
ByteCount = ISOURCE_Read(pISource, (char*)buf, sizeof(buf));
switch (ByteCount)
{
case ISOURCE_WAIT:
STRCPY( m_pNetwork->webStatus, "** waiting...\n");
ISOURCE_Readable(pISource, &m_pEngine->m_Callback);
return;
case ISOURCE_ERROR:
STRCPY( m_pNetwork->webStatus, "** error...\n");
break;
case ISOURCE_END:
m_pNetwork->result[ m_pNetwork->resultSize] = '\0';
m_pNetwork->resultOK = true;
DBGPRINTF("RESULT: %s", m_pNetwork->result);
CALLBACK_Cancel(&m_pEngine->m_Callback);
break;
default:
if(ByteCount)
{
if ( m_pNetwork->resultSize > 200)
{
DBGPRINTF("result too large");
return;
}
else
{
MEMCPY( m_pNetwork->result + m_pNetwork->resultSize, buf, ByteCount);
m_pNetwork->resultSize += ByteCount;
}
ISOURCE_Readable(pISource, &m_pEngine->m_Callback);
return;
}
}
}
}
bool CNetwork::getUrl(char *pUrl)
{
char str[100];
IFile * pIFile = NULL;
char *p,*q;
pIFile = IFILEMGR_OpenFile ( (IFileMgr*)m_pEngine->pFileMgr, ONLINE_URL_NAME, _OFM_READ);
if(pIFile == NULL)
{
DBGPRINTF("the file can not open: %s.",ONLINE_URL_NAME);
return false;
}
IFILE_Seek( pIFile, _SEEK_START, 0);
if (NULL != pIFile)
{
unsigned int count = IFILE_Read(pIFile, str,100);
if (count==0)// error, no data is readed
{
IFILE_Release( pIFile );
DBGPRINTF("the file can not open: %s.",ONLINE_URL_NAME);
return false;
}
if( count < 100)
str[count]=0;
p = STRSTR(str,"http:");
if( NULL == p )
{
IFILE_Release( pIFile );
DBGPRINTF("the file should include correct url begin with http.",ONLINE_URL_NAME);
return false;
}
q = STRSTR(str,".php");
if( NULL == q )
{
IFILE_Release( pIFile );
DBGPRINTF("the file should include correct url end with *.php.",ONLINE_URL_NAME);
return false;
}
q += 4;
if( q-p > 100 )
{
IFILE_Release( pIFile );
DBGPRINTF("the url address should be less than 100",ONLINE_URL_NAME);
return false;
}
STRNCPY(pUrl, str, q-p);
if( q-p < 100)
pUrl[q-p]=0;
}
return true;
}
bool CNetwork::generateUser()
{
#ifdef AEE_SIMULATOR
AEEDeviceInfo di;
di.wStructSize = sizeof(AEEDeviceInfo);
ISHELL_GetDeviceInfo(m_pEngine->m_pIShell, &di);
SPRINTF(userID, "%d", di.dwPlatformID);
buserID = true;
#else
TAPIStatus * ps;
if( m_pEngine->pITAPI )
{
ITAPI_GetStatus(m_pEngine->pITAPI, ps);
SPRINTF(userID, "%s", ps->szMobileID);
buserID = true;
}
else{
buserID = false;
}
#endif
return true;
}
void CNetwork::makeUrl()
{
switch(statusOfLink)
{
case LINK_SETNAME:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, UID);
STRCAT(url, userID);
STRCAT(url, "&");
STRCAT(url, NICK);
STRCAT(url, nickName);
break;
case LINK_IDLE:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, UID);
STRCAT(url, userID);
statusOfLink = LINK_LOGIN;
break;
case LINK_CHECK:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, UID);
STRCAT(url, userID);
if (bWopponent)
statusOfLink = LINK_CHALLENGE;
else if (bOpponent)
statusOfLink = LINK_A_CHALLENGE;
break;
case LINK_CHALLENGE:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, UID);
STRCAT(url, userID);
STRCAT(url, "&");
STRCAT(url, CHALLENGE);
if (bChallenge)
STRCAT(url, "Y");
else
STRCAT(url, "N");
break;
case LINK_A_CHALLENGE:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, UID);
STRCAT(url, userID);
STRCAT(url, "&");
STRCAT(url, ACCEPT_CHALLENGE);
if (bChallenge)
STRCAT(url, "Y");
else
STRCAT(url, "N");
break;
case LINK_GETNAME:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, GETPSEUDO);
STRCAT(url, userID);
break;
case LINK_GETOPNAME:
STRCPY(url, "");
STRCAT(url, "?");
//STRCAT(url, GETPSEUDO);
STRCAT(url, GETINFO);
STRCAT(url, OpuserID);
break;
case LINK_GAME_RUN:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, UID);
STRCAT(url, userID);
STRCAT(url, "&");
STRCAT(url, GID);
STRCAT(url, gameID);
if (!STREQ(nextSEQ ,""))
{
STRCAT(url, "&");
STRCAT(url, NEXT_SEQ);
STRCAT(url, nextSEQ);
}
break;
case LINK_CLEAR:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, UID);
STRCAT(url, userID);
STRCAT(url, "&");
STRCAT(url, "UCLEAR");
statusOfLink = LINK_CLEAR;
break;
case LINK_GETINFO:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, GETINFO);
STRCAT(url, userID);
break;
case LINK_LOGIN:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, UID);
STRCAT(url, userID);
STRCAT(url, "&");
STRCAT(url, LOGIN);
break;
case LINK_GETHIGHRANK:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, HIGHRANK);
break;
case LINK_GETAVERANK:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, AVERANK);
break;
case LINK_GETWINRANK:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, WINRANK);
break;
case LINK_RESET:
STRCPY(url, "");
STRCAT(url, "?");
STRCAT(url, RESETPRO);
STRCAT(url, userID);
break;
}
statusOfWeb = WEB_OPEN;
}
int CNetwork::parseResult()
{
int i,j;
int numInfo = 0;
char * temp;
char error[10];
STRCPY(returnInfo[0], "");
STRCPY(returnInfo[1], "");
STRCPY(returnVal, "");
for (i=0; result[i] != '\0'; i++)
{
if(result[i] == '(')
{
i++;
for (j = 0; result[i] != ')' && result[i] != '\0'; i++, j++)
{
returnInfo[numInfo][j] = result[i];
}
returnInfo[numInfo][j] = '\0';
numInfo++;
continue;
}
if(result[i] == '[')
{
i++;
for (j = 0; result[i] != ']' && result[i] != '\0'; i++, j++)
{
returnVal[j] = result[i];
}
returnVal[j] = '\0';
continue;
}
}
if (STRBEGINS("BOWLING_ERR" ,returnVal))
{
if( statusOfOnline == WEB_STATE_INIT )
{
statusOfOnline = WEB_STATE_NONE;
resultSize = 0;//clear the result size
statusOfWeb = WEB_MURL;
return 0;
}
temp = STRCHREND(returnVal, ':');
temp++;
STRNCPY( error, temp, 10);
if( STRLEN(temp) < 10)
error[STRLEN(temp)]=0;
errorcode = ATOI(error);
if (errorcode == 404)
errorcode = 14;
statusOfWeb = WEB_MURL;
statusOfLink = LINK_CLEAR;
resultSize = 0;//clear the result size
return -errorcode;//-errorcode bowling error
}
if ((STRBEGINS("CONNECTION LOST WITH OPPONENT", returnInfo[0])))
{
statusOfWeb = WEB_MURL;
statusOfLink = LINK_CLEAR;
m_nErrorType = LINK_ERROR_LOSTOP;
resultSize = 0;//clear the result size
return -m_nErrorType;
}
switch(statusOfLink)
{
case LINK_SETNAME:
if(STREQ(returnInfo[0] , "FREE"))
{
if(!bnickName)
bnickName = true;
}
else
{
DBGPRINTF("NETWORK ERR: SET NICK NAME----%s", returnInfo[0]);
m_nErrorType = LINK_ERROR_SETNICK;
}
break;
case LINK_LOGIN:
if(STREQ(returnInfo[0] , "IDLE"))
{
blogin = true;
statusOfLink = LINK_IDLE;
}
else if (STRBEGINS("OPPONENT=", returnInfo[0]))
{
blogin = true;
temp = STRCHREND(returnInfo[0], '=');
temp++;
STRNCPY( OpuserID, temp, 20);
if(STRLEN(temp)<20)
OpuserID[STRLEN(temp)]=0;
if (STRBEGINS("CHALLENGE=" , returnVal))
{
bWopponent = true;
bOpponent = false;
statusOfLink = LINK_GETOPNAME;
}
else if (STRBEGINS("ACCEPT_CHALLENGE=" , returnVal))
{
bWopponent = false;
bOpponent = true;
statusOfLink = LINK_GETOPNAME;
}
}
else
{
DBGPRINTF("NETWORK ERR: LOGIN----%s", returnInfo[0]);
m_nErrorType = LINK_ERROR_LOGIN;
}
break;
case LINK_GETNAME:
if(STRBEGINS("NICK: ", returnInfo[0]))
{
temp = STRCHREND(returnInfo[0], ' ');
temp++;
STRNCPY( nickName, temp, 10);
if( STRLEN(temp)<10 )
nickName[STRLEN(temp)]=0;
bnickName = true;
}
else{
DBGPRINTF("NETWORK ERR: SET NICK----%s", returnInfo[0]);
m_nErrorType = LINK_ERROR_GETNICK;
}
break;
case LINK_GETOPNAME:
if(STRBEGINS("NICK:", returnInfo[0]))
{
char result[128];
char *p,*q;
char temp[16];
STRCPY(result,returnInfo[0]);
//get win/loss/draw
p = STRSTR(result, "NICK");
if( p == NULL )
{
//GET RESULT ERROR
DBGPRINTF("NETWORK ERR: GET OPPONENT NICK----%s", returnInfo[0]);
m_nErrorType = LINK_ERROR_GETOPNICK;
break;
}
p+= 5;
q = STRSTR(p, ",");
STRNCPY(OpnickName, p, q-p);
OpnickName[q-p]=0;
//get rank score
p = STRSTR(result, "HIGHSCORE");
if( p == NULL )
{
//GET RESULT ERROR
DBGPRINTF("NETWORK ERR: GET OPPONENT NICK----%s", returnInfo[0]);
m_nErrorType = LINK_ERROR_GETOPNICK;
break;
}
p += 10;
q = STRSTR(p, ",");
STRNCPY(temp, p, q-p);
temp[q-p]=0;
OpHighscore = ATOI(temp);
//get win rank
p = STRSTR(result, "WINRANK");
if( p == NULL )
{
//GET RESULT ERROR
DBGPRINTF("NETWORK ERR: GET OPPONENT NICK----%s", returnInfo[0]);
m_nErrorType = LINK_ERROR_GETOPNICK;
break;
}
p += 8;
q = STRSTR(p, ",");
STRNCPY(temp, p, q-p);
temp[q-p]=0;
OpWinRank = ATOI(temp);
//get average rank
p = STRSTR(result, "SCORERANK");
if( p == NULL )
{
//GET RESULT ERROR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -