/*ProfiPacket - packet radio terminal program
  Copyright (C) 1999  Alexander Feigl

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

  Author:

  Alexander Feigl
  Burachstraße 51

  D-88250 Weingarten

  Mail : Alexander.Feigl@gmx.de
*/


#ifndef MAIL_INCLUDE

#define MAIL_INCLUDE

#ifdef AmigaOS

#include <exec/nodes.h>

#endif /*AmigaOS*/

#ifdef MAIL_PRIVATE

#ifdef AmigaOS

#include <dos/dos.h>

#endif /*AmigaOS*/

#define BBSObject_HRoute  0
#define BBSObject_User    1
#define BBSObject_ForwardEntry 2
#define BBSObject_DontForward  3
#define BBSObject_ForwardCron 4

struct BBSObject
 {
  struct BBSObject *next;
  unsigned long objecttype;
  union {
         struct {
                 unsigned char BBS[16];      /* Call der BBS */
                 unsigned char HRoute[64];   /* H-Route der BBS */
                } HRoute ;
         struct {
                 unsigned char UserCall[16]; /* Call des Users */
                 unsigned char Name[32];     /* Name des Users */
                 unsigned char QTH[32];      /* QTH des Users */
                 unsigned char PLZ[16];      /* PLZ des Users */
                 unsigned char HomeBBS[16];  /* HomeBBS des Users*/
                } User;
         struct {
                 unsigned char Target[16];        /* Zielcall der Mail*/
                 unsigned char AtDesignator[16];  /* At Eintrag der Mail*/
                 unsigned char Hierarchy[64];     /* H-Route der Mail*/
                 unsigned char ForwardBox[16];    /* Box an die gesendet wird*/
                } ForwardEntry;
         struct {
                 unsigned char Target[16];        /* Zielcall der Mail*/
                 unsigned char AtDesignator[16];  /* At Eintrag der Mail*/
                 unsigned char Hierarchy[64];     /* H-Route der Mail*/
                 unsigned char ForwardBox[16];    /* Box für die Forwarsp*/
                } DontForward;
         struct {
                 unsigned char ForwardBox[16];    /* Box für den Forward */
                 unsigned char ForwardPath[64];   /* Pfad für den Forward */
                 unsigned long StartHour;         /* Startzeit */
                 unsigned long StartMinute;       /* Startzeit */
                 unsigned long StopHour;          /* Stopzeit */
                 unsigned long StopMinute;        /* Stopzeit */
                 unsigned long Interval;          /* Intervall für den Forward*/
                 unsigned long PrivOnly;          /* Private Mails only 0=OK 1=No 2=Reject 3=Defer*/
                 unsigned long TNC;               /* TNC Nummer für FWD*/
                 unsigned long Port;              /* TNC Port für FWD*/
                } ForwardCron;

        } BBSUnion;

 };


struct MailHandle
 {
  struct Node Node;
  unsigned short  Pad1;
  struct Mail    *MailNode;
  unsigned long   MailMode;
  BPTR            FileHandle;
  unsigned long   ProcessedBytes;
    signed long   LineBytes;
  unsigned long   Authorization;
  unsigned long   ReceivedFWD;
  unsigned long   MailInHeader;
  unsigned char   FileName[64];
  unsigned char   LineBuffer[512];
 };

struct Mail
 {
  unsigned long Number;
  unsigned char Bid[16];
  unsigned char From[8];
  unsigned char To[12];
  unsigned char At[8];
  unsigned char Title[80];
  unsigned long Date[2];
  unsigned long DateStatus[2];
  unsigned long Status;
  unsigned long Bytes;
  unsigned char HRoute[64];
  unsigned long Lifetime;

  unsigned char RxFrom[8];           /*Empfangen von BBS */
  unsigned char OriginBBS[8];        /*Ursprungsmailbox */

  unsigned long OriginDate[2];       /*Erstellungsdatum in UrsprungsBBS*/

  unsigned long ReadCounter;
  unsigned long ForwardCounter;
  unsigned long ForwardDest[4];      /*Array für 512 Boxen - hier forwarden*/
  unsigned long ForwardDone[4];      /*Array für 512 Boxen - Forward getan */

  unsigned long FuturePad[8];        /*Raum für Erweiterungen - Vorbelegt mit 0*/
 };

