DlangIconCache &DlangIconCache::instance() { if (!(staticInstance.load())) { QMutexLocker lock(&staticInstanceMutex); if (!(staticInstance.load())) { staticInstance = new DlangIconCache; } } return *(staticInstance.load()); }
void logMessageHandler(QtMsgType type, const QMessageLogContext& ctxt, const QString& msg) { // Silence qWarning spam due to bug in QTextBrowser (trying to open a file for base64 images) if (ctxt.function == QString("virtual bool QFSFileEngine::open(QIODevice::OpenMode)") && msg == QString("QFSFileEngine::open: No file name specified")) return; QString LogMsg = QString("[%1] %2:%3 : ") .arg(QTime::currentTime().toString("HH:mm:ss.zzz")).arg(ctxt.file).arg(ctxt.line); switch (type) { case QtDebugMsg: LogMsg += "Debug"; break; case QtWarningMsg: LogMsg += "Warning"; break; case QtCriticalMsg: LogMsg += "Critical"; break; case QtFatalMsg: LogMsg += "Fatal"; break; default: break; } LogMsg += ": " + msg + "\n"; QByteArray LogMsgBytes = LogMsg.toUtf8(); fwrite(LogMsgBytes.constData(), 1, LogMsgBytes.size(), stderr); #ifdef LOG_TO_FILE FILE * logFilePtr = logFileFile.load(); // atomically load the file pointer if (!logFilePtr) { logBufferMutex->lock(); if (logBuffer) logBuffer->append(LogMsgBytes); logBufferMutex->unlock(); } else { logBufferMutex->lock(); if (logBuffer) { // empty logBuffer to file foreach (QByteArray msg, *logBuffer) fwrite(msg.constData(), 1, msg.size(), logFilePtr); delete logBuffer; // no longer needed logBuffer = nullptr; } logBufferMutex->unlock(); fwrite(LogMsgBytes.constData(), 1, LogMsgBytes.size(), logFilePtr); fflush(logFilePtr); } #endif }
const QHash<int, QString> &TCriteriaData::formats() { QHash<int, QString> *ret = formatVector.fetchAndAddOrdered(0); if (!ret) { ret = new QHash<int, QString>(); ret->insert(TSql::Equal, "=%1"); ret->insert(TSql::NotEqual, "<>%1"); ret->insert(TSql::LessThan, "<%1"); ret->insert(TSql::GreaterThan, ">%1"); ret->insert(TSql::LessEqual, "<=%1"); ret->insert(TSql::GreaterEqual, ">=%1"); ret->insert(TSql::IsNull, " IS NULL"); ret->insert(TSql::IsNotNull, " IS NOT NULL"); ret->insert(TSql::Like, " LIKE %1"); ret->insert(TSql::NotLike, " NOT LIKE %1"); ret->insert(TSql::LikeEscape, " LIKE %1 ESCAPE %2"); ret->insert(TSql::NotLikeEscape, " NOT LIKE %1 ESCAPE %2"); ret->insert(TSql::ILike, " ILIKE %1"); ret->insert(TSql::NotILike, " NOT ILIKE %1"); ret->insert(TSql::ILikeEscape, " ILIKE %1 ESCAPE %2"); ret->insert(TSql::NotILikeEscape, " NOT ILIKE %1 ESCAPE %2"); ret->insert(TSql::In, " IN (%1)"); ret->insert(TSql::NotIn, " NOT IN (%1)"); ret->insert(TSql::Between, " BETWEEN %1 AND %2"); ret->insert(TSql::NotBetween, " NOT BETWEEN %1 AND %2"); ret->insert(TSql::Any, "ANY (%1)"); ret->insert(TSql::All, "ALL (%1)"); if (!formatVector.testAndSetOrdered(0, ret)) { delete ret; ret = formatVector.fetchAndAddOrdered(0); } } return *ret; }
void itkDCMTKDataImageReaderPrivate::initialiseStatic() { if ( ! mutex) { QMutex * m = new QMutex(); if ( ! mutex.testAndSetOrdered(NULL, m)) delete m; } QMutexLocker lock(mutex); if ( ! ioThreads ) ioThreads = new QList<QThread*>(); if ( ! ioPointers ) ioPointers = new QList<itk::DCMTKImageIO::Pointer>(); }
int main(int argc, char *argv[]) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); #endif qInstallMessageHandler(logMessageHandler); QApplication a(argc, argv); a.setApplicationName("qTox"); a.setOrganizationName("Tox"); a.setApplicationVersion("\nGit commit: " + QString(GIT_VERSION)); #if defined(Q_OS_OSX) //osx::moveToAppFolder(); TODO: Add setting to enable this feature. osx::migrateProfiles(); #endif qsrand(time(0)); Settings::getInstance(); Translator::translate(); // Process arguments QCommandLineParser parser; parser.setApplicationDescription("qTox, version: " + QString(GIT_VERSION) + "\nBuilt: " + __TIME__ + " " + __DATE__); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("uri", QObject::tr("Tox URI to parse")); parser.addOption(QCommandLineOption("p", QObject::tr("Starts new instance and loads specified profile."), QObject::tr("profile"))); parser.process(a); IPC& ipc = IPC::getInstance(); if (sodium_init() < 0) // For the auto-updater { qCritical() << "Can't init libsodium"; return EXIT_FAILURE; } #ifdef LOG_TO_FILE QString logFileDir = Settings::getInstance().getAppCacheDirPath(); QDir(logFileDir).mkpath("."); QString logfile = logFileDir + "qtox.log"; FILE * mainLogFilePtr = fopen(logfile.toLocal8Bit().constData(), "a"); // Trim log file if over 1MB if (QFileInfo(logfile).size() > 1000000) { qDebug() << "Log file over 1MB, rotating..."; // close old logfile (need for windows) if (mainLogFilePtr) fclose(mainLogFilePtr); QDir dir (logFileDir); // Check if log.1 already exists, and if so, delete it if (dir.remove(logFileDir + "qtox.log.1")) qDebug() << "Removed old log successfully"; else qWarning() << "Unable to remove old log file"; if (!dir.rename(logFileDir + "qtox.log", logFileDir + "qtox.log.1")) qCritical() << "Unable to move logs"; // open a new logfile mainLogFilePtr = fopen(logfile.toLocal8Bit().constData(), "a"); } if (!mainLogFilePtr) qCritical() << "Couldn't open logfile" << logfile; logFileFile.store(mainLogFilePtr); // atomically set the logFile #endif // Windows platform plugins DLL hell fix QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath()); a.addLibraryPath("platforms"); qDebug() << "built on: " << __TIME__ << __DATE__ << "(" << TIMESTAMP << ")"; qDebug() << "commit: " << GIT_VERSION << "\n"; // Install Unicode 6.1 supporting font QFontDatabase::addApplicationFont("://DejaVuSans.ttf"); // Check whether we have an update waiting to be installed #if AUTOUPDATE_ENABLED if (AutoUpdater::isLocalUpdateReady()) AutoUpdater::installLocalUpdate(); ///< NORETURN #endif QString profileName; bool autoLogin = Settings::getInstance().getAutoLogin(); // Inter-process communication ipc.registerEventHandler("uri", &toxURIEventHandler); ipc.registerEventHandler("save", &toxSaveEventHandler); ipc.registerEventHandler("activate", &toxActivateEventHandler); uint32_t ipcDest = 0; QString eventType, firstParam; if (parser.isSet("p")) { profileName = parser.value("p"); if (!Profile::exists(profileName)) { qCritical() << "-p profile" << profileName + ".tox" << "doesn't exist"; return EXIT_FAILURE; } ipcDest = Settings::makeProfileId(profileName); autoLogin = true; } else { profileName = Settings::getInstance().getCurrentProfile(); } if (parser.positionalArguments().size() == 0) { eventType = "activate"; } else { firstParam = parser.positionalArguments()[0]; // Tox URIs. If there's already another qTox instance running, we ask it to handle the URI and we exit // Otherwise we start a new qTox instance and process it ourselves if (firstParam.startsWith("tox:")) { eventType = "uri"; } else if (firstParam.endsWith(".tox")) { eventType = "save"; } else { qCritical() << "Invalid argument"; return EXIT_FAILURE; } } if (!ipc.isCurrentOwner()) { time_t event = ipc.postEvent(eventType, firstParam.toUtf8(), ipcDest); // If someone else processed it, we're done here, no need to actually start qTox if (ipc.waitUntilAccepted(event, 2)) { qDebug() << "Event" << eventType << "was handled by other client."; return EXIT_SUCCESS; } } // Autologin if (autoLogin) { if (Profile::exists(profileName)) { if (!Profile::isEncrypted(profileName)) { Profile* profile = Profile::loadProfile(profileName); if (profile) Nexus::getInstance().setProfile(profile); } Settings::getInstance().setCurrentProfile(profileName); } } Nexus::getInstance().start(); // Event was not handled by already running instance therefore we handle it ourselves if (eventType == "uri") handleToxURI(firstParam.toUtf8()); else if (eventType == "save") handleToxSave(firstParam.toUtf8()); // Run int errorcode = a.exec(); Nexus::destroyInstance(); CameraSource::destroyInstance(); Settings::destroyInstance(); qDebug() << "Clean exit with status" << errorcode; #ifdef LOG_TO_FILE logFileFile.store(nullptr); // atomically disable logging to file fclose(mainLogFilePtr); #endif return errorcode; }
void logMessageHandler(QtMsgType type, const QMessageLogContext& ctxt, const QString& msg) { // Silence qWarning spam due to bug in QTextBrowser (trying to open a file for base64 images) if (ctxt.function == QString("virtual bool QFSFileEngine::open(QIODevice::OpenMode)") && msg == QString("QFSFileEngine::open: No file name specified")) return; QString file = ctxt.file; // We're not using QT_MESSAGELOG_FILE here, because that can be 0, NULL, or // nullptr in release builds. QString path = QString(__FILE__); path = path.left(path.lastIndexOf('/') + 1); if (file.startsWith(path)) { file = file.mid(path.length()); } // Time should be in UTC to save user privacy on log sharing QTime time = QDateTime::currentDateTime().toUTC().time(); QString LogMsg = QString("[%1 UTC] %2:%3 : ").arg(time.toString("HH:mm:ss.zzz")).arg(file).arg(ctxt.line); switch (type) { case QtDebugMsg: LogMsg += "Debug"; break; case QtWarningMsg: LogMsg += "Warning"; break; case QtCriticalMsg: LogMsg += "Critical"; break; case QtFatalMsg: LogMsg += "Fatal"; break; default: break; } LogMsg += ": " + msg + "\n"; QByteArray LogMsgBytes = LogMsg.toUtf8(); fwrite(LogMsgBytes.constData(), 1, LogMsgBytes.size(), stderr); #ifdef LOG_TO_FILE FILE* logFilePtr = logFileFile.load(); // atomically load the file pointer if (!logFilePtr) { logBufferMutex->lock(); if (logBuffer) logBuffer->append(LogMsgBytes); logBufferMutex->unlock(); } else { logBufferMutex->lock(); if (logBuffer) { // empty logBuffer to file foreach (QByteArray msg, *logBuffer) fwrite(msg.constData(), 1, msg.size(), logFilePtr); delete logBuffer; // no longer needed logBuffer = nullptr; } logBufferMutex->unlock(); fwrite(LogMsgBytes.constData(), 1, LogMsgBytes.size(), logFilePtr); fflush(logFilePtr); } #endif }