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

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.12    ! frystyk     6: **     @(#) $Id: HTNewsRq.c,v 2.11 1996/04/12 17:48:22 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.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.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.9       eric       87:     if (PROT_TRACE) HTTrace("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.9       eric      164:     if (PROT_TRACE) HTTrace("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