#include <utility/tagitem.h>


/***************************************************************************
 *                                                                         *
 *      LIBRARY-FUNKTIONEN ZUR INSTALLATION VON AUTOPOINT-PROGRAMMEN       *
 *                                                                         *
 ***************************************************************************/

int AP_InstallNewAutoPOINT(struct TagItem* tag_list_p);

/***************************************************************************
 *** Funktion     : AP_InstallNewAutoPOINT                               ***
 ***************************************************************************
 *** Beschreibung : Diese Funktion installiert den übergebenen AutoPOINT.***
 ***************************************************************************
 *** Parameter    : tag_list_p                                           ***
 ***                Typ          : struct TagItem*                       ***
 ***                Beschreibung : Zeiger auf ein TagItem-Array, welches ***
 ***                               mit TAG_DONE abgeschlossen ist!       ***
 ***************************************************************************
 *** Rückgabe     : success > 0, error < 0, cancel == 0                  ***
 ***************************************************************************/


/*** Übergabewerte / TAGS ***/

#define AP_Dummy (TAG_USER + 1024)
#define ZC_Dummy (TAG_USER + 2048)

/* Pflicht-Tags */

#define TAG_AP_PROGRAMM_NAME (AP_Dummy+0x0001)
      /* Data: char* - Zeiger auf Programmname      */

#define TAG_AP_DESCRIPTION_TEXT (AP_Dummy+0x0002)
      /* Data: char* - Zeiger auf Beschreibungstext-Filename (ohne .deutsch
                       - LOCALE-Language-String)
                       Zur Anzeige des Textes wird folgender Text geladen:
                       DOSPFAD+DESCRIPTON_TEXT+.SPRACHE
                       Erst wird versucht, die Sprache in Prefs zu laden,
                       wenn nicht möglich, dann .deutsch und danach .english*/

#define TAG_AP_DOSPFAD (AP_Dummy+0x0003)
      /* Data: char* - Zeiger auf Pfad. Der Pfad, wo sich das Programm und
                       das Setup-Programm und die Texte befinden            */

#define TAG_AP_DEINSTALL_PATH (AP_Dummy+0x0004)
      /* Data: char* - Zeiger auf Deinstallations-Pfad (Verzeichnis).
                       z.B. "bbs:externe/`PRGNAME`".
                       - mehrfach erlaubt                                   */


/* optionale Tags */

#define TAG_AP_DEINSTALL_FILE (AP_Dummy+0x0005)
      /* Data: char* - Zeiger auf Filename. Hier können zusätzliche Files
                       angegeben werden, die bei der Deinstallation gelöscht
                       werden sollen (z.B. Libs).z.B. "libs:ownlib.library"
                       - mehrfach erlaubt                                   */

#define TAG_AP_SETUP_PRG_NAME (AP_Dummy+0x0006)
      /* Data: char* - Zeiger auf Setup-Filename (ohne Pfad).               */ 

#define TAG_AP_VERSION (AP_Dummy+0x0007)
      /* Data: char* - Zeiger auf Versionsstring, wird nur bei der 
                       Installation angezeigt.                              */

#define TAG_AP_AUTHOR (AP_Dummy+0x0008)
      /* Data: char* - Zeiger auf Author(en)string, wird nur bei der
                       Installation angezeigt.                              */

#define TAG_AP_EMAIL (AP_Dummy+0x0009)
      /* Data: char* - Zeiger auf E-Mail-String, wird nur bei der 
                                                 Installation angezeigt.    */
#define TAG_AP_HELPTXTFILE (AP_Dummy+0x000a)
      /* Data: char* - Zeiger auf Filename der Helptextvorlage fuer MAPSHILFE
                       (ohne .Sprache (.German))                            */

#define TAG_AP_DEF_AP_NAME (AP_Dummy+0x000b)
      /* Data: char* - Zeiger auf Name des Beispiel-AutoPoints
                       - mehrfach erlaubt                                   */

#define TAG_AP_DEF_APN_TXT (AP_Dummy+0x000c)
      /* Data: char* - Zeiger auf Text, der vor der Installation des
                       Beispiel-AutoPOINTs angezeigt wird.
                       - mehrfach erlaubt                                   */

#define TAG_AP_DEF_APN_PREF (AP_Dummy+0x000d)
      /* Data: char* - Zeiger auf Filename. Wird von `progdir:FILENAME`
                       nach `DOSPFAD+AUTOPOINTNAME.conf` kopiert, sobald
                       der Beispiel-Autopoint installiert wird.
                       Ist für voreingestellte Konfig-Files gedacht.
                       - mehrfach erlaubt                                   */

