/* * Programm : DISKINFO * Modul : DI_UTILA * Edit : 07/01/90 * Copyright: D. Rabich, Dlmen * Funktion : Beispielprogramm Disk-Info Utility Ausgabe * Dieses Beispielprogramm demonstriert, wie Disk-Info * eigene Ausgaberoutinen hinzugefgt werden k”nnen. * Es bleibt dem Programmierer berlassen, auch noch * spezielle Sortierroutinen vorzuschalten. * Entwickelt mit Turbo C 1.1 von Heimsoeth und Borland. * Das Beispielprogramm darf nur nach vorheriger Absprache mit * dem Autor als Grundlage benutzt werden! */ /* Importe */ # include # include # include /* Messagetypen, die von Disk-Info und Disk-Info Utility Ausgabe benutzt */ /* werden */ # define CALL_FOUTPUT 0x4001 /* Aufruf von DI_UTILA */ # define F_BEGIN 0x4002 /* DI_UTILA beginnt mit der Arbeit */ # define F_END 0x4003 /* DI_UTILA ist fertig */ /* verschiedene Definitionen */ # define MAXSTRING 80 # define MAXDATA 10000L # define MAXSUCHSTR 5 /* Aufbau der Dateibeschreibungen */ typedef union { long size; /* Dateigr”že */ struct { int folders : 16, /* Anzahl Ordner */ files : 16; /* Anzahl Dateien */ } ff_spec; } LENGTH_NUMBER; typedef struct { char path[80], /* Pfad, unter dem die Datei gefunden wurde */ name[14]; /* Name der Datei */ LENGTH_NUMBER ln; /* Datei: Gr”že */ /* Ordner: Anzahl der Dateien und Ordner */ unsigned int time, /* Zeit */ date; /* Datum */ int is_folder; /* 0 = Datei, 1 = Ordner, 2 = Directoyeintrag */ unsigned char attribut; /* Attribut (speziell: 0xFF kennzeichnet */ /* Ordner oder Disknamen, mit dem gesucht wurde) */ } DATEIBESCHREIBUNG; typedef DATEIBESCHREIBUNG DATEIDATEN[MAXDATA]; /* Parameter von Disk-Info */ /* Die Parameter dienen nur der Information und drfen */ /* folglich nicht ver„ndert werden!!!!!!!!!!!!! */ typedef struct { struct { unsigned int versch : 1, /* verschachteln/ nicht verschachteln */ date_format : 2, /* Datumsformat */ sort_aufw : 1, /* aufsteigend/ absteigend sortieren */ sort_fold : 1, /* Ordner getrennt betrachten */ use_scrap : 1, /* Scrap-Ablage nutzen */ dr_einzel : 1, /* Einzelblatt */ dr_parallel : 1, /* parallele Schnittstelle nutzen */ change_eszet : 1, /* Eszet austauschen */ dat_ausg : 2, /* Dateien/Ordner/Ordner&Dateien */ out_form : 2, /* Ausgabeform */ druck_form : 3, /* Druckausgabeform */ dat_form : 3, /* Dateiausgabeform */ sort_form : 3, /* Sortierung */ auto_sort : 1, /* automatische Sortierung */ auto_rest : 1, /* automatische Hintergrundrestaurierung */ nach_eing : 2, /* Dialog nach der Eingabe */ nach_sort : 2, /* Dialog nach Sortierung */ nach_ausg : 2, /* Dialog nach Ausgabe */ dname_vorg : 1, /* Diskettennamen zwangsweise vorgeben */ datneu : 1, /* Dateien neu anlegen */ show_scrap : 1, /* Accessory-CLIPBRD aufrufen */ rect : 1, /* Rechtecke ausgeben */ show_path : 1, /* Pfad-Spalte wird angezeigt */ show_date : 1, /* Datums-Spalte wird angezeigt */ show_size : 1, /* Gr”žen-Spalte wird angezeigt */ show_hidden : 1; /* versteckte Dateien suchen */ } bits; int z_label, /* Zeilen fr Label */ z_tabelle, /* Zeilen pro Seite fr Tabelle */ z_d_label, /* bedruckbare Zeilen des Labels */ dr_init[16], /* Initialisierung der Tabellenausgabe */ dr_label[16], /* Initialisierung der Labelausgabe */ dr_reset[16], /* Druckerreset */ ext; /* ausgew„hlte Vorauswahlmaske */ char tab_form[4], /* Ausgabeform der Tabelle */ suchstr[MAXSUCHSTR][14], /* Suchstring der Eingabe (nur 3 benutzt!) */ readpath[MAXSTRING], /* Pfad zum Einlesen */ laufwerk, /* gew„hltes Laufwerk */ extensions[8][4], /* Wahlextensions zum Einlesen */ masken[25][14], /* Eintr„ge in die Masken-Listbox */ pfade[16][10][40], /* Eintr„ge in die Pfade-Listbox */ folder_char, /* Zeichen zur Kennzeichnung der Ordner */ dir_char; /* Zeichen zur Kennzeichnung des Directorys */ struct { unsigned int t_muster : 4, /* Farbe der Muster im Dialogtitel */ t_text : 4, /* Farbe des Texts im Dialogtitel */ f_dir : 4, /* Farbe des Verzeichnis im Fenster */ f_ordner : 4, /* Farbe der Ordner im Fenster */ f_datei : 4; /* Farbe der Dateien im Fenster */ } farben; struct { unsigned int titel : 3; /* Muster der Dialogtitel */ } muster; } PARAMETERBLOCK; /* Informationsblock von Disk-Info */ typedef struct { char version[4]; /* z. Z. di04 */ long datensaetze; /* Anzahl der Datens„tze im Speicher */ DATEIDATEN *dsets; /* Pointer auf Datens„tze */ PARAMETERBLOCK *parameter; /* Pointer auf Parameterblock */ char *fsel_path; /* Pfad fr File-Selector (ohne Wildcards) */ /* Nur dieser Pfad darf ver„ndert werden!! */ } DI_INFOBLOCK; /* Kommunikations-Nachricht */ typedef struct { unsigned int msg_type, /* Nachrichtentyp */ msg_id, /* ID des Versenders */ msg_over; /* šberl„nge ( = 0 ) */ DI_INFOBLOCK *msg_sadr; /* Pointer auf Disk-Info Informationsblock */ unsigned int msg_sp_id; /* Kennung ( z. Z. = 5000 ) */ long int msg_free; /* unbenutzt */ } DI_UTILA_MSG; /* globale Zeichenketten */ static char accname[] = " DI Utility A...", no_call[] = "[0][Disk-Info Utility Ausgabe|" "-------------------------|" "Aufruf nur ber Disk-Info|" "Version 3.x!|" "(c) by D. Rabich, Dlmen][ OK ]", bad_version[] = "[0][Es liegt leider keine|" "passende Disk-Info-Version|" "vor.][ OK ]", disk_error[] = "[0][Es ist ein Lese-|" "oder Schreibfehler|" "aufgetreten.][ OK ]"; /* Programm-ID */ static int prg_id; /* Prototypen */ static void write_to_disk(DI_INFOBLOCK *di_infos); static void work(int id, DI_INFOBLOCK *di_infos); /* Beispielroutine, schreibt Dateinamen in eine Datei */ static void write_to_disk(DI_INFOBLOCK *di_infos) { char l_path[MAXSTRING], lokal_name[14]; FILE *output; long j; int exbutton, err; register int i; strcpy(l_path,di_infos->fsel_path); /* File-Selector-Pfad nutzen */ strcat(l_path,"*.TXT"); wind_update(BEG_UPDATE); fsel_input(l_path, lokal_name, &exbutton); wind_update(END_UPDATE); if ((lokal_name[0] != 0) && exbutton ) /* Dateiname gefllt, OK? */ { for( i = (int) strlen(l_path); (i > 0) && (l_path[i] != '\\'); i-- ); l_path[i+1] = 0; strcpy(di_infos->fsel_path, l_path); strcat(l_path, lokal_name); /* Datei ”ffnen */ output = fopen (l_path, "w"); /* Alles OK? Dann Ausgabe... */ if (output != NULL) { graf_mouse(HOURGLASS, 0L); /* Namen schreiben */ for(j = 0, err = 0; (j < di_infos->datensaetze) && (err!=EOF); j++) err=fprintf(output, "%s\n", (*(di_infos->dsets))[j].name); graf_mouse(ARROW, 0L); /* Fehler beim Schreiben? */ if (err==EOF) form_alert(1, disk_error); /* Datei schliežen */ fclose(output); } else /* pauschal Diskfehler ausgeben */ form_alert(1, disk_error); } } /* Arbeitsroutine */ /* Funktion: Rckmeldung an Disk-Info, */ /* eigene Routine durchfhren, */ /* Rckmeldung, sobald Arbeit beendet */ static void work(int id, DI_INFOBLOCK *di_infos) { int diskinfo_id; DI_UTILA_MSG message; if (!memcmp(di_infos->version, "di05", 4)) { wind_update(BEG_UPDATE); /* damit niemand dazwischenfunkt */ diskinfo_id = id; /* sofort zurckmelden, sonst meldet Disk-Info Timeout! */ message.msg_type = F_BEGIN; /* Nachricht aufbauen */ message.msg_id = prg_id; message.msg_sadr = NULL; message.msg_sp_id = 0; message.msg_over = 0; appl_write(diskinfo_id, 16, &message); /* senden */ /* eigene Routine */ write_to_disk(di_infos); /* Fertigmeldung, sonst arbeitet Disk-Info nicht weiter! */ message.msg_type = F_END; /* Nachricht aufbauen */ appl_write(diskinfo_id, 16, &message); /* senden */ wind_update(END_UPDATE); } else /* Disk-Info-Version falsch, keine Kommunikation m”glich */ form_alert(1, bad_version); } /* Hauptprogramm */ /* Der Accessorybetrieb ist nicht zwingend erforderlich. */ /* Bei Programmbetrieb ist jedoch dafr zu sorgen, daž */ /* eine Menleiste erscheint, damit der Zugriff auf */ /* Disk-Info gew„hrleistet ist. */ void main(void) { DI_UTILA_MSG message; if ((prg_id = appl_init()) != -1) if (menu_register(prg_id, accname) >= 0) { for(;;) { evnt_mesag((int*) &message); if (message.msg_type == AC_OPEN) form_alert(1, no_call); if ((message.msg_type == CALL_FOUTPUT) && (message.msg_sp_id == 5000)) work(message.msg_id, message.msg_sadr); } } for(;;) /* Absturz verhindern */ evnt_timer(0, 1); } /* (c) 1989 by D. Rabich */