Annotation of libwww/Library/src/HTHeader.c, revision 2.4

2.1       frystyk     1: /*                                                                  HTHeader.c
                      2: **     EXTRA HEADER MANAGER
                      3: **
                      4: **     (c) COPYRIGHT MIT 1995.
                      5: **     Please first read the full copyright statement in the file COPYRIGH.
                      6: **
                      7: ** HISTORY:
                      8: **     2 Nov 95 HFN    Written on a rainy night
                      9: */
                     10: 
                     11: /* Library Include files */
                     12: #include "tcp.h"
                     13: #include "HTUtils.h"
                     14: #include "HTString.h"
                     15: #include "HTParse.h"
                     16: #include "HTString.h"
                     17: #include "HTReq.h"
                     18: #include "HTHeader.h"                                   /* Implemented here */
                     19: 
                     20: typedef struct _HTParser {
                     21:     char *             token;
                     22:     BOOL               case_sensitive;
                     23:     HTParserCallback   *Pcbf;
                     24: } HTParser;
                     25: 
                     26: PRIVATE HTList * HTParsers = NULL;
                     27: PRIVATE HTList * HTGenerators = NULL;
                     28: 
                     29: /* --------------------------------------------------------------------------*/
                     30: 
                     31: /*
                     32: **     Register a Header parser to be called
                     33: **     Tokens can contain a wildcard '*' which will match zero or more 
                     34: **     arbritary chars.
                     35: */
                     36: PUBLIC BOOL HTParser_add (HTList *             parsers,
                     37:                          CONST char *          token,
                     38:                          BOOL                  case_sensitive,
                     39:                          HTParserCallback *    callback)
                     40: {
                     41:     if (token && callback) {
                     42:        HTParser *me = (HTParser *) calloc(1, sizeof(HTParser));
                     43:        if (me == NULL) outofmem(__FILE__, "HTParser_add");
                     44:        StrAllocCopy(me->token, token);
                     45:        me->case_sensitive = case_sensitive;
                     46:        me->Pcbf = callback;
                     47:        return HTList_addObject(parsers, (void *) me);
                     48:     }
                     49:     return NO;
                     50: }
                     51: 
                     52: /*
                     53: **     Unregister a Header parser
                     54: */
                     55: PUBLIC BOOL HTParser_delete (HTList * parsers, CONST char * token)
                     56: {
                     57:     if (parsers) {
                     58:        HTList *cur = parsers;
                     59:        HTParser *pres;
                     60:        while ((pres = (HTParser *) HTList_nextObject(cur))) {
                     61:            if (!strcmp(pres->token, token)) {
                     62:                FREE(pres->token);
                     63:                return HTList_removeObject(parsers, (void *) pres);
                     64:            }
                     65:        }
                     66:     }
                     67:     return NO;
                     68: }
                     69: 
                     70: /*
                     71: **     Delete the list of registered header parsers.
                     72: */
                     73: PUBLIC BOOL HTParser_deleteAll (HTList * parsers)
                     74: {
                     75:     if (parsers) {
                     76:        HTList *cur = parsers;
                     77:        HTParser *pres;
                     78:        while ((pres = (HTParser *) HTList_nextObject(cur))) {
                     79:            FREE(pres->token);
                     80:            free(pres);
                     81:        }
                     82:        HTList_delete(parsers);
                     83:        parsers = NULL;
                     84:        return YES;
                     85:     }
                     86:     return NO;
                     87: }
                     88: 
                     89: /*
                     90: **     Search registered parsers to find suitable one for this token
                     91: **     If a parser isn't found, the function returns NULL
                     92: */
                     93: PUBLIC HTParserCallback * HTParser_find (HTList *parsers, CONST char * token)
                     94: {
                     95:     HTList * cur = parsers;
                     96:     HTParser * pres;
                     97:     if (token && cur) {
                     98:        while ((pres = (HTParser *) HTList_nextObject(cur))) {
2.3       frystyk    99:            char *match = pres->case_sensitive ?
2.2       frystyk   100:                HTStrCaseMatch(pres->token, token) : 
                    101:                    HTStrMatch(pres->token, token);
2.1       frystyk   102:            if (match) return pres->Pcbf;
                    103:        }
                    104:     }
                    105:     return NULL;
                    106: }
                    107: 
                    108: /*
                    109: **     Register a Header generator to be called when we make request
                    110: */
                    111: PUBLIC BOOL HTGenerator_add (HTList * gens, HTPostCallback * callback)
                    112: {
                    113:     return callback ? HTList_addObject(gens, (void *) callback) : NO;
                    114: }
                    115: 
                    116: /*
                    117: **     Unregister a Header generator
                    118: */
                    119: PUBLIC BOOL HTGenerator_delete (HTList * gens, HTPostCallback * callback)
                    120: {
                    121:     return callback ? HTList_removeObject(gens, (void *) callback) : NO;
                    122: }
                    123: 
                    124: /*
                    125: **     Delete the list of registered header generators.
                    126: */
                    127: PUBLIC BOOL HTGenerator_deleteAll (HTList * gens)
                    128: {
                    129:     return HTList_delete(gens);
                    130: }
                    131: 
                    132: /* ------------------------------------------------------------------------- */
                    133: /*                  GLOBAL LIST OF PARSERS AND GENERATORS                   */
                    134: /* ------------------------------------------------------------------------- */
                    135: 
                    136: /*
                    137: **     Global List of parsers. list can be NULL
                    138: */
                    139: PUBLIC void HTHeader_setParser (HTList * list)
                    140: {
                    141:     HTParsers = list;
                    142: }
                    143: 
                    144: PUBLIC HTList * HTHeader_parser (void)
                    145: {
                    146:     return HTParsers;
                    147: }
                    148: 
2.4     ! frystyk   149: PUBLIC BOOL HTHeader_addParser (CONST char * token, BOOL case_sensitive,
        !           150:                                HTParserCallback * callback)
        !           151: {
        !           152:     if (!HTParsers) HTParsers = HTList_new();
        !           153:     return HTParser_add(HTParsers, token, case_sensitive, callback);
        !           154: }
        !           155: 
2.1       frystyk   156: /*
                    157: **     Global List of header generators. list can be NULL
                    158: */
                    159: PUBLIC void HTHeader_setGenerator (HTList * list)
                    160: {
                    161:     HTGenerators = list;
                    162: }
                    163: 
                    164: PUBLIC HTList * HTHeader_generator (void)
                    165: {
                    166:     return HTGenerators;
2.4     ! frystyk   167: }
        !           168: 
        !           169: PUBLIC BOOL HTHeader_addGenerator (CONST char * token, BOOL case_sensitive,
        !           170:                                   HTParserCallback * callback)
        !           171: {
        !           172:     if (!HTGenerators) HTGenerators = HTList_new();
        !           173:     return HTParser_add(HTGenerators, token, case_sensitive, callback);
2.1       frystyk   174: }
                    175: 
                    176: /*
                    177: **     Convenience function to clean up
                    178: */
                    179: PUBLIC void HTHeader_deleteAll (void)
                    180: {
                    181:     if (HTParsers) {
                    182:        HTParser_deleteAll(HTParsers);
                    183:        HTParsers = NULL;
                    184:     }
                    185:     if (HTGenerators) {
                    186:        HTGenerator_deleteAll(HTGenerators);
                    187:        HTGenerators = NULL;
                    188:     }
                    189: }

Webmaster