
/*
 *  EDIT (reply, followup)
 */

#include "defs.h"

Prototype void ReplyArticle(short, NGroup *);
Prototype void FollowUpArticle(short, NGroup *);
Prototype void PostArticle(NGroup *);

Local int EditFile(char *);
Local void IncludeSignature(char *, FILE *);
Local void IncludeText(FILE *, FILE *);

void
ReplyArticle(key, grp)
short key;
NGroup *grp;
{
    char *fn = TmpFileName("T:DNews");
    char *nf = FileForArticle(grp, grp->CurNo);
    char *field;
    char *user = GetUserName();
    FILE *fi = fopen(nf, "r");
    FILE *fo;

    if (fi == NULL) {
	printf("Unable to open %s\n", nf);
	return;
    }
    fo = fopen(fn, "w");
    if (fo == NULL) {
	printf("Unable to create %s\n", fn);
	fclose(fi);
	return;
    }

    /*
     *	Get Return Address: Reply-To:
     *			    From:
     */

    if ((field = FindField(fi, "Reply-To:")) == NULL)
	field = FindField(fi, "From:");

    if (field) {
	fprintf(fo, "To: %s\n", field);
	free(field);
    } else {
	fprintf(fo, "To: \n");
    }

    if (field = FindField(fi, "Subject:")) {
	char *base = field;
	while (*field == ' ' || *field == 9)
	    ++field;
	if (strnicmp(field, "re:", 3) == 0)
	    field += 3;
	fprintf(fo, "Subject: Re: %s\n", field);
	free(base);
    } else {
	fprintf(fo, "Subject: \n");
    }

    if (field = FindField(fi, "Message-ID:")) {
	fprintf(fo, "References: %s\n", field);
	free(field);
    }

    fprintf(fo, "\n");
    if (isupper(key))
	IncludeText(fi, fo);
    fprintf(fo, "\n");
    IncludeSignature(user, fo);
    fclose(fo);

    if (EditFile(fn)) {
	sprintf(TmpBuf, "%s < %s -f %s", GetConfigProgram(SENDMAIL), fn, user);
	system(TmpBuf);
    } else {
	puts("Aborted");
    }
    fclose(fi);
    remove(fn);
}

void
FollowUpArticle(key, grp)
short key;
NGroup *grp;
{
    char *fn = TmpFileName("T:DNews");
    char *nf = FileForArticle(grp, grp->CurNo);
    char *field;
    char *user = GetUserName();
    FILE *fi = fopen(nf, "r");
    FILE *fo;

    if (fi == NULL) {
	printf("Unable to open %s\n", nf);
	return;
    }
    fo = fopen(fn, "w");
    if (fo == NULL) {
	printf("Unable to create %s\n", fn);
	fclose(fi);
	return;
    }

    fprintf(fo, "Newsgroups: %s\n", grp->Name);

    if (field = FindField(fi, "Subject:")) {
	char *base = field;
	while (*field == ' ' || *field == 9)
	    ++field;
	if (strnicmp(field, "re:", 3) == 0)
	    field += 3;
	fprintf(fo, "Subject: Re: %s\n", field);
	free(base);
    } else {
	fprintf(fo, "Subject: \n");
    }
    fprintf(fo, "Distribution: world\n");

    fprintf(fo, "\n");
    if (isupper(key)) {
	fprintf(fo, "In article ");
	if (field = FindField(fi, "Message-ID:")) {
	    fprintf(fo, "%s ", field);
	    free(field);
	} else {
	    fprintf(fo, "? ");
	}

	if (field = FindField(fi, "From:")) {
	    fprintf(fo, "%s", field);
	    free(field);
	} else {
	    fprintf(fo, "?");
	}
	fprintf(fo, " writes:\n");

	IncludeText(fi, fo);
    }
    fprintf(fo, "\n");
    IncludeSignature(user, fo);
    fclose(fo);

    if (EditFile(fn)) {
	PostNews(fi, fn);
    } else {
	puts("Aborted");
    }
    fclose(fi);
}

void
PostArticle(grp)
NGroup *grp;
{
    char *fn = TmpFileName("T:DNews");
    char *nf = (grp) ? FileForArticle(grp, grp->CurNo) : NULL;
    char *field;
    char *user = GetUserName();
    FILE *fi = NULL;
    FILE *fo;

    if (nf)
	fi = fopen(nf, "r");

    fo = fopen(fn, "w");
    if (fo == NULL) {
	printf("Unable to create %s\n", fn);
	fclose(fi);
	return;
    }

    fprintf(fo, "Newsgroups: %s\n", (grp) ? grp->Name : "");
    fprintf(fo, "Subject: \n");
    fprintf(fo, "Distribution: world\n");
    fprintf(fo, "\n");
    IncludeSignature(user, fo);
    fclose(fo);

    if (EditFile(fn)) {
	PostNews(NULL, fn);
    } else {
	puts("Aborted");
	remove(fn);
    }
    fclose(fi);
}

static int
EditFile(fn)
char *fn;
{
    sprintf(TmpBuf, "%s %s", GetConfig(NEWSEDITOR, GetConfig(EDITOR, "dme")), fn);
    system(TmpBuf);
    return(getyn("Send It Off?"));
}


static void
IncludeSignature(user, fo)
char *user;
FILE *fo;
{
    FILE *fi;

    sprintf(TmpBuf, "%s.signature", user);
    fi = openlib(TmpBuf);
    if (fi == NULL)
	fi = openlib(".signature");
    if (fi) {
	fputs("--\n", fo);
	while (fgets(TmpBuf, sizeof(TmpBuf), fi))
	    fputs(TmpBuf, fo);
	fclose(fi);
    } else {
	puts("Warning, no .signature file!");
    }
}

static void
IncludeText(fi, fo)
FILE *fi;
FILE *fo;
{
    rewind(fi);
    while (fgets(TmpBuf, sizeof(TmpBuf), fi) && TmpBuf[0] != '\n');
    while (fgets(TmpBuf, sizeof(TmpBuf), fi))
	fprintf(fo, ">%s", TmpBuf);
}

