diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 8b59fd16d4..ca09960abd 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -257,6 +257,7 @@ bool setupEssentials(int& argc, char** argv) { // Set build version QCoreApplication::setApplicationVersion(BUILD_VERSION); + CrashHandler::checkForAndHandleCrash(); CrashHandler::writeRunningMarkerFiler(); qAddPostRoutine(CrashHandler::deleteRunningMarkerFile); diff --git a/interface/src/CrashHandler.cpp b/interface/src/CrashHandler.cpp index c95e513898..b58e739176 100644 --- a/interface/src/CrashHandler.cpp +++ b/interface/src/CrashHandler.cpp @@ -12,13 +12,72 @@ #include "CrashHandler.h" #include +#include +#include #include +#include #include +#include #include #include +#include static const QString RUNNING_MARKER_FILENAME = "Interface.running"; +void CrashHandler::checkForAndHandleCrash() { + QFile runningMarkerFile(runningMarkerFilePath()); + if (runningMarkerFile.exists()) { + Action action = promptUserForAction(); + if (action != DO_NOTHING) { + handleCrash(action); + } + } +} + +CrashHandler::Action CrashHandler::promptUserForAction() { + QDialog crashDialog; + crashDialog.setWindowTitle("Interface Crashed Last Run"); + + QVBoxLayout* layout = new QVBoxLayout; + + QLabel* label = new QLabel("What would you like to do?"); + layout->addWidget(label); + + QRadioButton* option1 = new QRadioButton("Delete Interface.ini"); + QRadioButton* option2 = new QRadioButton("Delete Interface.ini but retain login and avatar info."); + QRadioButton* option3 = new QRadioButton("Continue with my current Interface.ini"); + option3->setChecked(true); + layout->addWidget(option1); + layout->addWidget(option2); + layout->addWidget(option3); + layout->addSpacing(12); + layout->addStretch(); + + QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok); + layout->addWidget(buttons); + crashDialog.connect(buttons, SIGNAL(accepted()), SLOT(accept())); + + crashDialog.setLayout(layout); + + int result = crashDialog.exec(); + + if (result == QDialog::Accepted) { + if (option1->isChecked()) { + return CrashHandler::DELETE_INTERFACE; + } + if (option2->isChecked()) { + return CrashHandler::RETAIN_LOGIN_AND_AVATAR_INFO; + } + } + + // Dialog cancelled or "do nothing" option chosen + return CrashHandler::DO_NOTHING; +} + +void CrashHandler::handleCrash(CrashHandler::Action action) { + // TODO +} + void CrashHandler::writeRunningMarkerFiler() { QFile runningMarkerFile(runningMarkerFilePath()); if (!runningMarkerFile.exists()) { diff --git a/interface/src/CrashHandler.h b/interface/src/CrashHandler.h index d354c49d07..2b3b78c1f2 100644 --- a/interface/src/CrashHandler.h +++ b/interface/src/CrashHandler.h @@ -17,10 +17,21 @@ class CrashHandler { public: + static void checkForAndHandleCrash(); + static void writeRunningMarkerFiler(); static void deleteRunningMarkerFile(); private: + enum Action { + DELETE_INTERFACE, + RETAIN_LOGIN_AND_AVATAR_INFO, + DO_NOTHING + }; + + static Action promptUserForAction(); + static void handleCrash(Action action); + static const QString runningMarkerFilePath(); };