calamares/src/crashreporter/main.cpp
2016-03-23 18:48:08 +01:00

167 lines
6.4 KiB
C++

/* === This file is part of Calamares - <http://github.com/calamares> ===
*
* Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>
* Copyright 2015-2016, Teo Mrnjavac <teo@kde.org>
*
* Calamares is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Calamares is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
*/
#include <libcrashreporter-gui/CrashReporter.h>
#include <libcrashreporter-gui/CrashReporterGzip.h>
#include "CrashReporterConfig.h"
#include <QTranslator>
#include <iostream>
#include <QApplication>
#include <QDir>
#include <QFileInfo>
#include "utils/CalamaresUtils.h"
#include "utils/Logger.h"
#include <numeric>
#ifdef Q_OS_WIN
#include <windows.h>
#include <unistd.h>
#endif
#ifdef Q_OS_LINUX
const char* k_usage =
"Usage:\n"
" CrashReporter <dumpFilePath> <linuxBacktracePath>\n";
#else
const char* k_usage =
"Usage:\n"
" CrashReporter <dumpFilePath>\n";
#endif
int main( int argc, char* argv[] )
{
#ifdef Q_OS_WIN // log to console window
if ( fileno( stdout ) != -1 && _get_osfhandle( fileno( stdout ) ) != -1 )
{
/* stdout is fine, presumably redirected to a file or pipe */
}
else
{
typedef BOOL (WINAPI * AttachConsole_t) (DWORD);
AttachConsole_t p_AttachConsole = (AttachConsole_t) GetProcAddress( GetModuleHandleW( L"kernel32.dll" ), "AttachConsole" );
if ( p_AttachConsole != NULL && p_AttachConsole( ATTACH_PARENT_PROCESS ) )
{
_wfreopen ( L"CONOUT$", L"w", stdout );
dup2( fileno( stdout ), 1 );
_wfreopen ( L"CONOUT$", L"w", stderr );
dup2( fileno( stderr ), 2 );
}
}
#endif
// used by some Qt stuff, eg QSettings
// leave first! As Settings object is created quickly
QCoreApplication::setOrganizationName( QLatin1String( CALAMARES_ORGANIZATION_NAME ) );
QCoreApplication::setOrganizationDomain( QLatin1String( CALAMARES_ORGANIZATION_DOMAIN ) );
QCoreApplication::setApplicationName( QLatin1String( CALAMARES_APPLICATION_NAME ) );
QCoreApplication::setApplicationVersion( QLatin1String( CALAMARES_VERSION ) );
QApplication app( argc, argv );
CalamaresUtils::installTranslator( QLocale::system(), QString(), &app );
#ifdef Q_OS_LINUX
if ( app.arguments().size() != 8 )
#else
if ( app.arguments().size() != 2 )
#endif
{
std::cout << k_usage;
return 1;
}
cDebug() << "Arguments list:" << app.arguments().join( ", " );
CrashReporter reporter( QUrl( CRASHREPORTER_SUBMIT_URL ), app.arguments() );
#ifdef CRASHREPORTER_ICON
reporter.setLogo( QPixmap( CRASHREPORTER_ICON ) );
#endif
reporter.setWindowTitle( CRASHREPORTER_PRODUCT_NAME );
reporter.setText("<html><head/><body><p><span style=\" font-weight:600;\">Sorry!"
"</span> " CRASHREPORTER_PRODUCT_NAME " crashed. Please tell us "
"about it! " CRASHREPORTER_PRODUCT_NAME " has created an error "
"report for you that can help improve the stability in the "
"future. You can now send this report directly to the "
CRASHREPORTER_PRODUCT_NAME " developers.</p><p>Can you tell us "
"what you were doing when this happened?</p></body></html>");
reporter.setBottomText(QString());
reporter.setReportData( "BuildID", CRASHREPORTER_BUILD_ID );
reporter.setReportData( "ProductName", CRASHREPORTER_PRODUCT_NAME );
reporter.setReportData( "Version", CRASHREPORTER_VERSION_STRING );
reporter.setReportData( "ReleaseChannel", CRASHREPORTER_RELEASE_CHANNEL);
//reporter.setReportData( "timestamp", QByteArray::number( QDateTime::currentDateTime().toTime_t() ) );
// add parameters
// QList<Pair> pairs;
// pairs //<< Pair( "BuildID", buildId.toUtf8() )
// << Pair( )
// //<< Pair( "Version", CalamaresUtils::appFriendlyVersion().toLocal8Bit() )
// //<< Pair( "Vendor", "Tomahawk" )
// //<< Pair( )
// << Pair("InstallTime", "1357622062")
// << Pair("Theme", "classic/1.0")
// << Pair("Version", "30")
// << Pair("id", "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}")
// << Pair("Vendor", "Mozilla")
// << Pair("EMCheckCompatibility", "true")
// << Pair("Throttleable", "0")
// << Pair("URL", "http://code.google.com/p/crashme/")
// << Pair("version", "20.0a1")
// << Pair("CrashTime", "1357770042")
// << Pair("submitted_timestamp", "2013-01-09T22:21:18.646733+00:00")
// << Pair("buildid", "20130107030932")
// << Pair("timestamp", "1357770078.646789")
// << Pair("Notes", "OpenGL: NVIDIA Corporation -- GeForce 8600M GT/PCIe/SSE2 -- 3.3.0 NVIDIA 313.09 -- texture_from_pixmap\r\n")
// << Pair("StartupTime", "1357769913")
// << Pair("FramePoisonSize", "4096")
// << Pair("FramePoisonBase", "7ffffffff0dea000")
// << Pair("Add-ons", "%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:20.0a1,crashme%40ted.mielczarek.org:0.4")
// << Pair("SecondsSinceLastCrash", "1831736")
// << Pair("ProductName", "WaterWolf")
// << Pair("legacy_processing", "0")
// << Pair("ProductID", "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}")
;
// send log
QFile logFile( CalamaresUtils::appLogDir().filePath( "Calamares.log" ) );
logFile.open( QFile::ReadOnly );
reporter.setReportData( "upload_file_calamareslog",
gzip_compress( logFile.readAll() ),
"application/x-gzip",
QFileInfo( logFile ).fileName().toUtf8());
logFile.close();
reporter.show();
return app.exec();
}