Annotation of libwww/Library/src/HTTee.c, revision 2.11
2.5 frystyk 1: /* HTee.c
2: ** TEE CLASS STREAM DEFINITION
3: **
2.9 frystyk 4: ** (c) COPYRIGHT MIT 1995.
2.5 frystyk 5: ** Please first read the full copyright statement in the file COPYRIGH.
2.1 timbl 6: **
7: ** The Tee class just writes to two streams. Easy.
8: ** See also the Black Hole stream which is even easier.
2.3 duns 9: **
10: ** HISTORY:
11: ** 8 Jul 94 FM Insulate free() from _free structure element.
12: **
2.1 timbl 13: */
14:
2.7 frystyk 15: /* Library include files */
16: #include "tcp.h"
17: #include "HTUtils.h"
2.1 timbl 18: #include "HTTee.h"
19:
20: /* Stream Object
21: ** ------------
22: */
23:
24: struct _HTStream {
25: CONST HTStreamClass * isa;
26:
27: HTStream * s1;
28: HTStream * s2;
29: };
30:
31:
2.11 ! frystyk 32: PRIVATE int HTTee_put_character (HTStream * me, char c)
2.1 timbl 33: {
2.8 frystyk 34: int ret1 = (*me->s1->isa->put_character)(me->s1, c);
35: int ret2 = (*me->s2->isa->put_character)(me->s2, c);
36: return (!(ret1+ret2) ? HT_OK :
37: (ret1==HT_ERROR || ret2==HT_ERROR) ? HT_ERROR :
38: HT_WOULD_BLOCK);
2.1 timbl 39: }
2.8 frystyk 40:
2.11 ! frystyk 41: PRIVATE int HTTee_put_string (HTStream * me, CONST char* s)
2.1 timbl 42: {
2.8 frystyk 43: int ret1 = (*me->s1->isa->put_string)(me->s1, s);
44: int ret2 = (*me->s2->isa->put_string)(me->s2, s);
45: return (!(ret1+ret2) ? HT_OK :
46: (ret1==HT_ERROR || ret2==HT_ERROR) ? HT_ERROR :
47: HT_WOULD_BLOCK);
2.1 timbl 48: }
2.8 frystyk 49:
2.11 ! frystyk 50: PRIVATE int HTTee_write (HTStream * me, CONST char* s, int l)
2.1 timbl 51: {
2.8 frystyk 52: int ret1 = (*me->s1->isa->put_block)(me->s1, s, l);
53: int ret2 = (*me->s2->isa->put_block)(me->s2, s, l);
54: return (!(ret1+ret2) ? HT_OK :
55: (ret1==HT_ERROR || ret2==HT_ERROR) ? HT_ERROR :
56: HT_WOULD_BLOCK);
2.1 timbl 57: }
2.8 frystyk 58:
2.11 ! frystyk 59: PRIVATE int HTTee_flush (HTStream * me)
2.8 frystyk 60: {
61: int ret1 = (*me->s1->isa->flush)(me->s1);
62: int ret2 = (*me->s2->isa->flush)(me->s2);
63: return (!(ret1+ret2) ? HT_OK :
64: (ret1==HT_ERROR || ret2==HT_ERROR) ? HT_ERROR :
65: HT_WOULD_BLOCK);
66: }
67:
2.11 ! frystyk 68: PRIVATE int HTTee_free (HTStream * me)
2.1 timbl 69: {
2.8 frystyk 70: int ret1 = (*me->s1->isa->_free)(me->s1);
71: int ret2 = (*me->s2->isa->_free)(me->s2);
2.2 luotonen 72: free(me);
2.8 frystyk 73: return (!(ret1+ret2) ? HT_OK :
74: (ret1==HT_ERROR || ret2==HT_ERROR) ? HT_ERROR :
75: HT_WOULD_BLOCK);
2.1 timbl 76: }
2.8 frystyk 77:
2.11 ! frystyk 78: PRIVATE int HTTee_abort (HTStream * me, HTList * e)
2.1 timbl 79: {
80: (*me->s1->isa->abort)(me->s1, e);
81: (*me->s2->isa->abort)(me->s2, e);
2.2 luotonen 82: free(me);
2.8 frystyk 83: return HT_ERROR;
2.1 timbl 84: }
85:
86:
87: /* Tee stream
88: ** ----------
89: */
90: PRIVATE CONST HTStreamClass HTTeeClass =
91: {
92: "Tee",
2.8 frystyk 93: HTTee_flush,
2.1 timbl 94: HTTee_free,
95: HTTee_abort,
96: HTTee_put_character, HTTee_put_string,
97: HTTee_write
98: };
99:
100:
101: /* Tee creation
102: */
2.11 ! frystyk 103: PUBLIC HTStream * HTTee (HTStream * s1,HTStream * s2)
2.1 timbl 104: {
2.8 frystyk 105: HTStream * me = (HTStream *) calloc(1, sizeof(*me));
2.1 timbl 106: if (!me) outofmem(__FILE__, "HTTee");
107: me->isa = &HTTeeClass;
108: me->s1 = s1;
109: me->s2 = s2;
110: return me;
111: }
112:
113:
Webmaster