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

📄 message.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -