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