#define TAG_AP_AutoPOINT_Delete (AP_Dummy+0x000e)
      /* Data: char* - Zeiger auf Delete-Filename (ohne Pfad).
                       Das Programm wird immer aufgerufen, sobald ein
                       AutoPOINT mit diesem Programm gelöscht wird, damit
                       z.B. Konfig-Files für diesen Autopoint gelöscht 
                       werden können.                                       */ 

#define TAG_AP_DEF_APN_HLPTXT (AP_Dummy+0x000f)
      /* Data: char* - Zeiger auf Filename. Wird von `progdir:FILENAME.#?`
                       nach `BBS:Netz/Texte/MapsHilfe/AUTOPOINTNAME.#?` 
                       kopiert, sobald der Beispiel-Autopoint installiert wird.
                       Ist für vorgeschriebene, fertige Hilfetexte gedacht.
                       Diese Texte werden dann bei HELP an Maps
                       zurückgesendet, sofern der User an diesen AutoPOINT
                       schreiben darf.
                       - mehrfach erlaubt                                   */


/*** Rückgabewerte ***/

#define ERROR_NO_ZCONNECT_MODUL   -1
#define ERROR_CANT_OPEN_MUI       -2
#define ERROR_CANT_CREATE_MUI_APP -3
#define ERROR_CANT_OPEN_INTUITION -4
#define ERROR_MISSING_TAGS        -5            // es fehlen pflicht-Tags
#define CANCEL_INSTALL             0
#define AUTOPOINTPRG_INSTALLED     1

/* ( > 1)  ----> Anzahl (Rückgabewert-1) der installierten Bsp-AutoPOINT(s) */






/***************************************************************************
 *                                                                         *
 *              LIBRARY FUNKTIONEN FÜR AUTOPOINT-PROGRAMME                 *
 *                                                                         *
 ***************************************************************************/



/* Funktionen für die Initialisierung des AutoPOINTs */

/***************************************************************************
 *** Funktion     : AP_InitInterface                                     ***
 ***************************************************************************
 *** Beschreibung : Muß am Anfang des AutoPOINT-Prg aufgerufen werden,   ***
 ***                damit der Sorter bescheid weiß, daß sich der AP      ***
 ***                angemeldet hat!                                      ***
 ***                Erst nach der Anmeldung darf man die unten           ***
 ***                aufgeführten Funktionen benutzen!                    ***
 ***                WARNING: Dieser Befehl muß aufjeden Fall am Anfang   ***
 ***                des Prg. getätigt werden, auch wenn irgendwas zB     ***
 ***                nicht geladen werden kann.                           ***
 ***************************************************************************
 *** Parameter    : name                                                 ***
 ***                Typ          : char*                                 ***
 ***                Beschreibung : Zeiger auf den Namen des AutoPOINT    ***
 ***************************************************************************
 *** Rückgabe     : 0 bei fehlgeschlagen, sonst                          ***
 ***                ist der Rückgabewert die Version der Library         ***
 ***                ( obere 16 BIT Version, untere 16 Bit Revision)      ***
 ***************************************************************************/

ULONG AP_InitInterface(char*);

/***************************************************************************
 *** Funktion     : AP_CloseInterface                                    ***
 ***************************************************************************
 *** Beschreibung : Muß am Ende des AutoPOINT-Prg aufgerufen werden,     ***
 ***                damit der Sorter bescheid weiß, daß sich der AP      ***
 ***                abgemeldet hat!                                      ***
 ***************************************************************************
 *** Parameter    : keine                                                ***
 ***************************************************************************
 *** Rückgabe     : keine                                                ***
 ***************************************************************************/

void AP_CloseInterface(void);


/* Funktionen zur Bearbeitung der empfangenen Mail */

/***************************************************************************
 *** Funktion     : AP_GetNextMail                                       ***
 ***************************************************************************
 *** Beschreibung : Wartet bzw. holt die nächste Mail für diesen         ***
 ***                AutoPOINT. Bei NULL ist keine weitere Mail vorhanden.***
 ***                Das Handle wird beim nächsten Aufruf von             ***
 ***                AP_GetNextMail wieder geschlossen. Mit den Handle    ***
 ***                kann man Daten der Mail bzw den Body der Mail lesen. ***
 ***************************************************************************
 *** Parameter    : keine                                                ***
 ***************************************************************************
 *** Rückgabe     : handle der Mail, bei NULL ist keine weitere Mail     ***
 ***                vorhanden, man muß dann AP_CloseInterface aufrufen   *** 
 ***************************************************************************/

