#include <exec/types.h>
#include <exec/libraries.h>
#include <dos.h>
#include <libraries/dosextens.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <dos/dos.h>
#include <exec/memory.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <ctype.h>
#include <time.h>
#include "MEBBSUtility.h"

#define	DoorName "SendEmail"  /* Put your Door Name here */
#define CLS       PrintString(LinkData,"[H[J",1);
#define Versie    "SendEmail 1.0 "__DATE__""
#define PressKey  HotKeyPrompt(LinkData,"\n\r\n\r Press a key....",buffer);

UBYTE *version = "$VER: SendEmail V1.0 "__AMIGADATE__"";

unsigned char esc31[]={ 27,'[','3','1','m',0 }; /* ROOD */
unsigned char esc32[]={ 27,'[','3','2','m',0 }; /* GROEN */
unsigned char esc33[]={ 27,'[','3','3','m',0 }; /* GEEL */
unsigned char esc34[]={ 27,'[','3','4','m',0 }; /* BLAUW */
unsigned char esc35[]={ 27,'[','3','5','m',0 }; /* PAARS */
unsigned char esc36[]={ 27,'[','3','6','m',0 }; /* LICHTBLAUW */
unsigned char esc37[]={ 27,'[','3','7','m',0 }; /* WIT */


struct Library *MEBBSUtilityBase = NULL;

__aligned struct FileInfoBlock fileInfo;

void *LinkData;

void main (int, char **);
void CleanUp(void);
VOID Error(void);
VOID ReadConfig(void);
VOID Log(char state);
VOID WriteMessage(void);
VOID ersetze(char *string,int was,int wie);

char To[80],From[80],Subject[80],buffer[80],buffer1[80],UserName[80],Handle[80];
char REALNAAM[80],SHORTNAAM[80],LOGNAAM[80],DOMAIN[80],TEMPDIR[80],FileName[255];
char Tijd[80],Dag[80];
int Gtype,error;