#define MAILSTATUS_INWRITE      31    /*Mail wird gerade erstellt*/
#define MAILSTATUS_AUTOBINARY   30    /*Mail ist eine Autobinär-Mail*/
#define MAILSTATUS_7PLUS        29    /*Mail ist eine 7+-Mail*/
#define MAILSTATUS_INCOMPLETE   28    /*Mail wurde als unvollständig markiert*/

#define MAILSTATUS_KILLED        7    /*Mail wurde bereits gelöscht*/
#define MAILSTATUS_LOCALUSER     6    /*Mail ist an einen lokalen User*/
#define MAILSTATUS_WANTACK       5    /*Mail enthält eine /ACK Zeile*/
#define MAILSTATUS_ACKMAIL       4    /*Mail ist eine ACK - Mail */
#define MAILSTATUS_FORWARD       3    /*Mail wurde als geforwardet markiert*/
#define MAILSTATUS_READ          2    /*Mail wurde als gelesen markiert*/
#define MAILSTATUS_LOCAL         1    /*Mail wurde lokal erstellt*/
#define MAILSTATUS_PERSONAL      0    /*Mail ist eine P oder A Mail */

struct MailBase
 {
  unsigned char IDString[8];        /* String BBSIndex */
  unsigned long SizeofMail;         /* Größe eines Maileintrags - obsolete*/
  unsigned long NumberMails;        /* Anzahl der Mails in Datenbank*/
  unsigned long LastBID;            /* Letzte generierte BID-Nummer*/
  unsigned long IndexVersion;       /* Versionsnummer des Index*/
  unsigned char BoxIdent[16];       /* Box-Ident des Index*/
  unsigned long HousekeepDay;       /* Tag des letzten BBS Housekeeps*/
  unsigned long Padding[8];         /* Raum für Erweiterungen - Std 0 */
 };


struct MailOld
 {
  unsigned long Number;
  unsigned char Bid[16];
  unsigned char From[8];
  unsigned char To[10];
  unsigned char At[8];
  unsigned char Title[80];
  unsigned long Date[2];
  unsigned long Status;
  unsigned long Bytes;
  unsigned char HRoute[64];
  unsigned long Lifetime;
 };



#else

/* dummy declarations for private structs */

struct MailHandle
 {};

struct Mail
 {};

#endif


/* public functions of the ProfiPacket mailbox */

void MAIL_ChangeUser(unsigned char *call,unsigned char *name,
                     unsigned char *qth,unsigned char *zipcode,
                     unsigned char *homebbs,int savedb);
unsigned char *MAIL_GetUserName(unsigned char *call);
unsigned char *MAIL_GetUserQTH(unsigned char *call);
unsigned char *MAIL_GetUserZIP(unsigned char *call);
unsigned char *MAIL_GetUserBBS(unsigned char *call);
unsigned char *MAIL_GetHRoute(unsigned char *bbs);
int MAIL_AddForwardMail(const unsigned char *box,const unsigned char *bid);
int MAIL_RemoveFMail(unsigned char *box,unsigned long mnum);
int MAIL_GetNextFMail(unsigned char *box,unsigned long offset);
int MAIL_GetForwardBytes(unsigned char *box);
int MAIL_GetForwardMails(unsigned char *box);
unsigned long MAIL_LookLocalMail(void);
signed long MAIL_WriteMail(struct MailHandle *mailh,void *data,unsigned long length);
void *MAIL_SendMail(const unsigned char *call,const unsigned char *tocall,
                    const unsigned char *atcall,unsigned long personal,
                    const unsigned char *bid);
