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

📄 gatewayproxyprotocol.cpp

📁 C++实现的brew程序管理器例子
💻 CPP
字号:

//---------------- Inculde ------------------
#include "GatewayProxyProtocol.h"
#include "AEEStdlib.h"
//-------------------------------------------



// Decode SMS according to the protocol
// pszText[in]: SMS text to be decoded
// pInfo[out]: The buffer to be filed after decoded
boolean PROTOCOL_SMSDecode(char *pszText, SMSInfo *pInfo)
{
	// Parameter is ok?
	if(!pszText || !pInfo)
	{
		return FALSE;
	}
	// Get first field (CLSID)
	char *pszFind = STRCHR(pszText, PROTOCOL_SEPARATOR);
	//class id = 0X0132ef23 可能以0x132ef23格式传过来, 因此无法从长度判断
	if(!pszFind /*|| (pszFind - pszText != PROTOCOL_CLSID_LEN && pszFind - pszText != PROTOCOL_CLSID_LEN + 2)*/)
	{
		return FALSE;
	}
	// Save CLSID
	pInfo->clsApp = PROTOCOL_HEXSTRToUINT32(pszText);
	
	// Get second field(IMSI)
	pszText = pszFind + 1;
	pszFind = STRCHR(pszText, PROTOCOL_SEPARATOR);
	//if(!pszFind || pszFind - pszText != PROTOCOL_IMSI_LEN)
	if(!pszFind || pszFind - pszText > PROTOCOL_IMSI_LEN)
	{
		return FALSE;
	}
	// Save IMSI
	STRNCPY(pInfo->szIMSI, pszText, PROTOCOL_IMSI_LEN);
	pInfo->szIMSI[PROTOCOL_IMSI_LEN] = 0;
	
	//Get third field (Notify type)
	pszText = pszFind + 1;
	/*
	//has separator to end
	pszFind = STRCHR(pszText, PROTOCOL_SEPARATOR);
	if(!pszFind || pszFind - pszText > 5)
	{
		return FALSE;
	}
	*/
	// Change text to num
	*pszFind = 0;
	pInfo->wType = ATOI(pszText);
	*pszFind = PROTOCOL_SEPARATOR;
	// Type is ok?
	if(pInfo->wType < PROTOCOL_TYPE_MIN || pInfo->wType > PROTOCOL_TYPE_MAN)
	{
		return FALSE;
	}

	return TRUE;
}

// Convert HEX string to uint32 value
// pszText[in]: hex string
uint32 PROTOCOL_HEXSTRToUINT32(const char *pszText)
{
	uint32 dwValue = 0;
	char *pszTemp = (char *)pszText;

	if(!pszTemp)
	{
		return dwValue;
	}
	// The first character is "0x" or "0X"?
	if(pszTemp[0] == '0' && (pszTemp[1] == 'x' || pszTemp[1] == 'X'))
	{
		pszTemp += 2;
	}
	//
	while(*pszTemp != 0)
	{
		if(*pszTemp >= '0' && *pszTemp <= '9')
		{
			dwValue *= 16;
			dwValue += *pszTemp - '0';
		}
		else if(*pszTemp >= 'A' && *pszTemp <= 'F')
		{
			dwValue *= 16;
			dwValue += *pszTemp + 10 - 'A';
		}
		else if(*pszTemp >= 'a' && *pszTemp <= 'f')
		{
			dwValue *= 16;
			dwValue += *pszTemp + 10 - 'a';
		}
		else
		{
			return dwValue;
		}
		//
		pszTemp++;
	}

	return dwValue;
}

