📄 gatewayproxyprotocol.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 + -