summaryrefslogtreecommitdiff
path: root/ui/qt5/horizonwizard.hh
blob: d4a5dfd31d9ee078346868e631d412408ea731bd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/*
 * horizonwizard.hh - Definition of the main Wizard class
 * horizon-qt5, the Qt 5 user interface for
 * Project Horizon
 *
 * Copyright (c) 2019 Adélie Linux and contributors.  All rights reserved.
 * This code is licensed under the AGPL 3.0 license, as noted in the
 * LICENSE-code file in the root directory of this repository.
 *
 * SPDX-License-Identifier: AGPL-3.0-only
 */

#ifndef HORIZONWIZARD_HH
#define HORIZONWIZARD_HH

#include <diskman/disk.hh>
#include <QProcess>
#include <QShortcut>
#include <QWizard>
#include <map>
#include <string>
#include <vector>

inline QString fromMacAddress(char address[6]) {
    char buf[18];
    snprintf(buf, 18, "%02X:%02X:%02X:%02X:%02X:%02X",
             address[0] & 0xFF,
             address[1] & 0xFF,
             address[2] & 0xFF,
             address[3] & 0xFF,
             address[4] & 0xFF,
             address[5] & 0xFF);
    QString mac(buf);
    return mac;
}

class HorizonWizard : public QWizard {
public:
    enum {
        Page_Intro,             /* introduction */
        Page_Input,             /* keyboard layout */
#ifdef NON_LIBRE_FIRMWARE
        Page_Firmware,          /* firmware */
#endif  /* NON_LIBRE_FIRMWARE */
        Page_Partition,         /* partitioning */
        Page_PartitionDisk,     /* disk selection */
        Page_PartitionChoose,   /* erase, use free, manual, use existing */
        Page_PartitionManual,   /* manual */
        Page_PartitionMount,    /* choose mountpoints - manual and existing */
        Page_Network,           /* network type selection (DHCP/static) */
        Page_Network_Iface,     /* network interface selection */
        Page_Network_Wireless,  /* wireless */
        Page_Network_CustomAP,  /* custom AP */
        Page_Network_DHCP,      /* interstitial for DHCP */
        Page_Network_Portal,    /* shown if captive portal is detected */
        Page_Network_Manual,    /* static addressing */
        Page_DateTime,          /* date and time, TZ, NTP */
        Page_Hostname,          /* hostname */
        Page_PkgSimple,         /* simple package selection */
        Page_PkgCustom,         /* custom package selection */
        Page_PkgCustomDefault,  /* custom package defaults selection */
        Page_Boot,              /* boot loader configuration */
        Page_Root,              /* root passphrase */
        Page_Accounts,          /* user account configuration */
#ifndef HAS_INSTALL_ENV
        Page_Write,             /* write HorizonScript to disk */
#else  /* HAS_INSTALL_ENV */
        Page_Commit             /* begin install */
#endif  /* !HAS_INSTALL_ENV */
    };

    enum NetworkInterfaceType {
        Ethernet,
        Wireless,
        Bonded,
        Unknown
    };

    struct NetworkInterface {
        NetworkInterfaceType type;
        QString mac;
    };

    struct NetworkConfig {
        /*! Whether to use this configuration or not. */
        bool use;
        /*! The IP address. */
        QString address;
        /*! The subnet mask (v4) / prefix length (v6). */
        QString mask;
        /*! The default gateway to use. */
        QString gateway;
        /*! The DNS server to use. */
        QString dns;
    };

    enum Arch {
        aarch64,
        armv7,
	mips,
	mips64,
	mipsel,
	mips64el,
        pmmx,
        ppc,
        ppc64,
        x86_64,
        UnknownCPU
    };

    enum Subarch {
        NoSubarch,
        ppc64_PowerMac,
        ppc64_pSeries,
        ppc64_PowerNV
    };

    enum PackageType {
        Standard,
        Mobile,
        Compact,
        TextOnly,
        Custom
    };

    enum DesktopType {
        Plasma,
        LXQt,
        MATE,
        XFCE
    };

    enum BinShProvider {
        Dash,
        Bash
    };

    enum InitSystem {
        S6,
        SysVInit
    };

    explicit HorizonWizard(QWidget *parent = nullptr);
    void accept() override;
    void reject() override;
    /*! Emit a HorizonScript file with the user's choices. */
    QString toHScript();
    QShortcut *f1, *f3, *f6, *f8, *f10;

    /*! The domain to use for downloading packages.
     * @example distfiles.adelielinux.org
     */
    std::string mirror_domain;
    /*! The version of Adélie to install.  Typically "1.0". */
    std::string version;
    /*! The signing keys to use.  If empty, use defaults. */
    QStringList signing_keys;
    /*! The architecture being installed. */
    Arch arch;
    /*! If relevant, the subtype of the architecture being installed. */
    Subarch subarch;
#ifdef HAS_INSTALL_ENV
    /*! The disks present on this computer. */
    std::vector<Horizon::DiskMan::Disk> disks;
    /*! Any spawned tools from the intro page. */
    std::vector<QProcess *> tools;
#endif
    /*! Whether to automatically partition the disk. */
    bool auto_part;
    /*! Whether to erase the disk when automatically partitioning. */
    bool erase;
    /*! The disk to install to. */
    std::string chosen_disk;
    /*! The HorizonScript lines describing what to do about partitioning.
     *  If auto_disk is set, this is not used.
     *  Otherwise, this should have any relevant disklabel/partition/fs etc. */
    QStringList part_lines;
#ifdef NON_LIBRE_FIRMWARE
    /*! Determines whether firmware will be installed. */
    bool firmware;
#endif  /* NON_LIBRE_FIRMWARE */
    /*! The currently probed network interfaces
     * @note Only available in Installation Environment. */
    std::map<std::string, NetworkInterface> interfaces;
    /*! Determines the network interface to use. */
    std::string chosen_auto_iface;
    /*! Determines whether networking will be enabled. */
    bool network;
    /*! Determines whether to use DHCP. */
    bool net_dhcp;
    /*! If not DHCP, possibly contains IPv4 info. */
    NetworkConfig ipv4;
    /*! If not DHCP, possibly contains IPv6 info. */
    NetworkConfig ipv6;
    /*! Determines whether to install GRUB. */
    bool grub;
    /*! Determines whether to install eudev. */
    bool eudev;
    /*! Determines the /bin/sh provider. */
    BinShProvider binsh;
    /*! Determines the /sbin/init provider. */
    InitSystem sbininit;
    /*! Determines the packages to install. */
    PackageType pkgtype;
    /*! If pkgtype is Standard, which desktop environment to install. */
    DesktopType desktopType;
    /*! If pkgtype is Custom, a list of packages to install. */
    QStringList packages;
    /*! Determines the kernel to install. */
    std::string kernel;
};

#endif  /* !HORIZONWIZARD_HH */