/*
	⑴如果CatalogID下存在子目录,返回
		ErrorCode=2%CatalogCount=3%CatID=0: 图片&1: 流媒体&2: 在线游戏%
	⑴如果CatalogID下不存在子目录,返回服务列表,返回
		ErrorCode=1%CatalogCount =3% CatID =1100: 推箱子&1101: CS游戏&1102:俄罗斯方块%
	⑵如果不存在服务或子目录,返回
				ErrorCode=0%
*/
AppInfo *PROTOCOL_ServiceDecode(char *pszText, uint16 &nCount, uint16 &nErrorCode)
{
	AppInfo *pAppInfo = NULL;
	nCount = 0;
	nErrorCode = CODE_ERROR;
	//parameter is valid?
	if(pszText == NULL)
	{
		return NULL;
	}
	// Get return code (errorCode)
	char *pszFind = STRISTR(pszText, PROTOCOL_ERRORCODE_START);
	if(pszFind == NULL)
	{
		nErrorCode = CODE_ERROR;
		return NULL;
	}
	pszText = pszFind + STRLEN(PROTOCOL_ERRORCODE_START);
	nErrorCode = ATOI(pszText);
	if(nErrorCode == CODE_NONE_POLICY || nErrorCode == CODE_PARAM_ERROR)
	{
		//业务不存在或查询参数不正确
		return NULL;
	}

	// Get first field (BillingCount)
	pszFind = STRISTR(pszText, PROTOCOL_CATALOGCOUNT_START);
	if(pszFind == NULL)
	{
		nErrorCode = CODE_NONE_POLICY;
		return NULL;
	}
	pszText = pszFind + STRLEN(PROTOCOL_CATALOGCOUNT_START);
	nCount = ATOI(pszText);
	//Count is valid?
	if(nCount == 0)
	{
		nErrorCode = CODE_NONE_POLICY;
		return NULL;
	}
	//
	pAppInfo = (AppInfo *) MALLOC(sizeof(AppInfo) * nCount);
	if(pAppInfo == NULL)
	{
		nErrorCode = CODE_NONE_POLICY;
		return NULL;
	}
	//Get second field(BillingPolicy)
	pszFind = STRISTR(pszText, PROTOCOL_CATALOGID_START);
	if(!pszFind)
	{
		nErrorCode = CODE_NONE_POLICY;
		FREE(pAppInfo);
		return NULL;
	}
	pszText = pszFind + STRLEN(PROTOCOL_CATALOGID_START);
	//for each field	
	for(int i = 0; i < nCount; i++)
	{
		MEMSET(pAppInfo[i].wszName, 0, (PROTOCOL_APPNAME_LEN + 1) * sizeof(AECHAR));
		pAppInfo[i].cls = ATOI(pszText);
		//Find seperator
		pszFind = STRCHR(pszText, PROTOCOL_SEPARATOR);
		if(pszFind == NULL)
		{
			FREE(pAppInfo);
			nCount = 0;
			nErrorCode = CODE_NONE_POLICY;
			return NULL;
		}
		pszText = pszFind + 1;
		if(i == nCount - 1)//end 
			pszFind = STRCHR(pszText, PROTOCOL_BILLINGPOLICY_SEPARATOR1);
		else
			pszFind = STRCHR(pszText, PROTOCOL_BILLINGPOLICY_SEPARATOR2);
		//
		if(pszFind == NULL)
		{
			FREE(pAppInfo);
			nCount = 0;
			nErrorCode = CODE_NONE_POLICY;
			return NULL;
		}
		//Convert UTF8 string to AECHAR string
		uint32 dwLen = pszFind - pszText;
		UTF8TOWSTR((const byte*)pszText, dwLen, pAppInfo[i].wszName, (PROTOCOL_APPNAME_LEN + 1) * sizeof(AECHAR));
		pAppInfo[i].wszName[PROTOCOL_APPNAME_LEN] = 0;
		//Point to next string
		pszText = pszFind + 1;
	}
	return pAppInfo;
}


