diff src/post.c @ 43:2842f50feb55 noffle

[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h, control.c, control.h, database.c, database.h, dynamicstring.c, dynamicstring.h, fetch.c, fetch.h, fetchlist.c, fetchlist.h, group.c, group.h, itemlist.c, itemlist.h, lock.c, lock.h, log.c, log.h, noffle.c, online.c, online.h, outgoing.c, outgoing.h, over.c, over.h, post.c, post.h, protocol.c, protocol.h, pseudo.c, pseudo.h, request.c, request.h, server.c, server.h, util.c, util.h, wildmat.c, wildmat.h: Moved files to the subdirectory src/ * Makefile.am, acconfig.h, configure.in, docs/Makefile.am, src/Makefile.am, Makefile.in, aclocal.m4, config.h.in, configure, install-sh, missing, mkinstalldirs, stamp-h.in, docs/Makefile.in, src/Makefile.in: Added files. They are used by aclocal, autoheader, autoconf and automake. * src/config.c, src/config.h: Renamed to configfile.c and configfile.h, because configure will generate a config.h file itself. * src/client.c, src/content.c, src/database.c, src/fetch.c, src/fetchlist.c, src/group.c, src/lock.c, src/noffle.c, src/online.c, src/outgoing.c, src/over.c, src/pseudo.c, src/request.c, src/server.c, src/util.c: Changed '#include "config.h"' to '#include "configfile.h"'. * src/client.c, src/content.c, src/database.c, src/fetch.c, src/fetchlist.c, src/group.c, src/lock.c, src/online.c, src/outgoing.c, src/post.c, src/protocol.c, src/request.c, src/server.c: Files now #include <config.h>. Added missing <stdio.h>. This removes the warnings about snprintf() not being declared. * Makefile: Removed. This is now generated by configure.
author uh1763
date Fri, 05 May 2000 22:45:56 +0100
parents
children 125d79c9e586
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/post.c	Fri May 05 22:45:56 2000 +0100
@@ -0,0 +1,155 @@
+/*
+  post.c
+
+  $Id: post.c 49 2000-05-05 21:45:56Z uh1763 $
+*/
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include "post.h"
+#include <string.h>
+#include "common.h"
+#include "content.h"
+#include "database.h"
+#include "group.h"
+#include "log.h"
+#include "over.h"
+#include "protocol.h"
+#include "util.h"
+
+struct OverInfo
+{
+    Str subject;
+    Str from;
+    Str date;
+    Str msgId;
+    Str ref;
+    size_t bytes;
+    size_t lines;
+};
+
+struct Article
+{
+    const char * text;
+    Bool posted;
+    struct OverInfo over;
+};
+
+static struct Article article = { NULL, FALSE };
+
+static void
+getOverInfo( struct OverInfo * o )
+{
+    const char *p = article.text;
+    Str line, field, value;
+    
+    o->bytes = strlen( p );
+
+    while( p != NULL )
+    {
+        p = Utl_getHeaderLn( line, p );
+        if ( line[ 0 ] == '\0' )
+	    break;
+
+	/* Look for headers we need to stash. */
+        if ( Prt_getField( field, value, line ) )
+        {
+	    if ( strcmp( field, "subject" ) == 0 )
+		Utl_cpyStr( o->subject, value );
+	    else if ( strcmp ( field, "from" ) == 0 )
+		Utl_cpyStr( o->from, value );
+	    else if ( strcmp ( field, "date" ) == 0 )
+		Utl_cpyStr( o->date, value );
+	    else if ( strcmp ( field, "references" ) == 0 )
+		Utl_cpyStr( o->ref, value );
+	    else if ( strcmp ( field, "message-id" ) == 0 )
+		Utl_cpyStr( o->msgId, value );
+	}
+    }
+
+    /* Move to start of body and count lines. */
+    for ( p++, o->lines = 0; *p != '\0'; p++ )
+	if ( *p == '\n' )
+	    o->lines++;
+}
+
+/* Register an article for posting. */
+Bool
+Post_open( const char * text )
+{
+    if ( article.text != NULL )
+    {
+	Log_err( "Busy article in Post_open." );
+	return FALSE;
+    }
+
+    memset( &article.over, 0, sizeof( article.over ) );
+    article.text = text;
+    getOverInfo( &article.over );
+
+    if ( Db_contains( article.over.msgId ) )
+    {
+	Log_err( "Duplicate article %s.", article.over.msgId );
+	return FALSE;
+    }
+
+    return TRUE;
+}
+
+
+/* Add the article to a group. */
+Bool
+Post_add ( const char * grp )
+{
+    Over * over;
+    const char *msgId;
+    
+    over = new_Over( article.over.subject,
+		     article.over.from,
+		     article.over.date,
+		     article.over.msgId,
+		     article.over.ref,
+		     article.over.bytes,
+		     article.over.lines );
+    
+    msgId = article.over.msgId;
+    
+    Cont_read( grp );
+    Cont_app( over );
+    Log_dbg( "Added message '%s' to group '%s'.", msgId, grp );
+
+    if ( !article.posted )
+    {
+        Log_inf( "Added '%s' to database.", msgId );
+        if ( ! Db_prepareEntry( over, Cont_grp(), Cont_last() )
+	     || ! Db_storeArt ( msgId, article.text ) )
+	    return FALSE;
+	article.posted = TRUE;
+    }
+    else
+    {
+	Str t;
+	const char *xref;
+
+	xref = Db_xref( msgId );
+	Log_dbg( "Adding '%s' to Xref of '%s'", grp, msgId );
+	snprintf( t, MAXCHAR, "%s %s:%i", xref, grp, Ov_numb( over ) );
+	Db_setXref( msgId, t );
+    }
+    
+    Cont_write();
+    Grp_setFirstLast( Cont_grp(), Cont_first(), Cont_last() );
+    return TRUE;
+}
+   
+/* Done with article - tidy up. */
+void
+Post_close( void )
+{
+    article.text = NULL;
+    article.posted = FALSE;
+}
+