/*
    $VER: FilterPuffer.zprx 1.3 (2.7.95) Copyright (c) Jürgen Kohrmeyer

    Dies ist  ein ARexx-Skript für Zodiac's  Point, mit dem  man  einen
    empfangenen  Netcallpuffer  entpacken  und filtern kann. Das Script
    erkennt automatisch  ob der angekommene Puffer ein LhA-Archiv  oder
    ungepackt ist,  entpackt oder  kopiert  diesen  entsprechend in ein
    Verzeichnis 'T:WILAM-04431-92081' und filtert dann alle enthaltenen
    Einzelpuffer.  Die fertig  gefilterten  Puffer werden  im aktuellen
    Verzeichnis unter dem  Namen 'PUFFER' gespeichert. In dieser  Datei
    sind  alle empfangenen Einzelpuffer hintereinandergehängt enthalten
    und können einsortiert werden.

    Sie dürfen dieses  Skript beliebig kopieren,  solange  es  zusammen
    mit  Zodiac's  Point  eingesetzt wird,  aber verändern Sie es bitte
    nicht ohne Erlaubnis des Autors.

    Sie erreichen den Autor wie folgt:

       Jürgen Kohrmeyer       Tel. : +49 5402 5195
       Oststraße 2            EMail: j_kohrmeyer@wilam.north.de
       49143 Bissendorf

    Hinweise zur Installation:

    Kopieren sie  dieses Skript in  das  Rexx-Verzeichnis  von  ZP  und
    tragen  sie es als Entpacker in Zodiac's Point ein.  Rufen Sie dazu
    'Konfiguration erstellen  oder ändern/Pfade und Kommandos' auf,  im
    Eingabefeld für den 'Entpacker' tragen Sie folgendes ein:
    "SYS:Rexxc/RX Rexx/FilterPuffer.zprx %s %s"
*/

/*
** Hier müssen die kompletten Pfade der Packer LHA, LZX und UNZIP
** eingetragen werden. Für Packer, die nicht verwendet werden, muß
** nichts angegeben werden. Alle Pfade müssen in Anführungszeichen
** oder Hochkommas stehen.
** 
*/

lha   = 'C:lha'
lzx   = 'C:lzx'
unzip = 'C:unzip'


/*
** Hier wird ein Verzeichnis für temporäre Daten angegeben. Auf
** dem Datenträger, der dieses Verzeichnis enthält muß genügend
** Speicherplatz für den gesamten, entpackten Puffer vorhanden
** sein. Der Pfad muß in Anführungszeichen oder Hochkommas stehen.
*/

tempdir = 'T:'


/*
** Beginn des Scripts
*/

OPTIONS RESULTS
OPTIONS FAILAT 20

PARSE ARG archiv screenname

IF archiv = '' | screenname = '' THEN
   quit('Format: FilterPuffer <LHa-Archiv oder Pufferdatei> <Name des Public-Screen>',10)

IF ~EXISTS(archiv) THEN
   quit('Die Datei' archiv 'existiert nicht!',10)

IF ~SHOW(LIBRARIES,'rexxsupport.library') THEN
   IF ~ADDLIB('rexxsupport.library',0,-30,0) THEN
      quit('Kann die <rexxsupport.library> nicht öffnen!',10)



/*
** Pfad des temporären Verzeichnisses 'tempdir' zusammensetzen
*/

IF RIGHT(tempdir,1) ~= '/' & RIGHT(tempdir,1) ~= ':' THEN
   tempdir = tempdir||'/WILAM-04431-92081'
ELSE
   tempdir = tempdir||'WILAM-04431-92081'



/*
** 'tempdir' neu anlegen
*/

IF EXISTS(tempdir) THEN
   ADDRESS COMMAND 'Delete "'||tempdir||'" ALL QUIET'

IF ~MAKEDIR(tempdir) THEN
   quit('Verzeichnis' tempdir 'kann nicht angelegt werden!',10)



/*
** Pufferdatei öffnen, die ersten 7 Bytes einlesen und wieder schließen
*/

IF ~OPEN('testfile',archiv,'READ') THEN
   quit('Fehler beim Öffnen der Pufferdatei' archiv||'!',rc)

string = READCH('testfile',7)

CLOSE('testfile')



/*
** Überprüfen ob die Pufferdatei mit LHA, LZX oder ZIP gepackt, oder
** ungepackt ist. Dann entsprechend nach 'tempdir' entpacken oder kopieren.
*/