APTR AP_GetNextMail(void);


/***************************************************************************
 *** Funktion     : AP_ReadMail                                          ***
 ***************************************************************************
 *** Beschreibung : Liest von dem READ-HANDLE den Body. Ist ähnlich dem  ***
 ***                Read() von der DOS.library.                          ***
 ***************************************************************************
 *** Parameter    : handle                                               ***
 ***                Typ          : APTR                                  ***
 ***                Beschreibung : Handle von AP_GetNextMail             ***
 ***                -----------------------------------------------------***
 ***                buffer_p                                             ***
 ***                Typ          : char*                                 ***
 ***                Beschreibung : Zeiger auf Speicherbereich, wo die    ***
 ***                               Daten abgelegt werden. Wenn die Mail  ***
 ***                               eine BIN-Mail ist, werden keine Daten ***
 ***                               konvertiert.                          ***
 ***                -----------------------------------------------------***
 ***                buffer_len                                           ***
 ***                Typ:         : ULONG                                 ***
 ***                Beschreibung : die Anzahl der Bytes, die gelesen     ***
 ***                               werden soll (kann).                   ***
 ***************************************************************************
 *** Rückgabe     : Die Anzahl der gelesenen Bytes. Wenn die Anzahl      ***
 ***                0 oder kleiner wie buffer_len ist, ist dieses der    ***
 ***                Rest der Mail.                                       ***
 ***************************************************************************/

ULONG AP_ReadMail(APTR handle,char* buffer_p,ULONG buffer_len);


/* Funktionen zur Erstellung von einer neuen Mail */

/***************************************************************************
 *** Funktion     : AP_CreateMail                                        ***
 ***************************************************************************
 *** Beschreibung : Legt (erzeugt) eine neue Mail. Das Handle muß mit    ***
 ***                AP_CloseWriteMail geschlossen werden.                ***
 ***************************************************************************
 *** Parameter    : tag                                                  ***
 ***                Typ          : struct TagItem*                       ***
 ***                Beschreibung : Zeiger auf ein TagItem-Array, welches ***
 ***                               mit TAG_DONE abgeschlossen ist!       ***
 ***                               Pflicht: min. 1 EMP,ABS,BET           ***
 ***                               STAT: AUTO wird eingefügt.            ***
 ***                               Die MID: kann man, wie andere Header, ***
 ***                               über die Funktion AP_GetData erfahren.***
 ***************************************************************************
 *** Rückgabe     : handle der Mail, bei NULL ist was schiefgegangen.    ***
 ***************************************************************************/


APTR AP_CreateMail(struct TagItem* tag_list_p);


/* Lese- und Schreib-Tags */

#define TAG_ZC_EMP (ZC_Dummy+0x0001)
/* ti_data - char* , Empfänger wenn keine Domain vorhanden ist, wird die
   des eigenen System angefügt */

#define TAG_ZC_ABS (ZC_Dummy+0x0002)
/* ti_data - char* , Absender wenn keine Domain vorhanden ist, wird die
   des eigenen System angefügt, bei NULL wird der Autopointname benutzt*/

#define TAG_ZC_BET (ZC_Dummy+0x0003)
/* ti_data - char* , betreff */

#define TAG_ZC_TYP (ZC_Dummy+0x0004)
/* ti_data - char* , bei NULL wird BIN angefügt */

#define TAG_ZC_ANTWORT_AN (ZC_Dummy+0x0005)
/* ti_data - char* , bei NULL wird der Syopname eingefügt*/

#define TAG_ZC_ERR (ZC_Dummy+0x0006)
/* ti_data - char* , error header */

#define TAG_ZC_FILE (ZC_Dummy+0x0007)
/* ti_data - char* , file header */

#define TAG_ZC_LANGUAGE (ZC_Dummy+0x0008)
/* ti_data - char* , Liste von Kürzel: erlaubt sind  GERMAN,ENGLISH,SPANISH,FRENCH,GREEK */

#define TAG_ZC_DISK_IN (ZC_Dummy+0x0009)
/* ti_data - char* , (diskussion in header zB "/Z-NETZ/ALT/....") */

#define TAG_ZC_PRIO (ZC_Dummy+0x0020)
/* ti_data - int , folgende PRIO gibt es :*/

