summaryrefslogtreecommitdiffstats
path: root/cause.c
blob: 3b9ae8d7e4f34eb7968a67705134cadfa95de292 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
/*****************************************************************************\
**                                                                           **
** PBX4Linux                                                                 **
**                                                                           **
**---------------------------------------------------------------------------**
** Copyright: Andreas Eversberg                                              **
**                                                                           **
** cause database                                                            **
**                                                                           **
\*****************************************************************************/ 

#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include "macro.h"
#include "cause.h"
#include "extension.h"

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ä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);
}

/*
 * 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
	if (newcause==CAUSE_NOUSER && *multicause==CAUSE_NOUSER) { /* cause 18, use the location */
		*multilocation = newlocation;
	} else
	if (*multicause==0) { /* no cause yet, use newcause (should be 18) */
		*multicause = newcause;
		*multilocation = newlocation;
	}
}