waffensachkunde

Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.

/ app src main dateizugriff.ts

3,1 KB Rohdatei
app/src/main/dateizugriff.ts — 86 Zeilen
1 /**
2 * Öffnen und Anzeigen von Dateien, die diese Anwendung selbst geschrieben hat.
3 *
4 * **Wozu.** Alle Druckausgaben und die Sicherung endeten bis 0.22.0 mit einem
5 * reinen Textsatz samt Pfad: „Der Lernbericht wurde gespeichert: …“. Wer die
6 * eben erzeugte Fragenliste drucken oder die Sicherung auf einen Stick ziehen
7 * wollte, musste den Pfad ablesen und im Explorer selbst hinnavigieren — nach
8 * „Speichern unter“ die unbequemste Fortsetzung, die ein Programm anbieten
9 * kann.
10 *
11 * **Warum eine Merkliste und keine Pfadprüfung.** Der Renderer schickt keinen
12 * Pfad, sondern eine Kennung: Wer einen Pfad mitbringen darf, darf auch einen
13 * anderen mitbringen — dieselbe Überlegung wie beim unterbrochenen
14 * Prüfungsbogen und beim Einspielweg der Sicherung. Der Hauptprozess merkt
15 * sich, was er in dieser Sitzung selbst geschrieben hat, und öffnet
16 * ausschließlich das. Eine Prüfung „liegt der Pfad unter Dokumente?“ wäre
17 * schwächer: Auch dort kann etwas liegen, das diese Anwendung nichts angeht.
18 *
19 * **Was hier nicht passiert.** `shell.openPath` überlässt dem Betriebssystem,
20 * womit eine Datei geöffnet wird. Das ist bei einem PDF gewollt und bei einer
21 * Datei unbekannter Herkunft eine Einladung — deshalb kommt in die Merkliste
22 * nur, was diese Anwendung soeben selbst erzeugt hat.
23 */
24
25 import { shell } from 'electron';
26
27 /**
28 * Was in dieser Sitzung geschrieben wurde, mit Kennung.
29 *
30 * Nur im Arbeitsspeicher: Nach einem Neustart ist die Liste leer, und ein
31 * alter Verweis führt dann nirgendwohin — richtig so, die Datei kann
32 * inzwischen verschoben oder gelöscht sein.
33 */
34 const geschrieben = new Map<string, string>();
35
36 let zaehler = 0;
37
38 /**
39 * Merkt einen geschriebenen Pfad und gibt die Kennung zurück, unter der der
40 * Renderer ihn öffnen lassen darf.
41 */
42 export function geschriebenMerken(pfad: string): string {
43 zaehler += 1;
44 const kennung = `datei-${String(zaehler)}`;
45 geschrieben.set(kennung, pfad);
46 return kennung;
47 }
48
49 /** Was zu tun ist. */
50 export type Dateiwunsch = 'oeffnen' | 'ordner';
51
52 /**
53 * Öffnet die Datei oder zeigt sie im Dateimanager.
54 *
55 * @returns `false`, wenn die Kennung unbekannt ist oder das System die Datei
56 * nicht öffnen konnte – etwa weil sie inzwischen verschoben wurde.
57 */
58 export async function dateiZeigen(kennungRoh: unknown, wunsch: Dateiwunsch): Promise<boolean> {
59 const kennung = typeof kennungRoh === 'string' ? kennungRoh : '';
60 const pfad = geschrieben.get(kennung);
61 if (pfad === undefined) {
62 return false;
63 }
64
65 if (wunsch === 'ordner') {
66 /* Zeigt den Ordner und markiert die Datei darin. Liefert nichts zurück –
67 ob es geklappt hat, ist von hier aus nicht feststellbar. */
68 shell.showItemInFolder(pfad);
69 return true;
70 }
71
72 /* `openPath` liefert eine leere Zeichenkette bei Erfolg und sonst die
73 Fehlermeldung des Systems. */
74 const fehler = await shell.openPath(pfad);
75 if (fehler !== '') {
76 console.warn(`[datei] konnte nicht geöffnet werden: ${fehler}`);
77 return false;
78 }
79 return true;
80 }
81
82 /** Gegenstück für Tests. */
83 export function geschriebeneVergessen(): void {
84 geschrieben.clear();
85 zaehler = 0;
86 }