home *** CD-ROM | disk | FTP | other *** search
-
- {///////////////////////////////////////////////////////////////////////////}
- {/ /}
- {/ RAM - BACKUP : Kopiert Dateien zwischen Laufwerken und Unterverzeich- /}
- {/ nissen als Backup ( d.h. alte Version wird umbenannt /}
- {/ in .BAK, neue Version wird unter dem Namen gesichert). /}
- {/ /}
- {/ Dieses PUBLIC DOMAIN Programm wurde 1986 mit ST Pascal plus von CCD /}
- {/ entwickelt, 1987 und 1988 erweitert von /}
- {/ ERHARD SCHWARTZ /}
- {/ Isaraustraße 8 /}
- {/ Version 1.61 vom 19.04.88 D - 8192 Geretsried 1 /}
- {/ /}
- {/ /}
- {/ NEU : Um auch Anfängern und Umsteigern den Einstieg in diese schöne /}
- {/ Programmiersprache zu erleichtern, sind ab sofort auch die /}
- {/ Pascal-Sources meiner Programme PUBLIC DOMAIN. /}
- {/ Sollte jedoch jemand dieses Programm selbst oder zumindest die /}
- {/ Source als Anregung für eigene Programme gut gebrauchen können, /}
- {/ so bitte ich um Überweisung eines kleinen Unkostenbeitrags auf /}
- {/ folgendes Konto: /}
- {/ Kreissparkasse Wolfratshausen, BLZ 70054306, Konto-Nr. 670588 /}
- {/ /}
- {/ /}
- {/ Änderungen am Programm ab Version : /}
- {/ /}
- {/ 1.60 - Umstellung auf ST Pascal Plus Version 2.0 /}
- {/ - Intelligenteres Behandeln der Dateipfade bei erneutem Aufruf /}
- {/ 1.61 - Etwas mehr Farbenpracht für die vernachlässigten Color - Fans /}
- {/ /}
- {///////////////////////////////////////////////////////////////////////////}
-
- {$A+} { Programm soll ein Accessory werden }
- {$S5} { Heap und Stack mit 5k }
- {$D-} { Ohne Debug }
- {$P-} { Keine Überprüfung von Zeigern }
- {$R-} { Keine Unterbereichsprüfung }
- {$T-} { Keine Überprüfung von Heap und Stack }
-
-
- PROGRAM ACCESSORY_BACKUP_by_ERHARD_SCHWARTZ;
-
- {$I GEM.INC} { GEM.INC enthält die Dateien GEMCONST.PAS mit vorange- }
- { stelltem CONST, GEMTYPE.PAS mit vorangestelltem TYPE }
- { sowie GEMSUBS.PAS. Warum also auf 3 Dateien verteilt, }
- { wenns ab ST-Pascal Plus V. 2.0 auch mit einer geht ? }
-
- {$I TRIX.INC} { Gleiches Verfahren wie mit dem GEM - Routinen }
-
- CONST
-
- (***********************************************)
- (** **)
- (**) VERSION = '1.61'; (**)
- (** **)
- (***********************************************)
-
- MENU_EINTRAG = ' RAM - Backup';
- BOX_LEN = 52;
- MUSTER = 17;
- MAXBYTE = 1024;
-
- TYPE ext_typ = STRING[3];
-
- rwbuftyp = PACKED ARRAY[1..MAXBYTE] OF CHAR;
-
- dtabuftyp = RECORD { Struktur des DTA-Puffers }
- dos : PACKED ARRAY[0..21] OF CHAR;
- time,
- date : INTEGER;
- size : LONG_INTEGER;
- name : PACKED ARRAY[1..14] OF CHAR;
- END;
-
- VAR ap_id,
- menu_id,
- mist,
- wahl : INTEGER;
-
- dl : dialog_ptr;
-
- angemeldet : SET OF CHAR;
-
- q_drive, { Laufwerk für Quelle und Ziel }
- z_drive : CHAR;
-
- q_dr_str, { Diverse Strings }
- z_dr_str,
- t,
- frag_leer,
- acc_name : str255;
-
- quell_btn, { Namen aus dem Dialog }
- ziel_btn,
- ordner_btn,
- quell_name,
- ziel_name,
- quell_drive,
- ziel_drive,
- start_btn,
- cancel_btn : INTEGER;
-
- erfolg, { Flags }
- kopier_stop : BOOLEAN;
-
- in_fil_pfad,
- out_fil_pfad,
- pfad_anf,
- letzt_ord,
- datei_name : path_name;
- extension,
- q_ext : ext_typ;
-
- fenster, { Daten des Hintergrundfensters }
- fenst_x,
- fenst_y,
- fenst_w,
- fenst_h : INTEGER;
- fenstername : window_title;
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Definition der benötigten BIOS- und GEMDOS - Routinen //////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
-
- FUNCTION dgetdrv : INTEGER; GEMDOS($19);
- PROCEDURE fsetdta( VAR dtabuf : dtabuftyp); GEMDOS($1A);
- FUNCTION dcreate( VAR path : c_string ) : INTEGER; GEMDOS($39);
- FUNCTION fcreate( VAR nam : c_string; att:INTEGER): INTEGER; GEMDOS($3C);
- FUNCTION fopen ( VAR nam : c_string; att:INTEGER): INTEGER; GEMDOS($3D);
- FUNCTION fclose ( handle : INTEGER) : INTEGER; GEMDOS($3E);
- FUNCTION fread ( handle : INTEGER; cnt : LONG_INTEGER;
- VAR rwbuf : rwbuftyp) : LONG_INTEGER; GEMDOS($3F);
- FUNCTION fwrite ( handle : INTEGER; cnt : LONG_INTEGER;
- VAR rwbuf : rwbuftyp) : LONG_INTEGER; GEMDOS($40);
- FUNCTION fdelete( VAR nam : c_string) : INTEGER; GEMDOS($41);
- FUNCTION frename( res:INTEGER; VAR q, z:c_string) : INTEGER; GEMDOS($56);
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Hier werden einige Voreinstellungen gemacht ////////////////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- PROCEDURE initialisiere;
- VAR i : INTEGER;
- logged_drive : CHAR;
- BEGIN
- logged_drive := chr( dgetdrv + 65);
- z_drive := logged_drive; { Als Ziel wird Bootlaufwerk genommen }
-
- q_drive := 'Q'; { Laufwerke gehen von A bis P }
- REPEAT q_drive := pred( q_drive) { Höchstes Laufwerk als Quelle }
- UNTIL q_drive IN angemeldet; { ... da vermutlich die Ramdisk }
- IF q_drive = 'B' THEN q_drive := logged_drive; { Aber nicht B }
-
- erfolg := FALSE;
- in_fil_pfad := '';
- out_fil_pfad := '';
- q_ext := '*'; { Voreinstellung : *.* }
-
- frag_leer := ' ??? keine Angabe ???';
- FOR i := length(frag_leer) + 1 TO BOX_LEN DO frag_leer[i] := ' ';
- frag_leer[0] := chr(BOX_LEN);
- END; { procedure initialisiere }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Ermittlung der angemeldeten Laufwerke /////////////////////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- PROCEDURE erlaubte_laufwerke;
- VAR map : INTEGER;
- ch : CHAR;
- FUNCTION drvmap : INTEGER; BIOS ( 10);
- BEGIN
- angemeldet := []; { Zunächst kein angemeldetes Laufwerk }
- map := drvmap;
- FOR ch := 'A' TO 'P' DO
- BEGIN
- IF ( map & $01) = $01 { Angemeldete Laufwerke }
- THEN angemeldet := angemeldet + [ch]; { im Bitvektor suchen }
- map := shr( map, 1); { Bits um eine Position }
- END; { for - Schleife } { nach rechts schieben }
- END; { procedure erlaubte_laufwerke }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// U P C A S E wandelt in Großbuchstaben um ////////////////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- FUNCTION upcase ( ch : CHAR ) : CHAR;
- BEGIN
- IF ( ch >= 'a') AND ( ch <= 'z' )
- THEN upcase := chr( ord( ch) - 32 )
- ELSE CASE ch OF
- 'ä' : upcase := 'Ä';
- 'ö' : upcase := 'Ö';
- 'ü' : upcase := 'Ü';
- ELSE : upcase := ch;
- END; { case }
- END; { upcase }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Analysiert einen Dateipfad ////////////////////////////////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- PROCEDURE pfad_analyse( VAR ur_pfad, pfad, letzt_ord, name : path_name;
- VAR ext : ext_typ);
- VAR i,
- len,
- punkt : INTEGER;
- BEGIN
- letzt_ord := ''; { Zuerst alles löschen }
- name := '';
- ext := '';
- pfad := ur_pfad; { Pfad kopieren }
- len := length( pfad);
- IF len > 0 { Alles andere wäre ja unsinnig ! }
- THEN BEGIN
- i := len; { Alles von hinten her aufrollen }
- punkt := 0; { Noch keinen Punkt gefunden }
-
- LOOP { Zuerst '.' und '\' ermitteln }
- IF pfad[i] = '.' THEN punkt := i;
- EXIT IF (pfad[i] = '\') OR (i = 1);
- i := i - 1;
- END; { loop }
- IF punkt > 0 { Dateiname hatte eine Extension }
- THEN ext := copy( pfad, punkt + 1, len - punkt)
- ELSE punkt := len + 1; { punkt auf Zeichen nach Ende des Namens }
-
- IF i = 1 THEN i := 0; { i auf Zeichen vor Anfang des Namens }
- name := copy( pfad, i + 1, punkt - i - 1);
- pfad[0] := chr( i); { Pfadlänge korrigieren }
-
- IF i > 1 { '\' sollte ja nicht am Anfang stehen }
- THEN BEGIN
- REPEAT { Suchen, ob noch ein '\' vorhanden }
- i := i - 1;
- UNTIL (pfad[i] = '\') OR (i = 1);
- IF i > 1 { '\' gefunden }
- THEN BEGIN
- letzt_ord := copy( pfad, i + 1, length( pfad) - i);
- { Ordnername kopieren }
- pfad[0] := chr( i); { Pfadlänge korrigieren }
- END;
- END; { Pfad bestand nicht nur aus dem Namen }
- END; { Pfad war kein Leerstring }
- END; { pfad_analyse }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Hier wird geprüft, ob eine Datei bereits existiert ////////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- FUNCTION exist( filnam : path_name) : BOOLEAN;
- VAR path : c_string;
- FUNCTION fsfirst( VAR p : c_string; att:INTEGER) : INTEGER; GEMDOS($4E);
- BEGIN
- PtoCstr( filnam, path);
- exist := fsfirst( path, 0) = NO_ERROR;
- END; { function exist }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Hier wird die Kopie angefertigt ///////////////////////////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- FUNCTION backup(q_name, z_name: path_name): BOOLEAN;
-
- VAR bak_name : path_name;
-
- q_pfad,
- z_pfad,
- bak_pfad : c_string;
-
- q_handle,
- z_handle,
- i : INTEGER;
-
- dtabuf : dtabuftyp;
- rwbuf : rwbuftyp;
-
- datei_laenge : LONG_INTEGER;
-
- abbruch : BOOLEAN;
-
- {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
- {~~~ Hier werden eventuelle Fehlermeldungen ausgegeben ~~~~~~~~~~~~~~~~~}
- {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
-
- PROCEDURE backup_alarm( alarm : INTEGER );
- VAR t : str255;
- BEGIN
- CASE alarm OF
- 1 : t := '[2][Kann angegebene Quelldatei| |nicht finden][ABBRUCH]';
- 2 : t := '[3][Kann angegebene Quelldatei| |nicht öffnen][ABBRUCH]';
- 3 : t := '[3][Kann angegebene Zieldatei| |nicht öffnen][ABBRUCH]';
- 4 : t := '[3][Fehler beim Einlesen| |der Quelldatei][ABBRUCH]';
- 5 : t := '[3][Fehler beim Schreiben| |in Zieldatei][ABBRUCH]';
- 6 : t := '[3][Zieldatei konnte nicht| |geschlossen werden][OKAY]';
- 7 : t := '[3][Quelldatei konnte nicht| |geschlossen werden][OKAY]';
- 8 : t := concat('[3][Alte .BAK-Datei konnte|nicht gelöscht werden.| |',
- 'Status vermutlich "nur lesen"][ABBRUCH]');
- 9 : t := '[3][Diskette hat zu wenig| |Speicherplatz][ABBRUCH]';
- 10: t := concat('[3][Alte Zieldatei konnte nicht|',
- 'in .BAK umbenannt werden.| |',
- 'Status vermutlich "nur lesen"][ABBRUCH]');
- END; { case }
- mist := do_alert( t, 1);
- abbruch := TRUE;
- END; { procedure backup_alarm }
-
-
- {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
- {~~~ Enthält die Kopierschleife ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
- {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
-
- PROCEDURE durchlaufe_kopierschleife( rest : LONG_INTEGER);
- VAR r_byte,
- w_byte,
- copybyte : LONG_INTEGER;
- BEGIN
- abbruch := FALSE;
- WHILE (rest > 0) AND NOT abbruch DO { Solange, bis fertig oder Fehler }
- BEGIN
- IF rest > MAXBYTE
- THEN copybyte := MAXBYTE { Maximale Pufferlänge ausnutzen }
- ELSE copybyte := rest; { ansonsten halt den Rest nehmen }
-
- r_byte := fread(q_handle,copybyte, rwbuf); { Puffer einlesen }
- IF r_byte <> copybyte { Fehler beim Lesen }
- THEN backup_alarm(4)
- ELSE BEGIN { alles ok }
- w_byte := fwrite(z_handle,copybyte,rwbuf);{ Puffer schreiben }
- IF w_byte <> copybyte { Schreibfehler ist aufgetreten }
- THEN backup_alarm(5);
- END;
- rest := rest - copybyte;
- END; { while }
- END; { durchlaufe_kopierschleife }
-
-
- {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
- {~~~ Fertigt die Kopie an ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
- {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
-
- PROCEDURE kopiere_datei;
- BEGIN
- q_handle := fopen(q_pfad, 0); { Quelldatei öffnen }
- IF q_handle < 0
- THEN backup_alarm(2) { Fehler, Quelle nicht geöffnet }
- ELSE BEGIN { Alles klar, Quelle offen }
- z_handle := fcreate(z_pfad, 0); { Zieldatei anlegen }
- IF z_handle < 0
- THEN backup_alarm(3) { Fehler, Ziel nicht geöffnet }
- ELSE durchlaufe_kopierschleife( datei_laenge);
- IF fclose( z_handle) <> NO_ERROR
- THEN backup_alarm(6); { Fehler, Ziel nicht geschlossen }
- END; { Quelle war offen }
- IF fclose( q_handle) <> NO_ERROR
- THEN backup_alarm(7); { Fehler, Quelle nicht geschlossen }
- END; { kopiere_datei }
-
-
- {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
- {~~~ Ermittelt den auf der Diskette vorhandenen Speicherplatz ~~~~~~~~~}
- {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
-
- FUNCTION speicherplatz( drive : CHAR) : LONG_INTEGER;
- TYPE p_buf = RECORD
- freie_cluster,
- gesamt_cluster,
- bytes_pro_sector,
- sectoren_pro_cluster : LONG_INTEGER;
- END; { record }
- VAR platz : p_buf;
- drive_nr : INTEGER;
- FUNCTION dfree ( VAR p : p_buf; d : INTEGER) : INTEGER; GEMDOS($36);
- BEGIN
- drive_nr := ord( drive) - 64; { A --> 1, B --> 2 etc. }
- IF dfree( platz, drive_nr) = NO_ERROR
- THEN speicherplatz := platz.freie_cluster * platz.sectoren_pro_cluster
- * platz.bytes_pro_sector
- ELSE speicherplatz := 0;
- END; { function speicherplatz }
-
- {~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
-
- BEGIN { function backup }
- abbruch := FALSE;
- fsetdta( dtabuf); { Neue Adresse für DTA-Puffer }
- pfad_analyse( z_name, pfad_anf, letzt_ord, datei_name, extension);
- bak_name := concat( pfad_anf, letzt_ord, datei_name, '.BAK');
- { Backup-Datei bekommt Extension .BAK }
- PtoCstr(q_name, q_pfad); { C-Pfadnamen aus Dateinamen machen }
- PtoCstr(z_name, z_pfad);
- PtoCstr(bak_name, bak_pfad);
-
- IF NOT exist(q_name) { Quell-Datei suchen und DTA-Puffer füllen }
- THEN backup_alarm(1) { Fehler, Quelldatei existiert nicht }
- ELSE
- BEGIN { Alles klar, Quelldatei existiert }
- datei_laenge := dtabuf.size; { Länge aus DTA-Puffer entnehmen, }
- { bevor er überschrieben wird }
- IF exist( bak_name) AND exist( z_name) { Alte .BAK muß gelöscht werden }
- THEN IF fdelete(bak_pfad) <> NO_ERROR
- THEN backup_alarm( 8); { vermutlich Schreibschutz }
-
- IF NOT abbruch
- THEN
- BEGIN { Kopie machen, da bis jetzt kein Fehler }
- IF speicherplatz( z_drive) < datei_laenge
- THEN backup_alarm( 9) { Zu wenig Speicherplatz }
- ELSE BEGIN { Alles klar, Speicherplatz reicht aus }
- IF exist(z_name) { Evtl. alte Datei in .BAK umbenennen }
- THEN IF frename(0, z_pfad, bak_pfad) <> NO_ERROR
- THEN backup_alarm(10); { Fehler, Schreibschutz ? }
-
- IF NOT abbruch THEN kopiere_datei; { Jetzt kanns losgehn }
- END; { Speicherplatz hat ausgereicht }
- END; { Kopie gemacht, da kein Fehler }
- END; { Quelldatei hat existiert }
- backup := NOT abbruch;
- END; { function backup }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Hier wird das Dialogfeld zusammengebaut ///////////////////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- PROCEDURE baue_dialog; { Erstellt das Dialogfeld }
- CONST RA_ST_0 = 0; { Rahmen-Stärken }
- RA_ST_1I = -1;
- RA_ST_2I = 2;
- RA_ST_2A = 2;
- NORM_FA = $1181; { = 0001 0001 1 000 0001 }
- { Rahmen, Text, Muster sw, Text drüber }
- RAHMEN_RT = $2181; { = 0010 0001 1 000 0001 }
- RAHMEN_GN = $3181; { = 0011 0001 1 000 0001 }
- MAX_D_ITEMS = 18;
-
- BEGIN
-
- dl := new_dialog( MAX_D_ITEMS, 0, 0, 70, 20);
-
- mist := add_ditem ( dl, G_IBOX, NONE, 2,1,66,5, RA_ST_2I, RAHMEN_RT);
- obj_setstate ( dl, mist , OUTLINED , FALSE);
-
- mist := add_ditem ( dl, G_TEXT, NONE, 2, 1, 66, 2, RA_ST_0, NORM_FA);
- obj_setstate ( dl, mist, NORMAL, FALSE);
- t := concat ( 'RAM - BACKUP V ', VERSION,
- ' * PUBLIC DOMAIN * 1986-88 by E. SCHWARTZ');
- set_dtext ( dl, mist, t, SYSTEM_FONT, TE_CENTER);
-
- mist := add_ditem ( dl, G_TEXT, NONE, 2, 3, 66, 1, RA_ST_0, NORM_FA);
- obj_setstate ( dl, mist, NORMAL, FALSE);
- t := concat ( 'ENTWICKELT MIT ST PASCAL PLUS VON CCD. KLEINE ',
- 'UNKOSTENBEITRÄGE FÜR DIESES PROGRAMM');
- set_dtext ( dl, mist, t, SMALL_FONT, TE_CENTER);
-
- mist := add_ditem ( dl, G_TEXT, NONE, 2, 4, 66, 1, RA_ST_0, NORM_FA);
- obj_setstate ( dl, mist, NORMAL, FALSE);
- t := concat ( 'WERDEN JEDERZEIT GERNE ENTGEGENGENOMMEN VON : ',
- 'ERHARD SCHWARTZ, ISARAUSTRASSE 8,');
- set_dtext ( dl, mist, t, SMALL_FONT, TE_CENTER);
-
- mist := add_ditem ( dl, G_TEXT, NONE, 2, 5, 66, 1, RA_ST_0, NORM_FA);
- obj_setstate ( dl, mist, NORMAL, FALSE);
- t := concat ( 'D - 8192 GERETSRIED 1. KONTO-NR. 670588, ',
- 'KREISSPARK. WOLFRATSHAUSEN, BLZ 70054306');
- set_dtext ( dl, mist, t, SMALL_FONT, TE_CENTER);
-
-
- quell_btn := add_ditem ( dl, G_BUTTON, SELECTABLE|EXIT_BTN, 2, 8, 20, 2,
- RA_ST_2I, NORM_FA);
- obj_setstate ( dl, quell_btn , OUTLINED, FALSE);
- set_dtext ( dl, quell_btn, 'Quell-Datei ...', SYSTEM_FONT,
- TE_CENTER);
-
- ziel_btn := add_ditem ( dl, G_BUTTON, SELECTABLE|EXIT_BTN, 25, 8, 20, 2,
- RA_ST_2I, NORM_FA);
- obj_setstate ( dl, ziel_btn, OUTLINED|DISABLED, FALSE);
- set_dtext ( dl, ziel_btn, 'Ziel-Datei ...', SYSTEM_FONT,
- TE_CENTER);
-
- ordner_btn := add_ditem ( dl, G_BUTTON , SELECTABLE|EXIT_BTN, 48, 8, 20, 2,
- RA_ST_2I, NORM_FA);
- obj_setstate ( dl, ordner_btn, OUTLINED, FALSE);
- set_dtext ( dl, ordner_btn, 'Neuer Ordner ...', SYSTEM_FONT,
- TE_CENTER);
-
- mist := add_ditem (dl, G_TEXT, NONE, 2, 12, 12, 1, RA_ST_0, NORM_FA);
- obj_setstate ( dl, mist, NORMAL, FALSE);
- set_dtext ( dl, mist, 'Kopiere von', SYSTEM_FONT, TE_RIGHT);
-
- quell_name := add_ditem ( dl, G_BOXTEXT, NONE,16, 12, BOX_LEN, 1,
- RA_ST_1I, NORM_FA);
- obj_setstate ( dl, quell_name, NORMAL, FALSE);
- set_dtext( dl, quell_name, frag_leer, SYSTEM_FONT, TE_LEFT);
-
- mist := add_ditem ( dl, G_TEXT, NONE, 2,14,12, 1, RA_ST_0 , NORM_FA);
- obj_setstate ( dl, mist, NORMAL, FALSE);
- set_dtext ( dl, mist, 'nach', SYSTEM_FONT, TE_RIGHT );
-
- ziel_name := add_ditem ( dl, G_BOXTEXT, NONE, 16, 14, BOX_LEN, 1,
- RA_ST_1I, NORM_FA);
- obj_setstate ( dl, ziel_name, NORMAL, FALSE);
- set_dtext ( dl, ziel_name, frag_leer, SYSTEM_FONT, TE_LEFT);
-
- mist := add_ditem ( dl, G_TEXT, NONE, 2, 17, 12, 2, RA_ST_2A, NORM_FA);
- obj_setstate ( dl, mist, NORMAL, FALSE);
- set_dtext ( dl, mist, 'Richtung :', SYSTEM_FONT, TE_CENTER);
-
- quell_drive := add_ditem( dl, G_FBOXTEXT,EDITABLE, 15, 17, 4, 2, RA_ST_2A,
- NORM_FA);
- obj_setstate ( dl, quell_drive, NORMAL, FALSE);
- set_dedit( dl, quell_drive, '_', 'a', q_drive, SYSTEM_FONT,
- TE_CENTER);
-
- mist := add_ditem (dl, G_TEXT, NONE, 20, 17, 5, 2, RA_ST_2A, NORM_FA);
- obj_setstate ( dl, mist, NORMAL, FALSE);
- set_dtext ( dl, mist, '--->', SYSTEM_FONT, TE_CENTER);
-
- ziel_drive := add_ditem( dl, G_FBOXTEXT,EDITABLE, 26, 17, 4, 2,
- RA_ST_2A, NORM_FA);
- obj_setstate ( dl, ziel_drive , NORMAL, FALSE);
- set_dedit ( dl, ziel_drive , '_', 'a', z_drive,
- SYSTEM_FONT, TE_CENTER);
-
- start_btn := add_ditem( dl,G_BUTTON,SELECTABLE|EXIT_BTN, 38, 17, 13, 2,
- RA_ST_2A, NORM_FA);
- obj_setstate ( dl,start_btn,OUTLINED|DISABLED|SHADOWED, FALSE);
- set_dtext ( dl,start_btn, 'Los geht''s',SYSTEM_FONT,TE_CENTER);
-
- cancel_btn := add_ditem( dl, G_BUTTON , SELECTABLE|EXIT_BTN, 55, 17, 13, 2,
- RA_ST_2A, NORM_FA);
- obj_setstate ( dl, cancel_btn, OUTLINED, FALSE);
- set_dtext ( dl, cancel_btn, 'Abbruch', SYSTEM_FONT, TE_CENTER);
-
- END; { procedure baue_dialog }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Gibt bei nicht angemeldetem Laufwerk Fehlermeldung aus ////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- PROCEDURE nicht_angemeldet_alarm( ch : CHAR);
- BEGIN
- t := concat( '[1][Laufwerk ', ch, '| |nicht angemeldet !][OKAY]');
- mist := do_alert( t, 1);
- kopier_stop := TRUE;
- END; { procedure nicht_angemeldet_alarm }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Erstellt neuen Ordner /////////////////////////////////////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- PROCEDURE neuer_ordner;
- VAR ord_pfad,
- vorschlag : path_name;
- ord_c_pfad : c_string;
- BEGIN
- ord_pfad := '';
- vorschlag := concat( z_drive, ':\*.ORD');
- IF get_in_file( vorschlag, ord_pfad)
- THEN
- BEGIN
- PtoCstr( ord_pfad, ord_c_pfad);
- CASE - dcreate( ord_c_pfad) OF { Ordner anlegen }
- 0 : BEGIN END;
- 34 : mist := do_alert('[3][Pfad nicht gefunden !][OKAY]', 1);
- 36 : mist := do_alert('[3][Zugriff verweigert !][OKAY]', 1);
- OTHERWISE : mist := do_alert('[3][Unbekannter Fehler][OKAY]', 1);
- END; { case }
- END; { Name wurde ausgewählt }
- END; { procedure neuer_ordner }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Ermittelt den Namen der Quelldatei ////////////////////////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- PROCEDURE suche_quelldatei;
- VAR vorschlag,
- neu_pfad : path_name;
- file_erhalten : BOOLEAN;
- BEGIN
- vorschlag := concat( q_drive, ':\*.', q_ext);
- neu_pfad := in_fil_pfad;
- file_erhalten := get_in_file( vorschlag, neu_pfad);
- IF length( neu_pfad) > BOX_LEN
- THEN BEGIN
- mist:= do_alert('[1][Tut mir leid,| |Pfadname zu lang !][OKAY]', 1);
- file_erhalten := FALSE;
- END; { Name war zu lang }
- pfad_analyse( neu_pfad, pfad_anf, letzt_ord, datei_name, extension);
- IF file_erhalten AND ( datei_name <> '' )
- THEN
- BEGIN
- in_fil_pfad := neu_pfad; { Pfad übernehmen }
- IF in_fil_pfad[1] IN angemeldet { Prüfen, ob Laufwerk angemeldet }
- THEN q_drive := in_fil_pfad[1]
- ELSE BEGIN
- nicht_angemeldet_alarm( in_fil_pfad[1]);
- in_fil_pfad[1] := q_drive;
- END; { Laufwerk nicht Angemeldet }
- pfad_analyse( in_fil_pfad, pfad_anf, letzt_ord, datei_name, q_ext);
- { Extension übernehmen }
- IF out_fil_pfad <> ''
- THEN BEGIN
- pfad_analyse( out_fil_pfad, pfad_anf, letzt_ord,
- neu_pfad, extension);
- out_fil_pfad := concat(pfad_anf,letzt_ord,datei_name,'.',q_ext);
- out_fil_pfad[1] := z_drive;
- END
- ELSE out_fil_pfad := concat( z_drive, ':\', datei_name, '.', q_ext);
-
- obj_setstate( dl, ziel_btn, obj_state(dl,ziel_btn) & ~ DISABLED, FALSE);
- obj_setstate( dl, start_btn,obj_state(dl,start_btn)& ~ DISABLED, FALSE);
- { Selektierung von Ziel und Los gehts erlauben }
- END; { Quelle ausgesucht }
- END; { procedure suche_quelldatei }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Ermittelt den Namen der Zieldatei /////////////////////////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- PROCEDURE suche_zieldatei;
- VAR vorschlag,
- neu_pfad : path_name;
- file_erhalten : BOOLEAN;
- BEGIN
- neu_pfad := out_fil_pfad;
- pfad_analyse( neu_pfad, pfad_anf, letzt_ord, datei_name, extension);
- vorschlag := concat( pfad_anf,letzt_ord, '*.', q_ext);
- file_erhalten := get_in_file( vorschlag, neu_pfad);
- IF length( neu_pfad) > BOX_LEN
- THEN BEGIN
- mist:= do_alert('[1][Tut mir leid,| |Pfadname zu lang !][OKAY]', 1);
- file_erhalten := FALSE;
- END; { Name war zu lang }
- pfad_analyse( neu_pfad, pfad_anf, letzt_ord, datei_name, extension);
- IF file_erhalten AND ( datei_name <> '' )
- THEN BEGIN
- out_fil_pfad := neu_pfad;
- IF out_fil_pfad[1] IN angemeldet
- THEN z_drive := out_fil_pfad[1]
- ELSE BEGIN
- nicht_angemeldet_alarm( out_fil_pfad[1]);
- out_fil_pfad[1] := z_drive;
- END; { Laufwerk nicht Angemeldet }
- END; { File wurde geliefert }
- END; { procedure suche_zieldatei }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Malt das Hintergrundfenster vollständig aus ///////////////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- PROCEDURE redraw_hintergrund;
- TYPE aufloesung = ( LOW_RES, MID_RES, HIGH_RES);
- FUNCTION getres : aufloesung; XBIOS (4);
- BEGIN
- hide_mouse;
- set_clip( fenst_x, fenst_y, fenst_w, fenst_h);
- IF getres = HIGH_RES
- THEN paint_color( BLACK)
- ELSE paint_color( GREEN);
- paint_style( MUSTER);
- paint_rect( fenst_x, fenst_y, fenst_w, fenst_h);
- show_mouse;
- END; { procedure redraw_hintergrund }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Reagiert auf Aktionen im Dialogfeld ///////////////////////////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- PROCEDURE action;
- VAR i : INTEGER;
- BEGIN { Eigenes großes Fenster als Hintergrund }
- fenstername := ''; { sonst Störung durch fremdes WM_REDRAW }
- fenster := new_window( NONE, fenstername, 0, 0, 0, 0 );
- open_window ( fenster, 0, 0, 0, 0 );
- work_rect( fenster, fenst_x, fenst_y, fenst_w, fenst_h);
- redraw_hintergrund;
-
- set_mouse( M_ARROW);
- erlaubte_laufwerke; { Feststellen, welche Laufwerke verfügbar sind }
- erfolg := FALSE;
-
- wahl := do_dialog( dl, quell_drive);
-
- LOOP { bis Cancel_btn gewählt oder erfolgreich kopiert }
- kopier_stop := FALSE;
-
- get_dedit( dl, quell_drive, q_dr_str); { Laufwerksangaben holen }
- get_dedit( dl, ziel_drive, z_dr_str);
-
- IF ( q_dr_str[1] <> q_drive) AND ( length(q_dr_str) > 0 )
- THEN IF upcase( q_dr_str[1]) IN angemeldet
- THEN q_drive := upcase( q_dr_str[1])
- ELSE nicht_angemeldet_alarm( upcase( q_dr_str[1]) );
-
- IF ( z_dr_str[1] <> z_drive) AND ( length(z_dr_str) > 0 )
- THEN IF upcase( z_dr_str[1]) IN angemeldet
- THEN z_drive := upcase( z_dr_str[1])
- ELSE nicht_angemeldet_alarm( upcase( z_dr_str[1]) );
-
- in_fil_pfad[1] := q_drive; { Laufwerke setzen }
- out_fil_pfad[1] := z_drive;
-
- IF wahl IN [ quell_btn, ziel_btn, ordner_btn]
- THEN redraw_hintergrund; { Fenster ausmalen für File-Selector-Box }
-
- IF ( wahl = start_btn ) AND NOT kopier_stop
- THEN IF in_fil_pfad = out_fil_pfad
- THEN BEGIN { Kein Backup, da Quelle und Ziel identisch }
- t := concat( '[3][Quell- und Zieldatei| |',
- 'sind identisch][ABBRUCH]');
- mist := do_alert( t, 1);
- END { Backup abgelehnt }
- ELSE BEGIN
- set_mouse( M_BEE);
- erfolg := backup( in_fil_pfad, out_fil_pfad); { kopieren }
- set_mouse( M_ARROW);
- END;
-
- IF wahl = quell_btn THEN suche_quelldatei;
- IF wahl = ziel_btn THEN suche_zieldatei;
- IF wahl = ordner_btn THEN neuer_ordner;
-
- IF wahl IN [ quell_btn, ziel_btn, ordner_btn]
- THEN redraw_hintergrund; { Fenster wieder ausmalen für Dialog }
-
- IF wahl <> cancel_btn
- THEN
- BEGIN { Laufwerke neu setzen }
- set_dedit ( dl, quell_drive, '_', 'a', q_drive,SYSTEM_FONT, TE_CENTER);
- set_dedit ( dl, ziel_drive, '_', 'a', z_drive,SYSTEM_FONT, TE_CENTER);
-
- IF length( in_fil_pfad) > 0 { neue Info - Texte festlegen }
- THEN set_dtext( dl, quell_name, in_fil_pfad, SYSTEM_FONT, TE_LEFT)
- ELSE set_dtext( dl, quell_name, frag_leer, SYSTEM_FONT, TE_LEFT);
-
- IF length( out_fil_pfad) > 0
- THEN set_dtext( dl, ziel_name, out_fil_pfad, SYSTEM_FONT, TE_LEFT)
- ELSE set_dtext( dl, ziel_name, frag_leer, SYSTEM_FONT, TE_LEFT);
- END; { Cancel_btn wurde nicht gewählt }
- { SELECTED - Status zurücknehmen }
- obj_setstate( dl, wahl, obj_state( dl, wahl) & ~ SELECTED , FALSE);
-
- EXIT IF ( wahl = cancel_btn ) OR erfolg;
- wahl := do_dialog( dl, quell_drive);
- END; { loop-Schleife }
-
- end_dialog( dl);
- close_window ( fenster ); { Hintergrundfenster wieder entfernen }
- delete_window ( fenster );
- END; { procedure action } { Zurück in event_loop }
-
-
- {///////////////////////////////////////////////////////////////////////////}
- {/// Schaut immer nur, ob das Programm endlich gebraucht wird //////////}
- {///////////////////////////////////////////////////////////////////////////}
-
- PROCEDURE event_loop;
- VAR event : INTEGER;
- msg : message_buffer;
- BEGIN
- REPEAT
- event := get_event( E_MESSAGE, 0, 0, 0, 0,
- FALSE, 0, 0, 0, 0, FALSE, 0, 0, 0, 0,
- msg, mist, mist, mist, mist, mist, mist);
- CASE msg[0] OF AC_OPEN : action;
- AC_CLOSE : BEGIN END;
- END; { case }
- UNTIL TRUE = FALSE; { Wartet bis zum Stromausfall auf Aufruf }
- END; { procedure event_loop }
-
- {///////////////////////////////////////////////////////////////////////////}
-
- BEGIN { Hauptprogramm }
- ap_id := init_gem;
- IF ap_id >= 0
- THEN
- BEGIN
- acc_name := MENU_EINTRAG;
- menu_id := menu_register( ap_id, acc_name);
- erlaubte_laufwerke;
- initialisiere;
- baue_dialog;
- center_dialog( dl);
- event_loop;
- { exit_gem; Wird nie gebraucht, da es sich ein Accessory handelt }
- END; { init_gem erfolgreich }
-
- END.
-
-