DVX_GUI/src/installer/setupCore.h
2026-10-14 17:37:03 -05:00

162 lines
7.5 KiB
C

// The MIT License (MIT)
//
// Copyright (C) 2026 Scott Duensing
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
// setupCore.h -- Setup's work without its window: the target folder,
// the list of installed files, removing DVX, DVX.INI and AUTOEXEC.BAT
// (host tested)
//
// SETUP.EXE unpacks the DVX package (pkgRead.h) into the target folder:
// the program, and of the fonts none, the base set, or all (the package's
// tiers, pkgFormat.h).
// The package holds the program only (the DVX folder layout: dvxPlat.h);
// everything written while DVX runs is in the user folder (USER, or the
// folder DVXUSER names), which the package never holds and an upgrade
// never touches, so the user's settings, groups, and files survive. On a
// folder that already holds DVX (its SETUP.LST) Setup asks whether to
// keep them or start them over (the user folder removed). Every file the
// package put there is listed in SETUP.LST in the folder; Uninstall
// removes those files (and the user folder when asked), then the folders
// left empty. A new install (or one whose settings start over) gets the
// user's DVX.INI: the shipped SYSTEM\DVX.INI with the display mode Setup
// ran in (known to work on this computer).
#ifndef SETUP_CORE_H
#define SETUP_CORE_H
#include "pkgFormat.h"
#include "dvxPlat.h"
#include <stdbool.h>
#include <stdint.h>
// The program AUTOEXEC.BAT starts, in the target folder
#define SETUP_EXE_NAME "DVX.EXE"
// AUTOEXEC.BAT in the root of the boot drive, and the copy of it Setup
// keeps before changing it (AUTOEXEC.DVX)
#define SETUP_AUTOEXEC_NAME "AUTOEXEC.BAT"
#define SETUP_AUTOEXEC_BAK ".DVX"
// The list of installed files, in the DVX folder (one relative name with
// '/' per line)
#define SETUP_LIST_NAME "SETUP.LST"
// What Setup installs of the fonts: the last of the package's tiers it
// unpacks (tier 0 the program, 1 the base set of fonts, 2 the others)
typedef enum {
SetupFontsNoneE,
SetupFontsBaseE,
SetupFontsAllE,
SetupFontsCountE
} SetupFontsE;
_Static_assert(SetupFontsCountE == PKG_TIERS, "a fonts choice per package tier");
// The fonts folder as SETUP.LST names it (an upgrade with fewer fonts
// removes the ones it leaves out: setupRemoveDropped)
#define SETUP_FONTS_FOLDER DVX_SHARED_DIR "/" DVX_FONTS_DIR "/"
// Room a file takes beyond its size on the target disk (half a 16 KB
// cluster, typical of a FAT16 hard disk), for the free space check
#define SETUP_FILE_SLACK 8192
// Longest message the functions below return
#define SETUP_ERR_MAX 320
// Add line (with a CR LF) to the end of the batch file at path, after
// copying it to its SETUP_AUTOEXEC_BAK sibling. A missing file is
// created (nothing to back up). The change is written to a scratch file
// and swapped in, so a failure leaves the file as it was. False with a
// reason in err.
bool setupAutoexecAdd(const char *path, const char *line, char *err, int32_t errSize);
// True when the batch file at path already has line (blanks around it and
// case ignored).
bool setupAutoexecHasLine(const char *path, const char *line);
// The AUTOEXEC.BAT line that starts DVX from destDir: destDir\DVX.EXE by
// destDir's short path (AUTOEXEC.BAT runs before a long-name driver; the
// loader changes to its own folder first). Setup starts DVX by it too.
// False when it does not fit.
bool setupAutoexecLine(const char *destDir, char *out, int32_t outSize);
// Path of AUTOEXEC.BAT on the boot drive ("C:\AUTOEXEC.BAT"). False when
// there is no boot drive (0).
bool setupAutoexecPath(char bootDrive, char *out, int32_t outSize);
// Take every copy of line out of the batch file at path (backed up and
// swapped in like setupAutoexecAdd). True when there was nothing to
// remove; false with a reason in err.
bool setupAutoexecRemove(const char *path, const char *line, char *err, int32_t errSize);
// Check a target folder: given, a full path, and neither the folder the
// package is read from nor inside it. False with a reason in err.
bool setupCheckDest(const char *srcDir, const char *destDir, char *err, int32_t errSize);
// What of the fonts the DVX in destDir has, judged from its SETUP.LST and
// info's tiers: none, at most the base set's files, or more. A folder
// without a list (a new install) gets all of them.
SetupFontsE setupFontsInstalled(const char *destDir, const PkgHeaderT *info);
// True when the DVX in destDir has the user's DVX.INI (platformUserDirOf).
bool setupHasSettings(const char *destDir);
// True when destDir already holds a DVX: its DVX.EXE (installed, copied
// there, or run from there) or SETUP.LST (an install partly removed).
bool setupIsInstalled(const char *destDir);
// Remove the user folder of the DVX in destDir (platformUserDirOf), its
// settings and files, when it holds a DVX.INI (a folder that does not is
// left alone, whatever DVXUSER names). False only when removing failed.
bool setupRemoveUser(const char *destDir);
// Write destDir's SETUP.LST: the names in files (relative, '/') plus
// those of the old list whose files are still there. False when it
// cannot be written.
bool setupListWrite(const char *destDir, char *const *files, int32_t count);
// Remove the files under folder (a name ending in '/', as SETUP.LST has
// it) that destDir's list has and files (the new install's) does not --
// what an upgrade with fewer fonts leaves out -- then those of its
// folders left empty. Call it before setupListWrite.
void setupRemoveDropped(const char *destDir, const char *folder, char *const *files, int32_t count);
// Remove what a cancelled new install wrote: the files, then the folders
// it made (newest first) when they are empty.
void setupRemoveWritten(char *const *written, int32_t writtenCount, char *const *dirs, int32_t dirCount);
// Bytes tiers 0 .. tier of the package need on the target disk.
uint64_t setupSpaceNeeded(const PkgHeaderT *info, SetupFontsE tier);
// Remove DVX from destDir: every file in SETUP.LST, the user folder when
// removeSettings (setupRemoveUser), the list itself, then every folder
// left empty, destDir too. Files the user added stay.
// False with a reason in err when the list is missing or a file could
// not be removed (the rest is still removed).
bool setupUninstall(const char *destDir, bool removeSettings, char *err, int32_t errSize);
// Store the display mode in the user's DVX.INI of the DVX in destDir,
// made from the shipped SYSTEM\DVX.INI when there is none yet. False
// when it cannot be saved.
bool setupWriteIni(const char *destDir, int32_t width, int32_t height, int32_t bpp);
#endif // SETUP_CORE_H