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