[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[vidalia-svn] r3864: Add any necessary form values based on information parsed fr (vidalia/branches/breakpad/src/crashreporter)



Author: edmanm
Date: 2009-06-16 01:53:13 -0400 (Tue, 16 Jun 2009)
New Revision: 3864

Modified:
   vidalia/branches/breakpad/src/crashreporter/CrashReportDialog.cpp
   vidalia/branches/breakpad/src/crashreporter/CrashReportDialog.h
   vidalia/branches/breakpad/src/crashreporter/main.cpp
Log:

Add any necessary form values based on information parsed from the crash
annotations file, pull the minidump ID from the filename that was generated
by the exception handler, kick off the crash report upload, and display the
UploadProgressDialog.


Modified: vidalia/branches/breakpad/src/crashreporter/CrashReportDialog.cpp
===================================================================
--- vidalia/branches/breakpad/src/crashreporter/CrashReportDialog.cpp	2009-06-16 05:48:17 UTC (rev 3863)
+++ vidalia/branches/breakpad/src/crashreporter/CrashReportDialog.cpp	2009-06-16 05:53:13 UTC (rev 3864)
@@ -17,6 +17,9 @@
 */
 
 #include "CrashReportDialog.h"
+#include "CrashReportUploader.h"
+#include "UploadProgressDialog.h"
+
 #include "stringutil.h"
 
 #include <QProcess>
@@ -46,15 +49,48 @@
 }
 
 void
-CrashReportDialog::setMinidump(const QByteArray &minidump)
+CrashReportDialog::setMinidump(const QString &id, const QByteArray &minidump)
 {
   _minidump = minidump;
+  _minidumpId = id;
 }
 
 void
-CrashReportDialog::submitCrashReport() const
+CrashReportDialog::submitCrashReport()
 {
-  /* Upload the crash report to crashes.vidalia-project.net */
+  CrashReportUploader *uploader = new CrashReportUploader();
+  UploadProgressDialog *progressDialog = new UploadProgressDialog(this);
+  QMap<QString,QString> parameters;
+
+  connect(uploader, SIGNAL(statusChanged(QString)),
+          progressDialog, SLOT(setStatus(QString)));
+  connect(uploader, SIGNAL(uploadProgress(int, int)),
+          progressDialog, SLOT(setUploadProgress(int, int)));
+  connect(uploader, SIGNAL(uploadFinished()),
+          progressDialog, SLOT(accept()));
+  connect(uploader, SIGNAL(uploadFailed(QString)),
+          progressDialog, SLOT(uploadFailed(QString)));
+
+  /* Set up the form fields that will be uploaded with the minidump */
+  QString comments = ui.textDetails->toPlainText();
+  if (! comments.isEmpty())
+    parameters.insert("Comments", comments);
+  parameters.insert("ProductName", "Vidalia");
+  parameters.insert("Vendor", "Vidalia");
+  parameters.insert("Version", _annotations.value("BuildVersion"));
+  parameters.insert("CrashTime", _annotations.value("CrashTime"));
+  parameters.insert("StartupTime", _annotations.value("StartupTime"));
+
+  /* Start the upload (returns immediately) */
+  uploader->uploadMinidump(QUrl("https://crashes.vidalia-project.net/submit";),
+                           _minidumpId, _minidump, parameters);
+
+  /* Displays a modal progress dialog showing the progress of the upload. This
+   * will return when either the upload completes or the user hits "Cancel". */
+  if (progressDialog->exec() == QDialog::Rejected)
+    uploader->cancel(); /* User clicked "Cancel" */
+
+  delete uploader;
 }
 
 void

Modified: vidalia/branches/breakpad/src/crashreporter/CrashReportDialog.h
===================================================================
--- vidalia/branches/breakpad/src/crashreporter/CrashReportDialog.h	2009-06-16 05:48:17 UTC (rev 3863)
+++ vidalia/branches/breakpad/src/crashreporter/CrashReportDialog.h	2009-06-16 05:53:13 UTC (rev 3864)
@@ -41,7 +41,7 @@
   /** Sets the <b>minidump</b> contents generated by the crashed
    * applications exception handler.
    */
-  void setMinidump(const QByteArray &minidump);
+  void setMinidump(const QString &id, const QByteArray &minidump);
 
   /** Uploads the generated minidump, user comments, and any additional
    * crash annotations generated by the exception handler to the crash
@@ -49,7 +49,7 @@
    * \sa setMinidump()
    * \sa setCrashAnnotations()
    */
