/*
 *
 *  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"

/* perform action on listview-item with given number */

void ActionRead(ULONG num, struct List *Selected)
{
	char Command[80];
	char Mailname[80];
	struct Mail *Mail;
	BPTR MailLock;
	
	/* does mail with this number exist? */
	if (!(Mail = GetMail(num,Selected)))
	return;

	/* sender asked for Return-Receipt-To: ? */
	if ((Mail->read & (MAIL_RRT|MAIL_READ))==MAIL_RRT)  /* show message only once */
		SimpleRequest(Window,"Sender requested Return-Receipt-To");

	/* build filename */
	sprintf(Mailname,"%s/%ld",Folder,Mail->Number);

	/* lock file */
	if (!(MailLock = Lock((UBYTE *)Mailname,ACCESS_READ)))
	{
		SimpleRequest(Window,"Can't lock file!");
		return;
	}

	/* mark as read */
	Mail->read |= MAIL_READ;
	if (!MarkRead(Mail->Number,Folder))
		SimpleRequest(Window,"Can't mark mail as read!");

	/* show file asyncronously */

	sprintf(Command,
		"%s/%ld",Folder,Mail->Number);

	CreateNewProcTags(
		NP_Entry,ReadMail,
		NP_StackSize,32768L,
		NP_Arguments,Command,
		NP_Name,"AM_ReadMail",
		TAG_END,0);

	/* release lock */
	UnLock(MailLock);
}

void ActionSave(ULONG num, struct List *Selected)
{
	struct Mail *Mail;
	char Filename[160];

	/* does mail with this number exist? */
	if (!(Mail = GetMail(num,Selected)))
		return;

	sprintf(Filename,"%s/%ld",Folder,Mail->Number);
	
	CallMetamail(Filename,"save");
}

void ActionPrint(ULONG num, struct List *Selected)
{
	struct Mail *Mail;
	char Filename[160];

	/* does mail with this number exist? */
	if (!(Mail = GetMail(num,Selected)))
		return;

	sprintf(Filename,"%s/%ld",Folder,Mail->Number);
	
	CallMetamail(Filename,"print");
}

void ActionReply(ULONG num, struct List *Selected,ULONG mode)
{
	struct Mail *Mail;
	char SendParms[160];

	if (!(Mail = GetMail(num,Selected)))
		return;

	sprintf(SendParms,"%ld %lx %s",
		SFLAGS_REPLY|mode,
		(ULONG)Mail,
		Folder);

	CreateNewProcTags(
		NP_Entry,SendMail,
		NP_Arguments,SendParms,
		NP_StackSize,32768L,
		NP_Name,"AM_ReplyMail",
		TAG_END,0);
}

void ActionForward(ULONG num, struct List *Selected,ULONG mode)
{
	struct Mail *Mail;
	char SendParms[160];

	if (!(Mail = GetMail(num,Selected)))
		return;

	sprintf(SendParms,"%ld %lx %s",
		SFLAGS_FORWARD|mode,
		(ULONG)Mail,
		Folder);

	CreateNewProcTags(
		NP_Entry,SendMail,
		NP_Arguments,SendParms,
		NP_StackSize,32768L,
		NP_Name,"AM_ForwardMail",
		TAG_END,0);
}

void ActionDelete(ULONG num, struct List *Selected)
{
	struct Mail *Mail;

	if (!(Mail = GetMail(num,Selected)))
		return;

	DeleteMail(Mail,FALSE);
}

int ActionMove(ULONG num, struct List *Selected)
{
	struct Mail *Mail,*NewMail;
	ULONG seq;
	FILE *old,*new;
	char oldname[MAIL_FIELDLENGTH+1],newname[MAIL_FIELDLENGTH+1];
#define BUFLEN 1024
	char Buf[BUFLEN];
	int i;
	BPTR MyLock;

	if (!(Mail = GetMail(num,Selected)))
		return(FALSE);

	strcpy((char *)FReq->rf_File,"");
	strcpy((char *)FReq->rf_Dir,Folder);
	if (!AslRequestTags(FReq,
		ASL_Window,Window,
		ASL_FuncFlags,FILF_NEWIDCMP,
		ASL_ExtFlags1,FIL1F_NOFILES,
		ASL_File,"",
		ASL_Dir,Folder,
		TAG_END,0)) 
		return(FALSE);

	/* check for directory */
	if (MyLock = Lock((UBYTE *)(char *)FReq->rf_Dir,ACCESS_READ))
		UnLock(MyLock);
	else
	{
		/* create directory */
		if (!(MyLock = CreateDir((UBYTE *)(char *)FReq->rf_Dir)))
			return(FALSE);
		UnLock(MyLock);
	}

	if (!LockContents((char *)FReq->rf_Dir))
	{
		SimpleRequest(Window,"Can't open folder!");
		return(FALSE);
	}

	if (!(seq = NewSeq((char *)FReq->rf_Dir)))
	{
		UnLockContents((char *)FReq->rf_Dir);
		return(FALSE);
	}
	
	sprintf(oldname,"%s/%ld",Folder,Mail->Number);
	sprintf(newname,"%s/%ld",(char *)FReq->rf_Dir,seq);

	if (!(old = fopen(oldname,"r")))
	{
		UnLockContents((char *)FReq->rf_Dir);
		SimpleRequest(Window,"Can't open mailfile!");
		return(FALSE);
	}
	
	if (!(new = fopen(newname,"w")))
	{
		UnLockContents((char *)FReq->rf_Dir);
		fclose(old);
		SimpleRequest(Window,"Can't open new mailfile!");
		return(FALSE);
	}

	while (i=fread(Buf,1,BUFLEN,old))
		fwrite(Buf,1,i,new);

	fclose(old);
	fclose(new);	
	
	/* protect new file */
	SetProtection((UBYTE *)newname,7L);

	if (NewMail = AddItem(seq,(char *)FReq->rf_Dir))
	{	
		MarkOld(NewMail->Number,(char *)FReq->rf_Dir);
		FreeMail(NewMail);
	}
	else
		SimpleRequest(Window,"Can't add new item to database!\nRun makecontents on the folder!\n");

	UnLockContents((char *)FReq->rf_Dir);

	DeleteMail(Mail,TRUE);

	return(TRUE);
}

void ActionAddAddress(ULONG num, struct List *Selected)
{
	struct Mail *Mail;
	char Realname[160],Username[160];
	struct List Addressbook;

	if (!(Mail = GetMail(num,Selected)))
		return;

	if (!ReadAddressBook(&Addressbook))
		SimpleRequest(Window,"Can't read addressbook!");

	if (!AddAddress(&Addressbook,
		GetRealname(Mail->From,Realname,160),
		GetUsername(Mail->From,Username,160),
		"",2))
		SimpleRequest(Window,"Can't add address!");

	if (!WriteAddressBook(&Addressbook))
		SimpleRequest(Window,"Can't write addressbook!");

	/* refresh listview gadget */
	RefreshDisplay(0,0,0,&Mailbox,
		Selected,LastSelected,(void *)SearchPattern);

}

