Annotation of libwww/Library/src/HTTrans.c, revision 2.9
2.1 frystyk 1: /* HTTrans.c
2: ** TRANSPORT LAYER MANAGER
3: **
4: ** (c) COPYRIGHT MIT 1995.
5: ** Please first read the full copyright statement in the file COPYRIGH.
2.9 ! vbancrof 6: ** @(#) $Id: HTTrans.c,v 2.8 1999/04/04 00:09:14 frystyk Exp $
2.1 frystyk 7: **
8: ** HISTORY:
9: ** Marts 96 HFN Written
10: */
11:
12: /* Library Include files */
2.5 frystyk 13: #include "wwwsys.h"
2.4 frystyk 14: #include "WWWUtil.h"
2.1 frystyk 15: #include "HTParse.h"
16: #include "HTReq.h"
17: #include "HTIOStream.h"
18: #include "HTTrans.h" /* Implemented here */
19:
20: PRIVATE HTList * transports = NULL; /* List of registered transports */
21:
22: /* --------------------------------------------------------------------------*/
23:
24: /*
25: ** Register a Transport module
26: */
27: PUBLIC BOOL HTTransport_add (const char * name,
2.4 frystyk 28: HTTransportMode mode,
2.1 frystyk 29: HTInput_new * get_input,
30: HTOutput_new * get_output)
31: {
2.3 frystyk 32: if (name && (get_input || get_output)) {
2.1 frystyk 33: HTTransport * tp;
34: if ((tp = (HTTransport *) HT_CALLOC(1, sizeof(HTTransport))) == NULL)
35: HT_OUTOFMEM("HTTransport_add");
36: StrAllocCopy(tp->name, name);
37: {
38: char *ptr = tp->name;
39: while ((*ptr = TOLOWER(*ptr))) ptr++;
40: }
41: tp->mode = mode;
42: tp->input_new = get_input;
43: tp->output_new = get_output;
44: if (!transports) transports = HTList_new();
2.9 ! vbancrof 45: else HTTransport_delete(name); /* Ensure not listed twice */
2.7 frystyk 46: HTTRACE(CORE_TRACE, "Transport... Adding `%s'\n" _ name);
2.1 frystyk 47: return HTList_addObject(transports, (void *) tp);
2.7 frystyk 48: } else HTTRACE(CORE_TRACE, "Transport... Can't add this...\n");
2.1 frystyk 49: return NO;
50: }
51:
52: /*
53: ** Deletes a Transport module
54: */
55: PUBLIC BOOL HTTransport_delete (const char * name)
56: {
57: if (transports) {
58: HTList *cur = transports;
59: HTTransport *pres;
60: while ((pres = (HTTransport *) HTList_nextObject(cur))) {
61: if (!strcmp(pres->name, name)) {
2.8 frystyk 62: BOOL status = HTList_removeObject(transports, (void *) pres);
2.1 frystyk 63: HT_FREE(pres->name);
2.8 frystyk 64: HT_FREE(pres);
65: return status;
2.1 frystyk 66: }
67: }
68: }
69: return NO;
70: }
71:
72: /*
73: ** Delete the list of registered transports. This is called from
74: ** within HTLibTerminate.
75: */
76: PUBLIC BOOL HTTransport_deleteAll (void)
77: {
78: if (transports) {
79: HTList * cur = transports;
80: HTTransport * pres;
81: while ((pres = (HTTransport *) HTList_nextObject(cur))) {
82: HT_FREE(pres->name);
83: HT_FREE(pres);
84: }
85: HTList_delete(transports);
86: transports = NULL;
87: return YES;
88: }
89: return NO;
90: }
91:
92: /*
93: ** Search registered transports to find a suitable transport object.
94: ** Return transport object or NULL
95: */
96: PUBLIC HTTransport * HTTransport_find (HTRequest * request, const char * name)
97: {
2.6 frystyk 98: if (name) {
2.1 frystyk 99: HTList * cur = transports;
100: HTTransport * pres;
101: if (cur) {
102: while ((pres = (HTTransport *) HTList_nextObject(cur))) {
103: if (!strcmp(pres->name, name)) return pres;
104: }
105: }
2.6 frystyk 106: if (request)
107: HTRequest_addError(request, ERR_FATAL, NO, HTERR_CLASS, (char *) name,
108: (int) strlen(name), "HTTransport_find");
2.1 frystyk 109: }
110: return NULL;
111: }
112:
2.4 frystyk 113: PUBLIC HTTransportMode HTTransport_mode (HTTransport * tp)
2.1 frystyk 114: {
2.4 frystyk 115: return (tp ? tp->mode : HT_TP_SINGLE);
2.1 frystyk 116: }
2.4 frystyk 117:
118: PUBLIC BOOL HTTransport_setMode (HTTransport * tp, HTTransportMode mode)
119: {
120: if (tp) {
121: tp->mode = mode;
122: return YES;
123: }
124: return NO;
125: }
126:
Webmaster