📄 cbcbscunpack.c
字号:
ConvertASN1INTEGERToint(para_body,len);
CBCBSC_Unpack.p_NoOfBroadcastReq.bFlag=1;
return SUCCESS;
}
//解参数PAGE_INF
int UnPackPara_PAGE_INF(int handle,int i)
{
char* para_body;
int len;
//深入到MessageInfoUsefulOctets
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
//取页长
para_body=SolidUnPackGetBODY(handle);
if (para_body==NULL)
{
return FAILURE;
}
len=SolidUnPackGetLEN(handle);
CBCBSC_Unpack.p_CBSPageINF.s_CbsPageInf[i].cMessageInfoUsefulOctets=
ConvertASN1INTEGERToint(para_body,len);
if (SolidUnPackSkipBODY(handle)==0)
return FAILURE; //缺PAGE内容
//取页内容
para_body=SolidUnPackGetBODY(handle);
if (para_body==NULL)
{
return FAILURE;
}
len=SolidUnPackGetLEN(handle);
if (len!=MESSAGE_INFO_PAGE_LEN)
return FAILURE;
memcpy(&CBCBSC_Unpack.p_CBSPageINF.s_CbsPageInf[i].cMessageInfoPage[0],para_body,len);
SolidUnPackBACKWARD(handle);
return SUCCESS;
}
//解参数CBS_PAGE_INF
int UnPackPara_CBS_PAGE_INF(int handle)
{
// char* para_body;
int i;
//深入到SEQUENCE
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
for(i=0;i<15;i++)
{
if (UnPackPara_PAGE_INF(handle,i)<0)
{
SolidUnPackBACKWARD(handle);
return FAILURE;
}
if (SolidUnPackSkipBODY(handle)==0)
break;
}
CBCBSC_Unpack.p_CBSPageINF.bFlag=1;
SolidUnPackBACKWARD(handle);
return SUCCESS;
}
//参数Old_Serial_Number
int UnPackPara_OLD_SERIAL_NUMBER(int handle)
{
char* para_body;
int len;
//
para_body=SolidUnPackGetBODY(handle);
len=*(unsigned char *)(para_body+1);
#ifdef CHECKLEN
if (len>2)
return FAILURE;
#endif
CBCBSC_Unpack.p_OldSerialNumber.iSerialNumber=
ConvertASN1INTEGERToint((para_body+2),len);
CBCBSC_Unpack.p_OldSerialNumber.bFlag=1;
return SUCCESS;
}
//参数Category
int UnPackPara_CATEGORY(int handle)
{
char* para_body;
int len;
para_body=SolidUnPackGetBODY(handle);
len=*(unsigned char *)(para_body+1);
#ifdef CHECKLEN
if (len>1)
return FAILURE;
#endif
CBCBSC_Unpack.p_Category.cCategory=
ConvertASN1INTEGERToint((para_body+2),len);
CBCBSC_Unpack.p_Category.bFlag=1;
return SUCCESS;
}
//实际中不会用,较简略
int Unpackcbse_WRITE_REPLACE(int handle)
{
int ParaMeterTag;
int len;
// char* para_body;
//深入到SEQUENCE
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
//深入到MessageIdentifier
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
//MessageIdentifier
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
UnPackPara_MESSAGEIDENTIFER(handle);
if (SolidUnPackSkipBODY(handle)==0)
return FAILURE;
//SerrialNumber
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
UnPackPara_SERIALNUMBER(handle);
if (SolidUnPackSkipBODY(handle)==0)
return FAILURE;
//NoOfPages
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
UnPackPara_NO_OF_PAGES(handle);
if (SolidUnPackSkipBODY(handle)==0)
return FAILURE;
//DataCodingScheme
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
UnPackPara_DATA_CODING_SCHEME(handle);
if (SolidUnPackSkipBODY(handle)==0)
return FAILURE;
//celllist
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
Unpack_CellList(handle);
if (SolidUnPackSkipBODY(handle)==0)
return FAILURE;
//RepetitionRate
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
UnPackPara_REPETITION_RATE(handle);
if (SolidUnPackSkipBODY(handle)==0)
return FAILURE;
//NoOfBroadcastReq
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
UnPackPara_NO_OF_BROADCAST_REQ(handle);
if (SolidUnPackSkipBODY(handle)==0)
return FAILURE;
//CBSPageINFO
ParaMeterTag=SolidUnPackGetID(handle);
if (ParaMeterTag<0)
return FAILURE;
UnPackPara_CBS_PAGE_INF(handle);
if (SolidUnPackSkipBODY(handle)==0)
return FAILURE;
for(;;)
{
ParaMeterTag=SolidUnPackGetID(handle);
len=SolidUnPackGetLEN(handle);
if (ParaMeterTag<0)
return FAILURE;
switch (ParaMeterTag)
{
case 3://old-Serial-Number
UnPackPara_OLD_SERIAL_NUMBER(handle);
break;
case 2://category
// para_body=SolidUnPackGetBODY(handle);
UnPackPara_CATEGORY(handle);
break;
case 4://channel-indicator
// para_body=SolidUnPackGetBODY(handle);
UnpackPara_CHANNELINDICATOR(handle);
break;
}
if (SolidUnPackSkipBODY(handle)==0)
break;
}
return SUCCESS;
}
int UnPackPara_SERIAL_NUMBER_OnlyForREJECT(int handle)
{
char* para_body;
int len;
//
para_body=SolidUnPackGetBODY(handle);
len=*(unsigned char *)(para_body+1);
#ifdef CHECKLEN
if (len>2)
return FAILURE;
#endif
CBCBSC_Unpack.p_Serialnumber.iSerialNumber=
ConvertASN1INTEGERToint((para_body+2),len);
CBCBSC_Unpack.p_Serialnumber.bFlag=1;
return SUCCESS;
}
int UnPackPara_MESSAGE_IDENTIFIER_OnlyForREJECT(int handle)
{
char* para_body;
int len;
//
para_body=SolidUnPackGetBODY(handle);
len=*(unsigned char *)(para_body+1);
#ifdef CHECKLEN
if (len>2)
return FAILURE;
#endif
CBCBSC_Unpack.p_MessageIdentifier.iMessageIdentifier=
ConvertASN1INTEGERToint((para_body+2),len);
CBCBSC_Unpack.p_MessageIdentifier.bFlag=1;
return SUCCESS;
}
int Unpackcbse_REJECT_RESPONSE(handle)
{
// int ParaMeterTag;
int len;
char* para_body;
/* 深入到SEQUENCE */
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
/* 深入到cause */
// if (SolidUnPackFORWARD(handle)==0)
// return FAILURE;
/* cause */
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>CAUSE_LEN)
return FAILURE;
#endif
CBCBSC_Unpack.p_FailuerReason.bFlag=1;
CBCBSC_Unpack.p_FailuerReason.cCause=*(unsigned char *)(para_body+2);
//没有其它参数
if (SolidUnPackSkipBODY(handle)==0)
return SUCCESS;
//diagnostic
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>DIAGNOSTIC_LEN)
return FAILURE;
#endif
CBCBSC_Unpack.p_Diagnostic.bFlag=1;
memcpy(CBCBSC_Unpack.p_Diagnostic.cDiagnostic,para_body,len);
/* 更高版本使用
for(;;)
{
ParaMeterTag=SolidUnPackGetID(handle);
len=SolidUnPackGetLEN(handle);
if (ParaMeterTag<0)
return FAILURE;
switch (ParaMeterTag)
{
case 3://Serial-Number
UnPackPara_SERIAL_NUMBER_OnlyForREJECT(handle);
break;
case 7://MessageIdentifier
UnPackPara_MESSAGE_IDENTIFIER_OnlyForREJECT(handle);
break;
default:
return FAILURE;
}
if (SolidUnPackSkipBODY(handle)==0)
break;
}
*/
return SUCCESS;
}
int UnPackPara_Operator(int handle)
{
int len;
char* para_body;
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>OPERTOR_LEN)
return FAILURE;
#endif
CBCBSC_Unpack.p_BindConfirm.p_Name.s_Operate.clength=len;
CBCBSC_Unpack.p_BindConfirm.p_Name.s_Operate.bFlag=1;
memcpy(&CBCBSC_Unpack.p_BindConfirm.p_Name.s_Operate.cOperator[0],para_body,len);
return SUCCESS;
}
int UnPackPara_BilateralAgreem(int handle)
{
int len;
char* para_body;
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>BILATERAL_AGREEM_LEN)
return FAILURE;
#endif
CBCBSC_Unpack.p_BindConfirm.p_Name.s_BilateralAgreem.clength=len;
CBCBSC_Unpack.p_BindConfirm.p_Name.s_BilateralAgreem.bFlag=1;
memcpy(&CBCBSC_Unpack.p_BindConfirm.p_Name.s_BilateralAgreem.cBilateralAgreem[0],para_body,len);
return SUCCESS;
}
int UnPackPara_DataNetworkAddress(int handle)
{
int len;
char* para_body;
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>Xl2lADDRESS_LEN)
return FAILURE;
#endif
CBCBSC_Unpack.p_BindConfirm.p_Name.s_DataNetWorkAddress.clength=len;
CBCBSC_Unpack.p_BindConfirm.p_Name.s_DataNetWorkAddress.bFlag=1;
memcpy(&CBCBSC_Unpack.p_BindConfirm.p_Name.s_DataNetWorkAddress.cXl2lAddress[0],para_body,len);
return SUCCESS;
}
int UnPackPara_ISDNAddress(int handle)
{
int len;
char* para_body;
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>Xl2lADDRESS_LEN)
return FAILURE;
#endif
CBCBSC_Unpack.p_BindConfirm.p_Name.s_DataNetWorkAddress.clength=len;
CBCBSC_Unpack.p_BindConfirm.p_Name.s_DataNetWorkAddress.bFlag=1;
memcpy(&CBCBSC_Unpack.p_BindConfirm.p_Name.s_DataNetWorkAddress.cXl2lAddress[0],para_body,len);
return SUCCESS;
}
int UnPackPara_RESPID(int handle)
{
int ParaMeterTag;
int len;
//深入到SEQUENCE
// if (SolidUnPackFORWARD(handle)==0)
// return FAILURE;
//深入到Operator
if (SolidUnPackFORWARD(handle)==0)
return FAILURE;
for(;;)
{
ParaMeterTag=SolidUnPackGetID(handle);
len=SolidUnPackGetLEN(handle);
if (ParaMeterTag<0)
return FAILURE;
switch (ParaMeterTag)
{
case 0:/* Operator */
UnPackPara_Operator(handle);
break;
case 1:/* BilateralAgreem */
UnPackPara_BilateralAgreem(handle);
break;
case 2:/* dataNetworkAddress */
UnPackPara_DataNetworkAddress(handle);
break;
case 3:/* iSDNAddress */
UnPackPara_ISDNAddress(handle);
break;
default:
return FAILURE;
}
if (SolidUnPackSkipBODY(handle)==0)
break;
}
return SUCCESS;
}
/* 解包Password参数 */
int UnPackPara_PASSWORD(int handle)
{
int len;
char* para_body;
para_body=SolidUnPackGetBODY(handle);
len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
if (len>PASSWORD_LEN)
return FAILURE;
#endif
CBCBSC_Unpack.p_BindConfirm.p_PassWord.clength=len;
CBCBSC_Unpack.p_BindConfirm.p_PassWord.bFlag=1;
memcpy(&CBCBSC_Unpack.p_BindConfirm.p_PassWord.cPassword[0],para_body,len);
return SUCCESS;
}
int UnPackcbse_BIND_CONFIRM(unsigned char *LpBindConfirmMessage,int MessageLen)
{
int ParaMeterTag;
int len;
int handle;
handle=SolidUnPackBegin();
if (handle<0) return FAILURE;
if (SolidUnPackAttach(handle,LpBindConfirmMessage,MessageLen)!=0)
{
SolidUnPackRelease(handle);
return FAILURE;
}
/* 深入到respId */
if (SolidUnPackFORWARD(handle)==0)
{
SolidUnPackRelease(handle);
return FAILURE;
}
for(;;)
{
ParaMeterTag=SolidUnPackGetID(handle);
len=SolidUnPackGetLEN(handle);
if (ParaMeterTag<0)
{
SolidUnPackRelease(handle);
return FAILURE;
}
switch (ParaMeterTag)
{
case 0:/* respId */
{
if (UnPackPara_RESPID(handle)==FAILURE)
{
SolidUnPackRelease(handle);
return FAILURE;
}
}
break;
case 1:/* password */
{
if (UnPackPara_PASSWORD(handle)==FAILURE)
{
SolidUnPackRelease(handle);
return FAILURE;
}
}
break;
default:
{
SolidUnPackRelease(handle);
return FAILURE;
}
}
if (SolidUnPackSkipBODY(handle)==0)
break;
}
SolidUnPackRelease(handle);
return SUCCESS;
}
int UnPackcbse_BIND_DISCONNECT(unsigned char *LpUnbindMessage )
{
switch (*LpUnbindMessage)
{
case 0x81:/* bindfail */
{
CBCBSC_Unpack.p_BindFailure.bFlag=1;
CBCBSC_Unpack.p_BindFailure.p_ConnectFailureReason=*(LpUnbindMessage+2);
}
break;
case 0x82:/* unbindreq */
{
CBCBSC_Unpack.p_Unbind.bFlag=1;
}
break;
default:
return FAILURE;
}
return SUCCESS;
}
int UnPackcbse_BIND(unsigned char *Lp_mbind,int len)
{
int flag;
int handle;
int ReturnValue;
handle=SolidUnPackBegin();
if (handle<0) return FAILURE;
ReturnValue=SUCCESS;
flag=SolidUnPackAttach(handle,Lp_mbind,len);
if (flag==0)
{
/* 深入到name */
if (SolidUnPackFORWARD(handle)!=0)
{
ReturnValue=Unpack_NAME(handle);
}
else
{
ReturnValue=FAILURE;
}
}
else
{
ReturnValue=FAILURE;
}
SolidUnPackRelease(handle);
return ReturnValue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -