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

📄 cbcbscunpack.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 3 页
字号:
		case 1://FAILURELIST:                    
			UnPackPara_FAILURELIST(handle);
			break;
		case 4://CHANNELINDICATOR:       
			UnpackPara_CHANNELINDICATOR(handle);
			break;
		}
	if (SolidUnPackSkipBODY(handle)==0)
		break;
	}
*/
	SolidUnPackBACKWARD(handle);
	return SUCCESS;
}

int UnPack_CBCHLoading(int handle,CBCLOADINGSTATUS_t *s_CBCLOADINGSTATUS)
{
	char*  	para_body;
	int len;

//	if (SolidUnPackFORWARD(handle)==0)
//		return FAILURE;
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;
    /* 深入到Cell节点 */
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	/* CellIdDisc */
	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
	if (len>CELLID_DISC_LEN)
		return FAILURE;
#endif
	memcpy(&s_CBCLOADINGSTATUS->s_Cellid.cCellIdDisc,para_body,len);

	/* CellId */
	SolidUnPackSkipBODY(handle);
	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
	if (len>CELLID_LEN)
		return FAILURE;
#endif
	memcpy(&s_CBCLOADINGSTATUS->s_Cellid.cCellId,para_body,len);


	/* 得到完成次数 */
    SolidUnPackBACKWARD(handle);
	SolidUnPackSkipBODY(handle);
	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
	if (len>INTEGERTYPE_LEN)
		return FAILURE;
#endif
	s_CBCLOADINGSTATUS->cCbcLoading=ConvertASN1INTEGERToint(para_body,len);

	/* 退回 */
	SolidUnPackBACKWARD(handle);
	   
	return SUCCESS;
}

/* 解CBCHLoadingList操作参数 */
int UnPackPara_CBCHLoadingList(int handle)
{
    int i=0;

	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	for(;;)
	{
		if(UnPack_CBCHLoading(handle,&CBCBSC_Unpack.p_CBCLOADINGSTATUSList.s_CbcLoadingStatus[i])==FAILURE)
		{
			SolidUnPackBACKWARD(handle);
			return FAILURE;
		}
		i++;
		if (SolidUnPackSkipBODY(handle)==0)
			break;
	}

	if (i>0)
	{
		CBCBSC_Unpack.p_CBCLOADINGSTATUSList.bFlag=1;
		CBCBSC_Unpack.p_CBCLOADINGSTATUSList.iLength=i;				
	}
	SolidUnPackBACKWARD(handle);
	return SUCCESS;
}


//将ASN1标准转为int
int ConvertASN1INTEGERToint(unsigned char *ptr,int len)
{
	signed char	 i1;
	signed short i2;
	int          i3;

	unsigned char tem;


	switch (len)
	{
	case 1:
		memcpy(&i1,ptr,len);
		return i1;
		break;
	case 2:
		i2=(*ptr)*256+*(ptr+1);
		memcpy(&i2,ptr,len);
		return i2;
		break;
	case 3:
		tem=*ptr;
		if (tem>127)
			return FAILURE;
		i3=(*(ptr+1))*256+(*(ptr+2))+tem*65536;
		return i3;
		break;
	}
	return FAILURE;

}

//解操作cbse_BSC_RESTART参数
int UnPackcbse_BSC_RESTART(int handle)
{

	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;
	Unpack_UplinkCellList(handle);
	
	if (SolidUnPackSkipBODY(handle)==0)
		return SUCCESS;

	Unpack_RecoveryIndication(handle);
	
	return SUCCESS;
}

//CellList参数
int Unpack_CellList(int handle)
{
	char*  	para_body;
	int len;
    int i;

//	if (SolidUnPackFORWARD(handle)==0)
//		return FAILURE;

	//深入到length节点
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
	CBCBSC_Unpack.p_CELLLIST.iLength=ConvertASN1INTEGERToint(para_body,len);

    //移到disc节点
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;

	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
	if (len>CELLID_DISC_LEN)
		return FAILURE;
#endif
	memcpy(&CBCBSC_Unpack.p_CELLLIST.cCellIdDisc,para_body,len);



	//移到list节点
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;
	//深入List序列
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	for(i=0;i<CBCBSC_Unpack.p_CELLLIST.iLength;i++)
	{
		para_body=SolidUnPackGetBODY(handle);		
    	len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
	if (len>CELLID_LEN)
		return FAILURE;
#endif
		memcpy(&CBCBSC_Unpack.p_CELLLIST.s_CellList[i],para_body,len);
		SolidUnPackSkipBODY(handle);
	}

	/* 退回到CellList节点 */
    SolidUnPackBACKWARD(handle);
	SolidUnPackBACKWARD(handle);
//	SolidUnPackBACKWARD(handle);
	   
	CBCBSC_Unpack.p_CELLLIST.bFlag=1;
	return SUCCESS;
}

