1 /*
2 unetbootin.h from UNetbootin <http://unetbootin.sourceforge.net>
3 Copyright (C) 2007-2008 Geza Kovacs <geza0kovacs@gmail.com>
4 
5 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.
6 
7 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License at <http://www.gnu.org/licenses/> for more details.
8 */
9 
10 #ifndef UNETBOOTIN_H
11 #define UNETBOOTIN_H
12 
13 #include <QtCore>
14 #include <QtGui>
15 #include <QtNetwork>
16 #include <time.h>
17 //#include <QtDebug>
18 
19 #include "ui_unetbootin.h"
20 
21 #ifdef Q_OS_WIN32
22 #define WIN32_LEAN_AND_MEAN
23 #define _WIN32_WINNT 0x0500
24 #include <windows.h>
25 #include <shellapi.h>
26 #endif
27 
28 #ifdef Q_OS_MACX
29 #include <sys/param.h>
30 #include <sys/mount.h>
31 #include <sys/statvfs.h>
32 #endif
33 
34 #ifdef  Q_OS_LINUX
35 #include <sys/vfs.h>
36 #endif
37 
38 #ifdef Q_OS_FREEBSD
39 #include <sys/mount.h>
40 #endif
41 
42 #ifdef AUTOSUPERGRUBDISK
43 #define UNETBOOTINB "Auto Super Grub Disk"
44 #define NOEXTERN
45 //#define NOISO
46 #define HDDINSTALL
47 #endif
48 
49 #ifdef EEEPCLOS
50 #define UNETBOOTINB "UNetbootin-EeePCLinuxOS"
51 #define NOMANUAL
52 #define NOFLOPPY
53 //#define USBINSTALL
54 #endif
55 
56 #ifdef EEEUBUNTU
57 #define UNETBOOTINB "UNetbootin-Ubuntu Eee"
58 #define NOMANUAL
59 #define NOFLOPPY
60 //#define USBINSTALL
61 #endif
62 
63 #ifdef ELIVE
64 #define UNETBOOTINB "Elive USB Installer"
65 #define NOMANUAL
66 #define NOFLOPPY
67 //#define USBINSTALL
68 #endif
69 
70 #ifdef GNEWSENSE
71 #define UNETBOOTINB "FUSBi"
72 #define NOMANUAL
73 #define NOFLOPPY
74 //#define USBINSTALL
75 #endif
76 
77 #ifdef KIWILINUX
78 #define UNETBOOTINB "Kiwi pe USB"
79 #define NOMANUAL
80 #define NOFLOPPY
81 //#define USBINSTALL
82 #endif
83 
84 #ifdef NIMBLEX
85 #define UNETBOOTINB "NimbleX Installer"
86 #define NOMANUAL
87 #define NOFLOPPY
88 //#define USBINSTALL
89 #endif
90 
91 #ifdef SLITAZ
92 #define UNETBOOTINB "SliTaz Installer"
93 #define NOMANUAL
94 #define NOFLOPPY
95 //#define USBINSTALL
96 #endif
97 
98 #ifdef XPUD
99 #define UNETBOOTINB "xPUD USB Installer"
100 #define NOMANUAL
101 #define NOFLOPPY
102 //#define USBINSTALL
103 #define NOEXTRACTKERNEL
104 #define NOEXTRACTINITRD
105 #define NODEFAULTBOOT
106 #define NODEFAULTKERNEL
107 #define NOINITRD
108 #endif
109 
110 #ifndef UNETBOOTINB
111 #define UNETBOOTINB "UNetbootin"
112 #define STDUNETBOOTIN
113 //#define USBINSTALL
114 #endif
115 
116 class customver : public QObject
117 {
118 	Q_OBJECT
119 };
120 
121 class uninstaller : public QObject
122 {
123 	Q_OBJECT
124 };
125 
126 class callexternappT : public QThread
127 {
128 public:
129 	QString execFile;
130 	QString execParm;
131 	QString retnValu;
132 	void run();
133 };
134 
135 class callexternappWriteToStdinT : public QThread
136 {
137 public:
138 	QString execFile;
139 	QString execParm;
140 	QString writeToStdin;
141 	QString retnValu;
142 	void run();
143 };
144 
145 class copyfileT : public QThread
146 {
147 	Q_OBJECT
148 
149 public:
150 	QString source;
151 	QString destination;
152 	void run();
153 
154 signals:
155 	void datacopied64(qint64 dlbytes, qint64 maxbytes);
156 	void finished();
157 };
158 
159 class randtmpfile : public QFile
160 {
161 public:
162 	randtmpfile(QString rfpath, QString rfextn);
163 	static QString getrandfilename(QString rfpath, QString rfextn);
164 };
165 /*
166 class nDirListStor : public QObject
167 {
168 	Q_OBJECT
169 
170 public:
171 	QStringList nDirFileListSL;
172 	int nMinFileSizeBytes;
173 	int nMaxFileSizeBytes;
174 	bool searchsymlinks;
175 
176 public slots:
177 	void sAppendSelfUrlInfoList(QUrlInfo curDirUrl);
178 };
179 */
180 class unetbootin : public QWidget, private Ui::unetbootinui
181 {
182 	Q_OBJECT
183 
184 public:
185 	unetbootin(QWidget *parent = 0);
186 	QString trcurrent;
187 	QString trdone;
188 	QString appNlang;
189 	QString appDir;
190 	QString appLoc;
191 	QString ubntmpf;
192 	QString nameDistro;
193 	QString nameVersion;
194     bool skipExtraction;
195 	bool isarch64;
196 	bool islivecd;
197 	bool isnetinstall;
198 	bool ishdmedia;
199 	bool overwriteall;
200 	bool searchsymlinks;
201 	bool ignoreoutofspace;
202 	bool dontgeneratesyslinuxcfg;
203 	bool downloadFailed;
204 	bool exitOnCompletion;
205 	bool testingDownload;
206 	bool issalt;
207     bool redundanttopleveldir;
208     QString redundantrootdirname;
209 	QString saltRootDir;
210 	int persistenceSpaceMB;
211 	QString extraBootOptions;
212 	QStringList locatedsyslinuxcfgfiles;
213 	QString targetDrive;
214 	QString targetPath;
215 	QString installType;
216 	QString targetDev;
217 	QString rawtargetDev;
218 	QString devluid;
219 	QString devlabel;
220 	QString devuuid;
221 	QString postinstmsg;
222 	QString kernelLine, kernelParam, kernelLoc, kernelOpts, initrdLine, initrdLoc, initrdOpts;
223 	QString slinitrdLine;
224 	QString sevzcommand;
225 	QPair<QPair<QStringList, QStringList>, QPair<QStringList, QStringList> > extraoptionsPL;
226 	QMap<QString, QString> grub2vars;
227     QFile *logFile;
228     QTextStream *logStream;
229     QStringList loggedLinesNotYetWritten;
230 	#ifdef Q_OS_UNIX
231 	QString fdiskcommand;
232 	QString sfdiskcommand;
233 	QString dfcommand;
234 	QString blkidcommand;
235 	QString volidcommand;
236 	QString syslinuxcommand;
237 	QString extlinuxcommand;
238 	QString mke2fscommand;
239 	QString mlabelcommand;
240 	QString e2labelcommand;
241 	bool isext2;
242 	#endif
243 #ifdef Q_OS_MAC
244 	QDir resourceDir;
245 #endif
246 	bool ubninitialize(QList<QPair<QString, QString> > oppairs);
247 	QString displayfisize(quint64 fisize);
248 	QPair<QPair<QStringList, QList<quint64> >, QStringList> listarchiveconts(QString archivefile);
249 	bool overwritefileprompt(QString ovwfileloc);
250 	bool ignoreoutofspaceprompt(QString destindir);
251 	bool extractfile(QString filepath, QString destinfileL, QString archivefile);
252 	bool checkifoutofspace(QString destindir);
253 	QString locatekernel(QString archivefile, QPair<QStringList, QList<quint64> > archivefileconts);
254 	bool extractkernel(QString archivefile, QString kernoutputfile, QPair<QStringList, QList<quint64> > archivefileconts);
255 	QString locateinitrd(QString archivefile, QPair<QStringList, QList<quint64> > archivefileconts);
256 	bool extractinitrd(QString archivefile, QString initoutputfile, QPair<QStringList, QList<quint64> > archivefileconts);
257 	QString extractcfg(QString archivefile, QStringList archivefileconts);
258 	QPair<QPair<QStringList, QStringList>, QPair<QStringList, QStringList> > extractcfgL(QString archivefile, QStringList archivefileconts);
259 	QString getfullarchivepath(QString relativefilepath, QStringList archivefile);
260 	QString filteroutlist(QString listofdata, QList<QRegExp> listofmatches);
261 	QString filteroutlist(QStringList listofdata, QList<QRegExp> listofmatches);
262 	QStringList filteroutlistL(QStringList listofdata, QList<QRegExp> listofmatches);
263 	void extractiso(QString isofile);
264 	void extractiso_krd10(QString isofile);
265 	void copyfilegui(QString src, QString dst);
266 	QStringList makepathtree(QString dirmkpathw, QStringList pathlist);
267 	QStringList extractallfiles(QString archivefile, QString dirxfilesto, QPair<QStringList, QList<quint64> > filesizelist, QStringList outputfilelist);
268 	QString getgrubcfgargs(QString cfgfile);
269 	QPair<QPair<QStringList, QStringList>, QPair<QStringList, QStringList> > getgrubcfgargsL(QString cfgfile);
270 	QString getFirstTextBlock(QString fulltext);
271 	void loadgrub2env(QString cfgfile);
272 	QString getgrub2cfgargs(QString cfgfile, QString archivefile, QStringList archivefileconts, QStringList visitedincludes);
273 	QPair<QPair<QStringList, QStringList>, QPair<QStringList, QStringList> > getgrub2cfgargsL(QString cfgfile, QString archivefile, QStringList archivefileconts, QStringList visitedincludes);
274 	QString getcfgkernargs(QString cfgfile, QString archivefile, QStringList archivefileconts, QStringList visitedincludes);
275 	QPair<QPair<QStringList, QStringList>, QPair<QStringList, QStringList> > getcfgkernargsL(QString cfgfile, QString archivefile, QStringList archivefileconts, QStringList visitedincludes);
276 	QString searchforincludesfile(QString includesfile, QString archivefile, QStringList archivefileconts, QStringList visitedincludes);
277 	QPair<QPair<QStringList, QStringList>, QPair<QStringList, QStringList> > searchforincludesfileL(QString includesfile, QString archivefile, QStringList archivefileconts, QStringList visitedincludes);
278 	QString searchforgrub2includesfile(QString includesfile, QString archivefile, QStringList archivefileconts, QStringList visitedincludes);
279 	QPair<QPair<QStringList, QStringList>, QPair<QStringList, QStringList> > searchforgrub2includesfileL(QString includesfile, QString archivefile, QStringList archivefileconts, QStringList visitedincludes);
280 	void downloadfile(QString fileurl, QString targetfile, qint64 minsize);
281 	QString downloadpagecontents(QUrl pageurl);
282 	QStringList lstFtpDirFiles(QString ldfDirStringUrl, qint64 ldfMinSize, qint64 ldfMaxSize);
283 	QStringList lstHttpDirFiles(QString ldfDirStringUrl);
284 	QStringList lstNetDirFiles(QString ldfDirStringUrl, qint64 ldfMinSize, qint64 ldfMaxSize);
285 	QPair<QString, int> weightedFilterNetDir(QString ldfDirStringUrl, qint64 ldfMinSize, qint64 ldfMaxSize, QList<QRegExp> ldfFileMatchExp);
286 	QString fileFilterNetDir(QStringList ldfDirStringUrlList, qint64 ldfMinSize, qint64 ldfMaxSize, QList<QRegExp> ldfFileMatchExp);
287 	QPair<QString, int> filterBestMatch(QStringList ufStringList, QList<QRegExp> filterExpList);
288 	static QString callexternapp(QString xexecFile, QString xexecParm);
289 	static QString callexternappWriteToStdin(QString xexecFile, QString xexecParm, QString xwriteToStdin);
290 	QString getdevluid(QString voldrive);
291 	QString getlabel(QString voldrive);
292 	QString getuuid(QString voldrive);
293 #ifdef Q_OS_MAC
294 	QString getlabel(QString voldrive, QString diskutilinfo);
295 	QString getuuid(QString voldrive, QString diskutilinfo);
296 	bool is_external_drive_macos(const QString &drivename);
297 #endif
298 	void refreshdriveslist();
299 	QStringList listcurdrives();
300 	QStringList matchinglist(QRegExp regex, QString text);
301 	QStringList listsanedrives();
302 	QStringList listalldrives();
303 	void replaceTextInFile(QString repfilepath, QRegExp replaceme, QString replacewith);
304 	QString fixkernelbootoptions(const QString &cfgfileCL);
305 	void setLabel(QString devname, QString newlabel);
306 	#ifdef Q_OS_UNIX
307 	QString locatecommand(QString commandtolocate, QString reqforinstallmode, QString packagename);
308 	QString locatedevicenode(QString mountpoint);
309 	QString locatemountpoint(QString devicenode);
310 	QString getGrubNotation(QString devicenode);
311 	QString getGrub2Notation(QString devicenode);
312 	int letterToNumber(QChar lettertoconvert);
313 	int getDiskNumber(QString devicenode);
314 	int getPartitionNumber(QString devicenode);
315 	#endif
316 	#ifdef Q_OS_WIN32
317 	void installsvzip();
318 	void configsysEdit();
319 	void bootiniEdit();
320 	void vistabcdEdit();
321 	#endif
322 	void instIndvfl(QString srcfName, QString dstfName);
323 	QString instTempfl(QString srcfName, QString dstfType);
324 	void runinst();
325 	void instDetType();
326 	#ifdef Q_OS_UNIX
327 	void writegrub2cfg();
328 	#endif
329 	void runinsthdd();
330 	void runinstusb();
331     void logText(const QString &text);
332     void finishLogging();
333     void writeTextToFile(const QString &text, const QString &filePath);
334 	void setuppersspace();
335 	void fininstall();
336 	void rmFile(const QString &fn);
337 	void rmFile(QFile &fn);
338 	void mvFile(const QString &fn, const QString &outfn);
339 	void mvFile(QFile &fn, QFile &outfn);
340 	void showDownloadFailedScreen(const QString &fileurl);
341 
342 private slots:
343 	void on_distroselect_currentIndexChanged(int distroselectIndex);
344 	void on_typeselect_currentIndexChanged(int);
345 	void on_dverselect_currentIndexChanged(int);
346 	void on_diskimagetypeselect_currentIndexChanged(int);
347 	void on_FloppyFileSelector_clicked();
348 	void on_KernelFileSelector_clicked();
349 	void on_InitrdFileSelector_clicked();
350 	void on_CfgFileSelector_clicked();
351 	void on_cancelbutton_clicked();
352 	void on_fexitbutton_clicked();
353 
354 public slots:
355 	void dlprogressupdate64(qint64 dlbytes, qint64 maxbytes);
356 	void cpprogressupdate64(qint64 dlbytes, qint64 maxbytes);
357 	void on_okbutton_clicked();
358 	void killApplication();
359 };
360 
361 #endif
362 
363