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