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