SELECT
   WHEN SUBSTR(string,3,3) = '-lh' & DATATYPE(SUBSTR(string,6,1)) = 'NUM' & RIGHT(string,1) = '-' THEN DO
      SAY 'Entpacke LHA-Archiv "'||archiv||'" nach "'||tempdir||'/"'||'0a'x
      ADDRESS COMMAND lha 'x -X' archiv '"'||tempdir||'/"'
   END

   WHEN SUBSTR(string,1,3) = 'LZX' THEN DO
      SAY 'Entpacke LZX-Archiv "'||archiv||'" nach "'||tempdir||'/"'||'0a'x
      ADDRESS COMMAND lzx '-X0 x' archiv '"'||tempdir||'/"'
   END

   WHEN SUBSTR(string,1,4) = 'PK'||'03'x||'04'x THEN DO
      SAY 'Entpacke ZIP-Archiv "'||archiv||'" nach "'||tempdir||'/"'||'0a'x

      olddir=PRAGMA('D',tempdir)
      tarchiv=olddir

      IF RIGHT(tarchiv,1) ~= '/' &RIGHT(tarchiv,1) ~= ':' THEN
         tarchiv=tarchiv||'/'

      tarchiv=tarchiv||archiv
      IF UPPER(RIGHT(tarchiv,4)) = '.ZIP' THEN
         tarchiv=LEFT(tarchiv,LENGTH(tarchiv)-4)

      ADDRESS COMMAND unzip '-x "'||tarchiv||'"'
      olddir=PRAGMA('D',olddir)
   END

   OTHERWISE DO
      SAY 'Kopiere "'||archiv||'" nach "'||tempdir||'/'||archiv||'"'
      ADDRESS COMMAND 'copy' archiv '"'||tempdir||'/'||archiv||'"'
   END
END

IF rc ~= 0 THEN
   quit('Fehler beim Entpacken/Kopieren der Pufferdatei' archiv||'!',rc)

SAY



/*
** Alle Filenamen auslesen
*/

filestring = SHOWDIR(tempdir,'FILE')
anzfiles = WORDS(filestring)

IF anzfiles = 0 THEN
   quit('Die Pufferdatei enthielt keine Daten!',10)



/*
** Testen, ob MailFilter gestartet ist. Wenn nicht, dann jetzt starten
*/

IF ~SHOW(PORTS,'MAILFILTER') THEN DO
   ADDRESS COMMAND
   'run >NIL: <NIL: MAILFILTER:MailFilter'

   DO 3 WHILE ~SHOW(PORTS,'MAILFILTER')
      'WaitForPort MAILFILTER'
   END

   IF rc = 5 THEN
      quit('Kann MailFilter nicht starten!',10)
END



/*
** Damit der neue Puffer nicht an eine eventuell bestehende Datei
** 'PUFFER' angehängt wird, wird diese jetzt gelöscht. Wenn das
** gerade empfangene Archiv ebenfalls 'PUFFER' heißt wird es nicht
** gelöscht, sondern in 'PUFFER.old' umbenannt.
*/

IF EXISTS('PUFFER.old') THEN
   CALL DELETE('PUFFER.old')

IF EXISTS('PUFFER') THEN DO
   IF UPPER(archiv) = 'PUFFER' THEN
      CALL RENAME('PUFFER','PUFFER.old')
   ELSE
      CALL DELETE('PUFFER')
END



/*
** Aktuelles Verzeichnis ermitteln und den Pfad der Datei 'PUFFER'
** zusammensetzen, weil MailFilter zum Filtern den kompletten Pfad
** des Zielpuffers benötigt.
*/

pfad = PRAGMA(D)

IF RIGHT(pfad,1) ~= '/' & RIGHT(pfad,1) ~= ':' THEN
   pufferdatei = pfad||'/PUFFER'
ELSE
   pufferdatei = pfad||'PUFFER'



/*
** Aktuellen ZPoint-Screen einstellen
*/

ADDRESS MAILFILTER

GETATTR screen

IF result ~= screenname THEN DO
   DEACTIVATE
   SETATTR screen screenname
END



/*
** Alle Files aus dem temporären Verzeichnis lesen, filtern und
** im aktuellen Verzeichnis unter dem Namen 'PUFFER'abspeichern.
*/

DO i = 1 TO anzfiles
   SAY 'Filtern von' WORD(filestring,i) '...'
   FILTER 'FROM "'||tempdir||'/'||WORD(filestring,i)||'" TO "'||pufferdatei||'" JOIN'

   IF rc ~= 0 THEN
      quit('Fehler beim Filtern der Datei' WORD(filestring,i) rc2,rc)
END



/*
** Einstellungen speichern, damit bei allen verwendeten
** Filtereinträgen das aktuelle Datum vermerkt wird.
*/

SAVE



/*
** 'tempdir' komplett löschen
*/

ADDRESS COMMAND 'Delete "'||tempdir||'" ALL QUIET'
QUIT FORCE
EXIT(0)



/*
** Script mit Meldung beenden
*/

quit:
   PARSE ARG message,rcode
   IF message ~= '' THEN
      SAY message

   IF OPEN('con','*','WRITE') THEN DO
      CALL WRITECH('con','0A'x||'Bitte <RETURN> drücken')
      CALL READLN('con')
   END

   EXIT(rcode)
