/*
   $VER: LhaExtract.zprx 1.4 (25.05.95) Copyright (c) Nils Görs.

   Ein ARexx-Skript für "Zodiac's Point" zum entpacken von Lha- und
   LZX Archiven.


   FUNKTIONSBESCHREIBUNG:

    Dieses  Skript  erstellt, mittels der  "rexxtricks.library",  eine
    Liste  eines  LhA-bzw. LZX Archives.  Aus dieser  Liste können Sie
    dann ganz bequem einzelne  Dateien anwählen und diese dann aus dem
    Archiv entpacken lassen.


   INSTALLATION:

    Kopieren sie dieses Skript in  das  Rexx-Verzeichnis  von  ZP  und
    fügen  sie  danach  der  Datei  'fkeys.zp'  auf Wunsch den Eintrag
    "F1:SYS:Rexxc/RX ZPOINT:Rexx/LhaEx.zprx %s" hinzu.

    Wenn  Sie anstelle eines Archivlisters  "LhaExtract.zprx" benutzen
    möchten, dann ergänzen Sie bitte die Datei 'whatis.zp' um folgende
    Einträge:
    LHArc
    ZODIAC:Scripts/LhaExStart %s %s
    LZX
    ZODIAC:Scripts/LhaExStart %s %s

    Kopieren Sie nun das Skript 'LhAExStart' in das entsprechende Ver-
    zeichniss und starten Sie Zodiac's Point neu.


   AUTOR DIESES SKRIPTS:

       Nils Görs              Tel. : +49 (0)202 784258
       Kaiserstr. 97a         EMail: N.Goers@Art-Line.Art-Line.de
       42329 Wuppertal          oder über das ZP-Support-Brett.

   Verwenden Sie bitte nach Möglichkeit elektronische Post!


   Das Skript benötigt Jürgen Kohrmeyers "rexxtricks.library" (>=38.1)
   und die "rexxreqtools.library" von Nico François.

*/

/* Wie breit bzw. hoch soll das Fenster sein ? (0 = default)       */
Fensterbreite = 600
Fensterhoehe  = 400

/* Default-Zielverzeichnis                                 */

destdir = "ram:"


/* Wenn dieser Wert auf 1 steht, dann wird das
   Zielverzeichnis erfragt (wohin soll entpackt werden ?)  */

DirErfragen = 1


/*  Zielverzeichnis über einen String oder über einen
    Directoryrequest erfragen ?
    0 = Directoryrequest
    1 = Stringrequest                                      */

ReqErfragen = 0
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 *      Bitte geben Sie hier ihre Präferenzen ein !                *
 *******************************************************************/
 
/*******************************************************************
 *      Bitte unterhalb dieser Zeile nichts mehr verändern!        *
 *******************************************************************/

fenster.title     = 'Bitte wählen'
fenster.gadgettext= 'mit _Unterv.|_ohne Unterv.|_Abbrechen'
fenster.height	  = fensterhoehe
fenster.width     = fensterbreite
fenster.font      = 'SCREEN'
fenster.sort      = 'TRUE'
NL  = '0a'x
Anf = '"'
Filename = "T:Tmp.lha"
OPTIONS RESULTS

/* ------ von welchem ZP Port wurde das Script aufgerufen ? ------ */
PARSE ARG zpPort
IF zpPort == "" THEN
   zpPort = "ZPoint"
ADDRESS VALUE zpPort

/* öffne alle nötigen libraries - wenn nicht möglich Programmende */

IF ~SHOW('LIBRARIES','rexxreqtools.library') THEN
  IF ~ADDLIB('rexxreqtools.library',0,-30,0) THEN
    EXIT

IF ~SHOW('LIBRARIES','rexxtricks.library') THEN
  IF ~ADDLIB('rexxtricks.library',0,-30,0) THEN
    EXIT

/* ------------------------ Hauptprogramm ------------------------ */

WHICHLEVEL
IF (RESULT ~== 'BOARD') THEN
  DO
    CALL rtezrequest('Bitte erst ein File auswählen!','OK','Fehler','rt_pubscrname='zpPort)
    EXIT
  END

SAVEMESSAGEBODY 'T:Tmp.lha'

     IF ~OPEN(dat,"t:Tmp.lha",Read) THEN/* öffne File */
       DO                               /* hat nicht geklappt! */
        CALL rtezrequest("File: T:TMP.LHA nicht gefunden!", " ENDE ",,"rt_pubscrname="zpPort)
       EXIT                             /* und Program beenden! */
       END
     ELSE                               /* File konnte geöffnet werden! */

      CALL SEEK(dat,2,Begin)            /* springe an das zweite Byte im File */
       String=READCH(dat,3)             /* und lese ab dort drei Zeichen */

/*
 Hier wird nun festgestellt, ob es sich bei dem Archiv um ein LhA
 oder ein LZX Archiv handelt
*/

      IF COMPARE(String,"-lh") == 0 THEN DO /* testen, ob es sich um ein */
        CALL CLOSE(dat)
        CALL _MainLHA                        /* LhA Archive handelt */
        EXIT
       END
      ELSE

      CALL SEEK(dat,0,Begin)            /* springe an den Anfang des Files */
       String=READCH(dat,3)             /* und lese ab dort drei Zeichen */
      IF COMPARE(String,"LZX") == 0 THEN DO /* testen, ob es sich um ein */
        CALL CLOSE(dat)                     /* LZX Archiv handelt */
        CALL _MainLZX
        EXIT
      END
    ELSE
    CALL rtezrequest('Dies ist weder ein LhA noch ein LZX Archiv !','OK','Fehler',"rt_pubscrname="zpPort)

    CALL CLOSE(dat)
    ADDRESS COMMAND  'DELETE t:Tmp.lha QUIET >NIL:'
    EXIT

_MainLHA:
 ADDRESS COMMAND 'LHA vq T:Tmp.lha >t:TmpDir'

IF ~READFILE("t:tmpDir",zeile) THEN DO

   CALL rtezrequest("LHA-Fileliste konnte nicht gelesen werden",,,"rt_pubscrname="zpPort)

  ADDRESS COMMAND 'Delete T:TmpDir QUIET >NIL:'
  ADDRESS COMMAND 'Delete T:Tmp.lha QUIET >NIL:'
  EXIT
END

'GUILOCK text="LhaExtract läuft!"'

lv = 0  /* für LhA */
DO i = 3 TO zeile.0
  liste.lv = (zeile.i)
  lv = lv + 1
END
liste.0 = lv-1

fenster.pubscreen = zpPort

IF VIEWLIST('liste','fenster','destvar') THEN DO
  do i=0 to destvar.0
    if pos(" ",destvar.i)>0 then destvar.i='"'destvar.i'"'
  end
  ok=writefile("t:tmpdir",destvar)

IF direrfragen = 1 THEN
 DO
  IF reqerfragen == 1 THEN DO
   destdir = rtgetstring(,'Bitte Zielverzeichnis eingeben' || NL ||,
                          'z.B. T: oder sys:tools/','Verzeichnis ?','OK',"rt_pubscrname="zpPort,res)
   IF RES == 0 THEN DO
   call DELETING
   EXIT
   END
  END
  ELSE
   destdir = rtfilerequest(, , "Bitte Zielverzeichnis auswählen",, "rtfi_flags = freqf_nofiles",
   "rtfi_initialpath="destdir "rt_pubscrname="zpPort,res)
   IF RES == 0 THEN DO
   CALL DELETING
   EXIT
   END
 END

IF destvar.gadget == 2 THEN
 ADDRESS COMMAND 'LHA -it:tmpdir -x2 e T:Tmp.lha' Anf||destdir||Anf
ELSE
 ADDRESS COMMAND 'LHA -it:tmpdir x T:Tmp.lha' Anf||destdir||Anf
END

Deleting:
 ADDRESS COMMAND 'Delete t:tmpdir QUIET >NIL:'
 ADDRESS COMMAND 'Delete T:Tmp.lha QUIET >NIL:'
GUILOCK OFF
EXIT

/***************************************************************
 * Hier beginnt nun der Teil, der für LZX-Archive zuständig ist*
 ****************************************************************/

_MainLZX:
'GUILOCK text="LhaExtract läuft!"'
ADDRESS COMMAND 'LZX -X0 l' Filename '>t:TmpDir'

IF ~OPEN(LzxName,'t:TmpDir',Read) THEN EXIT
IF ~OPEN(LzxName2,'t:TmpDir2',Write) THEN EXIT

DO I = 1 to 9                            /* die ersten 9  Zeilen */
 String=READLN(LzxName)                  /* können wir vergessen */
END

DO WHILE ~EOF(LzxName)
 String=READLN(LzxName)                  /* Zeile lesen */
 StringOut=DELSTR(String,1,43)           /* Zeile auf Filename kürzen */
  If StringOut ~= "" THEN
   CALL WRITELN(LzxName2,StringOut)          /* Filename in Datei schreiben */
END

CALL CLOSE(LzxName); CALL CLOSE(LzxName2)

CALL READFILE("t:tmpDir2",zeile)

lv = 0    /* für LZX */
DO i = 0 TO zeile.0
  liste.lv = (zeile.i)
  lv = lv + 1
END
liste.0 = lv-2

fenster.pubscreen = zpPort

IF VIEWLIST('liste','fenster','destvar') THEN DO
  do a=0 to destvar.0
    if pos(" ",destvar.a)>0 then destvar.a='"'destvar.a'"'
  end
  ok=writefile("t:tmpdir",destvar)

IF ~OPEN(LzxName,'t:TmpDir',Read) THEN CALL QUITLZX
String=READLN(lzxName)

IF destvar.gadget == 2 THEN CALL OHNE_LZX     /* ohne Unterverz. */
IF destvar.gadget == 1 THEN CALL MIT_LZX      /* mit Unterverz.*/

END

QuitLZX:
 CALL CLOSE(LzxName)                       /* Was wir öffnen, müssen wir auch wieder schließen */
 ADDRESS COMMAND "Delete t:tmpdir#? QUIET" /* Temporäre Dateien löschen */
 ADDRESS COMMAND "Delete" Filename "QUIET >NIL:"
GUILOCK OFF
EXIT

OHNE_LZX:
 LzxOption = "-X0 x"  /* Extract file(s) !!!! richtige Option ist "e" */
 CALL Lzx_Loop
 CALL QuitLZX

MIT_LZX:
 LzxOption = "-X0 x"  /* Extract file(s) with full path */
 CALL Lzx_Loop
 CALL QuitLZX

Lzx_Loop:
 DO WHILE ~EOF(LzxName)
  ADDRESS COMMAND 'LZX' LzxOption Filename String Destdir
  String=READLN(lzxName)
 END
