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

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,
                     52:            "HTWrite: Error on socket output stream!!!\n");
                     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.2     ! timbl     126:     NETCLOSE(me->soc);
        !           127:     flush(me);
        !           128:     free(me);
2.1       timbl     129: }
                    130: 
                    131: /*     End writing
                    132: */
                    133: 
2.2     ! timbl     134: PRIVATE void HTWriter_end_document ARGS1(HTStream *, me)
2.1       timbl     135: {
2.2     ! timbl     136:     flush(me);
2.1       timbl     137: }
                    138: 
                    139: 
                    140: 
                    141: /*     Structured Object Class
                    142: **     -----------------------
                    143: */
                    144: PUBLIC CONST HTStreamClass HTWriter = /* As opposed to print etc */
                    145: {              
                    146:        "SocketWriter",
                    147:        HTWriter_free,
                    148:        HTWriter_end_document,
                    149:        HTWriter_put_character,         HTWriter_put_string,
                    150:        HTWriter_write
                    151: }; 
                    152: 
                    153: 
                    154: /*     Subclass-specific Methods
                    155: **     -------------------------
                    156: */
                    157: 
                    158: PUBLIC HTStream* HTWriter_new ARGS1(int, soc)
                    159: {
2.2     ! timbl     160:     HTStream* me = malloc(sizeof(*me));
        !           161:     if (me == NULL) outofmem(__FILE__, "HTML_new");
        !           162:     me->isa = &HTWriter;       
2.1       timbl     163:     
                    164: #ifdef NOT_ASCII
2.2     ! timbl     165:     me->make_ascii = NO;
2.1       timbl     166: #endif    
2.2     ! timbl     167:     me->soc = soc;
        !           168:     me->write_pointer = me->buffer;
        !           169:     return me;
2.1       timbl     170: }
                    171: 
                    172: /*     Subclass-specific Methods
                    173: **     -------------------------
                    174: */
                    175: 
                    176: PUBLIC HTStream* HTASCIIWriter ARGS1(int, soc)
                    177: {
2.2     ! timbl     178:     HTStream* me = malloc(sizeof(*me));
        !           179:     if (me == NULL) outofmem(__FILE__, "HTML_new");
        !           180:     me->isa = &HTWriter;       
2.1       timbl     181: 
                    182: #ifdef NOT_ASCII
2.2     ! timbl     183:     me->make_ascii = YES;
2.1       timbl     184: #endif    
2.2     ! timbl     185:     me->soc = soc;
        !           186:     me->write_pointer = me->buffer;
        !           187:     return me;
2.1       timbl     188: }
2.2     ! timbl     189: 

Webmaster