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

📄 network.cpp

📁 一个3D的保龄球的源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*
* ============================================================================
*  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 + -