void main(int argc, char *argv[])
{

   UWORD LineNumber,Data=0;
   BOOL WVFlag = FALSE;
   char PassString[80];
   ULONG NumChars = 0;

   LineNumber = atoi(argv[1]);

   MEBBSUtilityBase = OpenLibrary("mebbsutility.library",1L);

   if (!MEBBSUtilityBase)
   {
      printf("\nCould not open mebbsutility.library\n");
      exit(20);
   }

   if(MEBBSUtilityBase->lib_Revision < 1) WVFlag = TRUE;

   if(!(LinkData = LinkDoor(DoorName,LineNumber)))
   CleanUp();

   if(WVFlag)
   {
		PrintString(LinkData,"Wrong library version!!\n",1);
		PrintString(LinkData,"Minimum required is v1.1\n",1);
		CleanUp();
   }

   if(CheckCarrier(LinkData))CleanUp();

   sprintf(UserName,"%s",UserText(LinkData,USER_NAME));
   GetUserInfo(LinkData,Handle,Data,SND_HANDLE);
   Gtype=UserData(LinkData,USER_GRAPHICS);

   strlwr(UserName);
   strlwr(Handle);

   ReadConfig();

   Log(5);

   begin:   CLS;

   if(Gtype>0) PrintString(LinkData,esc33,0);
   printw(" Welcome To SendEmail v1.0, this internet E-Mail door Assumes that your");
   printw("\n\r HandleName is part of your E-Mail Adress. If your HandleName is the");
   printw("\n\r same as your own name, you have to edit your HandleName to just ONE name");
   printw("\n\r For Example: handlename@name.of.this.site. If you haven't got an HANDLE,");
   printw("\n\r contact the Sysop");
   if(Gtype>0) PrintString(LinkData,esc35,0);
   printw("\n\r\n\r Your current HandleName is :");
   if(Gtype>0) PrintString(LinkData,esc32,0);
   printw(" (%s)",Handle);
   if(Gtype>0) PrintString(LinkData,esc31,0);
   printw("\n\r\n\r Enter [#] at E-Mail or Subject prompt to quit");

   if(Gtype>0) PrintString(LinkData,esc36,0);
   printw("\n\r\n\r Send E-Mail To : ");
   if(Gtype>0) PrintString(LinkData,esc37,0);
   Prompt(LinkData," ",To,70);
   if(To[0]==0) goto begin;
   if(To[0]=='#') CleanUp();


   sub: if(Gtype>0) PrintString(LinkData,esc36,0);
   printw("\n\r Subject        : ");
   if(Gtype>0) PrintString(LinkData,esc37,0);
   Prompt(LinkData," ",Subject,70);
   if(Subject[0]==0) goto sub;
   if(Subject[0]=='#') CleanUp();
   CLS;
   if(Gtype>0) PrintString(LinkData,esc37,0);
   NumChars = CleanEditFile(LinkData,"T:semail",500,&fileInfo);
   if(NumChars==0) CleanUp();

   select:  CLS;
   
   printw("\n\r From    : %s@%s (%s)",Handle,DOMAIN,UserName);
   printw("\n\r To      : %s",To);
   printw("\n\r Subject : %s",Subject);
   printw("\n\r\n\r[----------------------------*  MESSAGE BODY  *----------------------------]");
   PrintFile(LinkData,"T:semail");
   printw("\n\r");
   
   if(Gtype>0) PrintString(LinkData,esc36,0);
   printw("\n\r\n\r Would you like to SEND your message to Internet ?");
   if(Gtype>0) PrintString(LinkData,esc32,0);
   printw("  y/N: ");
   if(Gtype>0) PrintString(LinkData,esc37,0);
   HotKeyPrompt(LinkData,"[ ][2D",PassString);
   if(CheckCarrier(LinkData))CleanUp();
   strupr(PassString);
   if(PassString[0]=='Y')
   {
        sprintf(buffer,"SETENV USERNAME %s",Handle);
        if(system(buffer)!=0){ Log(3); Error();}
        sprintf(buffer,"SETENV REALNAME %s",UserName);
        if(system(buffer)!=0){ Log(3); Error();}
        sprintf(buffer,"SETENV USER %s",Handle);
        if(system(buffer)!=0){ Log(3); Error();}

        ersetze(Handle,' ','_');

        sprintf(buffer,"UUCP:c/sendmail -f \"%s\" -raw -s \"%s\" -t %s -R \"%s\" <T:semail",Handle,Subject,To,UserName);
        if(system(buffer)==0)
        {
                        Log(1);
                        WriteMessage();
                        if(Gtype>0) PrintString(LinkData,esc36,0);
                        HotKeyPrompt(LinkData,"\n\r Message was send to Internet as E-Mail, Press a key",buffer);
                        if(CheckCarrier(LinkData))CleanUp();
        }
        else Log(2);

        sprintf(buffer,"SETENV USERNAME %s",SHORTNAAM);
        if(system(buffer)!=0){ Log(3); Error();}
        sprintf(buffer,"SETENV REALNAME %s",REALNAAM);
        if(system(buffer)!=0){ Log(3); Error();}
        sprintf(buffer,"SETENV USER %s",SHORTNAAM);
        if(system(buffer)!=0){ Log(3); Error();}
        sprintf(buffer,"delete T:semail");
        if(system(buffer)!=0){ Log(3); Error();}
        CleanUp();
   }

   if(PassString[0]=='\r' || PassString[0]=='\n') goto select;
   if(Gtype>0) PrintString(LinkData,esc36,0);
   printw(" \n\r Aborted........");

   CleanUp();

}

void CleanUp(void)
{
   if(LinkData)CloseDoor(LinkData);
   if(MEBBSUtilityBase)CloseLibrary(MEBBSUtilityBase);
   exit(0);
}

int printw(a,b,c,d,e)
char	*a;
char	*b;
{
        char buf[100];
        int xy;
        sprintf(buf,a,b,c,d,e);
        xy=PrintString(LinkData,buf,0);
        return(xy);
}

