2007-05-06 13:54:52 +00:00
/*****************************************************************************\
* * * *
* * PBX4Linux * *
* * * *
* * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * *
* * Copyright : Andreas Eversberg * *
* * * *
* * cause database * *
* * * *
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-06-01 16:52:10 +00:00
# include <stdio.h>
# include <stdarg.h>
# include <string.h>
# include <stdlib.h>
# include "macro.h"
# include "cause.h"
# include "extension.h"
2007-05-06 13:54:52 +00:00
struct isdn_cause isdn_cause [ 128 ] = {
/********************************* - **/ /*38*/
{ /*0*/ " <No cause> " ,
" <Kein Grund> " } ,
{ /*1*/ " Unallocated number " ,
" Nummer nicht vergeben " } ,
{ /*2*/ " No route to transit network " ,
" Keine Verbindung zum Netz " } ,
{ /*3*/ " No route to destination " ,
" Zielnummer nicht erreichbar " } ,
{ /*4*/ " <Listen to announcement...> " ,
" <Ansage hoeren...> " } ,
{ /*5*/ " Misdialed trunk prefix. " ,
" Falscher Carrier-Code " } ,
{ /*6*/ " Channel unacceptable " ,
" Kanal nicht akzeptiert " } ,
{ /*7*/ " " ,
" " } ,
{ /*8*/ " Preemption " ,
" Vorkauf " } ,
{ /*9*/ " Preemption - circuit reserved " ,
" Vorkauf - Gasse reserviert " } ,
{ /*10*/ " " ,
" " } ,
{ /*11*/ " " ,
" " } ,
{ /*12*/ " " ,
" " } ,
{ /*13*/ " " ,
" " } ,
{ /*14*/ " " ,
" " } ,
{ /*15*/ " " ,
" " } ,
{ /*16*/ " Normal call clearing " ,
" Normaler Verbindungsabbau " } ,
{ /*17*/ " User busy " ,
" Teilnehmer besetzt " } ,
{ /*18*/ " No user responding " ,
" Teilnehmer antwortet nicht " } ,
{ /*19*/ " No answer from user " ,
" Teilnehmer nimmt nicht ab " } ,
{ /*20*/ " Subscriber absent " ,
" Teilnehmer nicht anwesend " } ,
{ /*21*/ " Call rejected " ,
" Gespraech abgewiesen " } ,
{ /*22*/ " Number changed " ,
" Rufnummer hat sich geaendert " } ,
{ /*23*/ " " ,
" " } ,
{ /*24*/ " " ,
" " } ,
{ /*25*/ " " ,
" " } ,
{ /*26*/ " Non-selected user clearing " ,
" Gespraech woanders angenommen " } ,
{ /*27*/ " Destination out of order " ,
" Gegenstelle ausser Betrieb " } ,
{ /*28*/ " Invalid number (incomplete) " ,
" Fehlerhafte Nummer (n. komplett) " } ,
{ /*29*/ " Facility rejected " ,
" Funktion nicht verfuegbar " } ,
{ /*30*/ " " ,
" " } ,
{ /*31*/ " Normal, unspecified " ,
" Normal, unspezifisch " } ,
{ /*32*/ " " ,
" " } ,
{ /*33*/ " " ,
" " } ,
{ /*34*/ " No circuit/channel available " ,
" Keine Gasse/Kanal verfuegbar " } ,
{ /*35*/ " " ,
" " } ,
{ /*36*/ " " ,
" " } ,
{ /*37*/ " " ,
" " } ,
{ /*38*/ " " ,
" " } ,
{ /*39*/ " " ,
" " } ,
{ /*40*/ " " ,
" " } ,
{ /*41*/ " Temporary failure " ,
" Vorruebergehende Fehlfunktion " } ,
{ /*42*/ " Switchting equipment congestion " ,
" Vermittlungstelle ueberlastet " } ,
{ /*43*/ " Access informationen discarded " ,
" Zugriffsinformationen geloescht " } ,
{ /*44*/ " No requested circuit/channel " ,
" Keine angeforderte Gasse/Kanal " } ,
{ /*45*/ " " ,
" " } ,
{ /*46*/ " Precedence call blocked " ,
" Vorverkaufanruf gesperrt " } ,
{ /*47*/ " Resource unavailable, unspecified " ,
" " } ,
{ /*48*/ " " ,
" " } ,
{ /*49*/ " Quality of service not available " ,
" Qualitaetsmerkmal nicht verfuegbar " } ,
{ /*50*/ " Requested facility not subscribed " ,
" Funktion nicht freigeschaltet " } ,
{ /*51*/ " " ,
" " } ,
{ /*52*/ " " ,
" " } ,
{ /*53*/ " Outgoing calls barred within CUG " ,
" CUG erlaubt keine gehenden Rufe " } ,
{ /*54*/ " " ,
" " } ,
{ /*55*/ " Incoming calls barred within CUG " ,
" CUG erlaubt keine kommenden Rufe " } ,
{ /*56*/ " " ,
" " } ,
{ /*57*/ " Bearer capability not authorized " ,
" Verbindungseigenschaft verboten " } ,
{ /*58*/ " Bearer capability not present " ,
" Verb.eigenschaft n. verfuegbar " } ,
{ /*59*/ " " ,
" " } ,
{ /*60*/ " " ,
" " } ,
{ /*61*/ " " ,
" " } ,
{ /*62*/ " " ,
" " } ,
{ /*63*/ " Service or option not available " ,
" Dienst oder Merkmal nicht verf. " } ,
{ /*64*/ " " ,
" " } ,
{ /*65*/ " Bearer capability not implement. " ,
" Verb.eigenschaft nicht unterstue. " } ,
{ /*66*/ " Channel type not implemented " ,
" Kanalart nicht unterstuetzt " } ,
{ /*67*/ " " ,
" " } ,
{ /*68*/ " " ,
" " } ,
{ /*69*/ " Requested facility not implement. " ,
" Funktion nicht unterstuetzt " } ,
{ /*70*/ " restricted digital informat. only " ,
" Nur eingeschraenkte digitale inf. " } ,
{ /*71*/ " " ,
" " } ,
{ /*72*/ " " ,
" " } ,
{ /*73*/ " " ,
" " } ,
{ /*74*/ " " ,
" " } ,
{ /*75*/ " " ,
" " } ,
{ /*76*/ " " ,
" " } ,
{ /*77*/ " " ,
" " } ,
{ /*78*/ " " ,
" " } ,
{ /*79*/ " Service or option not implemented " ,
" Dienst oder Merkmal n. unterstue. " } ,
{ /*80*/ " " ,
" " } ,
{ /*81*/ " Invalid call reference value " ,
" Falsche call reference " } ,
{ /*82*/ " Identified channel does not exist " ,
" Erkannter Kanal existiert nicht " } ,
{ /*83*/ " No suspended call with this id " ,
" Kein geparktes Gespr. f. diese ID " } ,
{ /*84*/ " Call identity in use " ,
" ID in gebrauch " } ,
{ /*85*/ " No call suspended " ,
" Kein geparktes Gespraech " } ,
{ /*86*/ " Suspended call has been cleared " ,
" Geparktes Gespraech wurde beendet " } ,
{ /*87*/ " User not member of CUG " ,
" Teilnehmer nicht in der CUG " } ,
{ /*88*/ " Incompatibel destination " ,
" Gegenstelle nicht kompatibel " } ,
{ /*89*/ " " ,
" " } ,
{ /*90*/ " Non-existent CUG " ,
" CUG existiert nicht " } ,
{ /*91*/ " Invalid transit network selection " ,
" Falscher Carrier-Code " } ,
{ /*92*/ " " ,
" " } ,
{ /*93*/ " " ,
" " } ,
{ /*94*/ " " ,
" " } ,
{ /*95*/ " Invalid message, unspecified " ,
" Fehlerhafte Daten, unbekannt " } ,
{ /*96*/ " Information element missing " ,
" Information wird vermisst " } ,
{ /*97*/ " Message type non-existent " ,
" Message exisitiert nicht " } ,
{ /*98*/ " Message not compatible with state " ,
" Message nicht komatibel " } ,
{ /*99*/ " Information element not impl. " ,
" Information nicht implementiert " } ,
{ /*100*/ " Invalid info element contents " ,
" Fehlerhafterhafte Information " } ,
{ /*101*/ " Message not compatible with state " ,
" Message not kompatibel " } ,
{ /*102*/ " Recovery on timer expiry " ,
" Fehler durch Zeitueberschreitung " } ,
{ /*103*/ " Parameter non-existent " ,
" Parameter fehlt " } ,
{ /*104*/ " " ,
" " } ,
{ /*105*/ " " ,
" " } ,
{ /*106*/ " " ,
" " } ,
{ /*107*/ " " ,
" " } ,
{ /*108*/ " " ,
" " } ,
{ /*109*/ " " ,
" " } ,
{ /*110*/ " " ,
" " } ,
{ /*111*/ " Protocol error, unspecified " ,
" Protokollfehler, unbekannt " } ,
{ /*112*/ " " ,
" " } ,
{ /*113*/ " " ,
" " } ,
{ /*114*/ " " ,
" " } ,
{ /*115*/ " " ,
" " } ,
{ /*116*/ " " ,
" " } ,
{ /*117*/ " " ,
" " } ,
{ /*118*/ " " ,
" " } ,
{ /*119*/ " " ,
" " } ,
{ /*120*/ " " ,
" " } ,
{ /*121*/ " " ,
" " } ,
{ /*122*/ " " ,
" " } ,
{ /*123*/ " " ,
" " } ,
{ /*124*/ " " ,
" " } ,
{ /*125*/ " " ,
" " } ,
{ /*126*/ " " ,
" " } ,
{ /*127*/ " Interworking, unspecified " ,
" Zusammenspiel, unbekannt " } ,
} ;
struct isdn_cause isdn_cause_class [ 8 ] = {
/********************************* - **/ /*38*/
{ /*0*/ " (Normal class) " ,
" (Normale Fehlerklasse) " } ,
{ /*16*/ " (Normal class) " ,
" (Normale Fehlerklasse) " } ,
{ /*32*/ " (Resource unavailable class) " ,
" (Ressourcen nicht verfuegbar) " } ,
{ /*48*/ " (Service or option unavailable) " ,
" (Dienst oder Merkmal n. verfueg.) " } ,
{ /*64*/ " (Service or option n.implemented) " ,
" (Dienst oder Merkmal n. vorhand.) " } ,
{ /*80*/ " (Invalid message class) " ,
" (Fehlerhafte Message) " } ,
{ /*96*/ " (Protocol error class) " ,
" (Klasse der Protokollfehler) " } ,
{ /*112*/ " (Interworking class) " ,
" (Klasse des Zusammenspiels) " } ,
} ;
struct isdn_location isdn_location [ 16 ] = {
{ /*0*/ " User " ,
" Endger<EFBFBD> t " } ,
{ /*1*/ " Private (Local) " ,
" Anlage (Lokal) " } ,
{ /*2*/ " Public (Local) " ,
" Vermittlung (Lokal) " } ,
{ /*3*/ " Transit " ,
" Knotenvermittlung " } ,
{ /*4*/ " Public (Remote) " ,
" Vermittlung (Gegenstelle) " } ,
{ /*5*/ " Private (Remote) " ,
" Anlage (Gegenstelle) " } ,
{ /*6*/ " " ,
" " } ,
{ /*7*/ " International " ,
" Fernvermittlung " } ,
{ /*8*/ " " ,
" " } ,
{ /*9*/ " " ,
" " } ,
{ /*10*/ " Beyond Interworking " ,
" Nicht verfuegbar " } ,
{ /*11*/ " " ,
" " } ,
{ /*12*/ " " ,
" " } ,
{ /*13*/ " " ,
" " } ,
{ /*14*/ " " ,
" " } ,
{ /*15*/ " " ,
" " } ,
} ;
char * get_isdn_cause ( int cause , int location , int type )
{
static char result [ 128 ] ;
/* protect us */
if ( cause < 0 | | cause > 127 )
cause = 0 ;
switch ( type )
{
case DISPLAY_CAUSE_NUMBER :
SPRINT ( result , " Cause %d " , cause ) ;
break ;
case DISPLAY_CAUSE_ENGLISH :
if ( isdn_cause [ cause ] . english [ 0 ] )
SPRINT ( result , " %d - %s " , cause , isdn_cause [ cause ] . english ) ;
else SPRINT ( result , " %d - %s " , cause , isdn_cause_class [ cause > > 4 ] . english ) ;
break ;
case DISPLAY_CAUSE_GERMAN :
if ( isdn_cause [ cause ] . german [ 0 ] )
SPRINT ( result , " %d - %s " , cause , isdn_cause [ cause ] . german ) ;
else SPRINT ( result , " %d - %s " , cause , isdn_cause_class [ cause > > 4 ] . german ) ;
break ;
case DISPLAY_LOCATION_ENGLISH :
if ( isdn_location [ location ] . english [ 0 ] )
SPRINT ( result , " %d - %s " , cause , isdn_location [ location ] . english ) ;
else SPRINT ( result , " %d - Location code %d " , cause , location ) ;
break ;
case DISPLAY_LOCATION_GERMAN :
if ( isdn_location [ location ] . german [ 0 ] )
SPRINT ( result , " %d - %s " , cause , isdn_location [ location ] . german ) ;
else SPRINT ( result , " %d - Lokationscode %d " , cause , location ) ;
break ;
default :
result [ 0 ] = ' \0 ' ;
}
return ( result ) ;
}
2007-07-15 10:01:27 +00:00
/*
* collect cause for multipoint
* used by Process , Endpoint and Join instance when multiplexing
*/
void collect_cause ( int * multicause , int * multilocation , int newcause , int newlocation )
{
if ( newcause = = CAUSE_REJECTED ) /* call rejected */
{
* multicause = newcause ;
* multilocation = newlocation ;
} else
if ( newcause = = CAUSE_NORMAL & & * multicause ! = CAUSE_REJECTED ) /* reject via hangup */
{
* multicause = newcause ;
* multilocation = newlocation ;
} else
if ( newcause = = CAUSE_BUSY & & * multicause ! = CAUSE_REJECTED & & * multicause ! = CAUSE_NORMAL ) /* busy */
{
* multicause = newcause ;
* multilocation = newlocation ;
} else
if ( newcause = = CAUSE_OUTOFORDER & & * multicause ! = CAUSE_BUSY & & * multicause ! = CAUSE_REJECTED & & * multicause ! = CAUSE_NORMAL ) /* no L1 */
{
* multicause = newcause ;
* multilocation = newlocation ;
} else
if ( newcause ! = CAUSE_NOUSER & & * multicause ! = CAUSE_OUTOFORDER & & * multicause ! = CAUSE_BUSY & & * multicause ! = CAUSE_REJECTED & & * multicause ! = CAUSE_NORMAL ) /* anything but not 18 */
{
* multicause = newcause ;
* multilocation = newlocation ;
} else
2007-07-31 05:34:18 +00:00
if ( newcause = = CAUSE_NOUSER & & * multicause = = CAUSE_NOUSER ) /* cause 18, use the location */
2007-07-15 10:01:27 +00:00
{
* multilocation = newlocation ;
2007-07-31 05:34:18 +00:00
} else
if ( * multicause = = 0 ) /* no cause yet, use newcause (should be 18) */
{
* multicause = newcause ;
* multilocation = newlocation ;
2007-07-15 10:01:27 +00:00
}
}