//上行CellList参数,主要是Restart,Failure
int Unpack_UplinkCellList(int handle)
{
	char*  	para_body;
	int len;
    int i;

//	if (SolidUnPackFORWARD(handle)==0)
//		return FAILURE;

	//深入到length节点
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
	CBCBSC_Unpack.p_UplinkCellList.iLength=ConvertASN1INTEGERToint(para_body,len);

    //移到disc节点
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;

	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
	if (len>CELLID_DISC_LEN)
		return FAILURE;
#endif
	memcpy(&CBCBSC_Unpack.p_UplinkCellList.cCellIdDisc,para_body,len);



	//移到list节点
	if (SolidUnPackSkipBODY(handle)==0)
		return FAILURE;
	//深入List序列
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	for(i=0;i<CBCBSC_Unpack.p_UplinkCellList.iLength;i++)
	{
		para_body=SolidUnPackGetBODY(handle);		
    	len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
	if (len>CELLID_LEN)
		return FAILURE;
#endif
		memcpy(&CBCBSC_Unpack.p_UplinkCellList.s_CellList[i],para_body,len);
		SolidUnPackSkipBODY(handle);
	}

	/* 退回到CellList节点 */
    SolidUnPackBACKWARD(handle);
	SolidUnPackBACKWARD(handle);
//	SolidUnPackBACKWARD(handle);
	   
	CBCBSC_Unpack.p_UplinkCellList.bFlag=1;
	return SUCCESS;
}


/* RecoveryIndication参数 */
int Unpack_RecoveryIndication(int handle)
{
	char*  	para_body;
	int len;

	para_body=SolidUnPackGetBODY(handle);		
    len=SolidUnPackGetLEN(handle);
	CBCBSC_Unpack.p_RECOVERYINDICATION.bRecoveryIndicator=*para_body;
	CBCBSC_Unpack.p_RECOVERYINDICATION.bFlag=1;

	return SUCCESS;

}

//解cbse_RESET操作参数
int UnPackcbse_RESET(int handle)
{
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	return Unpack_CellList(handle);
}

/* 解cbse_FAILURE_IND操作参数 */
int UnPackcbse_FAILURE_IND(int handle)
{
	//深入到Sequence
//	if (SolidUnPackFORWARD(handle)==0)
//		return FAILURE;
	//深入到cell-list Sequence
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	return Unpack_UplinkCellList(handle);
}

int Unpack_Cell(int handle,CELL_t *s_Cell)
{
	char*  	para_body;
	int len;

    //深入到Cell节点
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
    #ifdef CHECKLEN
	if (len!=CELLID_DISC_LEN)
		SolidUnPackBACKWARD(handle);
		return FAILURE;
    #endif
	memcpy(&s_Cell->cCellIdDisc,para_body,len);

	SolidUnPackSkipBODY(handle);
	para_body=SolidUnPackGetBODY(handle);		
	len=SolidUnPackGetLEN(handle);
    #ifdef CHECKLEN
	if (len>CELLID_LEN)	
		SolidUnPackBACKWARD(handle);
		return FAILURE;
    #endif
	memcpy(&s_Cell->cCellId[0],para_body,len);
    SolidUnPackBACKWARD(handle);

	return SUCCESS;
}

//解包小区序列参数
int Unpack_SequenceOfCell(int handle)
{
//	char*  	para_body;
//	int len;
	//深入到Sequence节点
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	CBCBSC_Unpack.p_SequenceOfCell.iLength=0;
	for(;;)
	{
		Unpack_Cell(handle,&CBCBSC_Unpack.p_SequenceOfCell.s_Cell[CBCBSC_Unpack.p_SequenceOfCell.iLength]);		
		CBCBSC_Unpack.p_SequenceOfCell.iLength++;
		if (SolidUnPackSkipBODY(handle)==0)
			break;
	}

	SolidUnPackBACKWARD(handle);


 	return SUCCESS;
}


//解cbse_SET_DRX_REPORT操作参数
int UnPackcbse_SET_DRX_REPORT(int handle)
{
	int ParaMeterTag;

	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;
	//深入到参数序列
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	for(;;)
	{
		ParaMeterTag=SolidUnPackGetID(handle);
		if (ParaMeterTag<0)
			return FAILURE;

		switch (ParaMeterTag)
		{
		case 0://CellList(O)小区的序列
			Unpack_SequenceOfCell(handle);
			break;
		case 1://FAILURELIST:     (O)               
			UnPackPara_FAILURELIST(handle);
			break;
		case 4://CHANNELINDICATOR:   (O)    
			UnpackPara_CHANNELINDICATOR(handle);
			break;
		}
	if (SolidUnPackSkipBODY(handle)==0)
		break;
	}
	return SUCCESS;
}