#define DATA_ZC_PRIO_NORMAL     0
#define DATA_ZC_PRIO_DIREKT     10
#define DATA_ZC_PRIO_EIL        20

#define TAG_ZC_STAT (ZC_Dummy+0x0021)
/* ti_data - int , STAT headerfolgende STAT-MODIES gibt es:*/

#define DATA_ZC_STAT_AUTO 0             //USP fragen ;)
#define DATA_ZC_STAT_EB 1
#define DATA_ZC_STAT_CTL 2
#define DATA_ZC_STAT_TRACE 3
#define DATA_ZC_STAT_NOKOP 4
#define DATA_ZC_STAT_NOCIPHER 5


/***************************************************************************
 *** Funktion     : AP_CreateReplyMail                                   ***
 ***************************************************************************
 *** Beschreibung : Legt (erzeugt) eine neue Mail. Das Handle muß mit    ***
 ***                AP_CloseWriteMail geschlossen werden. Der Unterschied***
 ***                zu AP_CreateMail ist, daß der Absender und die MID   ***
 ***                über AP_GetData von der Mail (übergebenes Handle)    ***
 ***                ausgelesen werden, und in der TAG-Liste eingefügt    ***
 ***                werden. ABS und BET müssen trotzdem in der Liste     ***
 ***                vorhanden sein.                                      ***
 ***************************************************************************
 *** Parameter    : tag                                                  ***
 ***                Typ          : struct TagItem*                       ***
 ***                Beschreibung : Zeiger auf ein TagItem-Array, welches ***
 ***                               mit TAG_DONE abgeschlossen ist!       ***
 ***                               Pflicht: min. ABS,BET (1 EMP und BEZ  ***
 ***                               werden erzeugt)                       ***
 ***                               STAT: AUTO wird eingefügt.            ***
 ***                               Die MID: kann man, wie andere Header, ***
 ***                               über die Funktion AP_GetData erfahren.***
 ***                               TAGS die gleichen wie bei             ***
 ***                               AP_CreateMail.                        ***
 ***************************************************************************
 *** Rückgabe     : handle der Mail, bei NULL ist was schiefgegangen.    ***
 ***************************************************************************/

APTR AP_CreateReplyMail(APTR handle, struct TagItem* tag_list_p);


/***************************************************************************
 *** Funktion     : AP_WriteMail                                         ***
 ***************************************************************************
 *** Beschreibung : Schreibt Daten im Mail-Body des Write-Handles.       ***
 ***                Ähnlich dem Write() von der DOS.library.             ***
 ***************************************************************************
 *** Parameter    : handle                                               ***
 ***                Typ          : APTR                                  ***
 ***                Beschreibung : Handle von AP_CreateMail oder         ***
 ***                               AP_CreateReplyMail                    ***
 ***                -----------------------------------------------------***
 ***                buffer_p                                             ***
 ***                Typ          : char*                                 ***
 ***                Beschreibung : Zeiger auf Speicherbereich, welche    ***
 ***                               Daten gespeichert werden sollen.      ***
 ***                               Wenn die Mail eine BIN-Mail ist,      ***
 ***                               werden keine Daten konvertiert.       ***
 ***                -----------------------------------------------------***
 ***                buffer_len                                           ***
 ***                Typ:         : ULONG                                 ***
 ***                Beschreibung : die Anzahl der Bytes, die gespeichert ***
 ***                               werden sollen.                        ***
 ***************************************************************************
 *** Rückgabe     : Die Anzahl der (wirklich) gespeicherten Bytes. Bei   ***
 ***                0 oder kleiner 0 ist ein Fehler aufgetreten.         ***
 ***                Das Write-Handle muß mit AP_CloseWriteMail           ***
 ***                geschlossen werden.                                  ***
 ***************************************************************************/

int AP_WriteMail(APTR handle,char* buffer_p,ULONG buffer_len);

/***************************************************************************
 *** Funktion     : AP_CloseWriteMail                                    ***
 ***************************************************************************
 *** Beschreibung : Schließt das Handle und schickt die Mail zum Sorter  ***
 ***************************************************************************
 *** Parameter    : handle                                               ***
 ***                Typ          : APTR                                  ***
 ***                Beschreibung : Handle von AP_CreateMail oder         ***
 ***                               AP_CreateReplyMail                    ***
 ***************************************************************************
 *** Rückgabe     : keine                                                ***
 ***************************************************************************/

void AP_CloseWriteMail(APTR write_handle);


