CrashReportDialog.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "CrashReportDialog.h"
00020 #include "CrashReportUploader.h"
00021 #include "UploadProgressDialog.h"
00022
00023 #include "stringutil.h"
00024
00025 #include <QProcess>
00026 #include <QPushButton>
00027 #include <QMessageBox>
00028 #include <QFileInfo>
00029
00030
00031 CrashReportDialog::CrashReportDialog(QWidget *parent)
00032 : QDialog(parent)
00033 {
00034 ui.setupUi(this);
00035
00036
00037 QPushButton *btn;
00038 btn = ui.buttonBox->button(QDialogButtonBox::Ok);
00039 btn->setText(tr("Restart Vidalia"));
00040
00041 btn = ui.buttonBox->button(QDialogButtonBox::Cancel);
00042 btn->setText(tr("Don't Restart"));
00043 }
00044
00045 void
00046 CrashReportDialog::setCrashAnnotations(const QHash<QString,QString> &annotations)
00047 {
00048 _annotations = annotations;
00049 }
00050
00051 void
00052 CrashReportDialog::setMinidump(const QString &id, const QByteArray &minidump)
00053 {
00054 _minidump = minidump;
00055 _minidumpId = id;
00056 }
00057
00058 void
00059 CrashReportDialog::submitCrashReport()
00060 {
00061 CrashReportUploader *uploader = new CrashReportUploader();
00062 UploadProgressDialog *progressDialog = new UploadProgressDialog(this);
00063 QMap<QString,QString> parameters;
00064
00065 connect(uploader, SIGNAL(statusChanged(QString)),
00066 progressDialog, SLOT(setStatus(QString)));
00067 connect(uploader, SIGNAL(uploadProgress(int, int)),
00068 progressDialog, SLOT(setUploadProgress(int, int)));
00069 connect(uploader, SIGNAL(uploadFinished()),
00070 progressDialog, SLOT(accept()));
00071 connect(uploader, SIGNAL(uploadFailed(QString)),
00072 progressDialog, SLOT(uploadFailed(QString)));
00073
00074
00075 QString comments = ui.textDetails->toPlainText();
00076 if (! comments.isEmpty())
00077 parameters.insert("Comments", comments);
00078 parameters.insert("ProductName", "Vidalia");
00079 parameters.insert("Vendor", "Vidalia");
00080 parameters.insert("Version", _annotations.value("BuildVersion"));
00081 parameters.insert("CrashTime", _annotations.value("CrashTime"));
00082 parameters.insert("StartupTime", _annotations.value("StartupTime"));
00083
00084
00085 uploader->uploadMinidump(QUrl("https://crashes.vidalia-project.net/submit"),
00086 _minidumpId, _minidump, parameters);
00087
00088
00089
00090 if (progressDialog->exec() == QDialog::Rejected)
00091 uploader->cancel();
00092
00093 delete uploader;
00094 }
00095
00096 void
00097 CrashReportDialog::accept()
00098 {
00099
00100 if (ui.chkSubmitCrashReport->isChecked())
00101 submitCrashReport();
00102
00103
00104 QString exe = _annotations.value("RestartExecutable");
00105 QString args = _annotations.value("RestartExecutableArgs");
00106 QStringList argList = string_parse_arguments(args);
00107 if (! QProcess::startDetached(exe, argList, QFileInfo(exe).absolutePath())) {
00108 QMessageBox dlg(QMessageBox::Warning, tr("Unable to restart Vidalia"),
00109 tr("We were unable to automatically restart Vidalia. "
00110 "Please restart Vidalia manually."),
00111 QMessageBox::Ok, this);
00112 dlg.exec();
00113 }
00114
00115
00116 QDialog::accept();
00117 }
00118
00119 void
00120 CrashReportDialog::reject()
00121 {
00122
00123 if (ui.chkSubmitCrashReport->isChecked())
00124 submitCrashReport();
00125
00126
00127 QDialog::reject();
00128 }
00129