Annotation of libwww/Library/src/HTWriter.c, revision 2.5

2.1       timbl       1: /*             FILE WRITER                     HTWrite.c
                      2: **             ===========
                      3: **
                      4: */
                      5: #include "HTWriter.h"
                      6: 
                      7: #define BUFFER_SIZE 4096       /* Tradeoff */
                      8: 
                      9: #include "HTUtils.h"
                     10: #include "tcp.h"
                     11: #include <stdio.h>
                     12: 
                     13: 
                     14: /*             HTML Object
                     15: **             -----------
                     16: */
                     17: 
                     18: struct _HTStream {
                     19:        CONST HTStreamClass *   isa;
                     20: 
                     21:        int     soc;
                     22:        char    *write_pointer;
                     23:        char    buffer[BUFFER_SIZE];
                     24: #ifdef NOT_ASCII
                     25:        BOOL    make_ascii;     /* Are we writing to the net? */
                     26: #endif
                     27: };
                     28: 
                     29: 
                     30: /*     Write the buffer out to the socket
                     31: **     ----------------------------------
                     32: */
                     33: 
2.2       timbl      34: PRIVATE void flush ARGS1(HTStream *, me)
2.1       timbl      35: {
2.2       timbl      36:     char *read_pointer         = me->buffer;
                     37:     char *write_pointer = me->write_pointer;
2.1       timbl      38: 
                     39: #ifdef NOT_ASCCII
2.2       timbl      40:     if (me->make_ascii) {
2.1       timbl      41:        char * p;
2.2       timbl      42:        for(p = me->buffer; p < me->write_pointer; p++)
2.1       timbl      43:            *p = TOASCII(*p);
                     44:     }
                     45: #endif
                     46:     while (read_pointer < write_pointer) {
                     47:         int status;
2.2       timbl      48:        status = NETWRITE(me->soc, me->buffer,
2.1       timbl      49:                        write_pointer - read_pointer);
                     50:        if (status<0) {
                     51:            if(TRACE) fprintf(stderr,
2.5     ! timbl      52:            "HTWrite: Error: write() on socket returns %d !!!\n", status);
2.1       timbl      53:            return;
                     54:        }
                     55:        read_pointer = read_pointer + status;
                     56:     }
2.2       timbl      57:     me->write_pointer = me->buffer;
2.1       timbl      58: }
                     59: 
                     60: 
                     61: /*_________________________________________________________________________
                     62: **
                     63: **                     A C T I O N     R O U T I N E S
                     64: */
                     65: 
                     66: /*     Character handling
                     67: **     ------------------
                     68: */
                     69: 
2.2       timbl      70: PRIVATE void HTWriter_put_character ARGS2(HTStream *, me, char, c)
2.1       timbl      71: {
2.2       timbl      72:     if (me->write_pointer == &me->buffer[BUFFER_SIZE]) flush(me);
                     73:     *me->write_pointer++ = c;
2.1       timbl      74: }
                     75: 
                     76: 
                     77: 
                     78: /*     String handling
                     79: **     ---------------
                     80: **
                     81: **     Strings must be smaller than this buffer size.
                     82: */
2.2       timbl      83: PRIVATE void HTWriter_put_string ARGS2(HTStream *, me, CONST char*, s)
2.1       timbl      84: {
                     85:     int l = strlen(s);
2.2       timbl      86:     if (me->write_pointer + l > &me->buffer[BUFFER_SIZE]) flush(me);
                     87:     strcpy(me->write_pointer, s);
                     88:     me->write_pointer = me->write_pointer + l;
2.1       timbl      89: }
                     90: 
                     91: 
                     92: /*     Buffer write.  Buffers can (and should!) be big.
                     93: **     ------------
                     94: */
2.2       timbl      95: PRIVATE void HTWriter_write ARGS3(HTStream *, me, CONST char*, s, int, l)
2.1       timbl      96: {
                     97:  
                     98:     CONST char *read_pointer   = s;
                     99:     CONST char *write_pointer = s+l;
                    100: 
2.2       timbl     101:     flush(me);         /* First get rid of our buffer */
2.1       timbl     102: 
                    103:     while (read_pointer < write_pointer) {
2.2       timbl     104:         int status = NETWRITE(me->soc, read_pointer,
2.1       timbl     105:                        write_pointer - read_pointer);
                    106:        if (status<0) {
                    107:            if(TRACE) fprintf(stderr,
                    108:            "HTWriter_write: Error on socket output stream!!!\n");
                    109:            return;
                    110:        }
                    111:        read_pointer = read_pointer + status;
                    112:     }
                    113: }
                    114: 
                    115: 
                    116: 
                    117: 
                    118: /*     Free an HTML object
                    119: **     -------------------
                    120: **
                    121: **     Note that the SGML parsing context is freed, but the created object is not,
                    122: **     as it takes on an existence of its own unless explicitly freed.
                    123: */
2.2       timbl     124: PRIVATE void HTWriter_free ARGS1(HTStream *, me)
2.1       timbl     125: {
2.5     ! timbl     126:     flush(me);
2.2       timbl     127:     NETCLOSE(me->soc);
                    128:     free(me);
2.1       timbl     129: }
                    130: 
2.5     ! timbl     131: PRIVATE void HTWriter_abort ARGS1(HTStream *, me)
2.1       timbl     132: {
2.5     ! timbl     133:     HTWriter_free(me);
2.1       timbl     134: }
                    135: 
                    136: 
                    137: /*     Structured Object Class
                    138: **     -----------------------
                    139: */
2.4       timbl     140: PRIVATE CONST HTStreamClass HTWriter = /* As opposed to print etc */
2.1       timbl     141: {              
                    142:        "SocketWriter",
                    143:        HTWriter_free,
2.5     ! timbl     144:        HTWriter_abort,
2.1       timbl     145:        HTWriter_put_character,         HTWriter_put_string,
                    146:        HTWriter_write
                    147: }; 
                    148: 
                    149: 
                    150: /*     Subclass-specific Methods
                    151: **     -------------------------
                    152: */
                    153: 
                    154: PUBLIC HTStream* HTWriter_new ARGS1(int, soc)
                    155: {
2.3       timbl     156:     HTStream* me = (HTStream*)malloc(sizeof(*me));
2.2       timbl     157:     if (me == NULL) outofmem(__FILE__, "HTML_new");
                    158:     me->isa = &HTWriter;       
2.1       timbl     159:     
                    160: #ifdef NOT_ASCII
2.2       timbl     161:     me->make_ascii = NO;
2.1       timbl     162: #endif    
2.2       timbl     163:     me->soc = soc;
                    164:     me->write_pointer = me->buffer;
                    165:     return me;
2.1       timbl     166: }
                    167: 
                    168: /*     Subclass-specific Methods
                    169: **     -------------------------
                    170: */
                    171: 
                    172: PUBLIC HTStream* HTASCIIWriter ARGS1(int, soc)
                    173: {
2.3       timbl     174:     HTStream* me = (HTStream*)malloc(sizeof(*me));
2.2       timbl     175:     if (me == NULL) outofmem(__FILE__, "HTML_new");
                    176:     me->isa = &HTWriter;       
2.1       timbl     177: 
                    178: #ifdef NOT_ASCII
2.2       timbl     179:     me->make_ascii = YES;
2.1       timbl     180: #endif    
2.2       timbl     181:     me->soc = soc;
                    182:     me->write_pointer = me->buffer;
                    183:     return me;
2.1       timbl     184: }
2.2       timbl     185: 

Webmaster