void CrashReporter::run() { QByteArray qbaDumpContents; QFile qfCrashDump(g.qdBasePath.filePath(QLatin1String("mumble.dmp"))); if (! qfCrashDump.exists()) return; qfCrashDump.open(QIODevice::ReadOnly); #if defined(Q_OS_WIN) /* On Windows, the .dmp file is a real minidump. */ if (qfCrashDump.peek(4) != "MDMP") return; qbaDumpContents = qfCrashDump.readAll(); #elif defined(Q_OS_MAC) /* * On OSX, the .dmp file is simply a dummy file that we * use to find the *real* crash dump, made by the OSX * built in crash reporter. */ QFileInfo qfiDump(qfCrashDump); QDateTime qdtModification = qfiDump.lastModified(); /* Find the real crash report. */ QDir qdCrashReports(QDir::home().absolutePath() + QLatin1String("/Library/Logs/DiagnosticReports/")); if (! qdCrashReports.exists()) { qdCrashReports = QDir::home().absolutePath() + QLatin1String("/Library/Logs/CrashReporter/"); } QStringList qslFilters; qslFilters << QString::fromLatin1("Mumble_*.crash"); qdCrashReports.setNameFilters(qslFilters); qdCrashReports.setSorting(QDir::Time); QFileInfoList qfilEntries = qdCrashReports.entryInfoList(); /* * Figure out if our delta is sufficiently close to the Apple crash dump, or * if something weird happened. */ foreach(QFileInfo fi, qfilEntries) { int delta = abs(qdtModification.secsTo(fi.lastModified())); if (delta < 8) { QFile f(fi.absoluteFilePath()); f.open(QIODevice::ReadOnly); qbaDumpContents = f.readAll(); break; } }
void CrashReporter::run() { QByteArray qbaDumpContents; QFile qfCrashDump(QDesktopServices::storageLocation(QDesktopServices::DataLocation) + QLatin1String("/mdvc.dmp")); if (! qfCrashDump.exists()) return; qfCrashDump.open(QIODevice::ReadOnly); if (qfCrashDump.peek(4) != "MDMP") return; qbaDumpContents = qfCrashDump.readAll(); if (qbaDumpContents.isEmpty()) { qWarning("CrashReporter: Empty crash dump file, not reporting."); return; } qpdProgress = new QProgressDialog(tr("Uploading crash report"), tr("Abort upload"), 0, 100, this); qpdProgress->setMinimumDuration(500); qpdProgress->setValue(0); connect(qpdProgress, SIGNAL(canceled()), qelLoop, SLOT(quit())); QString boundary = QString::fromLatin1("---------------------------%1").arg(QDateTime::currentDateTime().toTime_t()); QString ver = QString::fromLatin1("--%1\r\nContent-Disposition: form-data; name=\"ver\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n%2\r\n").arg(boundary, QLatin1String(MDVC_VERSION)); QString head = QString::fromLatin1("--%1\r\nContent-Disposition: form-data; name=\"dump\"; filename=\"mdvc.dmp\"\r\nContent-Type: binary/octet-stream\r\n\r\n").arg(boundary); QString end = QString::fromLatin1("\r\n--%1--\r\n").arg(boundary); QByteArray post = ver.toUtf8() + head.toUtf8() + qbaDumpContents + end.toUtf8(); QUrl url(QLatin1String("https://mix.hive.no/~xeno/mdcrash/crashreport.php")); QNetworkRequest req(url); req.setHeader(QNetworkRequest::ContentTypeHeader, QString::fromLatin1("multipart/form-data; boundary=%1").arg(boundary)); req.setHeader(QNetworkRequest::ContentLengthHeader, QString::number(post.size())); QNetworkAccessManager *nam = new QNetworkAccessManager(this); qnrReply = nam->post(req, post); connect(qnrReply, SIGNAL(finished()), this, SLOT(uploadFinished())); connect(qnrReply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(uploadProgress(qint64, qint64))); qelLoop->exec(QEventLoop::DialogExec); if (! qfCrashDump.remove()) qWarning("CrashReporeter: Unable to remove crash file."); }