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