VOID Error(void)
{
                        CLS;
                        if(Gtype>0) PrintString(LinkData,esc31,0);
                        printw("\n\r An error was detected....Aborting");
                        if(Gtype>0) PrintString(LinkData,esc36,0);
                        sprintf(buffer,"delete T:semail");
                        system(buffer);
                        sprintf(buffer,"SETENV USERNAME %s",SHORTNAAM);
                        system(buffer);
                        sprintf(buffer,"SETENV REALNAME %s",REALNAAM);
                        system(buffer);
                        sprintf(buffer,"SETENV USER %s",SHORTNAAM);
                        system(buffer);
                        PressKey;
                        CleanUp();
}

VOID WriteMessage(void)
{
    FILE *msg,*orig;
    char adres[255],str[100];

    sprintf(Tijd,"%s",UserText(LinkData,NOW_TIME));
    sprintf(Dag,"%s",UserText(LinkData,NOW_DATE));

    strcpy(adres,"Doors:SendEmail/Data/");
    strcat(adres,UserName);

    if(!(orig=fopen("T:semail","r")))
    {
        CLS;
        printw("\n\r\n\r Unable to Open your MessageBody, Please contact your Sysop");
        fclose(orig);
        PressKey;
        Error();
    }

    if((msg=fopen(adres,"a"))!=0)
    {
        fprintf(msg,"\n-------------------------------------------------------------------------------\n");
        fprintf(msg,"From       : %s@%s (%s)\n",Handle,DOMAIN,UserName);
        fprintf(msg,"To         : %s\n",To);
        fprintf(msg,"Subject    : %s\n",Subject);
        fprintf(msg,"Date       : %s [%s]\n",Dag,Tijd);
        fprintf(msg,"MessageBody:\n\n");

        while(!(feof(orig)))
        {
            if(fgets(str,80,orig)==NULL) break;
            fputs(str,msg);
        }
    }
    else
    {
                       CLS;
                       printw("\n\r\n\r An error Detected, Failed to Write your Message");
                       printw("\n\r Please report this failure to your Sysop");
                       PressKey;
                       Error();
    }

    fclose(msg);
    fclose(orig);

}

VOID ReadConfig(void)
{
        FILE *cfg;


        if((cfg=fopen("Doors:SendEmail/SendEmail.CFG","r"))!=0)
        {
                        fgets(REALNAAM,80,cfg);
                        fscanf(cfg,"%s",SHORTNAAM);
                        fscanf(cfg,"%s",LOGNAAM);
                        fscanf(cfg,"%s",DOMAIN);
        }
        else
        {
                        CLS;
                        printw("\n\r\n\r An error Detected, Failed to Open the ConfigFile");
                        printw("\n\r Please Report this error to your sysop");
                        PressKey;
                        Error();
        }

        fclose(cfg);

}

VOID Log(char state)
{

        char Tijd[100],Dag[100];
        FILE *log;

        sprintf(Tijd,"%s",UserText(LinkData,NOW_TIME));
        sprintf(Dag,"%s",UserText(LinkData,NOW_DATE));

        if((log=fopen(LOGNAAM,"a"))!=0)
        {
                        switch(state)
                        {
                        case 1: fprintf(log,"* USER: %s (%s) send E-Mail To: %s Subject: %s\n",Handle,UserName,To,Subject);
                                break;

                        case 2: fprintf(log,"! Error with SendMail From: %s, Handle: %s\n",UserName,Handle);
                                break;

                        case 3: fprintf(log,"! Error Setting ENV: %s\n",buffer);
                                break;

                        case 4: fprintf(log,"! Error Deleting file: T:semail\n");
                                break;

                        case 5: fprintf(log,"[ %s Session started at %s %s\n",Versie,Tijd,Dag);
                                break;
                        }
        }
        else
        {
                        CLS;
                        printw("\n\r\n\r An error Detected, Failed to Open the LogFile");
                        printw("\n\r Please Report this error to your sysop");
                        PressKey;
                        Error();
        }

        fclose(log);

}

VOID ersetze(char *string,int was,int wie)
{
 char *wo;

 wo=index(string,was);
 while(wo>0) *wo=wie;
}


