Annotation of libwww/Library/src/HTNewsRq.c, revision 2.11

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.
        !             6: **     @(#) $Id: Date Author State $
        !             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.10      frystyk    16: #include "sysdep.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.10      frystyk    51:     const char *mailaddress = HTGetMailAddress();
2.1       frystyk    52:     if (mailaddress) {
                     53:        sprintf(linebuf, "From: %s%c%c", mailaddress, CR, LF);
2.6       frystyk    54:        HTChunk_puts(header, linebuf);
2.1       frystyk    55:     }
                     56: 
                     57:     /*
                     58:     ** Find all the newsgroups we are posting to by looking at all the
                     59:     **  destinations from the source of this request.
                     60:     **         First the main link and then the sub links
                     61:     */
2.6       frystyk    62:     HTChunk_puts(header, "Newsgroups :");    
2.1       frystyk    63:     if (HTRequest_isDestination(request)) {
                     64:        HTRequest *src_req = HTRequest_source(request);
                     65:        HTParentAnchor *src_anchor = HTRequest_anchor(src_req);
2.5       frystyk    66:        HTLink *link = HTAnchor_mainLink((HTAnchor *) src_anchor);
                     67:        HTAnchor *dest = HTLink_destination(link);
                     68:        HTMethod method = HTLink_method(link);
2.1       frystyk    69:        if (link && method == METHOD_POST &&
2.5       frystyk    70:            HTLink_result(link) == HT_LINK_NONE) {
2.1       frystyk    71:            char *desturl = HTAnchor_physical((HTParentAnchor *) dest);
                     72:            char *access = HTParse(desturl, "", PARSE_ACCESS);
                     73:            if (!strcasecomp(access, "news") || !strcasecomp(access, "nntp")) {
                     74:                char *newsgroup = HTParse(desturl, "", PARSE_PATH);
                     75:                HTUnEscape(newsgroup);
                     76:                HTCleanTelnetString(newsgroup);
2.6       frystyk    77:                HTChunk_puts(header, newsgroup);
2.8       frystyk    78:                HT_FREE(newsgroup);
2.1       frystyk    79:            }
2.8       frystyk    80:            HT_FREE(access);
2.1       frystyk    81:        }
                     82: 
                     83:        /* DO FOR ALL SUB ANCHOR DESTINATION S AS WELL */
                     84:        
                     85:     }
2.9       eric       86:     if (PROT_TRACE) HTTrace("News Tx..... %s", HTChunk_data(header));
2.1       frystyk    87:     return YES;
                     88: }
                     89: 
                     90: /*     NewsPost_end
                     91: **     ------------
                     92: **     End the posting by CRLF.CRLF
                     93: **     returns whatever PUT_BLOCK returns
                     94: */
                     95: PRIVATE int NewsPost_end (HTStream * me)
                     96: {
                     97:     char buf[6];
                     98:     *buf = CR;
                     99:     *(buf+1) = LF;
                    100:     *(buf+2) = '.';
                    101:     *(buf+3) = CR;
                    102:     *(buf+4) = LF;
                    103:     *(buf+5) = '\0';
                    104:     return PUTBLOCK(buf, 5);
                    105: }
                    106: 
2.10      frystyk   107: PRIVATE int NewsPost_put_block (HTStream * me, const char* b, int l)
2.1       frystyk   108: {
                    109:     if (!me->target) {
                    110:        return HT_WOULD_BLOCK;
                    111:     } else if (me->transparent)
                    112:        return b ? PUTBLOCK(b, l) : HT_OK;
                    113:     else {
                    114:        int status;
                    115:        NewsPost_start(me, me->request);
2.6       frystyk   116:        if ((status = PUTBLOCK(HTChunk_data(me->buffer),
                    117:                               HTChunk_size(me->buffer))) == HT_OK) {
2.1       frystyk   118:            me->transparent = YES;
                    119:            return b ? PUTBLOCK(b, l) : HT_OK;
                    120:        }
                    121:        return status;
                    122:     }
                    123: }
                    124: 
                    125: PRIVATE int NewsPost_put_character (HTStream * me, char c)
                    126: {
                    127:     return NewsPost_put_block(me, &c, 1);
                    128: }
                    129: 
2.10      frystyk   130: PRIVATE int NewsPost_put_string (HTStream * me, const char * s)
2.1       frystyk   131: {
                    132:     return NewsPost_put_block(me, s, strlen(s));
                    133: }
                    134: 
                    135: /*
                    136: **     Flushes header but doesn't free stream object
                    137: */
                    138: PRIVATE int NewsPost_flush (HTStream * me)
                    139: {
                    140:     return NewsPost_put_block(me, NULL, 0);
                    141: }
                    142: 
                    143: /*
                    144: **     Flushes data and frees stream object
                    145: */
                    146: PRIVATE int NewsPost_free (HTStream * me)
                    147: {
                    148:     int status;
                    149:     if ((status = NewsPost_flush(me)) != HT_OK ||
                    150:        (status = NewsPost_end(me)) != HT_OK ||
                    151:        (status = (*me->target->isa->_free)(me->target)) != HT_OK)
                    152:        return status;
2.6       frystyk   153:     HTChunk_delete(me->buffer);
2.8       frystyk   154:     HT_FREE(me);
2.1       frystyk   155:     return status;
                    156: }
                    157: 
2.3       frystyk   158: PRIVATE int NewsPost_abort (HTStream * me, HTList * e)
2.1       frystyk   159: {
                    160:     if (me->target) (*me->target->isa->abort)(me->target, e);
2.6       frystyk   161:     HTChunk_delete(me->buffer);
2.8       frystyk   162:     HT_FREE(me);
2.9       eric      163:     if (PROT_TRACE) HTTrace("NewsPost.... ABORTING...\n");
2.1       frystyk   164:     return HT_ERROR;
                    165: }
                    166: 
                    167: /*     NewsPost Stream
                    168: **     -----------------
                    169: */
2.10      frystyk   170: PRIVATE const HTStreamClass NewsPostClass =
2.1       frystyk   171: {              
                    172:     "NewsPost",
                    173:     NewsPost_flush,
                    174:     NewsPost_free,
                    175:     NewsPost_abort,
                    176:     NewsPost_put_character,
                    177:     NewsPost_put_string,
                    178:     NewsPost_put_block
                    179: };
                    180: 
                    181: PUBLIC HTStream * HTNewsPost_new (HTRequest * request, HTStream * target)
                    182: {
2.8       frystyk   183:     HTStream * me;
                    184:     if ((me = (HTStream  *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
                    185:         HT_OUTOFMEM("NewsPost_new");
2.1       frystyk   186:     me->isa = &NewsPostClass;
                    187:     me->target = target;
                    188:     me->request = request;
2.6       frystyk   189:     me->buffer = HTChunk_new(256);
2.1       frystyk   190:     me->transparent = NO;
2.7       frystyk   191:     return HTMIMERequest_new(request, me, YES);
2.1       frystyk   192: }

Webmaster