/***************************************************************************
 *** Funktion     : AP_GetDataTag                                        ***
 ***************************************************************************
 *** Beschreibung : Mit dieser Funktion lassen sich Header von der Mail  ***
 ***                auslesen, zB MessageID usw.
 ***************************************************************************
 *** Parameter    : handle                                               ***
 ***                Typ          : APTR                                  ***
 ***                Beschreibung : Handle von AP_CreateMail oder         ***
 ***                               AP_CreateReplyMail,AP_GetNextMail     ***
 ***************************************************************************
 *** Rückgabe     : negativ bei Fehler                                   ***
 ***************************************************************************/

int AP_GetDataTag(APTR handle,struct TagItem* tag);


/*** Übergabewerte / TAGS für AP_GetDataTag                ***/
/*** Die Tags von AP_CreateMail können auch genutzt werden ***/


/* Nur Lese-Tags */

#define TAG_ZC_MID (ZC_Dummy+0x0081)
/* ti_data - char* , MessageID */

#define TAG_ZC_LEN (ZC_Dummy+0x0082)
/* ti_data - char* , Länge der Mail inklusive des Kommentars, ACHTUNG bei
                     WRITE-HANDLES existiert dieser Header noch nicht */

#define TAG_ZC_EDA (ZC_Dummy+0x0083)
/* ti_data - char* , Erstellungsdatum */

#define TAG_ZC_ROT (ZC_Dummy+0x0084)
/* ti_data - char* , Routeweg */

#define TAG_ZC_BEZ (ZC_Dummy+0x0085)
/* ti_data - char* , BezugMessageID, man bekommt nur die letzte BEZ-MID */

#define TAG_ZC_KOM (ZC_Dummy+0x0086)
/* ti_data - char* , Länge des Kommentars, ACHTUNG bei WRITE nicht vorhanden*/

#define TAG_ZC_KOP (ZC_Dummy+0x0087)
/* ti_data - char* , Länge des Kommentars, ACHTUNG bei WRITE nicht vorhanden*/

#define TAG_ZC_MAILER (ZC_Dummy+0x0088)
/* ti_data - char* , Mailer-Header*/

#define TAG_ZC_O_EDA (ZC_Dummy+0x0089)
/* ti_data - char* , Bei Weiterleiten steht hier das Original-
                     Erstellungsdatum */

#define TAG_ZC_O_ROT (ZC_Dummy+0x008a)
/* ti_data - char* , Original-Routeweg */

#define TAG_ZC_OAB (ZC_Dummy+0x008b)
/* ti_data - char* , Original-Absender */

#define TAG_ZC_OEM (ZC_Dummy+0x008c)
/* ti_data - char* , Original Empfänger */

#define TAG_ZC_ORG (ZC_Dummy+0x008d)
/* ti_data - char* , Organisations des Absenders*/

#define TAG_ZC_POST (ZC_Dummy+0x008e)
/* ti_data - char* , (real) Adresse des Absenders */

#define TAG_ZC_TEL (ZC_Dummy+0x008f)
/* ti_data - char* , Telefon des Absenders */

#define TAG_ZC_VER (ZC_Dummy+0x0090)
/* ti_data - char* , Vertreter des Empfängers */

#define TAG_ZC_VIA (ZC_Dummy+0x0091)
/* ti_data - char* , geroutet bei System/Gate um DATUM/UHR */

#define TAG_ZC_WAB (ZC_Dummy+0x0092)
/* ti_data - char* , Weiterleiter*/

/* 
Allgemeines zu AP_GetDataTag():

Man brauch kein Speicher für die STrings zu holen, das macht die
Funktion selber (MemoryPool). Dieser Pool wird geflushed :
 - Bei Read-Handles : sobald AP_GetNextMail aufgerufen wird
 - Bei Write-Handles: sobald AP_CloseWriteMail aufgerufen wird

Jedes Handel hat sein eigenen Pool.

Bsp um den Absender der Nachricht zu bekommen:
------------------------------------

  struct TagItem get_tags[]=
  {
    TAG_ZC_ABS,NULL,
    TAG_DONE,NULL
  };

  if(AP_GetDataTag(handle,get_tags)<0)
  {
    //Fehler
  }
  else
  {
    //Alles klar
    if(get_tags[0].ti_Data)
    {
//In get_tags[0].ti_Data steht ein Zeiger (Typ:char*) der auf den
//angeforderten String zeigt.
	  }
  }

Wenn das Handle jetzt geschlossen wird, sind die Daten ungültig, die
mit AP_GetDataTag geholt worden sind (zeigen dann in den Wald).

*/