Annotation of libwww/Library/src/HTTrans.c, revision 2.3
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.3 ! frystyk 6: ** @(#) $Id: HTTrans.c,v 2.2 1996/06/28 16:31:29 frystyk Exp $
2.1 frystyk 7: **
8: ** HISTORY:
9: ** Marts 96 HFN Written
10: */
11:
12: /* Library Include files */
13: #include "sysdep.h"
14: #include "HTUtils.h"
15: #include "HTString.h"
16: #include "HTParse.h"
17: #include "HTReq.h"
18: #include "HTIOStream.h"
19: #include "HTTrans.h" /* Implemented here */
20:
21: PRIVATE HTList * transports = NULL; /* List of registered transports */
22:
23: /* --------------------------------------------------------------------------*/
24:
25: /*
26: ** Register a Transport module
27: */
28: PUBLIC BOOL HTTransport_add (const char * name,
29: HTChannelMode mode,
30: HTInput_new * get_input,
31: HTOutput_new * get_output)
32: {
2.3 ! frystyk 33: if (name && (get_input || get_output)) {
2.1 frystyk 34: HTTransport * tp;
35: if ((tp = (HTTransport *) HT_CALLOC(1, sizeof(HTTransport))) == NULL)
36: HT_OUTOFMEM("HTTransport_add");
37: StrAllocCopy(tp->name, name);
38: {
39: char *ptr = tp->name;
40: while ((*ptr = TOLOWER(*ptr))) ptr++;
41: }
42: tp->mode = mode;
43: tp->input_new = get_input;
44: tp->output_new = get_output;
45: if (!transports) transports = HTList_new();
2.2 frystyk 46: if (CORE_TRACE) HTTrace("Transport... Adding `%s'\n", name);
2.1 frystyk 47: return HTList_addObject(transports, (void *) tp);
2.3 ! frystyk 48: } else if (CORE_TRACE) HTTrace("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)) {
62: HT_FREE(pres->name);
63: return HTList_removeObject(transports, (void *) pres);
64: }
65: }
66: }
67: return NO;
68: }
69:
70: /*
71: ** Delete the list of registered transports. This is called from
72: ** within HTLibTerminate.
73: */
74: PUBLIC BOOL HTTransport_deleteAll (void)
75: {
76: if (transports) {
77: HTList * cur = transports;
78: HTTransport * pres;
79: while ((pres = (HTTransport *) HTList_nextObject(cur))) {
80: HT_FREE(pres->name);
81: HT_FREE(pres);
82: }
83: HTList_delete(transports);
84: transports = NULL;
85: return YES;
86: }
87: return NO;
88: }
89:
90: /*
91: ** Search registered transports to find a suitable transport object.
92: ** Return transport object or NULL
93: */
94: PUBLIC HTTransport * HTTransport_find (HTRequest * request, const char * name)
95: {
96: if (request && name) {
97: HTList * cur = transports;
98: HTTransport * pres;
99: if (cur) {
100: while ((pres = (HTTransport *) HTList_nextObject(cur))) {
101: if (!strcmp(pres->name, name)) return pres;
102: }
103: }
104: HTRequest_addError(request, ERR_FATAL, NO, HTERR_CLASS, (char *) name,
105: (int) strlen(name), "HTTransport_find");
106: }
107: return NULL;
108: }
109:
110: PUBLIC HTChannelMode HTTransport_mode (HTTransport * tp)
111: {
112: return (tp ? tp->mode : HT_CH_SINGLE);
113: }
Webmaster