📄 capdisp.cpp
字号:
/***********************************************
History:
2000.04.17:Iniial Version,CAMEL Application Part protocol decode
************************************************/
#include "stdafx.h"
#define numOfInfoItems 4
#define numOfExtensions 10
#define numOfMessageIDs 5
#define numOfBCSMEvents 10
extern unsigned char *dispbuf,*recbuf;
extern unsigned char UDTlen;
extern unsigned short displen;
extern void procSourcePARAdisp(BYTE dfldno);
extern void procNULL(unsigned char dfldno);
extern char procsequencetag(unsigned char dfldno);
extern void procsbasicpara(unsigned char dfldno);
extern void procCase(BYTE dfldno);
extern void procinteger(BYTE dfldno);
extern unsigned char procsISDNADDR(unsigned char dfldno);
extern void procGeographInfo(BYTE dfldno);
extern void procCCILA(BYTE dfldno1,BYTE dfldno2,BOOL more6byte);
extern void procExtension(BYTE dfldno);
extern void procIMSI(unsigned char dfldno);
/*
void procinteger(BYTE dfldno)
{ BYTE li;
*dispbuf++=dfldno; //tag
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
*dispbuf++=dfldno+1; //li
*dispbuf++=8;
li=*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
*dispbuf++=dfldno+2;
*dispbuf++=li*8;
if(li==1) *dispbuf++=*recbuf++;
else if(li==2)
{*dispbuf++=*(recbuf+1);
*dispbuf++=*recbuf;
recbuf+=2;
}
else if(li==3)
{*dispbuf++=*(recbuf+2);
*dispbuf++=*(recbuf+1);
*dispbuf++=*recbuf;
recbuf+=3;
}
else if(li==4)
{*dispbuf++=*(recbuf+3);
*dispbuf++=*(recbuf+2);
*dispbuf++=*(recbuf+1);
*dispbuf++=*recbuf;
recbuf+=4;
}
*dispbuf++=0xcc;
displen+=li+11;
}
*/
void procCAPADDR(unsigned char dfldno) //P49-50
{ unsigned char li,i,code;
//ADDR TAG
*dispbuf++=dfldno;
*dispbuf++=8;
*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
//ADDR LI
*dispbuf++=dfldno+1;
*dispbuf++=8;
li=*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
UDTlen-=li+2;
//ADDR IN
*dispbuf++=dfldno+2;
*dispbuf++=8;
code=*dispbuf++=*recbuf++;
*dispbuf++=0xcc;
//ADDR SIGNAL
//zxf update begin 2001-9-27
li-=2; //old
recbuf++;//old
//li--;
*dispbuf++=dfldno+3;
if((code&0x80)==0x80) //there is fill,odd
*dispbuf++=li*8-4;
else *dispbuf++=li*8;
for(i=0;i<li;i++)
{*dispbuf=(*recbuf&0x0f)<<4;*dispbuf|=(*recbuf&0xf0)>>4;dispbuf++;recbuf++;}
*dispbuf++=0xcc;
displen+=li+15; //li*2+22;
}
void procCAPLegID(BYTE dfldno)
{ BYTE indeffmt;
indeffmt=procsequencetag(dfldno); //LEGID sequence
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+2); //发方ID
else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+2);//
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}
void ProcCAPSendingInfo(BYTE dfldno) //要发送的信息
{ BYTE indeffmt0,indeffmt,indeffmt2,indeffmt3,indeffmt4,i,li,len;
//modify by yzy 2001.10.11
indeffmt0=procsequencetag(dfldno); //要发送的信息 sequence
//“要发送的信息”选择“带内信息”“信号音”
if((*recbuf&0x3f)==0x20)//选择“带内信息”
{indeffmt=procsequencetag(dfldno+2); //带内信息 sequence
//“消息ID”选择“基本消息ID”“文本”“基本消息ID组”“可变消息”
if((*recbuf&0x3f)==0x20)//“消息ID”
{indeffmt2=procsequencetag(dfldno+4); //消息ID sequence
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+6); //基本消息ID
else if((*recbuf&0x3f)==0x21) //“文本”
{indeffmt3=procsequencetag(dfldno+10); //文本 sequence
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+12); //消息内容
if((*recbuf&0x3f)==1) procsbasicpara(dfldno+15); //属性
if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
}//“文本”
else if((*recbuf&0x3f)==0x3d) //“基本消息ID组”
{indeffmt3=procsequencetag(dfldno+18); //基本消息ID组
i=0;
while((*recbuf&0x3f)==2 && i<numOfMessageIDs)
{i++;
procsbasicpara(dfldno+6); //基本消息ID
}
if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
}//“基本消息ID组”
else if((*recbuf&0x3f)==0x3e) //“可变消息”
{indeffmt3=procsequencetag(dfldno+20);//19); //可变消息sequence
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+6); //基本消息ID
if((*recbuf&0x3f)==0x21)//可变部分
{if(*(recbuf+1)<=0x80) li=*(recbuf+1);
else li=*(recbuf+2);
indeffmt4=procsequencetag(dfldno+22);//21); //可变部分sequence
if(indeffmt4!=0)//indefinite formatt
{i=0;
while(*(WORD *)recbuf!=0 && i<5)
{i++;
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+24); //整数
else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+27); //数字
else if((*recbuf&0x3f)==2) procsbasicpara(dfldno+30); //时间
else if((*recbuf&0x3f)==3) procsbasicpara(dfldno+33); //日期
else if((*recbuf&0x3f)==4) procsbasicpara(dfldno+36); //价格
}//while
recbuf+=2;UDTlen-=2;
}//indefinite formatt
else//short\long format
{i=0;
while(li!=0 && i<5)
{i++;
len=UDTlen;
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+24); //整数
else if((*recbuf&0x3f)==1) procsbasicpara(dfldno+27); //数字
else if((*recbuf&0x3f)==2) procsbasicpara(dfldno+30); //时间
else if((*recbuf&0x3f)==3) procsbasicpara(dfldno+33); //日期
else if((*recbuf&0x3f)==4) procsbasicpara(dfldno+36); //价格
len-=UDTlen;
li-=len;
}//while
}//short\long format
}//可变部分
if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
}//“可变消息”
if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
}////“消息ID”
//重复次数
if((*recbuf&0x3f)==1) procsbasicpara(dfldno+39); //重复次数
//持续时间
if((*recbuf&0x3f)==2) procsbasicpara(dfldno+42); //持续时间
//时间间隔
if((*recbuf&0x3f)==3) procsbasicpara(dfldno+45); //时间间隔
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}//选择“带内信息”
else if((*recbuf&0x3f)==0x21)//选择“信号音”
{indeffmt=procsequencetag(dfldno+48); //信号音 sequence
if((*recbuf&0x3f)==0) procsbasicpara(dfldno+50); //信号音ID
if((*recbuf&0x3f)==1) procsbasicpara(dfldno+42); //持续时间
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}//选择“信号音”
if(indeffmt0!=0) {recbuf+=2;UDTlen-=2;}
}
void ProcCAPExpand(BYTE dfldno) //“扩展”,P63
{ BYTE i,indeffmt,indeffmt2;
indeffmt=procsequencetag(dfldno); //扩展 sequence
i=0;
while(*recbuf==0x30 && i<numOfExtensions)//扩展域
{i++;
indeffmt2=procsequencetag(dfldno+2);//扩展域 sequence
procsbasicpara(dfldno+4); //类型
procsbasicpara(dfldno+7); //准则
procsbasicpara(dfldno+10); //值
if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
}//扩展域
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}
void procCAPNAInfo(BYTE dfld)
{ BYTE indeffmt,indeffmt2;
indeffmt=procsequencetag(dfld); //NA信息 sequence
if((*recbuf&0x3f)==0x20)//NA承载信息
{indeffmt2 = procsequencetag(dfld+2); //NA承载信息 sequence
if((*recbuf&0x3f)==0) procsbasicpara(dfld+4); //NA承载Id
if((*recbuf&0x3f)==1) procsbasicpara(dfld+7); //NA CIC选择类型
if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
}//NA承载信息
if((*recbuf&0x3f)==1) procsbasicpara(dfld+10); //NA Oli 信息
if((*recbuf&0x3f)==2) procCAPADDR(dfld+13); //NA计费号码
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
}
void procCAPdisp(BYTE oc,BYTE compt)
{ BYTE i,indeffmt,indeffmt2,indeffmt3,indeffmt4,indeffmt5,li;
switch(oc) //operate code
{
case 35: //申请计费:35
indeffmt=procsequencetag(0x01);
//CAMEL-ACH帐单计费特性
indeffmt2=procsequencetag(0x03); //CAMEL-ACH帐单计费特性 sequence
////计费时长
if((*recbuf&0x3f)==0x20)//exist 计费时长
{
indeffmt3=procsequencetag(0x05); //计费时长 sequence
if((*recbuf&0x3f)==0) procsbasicpara(0x08); //最大呼叫时长
if((*recbuf&0x3f)==0x21)//exist “超过时长释放”
{indeffmt4=procsequencetag(0x0b); //超过时长释放 sequence
procsbasicpara(0x0d); //“信号音(tone)”
if((*recbuf&0x3f)==10) ProcCAPExpand(0x10); //扩展
if(indeffmt4!=0) {recbuf+=2;UDTlen-=2;}
}//exist “超过时长释放”
if((*recbuf&0x3f)==2) procsbasicpara(0x1d); //“费率变换间隔(tariffSwitchInterval)”
if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
}//exist 计费时长
//计费方
if((*recbuf&0x3f)==0x22) //计费方
{indeffmt3=procsequencetag(0x20);//计费方 sequence
if((*recbuf&0x3f)==0) procsbasicpara(0x22); //发方Id
if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
}//计费方
//“扩展”
if((*recbuf&0x3f)==0x23) ProcCAPExpand(0x10);
if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
break;
case 36: //申请计费报告:36
if(*recbuf==0x04) indeffmt=procsequencetag(0x01);//2001.09.07
//CAMEL-呼叫结果
// if((*recbuf&0x1f)==0) indeffmt2=procsequencetag(0x03);
//计费结果时长(timeDurationChargingResult)
if((*recbuf&0x3f)==0x20)//计费结果时长
{indeffmt3=procsequencetag(0x05); //计费结果时长 sequence
//计费方
if((*recbuf&0x1f)==0x00)//计费方
{indeffmt4=procsequencetag(0x07); //计费方 sequence
if((*recbuf&0x3f)==1) procsbasicpara(0x09); //收方Id
if(indeffmt4!=0) {recbuf+=2;UDTlen-=2;}
}//计费方
//时间信息
if((*recbuf&0x1f)==0x01)//时间信息select
{indeffmt4=procsequencetag(0x0c); //时间信息 sequence
if((*recbuf&0x1f)==0) procsbasicpara(0x0e); //费率未变换时间(timeIfNoTariffSwitch)
else if((*recbuf&0x1f)==0x01)//费率已变换时间(timeIfTariffSwitch)
{indeffmt5=procsequencetag(0x11); //时间信息 sequence
if((*recbuf&0x1f)==0) procsbasicpara(0x13); //费率变换后的时间(timeSinceTariffSwitch)
if((*recbuf&0x1f)==1) procsbasicpara(0x16); //费率变换间隔(tariffSwitchInterval)
if(indeffmt5 != 0) {recbuf+=2;UDTlen-=2;}
}//费率已变换时间(timeIfTariffSwitch)
if(indeffmt4!=0) {recbuf+=2;UDTlen-=2;}
}//时间信息
//呼叫激活
if((*recbuf&0x3f)==2) procsbasicpara(0x19); //呼叫激活
if(indeffmt3!=0) {recbuf+=2;UDTlen-=2;}
}//结果计费时长
//if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
break;
case 16: //辅助请求指令:16
indeffmt=procsequencetag(0x01);
//相关ID
procsbasicpara(0x03);
//IP可用性
if((*recbuf&0x3f)==1) procsbasicpara(0x06);
//IPSSP能力
if((*recbuf&0x3f)==2) procsbasicpara(0x09);
//“扩展”
if((*recbuf&0x3f)==0x23) ProcCAPExpand(0x0c);
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
break;
case 44: //呼叫信息报告:44
indeffmt=procsequencetag(0x01);
//所请求的信息清单
indeffmt2=procsequencetag(0x03); //所请求的信息清单 sequence
////所请求的信息
i=0;
while(*recbuf==0x30 && i<numOfInfoItems)//所请求的信息
{i++;
indeffmt3=procsequencetag(0x05); //所请求的信息 sequence
procsbasicpara(0x07); //所请求的信息类型(枚举)
//“所请求的信息值”:以下4项选择其一
indeffmt3+=procsequencetag(0x0a); //所请求的信息值 sequence
if((*recbuf&0x3f)==0) procsbasicpara(0x0c); //呼叫历史时间值
else if((*recbuf&0x3f)==1) procsbasicpara(0x0f); //呼叫停止时间
else if((*recbuf&0x3f)==2) procsbasicpara(0x12); //呼叫连接历史时间
else if((*recbuf&0x3f)==30) procsbasicpara(0x15); //释放愿因值
if(indeffmt3!=0) {recbuf+=2*indeffmt3;UDTlen-=2*indeffmt3;}
}//所请求的信息
if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
//“扩展”
if((*recbuf&0x3f)==0x22) ProcCAPExpand(0x18);
//“legID”
if((*recbuf&0x3f)==0x23)
{indeffmt3=procsequencetag(0x25); //legID sequence
if((*recbuf&0x3f)==0x01) procsbasicpara(0x27); //收方Id
if(indeffmt3!=0) {recbuf+=2; UDTlen-=2;}
}
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
break;
case 45: //呼叫信息请求:45
indeffmt=procsequencetag(0x01);
//所请求的信息类型清单
indeffmt2=procsequencetag(0x03); //所请求的信息类型清单 sequence
////所请求的信息类型
i=0;
while(*recbuf==0x30 && i<numOfInfoItems)//所请求的信息类型
{i++;
procsbasicpara(0x05); //所请求的信息类型(枚举)
}
if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
//“扩展”
if((*recbuf&0x3f)==0x22) ProcCAPExpand(0x0b);
//“legID”
if((*recbuf&0x3f)==0x23)
{indeffmt3=procsequencetag(0x15); //legID sequence
if((*recbuf&0x3f)==0) procsbasicpara(0x17); //发方Id
if(indeffmt3!=0) {recbuf+=2; UDTlen-=2;}
}
if(indeffmt!=0) {recbuf+=2;UDTlen-=2;}
break;
case 53: //取消:53
if((*recbuf&0x3f)==0) procsbasicpara(0x01); //调用ID
else if((*recbuf&0x3f)==1) procNULL(0x04); //所有请求(NULL)
break;
case 20: //连接:20
indeffmt=procsequencetag(0x01);
//目的地路由地址
indeffmt2=procsequencetag(0x03);
procCAPADDR(0x05); //被叫用户号码
if(indeffmt2!=0) {recbuf+=2;UDTlen-=2;}
//振铃模式
if((*recbuf&0x3f)==1) procsbasicpara(0x09);
//原被叫用户ID(原被叫号码)
if((*recbuf&0x3f)==6) procCAPADDR(0x0c);
//“扩展”
if((*recbuf&0x3f)==0x2a) ProcCAPExpand(0x10);
//主叫用户类别
if((*recbuf&0x3f)==28) procsbasicpara(0x1d);
//改向用户ID
if((*recbuf&0x3f)==29) procCAPADDR(0x20);
//改向信息
if((*recbuf&0x3f)==30) procsbasicpara(0x24);
//通用数字
if((*recbuf&0x3f)==14) procsbasicpara(0x27);
//抑制通知(suppressionOfAnnouncement)
if((*recbuf&0x1f)==0x1f) {recbuf++;UDTlen--;}
if((*recbuf&0x7f)==55) procsbasicpara(0x2a);
//oCSI应用
if((*recbuf&0x1f)==0x1f) {recbuf++;UDTlen--;}
if((*recbuf&0x7f)==56) procNULL(0x2d);
//NA信息
if((*recbuf&0x1f)==0x1f) {recbuf++;UDTlen--;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -