?? 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下不存在子目錄,返回服務(wù)列表,返回
ErrorCode=1%CatalogCount =3% CatID =1100: 推箱子&1101: CS游戲&1102:俄羅斯方塊%
⑵如果不存在服務(wù)或子目錄,返回
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)
{
//業(yè)務(wù)不存在或查詢參數(shù)不正確
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)
{
//業(yè)務(wù)不存在或查詢參數(shù)不正確
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;
//定購關(guān)系
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;
//退定標(biāo)記
pszText += (dwLen + 1);
pAppInfo[i].isCancel = ATOI(pszText);
//續(xù)定標(biāo)記
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:按次計(jì)費(fèi)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)
{
//業(yè)務(wù)不存在或查詢參數(shù)不正確
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;
//解析是否可以續(xù)定標(biāo)志
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -