Annotation of libwww/Library/src/HTTee.c, revision 2.8
2.5 frystyk 1: /* HTee.c
2: ** TEE CLASS STREAM DEFINITION
3: **
4: ** (c) COPYRIGHT CERN 1994.
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.8 ! frystyk 32: PRIVATE int HTTee_put_character ARGS2(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:
! 41: PRIVATE int HTTee_put_string ARGS2(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:
! 50: PRIVATE int HTTee_write ARGS3(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:
! 59: PRIVATE int HTTee_flush ARGS1(HTStream *, me)
! 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.4 frystyk 68: PRIVATE int HTTee_free ARGS1(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.4 frystyk 78: PRIVATE int HTTee_abort ARGS2(HTStream *, me, HTError, 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: */
103: PUBLIC HTStream * HTTee ARGS2(HTStream *, s1,HTStream *, s2)
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