Q931dialect.c

Go to the documentation of this file.
00001 #include <assert.h>
00002 
00003 #define Q931PRIVATE
00004 #include "Q931.h"
00005 
00006 /*
00007  * Internal data structures
00008  */
00009 struct Q931Dialect {
00010         L3INT id;
00011         L3INT flags;                            
00012         L3UCHAR mode;                           
00013         L3UCHAR codesets;                       
00015         const char *name;                       
00017         /* Tables */
00018         struct Q931MessageIE     *mesIEMap;             
00019         Q931State                states[Q931MAXSTATE];  
00021         /* Callbacks */
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  * Private global
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  * Dialect codesets
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  * Dialect flags
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  * IE cb table
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  * Timer
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  * State table
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         /* strip other flags */
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  * Callback helpers
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  * Toolfunctions
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 }

Generated on Tue Apr 7 17:38:19 2009 for mod_ssh by  doxygen 1.5.4