//Decode application struct
AppInfo *PROTOCOL_AppDownloadDecode(char *pszText, uint16 &nCount, uint16 &nErrorCode)
{
	AppInfo *pAppInfo = NULL;
	nCount = 0;
	nErrorCode = CODE_ERROR;
	//parameter is valid?
	if(pszText == NULL)
	{
		return NULL;
	}
	// Get return code (errorCode)
	char *pszFind = STRISTR(pszText, PROTOCOL_ERRORCODE_START);
	if(pszFind == NULL)
	{
		nErrorCode = CODE_ERROR;
		return NULL;
	}
	pszText = pszFind + STRLEN(PROTOCOL_ERRORCODE_START);
	nErrorCode = ATOI(pszText);
	if(nErrorCode == CODE_NONE_POLICY || nErrorCode == CODE_PARAM_ERROR)
	{
		//业务不存在或查询参数不正确
		return NULL;
	}

	// Get first field (BillingCount)
	pszFind = STRISTR(pszText, PROTOCOL_PRODUCTCOUNT_START);
	if(pszFind == NULL)
	{
		nErrorCode = CODE_NONE_POLICY;
		return NULL;
	}
	pszText = pszFind + STRLEN(PROTOCOL_PRODUCTCOUNT_START);
	nCount = ATOI(pszText);
	//Count is valid?
	if(nCount == 0)
	{
		nErrorCode = CODE_NONE_POLICY;
		return NULL;
	}
	//
	pAppInfo = (AppInfo *) MALLOC(sizeof(AppInfo) * nCount);
	if(pAppInfo == NULL)
	{
		nErrorCode = CODE_NONE_POLICY;
		return NULL;
	}
	//Get second field(BillingPolicy)
	pszFind = STRISTR(pszText, PROTOCOL_CLASSID_START);
	if(!pszFind)
	{
		nErrorCode = CODE_NONE_POLICY;
		FREE(pAppInfo);
		return NULL;
	}
	pszText = pszFind + STRLEN(PROTOCOL_CLASSID_START);
	//for each field	
	for(int i = 0; i < nCount; i++)
	{
		MEMSET(pAppInfo[i].wszName, 0, (PROTOCOL_APPNAME_LEN + 1) * sizeof(AECHAR));
		pAppInfo[i].cls = ATOI(pszText);
		//Find seperator
		pszFind = STRCHR(pszText, PROTOCOL_SEPARATOR);
		if(pszFind == NULL)
		{
			FREE(pAppInfo);
			nCount = 0;
			nErrorCode = CODE_NONE_POLICY;
			return NULL;
		}
		pszText = pszFind + 1;
		pszFind = STRCHR(pszText, ':');
		//
		if(pszFind == NULL)
		{
			FREE(pAppInfo);
			nCount = 0;
			nErrorCode = CODE_NONE_POLICY;
			return NULL;
		}
		//Convert UTF8 string to AECHAR string
		uint32 dwLen = pszFind - pszText;
		UTF8TOWSTR((const byte*)pszText, dwLen, pAppInfo[i].wszName, (PROTOCOL_APPNAME_LEN + 1) * sizeof(AECHAR));
		pAppInfo[i].wszName[PROTOCOL_APPNAME_LEN] = 0;
		//定购关系
		pszText = pszFind + 1;
		pszFind = STRCHR(pszText, ':');
		//
		if(pszFind == NULL)
		{
			FREE(pAppInfo);
			nCount = 0;
			nErrorCode = CODE_NONE_POLICY;
			return NULL;
		}
		dwLen = pszFind - pszText;
		UTF8TOWSTR((const byte*)pszText, dwLen, pAppInfo[i].wszPolicy, (PROTOCOL_POLICYTEXT_LEN + 1) * sizeof(AECHAR));
		pAppInfo[i].wszPolicy[PROTOCOL_POLICYTEXT_LEN] = 0;

		//退定标记
		pszText += (dwLen + 1);
		pAppInfo[i].isCancel = ATOI(pszText);
		//续定标记
		pszText += 2;
		pAppInfo[i].isRenew = ATOI(pszText);
		
		pszText = pszFind + 1;
	}
	return pAppInfo;
}