int MAIL_CopyMail(const unsigned char *call,const unsigned char *tocall,
                    const unsigned char *atcall,unsigned long personal,
                    const unsigned char *bid,unsigned long sourcenu,
                    const unsigned char *sourcecall,
                    const unsigned char *mailtitle);
void *MAIL_OpenMail(unsigned long mailnum,const unsigned char *opencall);
void MAIL_CloseMail(struct MailHandle *mailh);
void MAIL_SetMailTitle(struct MailHandle *mail,const unsigned char *title);
const unsigned char *MAIL_GetMailBid(const struct MailHandle *mailh);
unsigned long MAIL_SearchMail(const unsigned char *call,unsigned long mode,
                              unsigned long lastmail);
void MAIL_SetNotForward(struct MailHandle *mailh,const unsigned char *call);
unsigned long MAIL_GetNumberMail(const struct MailHandle *mailh);
const unsigned char *MAIL_GetMailFm(const struct MailHandle *mailh);
const unsigned char *MAIL_GetMailTo(const struct MailHandle *mailh);
const unsigned char *MAIL_GetMailAt(const struct MailHandle *mailh);
const unsigned char *MAIL_GetMailTitle(const struct MailHandle *mailh);
const unsigned char *MAIL_GetBoxCall(void);
const unsigned long *MAIL_GetMailDate(const struct MailHandle *mailh);
unsigned long MAIL_GetMailStatus(const struct MailHandle *mailh);
const unsigned char *MAIL_GetMailHRoute(const struct MailHandle *mailh);
unsigned long MAIL_GetMailBytes(const struct MailHandle *mailh);
void MAIL_GetMailStatusTxt(const struct MailHandle *mailh,unsigned char *chars);
unsigned long MAIL_TestForMail(const unsigned char *call);
signed long MAIL_ReadMail(struct MailHandle *mailh,unsigned char *data,unsigned long size);
signed long MAIL_ReadMailLine(struct MailHandle *mailh,unsigned char *data,unsigned long size);
void MAIL_GetMailDateTxt(const struct MailHandle *mailh,unsigned char *dest);
signed long MAIL_KillMail(unsigned long number,const unsigned char *call);
void MAIL_MarkAsRead(const struct MailHandle *mailh);
void MAIL_MarkAsForward(const struct MailHandle *mailh);
void MAIL_MarkAsIncomp(const struct MailHandle *mailh);
void MAIL_MarkAs7Plus(const struct MailHandle *mailh);
void MAIL_MarkAsWantAck(const struct MailHandle *mailh);
unsigned long MAIL_SearchMailBid(const unsigned char *bid);
signed long MAIL_GetMailLines(unsigned long mode,signed long lastmail,
                              const unsigned char *call,unsigned char *mailline);
int MAIL_SendMailFile(unsigned long personal,unsigned long binary,
                      const unsigned char *from,const unsigned char *to,
                      const unsigned char *at,const unsigned char *title,
                      const unsigned char *filename,
                      const unsigned char *bid,
                      const unsigned char *notforward,
                      unsigned long notconvert);
int MAIL_ExtractMailFile(const unsigned char *filename,unsigned long mailnr,
                         unsigned long disableconvert);
void MAIL_DoPoll(void);
int MAIL_Init(void);
void MAIL_Cleanup(void);
void MAIL_DailyHousekeeping(void);
unsigned long MAIL_ComposeRLine(struct MailHandle *mailh,unsigned char *cbuf);
unsigned long MAIL_GetLatestMail();
int MAIL_GetForwardDest(struct MailHandle *xmail,unsigned char *xline);
void MAIL_HandleMailMacro(unsigned char *mailline,unsigned long number);
int MAIL_TestPrivateMail(const unsigned char *boxcall);
void MAIL_NewMinute(void);
void MAIL_ForwardBox(const unsigned char *boxcall);
int MAIL_TestForwardTime(const unsigned char *boxcall);


#endif
