00001 #include <assert.h>
00002
00003 #define Q931PRIVATE
00004 #include "Q931.h"
00005
00006
00007
00008
00009 struct Q931Dialect {
00010 L3INT id;
00011 L3INT flags;
00012 L3UCHAR mode;
00013 L3UCHAR codesets;
00015 const char *name;
00017
00018 struct Q931MessageIE *mesIEMap;
00019 Q931State states[Q931MAXSTATE];
00021
00022 q931proc_func_t *proc_unknown_cb;
00023 q931proc_func_t *proc_invalid_cb;
00024
00025 q931proc_func_t *proc_cb[Q931MAXMES];
00026 q931umes_func_t *umes_cb[Q931MAXMES];
00027 q931pmes_func_t *pmes_cb[Q931MAXMES];
00028
00029 q931uie_func_t *uie_cb[Q931MAXIE];
00030 q931pie_func_t *pie_cb[Q931MAXIE];
00031
00032 q931timeout_func_t *timeout_cb[Q931MAXTIMER];
00033 q931timer_t timeout[Q931MAXTIMER];
00034 };
00035
00036
00037
00038
00039 static struct Q931Dialect dialects[Q931MAXDLCT];
00040 static L3BOOL initialized = L3FALSE;
00041
00042
00043
00044
00045 void Q931DialectRegistryInit(void)
00046 {
00047 int x;
00048
00049 if (initialized) {
00050 return;
00051 }
00052
00053 memset(dialects, 0, sizeof(dialects));
00054
00055 for (x = 0; x < Q931MAXDLCT; x++) {
00056 dialects[x].id = -1;
00057 }
00058
00059 initialized = L3TRUE;
00060 }
00061
00062 void Q931DialectRegister(L3UCHAR id, L3INT mode, void (* create_func)(struct Q931Dialect *dialect))
00063 {
00064 int x;
00065
00066 for (x = 0; x < Q931MAXDLCT; x++) {
00067 if (dialects[x].id == -1) {
00068 continue;
00069 }
00070 if (dialects[x].id == id && dialects[x].mode == mode) {
00071 return;
00072 }
00073 }
00074
00075 for (x = 0; x < Q931MAXDLCT; x++) {
00076 if (dialects[x].id == -1) {
00077 dialects[x].id = id;
00078 dialects[x].mode = mode;
00079 create_func(&dialects[x]);
00080 break;
00081 }
00082 }
00083 }
00084
00085 struct Q931Dialect *Q931DialectGet(L3UCHAR id, L3INT mode)
00086 {
00087 int x;
00088
00089 for (x = 0; x < Q931MAXDLCT; x++) {
00090 if (dialects[x].id == -1) {
00091 continue;
00092 }
00093 if (dialects[x].id == id && dialects[x].mode == mode) {
00094 return &dialects[x];
00095 }
00096 }
00097 return NULL;
00098 }
00099
00100 void Q931DialectSetMesIEMap(struct Q931Dialect *dialect, struct Q931MessageIE *map)
00101 {
00102 assert(dialect);
00103 assert(map);
00104
00105 dialect->mesIEMap = map;
00106 }
00107
00108 struct Q931MessageIE* Q931DialectGetMesIEMap(struct Q931Dialect *dialect)
00109 {
00110 assert(dialect);
00111 assert(dialect->mesIEMap);
00112
00113 return dialect->mesIEMap;
00114 }
00115
00116
00117
00118
00119 void Q931DialectAddCodeset(struct Q931Dialect *dialect, L3UCHAR codeset)
00120 {
00121 assert(dialect);
00122
00123 if (codeset == Q931_CODESET_ALL) {
00124 dialect->codesets = Q931_CODESET_ALL;
00125 } else {
00126 dialect->codesets |= (1 << codeset);
00127 }
00128 }
00129
00130 L3BOOL Q931DialectIsValidCodeset(struct Q931Dialect *dialect, L3UCHAR codeset)
00131 {
00132 assert(dialect);
00133
00134 return ((dialect->codesets & codeset) != 0);
00135 }
00136
00137
00138
00139
00140 void Q931DialectSetFlag(struct Q931Dialect *dialect, L3INT flag)
00141 {
00142 assert(dialect);
00143
00144 dialect->flags |= flag;
00145 }
00146
00147 L3BOOL Q931DialectIsSetFlag(struct Q931Dialect *dialect, L3INT flag)
00148 {
00149 assert(dialect);
00150
00151 return ((dialect->flags & flag) != 0);
00152 }
00153
00154 void Q931DialectSetMesProc(struct Q931Dialect *dialect, L3UCHAR mes, q931proc_func_t *Q931ProcFunc, q931umes_func_t *Q931UmesFunc, q931pmes_func_t *Q931PmesFunc)
00155 {
00156 assert(dialect);
00157
00158 dialect->proc_cb[mes] = Q931ProcFunc;
00159 dialect->umes_cb[mes] = Q931UmesFunc;
00160 dialect->pmes_cb[mes] = Q931PmesFunc;
00161 }
00162
00163
00164
00165
00166 void Q931DialectSetIEProc(struct Q931Dialect *dialect, L3UCHAR iec, q931pie_func_t *Q931PieProc, q931uie_func_t *Q931UieProc)
00167 {
00168 assert(dialect);
00169
00170 dialect->uie_cb[iec] = Q931UieProc;
00171 dialect->pie_cb[iec] = Q931PieProc;
00172 }
00173
00174
00175
00176
00177 void Q931DialectSetTimerProc(struct Q931Dialect *dialect, L3UCHAR timer, q931timeout_func_t *Q931TimeoutProc)
00178 {
00179 assert(dialect);
00180
00181 dialect->timeout_cb[timer] = Q931TimeoutProc;
00182 }
00183
00184 void Q931DialectSetTimerProcAll(struct Q931Dialect *dialect, q931timeout_func_t *Q931TimeoutProc)
00185 {
00186 int i;
00187
00188 assert(dialect);
00189
00190 for (i = 0; i < Q931MAXTIMER; i++) {
00191 dialect->timeout_cb[i] = Q931TimeoutProc;
00192 }
00193 }
00194
00195 void Q931DialectSetTimeout(struct Q931Dialect *dialect, L3UCHAR timer, q931timer_t timeout)
00196 {
00197 assert(dialect);
00198
00199 dialect->timeout[timer] = timeout;
00200 }
00201
00202
00203
00204
00205 void Q931DialectAddStateEntry(struct Q931Dialect *dialect, L3INT state, L3INT mes, L3UCHAR flags)
00206 {
00207 int x;
00208
00209 assert(dialect);
00210 assert(dialect->states);
00211
00212 for (x = 0; x < Q931MAXSTATE; x++) {
00213 if (dialect->states[x].Message == 0) {
00214 dialect->states[x].State = state;
00215 dialect->states[x].Message = mes;
00216 dialect->states[x].Flags = flags;
00217 break;
00218 }
00219 }
00220 }
00221
00222 L3BOOL Q931DialectIsEventLegal(struct Q931Dialect *dialect, L3INT state, L3INT mes, L3UCHAR dirflags)
00223 {
00224 int x;
00225
00226 assert(dialect);
00227 assert(dialect->states);
00228
00229
00230 dirflags &= MSGF_FROM_BOTH;
00231
00232 for (x = 0; x < Q931MAXSTATE; x++) {
00233 if(!dialect->states[x].Message) {
00234 break;
00235 }
00236 if ((dialect->states[x].State & state) == state &&
00237 dialect->states[x].Message == mes &&
00238 dialect->states[x].Flags & dirflags) {
00239 return L3TRUE;
00240 }
00241 }
00242 return L3FALSE;
00243 }
00244
00245
00246
00247
00248
00249 void Q931DialectSetUnknownMesProc(struct Q931Dialect *dialect, q931proc_func_t proc)
00250 {
00251 dialect->proc_unknown_cb = proc;
00252 }
00253
00254 q931proc_func_t *Q931DialectGetUnknownMesProc(const struct Q931Dialect *dialect)
00255 {
00256 return dialect->proc_unknown_cb;
00257 }
00258
00259 void Q931DialectSetInvalidMesProc(struct Q931Dialect *dialect, q931proc_func_t proc)
00260 {
00261 dialect->proc_invalid_cb = proc;
00262 }
00263
00264 q931proc_func_t *Q931DialectGetInvalidMesProc(const struct Q931Dialect *dialect)
00265 {
00266 return dialect->proc_invalid_cb;
00267 }
00268
00269
00270 q931proc_func_t *Q931DialectGetMesProc(const struct Q931Dialect *dialect, L3UCHAR type)
00271 {
00272 return dialect->proc_cb[type];
00273 }
00274
00275 q931umes_func_t *Q931DialectGetUmesProc(const struct Q931Dialect *dialect, L3UCHAR type)
00276 {
00277 return dialect->umes_cb[type];
00278 }
00279
00280 q931pmes_func_t *Q931DialectGetPmesProc(const struct Q931Dialect *dialect, L3UCHAR type)
00281 {
00282 return dialect->pmes_cb[type];
00283 }
00284
00285
00286 q931uie_func_t *Q931DialectGetUieProc(const struct Q931Dialect *dialect, L3UCHAR type)
00287 {
00288 return dialect->uie_cb[type];
00289 }
00290
00291 q931pie_func_t *Q931DialectGetPieProc(const struct Q931Dialect *dialect, L3UCHAR type)
00292 {
00293 return dialect->pie_cb[type];
00294 }
00295
00296
00297 q931timeout_func_t *Q931DialectGetTimerProc(const struct Q931Dialect *dialect, L3UCHAR timer)
00298 {
00299 return dialect->timeout_cb[timer];
00300 }
00301
00302 q931timer_t Q931DialectGetTimeout(const struct Q931Dialect *dialect, L3UCHAR timer)
00303 {
00304 return dialect->timeout[timer];
00305 }
00306
00307
00308
00309
00310 L3INT Q931DialectGetID(const struct Q931Dialect *dialect)
00311 {
00312 return dialect->id;
00313 }
00314
00315 Q931Dialect_t Q931DialectGetType(const struct Q931Dialect *dialect)
00316 {
00317 return (dialect->id & (~Q931_NT));
00318 }
00319
00320 Q931NetUser_t Q931DialectGetMode(const struct Q931Dialect *dialect)
00321 {
00322 return (dialect->id & Q931_NT);
00323 }
00324
00325 const char * Q931DialectGetName(const struct Q931Dialect *dialect)
00326 {
00327 return dialect->name;
00328 }
00329
00330 void Q931DialectSetName(struct Q931Dialect *dialect, const char *name)
00331 {
00332 dialect->name = name;
00333 }