Annotation of libwww/Library/src/HTNewsRq.c, revision 2.14
2.1 frystyk 1: /* HTNewsRq.c
2: ** NNTP MESSAGE GENERATION
3: **
2.11 frystyk 4: ** (c) COPYRIGHT MIT 1995.
5: ** Please first read the full copyright statement in the file COPYRIGH.
2.14 ! frystyk 6: ** @(#) $Id: HTNewsRq.c,v 2.13 1998/05/04 19:37:10 frystyk Exp $
2.11 frystyk 7: **
2.1 frystyk 8: ** This module implements the output stream for MIME used for sending
9: ** requests with or without a entity body to HTTP, NEWS, etc.
10: **
11: ** History:
12: ** Jan 95 HFN Written
13: */
14:
15: /* Library Includes */
2.13 frystyk 16: #include "wwwsys.h"
2.11 frystyk 17: #include "WWWUtil.h"
18: #include "WWWCore.h"
19:
2.1 frystyk 20: #include "HTReqMan.h"
21: #include "HTMIMERq.h"
22: #include "HTNewsRq.h" /* Implements */
23:
24: #define PUTBLOCK(b, l) (*me->target->isa->put_block)(me->target, b, l)
25:
26: struct _HTStream {
2.10 frystyk 27: const HTStreamClass * isa;
2.1 frystyk 28: HTStream * target;
29: HTRequest * request;
2.4 frystyk 30: SOCKET sockfd;
2.1 frystyk 31: HTChunk * buffer;
32: int version;
33: BOOL transparent;
34: };
35:
36: /* ------------------------------------------------------------------------- */
37: /* News Output Post Stream */
38: /* ------------------------------------------------------------------------- */
39:
40: /* NewsPost_start
41: ** --------------
42: ** NNTP needs two extra headers: "From" and "Newsgroups".
43: ** Take the newsgroups from the Postweb model as destinations for this
44: ** anchor.
45: ** Return YES if OK else NO
46: */
47: PRIVATE BOOL NewsPost_start (HTStream * me, HTRequest * request)
48: {
49: char linebuf[128]; /* @@@ */
50: HTChunk *header = me->buffer;
2.12 frystyk 51: HTUserProfile * up = HTRequest_userProfile(request);
52: const char * mailaddress = HTUserProfile_email(up);
2.1 frystyk 53: if (mailaddress) {
54: sprintf(linebuf, "From: %s%c%c", mailaddress, CR, LF);
2.6 frystyk 55: HTChunk_puts(header, linebuf);
2.1 frystyk 56: }
57:
58: /*
59: ** Find all the newsgroups we are posting to by looking at all the
60: ** destinations from the source of this request.
61: ** First the main link and then the sub links
62: */
2.6 frystyk 63: HTChunk_puts(header, "Newsgroups :");
2.1 frystyk 64: if (HTRequest_isDestination(request)) {
65: HTRequest *src_req = HTRequest_source(request);
66: HTParentAnchor *src_anchor = HTRequest_anchor(src_req);
2.5 frystyk 67: HTLink *link = HTAnchor_mainLink((HTAnchor *) src_anchor);
68: HTAnchor *dest = HTLink_destination(link);
69: HTMethod method = HTLink_method(link);
2.1 frystyk 70: if (link && method == METHOD_POST &&
2.5 frystyk 71: HTLink_result(link) == HT_LINK_NONE) {
2.1 frystyk 72: char *desturl = HTAnchor_physical((HTParentAnchor *) dest);
73: char *access = HTParse(desturl, "", PARSE_ACCESS);
74: if (!strcasecomp(access, "news") || !strcasecomp(access, "nntp")) {
75: char *newsgroup = HTParse(desturl, "", PARSE_PATH);
76: HTUnEscape(newsgroup);
77: HTCleanTelnetString(newsgroup);
2.6 frystyk 78: HTChunk_puts(header, newsgroup);
2.8 frystyk 79: HT_FREE(newsgroup);
2.1 frystyk 80: }
2.8 frystyk 81: HT_FREE(access);
2.1 frystyk 82: }
83:
84: /* DO FOR ALL SUB ANCHOR DESTINATION S AS WELL */
85:
86: }
2.14 ! frystyk 87: HTTRACE(PROT_TRACE, "News Tx..... %s" _ HTChunk_data(header));
2.1 frystyk 88: return YES;
89: }
90:
91: /* NewsPost_end
92: ** ------------
93: ** End the posting by CRLF.CRLF
94: ** returns whatever PUT_BLOCK returns
95: */
96: PRIVATE int NewsPost_end (HTStream * me)
97: {
98: char buf[6];
99: *buf = CR;
100: *(buf+1) = LF;
101: *(buf+2) = '.';
102: *(buf+3) = CR;
103: *(buf+4) = LF;
104: *(buf+5) = '\0';
105: return PUTBLOCK(buf, 5);
106: }
107:
2.10 frystyk 108: PRIVATE int NewsPost_put_block (HTStream * me, const char* b, int l)
2.1 frystyk 109: {
110: if (!me->target) {
111: return HT_WOULD_BLOCK;
112: } else if (me->transparent)
113: return b ? PUTBLOCK(b, l) : HT_OK;
114: else {
115: int status;
116: NewsPost_start(me, me->request);
2.6 frystyk 117: if ((status = PUTBLOCK(HTChunk_data(me->buffer),
118: HTChunk_size(me->buffer))) == HT_OK) {
2.1 frystyk 119: me->transparent = YES;
120: return b ? PUTBLOCK(b, l) : HT_OK;
121: }
122: return status;
123: }
124: }
125:
126: PRIVATE int NewsPost_put_character (HTStream * me, char c)
127: {
128: return NewsPost_put_block(me, &c, 1);
129: }
130:
2.10 frystyk 131: PRIVATE int NewsPost_put_string (HTStream * me, const char * s)
2.1 frystyk 132: {
133: return NewsPost_put_block(me, s, strlen(s));
134: }
135:
136: /*
137: ** Flushes header but doesn't free stream object
138: */
139: PRIVATE int NewsPost_flush (HTStream * me)
140: {
141: return NewsPost_put_block(me, NULL, 0);
142: }
143:
144: /*
145: ** Flushes data and frees stream object
146: */
147: PRIVATE int NewsPost_free (HTStream * me)
148: {
149: int status;
150: if ((status = NewsPost_flush(me)) != HT_OK ||
151: (status = NewsPost_end(me)) != HT_OK ||
152: (status = (*me->target->isa->_free)(me->target)) != HT_OK)
153: return status;
2.6 frystyk 154: HTChunk_delete(me->buffer);
2.8 frystyk 155: HT_FREE(me);
2.1 frystyk 156: return status;
157: }
158:
2.3 frystyk 159: PRIVATE int NewsPost_abort (HTStream * me, HTList * e)
2.1 frystyk 160: {
161: if (me->target) (*me->target->isa->abort)(me->target, e);
2.6 frystyk 162: HTChunk_delete(me->buffer);
2.8 frystyk 163: HT_FREE(me);
2.14 ! frystyk 164: HTTRACE(PROT_TRACE, "NewsPost.... ABORTING...\n");
2.1 frystyk 165: return HT_ERROR;
166: }
167:
168: /* NewsPost Stream
169: ** -----------------
170: */
2.10 frystyk 171: PRIVATE const HTStreamClass NewsPostClass =
2.1 frystyk 172: {
173: "NewsPost",
174: NewsPost_flush,
175: NewsPost_free,
176: NewsPost_abort,
177: NewsPost_put_character,
178: NewsPost_put_string,
179: NewsPost_put_block
180: };
181:
182: PUBLIC HTStream * HTNewsPost_new (HTRequest * request, HTStream * target)
183: {
2.8 frystyk 184: HTStream * me;
185: if ((me = (HTStream *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
186: HT_OUTOFMEM("NewsPost_new");
2.1 frystyk 187: me->isa = &NewsPostClass;
188: me->target = target;
189: me->request = request;
2.6 frystyk 190: me->buffer = HTChunk_new(256);
2.1 frystyk 191: me->transparent = NO;
2.7 frystyk 192: return HTMIMERequest_new(request, me, YES);
2.1 frystyk 193: }
Webmaster