aboutsummaryrefslogtreecommitdiffstats
path: root/heimdall-frontend
diff options
context:
space:
mode:
authorBenjamin Dobell <benjamin.dobell+github@glassechidna.com.au>2010-12-05 00:25:04 +1100
committerBenjamin Dobell <benjamin.dobell+github@glassechidna.com.au>2010-12-05 00:25:04 +1100
commit46f2c1134d276944fb74584a61d90cc363aee7eb (patch)
tree6fa14b7ef509a3fb84305dec013dd24bcae6c17d /heimdall-frontend
parent2949aca6a9fc8c4186376128f757227f40e3a515 (diff)
downloadexternal_heimdall-46f2c1134d276944fb74584a61d90cc363aee7eb.zip
external_heimdall-46f2c1134d276944fb74584a61d90cc363aee7eb.tar.gz
external_heimdall-46f2c1134d276944fb74584a61d90cc363aee7eb.tar.bz2
Removed the "Heimdall" folder and moved its contents to the root directory.
Diffstat (limited to 'heimdall-frontend')
-rw-r--r--heimdall-frontend/.DS_Storebin0 -> 12292 bytes
-rw-r--r--heimdall-frontend/._.DS_Storebin0 -> 4096 bytes
-rw-r--r--heimdall-frontend/._heimdall-frontend.pribin0 -> 4096 bytes
-rw-r--r--heimdall-frontend/._heimdall-frontend.probin0 -> 4096 bytes
-rw-r--r--heimdall-frontend/._heimdall-frontend.vcxprojbin0 -> 4096 bytes
-rw-r--r--heimdall-frontend/Qt4VSPropertySheet.props15
-rw-r--r--heimdall-frontend/Source/.DS_Storebin0 -> 6148 bytes
-rw-r--r--heimdall-frontend/Source/._.DS_Storebin0 -> 4096 bytes
-rw-r--r--heimdall-frontend/Source/._main.cppbin0 -> 4096 bytes
-rw-r--r--heimdall-frontend/Source/._mainwindow.cppbin0 -> 4096 bytes
-rw-r--r--heimdall-frontend/Source/._mainwindow.hbin0 -> 4096 bytes
-rw-r--r--heimdall-frontend/Source/aboutform.cpp29
-rw-r--r--heimdall-frontend/Source/aboutform.h35
-rw-r--r--heimdall-frontend/Source/main.cpp37
-rw-r--r--heimdall-frontend/Source/mainwindow.cpp742
-rw-r--r--heimdall-frontend/Source/mainwindow.h93
-rw-r--r--heimdall-frontend/aboutform.ui348
-rw-r--r--heimdall-frontend/description-pak1
-rw-r--r--heimdall-frontend/doc-pak/LICENSE19
-rw-r--r--heimdall-frontend/doc-pak/README119
-rw-r--r--heimdall-frontend/heimdall-frontend.pri12
-rw-r--r--heimdall-frontend/heimdall-frontend.pro45
-rw-r--r--heimdall-frontend/heimdall-frontend.vcxproj174
-rw-r--r--heimdall-frontend/heimdall-frontend.vcxproj.filters78
-rw-r--r--heimdall-frontend/mainwindow.qrc4
-rw-r--r--heimdall-frontend/mainwindow.ui872
26 files changed, 2623 insertions, 0 deletions
diff --git a/heimdall-frontend/.DS_Store b/heimdall-frontend/.DS_Store
new file mode 100644
index 0000000..b92c211
--- /dev/null
+++ b/heimdall-frontend/.DS_Store
Binary files differ
diff --git a/heimdall-frontend/._.DS_Store b/heimdall-frontend/._.DS_Store
new file mode 100644
index 0000000..338bd7b
--- /dev/null
+++ b/heimdall-frontend/._.DS_Store
Binary files differ
diff --git a/heimdall-frontend/._heimdall-frontend.pri b/heimdall-frontend/._heimdall-frontend.pri
new file mode 100644
index 0000000..5b4b4a0
--- /dev/null
+++ b/heimdall-frontend/._heimdall-frontend.pri
Binary files differ
diff --git a/heimdall-frontend/._heimdall-frontend.pro b/heimdall-frontend/._heimdall-frontend.pro
new file mode 100644
index 0000000..5b4b4a0
--- /dev/null
+++ b/heimdall-frontend/._heimdall-frontend.pro
Binary files differ
diff --git a/heimdall-frontend/._heimdall-frontend.vcxproj b/heimdall-frontend/._heimdall-frontend.vcxproj
new file mode 100644
index 0000000..a322a67
--- /dev/null
+++ b/heimdall-frontend/._heimdall-frontend.vcxproj
Binary files differ
diff --git a/heimdall-frontend/Qt4VSPropertySheet.props b/heimdall-frontend/Qt4VSPropertySheet.props
new file mode 100644
index 0000000..5f07ba6
--- /dev/null
+++ b/heimdall-frontend/Qt4VSPropertySheet.props
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ImportGroup Label="PropertySheets" />
+ <PropertyGroup Label="UserMacros">
+ <QTDIR>D:\development\cpp\libraries\Qt\2010.05\qt</QTDIR>
+ </PropertyGroup>
+ <PropertyGroup />
+ <ItemDefinitionGroup />
+ <ItemGroup>
+ <BuildMacro Include="QTDIR">
+ <Value>$(QTDIR)</Value>
+ <EnvironmentVariable>true</EnvironmentVariable>
+ </BuildMacro>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/heimdall-frontend/Source/.DS_Store b/heimdall-frontend/Source/.DS_Store
new file mode 100644
index 0000000..1b015c7
--- /dev/null
+++ b/heimdall-frontend/Source/.DS_Store
Binary files differ
diff --git a/heimdall-frontend/Source/._.DS_Store b/heimdall-frontend/Source/._.DS_Store
new file mode 100644
index 0000000..338bd7b
--- /dev/null
+++ b/heimdall-frontend/Source/._.DS_Store
Binary files differ
diff --git a/heimdall-frontend/Source/._main.cpp b/heimdall-frontend/Source/._main.cpp
new file mode 100644
index 0000000..a322a67
--- /dev/null
+++ b/heimdall-frontend/Source/._main.cpp
Binary files differ
diff --git a/heimdall-frontend/Source/._mainwindow.cpp b/heimdall-frontend/Source/._mainwindow.cpp
new file mode 100644
index 0000000..a322a67
--- /dev/null
+++ b/heimdall-frontend/Source/._mainwindow.cpp
Binary files differ
diff --git a/heimdall-frontend/Source/._mainwindow.h b/heimdall-frontend/Source/._mainwindow.h
new file mode 100644
index 0000000..a322a67
--- /dev/null
+++ b/heimdall-frontend/Source/._mainwindow.h
Binary files differ
diff --git a/heimdall-frontend/Source/aboutform.cpp b/heimdall-frontend/Source/aboutform.cpp
new file mode 100644
index 0000000..f043c20
--- /dev/null
+++ b/heimdall-frontend/Source/aboutform.cpp
@@ -0,0 +1,29 @@
+/* Copyright (c) 2010 Benjamin Dobell, Glass Echidna
+
+ 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.*/
+
+// Heimdall
+#include "aboutform.h"
+
+using namespace HeimdallFrontend;
+
+AboutForm::AboutForm(QWidget *parent) : QWidget(parent)
+{
+ setupUi(this);
+}
diff --git a/heimdall-frontend/Source/aboutform.h b/heimdall-frontend/Source/aboutform.h
new file mode 100644
index 0000000..2a44c95
--- /dev/null
+++ b/heimdall-frontend/Source/aboutform.h
@@ -0,0 +1,35 @@
+/* Copyright (c) 2010 Benjamin Dobell, Glass Echidna
+
+ 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.*/
+
+// Heimdall
+#include "ui_aboutform.h"
+
+// Qt
+#include <QWidget>
+
+namespace HeimdallFrontend
+{
+ class AboutForm : public QWidget, public Ui::AboutForm
+ {
+ public:
+
+ explicit AboutForm(QWidget *parent = 0);
+ };
+}
diff --git a/heimdall-frontend/Source/main.cpp b/heimdall-frontend/Source/main.cpp
new file mode 100644
index 0000000..8df987c
--- /dev/null
+++ b/heimdall-frontend/Source/main.cpp
@@ -0,0 +1,37 @@
+/* Copyright (c) 2010 Benjamin Dobell, Glass Echidna
+
+ 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.*/
+
+// Heimdall Frontend
+#include "mainwindow.h"
+
+// Qt
+#include <QtGui/QApplication>
+
+using namespace HeimdallFrontend;
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+
+ MainWindow w;
+ w.show();
+
+ return a.exec();
+}
diff --git a/heimdall-frontend/Source/mainwindow.cpp b/heimdall-frontend/Source/mainwindow.cpp
new file mode 100644
index 0000000..b5287e2
--- /dev/null
+++ b/heimdall-frontend/Source/mainwindow.cpp
@@ -0,0 +1,742 @@
+/* Copyright (c) 2010 Benjamin Dobell, Glass Echidna
+
+ 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.*/
+
+// Heimdall Frontend
+#include "mainwindow.h"
+
+// Qt
+#include <QCoreApplication>
+#include <QDesktopServices>
+#include <QDir>
+#include <QFileDialog>
+#include <QProcess>
+#include <QRegExp>
+#include <QUrl>
+
+using namespace HeimdallFrontend;
+
+bool MainWindow::IsArchive(QString path)
+{
+ // Not a real check but hopefully it gets the message across, don't flash archives!
+ return (path.endsWith(".tar", Qt::CaseInsensitive) || path.endsWith(".gz", Qt::CaseInsensitive) || path.endsWith(".zip", Qt::CaseInsensitive)
+ || path.endsWith(".bz2", Qt::CaseInsensitive) || path.endsWith(".7z", Qt::CaseInsensitive) || path.endsWith(".rar", Qt::CaseInsensitive));
+}
+
+QString MainWindow::PromptFileSelection(void)
+{
+ QString path = QFileDialog::getOpenFileName(this, "Select File", lastDirectory);
+
+ if (path != "")
+ lastDirectory = path.left(path.lastIndexOf('/') + 1);
+
+ return (path);
+}
+
+void MainWindow::UpdateStartButton(void)
+{
+ if (heimdallRunning)
+ {
+ startFlashButton->setEnabled(false);
+ return;
+ }
+
+ if (repartitionCheckBox->isChecked())
+ {
+ if (!IsArchive(pitLineEdit->text()) && factoryfsCheckBox->isChecked() && !IsArchive(factoryfsLineEdit->text()) && kernelCheckBox->isChecked()
+ && !IsArchive(kernelLineEdit->text()) && paramCheckBox->isChecked() && !IsArchive(paramLineEdit->text())
+ && primaryBootCheckBox->isChecked() && !IsArchive(primaryBootLineEdit->text()) && secondaryBootCheckBox->isChecked()
+ && !IsArchive(secondaryBootLineEdit->text()) && modemCheckBox->isChecked() && !IsArchive(modemLineEdit->text()))
+ {
+ startFlashButton->setEnabled(true);
+ }
+ else
+ {
+ startFlashButton->setEnabled(false);
+ }
+ }
+ else
+ {
+ bool atLeastOneFile = false;
+
+ if (factoryfsCheckBox->isChecked())
+ {
+ atLeastOneFile = true;
+
+ if (IsArchive(factoryfsLineEdit->text()))
+ {
+ startFlashButton->setEnabled(false);
+ return;
+ }
+ }
+
+ if (kernelCheckBox->isChecked())
+ {
+ atLeastOneFile = true;
+
+ if (IsArchive(kernelLineEdit->text()))
+ {
+ startFlashButton->setEnabled(false);
+ return;
+ }
+ }
+
+ if (paramCheckBox->isChecked())
+ {
+ atLeastOneFile = true;
+
+ if (IsArchive(paramLineEdit->text()))
+ {
+ startFlashButton->setEnabled(false);
+ return;
+ }
+ }
+
+ if (primaryBootCheckBox->isChecked())
+ {
+ atLeastOneFile = true;
+
+ if (IsArchive(primaryBootLineEdit->text()))
+ {
+ startFlashButton->setEnabled(false);
+ return;
+ }
+ }
+
+ if (secondaryBootCheckBox->isChecked())
+ {
+ atLeastOneFile = true;
+
+ if (IsArchive(secondaryBootLineEdit->text()))
+ {
+ startFlashButton->setEnabled(false);
+ return;
+ }
+ }
+
+ if (cacheCheckBox->isChecked())
+ {
+ atLeastOneFile = true;
+
+ if (IsArchive(cacheLineEdit->text()))
+ {
+ startFlashButton->setEnabled(false);
+ return;
+ }
+ }
+
+ if (databaseCheckBox->isChecked())
+ {
+ atLeastOneFile = true;
+
+ if (IsArchive(databaseLineEdit->text()))
+ {
+ startFlashButton->setEnabled(false);
+ return;
+ }
+ }
+
+ if (modemCheckBox->isChecked())
+ {
+ atLeastOneFile = true;
+
+ if (IsArchive(modemLineEdit->text()))
+ {
+ startFlashButton->setEnabled(false);
+ return;
+ }
+ }
+
+ if (recoveryCheckBox->isChecked())
+ {
+ atLeastOneFile = true;
+
+ if (IsArchive(recoveryLineEdit->text()))
+ {
+ startFlashButton->setEnabled(false);
+ return;
+ }
+ }
+
+ startFlashButton->setEnabled(atLeastOneFile);
+ }
+}
+
+MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
+{
+ setupUi(this);
+
+ heimdallRunning = false;
+
+ lastDirectory = QDir::toNativeSeparators(QApplication::applicationDirPath());
+
+ QObject::connect(actionDonate, SIGNAL(triggered()), this, SLOT(OpenDonationWebpage()));
+ QObject::connect(actionAboutHeimdall, SIGNAL(triggered()), this, SLOT(ShowAbout()));
+
+ QObject::connect(pitBrowseButton, SIGNAL(clicked()), this, SLOT(SelectPit()));
+ QObject::connect(factoryfsBrowseButton, SIGNAL(clicked()), this, SLOT(SelectFactoryfs()));
+ QObject::connect(kernelBrowseButton, SIGNAL(clicked()), this, SLOT(SelectKernel()));
+ QObject::connect(paramBrowseButton, SIGNAL(clicked()), this, SLOT(SelectParam()));
+ QObject::connect(primaryBootBrowseButton, SIGNAL(clicked()), this, SLOT(SelectPrimaryBootloader()));
+ QObject::connect(secondaryBootBrowseButton, SIGNAL(clicked()), this, SLOT(SelectSecondaryBootloader()));
+ QObject::connect(cacheBrowseButton, SIGNAL(clicked()), this, SLOT(SelectCache()));
+ QObject::connect(databaseBrowseButton, SIGNAL(clicked()), this, SLOT(SelectDatabase()));
+ QObject::connect(modemBrowseButton, SIGNAL(clicked()), this, SLOT(SelectModem()));
+ QObject::connect(recoveryBrowseButton, SIGNAL(clicked()), this, SLOT(SelectRecovery()));
+
+ QObject::connect(repartitionCheckBox, SIGNAL(stateChanged(int)), this, SLOT(SetRepartionEnabled(int)));
+ QObject::connect(factoryfsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(SetFactoryfsEnabled(int)));
+ QObject::connect(kernelCheckBox, SIGNAL(stateChanged(int)), this, SLOT(SetKernelEnabled(int)));
+ QObject::connect(paramCheckBox, SIGNAL(stateChanged(int)), this, SLOT(SetParamEnabled(int)));
+ QObject::connect(primaryBootCheckBox, SIGNAL(stateChanged(int)), this, SLOT(SetPrimaryBootloaderEnabled(int)));
+ QObject::connect(secondaryBootCheckBox, SIGNAL(stateChanged(int)), this, SLOT(SetSecondaryBootloaderEnabled(int)));
+ QObject::connect(cacheCheckBox, SIGNAL(stateChanged(int)), this, SLOT(SetCacheEnabled(int)));
+ QObject::connect(databaseCheckBox, SIGNAL(stateChanged(int)), this, SLOT(SetDatabaseEnabled(int)));
+ QObject::connect(modemCheckBox, SIGNAL(stateChanged(int)), this, SLOT(SetModemEnabled(int)));
+ QObject::connect(recoveryCheckBox, SIGNAL(stateChanged(int)), this, SLOT(SetRecoveryEnabled(int)));
+
+ QObject::connect(startFlashButton, SIGNAL(clicked()), this, SLOT(StartFlash()));
+
+ QObject::connect(&process, SIGNAL(readyRead()), this, SLOT(HandleHeimdallStdout()));
+ QObject::connect(&process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(HandleHeimdallReturned(int, QProcess::ExitStatus)));
+ QObject::connect(&process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(HandleHeimdallError(QProcess::ProcessError)));
+}
+
+MainWindow::~MainWindow()
+{
+}
+
+void MainWindow::OpenDonationWebpage(void)
+{
+ QDesktopServices::openUrl(QUrl("http://www.glassechidna.com.au/donate/", QUrl::StrictMode));
+}
+
+void MainWindow::ShowAbout(void)
+{
+ aboutForm.show();
+}
+
+void MainWindow::SelectPit(void)
+{
+ QString path = PromptFileSelection();
+ pitLineEdit->setText(path);
+
+ SetRepartionEnabled(path != "");
+}
+
+void MainWindow::SelectFactoryfs(void)
+{
+ QString path = PromptFileSelection();
+ factoryfsLineEdit->setText(path);
+
+ SetFactoryfsEnabled(path != "");
+}
+
+void MainWindow::SelectKernel(void)
+{
+ QString path = PromptFileSelection();
+ kernelLineEdit->setText(path);
+
+ SetKernelEnabled(path != "");
+}
+
+void MainWindow::SelectParam(void)
+{
+ QString path = PromptFileSelection();
+ paramLineEdit->setText(path);
+
+ SetParamEnabled(path != "");
+}
+
+void MainWindow::SelectPrimaryBootloader(void)
+{
+ QString path = PromptFileSelection();
+ primaryBootLineEdit->setText(path);
+
+ SetPrimaryBootloaderEnabled(path != "");
+}
+
+void MainWindow::SelectSecondaryBootloader(void)
+{
+ QString path = PromptFileSelection();
+ secondaryBootLineEdit->setText(path);
+
+ SetSecondaryBootloaderEnabled(path != "");
+}
+
+void MainWindow::SelectCache(void)
+{
+ QString path = PromptFileSelection();
+ cacheLineEdit->setText(path);
+
+ SetCacheEnabled(path != "");
+}
+
+void MainWindow::SelectDatabase(void)
+{
+ QString path = PromptFileSelection();
+ databaseLineEdit->setText(path);
+
+ SetDatabaseEnabled(path != "");
+}
+
+void MainWindow::SelectModem(void)
+{
+ QString path = PromptFileSelection();
+ modemLineEdit->setText(path);
+
+ SetModemEnabled(path != "");
+}
+
+void MainWindow::SelectRecovery(void)
+{
+ QString path = PromptFileSelection();
+ recoveryLineEdit->setText(path);
+
+ SetRecoveryEnabled(path != "");
+}
+
+void MainWindow::SetRepartionEnabled(int enabled)
+{
+ if (repartitionCheckBox->isChecked() != (enabled != 0))
+ repartitionCheckBox->setChecked(enabled);
+
+ if (enabled)
+ {
+ repartitionCheckBox->setEnabled(true);
+ pitLineEdit->setEnabled(true);
+ repartitionCheckBox->setChecked(true);
+ }
+ else
+ {
+ repartitionCheckBox->setEnabled(pitLineEdit->text() != "");
+ pitLineEdit->setEnabled(false);
+ }
+
+ UpdateStartButton();
+}
+
+void MainWindow::SetFactoryfsEnabled(int enabled)
+{
+ if (factoryfsCheckBox->isChecked() != (enabled != 0))
+ factoryfsCheckBox->setChecked(enabled);
+
+ if (enabled)
+ {
+ factoryfsCheckBox->setEnabled(true);
+ factoryfsLineEdit->setEnabled(true);
+ factoryfsCheckBox->setChecked(true);
+ }
+ else
+ {
+ factoryfsCheckBox->setEnabled(factoryfsLineEdit->text() != "");
+ factoryfsLineEdit->setEnabled(false);
+ }
+
+ UpdateStartButton();
+}
+
+void MainWindow::SetKernelEnabled(int enabled)
+{
+ if (kernelCheckBox->isChecked() != (enabled != 0))
+ kernelCheckBox->setChecked(enabled);
+
+ if (enabled)
+ {
+ kernelCheckBox->setEnabled(true);
+ kernelLineEdit->setEnabled(true);
+ kernelCheckBox->setChecked(true);
+ }
+ else
+ {
+ kernelCheckBox->setEnabled(kernelLineEdit->text() != "");
+ kernelLineEdit->setEnabled(false);
+ }
+
+ UpdateStartButton();
+}
+
+void MainWindow::SetParamEnabled(int enabled)
+{
+ if (paramCheckBox->isChecked() != (enabled != 0))
+ paramCheckBox->setChecked(enabled);
+
+ if (enabled)
+ {
+ paramCheckBox->setEnabled(true);
+ paramLineEdit->setEnabled(true);
+ paramCheckBox->setChecked(true);
+ }
+ else
+ {
+ paramCheckBox->setEnabled(paramLineEdit->text() != "");
+ paramLineEdit->setEnabled(false);
+ }
+
+ UpdateStartButton();
+}
+
+void MainWindow::SetPrimaryBootloaderEnabled(int enabled)
+{
+ if (primaryBootCheckBox->isChecked() != (enabled != 0))
+ primaryBootCheckBox->setChecked(enabled);
+
+ if (enabled)
+ {
+ primaryBootCheckBox->setEnabled(true);
+ primaryBootLineEdit->setEnabled(true);
+ primaryBootCheckBox->setChecked(true);
+ }
+ else
+ {
+ primaryBootCheckBox->setEnabled(primaryBootLineEdit->text() != "");
+ primaryBootLineEdit->setEnabled(false);
+ }
+
+ UpdateStartButton();
+}
+
+void MainWindow::SetSecondaryBootloaderEnabled(int enabled)
+{
+ if (secondaryBootCheckBox->isChecked() != (enabled != 0))
+ secondaryBootCheckBox->setChecked(enabled);
+
+ if (enabled)
+ {
+ secondaryBootCheckBox->setEnabled(true);
+ secondaryBootLineEdit->setEnabled(true);
+ secondaryBootCheckBox->setChecked(true);
+ }
+ else
+ {
+ secondaryBootCheckBox->setEnabled(secondaryBootLineEdit->text() != "");
+ secondaryBootLineEdit->setEnabled(false);
+ }
+
+ UpdateStartButton();
+}
+
+void MainWindow::SetCacheEnabled(int enabled)
+{
+ if (cacheCheckBox->isChecked() != (enabled != 0))
+ cacheCheckBox->setChecked(enabled);
+
+ if (enabled)
+ {
+ cacheCheckBox->setEnabled(true);
+ cacheLineEdit->setEnabled(true);
+ cacheCheckBox->setChecked(true);
+ }
+ else
+ {
+ cacheCheckBox->setEnabled(cacheLineEdit->text() != "");
+ cacheLineEdit->setEnabled(false);
+ }
+
+ UpdateStartButton();
+}
+
+void MainWindow::SetDatabaseEnabled(int enabled)
+{
+ if (databaseCheckBox->isChecked() != (enabled != 0))
+ databaseCheckBox->setChecked(enabled);
+
+ if (enabled)
+ {
+ databaseCheckBox->setEnabled(true);
+ databaseLineEdit->setEnabled(true);
+ databaseCheckBox->setChecked(true);
+ }
+ else
+ {
+ databaseCheckBox->setEnabled(databaseLineEdit->text() != "");
+ databaseLineEdit->setEnabled(false);
+ }
+
+ UpdateStartButton();
+}
+
+void MainWindow::SetModemEnabled(int enabled)
+{
+ if (modemCheckBox->isChecked() != (enabled != 0))
+ modemCheckBox->setChecked(enabled);
+
+ if (enabled)
+ {
+ modemCheckBox->setEnabled(true);
+ modemLineEdit->setEnabled(true);
+ modemCheckBox->setChecked(true);
+ }
+ else
+ {
+ modemCheckBox->setEnabled(databaseLineEdit->text() != "");
+ modemLineEdit->setEnabled(false);
+ }
+
+ UpdateStartButton();
+}
+
+void MainWindow::SetRecoveryEnabled(int enabled)
+{
+ if (recoveryCheckBox->isChecked() != (enabled != 0))
+ recoveryCheckBox->setChecked(enabled);
+
+ if (enabled)
+ {
+ recoveryCheckBox->setEnabled(true);
+ recoveryLineEdit->setEnabled(true);
+ recoveryCheckBox->setChecked(true);
+ }
+ else
+ {
+ recoveryCheckBox->setEnabled(databaseLineEdit->text() != "");
+ recoveryLineEdit->setEnabled(false);
+ }
+
+ UpdateStartButton();
+}
+
+void MainWindow::StartFlash(void)
+{
+ heimdallRunning = true;
+ heimdallFailed = false;
+
+ QStringList arguments;
+ arguments.append("flash");
+
+ if (repartitionCheckBox->isChecked())
+ {
+ arguments.append("--pit");
+ arguments.append(pitLineEdit->text());
+ }
+
+ if (factoryfsCheckBox->isChecked())
+ {
+ arguments.append("--factoryfs");
+ arguments.append(factoryfsLineEdit->text());
+ }
+
+ if (kernelCheckBox->isChecked())
+ {
+ arguments.append("--kernel");
+ arguments.append(kernelLineEdit->text());
+ }
+
+ if (paramCheckBox->isChecked())
+ {
+ arguments.append("--param");
+ arguments.append(paramLineEdit->text());
+ }
+
+ if (primaryBootCheckBox->isChecked())
+ {
+ arguments.append("--primary-boot");
+ arguments.append(primaryBootLineEdit->text());
+ }
+
+ if (secondaryBootCheckBox->isChecked())
+ {
+ arguments.append("--secondary-boot");
+ arguments.append(secondaryBootLineEdit->text());
+ }
+
+ if (cacheCheckBox->isChecked())
+ {
+ arguments.append("--cache");
+ arguments.append(cacheLineEdit->text());
+ }
+
+ if (databaseCheckBox->isChecked())
+ {
+ arguments.append("--dbdata");
+ arguments.append(databaseLineEdit->text());
+ }
+
+ if (modemCheckBox->isChecked())
+ {
+ arguments.append("--modem");
+ arguments.append(modemLineEdit->text());
+ }
+
+ if (recoveryCheckBox->isChecked())
+ {
+ arguments.append("--recovery");
+ arguments.append(recoveryLineEdit->text());
+ }
+
+ if (repartitionCheckBox->isChecked())
+ {
+ arguments.append("--repartition");
+ }
+
+ flashProgressBar->setEnabled(true);
+ UpdateStartButton();
+
+ int pathIndex = -1;
+ process.setReadChannel(QProcess::StandardOutput);
+
+ process.start("heimdall", arguments);
+ process.waitForStarted(1000);
+
+ // OS X was playing up and not finding heimdall, so we're manually checking the PATH.
+ if (heimdallFailed)
+ {
+ QStringList environment = QProcess::systemEnvironment();
+
+ QStringList paths;
+ // Ensure /usr/local/bin is in PATH
+ for (int i = 0; i < environment.length(); i++)
+ {
+ if (environment[i].left(5) == "PATH=")
+ {
+ paths = environment[i].mid(5).split(':');
+ paths.prepend("/usr/local/bin");
+ break;
+ }
+ }
+
+ while (heimdallFailed && ++pathIndex < paths.length())
+ {
+ QString heimdallPath = paths[pathIndex];
+
+ if (heimdallPath.length() > 0)
+ {
+ heimdallFailed = false;
+
+ if (heimdallPath[heimdallPath.length() - 1] != QDir::separator())
+ heimdallPath += QDir::separator();
+
+ heimdallPath += "heimdall";
+
+ process.start(heimdallPath, arguments);
+ process.waitForStarted(1000);
+ }
+ }
+
+ if (heimdallFailed)
+ {
+ flashLabel->setText("Failed to start Heimdall!");
+
+ heimdallRunning = false;
+ flashProgressBar->setEnabled(false);
+ UpdateStartButton();
+ }
+ }
+}
+
+void MainWindow::HandleHeimdallStdout(void)
+{
+ QString output = process.read(1024);
+
+ // We often receive multiple lots of output from Heimdall at one time. So we use regular expressions
+ // to ensure we don't miss out on any important information.
+ QRegExp uploadingExp("Uploading [^\n]+\n");
+ if (output.lastIndexOf(uploadingExp) > -1)
+ flashLabel->setText(uploadingExp.cap().left(uploadingExp.cap().length() - 1));
+
+ QRegExp percentExp("[\b\n][0-9]+%");
+ if (output.lastIndexOf(percentExp) > -1)
+ {
+ QString percentString = percentExp.cap();
+ flashProgressBar->setValue(percentString.mid(1, percentString.length() - 2).toInt());
+ }
+
+ /*// Handle other information
+
+ int endOfLastLine = output.length() - 1;
+ for (; endOfLastLine > -1; endOfLastLine--)
+ {
+ if (output[endOfLastLine] != '\n')
+ break;
+ }
+
+ if (endOfLastLine < 0)
+ return; // Output was blank or just a bunch of new line characters.
+
+ int startOfLastLine = endOfLastLine - 1;
+ for (; startOfLastLine > -1; startOfLastLine--)
+ {
+ if (output[startOfLastLine] == '\n')
+ break;
+ }
+
+ startOfLastLine++;
+
+ // Just look at the last line of the output
+ output = output.mid(startOfLastLine, endOfLastLine - startOfLastLine + 1); // Work with the last line only
+
+ percentExp.setPattern("[0-9]+%");
+
+ // If the last line wasn't a uploading message or a percentage transferred then display it.
+ if (output.lastIndexOf(uploadingExp) < 0 && output.lastIndexOf(percentExp) < 0)
+ flashLabel->setText(output);*/
+}
+
+void MainWindow::HandleHeimdallReturned(int exitCode, QProcess::ExitStatus exitStatus)
+{
+ // This is a work-around for strange issues as a result of a exitCode being cast to
+ // a unsigned char.
+ char byteExitCode = exitCode;
+
+ heimdallRunning = false;
+ flashProgressBar->setEnabled(false);
+ UpdateStartButton();
+
+ if (exitStatus == QProcess::NormalExit && byteExitCode >= 0)
+ {
+ flashLabel->setText("Flash completed sucessfully!");
+ }
+ else
+ {
+ QString error = process.readAllStandardError();
+
+ int firstNewLineChar = error.indexOf('\n');
+
+ if (firstNewLineChar == 0)
+ error = error.mid(1);
+ else
+ error = error.left(firstNewLineChar);
+
+ flashLabel->setText(error);
+ }
+}
+
+void MainWindow::HandleHeimdallError(QProcess::ProcessError error)
+{
+ if (error == QProcess::FailedToStart || error == QProcess::Timedout)
+ {
+ heimdallFailed = true;
+ }
+ else if (error == QProcess::Crashed)
+ {
+ flashLabel->setText("Heimdall crashed!");
+
+ heimdallRunning = false;
+ flashProgressBar->setEnabled(false);
+ UpdateStartButton();
+ }
+ else
+ {
+ flashLabel->setText("Heimdall reported an unknown error!");
+
+ heimdallRunning = false;
+ flashProgressBar->setEnabled(false);
+ UpdateStartButton();
+ }
+}
diff --git a/heimdall-frontend/Source/mainwindow.h b/heimdall-frontend/Source/mainwindow.h
new file mode 100644
index 0000000..added4e
--- /dev/null
+++ b/heimdall-frontend/Source/mainwindow.h
@@ -0,0 +1,93 @@
+/* Copyright (c) 2010 Benjamin Dobell, Glass Echidna
+
+ 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.*/
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+// Heimdall Frontend
+#include "aboutform.h"
+#include "ui_mainwindow.h"
+
+// Qt
+#include <QMainWindow>
+#include <QProcess>
+
+namespace HeimdallFrontend
+{
+ class MainWindow : public QMainWindow, public Ui::MainWindow
+ {
+ Q_OBJECT
+
+ private:
+
+ AboutForm aboutForm;
+
+ QString lastDirectory;
+
+ bool heimdallFailed;
+ bool heimdallRunning;
+ QProcess process;
+
+ bool IsArchive(QString path);
+
+ QString PromptFileSelection(void);
+ void UpdateStartButton(void);
+
+ public:
+
+ explicit MainWindow(QWidget *parent = 0);
+ ~MainWindow();
+
+ public slots:
+
+ void OpenDonationWebpage(void);
+ void ShowAbout(void);
+
+ void SelectPit(void);
+ void SelectFactoryfs(void);
+ void SelectKernel(void);
+ void SelectParam(void);
+ void SelectPrimaryBootloader(void);
+ void SelectSecondaryBootloader(void);
+ void SelectCache(void);
+ void SelectDatabase(void);
+ void SelectModem(void);
+ void SelectRecovery(void);
+
+ void SetRepartionEnabled(int enabled);
+ void SetFactoryfsEnabled(int enabled);
+ void SetKernelEnabled(int enabled);
+ void SetParamEnabled(int enabled);
+ void SetPrimaryBootloaderEnabled(int enabled);
+ void SetSecondaryBootloaderEnabled(int enabled);
+ void SetCacheEnabled(int enabled);
+ void SetDatabaseEnabled(int enabled);
+ void SetModemEnabled(int enabled);
+ void SetRecoveryEnabled(int enabled);
+
+ void StartFlash(void);
+
+ void HandleHeimdallStdout(void);
+ void HandleHeimdallReturned(int exitCode, QProcess::ExitStatus exitStatus);
+ void HandleHeimdallError(QProcess::ProcessError error);
+ };
+}
+
+#endif // MAINWINDOW_H
diff --git a/heimdall-frontend/aboutform.ui b/heimdall-frontend/aboutform.ui
new file mode 100644
index 0000000..80b7181
--- /dev/null
+++ b/heimdall-frontend/aboutform.ui
@@ -0,0 +1,348 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AboutForm</class>
+ <widget class="QWidget" name="AboutForm">
+ <property name="windowModality">
+ <enum>Qt::ApplicationModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>622</width>
+ <height>561</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>561</width>
+ <height>551</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>700</width>
+ <height>600</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string>About Heimdall Frontend 1.1</string>
+ </property>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>601</width>
+ <height>541</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string/>
+ </property>
+ <widget class="QLabel" name="label">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>190</y>
+ <width>581</width>
+ <height>241</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>9</pointsize>
+ </font>
+ </property>
+ <property name="autoFillBackground">
+ <bool>false</bool>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="text">
+ <string>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the &quot;Software&quot;), 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 &quot;AS IS&quot;, 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.</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="indent">
+ <number>2</number>
+ </property>
+ <property name="openExternalLinks">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_2">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>440</y>
+ <width>581</width>
+ <height>41</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="text">
+ <string>If you appreciate this software and you would like to support future development please consider donating:</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="openExternalLinks">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="okPushButton">
+ <property name="geometry">
+ <rect>
+ <x>260</x>
+ <y>510</y>
+ <width>75</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_3">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>581</width>
+ <height>101</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>9</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Heimdall Frontend
+Version 1.1.0
+Copyright © 2010 Benjamin Dobell, Glass Echidna
+
+Heimdall
+Version 1.1.0
+Copyright © 2010 Benjamin Dobell, Glass Echidna</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="openExternalLinks">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_4">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>118</y>
+ <width>581</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Heimdall Homepage:</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_5">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>130</y>
+ <width>581</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://www.glassechidna.com.au/products/heimdall/&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;http://www.glassechidna.com.au/products/heimdall/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_6">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>150</y>
+ <width>581</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Glass Echidna Homepage:</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_7">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>162</y>
+ <width>581</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://www.glassechidna.com.au/&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;http://www.glassechidna.com.au/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_8">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>480</y>
+ <width>581</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://www.glassechidna.com.au/donate/&quot;&gt;&lt;span style=&quot; font-family:'MS Shell Dlg 2'; font-size:10pt; text-decoration: underline; color:#0000ff;&quot;&gt;http://www.glassechidna.com.au/donate/&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::RichText</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>okPushButton</sender>
+ <signal>clicked()</signal>
+ <receiver>AboutForm</receiver>
+ <slot>close()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>247</x>
+ <y>520</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>245</x>
+ <y>275</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/heimdall-frontend/description-pak b/heimdall-frontend/description-pak
new file mode 100644
index 0000000..7f45876
--- /dev/null
+++ b/heimdall-frontend/description-pak
@@ -0,0 +1 @@
+Heimdall Frontend is the official graphical user interface for the Heimdall tool suite.
diff --git a/heimdall-frontend/doc-pak/LICENSE b/heimdall-frontend/doc-pak/LICENSE
new file mode 100644
index 0000000..a18336e
--- /dev/null
+++ b/heimdall-frontend/doc-pak/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2010 Benjamin Dobell, Glass Echidna
+
+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. \ No newline at end of file
diff --git a/heimdall-frontend/doc-pak/README b/heimdall-frontend/doc-pak/README
new file mode 100644
index 0000000..2c7952f
--- /dev/null
+++ b/heimdall-frontend/doc-pak/README
@@ -0,0 +1,119 @@
+Heimdall (c) 2010 Benjamin Dobell, Glass Echidna
+http://www.glassechidna.com.au/products/heimdall/
+
+DISCLAIMER:
+
+ This software attempts to flash your Galaxy S device. The very nature of
+ flashing is dangerous. As with all flashing software, Heimdall has the
+ potential to damage (brick) your phone if not used carefully. If you're
+ concerned, don't use this software. Flashing ROMs onto your phone may also
+ void your warranty. I am not responsible for the result of your actions.
+
+
+
+These instructions are for Linux operating systems.
+
+Installing Heimdall from Source:
+
+ 1. First make sure you have installed build-tools and pkgconfig.
+
+ 2. Open a terminal and navigate to the directory you extracted Heimdall to.
+
+ 3. Then enter the following commands to compile and install libusb-1.0:
+
+ cd libusb-1.0
+ ./configure
+ make
+ sudo make install
+ cd ..
+
+ If you have problems please consult http://www.libusb.org/
+
+ 4. Enter the following commands to compile and install Heimdall:
+
+ cd heimdall
+ ./configure
+ make
+ sudo make install
+ cd ..
+
+ NOTE: You can use "checkinstall" instead of "make install" in order
+ to generate a redistributable package.
+
+ 5. Done
+
+
+
+Installing Heimdall Frontend from Source (Optional):
+
+ 1. First make sure you have installed Qt 4.6 or above,
+ available from http://qt.nokia.com/.
+
+ 2. Open a terminal and navigate to the directory you extracted Heimdall to.
+
+ 3. Enter the following commands to compile and install Heimdall Frontend:
+
+ cd heimdall-frontend
+ qmake heimdall-frontend.pro
+ make
+
+ NOTE: You can use "checkinstall" instead of "make" in order to generate
+ a redistributable package.
+
+ 4. The file output will be placed in the UNIX sub-directory. Move this file
+ to your preferred location.
+
+ 5. Done
+
+
+
+Flashing Firmware with Heimdall Frontend:
+
+ 1. Fully charge your device (use the wall charger as it's faster).
+
+ 2. Download a decrypted Samsung Galaxy S ROM and extract it to a directory.
+
+ 3. If the ROM is provided as one of more archives (nested or otherwise),
+ extract them all to the same location.
+
+ NOTE: If you want to use the CSC then extract it last.
+
+ 3. Open Heimdall Frontend.
+
+ 4. Put your Galaxy S device into download mode.
+
+ 5. For each file you wish to flash use "Browse" to select the file.
+
+ 6. Press "Start".
+
+ 7. Heimdall Frontend will display the progress and inform you when the
+ flash is complete.
+
+
+
+Flashing Firmware from Command Line / Terminal:
+
+ 1. Fully charge your device (use the wall charger as it's faster).
+
+ 2. Download a decrypted Samsung Galaxy S ROM and extract it to a directory.
+
+ 3. If the ROM is provided as one of more archives (nested or otherwise),
+ extract them all to the same location.
+
+ NOTE: If you want to use the CSC then extract it last.
+
+ 4. Open a terminal and navigate to the directory where you extracted the
+ ROM files.
+
+ 5. Type the following to list all the functionality Heimdall supports:
+
+ heimdall help
+
+ 8. Use the instructions to manually enter a command with all the files you
+ want to flash.
+
+ Here is an example that does a full flash and repartition:
+
+ heimdall flash --repartition --pit s1_odin_20100512.pit --factoryfs factoryfs.rfs --cache cache.rfs --dbdata dbdata.rfs --primary-boot boot.bin --secondary-boot Sbl.bin --param param.lfs --kernel zImage --modem modem.bin
+
+ 9. Done
diff --git a/heimdall-frontend/heimdall-frontend.pri b/heimdall-frontend/heimdall-frontend.pri
new file mode 100644
index 0000000..63cf202
--- /dev/null
+++ b/heimdall-frontend/heimdall-frontend.pri
@@ -0,0 +1,12 @@
+# ----------------------------------------------------
+# This file is generated by the Qt Visual Studio Add-in.
+# ------------------------------------------------------
+
+HEADERS += ./Source/aboutform.h \
+ ./Source/mainwindow.h
+SOURCES += ./Source/aboutform.cpp \
+ ./Source/main.cpp \
+ ./Source/mainwindow.cpp
+FORMS += ./mainwindow.ui \
+ ./aboutform.ui
+RESOURCES += mainwindow.qrc
diff --git a/heimdall-frontend/heimdall-frontend.pro b/heimdall-frontend/heimdall-frontend.pro
new file mode 100644
index 0000000..7e1049b
--- /dev/null
+++ b/heimdall-frontend/heimdall-frontend.pro
@@ -0,0 +1,45 @@
+# ----------------------------------------------------
+# This file is generated by the Qt Visual Studio Add-in.
+# ------------------------------------------------------
+
+TEMPLATE = app
+TARGET = heimdall-frontend
+
+macx {
+ DESTDIR = ../OSX
+} else win32 { # It's recommended that Windows users compile via VS2010, but just in case...
+ DESTDIR = ../Win32
+} else {
+ DESTDIR = ../Linux
+}
+
+macx {
+ PROPOSEDINSTALLDIR = /Applications
+} else {
+ PROPOSEDINSTALLDIR = /usr/local/bin
+}
+
+message("Install location:" $$PROPOSEDINSTALLDIR)
+DESIREDINSTALLDIR = $$prompt("Press ENTER to use the default location or type an alternative")
+
+equals(DESIREDINSTALLDIR, "") {
+ target.path = $$PROPOSEDINSTALLDIR
+} else {
+ target.path = $$DESIREDINSTALLDIR
+}
+
+
+INSTALLS += target
+
+QT += core gui
+CONFIG += release
+DEFINES += QT_LARGEFILE_SUPPORT
+INCLUDEPATH += ./GeneratedFiles \
+ ./GeneratedFiles/Release \
+ .
+DEPENDPATH += .
+MOC_DIR += ./GeneratedFiles/release
+OBJECTS_DIR += release
+UI_DIR += ./GeneratedFiles
+RCC_DIR += ./GeneratedFiles
+include(heimdall-frontend.pri)
diff --git a/heimdall-frontend/heimdall-frontend.vcxproj b/heimdall-frontend/heimdall-frontend.vcxproj
new file mode 100644
index 0000000..e8206ed
--- /dev/null
+++ b/heimdall-frontend/heimdall-frontend.vcxproj
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{EAD352DF-7CDE-478C-8D70-B0E42A951DEF}</ProjectGuid>
+ <Keyword>Qt4VSv1.0</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="Qt4VSPropertySheet.props" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="Qt4VSPropertySheet.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IncludePath)</IncludePath>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IncludePath)</IncludePath>
+ <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(LibraryPath)</LibraryPath>
+ <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(LibraryPath)</LibraryPath>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PreprocessorDefinitions>UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_CORE_LIB;QT_GUI_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>.\GeneratedFiles;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\qtmain;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <Optimization>Disabled</Optimization>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+ <WarningLevel>Level3</WarningLevel>
+ <MinimalRebuild>true</MinimalRebuild>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>qtmaind.lib;QtCored4.lib;QtGuid4.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <PreprocessorDefinitions>UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>.\GeneratedFiles;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\qtmain;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <DebugInformationFormat>
+ </DebugInformationFormat>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <TreatWChar_tAsBuiltInType>false</TreatWChar_tAsBuiltInType>
+ <PrecompiledHeaderFile>
+ </PrecompiledHeaderFile>
+ <PrecompiledHeaderOutputFile>
+ </PrecompiledHeaderOutputFile>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <AdditionalLibraryDirectories>$(QTDIR)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <AdditionalDependencies>qtmain.lib;QtCore4.lib;QtGui4.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="GeneratedFiles\Debug\moc_mainwindow.cpp">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="GeneratedFiles\qrc_mainwindow.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ </PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ </PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="GeneratedFiles\Release\moc_mainwindow.cpp">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="Source\aboutform.cpp" />
+ <ClCompile Include="Source\main.cpp" />
+ <ClCompile Include="Source\mainwindow.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="mainwindow.ui">
+ <FileType>Document</FileType>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Uic%27ing %(Identity)...</Message>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Uic%27ing %(Identity)...</Message>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>
+ </CustomBuild>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="GeneratedFiles\ui_aboutform.h" />
+ <ClInclude Include="GeneratedFiles\ui_mainwindow.h" />
+ <ClInclude Include="Source\aboutform.h" />
+ <CustomBuild Include="Source\mainwindow.h">
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB -D_UNICODE "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I." "-I." "-I." "-I." "-I." "Source\mainwindow.h" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"</Command>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing %(Identity)...</Message>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I." "-I." "-I." "-I." "Source\mainwindow.h" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"</Command>
+ </CustomBuild>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="mainwindow.qrc">
+ <FileType>Document</FileType>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(FullPath);%(AdditionalInputs)</AdditionalInputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Rcc%27ing %(Identity)...</Message>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp</Command>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(FullPath);%(AdditionalInputs)</AdditionalInputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Rcc%27ing %(Identity)...</Message>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp</Command>
+ </CustomBuild>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="aboutform.ui">
+ <FileType>Document</FileType>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Uic%27ing %(Identity)...</Message>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Uic%27ing %(Identity)...</Message>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>
+ </CustomBuild>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+ <ProjectExtensions>
+ <VisualStudio>
+ <UserProperties UicDir=".\GeneratedFiles" MocDir=".\GeneratedFiles\$(ConfigurationName)" MocOptions="" RccDir=".\GeneratedFiles" lupdateOnBuild="0" QtVersion_x0020_Win32="qt" />
+ </VisualStudio>
+ </ProjectExtensions>
+</Project> \ No newline at end of file
diff --git a/heimdall-frontend/heimdall-frontend.vcxproj.filters b/heimdall-frontend/heimdall-frontend.vcxproj.filters
new file mode 100644
index 0000000..aff2885
--- /dev/null
+++ b/heimdall-frontend/heimdall-frontend.vcxproj.filters
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Form Files">
+ <UniqueIdentifier>{99349809-55BA-4b9d-BF79-8FDBB0286EB3}</UniqueIdentifier>
+ <Extensions>ui</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E}</UniqueIdentifier>
+ <Extensions>qrc;*</Extensions>
+ <ParseFiles>false</ParseFiles>
+ </Filter>
+ <Filter Include="Generated Files">
+ <UniqueIdentifier>{71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11}</UniqueIdentifier>
+ <Extensions>moc;h;cpp</Extensions>
+ <SourceControlFiles>False</SourceControlFiles>
+ </Filter>
+ <Filter Include="Generated Files\Debug">
+ <UniqueIdentifier>{ead127e5-64ec-4f27-8f35-5fb8f8b0b46e}</UniqueIdentifier>
+ <Extensions>cpp;moc</Extensions>
+ <SourceControlFiles>False</SourceControlFiles>
+ </Filter>
+ <Filter Include="Generated Files\Release">
+ <UniqueIdentifier>{2a437972-0e31-44d0-be90-ea5d62a68ff5}</UniqueIdentifier>
+ <Extensions>cpp;moc</Extensions>
+ <SourceControlFiles>False</SourceControlFiles>
+ </Filter>
+ <Filter Include="Source">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;cxx;c;def</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="GeneratedFiles\qrc_mainwindow.cpp">
+ <Filter>Generated Files</Filter>
+ </ClCompile>
+ <ClCompile Include="Source\main.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="Source\mainwindow.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ <ClCompile Include="GeneratedFiles\Debug\moc_mainwindow.cpp">
+ <Filter>Generated Files\Debug</Filter>
+ </ClCompile>
+ <ClCompile Include="GeneratedFiles\Release\moc_mainwindow.cpp">
+ <Filter>Generated Files\Release</Filter>
+ </ClCompile>
+ <ClCompile Include="Source\aboutform.cpp">
+ <Filter>Source</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="mainwindow.ui">
+ <Filter>Form Files</Filter>
+ </CustomBuild>
+ <CustomBuild Include="mainwindow.qrc">
+ <Filter>Resource Files</Filter>
+ </CustomBuild>
+ <CustomBuild Include="Source\mainwindow.h">
+ <Filter>Source</Filter>
+ </CustomBuild>
+ <CustomBuild Include="AboutForm.ui">
+ <Filter>Form Files</Filter>
+ </CustomBuild>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="GeneratedFiles\ui_mainwindow.h">
+ <Filter>Generated Files</Filter>
+ </ClInclude>
+ <ClInclude Include="GeneratedFiles\ui_AboutForm.h">
+ <Filter>Generated Files</Filter>
+ </ClInclude>
+ <ClInclude Include="Source\aboutform.h">
+ <Filter>Source</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/heimdall-frontend/mainwindow.qrc b/heimdall-frontend/mainwindow.qrc
new file mode 100644
index 0000000..4479bd9
--- /dev/null
+++ b/heimdall-frontend/mainwindow.qrc
@@ -0,0 +1,4 @@
+<RCC>
+ <qresource prefix="MainWindow">
+ </qresource>
+</RCC>
diff --git a/heimdall-frontend/mainwindow.ui b/heimdall-frontend/mainwindow.ui
new file mode 100644
index 0000000..300be65
--- /dev/null
+++ b/heimdall-frontend/mainwindow.ui
@@ -0,0 +1,872 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>902</width>
+ <height>523</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>902</width>
+ <height>523</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>902</width>
+ <height>523</height>
+ </size>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">Heimdall Frontend 1.1</string>
+ </property>
+ <property name="toolTip">
+ <string notr="true"/>
+ </property>
+ <property name="statusTip">
+ <string notr="true"/>
+ </property>
+ <property name="whatsThis">
+ <string notr="true"/>
+ </property>
+ <property name="accessibleName">
+ <string notr="true"/>
+ </property>
+ <property name="accessibleDescription">
+ <string notr="true"/>
+ </property>
+ <property name="windowFilePath">
+ <string notr="true"/>
+ </property>
+ <property name="tabShape">
+ <enum>QTabWidget::Rounded</enum>
+ </property>
+ <widget class="QWidget" name="centralWidget">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <family>MS Shell Dlg 2</family>
+ </font>
+ </property>
+ <widget class="QTabWidget" name="functionTabWidget">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>0</y>
+ <width>881</width>
+ <height>491</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="flashTab">
+ <attribute name="title">
+ <string>Flash</string>
+ </attribute>
+ <widget class="QGroupBox" name="pdaGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>120</y>
+ <width>421</width>
+ <height>331</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>PDA/Code</string>
+ </property>
+ <widget class="QGroupBox" name="factoryfsGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>401</width>
+ <height>61</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>FactoryFS</string>
+ </property>
+ <widget class="QLineEdit" name="factoryfsLineEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>30</y>
+ <width>281</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="factoryfsBrowseButton">
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>30</y>
+ <width>71</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="factoryfsCheckBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>30</y>
+ <width>21</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QGroupBox" name="kernelGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>80</y>
+ <width>401</width>
+ <height>61</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Kernel (zImage)</string>
+ </property>
+ <widget class="QLineEdit" name="kernelLineEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>30</y>
+ <width>281</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="kernelBrowseButton">
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>30</y>
+ <width>71</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="kernelCheckBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>30</y>
+ <width>21</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QGroupBox" name="primaryBootGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>200</y>
+ <width>401</width>
+ <height>61</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Primary Bootloader</string>
+ </property>
+ <widget class="QLineEdit" name="primaryBootLineEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>30</y>
+ <width>281</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="primaryBootBrowseButton">
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>30</y>
+ <width>71</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="primaryBootCheckBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>30</y>
+ <width>21</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QGroupBox" name="secondaryBootGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>260</y>
+ <width>401</width>
+ <height>61</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Secondary Bootloader</string>
+ </property>
+ <widget class="QLineEdit" name="secondaryBootLineEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>30</y>
+ <width>281</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="secondaryBootBrowseButton">
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>30</y>
+ <width>71</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="secondaryBootCheckBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>30</y>
+ <width>21</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QGroupBox" name="paramGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>140</y>
+ <width>401</width>
+ <height>61</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Param.lfs</string>
+ </property>
+ <widget class="QLineEdit" name="paramLineEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>30</y>
+ <width>281</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="paramBrowseButton">
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>30</y>
+ <width>71</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="paramCheckBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>30</y>
+ <width>21</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ <widget class="QGroupBox" name="cscGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>440</x>
+ <y>10</y>
+ <width>421</width>
+ <height>151</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>CSC</string>
+ </property>
+ <widget class="QGroupBox" name="cacheGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>401</width>
+ <height>61</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Cache</string>
+ </property>
+ <widget class="QLineEdit" name="cacheLineEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>30</y>
+ <width>281</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="cacheBrowseButton">
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>30</y>
+ <width>71</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="cacheCheckBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>30</y>
+ <width>21</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QGroupBox" name="databaseGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>80</y>
+ <width>401</width>
+ <height>61</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Database Data</string>
+ </property>
+ <widget class="QLineEdit" name="databaseLineEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>30</y>
+ <width>281</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="databaseBrowseButton">
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>30</y>
+ <width>71</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="databaseCheckBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>30</y>
+ <width>21</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ <widget class="QGroupBox" name="repartitionGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>421</width>
+ <height>111</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Repartition</string>
+ </property>
+ <widget class="QGroupBox" name="pitGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>401</width>
+ <height>81</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>PIT</string>
+ </property>
+ <widget class="QLineEdit" name="pitLineEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>50</y>
+ <width>301</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="pitBrowseButton">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>50</y>
+ <width>71</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="repartitionCheckBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>381</width>
+ <height>17</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Repartition Device</string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ <widget class="QPushButton" name="startFlashButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>780</x>
+ <y>410</y>
+ <width>91</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Start</string>
+ </property>
+ </widget>
+ <widget class="QProgressBar" name="flashProgressBar">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>460</x>
+ <y>410</y>
+ <width>311</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="value">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="QGroupBox" name="otherGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>440</x>
+ <y>160</y>
+ <width>421</width>
+ <height>151</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <family>MS Shell Dlg 2</family>
+ </font>
+ </property>
+ <property name="title">
+ <string>Other</string>
+ </property>
+ <widget class="QGroupBox" name="recoveryGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>80</y>
+ <width>401</width>
+ <height>61</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Recovery</string>
+ </property>
+ <widget class="QLineEdit" name="recoveryLineEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>30</y>
+ <width>281</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="recoveryBrowseButton">
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>30</y>
+ <width>71</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="recoveryCheckBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>30</y>
+ <width>21</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QGroupBox" name="modemGroupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>401</width>
+ <height>61</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Modem</string>
+ </property>
+ <widget class="QLineEdit" name="modemLineEdit">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>30</y>
+ <width>281</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="modemBrowseButton">
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>30</y>
+ <width>71</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Browse</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="modemCheckBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>30</y>
+ <width>21</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ <widget class="QLabel" name="flashLabel">
+ <property name="geometry">
+ <rect>
+ <x>460</x>
+ <y>380</y>
+ <width>411</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string notr="true">Ready</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QWidget" name="firmwareTab">
+ <attribute name="title">
+ <string>Download Firmware</string>
+ </attribute>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>851</width>
+ <height>441</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string/>
+ </property>
+ <widget class="QLabel" name="label">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>831</width>
+ <height>391</height>
+ </rect>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Plain</enum>
+ </property>
+ <property name="text">
+ <string>This functionality is still under development and will be included in a future release.</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+ <widget class="QMenuBar" name="menuBar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>902</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuHelp">
+ <property name="title">
+ <string>Help</string>
+ </property>
+ <addaction name="actionAboutHeimdall"/>
+ </widget>
+ <widget class="QMenu" name="menuDonate">
+ <property name="title">
+ <string>Donate</string>
+ </property>
+ <addaction name="actionDonate"/>
+ </widget>
+ <addaction name="menuDonate"/>
+ <addaction name="menuHelp"/>
+ </widget>
+ <action name="actionHelp">
+ <property name="text">
+ <string>Help</string>
+ </property>
+ </action>
+ <action name="actionAboutHeimdall">
+ <property name="text">
+ <string>About Heimdall</string>
+ </property>
+ </action>
+ <action name="actionDonate">
+ <property name="text">
+ <string>Donate to Glass Echidna</string>
+ </property>
+ </action>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>