//解包邦定参数Name
int Unpack_NAME(int handle)
{
	int ParaMeterTag;

/*
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;
*/
	//深入到参数序列
	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	for(;;)
	{
		ParaMeterTag=SolidUnPackGetID(handle);
		if (ParaMeterTag<0)
			return FAILURE;

		switch (ParaMeterTag)
		{
		case 0x0://operator
			UnpackPara_Operator(handle);
			break;
		case 0x1://bilateralAgreem
			UnpackPara_BilateralAgreem(handle);
			break;
		case 0x2: //dataNetworkAddress   
			UnpackPara_DataNetworkAddress(handle);
			break;
		case 0x3: //iSDNAddress   
//			UnpackPara_ISDNAddress(handle);
			break;

		}
	if (SolidUnPackSkipBODY(handle)==0)
		break;
	}

//	SolidUnPackBACKWARD(handle);
//	SolidUnPackBACKWARD(handle);
	SolidUnPackBACKWARD(handle);
	return SUCCESS;
}

//解NAME参数的子参数 Operator
int UnpackPara_Operator(int handle)
{
	char*  	para_body;
	int len;

//	if (SolidUnPackFORWARD(handle)==0)
//		return FAILURE;

	para_body=SolidUnPackGetBODY(handle);
	len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
	if (len>OPERTOR_LEN)
		return FAILURE;
#endif
	memcpy(&CBCBSC_Unpack.p_Name.s_Operate.cOperator,para_body,len);
	CBCBSC_Unpack.p_Name.s_Operate.clength=len;
	CBCBSC_Unpack.p_Name.s_Operate.bFlag=1;

	return SUCCESS;

}

//解NAME参数的子参数 BilateralAgreem
int UnpackPara_BilateralAgreem(int handle)
{
	char*  	para_body;
	int len;

	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	para_body=SolidUnPackGetBODY(handle);
	len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
	if (len>BILATERAL_AGREEM_LEN)
		return FAILURE;
#endif
	CBCBSC_Unpack.p_Name.s_BilateralAgreem.clength=len;

	memcpy(&CBCBSC_Unpack.p_Name.s_BilateralAgreem.cBilateralAgreem,para_body,len);
	CBCBSC_Unpack.p_Name.s_BilateralAgreem.bFlag=1;

	return SUCCESS;
}

//解NAME参数的子参数 DataNetworkAddress
int UnpackPara_DataNetworkAddress(int handle)
{
	char*  	para_body;
	int len;

	if (SolidUnPackFORWARD(handle)==0)
		return FAILURE;

	para_body=SolidUnPackGetBODY(handle);
	len=SolidUnPackGetLEN(handle);
#ifdef CHECKLEN
	if (len>Xl2lADDRESS_LEN)
		return FAILURE;
#endif
	CBCBSC_Unpack.p_Name.s_DataNetWorkAddress.clength=len;
	memcpy(&CBCBSC_Unpack.p_Name.s_DataNetWorkAddress.cXl2lAddress,para_body,len);
	CBCBSC_Unpack.p_Name.s_DataNetWorkAddress.bFlag=1;

	return SUCCESS;
}

//解参数NoofPages
int UnPackPara_NO_OF_PAGES(int handle)
{
	char*	para_body;
	int     len;

	//深入和回退对应
	para_body=SolidUnPackGetBODY(handle);
	if (para_body==NULL) 
	{
		return FAILURE;
	}
	len=SolidUnPackGetLEN(handle);
	CBCBSC_Unpack.p_NoOfPages.cNumberOfPages=
		ConvertASN1INTEGERToint(para_body,len);
	CBCBSC_Unpack.p_NoOfPages.bFlag=1;
	
	return SUCCESS;
}

//解参数DataCodingScheme
int UnPackPara_DATA_CODING_SCHEME(int handle)
{
	char*	para_body;
	int     len;

	//深入和回退对应
	para_body=SolidUnPackGetBODY(handle);
	if (para_body==NULL) 
	{
		return FAILURE;
	}
	len=SolidUnPackGetLEN(handle);
	CBCBSC_Unpack.p_DataCodingScheme.cDataCodingScheme=
		ConvertASN1INTEGERToint(para_body,len);
	CBCBSC_Unpack.p_DataCodingScheme.bFlag=1;
	
	return SUCCESS;
}

//解参数RepitionRate
int UnPackPara_REPETITION_RATE(int handle)
{
	char*	para_body;
	int     len;

	//深入和回退对应
	para_body=SolidUnPackGetBODY(handle);
	if (para_body==NULL) 
	{
		return FAILURE;
	}
	len=SolidUnPackGetLEN(handle);
	CBCBSC_Unpack.p_RepetitionRate.iRepetitionRate=
		ConvertASN1INTEGERToint(para_body,len);
	CBCBSC_Unpack.p_RepetitionRate.bFlag=1;
	
	return SUCCESS;
}

//解参数NoOfBroadcastReq
int UnPackPara_NO_OF_BROADCAST_REQ(int handle)
{
	char*	para_body;
	int     len;

	//深入和回退对应
	para_body=SolidUnPackGetBODY(handle);
	if (para_body==NULL) 
	{
		return FAILURE;
	}
	len=SolidUnPackGetLEN(handle);
	CBCBSC_Unpack.p_NoOfBroadcastReq.iNumberOfBroadcastReq=

⌨️ 快捷键说明

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