Exemple #1
0
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;
        }
    }
Exemple #2
0
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.");
}