// Decode BillingPolicy struct
// pszText[in]: billingPolicy text to be decoded  --
// pszText eg.ErrorCode=1%ClassID=1100&BillingCount=2%BillingPolicy=2:普通包月1元&6:按次计费1元
// ncount: return count of BillingPolicy
BillingPolicy *PROTOCOL_BillPolicyDecode(char *pszText, uint16 &nCount, uint16 &nErrorCode)
{
	BillingPolicy *pPolicys = NULL;
	nCount = 0;
	nErrorCode = CODE_ERROR;
	
	//parameter is valid?
	if(pszText == NULL)
	{
		return NULL;
	}
	// Get return code (errorCode)
	char *pszFind = STRISTR(pszText, PROTOCOL_ERRORCODE_START);
	if(pszFind == NULL)
	{
		nErrorCode = CODE_ERROR;
		return NULL;
	}
	pszText = pszFind + STRLEN(PROTOCOL_ERRORCODE_START);
	nErrorCode = ATOI(pszText);
	if(nErrorCode == CODE_NONE_POLICY || nErrorCode == CODE_PARAM_ERROR)
	{
		//业务不存在或查询参数不正确
		return NULL;
	}

	// Get first field (BillingCount)
	pszFind = STRISTR(pszText, PROTOCOL_BILLINGCOUNT_START);
	if(pszFind == NULL)
	{
		nErrorCode = CODE_NONE_POLICY;
		return NULL;
	}
	pszText = pszFind + STRLEN(PROTOCOL_BILLINGCOUNT_START);
	nCount = ATOI(pszText);
	//Count is valid?
	if(nCount == 0)
	{
		nErrorCode = CODE_NONE_POLICY;
		return NULL;
	}
	//
	pPolicys = (BillingPolicy *) MALLOC(sizeof(BillingPolicy) * nCount);
	if(pPolicys == NULL)
	{
		nErrorCode = CODE_NONE_POLICY;
		return NULL;
	}
	//Get second field(BillingPolicy)
	pszFind = STRISTR(pszText, PROTOCOL_BILLINGPOLICY_START);
	if(!pszFind)
	{
		nErrorCode = CODE_NONE_POLICY;
		FREE(pPolicys);
		return NULL;
	}
	pszText = pszFind + STRLEN(PROTOCOL_BILLINGPOLICY_START);
	//for each field	
	for(int i = 0; i < nCount; i++)
	{
		MEMSET(pPolicys[i].wszPolicy, 0, (PROTOCOL_POLICYTEXT_LEN + 1) * sizeof(AECHAR));
		pPolicys[i].wId = ATOI(pszText);
		//Find seperator
		pszFind = STRCHR(pszText, PROTOCOL_SEPARATOR);
		if(pszFind == NULL)
		{
			FREE(pPolicys);
			nCount = 0;
			nErrorCode = CODE_NONE_POLICY;
			return NULL;
		}
		pszText = pszFind + 1;
		if(i == nCount - 1)//end 
			pszFind = STRCHR(pszText, PROTOCOL_BILLINGPOLICY_SEPARATOR1);
		else
			pszFind = STRCHR(pszText, PROTOCOL_BILLINGPOLICY_SEPARATOR2);
		//
		if(pszFind == NULL)
		{
			FREE(pPolicys);
			nCount = 0;
			nErrorCode = CODE_NONE_POLICY;
			return NULL;
		}
		//Convert UTF8 string to AECHAR string
		uint32 dwLen = pszFind - pszText - 2;
		UTF8TOWSTR((const byte*)pszText, dwLen, pPolicys[i].wszPolicy, (PROTOCOL_POLICYTEXT_LEN + 1) * sizeof(AECHAR));
		pPolicys[i].wszPolicy[PROTOCOL_POLICYTEXT_LEN] = 0;
		//解析是否可以续定标志
		pszText += (dwLen + 1);
		pPolicys[i].bIsRenewable = (boolean)ATOI(pszText);
		//Point to next string
		pszText = pszFind + 1;
	}
	return pPolicys;
}

//Decode BillInfo 定购信息解析
//pszText[in]
//
uint16 PROTOCOL_BillInfoDecode(char *pszText)
{
	return 0;
}

//Decode connection result
//pszText[in] connection result text to be decoded
//pResult[out] return result msg
//return uint16  error code 
uint16 PROTOCOL_ResultDecode(char *pszText/*, AECHAR *&pResultMsg*/)
{
//	FREEIF(pResultMsg);
//	pResultMsg = NULL;
	uint16 nErrorCode = UNKNOW_ERRORCODE; 
	
	if(pszText == NULL)
	{
		return nErrorCode;
	}
	char *pszFind = STRISTR(pszText, PROTOCOL_ERRORCODE_START);
	if(pszFind == NULL)
	{
		return nErrorCode;
	}
	pszText = pszFind + STRLEN(PROTOCOL_ERRORCODE_START);
	nErrorCode = ATOI(pszText);
	/*
	//解析返回信息
	pszFind = STRISTR(pszText, PROTOCOL_ERRORMSG_START);
	if(pszFind != NULL)
	{
		pszText = pszFind + STRLEN(PROTOCOL_ERRORMSG_START);
		uint16 nLen = STRLEN(pszText) + 1;
		pResultMsg = (AECHAR *)MALLOC(nLen * sizeof(AECHAR));
		if(pResultMsg == NULL)
			return nErrorCode;

		UTF8TOWSTR((const byte*)pszText, nLen, pResultMsg, nLen * sizeof(AECHAR));
	}*/
	return nErrorCode;
}

⌨️ 快捷键说明

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