/*
 *	Copyright (C) 1984, 1985  SRI International
 *	Copyright (C) 1991  TGV, Incorporated
 *
 *	Move/Copy messages
 *
 */
#include <stdio.h>
#include "gtjfn.h"
#include "vax-mm.h"

static int Target_Text_FD = -1;		/* FD for target text file   */
static int Target_Header_FD = -1;	/* FD for target header file */
static struct Header_File_Header Header;



/*
 *	Get the target file name
 */
Get_Move_File(Filename)
char *Filename;
{
	static struct comnd_function file_doesnt_exist = {COMND_OUTPUT_FILE};
	static struct comnd_function file_exists = {
		COMND_INPUT_FILE,
		COMND_SUPPRESS_DEFAULT_HELP,
		&file_doesnt_exist};
	static struct gtjfn_block gtjfn;
	int i;

	/*
	 *	Noise
	 */
	Noise("into file");
	/*
	 *	Parse the filename
	 */
	gtjfn.default_filename = "MAIL";
	gtjfn.default_extension = "TXT";
	Command_State.gtjfn = &gtjfn;
	if (COMND(&Command_State,&file_exists,&i,0) < 0) return(-1);
	if (local_jfns_jsys(Filename,i) < 0) return(-1);
	tops_free_jfn(i);
	return(0);
}

/*
 *	Open the target message file
 */
Open_Move_File(Filename)
char *Filename;
{
	char Header_Name[128];

	/*
	 *	Make sure that any old files are closed
	 */
	Close_Move_File();
	/*
	 *	Construct the header file filename
	 */
	Header_File_Name(Filename,Header_Name);
	/*
	 *	Try to open the text file
	 */
	Target_Text_FD = Xopen(Filename,2);
	if (Target_Text_FD < 0) {
		struct {
			int current_entries;
			int maximum_entries;
			struct tbluk_keyword keywords[2];
			} Table = {
			2,
			2,
			{{0,	"no",	0},
			 {0,	"yes",	1}}};
		struct comnd_function Responses =
			{COMND_KEYWORD,
			 COMND_HELP_VALID|COMND_SUPPRESS_DEFAULT_HELP,
			 0,
			 (int)&Table,
			 "YES or NO"};
		int Status;
		struct tbluk_keyword *t;
		char Prompt[280];

		/*
		 *	Make the user confirm whether a new
		 *	file is to be created!
		 */
		sprintf(Prompt,
			"No %s file exists, create it? (YES/NO) ",
			Filename);
		Command_State.prompt = Prompt;
		while(1) {
			COMND_INIT(&Command_State);
			Status = COMND(&Command_State,&Responses,&t,0);
			if (Status >= 0) break;
		}
		Confirm();

		/*
		 *	Dispatch on keyword
		 */
		if (t->user_data == 0) return(-1);

		/*
		 *	Create it
		 */
		Target_Text_FD = Xcreat(Filename,Mail_File_Mode,0);
		if (Target_Text_FD < 0) {
			printf("\n?Couldn't create text file\n");
			return(-1);
		}
		Target_Header_FD = Xcreat(Header_Name,Mail_File_Mode,0);
		if (Target_Header_FD >= 0) {
			Header.Last_Read = 0;
			Header.Number_Of_Messages = 0;
			Header.Size_Of_Text_File = 0;
			write(Target_Header_FD,&Header,sizeof(Header));
		}
	} else {
		lseek(Target_Text_FD,0,2);
	}
	/*
	 *	Try to open the header file
	 */
	if (Target_Header_FD < 0) {
		Target_Header_FD = open(Header_Name,2);
		read(Target_Header_FD,&Header,sizeof(Header));
		lseek(Target_Header_FD,0,2);
	}
	return(0);
}

/*
 *	Move the message into the target file
 */
Move_Message(Message)
int Message;
{
	struct Msg *Msg = &Messages[Message-1];

	/*
	 *	Check for deleted message
	 */
	if (Msg->Flags & MSG_DELETED) {
		printf(" Message %d deleted.\n",Message);
		return;
	}
	/*
	 *	Append to the text and header files
	 */
	if (write(Target_Text_FD,MESSAGE_HEADER(Message),Msg->Real_Size) < 0) {
		printf("\n?Couldn't move message %d \n",Message);
		return(-1);
	}
	if (Target_Header_FD >= 0) {
		write(Target_Header_FD,Msg,sizeof(*Msg));
		/*
		 *	Update the header
		 */
		Header.Number_Of_Messages++;
		Header.Size_Of_Text_File += Msg->Real_Size;
	}
}

/*
 *	Close the target file
 */
Close_Move_File()
{
	if (Target_Text_FD > 0) {
		close(Target_Text_FD);
		Target_Text_FD = -1;
	}
	if (Target_Header_FD > 0) {
		lseek(Target_Header_FD,0,0);
		write(Target_Header_FD,&Header,sizeof(Header));
		close(Target_Header_FD);
		Target_Header_FD = -1;
	}
}


/*
 *	Move messages to another mail file
 */
CMD_Move()
{
	int Message;
	int Number_Of_Messages = 0;
	char Filename[128];

	/*
	 *	Get the target file name
	 */
	if (Get_Move_File(Filename) < 0) return;
	/*
	 *	Parse the message list
	 */
	Parse_Message_List("CURRENT");
	/*
	 *	Confirm
	 */
	Confirm();
	/*
	 *	Do it
	 */
	if (Last_Message == 0) {
		printf(" Message file empty\n");
		return;
	}
	if (Open_Move_File(Filename) < 0) return;
	while(1) {
		Message = Next_Message(1);
		if (Message <= 0) break;
		Current_Message = Message;
		Move_Message(Message);
		Messages[Message-1].Flags |= MSG_DELETED;
		Update_Message(Message);
		Number_Of_Messages++;
	}
	if (Number_Of_Messages) printf("\n");
	/*
	 *	Done
	 */
	Close_Move_File();
}


/*
 *	Copy messages to another mail file
 */
CMD_Copy()
{
	int Message;
	int Number_Of_Messages = 0;
	char Filename[128];

	/*
	 *	Get the target file name
	 */
	if (Get_Move_File(Filename) < 0) return;
	/*
	 *	Parse the message list
	 */
	Parse_Message_List("CURRENT");
	/*
	 *	Confirm
	 */
	Confirm();
	/*
	 *	Do it
	 */
	if (Open_Move_File(Filename) < 0) return;
	while(1) {
		Message = Next_Message(1);
		if (Message <= 0) break;
		Current_Message = Message;
		Move_Message(Message);
		Number_Of_Messages++;
	}
	if (Number_Of_Messages) printf("\n");
	/*
	 *	Done
	 */
	Close_Move_File();
}
