📄 message.c
字号:
Number, "w",Info); if (a) listen_check(a); return FALSE;}byte info_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg){ word i; API_PARSE * ai; PLCI * rc_plci = NULL; API_PARSE ai_parms[5]; word Info = 0; dbug(1,dprintf("info_req")); for(i=0;i<5;i++) ai_parms[i].length = 0; ai = &msg[1]; if(ai->length) { if(api_parse(&ai->info[1],(word)ai->length,"ssss",ai_parms)) { dbug(1,dprintf("AddInfo wrong")); Info = _WRONG_MESSAGE_FORMAT; } } if(!a) Info = _WRONG_STATE; if(!Info && plci) { /* no fac, with CPN, or KEY */ rc_plci = plci; if(!ai_parms[3].length && plci->State && (msg[0].length || ai_parms[1].length) ) { /* overlap sending option */ dbug(1,dprintf("OvlSnd")); add_s(plci,CPN,&msg[0]); add_s(plci,KEY,&ai_parms[1]); sig_req(plci,INFO_REQ,0); send_req(plci); return FALSE; } if(plci->State && ai_parms[2].length) { /* User_Info option */ dbug(1,dprintf("UUI")); add_s(plci,UUI,&ai_parms[2]); sig_req(plci,USER_DATA,0); } else if(plci->State && ai_parms[3].length) { /* Facility option */ dbug(1,dprintf("FAC")); add_s(plci,CPN,&msg[0]); add_ai(plci, &msg[1]); sig_req(plci,FACILITY_REQ,0); } else { Info = _WRONG_STATE; } } else if((ai_parms[1].length || ai_parms[2].length || ai_parms[3].length) && !Info) { /* NCR_Facility option -> send UUI and Keypad too */ dbug(1,dprintf("NCR_FAC")); if((i=get_plci(a))) { rc_plci = &a->plci[i-1]; appl->NullCREnable = TRUE; rc_plci->internal_command = C_NCR_FAC_REQ; rc_plci->appl = appl; add_p(rc_plci,CAI,"\x01\x80"); add_p(rc_plci,UID,"\x06\x43\x61\x70\x69\x32\x30"); sig_req(rc_plci,ASSIGN,DSIG_ID); send_req(rc_plci); } else { Info = _OUT_OF_PLCI; } if(!Info) { add_s(rc_plci,CPN,&msg[0]); add_ai(rc_plci, &msg[1]); sig_req(rc_plci,NCR_FACILITY,0); send_req(rc_plci); return FALSE; /* for application controlled supplementary services */ } } if (!rc_plci) { Info = _WRONG_MESSAGE_FORMAT; } if(!Info) { send_req(rc_plci); } else { /* appl is not assigned to a PLCI or error condition */ dbug(1,dprintf("localInfoCon")); sendf(appl, _INFO_R|CONFIRM, Id, Number, "w",Info); } return FALSE;}byte info_res(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg){ dbug(1,dprintf("info_res")); return FALSE;}byte alert_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg){ word Info; byte ret; dbug(1,dprintf("alert_req")); Info = _WRONG_IDENTIFIER; ret = FALSE; if(plci) { Info = _ALERT_IGNORED; if(plci->State!=INC_CON_ALERT) { Info = _WRONG_STATE; if(plci->State==INC_CON_PENDING) { Info = 0; plci->State=INC_CON_ALERT; add_ai(plci, &msg[0]); sig_req(plci,CALL_ALERT,0); ret = 1; } } } sendf(appl, _ALERT_R|CONFIRM, Id, Number, "w",Info); return ret;}byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER * a, PLCI * plci, APPL * appl, API_PARSE * msg){ word Info = 0; word i = 0; word selector; word SSreq; long relatedPLCIvalue; DIVA_CAPI_ADAPTER * relatedadapter; byte * SSparms = ""; byte RCparms[] = "\x05\x00\x00\x02\x00\x00"; byte SSstruct[] = "\x09\x00\x00\x06\x00\x00\x00\x00\x00\x00"; API_PARSE * parms; API_PARSE ss_parms[11]; PLCI *rplci; byte cai[15]; dword d; API_PARSE dummy; dbug(1,dprintf("facility_req")); for(i=0;i<9;i++) ss_parms[i].length = 0; parms = &msg[1]; if(!a) { dbug(1,dprintf("wrong Ctrl")); Info = _WRONG_IDENTIFIER; } selector = GET_WORD(msg[0].info); if(!Info) { switch(selector) { case SELECTOR_HANDSET: Info = AdvCodecSupport(a, plci, appl, HOOK_SUPPORT); break; case SELECTOR_SU_SERV: if(!msg[1].length) { Info = _WRONG_MESSAGE_FORMAT; break; } SSreq = GET_WORD(&(msg[1].info[1])); PUT_WORD(&RCparms[1],SSreq); SSparms = RCparms; switch(SSreq) { case S_GET_SUPPORTED_SERVICES: if((i=get_plci(a))) { rplci = &a->plci[i-1]; rplci->appl = appl; add_p(rplci,CAI,"\x01\x80"); add_p(rplci,UID,"\x06\x43\x61\x70\x69\x32\x30"); sig_req(rplci,ASSIGN,DSIG_ID); send_req(rplci); } else { PUT_DWORD(&SSstruct[6], MASK_TERMINAL_PORTABILITY); SSparms = (byte *)SSstruct; break; } rplci->internal_command = GETSERV_REQ_PEND; rplci->number = Number; rplci->appl = appl; sig_req(rplci,S_SUPPORTED,0); send_req(rplci); return FALSE; break; case S_LISTEN: if(parms->length==7) { if(api_parse(&parms->info[1],(word)parms->length,"wbd",ss_parms)) { dbug(1,dprintf("format wrong")); Info = _WRONG_MESSAGE_FORMAT; break; } } else { Info = _WRONG_MESSAGE_FORMAT; break; } a->Notification_Mask[appl->Id-1] = GET_DWORD(ss_parms[2].info); if(a->Notification_Mask[appl->Id-1] & SMASK_MWI) /* MWI active? */ { if((i=get_plci(a))) { rplci = &a->plci[i-1]; rplci->appl = appl; add_p(rplci,CAI,"\x01\x80"); add_p(rplci,UID,"\x06\x43\x61\x70\x69\x32\x30"); sig_req(rplci,ASSIGN,DSIG_ID); send_req(rplci); } else { break; } rplci->internal_command = GET_MWI_STATE; rplci->number = Number; sig_req(rplci,MWI_POLL,0); send_req(rplci); } break; case S_HOLD: api_parse(&parms->info[1],(word)parms->length,"ws",ss_parms); if(plci && plci->State && plci->SuppState==IDLE) { plci->SuppState = HOLD_REQUEST; plci->command = C_HOLD_REQ; add_s(plci,CAI,&ss_parms[1]); sig_req(plci,CALL_HOLD,0); send_req(plci); return FALSE; } else Info = 0x3010; /* wrong state */ break; case S_RETRIEVE: if(plci && plci->State && plci->SuppState==CALL_HELD) { if(Id & EXT_CONTROLLER) { if(AdvCodecSupport(a, plci, appl, 0)) { Info = 0x3010; /* wrong state */ break; } } else plci->tel = 0; plci->SuppState = RETRIEVE_REQUEST; plci->command = C_RETRIEVE_REQ; if(plci->spoofed_msg==SPOOFING_REQUIRED) { plci->spoofed_msg = CALL_RETRIEVE; plci->internal_command = BLOCK_PLCI; plci->command = 0; dbug(1,dprintf("Spoof")); return FALSE; } else { sig_req(plci,CALL_RETRIEVE,0); send_req(plci); return FALSE; } } else Info = 0x3010; /* wrong state */ break; case S_SUSPEND: if(parms->length) { if(api_parse(&parms->info[1],(word)parms->length,"wbs",ss_parms)) { dbug(1,dprintf("format wrong")); Info = _WRONG_MESSAGE_FORMAT; break; } } if(plci && plci->State) { add_s(plci,CAI,&ss_parms[2]); plci->command = SUSPEND_REQ; sig_req(plci,SUSPEND,0); plci->State = SUSPENDING; send_req(plci); } else Info = 0x3010; /* wrong state */ break; case S_RESUME: if(!(i=get_plci(a)) ) { Info = _OUT_OF_PLCI; break; } rplci = &a->plci[i-1]; rplci->appl = appl; rplci->number = Number; rplci->tel = 0; rplci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE; /* check 'external controller' bit for codec support */ if(Id & EXT_CONTROLLER) { if(AdvCodecSupport(a, rplci, appl, 0) ) { rplci->Id = 0; Info = 0x300A; break; } } if(parms->length) { if(api_parse(&parms->info[1],(word)parms->length,"wbs",ss_parms)) { dbug(1,dprintf("format wrong")); rplci->Id = 0; Info = _WRONG_MESSAGE_FORMAT; break; } } dummy.length = 0; dummy.info = "\x00"; add_b1(rplci, &dummy, 0, 0); if (a->Info_Mask[appl->Id-1] & 0x200) { /* early B3 connect (CIP mask bit 9) no release after a disc */ add_p(rplci,LLI,"\x01\x01"); } add_p(rplci,UID,"\x06\x43\x61\x70\x69\x32\x30"); sig_req(rplci,ASSIGN,DSIG_ID); send_req(rplci); add_s(rplci,CAI,&ss_parms[2]); rplci->command = RESUME_REQ; sig_req(rplci,RESUME,0); rplci->State = RESUMING; send_req(rplci); break; case S_CONF_BEGIN: /* Request */ case S_CONF_DROP: case S_CONF_ISOLATE: case S_CONF_REATTACH: if(api_parse(&parms->info[1],(word)parms->length,"wbd",ss_parms)) { dbug(1,dprintf("format wrong")); Info = _WRONG_MESSAGE_FORMAT; break; } if(plci && plci->State && ((plci->SuppState==IDLE)||(plci->SuppState==CALL_HELD))) { d = GET_DWORD(ss_parms[2].info); if(d>=0x80) { dbug(1,dprintf("format wrong")); Info = _WRONG_MESSAGE_FORMAT; break; } plci->ptyState = (byte)SSreq; plci->command = 0; cai[0] = 2; switch(SSreq) { case S_CONF_BEGIN: cai[1] = CONF_BEGIN; plci->internal_command = CONF_BEGIN_REQ_PEND; break; case S_CONF_DROP: cai[1] = CONF_DROP; plci->internal_command = CONF_DROP_REQ_PEND; break; case S_CONF_ISOLATE: cai[1] = CONF_ISOLATE; plci->internal_command = CONF_ISOLATE_REQ_PEND; break; case S_CONF_REATTACH: cai[1] = CONF_REATTACH; plci->internal_command = CONF_REATTACH_REQ_PEND; break; } cai[2] = (byte)d; /* Conference Size resp. PartyId */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -