Revision control
Copy as Markdown
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// Qt-Security score:significant reason:default
#ifndef QCOREAPPLICATION_P_H
#define QCOREAPPLICATION_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include "QtCore/qcoreapplication.h"
#if QT_CONFIG(commandlineparser)
#include "QtCore/qcommandlineoption.h"
#endif
#include "QtCore/qreadwritelock.h"
#include "QtCore/qtranslator.h"
#ifndef QT_NO_QOBJECT
#include "private/qobject_p.h"
#include "QtCore/qthread.h"
#include "private/qlocking_p.h"
#endif
#ifdef Q_OS_MACOS
#include "private/qcore_mac_p.h"
#endif
QT_BEGIN_NAMESPACE
typedef QList<QTranslator*> QTranslatorList;
class QAbstractEventDispatcher;
#ifndef QT_NO_QOBJECT
class QEvent;
#endif
class Q_CORE_EXPORT QCoreApplicationPrivate
#ifndef QT_NO_QOBJECT
: public QObjectPrivate
#endif
{
Q_DECLARE_PUBLIC(QCoreApplication)
public:
enum Type : quint8 {
Tty,
Gui
};
QCoreApplicationPrivate(int &aargc, char **aargv);
// If not inheriting from QObjectPrivate: force this class to be polymorphic
#ifdef QT_NO_QOBJECT
virtual
#endif
~QCoreApplicationPrivate();
void init();
QString appName() const;
QString appVersion() const;
#ifdef Q_OS_DARWIN
static QString infoDictionaryStringProperty(const QString &propertyName);
#endif
#ifdef Q_OS_WINDOWS
void initDebuggingConsole();
void cleanupDebuggingConsole();
#endif
static void initLocale();
static bool checkInstance(const char *method);
#if QT_CONFIG(commandlineparser)
virtual void addQtOptions(QList<QCommandLineOption> *options);
#endif
#ifndef QT_NO_QOBJECT
bool sendThroughApplicationEventFilters(QObject *, QEvent *);
static bool sendThroughObjectEventFilters(QObject *, QEvent *);
static bool notify_helper(QObject *, QEvent *);
static inline void setEventSpontaneous(QEvent *e, bool spontaneous) { e->m_spont = spontaneous; }
virtual void createEventDispatcher();
virtual void eventDispatcherReady();
virtual bool compressEvent(QEvent *event, QObject *receiver, QPostEventList *postedEvents);
static void removePostedEvent(QEvent *);
#ifdef Q_OS_WIN
static void removePostedTimerEvent(QObject *object, int timerId);
#endif
QAtomicInt quitLockRef;
void ref();
void deref();
virtual bool canQuitAutomatically();
void quitAutomatically();
virtual void quit();
static QBasicAtomicPointer<QThread> theMainThread;
static QBasicAtomicPointer<void> theMainThreadId;
static QThread *mainThread();
static void sendPostedEvents(QObject *receiver, int event_type, QThreadData *data);
static void checkReceiverThread(QObject *receiver, const char *caller)
{
# ifndef QT_NO_DEBUG
QThread *currentThread = QThread::currentThread();
QThread *thr = receiver->thread();
Q_ASSERT_X(currentThread == thr || !thr, caller,
qPrintable(QString::fromLatin1("Cannot send events to objects owned by a different thread. "
"Current thread %1. Receiver '%2' was created in thread %3").arg(
QDebug::toString(currentThread), QDebug::toString(receiver), QDebug::toString(thr))));
Q_UNUSED(currentThread);
Q_UNUSED(thr);
# else
Q_UNUSED(receiver);
# endif
Q_UNUSED(caller);
}
void cleanupThreadData();
struct QPostEventListLocker
{
QThreadData *threadData;
std::unique_lock<QMutex> locker;
void unlock() { locker.unlock(); }
};
static QPostEventListLocker lockThreadPostEventList(QObject *object);
#endif // QT_NO_QOBJECT
int &argc;
char **argv;
#if defined(Q_OS_WIN)
// store unmodified arguments for QCoreApplication::arguments()
int origArgc = 0;
std::unique_ptr<char *[]> origArgv;
bool consoleAllocated = false;
static void *mainInstanceHandle; // HINSTANCE without <windows.h>
#endif
Type application_type = Tty;
#ifndef QT_NO_QOBJECT
void execCleanup();
bool in_exec = false;
bool aboutToQuitEmitted = false;
bool threadData_clean = false;
static void destroyEventDispatcher();
static QAbstractEventDispatcher *eventDispatcher;
static bool is_app_running;
static bool is_app_closing;
#endif
#ifndef QT_NO_TRANSLATION
QTranslatorList translators;
QReadWriteLock translateMutex;
static bool isTranslatorInstalled(QTranslator *translator);
#endif
static bool setuidAllowed;
static uint attribs;
static inline bool testAttribute(uint flag) { return attribs & (1 << flag); }
void processCommandLineArguments();
QString cachedApplicationFilePath;
QString qmljs_debug_arguments; // a string containing arguments for js/qml debugging.
#ifdef QT_NO_QOBJECT
QCoreApplication *q_ptr = nullptr;
#endif
};
QT_END_NAMESPACE
#endif // QCOREAPPLICATION_P_H