X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fquassel.cpp;h=a9798054f5cc427389b5bc151e678b549365c351;hp=e74d60590318bc06652ff2c8e28fd66fc925fe9e;hb=84b0f5fb3219bcc777f74f609c88011c86873f6c;hpb=64d5732f4e6ce84dd73dfb1a72c1fbb568a3fe0a diff --git a/src/common/quassel.cpp b/src/common/quassel.cpp index e74d6059..a9798054 100644 --- a/src/common/quassel.cpp +++ b/src/common/quassel.cpp @@ -20,7 +20,11 @@ #include "quassel.h" +#include #include +#if !defined Q_OS_WIN32 && !defined Q_OS_MAC +# include +#endif #include #include @@ -45,8 +49,12 @@ QStringList Quassel::_dataDirPaths; bool Quassel::_initialized = false; bool Quassel::DEBUG = false; QString Quassel::_coreDumpFileName; +Quassel *Quassel::_instance = 0; Quassel::Quassel() { + Q_ASSERT(!_instance); + _instance = this; + // We catch SIGTERM and SIGINT (caused by Ctrl+C) to graceful shutdown Quassel. signal(SIGTERM, handleSignal); signal(SIGINT, handleSignal); @@ -54,11 +62,22 @@ Quassel::Quassel() { // we have crashhandler for win32 and unix (based on execinfo). // on mac os we use it's integrated backtrace generator #if defined(Q_OS_WIN32) || (defined(HAVE_EXECINFO) && !defined(Q_OS_MAC)) - signal(SIGABRT, handleSignal); - signal(SIGSEGV, handleSignal); -# ifndef Q_OS_WIN32 - signal(SIGBUS, handleSignal); -# endif + +# ifndef Q_OS_WIN32 + // we only handle crashes ourselves if coredumps are disabled + struct rlimit *limit = (rlimit *) malloc(sizeof(struct rlimit)); + int rc = getrlimit(RLIMIT_CORE, limit); + + if(rc == -1 || !((long)limit->rlim_cur > 0 || limit->rlim_cur == RLIM_INFINITY)) { +# endif + signal(SIGABRT, handleSignal); + signal(SIGSEGV, handleSignal); +# ifndef Q_OS_WIN32 + signal(SIGBUS, handleSignal); + } + free(limit); +# endif + #endif } @@ -84,10 +103,19 @@ bool Quassel::init() { return false; } + if(isOptionSet("version")) { + std::cout << qPrintable("Quassel IRC: " + Quassel::buildInfo().plainVersionString) << std::endl; + return false; + } + DEBUG = isOptionSet("debug"); return true; } +void Quassel::quit() { + QCoreApplication::quit(); +} + //! Register our custom types with Qt's Meta Object System. /** This makes them available for QVariant and in signals/slots, among other things. * @@ -150,8 +178,7 @@ void Quassel::setupBuildInfo(const QString &generated) { _buildInfo.plainVersionString = QString("v%1 (dist-%2)") .arg(_buildInfo.baseVersion) .arg(_buildInfo.commitHash.left(7)); - _buildInfo.fancyVersionString - = QString("v%1 (dist-%2)") + _buildInfo.fancyVersionString = QString("v%1 (dist-%2)") .arg(_buildInfo.baseVersion) .arg(_buildInfo.commitHash.left(7)) .arg(_buildInfo.commitHash); @@ -163,13 +190,13 @@ void Quassel::setupBuildInfo(const QString &generated) { // analyze what we got from git-describe QRegExp rx("(.*)-(\\d+)-g([0-9a-f]+)$"); if(rx.exactMatch(_buildInfo.generatedVersion)) { - QString distance = rx.cap(2) == "0" ? QString() : QString(" [+%1]").arg(rx.cap(2)); - _buildInfo.plainVersionString = QString("v%1%2 (git-%3%4)") - .arg(rx.cap(1), distance, rx.cap(3)) + QString distance = rx.cap(2) == "0" ? QString() : QString("%1+%2 ").arg(rx.cap(1), rx.cap(2)); + _buildInfo.plainVersionString = QString("v%1 (%2git-%3%4)") + .arg(_buildInfo.baseVersion, distance, rx.cap(3)) .arg(_buildInfo.isSourceDirty ? "*" : ""); if(!_buildInfo.commitHash.isEmpty()) { - _buildInfo.fancyVersionString = QString("v%1%2 (git-%3%4)") - .arg(rx.cap(1), distance, rx.cap(3)) + _buildInfo.fancyVersionString = QString("v%1 (%2git-%3%4)") + .arg(_buildInfo.baseVersion, distance, rx.cap(3)) .arg(_buildInfo.isSourceDirty ? "*" : "") .arg(_buildInfo.commitHash); } @@ -187,7 +214,10 @@ void Quassel::handleSignal(int sig) { case SIGTERM: case SIGINT: qWarning("%s", qPrintable(QString("Caught signal %1 - exiting.").arg(sig))); - QCoreApplication::quit(); + if(_instance) + _instance->quit(); + else + QCoreApplication::quit(); break; case SIGABRT: case SIGSEGV: @@ -336,10 +366,17 @@ QString Quassel::findDataFilePath(const QString &fileName) { return QString(); } -void Quassel::loadTranslation(const QLocale &locale) { +QStringList Quassel::scriptDirPaths() { + QStringList res(configDirPath() + "scripts/"); + foreach(QString path, dataDirPaths()) + res << path + "scripts/"; + return res; +} + +QString Quassel::translationDirPath() { if(_translationDirPath.isEmpty()) { // We support only one translation dir; fallback mechanisms wouldn't work else. - // This means that if we have a $data/i18n dir, the internal :/i18n resource won't be considered. + // This means that if we have a $data/translations dir, the internal :/i18n resource won't be considered. foreach(const QString &dir, dataDirPaths()) { if(QFile::exists(dir + "translations/")) { _translationDirPath = dir + "translations/"; @@ -349,7 +386,10 @@ void Quassel::loadTranslation(const QLocale &locale) { if(_translationDirPath.isEmpty()) _translationDirPath = ":/i18n/"; } + return _translationDirPath; +} +void Quassel::loadTranslation(const QLocale &locale) { QTranslator *qtTranslator = QCoreApplication::instance()->findChild("QtTr"); QTranslator *quasselTranslator = QCoreApplication::instance()->findChild("QuasselTr"); @@ -369,8 +409,8 @@ void Quassel::loadTranslation(const QLocale &locale) { if(locale.language() == QLocale::C) return; - bool success = qtTranslator->load(QString("qt_%1").arg(locale.name()), _translationDirPath); + bool success = qtTranslator->load(QString("qt_%1").arg(locale.name()), translationDirPath()); if(!success) qtTranslator->load(QString("qt_%1").arg(locale.name()), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); - quasselTranslator->load(QString("quassel_%1").arg(locale.name()), _translationDirPath); + quasselTranslator->load(QString("quassel_%1").arg(locale.name()), translationDirPath()); }