/*
 *
 *  AM --- AmigaMail
 *  (C) 1991, 1992 by Christian Riede
 *
 *  AM is distributed in the hope that it will be useful, but WITHOUT ANY
 *  WARRANTY.  No author or distributor accepts responsibility to anyone
 *  for the consequences of using it or for whether it serves any
 *  particular purpose or works at all, unless he says so in writing.
 *  Refer to the GNU General Public License, Version 1, for full details.
 *  
 *  Everyone is granted permission to copy, modify and redistribute AM,
 *  but only under the conditions described in the GNU General Public
 *  License, Version 1.  A copy of this license is supposed to have been 
 *  given to you along with AM so you can know your rights and responsi-
 *  bilities.  It should be in a file named COPYING.  Among other things,
 *  the copyright notice and this notice must be preserved on all copies.
 *
 *  
 *
 */


#include "am.h"

/* add address to addressbook */
int AddAddress(struct List *Addressbook,char *Realname,char *Username,char *ReplyTo,int CTE)
{
	struct Address *Address;

	if (!(Address = AllocMem(sizeof(struct Address),MEMF_CLEAR)))
		return(FALSE);

	if (!(Address->Node.ln_Name = AllocMem(160,MEMF_CLEAR)))
		return(FALSE);
	
	if (!(Address->Realname = AllocMem(160,MEMF_CLEAR)))
		return(FALSE);
	
	if (!(Address->Username = AllocMem(160,MEMF_CLEAR)))
		return(FALSE);
	
	if (!(Address->ReplyTo = AllocMem(160,MEMF_CLEAR)))
		return(FALSE);
	
	strcpy(Address->Realname,Realname);
	strcpy(Address->Username,Username);
	strcpy(Address->ReplyTo,ReplyTo);
	Address->CTE = CTE;

	sprintf(Address->Node.ln_Name,"%-30.30s <%s>",Realname,Username);
	Address->Node.ln_Type = AMNT_ADDRESSBOOK;

	AddTail(Addressbook,(struct Node *)Address);

	return(TRUE);
}

/* remove address from addressbook */
void RemAddress(struct Address *Address)
{
	Remove(&(Address->Node));

	FreeMem(Address->Node.ln_Name,160);
	FreeMem(Address->Realname,160);
	FreeMem(Address->Username,160);
	FreeMem(Address->ReplyTo,160);
	FreeMem(Address,sizeof(struct Address));
}

/* read the addressbook, returns TRUE on success, FALSE on failure */
int ReadAddressBook(struct List *Addressbook)
{
	FILE *File;
	char InputBuffer[MAIL_FIELDLENGTH];
	char Header[MAIL_FIELDLENGTH];
	char Body[MAIL_FIELDLENGTH];
	char Username[160];
	char Realname[160];
	char ReplyTo[160];
	int cte;
	char *s,*t;

	/* init the Addressbook-list */
	Addressbook->lh_Head = (struct Node *)&(Addressbook->lh_Tail);
	Addressbook->lh_TailPred = (struct Node *)&(Addressbook->lh_Head);
	Addressbook->lh_Tail = 0;
	Addressbook->lh_Type = AMNT_ADDRESSBOOK;

	/* open addressbokk file */
	if (!(File = fopen(ADDRESSBOOK,"r")))
		return(FALSE);

	/* set to default */
	*Realname = *Username = *ReplyTo = 0;

	/* read addressbook, line by line */
	while (fgets(InputBuffer,MAIL_FIELDLENGTH,File))
	{
		if (*InputBuffer=='\n') /* blank line, save address */
		{
			/* need at least Realname and Username */
			if (*Realname && *Username) /* valid address read? */
				if (!AddAddress(Addressbook,Realname,Username,ReplyTo,cte))
				{
					FreeAddressBook(Addressbook);
					return(FALSE);
				}

			/* set to default */
			*Realname = *Username = *ReplyTo = 0;
			cte = 2;
		}
		else /* read line */
		{
			/* get line header */
			if (sscanf(InputBuffer,"%s ",Header)==1)
			{
				/* get body, may contain blanks */
				s=index(InputBuffer,' ')+1;
				t=Body;
				while (*s && *s!='\n') *t++=*s++;
				*t=0;
				/* delete trailing blanks */
				while (t>Body) {--t; if (*t==' ' || *t=='\t') *t=0; else break;}

				/* get information from line*/
				if (!strcmp(Header,"Realname"))
					strcpy(Realname,Body);
				else if (!strcmp(Header,"Username"))
					strcpy(Username,Body);
				else if (!strcmp(Header,"Reply-To"))
					strcpy(ReplyTo,Body);
				else if (!strcmp(Header,"CTE"))
					sscanf(Body,"%d",&cte);
			}
		}
	}

	fclose(File);
	
	return(TRUE);
}

/* read the addressbook, returns TRUE on success, FALSE on failure */
int WriteAddressBook(struct List *Addressbook)
{
	FILE *File;
	struct Address *Address;

	if (!(File = fopen(ADDRESSBOOK,"w")))
		return(FALSE);

	/* go through all addresses */
	while (Address = (struct Address *)RemHead(Addressbook))
	{
		/* write fields */
		if (Address->Username)
			fprintf(File,"Username %s\n",Address->Username);

		if (Address->Realname)
			fprintf(File,"Realname %s\n",Address->Realname);

		if (Address->ReplyTo)
			fprintf(File,"Reply-To %s\n",Address->ReplyTo);

		fprintf(File,"CTE %d\n\n",
			Address->CTE); /* add extra blank line! */

		/* free memory of item */
		FreeMem(Address->Node.ln_Name,160);
		FreeMem(Address->Realname,160);
		FreeMem(Address->Username,160);
		FreeMem(Address->ReplyTo,160);
		FreeMem(Address,sizeof(struct Address));
	}

	fclose(File);
	
	return(TRUE);
}


void FreeAddressBook(struct List *Addressbook)
{
	struct Address *Address;

	while (Address = (struct Address *)RemHead(Addressbook))
	{
		FreeMem(Address->Node.ln_Name,160);
		FreeMem(Address->Realname,160);
		FreeMem(Address->Username,160);
		FreeMem(Address->ReplyTo,160);
		FreeMem(Address,sizeof(struct Address));
	}
}