-  void submitCrashReport() const;
+  void submitCrashReport();
 
 public slots:
   /** Called when the user clicks the "Restart Vidalia" button on the
@@ -69,6 +69,13 @@
   virtual void reject();
 
 private:
+  /** Each minidump is given a randomly-generated GUID when it is created,
+   * which is used to form the minidump filename. This ID is also used by
+   * the crash reporting server when accepting and processing uploaded
+   * minidumps.
+   */
+  QString _minidumpId;
+
   /** Contents of the generated minidump.
    */
   QByteArray _minidump;

Modified: vidalia/branches/breakpad/src/crashreporter/main.cpp
===================================================================
--- vidalia/branches/breakpad/src/crashreporter/main.cpp	2009-06-16 05:48:17 UTC (rev 3863)
+++ vidalia/branches/breakpad/src/crashreporter/main.cpp	2009-06-16 05:53:13 UTC (rev 3864)
@@ -93,7 +93,7 @@
   QApplication app(argc, argv);
   CrashReportDialog crashDialog;
   QFileInfo minidumpFile, extraInfoFile;
-  QString minidumpFileName, extraInfoFileName, errorMessage;
+  QString minidumpFilePath, extraInfoFilePath, errorMessage;
   QHash<QString,QString> annotations;
   QByteArray minidump;
 
@@ -104,53 +104,53 @@
 
   /* Ensure that the specified minidump file exists and is readable */
   minidumpFile     = QFileInfo(argv[1]);
-  minidumpFileName = minidumpFile.absoluteFilePath();
+  minidumpFilePath = minidumpFile.absoluteFilePath();
   if (! minidumpFile.exists() || ! minidumpFile.size()) {
     errorMessage = QString("The specified minidump file does not exist: %1")
-                                                      .arg(minidumpFileName);
+                                                      .arg(minidumpFilePath);
     goto err;
   }
   if (! minidumpFile.isReadable()) {
     errorMessage = QString("The specified minidump file is not readable: %1")
-                                                       .arg(minidumpFileName);
+                                                       .arg(minidumpFilePath);
     goto err;
   }
 
   /* Ensure that the specified minidump has an associated extra crash
    * information file that exists and is readable. */
-  extraInfoFile     = QFileInfo(minidumpFileName + ".info");
-  extraInfoFileName = extraInfoFile.absoluteFilePath();
+  extraInfoFile     = QFileInfo(minidumpFilePath + ".info");
+  extraInfoFilePath = extraInfoFile.absoluteFilePath();
   if (! extraInfoFile.exists() || ! extraInfoFile.size()) {
     errorMessage = QString("The specified minidump does not have a "
                            "corresponding crash annotations file: %1")
-                                               .arg(extraInfoFileName);
+                                               .arg(extraInfoFilePath);
     goto err;
   }
   if (! extraInfoFile.isReadable()) {
     errorMessage = QString("The specified crash information file is not "
-                           "readable: %1").arg(extraInfoFileName);
+                           "readable: %1").arg(extraInfoFilePath);
     goto err;
   }
 
   /* Read the minidump file's contents */
-  minidump = read_minidump_file(minidumpFileName, errorMessage);
+  minidump = read_minidump_file(minidumpFilePath, errorMessage);
   if (minidump.isNull()) {
     errorMessage = QString("Unable to read minidump file '%1': %2")
-                                             .arg(minidumpFileName)
+                                             .arg(minidumpFilePath)
                                              .arg(errorMessage);
     goto err;
   }
   /* Read and parse the crash annotations file */
-  annotations = read_annotations_file(extraInfoFileName, errorMessage);
+  annotations = read_annotations_file(extraInfoFilePath, errorMessage);
   if (annotations.isEmpty()) {
     errorMessage = QString("Unable to read crash annotations file '%1': %2")
-                                                     .arg(extraInfoFileName)
+                                                     .arg(extraInfoFilePath)
                                                      .arg(errorMessage);
     goto err;
   }
 
   /* Display the crash reporting dialog */
-  crashDialog.setMinidump(minidump);
+  crashDialog.setMinidump(minidumpFile.baseName(), minidump);
   crashDialog.setCrashAnnotations(annotations);
   crashDialog.show();
   return app.exec();