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

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

Webmaster