summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp2
-rw-r--r--src/corelib/kernel/qeventdispatcher_win.cpp69
-rw-r--r--src/corelib/kernel/qeventdispatcher_win_p.h3
-rw-r--r--src/corelib/kernel/qjni.cpp248
-rw-r--r--src/corelib/kernel/qjni_p.h48
-rw-r--r--src/corelib/kernel/qjnihelpers.cpp38
-rw-r--r--src/corelib/kernel/qjnihelpers_p.h3
-rw-r--r--src/corelib/kernel/qmetaobject.h6
-rw-r--r--src/corelib/kernel/qsystemerror.cpp4
-rw-r--r--src/corelib/kernel/qtranslator.cpp5
-rw-r--r--src/corelib/kernel/qvariant.h26
11 files changed, 265 insertions, 187 deletions
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 45647f2056..77900ba906 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -714,9 +714,7 @@ void QCoreApplication::init()
Q_ASSERT_X(!self, "QCoreApplication", "there should be only one application object");
QCoreApplication::self = this;
-#ifndef QT_BOOTSTRAPPED
QLoggingRegistry::instance()->init();
-#endif
#ifndef QT_NO_QOBJECT
// use the event dispatcher created by the app programmer (if any)
diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp
index a3d00faf31..1a8bb381aa 100644
--- a/src/corelib/kernel/qeventdispatcher_win.cpp
+++ b/src/corelib/kernel/qeventdispatcher_win.cpp
@@ -307,8 +307,9 @@ static void resolveTimerAPI()
}
QEventDispatcherWin32Private::QEventDispatcherWin32Private()
- : threadId(GetCurrentThreadId()), interrupt(false), internalHwnd(0), getMessageHook(0),
- serialNumber(0), lastSerialNumber(0), sendPostedEventsWindowsTimerId(0), wakeUps(0)
+ : threadId(GetCurrentThreadId()), interrupt(false), closingDown(false), internalHwnd(0),
+ getMessageHook(0), serialNumber(0), lastSerialNumber(0), sendPostedEventsWindowsTimerId(0),
+ wakeUps(0)
{
resolveTimerAPI();
}
@@ -434,9 +435,10 @@ static inline UINT inputTimerMask()
LRESULT QT_WIN_CALLBACK qt_GetMessageHook(int code, WPARAM wp, LPARAM lp)
{
+ QEventDispatcherWin32 *q = qobject_cast<QEventDispatcherWin32 *>(QAbstractEventDispatcher::instance());
+ Q_ASSERT(q != 0);
+
if (wp == PM_REMOVE) {
- QEventDispatcherWin32 *q = qobject_cast<QEventDispatcherWin32 *>(QAbstractEventDispatcher::instance());
- Q_ASSERT(q != 0);
if (q) {
MSG *msg = (MSG *) lp;
QEventDispatcherWin32Private *d = q->d_func();
@@ -472,7 +474,7 @@ LRESULT QT_WIN_CALLBACK qt_GetMessageHook(int code, WPARAM wp, LPARAM lp)
#ifdef Q_OS_WINCE
return 0;
#else
- return CallNextHookEx(0, code, wp, lp);
+ return q->d_func()->getMessageHook ? CallNextHookEx(0, code, wp, lp) : 0;
#endif
}
@@ -643,15 +645,7 @@ void QEventDispatcherWin32::createInternalHwnd()
return;
d->internalHwnd = qt_create_internal_window(this);
-#ifndef Q_OS_WINCE
- // setup GetMessage hook needed to drive our posted events
- d->getMessageHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) qt_GetMessageHook, NULL, GetCurrentThreadId());
- if (!d->getMessageHook) {
- int errorCode = GetLastError();
- qFatal("Qt: INTERNAL ERROR: failed to install GetMessage hook: %d, %s",
- errorCode, qPrintable(qt_error_string(errorCode)));
- }
-#endif
+ installMessageHook();
// register all socket notifiers
QList<int> sockets = (d->sn_read.keys().toSet()
@@ -665,6 +659,35 @@ void QEventDispatcherWin32::createInternalHwnd()
d->registerTimer(d->timerVec.at(i));
}
+void QEventDispatcherWin32::installMessageHook()
+{
+ Q_D(QEventDispatcherWin32);
+
+ if (d->getMessageHook)
+ return;
+
+#ifndef Q_OS_WINCE
+ // setup GetMessage hook needed to drive our posted events
+ d->getMessageHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) qt_GetMessageHook, NULL, GetCurrentThreadId());
+ if (!d->getMessageHook) {
+ int errorCode = GetLastError();
+ qFatal("Qt: INTERNAL ERROR: failed to install GetMessage hook: %d, %s",
+ errorCode, qPrintable(qt_error_string(errorCode)));
+ }
+#endif
+}
+
+void QEventDispatcherWin32::uninstallMessageHook()
+{
+ Q_D(QEventDispatcherWin32);
+
+#ifndef Q_OS_WINCE
+ if (d->getMessageHook)
+ UnhookWindowsHookEx(d->getMessageHook);
+#endif
+ d->getMessageHook = 0;
+}
+
QEventDispatcherWin32::QEventDispatcherWin32(QObject *parent)
: QAbstractEventDispatcher(*new QEventDispatcherWin32Private, parent)
{
@@ -750,10 +773,9 @@ bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags)
}
}
if (haveMessage) {
-#ifdef Q_OS_WINCE
// WinCE doesn't support hooks at all, so we have to call this by hand :(
- (void) qt_GetMessageHook(0, PM_REMOVE, (LPARAM) &msg);
-#endif
+ if (!d->getMessageHook)
+ (void) qt_GetMessageHook(0, PM_REMOVE, (LPARAM) &msg);
if (d->internalHwnd == msg.hwnd && msg.message == WM_QT_SENDPOSTEDEVENTS) {
if (seenWM_QT_SENDPOSTEDEVENTS) {
@@ -910,6 +932,11 @@ void QEventDispatcherWin32::registerTimer(int timerId, int interval, Qt::TimerTy
Q_D(QEventDispatcherWin32);
+ // exiting ... do not register new timers
+ // (QCoreApplication::closingDown() is set too late to be used here)
+ if (d->closingDown)
+ return;
+
WinTimerInfo *t = new WinTimerInfo;
t->dispatcher = this;
t->timerId = timerId;
@@ -1134,11 +1161,9 @@ void QEventDispatcherWin32::closingDown()
d->timerVec.clear();
d->timerDict.clear();
-#ifndef Q_OS_WINCE
- if (d->getMessageHook)
- UnhookWindowsHookEx(d->getMessageHook);
- d->getMessageHook = 0;
-#endif
+ d->closingDown = true;
+
+ uninstallMessageHook();
}
bool QEventDispatcherWin32::event(QEvent *e)
diff --git a/src/corelib/kernel/qeventdispatcher_win_p.h b/src/corelib/kernel/qeventdispatcher_win_p.h
index 369c276615..8022299a76 100644
--- a/src/corelib/kernel/qeventdispatcher_win_p.h
+++ b/src/corelib/kernel/qeventdispatcher_win_p.h
@@ -67,6 +67,8 @@ class Q_CORE_EXPORT QEventDispatcherWin32 : public QAbstractEventDispatcher
protected:
void createInternalHwnd();
+ void installMessageHook();
+ void uninstallMessageHook();
public:
explicit QEventDispatcherWin32(QObject *parent = 0);
@@ -145,6 +147,7 @@ public:
DWORD threadId;
bool interrupt;
+ bool closingDown;
// internal window handle used for socketnotifiers/timers/etc
HWND internalHwnd;
diff --git a/src/corelib/kernel/qjni.cpp b/src/corelib/kernel/qjni.cpp
index 452e3464d6..b179323fdc 100644
--- a/src/corelib/kernel/qjni.cpp
+++ b/src/corelib/kernel/qjni.cpp
@@ -311,7 +311,7 @@ QJNIObjectPrivate::QJNIObjectPrivate(const char *className, const char *sig, ...
}
}
-QJNIObjectPrivate::QJNIObjectPrivate(const char *className, const char *sig, va_list args)
+QJNIObjectPrivate::QJNIObjectPrivate(const char *className, const char *sig, const QVaListPrivate &args)
: d(new QJNIObjectData())
{
QJNIEnvironmentPrivate env;
@@ -369,7 +369,7 @@ QJNIObjectPrivate::QJNIObjectPrivate(jclass clazz, const char *sig, ...)
}
}
-QJNIObjectPrivate::QJNIObjectPrivate(jclass clazz, const char *sig, va_list args)
+QJNIObjectPrivate::QJNIObjectPrivate(jclass clazz, const char *sig, const QVaListPrivate &args)
: d(new QJNIObjectData())
{
QJNIEnvironmentPrivate env;
@@ -402,7 +402,7 @@ QJNIObjectPrivate::QJNIObjectPrivate(jobject obj)
}
template <>
-void QJNIObjectPrivate::callMethod<void>(const char *methodName, const char *sig, va_list args) const
+void QJNIObjectPrivate::callMethodV<void>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jmethodID id = getCachedMethodID(env, d->m_jclass, methodName, sig);
@@ -416,12 +416,12 @@ void QJNIObjectPrivate::callMethod<void>(const char *methodName, const char *sig
{
va_list args;
va_start(args, sig);
- callMethod<void>(methodName, sig, args);
+ callMethodV<void>(methodName, sig, args);
va_end(args);
}
template <>
-jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName, const char *sig, va_list args) const
+jboolean QJNIObjectPrivate::callMethodV<jboolean>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jboolean res = 0;
@@ -437,13 +437,13 @@ jboolean QJNIObjectPrivate::callMethod<jboolean>(const char *methodName, const c
{
va_list args;
va_start(args, sig);
- jboolean res = callMethod<jboolean>(methodName, sig, args);
+ jboolean res = callMethodV<jboolean>(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName, const char *sig, va_list args) const
+jbyte QJNIObjectPrivate::callMethodV<jbyte>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jbyte res = 0;
@@ -459,13 +459,13 @@ jbyte QJNIObjectPrivate::callMethod<jbyte>(const char *methodName, const char *s
{
va_list args;
va_start(args, sig);
- jbyte res = callMethod<jbyte>(methodName, sig, args);
+ jbyte res = callMethodV<jbyte>(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName, const char *sig, va_list args) const
+jchar QJNIObjectPrivate::callMethodV<jchar>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jchar res = 0;
@@ -481,13 +481,13 @@ jchar QJNIObjectPrivate::callMethod<jchar>(const char *methodName, const char *s
{
va_list args;
va_start(args, sig);
- jchar res = callMethod<jchar>(methodName, sig, args);
+ jchar res = callMethodV<jchar>(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName, const char *sig, va_list args) const
+jshort QJNIObjectPrivate::callMethodV<jshort>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jshort res = 0;
@@ -503,13 +503,13 @@ jshort QJNIObjectPrivate::callMethod<jshort>(const char *methodName, const char
{
va_list args;
va_start(args, sig);
- jshort res = callMethod<jshort>(methodName, sig, args);
+ jshort res = callMethodV<jshort>(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jint QJNIObjectPrivate::callMethod<jint>(const char *methodName, const char *sig, va_list args) const
+jint QJNIObjectPrivate::callMethodV<jint>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jint res = 0;
@@ -525,13 +525,13 @@ jint QJNIObjectPrivate::callMethod<jint>(const char *methodName, const char *sig
{
va_list args;
va_start(args, sig);
- jint res = callMethod<jint>(methodName, sig, args);
+ jint res = callMethodV<jint>(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName, const char *sig, va_list args) const
+jlong QJNIObjectPrivate::callMethodV<jlong>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jlong res = 0;
@@ -547,13 +547,13 @@ jlong QJNIObjectPrivate::callMethod<jlong>(const char *methodName, const char *s
{
va_list args;
va_start(args, sig);
- jlong res = callMethod<jlong>(methodName, sig, args);
+ jlong res = callMethodV<jlong>(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName, const char *sig, va_list args) const
+jfloat QJNIObjectPrivate::callMethodV<jfloat>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jfloat res = 0.f;
@@ -569,13 +569,13 @@ jfloat QJNIObjectPrivate::callMethod<jfloat>(const char *methodName, const char
{
va_list args;
va_start(args, sig);
- jfloat res = callMethod<jfloat>(methodName, sig, args);
+ jfloat res = callMethodV<jfloat>(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName, const char *sig, va_list args) const
+jdouble QJNIObjectPrivate::callMethodV<jdouble>(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jdouble res = 0.;
@@ -591,7 +591,7 @@ jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName, const cha
{
va_list args;
va_start(args, sig);
- jdouble res = callMethod<jdouble>(methodName, sig, args);
+ jdouble res = callMethodV<jdouble>(methodName, sig, args);
va_end(args);
return res;
}
@@ -651,10 +651,10 @@ jdouble QJNIObjectPrivate::callMethod<jdouble>(const char *methodName) const
}
template <>
-void QJNIObjectPrivate::callStaticMethod<void>(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+void QJNIObjectPrivate::callStaticMethodV<void>(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jclass clazz = loadClass(className, env);
@@ -674,15 +674,15 @@ void QJNIObjectPrivate::callStaticMethod<void>(const char *className,
{
va_list args;
va_start(args, sig);
- callStaticMethod<void>(className, methodName, sig, args);
+ callStaticMethodV<void>(className, methodName, sig, args);
va_end(args);
}
template <>
-void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+void QJNIObjectPrivate::callStaticMethodV<void>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jmethodID id = getCachedMethodID(env, clazz, methodName, sig, true);
@@ -699,15 +699,15 @@ void QJNIObjectPrivate::callStaticMethod<void>(jclass clazz,
{
va_list args;
va_start(args, sig);
- callStaticMethod<void>(clazz, methodName, sig, args);
+ callStaticMethodV<void>(clazz, methodName, sig, args);
va_end(args);
}
template <>
-jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jboolean res = 0;
@@ -730,16 +730,16 @@ jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(const char *className,
{
va_list args;
va_start(args, sig);
- jboolean res = callStaticMethod<jboolean>(className, methodName, sig, args);
+ jboolean res = callStaticMethodV<jboolean>(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jboolean QJNIObjectPrivate::callStaticMethodV<jboolean>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jboolean res = 0;
@@ -759,16 +759,16 @@ jboolean QJNIObjectPrivate::callStaticMethod<jboolean>(jclass clazz,
{
va_list args;
va_start(args, sig);
- jboolean res = callStaticMethod<jboolean>(clazz, methodName, sig, args);
+ jboolean res = callStaticMethodV<jboolean>(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jbyte res = 0;
@@ -791,16 +791,16 @@ jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(const char *className,
{
va_list args;
va_start(args, sig);
- jbyte res = callStaticMethod<jbyte>(className, methodName, sig, args);
+ jbyte res = callStaticMethodV<jbyte>(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jbyte QJNIObjectPrivate::callStaticMethodV<jbyte>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jbyte res = 0;
@@ -820,16 +820,16 @@ jbyte QJNIObjectPrivate::callStaticMethod<jbyte>(jclass clazz,
{
va_list args;
va_start(args, sig);
- jbyte res = callStaticMethod<jbyte>(clazz, methodName, sig, args);
+ jbyte res = callStaticMethodV<jbyte>(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jchar QJNIObjectPrivate::callStaticMethodV<jchar>(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jchar res = 0;
@@ -852,16 +852,16 @@ jchar QJNIObjectPrivate::callStaticMethod<jchar>(const char *className,
{
va_list args;
va_start(args, sig);
- jchar res = callStaticMethod<jchar>(className, methodName, sig, args);
+ jchar res = callStaticMethodV<jchar>(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jchar QJNIObjectPrivate::callStaticMethodV<jchar>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jchar res = 0;
@@ -881,16 +881,16 @@ jchar QJNIObjectPrivate::callStaticMethod<jchar>(jclass clazz,
{
va_list args;
va_start(args, sig);
- jchar res = callStaticMethod<jchar>(clazz, methodName, sig, args);
+ jchar res = callStaticMethodV<jchar>(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jshort QJNIObjectPrivate::callStaticMethodV<jshort>(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jshort res = 0;
@@ -913,16 +913,16 @@ jshort QJNIObjectPrivate::callStaticMethod<jshort>(const char *className,
{
va_list args;
va_start(args, sig);
- jshort res = callStaticMethod<jshort>(className, methodName, sig, args);
+ jshort res = callStaticMethodV<jshort>(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jshort QJNIObjectPrivate::callStaticMethodV<jshort>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jshort res = 0;
@@ -942,16 +942,16 @@ jshort QJNIObjectPrivate::callStaticMethod<jshort>(jclass clazz,
{
va_list args;
va_start(args, sig);
- jshort res = callStaticMethod<jshort>(clazz, methodName, sig, args);
+ jshort res = callStaticMethodV<jshort>(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jint QJNIObjectPrivate::callStaticMethodV<jint>(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jint res = 0;
@@ -974,16 +974,16 @@ jint QJNIObjectPrivate::callStaticMethod<jint>(const char *className,
{
va_list args;
va_start(args, sig);
- jint res = callStaticMethod<jint>(className, methodName, sig, args);
+ jint res = callStaticMethodV<jint>(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jint QJNIObjectPrivate::callStaticMethodV<jint>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jint res = 0;
@@ -1003,16 +1003,16 @@ jint QJNIObjectPrivate::callStaticMethod<jint>(jclass clazz,
{
va_list args;
va_start(args, sig);
- jint res = callStaticMethod<jint>(clazz, methodName, sig, args);
+ jint res = callStaticMethodV<jint>(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jlong QJNIObjectPrivate::callStaticMethodV<jlong>(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jlong res = 0;
@@ -1035,16 +1035,16 @@ jlong QJNIObjectPrivate::callStaticMethod<jlong>(const char *className,
{
va_list args;
va_start(args, sig);
- jlong res = callStaticMethod<jlong>(className, methodName, sig, args);
+ jlong res = callStaticMethodV<jlong>(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jlong QJNIObjectPrivate::callStaticMethodV<jlong>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jlong res = 0;
@@ -1064,16 +1064,16 @@ jlong QJNIObjectPrivate::callStaticMethod<jlong>(jclass clazz,
{
va_list args;
va_start(args, sig);
- jlong res = callStaticMethod<jlong>(clazz, methodName, sig, args);
+ jlong res = callStaticMethodV<jlong>(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jfloat res = 0.f;
@@ -1096,16 +1096,16 @@ jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(const char *className,
{
va_list args;
va_start(args, sig);
- jfloat res = callStaticMethod<jfloat>(className, methodName, sig, args);
+ jfloat res = callStaticMethodV<jfloat>(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jfloat QJNIObjectPrivate::callStaticMethodV<jfloat>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jfloat res = 0.f;
@@ -1125,16 +1125,16 @@ jfloat QJNIObjectPrivate::callStaticMethod<jfloat>(jclass clazz,
{
va_list args;
va_start(args, sig);
- jfloat res = callStaticMethod<jfloat>(clazz, methodName, sig, args);
+ jfloat res = callStaticMethodV<jfloat>(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jdouble res = 0.;
@@ -1157,16 +1157,16 @@ jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(const char *className,
{
va_list args;
va_start(args, sig);
- jdouble res = callStaticMethod<jdouble>(className, methodName, sig, args);
+ jdouble res = callStaticMethodV<jdouble>(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jdouble QJNIObjectPrivate::callStaticMethodV<jdouble>(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jdouble res = 0.;
@@ -1186,7 +1186,7 @@ jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz,
{
va_list args;
va_start(args, sig);
- jdouble res = callStaticMethod<jdouble>(clazz, methodName, sig, args);
+ jdouble res = callStaticMethodV<jdouble>(clazz, methodName, sig, args);
va_end(args);
return res;
}
@@ -1299,9 +1299,9 @@ jdouble QJNIObjectPrivate::callStaticMethod<jdouble>(jclass clazz, const char *m
return callStaticMethod<jdouble>(clazz, methodName, "()D");
}
-QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod(const char *methodName,
- const char *sig,
- va_list args) const
+QJNIObjectPrivate QJNIObjectPrivate::callObjectMethodV(const char *methodName,
+ const char *sig,
+ va_list args) const
{
QJNIEnvironmentPrivate env;
jobject res = 0;
@@ -1323,7 +1323,7 @@ QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod(const char *methodName,
{
va_list args;
va_start(args, sig);
- QJNIObjectPrivate res = callObjectMethod(methodName, sig, args);
+ QJNIObjectPrivate res = callObjectMethodV(methodName, sig, args);
va_end(args);
return res;
}
@@ -1376,10 +1376,10 @@ QJNIObjectPrivate QJNIObjectPrivate::callObjectMethod<jdoubleArray>(const char *
return callObjectMethod(methodName, "()[D");
}
-QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethod(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethodV(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jobject res = 0;
@@ -1405,15 +1405,15 @@ QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethod(const char *classNam
{
va_list args;
va_start(args, sig);
- QJNIObjectPrivate res = callStaticObjectMethod(className, methodName, sig, args);
+ QJNIObjectPrivate res = callStaticObjectMethodV(className, methodName, sig, args);
va_end(args);
return res;
}
-QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethod(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethodV(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jobject res = 0;
@@ -1436,7 +1436,7 @@ QJNIObjectPrivate QJNIObjectPrivate::callStaticObjectMethod(jclass clazz,
{
va_list args;
va_start(args, sig);
- QJNIObjectPrivate res = callStaticObjectMethod(clazz, methodName, sig, args);
+ QJNIObjectPrivate res = callStaticObjectMethodV(clazz, methodName, sig, args);
va_end(args);
return res;
}
diff --git a/src/corelib/kernel/qjni_p.h b/src/corelib/kernel/qjni_p.h
index 19f2cf7601..5f573624c6 100644
--- a/src/corelib/kernel/qjni_p.h
+++ b/src/corelib/kernel/qjni_p.h
@@ -186,31 +186,37 @@ public:
private:
friend class QAndroidJniObject;
- QJNIObjectPrivate(const char *className, const char *sig, va_list args);
- QJNIObjectPrivate(jclass clazz, const char *sig, va_list args);
+ struct QVaListPrivate { operator va_list &() const { return m_args; } va_list &m_args; };
+
+ QJNIObjectPrivate(const char *className, const char *sig, const QVaListPrivate &args);
+ QJNIObjectPrivate(jclass clazz, const char *sig, const QVaListPrivate &args);
template <typename T>
- T callMethod(const char *methodName,
- const char *sig,
- va_list args) const;
- QJNIObjectPrivate callObjectMethod(const char *methodName,
- const char *sig,
- va_list args) const;
+ T callMethodV(const char *methodName,
+ const char *sig,
+ va_list args) const;
+ QJNIObjectPrivate callObjectMethodV(const char *methodName,
+ const char *sig,
+ va_list args) const;
template <typename T>
- static T callStaticMethod(const char *className,
- const char *methodName,
- const char *sig, va_list args);
+ static T callStaticMethodV(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args);
template <typename T>
- static T callStaticMethod(jclass clazz,
- const char *methodName,
- const char *sig, va_list args);
- static QJNIObjectPrivate callStaticObjectMethod(const char *className,
- const char *methodName,
- const char *sig, va_list args);
-
- static QJNIObjectPrivate callStaticObjectMethod(jclass clazz,
- const char *methodName,
- const char *sig, va_list args);
+ static T callStaticMethodV(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args);
+ static QJNIObjectPrivate callStaticObjectMethodV(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args);
+
+ static QJNIObjectPrivate callStaticObjectMethodV(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args);
bool isSameObject(jobject obj) const;
bool isSameObject(const QJNIObjectPrivate &other) const;
diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp
index c82b5ca033..d3bbce305a 100644
--- a/src/corelib/kernel/qjnihelpers.cpp
+++ b/src/corelib/kernel/qjnihelpers.cpp
@@ -34,6 +34,7 @@
#include "qjnihelpers_p.h"
#include "qmutex.h"
#include "qlist.h"
+#include <QtCore/qrunnable.h>
QT_BEGIN_NAMESPACE
@@ -41,6 +42,19 @@ static JavaVM *g_javaVM = Q_NULLPTR;
static jobject g_jActivity = Q_NULLPTR;
static jobject g_jClassLoader = Q_NULLPTR;
static jint g_androidSdkVersion = 0;
+static jclass g_jNativeClass = Q_NULLPTR;
+static jmethodID g_runQtOnUiThreadMethodID = Q_NULLPTR;
+
+static void onAndroidUiThread(JNIEnv *, jclass, jlong thiz)
+{
+ QRunnable *runnable = reinterpret_cast<QRunnable *>(thiz);
+ if (runnable == 0)
+ return;
+
+ runnable->run();
+ if (runnable->autoDelete())
+ delete runnable;
+}
namespace {
class ActivityResultListeners
@@ -140,6 +154,22 @@ jint QtAndroidPrivate::initJNI(JavaVM *vm, JNIEnv *env)
env->DeleteLocalRef(activity);
g_javaVM = vm;
+ static const JNINativeMethod methods[] = {
+ {"onAndroidUiThread", "(J)V", reinterpret_cast<void *>(onAndroidUiThread)}
+ };
+
+ const bool regOk = (env->RegisterNatives(jQtNative, methods, sizeof(methods) / sizeof(methods[0])) == JNI_OK);
+
+ if (!regOk && exceptionCheck(env))
+ return JNI_ERR;
+
+ g_runQtOnUiThreadMethodID = env->GetStaticMethodID(jQtNative,
+ "runQtOnUiThread",
+ "(J)V");
+
+ g_jNativeClass = static_cast<jclass>(env->NewGlobalRef(jQtNative));
+ env->DeleteLocalRef(jQtNative);
+
return JNI_OK;
}
@@ -164,4 +194,12 @@ jint QtAndroidPrivate::androidSdkVersion()
return g_androidSdkVersion;
}
+void QtAndroidPrivate::runOnUiThread(QRunnable *runnable, JNIEnv *env)
+{
+ Q_ASSERT(runnable != 0);
+ env->CallStaticVoidMethod(g_jNativeClass, g_runQtOnUiThreadMethodID, reinterpret_cast<jlong>(runnable));
+ if (exceptionCheck(env) && runnable != 0 && runnable->autoDelete())
+ delete runnable;
+}
+
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qjnihelpers_p.h b/src/corelib/kernel/qjnihelpers_p.h
index 80c50ba611..6456dce4c4 100644
--- a/src/corelib/kernel/qjnihelpers_p.h
+++ b/src/corelib/kernel/qjnihelpers_p.h
@@ -50,6 +50,8 @@
QT_BEGIN_NAMESPACE
+class QRunnable;
+
namespace QtAndroidPrivate
{
class Q_CORE_EXPORT ActivityResultListener
@@ -64,6 +66,7 @@ namespace QtAndroidPrivate
Q_CORE_EXPORT jint initJNI(JavaVM *vm, JNIEnv *env);
jobject classLoader();
Q_CORE_EXPORT jint androidSdkVersion();
+ Q_CORE_EXPORT void runOnUiThread(QRunnable *runnable, JNIEnv *env);
Q_CORE_EXPORT void handleActivityResult(jint requestCode, jint resultCode, jobject data);
Q_CORE_EXPORT void registerActivityResultListener(ActivityResultListener *listener);
diff --git a/src/corelib/kernel/qmetaobject.h b/src/corelib/kernel/qmetaobject.h
index e68b899280..1faead8495 100644
--- a/src/corelib/kernel/qmetaobject.h
+++ b/src/corelib/kernel/qmetaobject.h
@@ -48,7 +48,7 @@ template <typename T> class QList;
class Q_CORE_EXPORT QMetaMethod
{
public:
- inline QMetaMethod() : mobj(0),handle(0) {}
+ Q_DECL_CONSTEXPR inline QMetaMethod() : mobj(0),handle(0) {}
QByteArray methodSignature() const;
QByteArray name() const;
@@ -204,7 +204,7 @@ inline bool operator!=(const QMetaMethod &m1, const QMetaMethod &m2)
class Q_CORE_EXPORT QMetaEnum
{
public:
- inline QMetaEnum() : mobj(0),handle(0) {}
+ Q_DECL_CONSTEXPR inline QMetaEnum() : mobj(0),handle(0) {}
const char *name() const;
bool isFlag() const;
@@ -286,7 +286,7 @@ private:
class Q_CORE_EXPORT QMetaClassInfo
{
public:
- inline QMetaClassInfo() : mobj(0),handle(0) {}
+ Q_DECL_CONSTEXPR inline QMetaClassInfo() : mobj(0),handle(0) {}
const char *name() const;
const char *value() const;
inline const QMetaObject *enclosingMetaObject() const { return mobj; }
diff --git a/src/corelib/kernel/qsystemerror.cpp b/src/corelib/kernel/qsystemerror.cpp
index 5c185e1d62..3b1d808520 100644
--- a/src/corelib/kernel/qsystemerror.cpp
+++ b/src/corelib/kernel/qsystemerror.cpp
@@ -61,11 +61,11 @@ namespace {
// version in portable code. However, it's impossible to do that if
// _GNU_SOURCE is defined so we use C++ overloading to decide what to do
// depending on the return type
- static inline QString fromstrerror_helper(int, const QByteArray &buf)
+ static inline Q_DECL_UNUSED QString fromstrerror_helper(int, const QByteArray &buf)
{
return QString::fromLocal8Bit(buf);
}
- static inline QString fromstrerror_helper(const char *str, const QByteArray &)
+ static inline Q_DECL_UNUSED QString fromstrerror_helper(const char *str, const QByteArray &)
{
return QString::fromLocal8Bit(str);
}
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index 5687a6c3a3..a2cf4a7813 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -427,9 +427,8 @@ QTranslator::~QTranslator()
directory. Returns \c true if the translation is successfully loaded;
otherwise returns \c false.
- If \a directory is not specified, the directory of the
- application's executable is used (i.e., as
- \l{QCoreApplication::}{applicationDirPath()}).
+ If \a directory is not specified, the current directory is used
+ (i.e., as \l{QDir::}{currentPath()}).
The previous contents of this translator object are discarded.
diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h
index 57e0523f7c..7dce813bb5 100644
--- a/src/corelib/kernel/qvariant.h
+++ b/src/corelib/kernel/qvariant.h
@@ -703,14 +703,15 @@ namespace QtPrivate {
{
static QSequentialIterable invoke(const QVariant &v)
{
- if (v.userType() == qMetaTypeId<QVariantList>()) {
+ const int typeId = v.userType();
+ if (typeId == qMetaTypeId<QVariantList>()) {
return QSequentialIterable(QtMetaTypePrivate::QSequentialIterableImpl(reinterpret_cast<const QVariantList*>(v.constData())));
}
- if (v.userType() == qMetaTypeId<QStringList>()) {
+ if (typeId == qMetaTypeId<QStringList>()) {
return QSequentialIterable(QtMetaTypePrivate::QSequentialIterableImpl(reinterpret_cast<const QStringList*>(v.constData())));
}
#ifndef QT_BOOTSTRAPPED
- if (v.userType() == qMetaTypeId<QByteArrayList>()) {
+ if (typeId == qMetaTypeId<QByteArrayList>()) {
return QSequentialIterable(QtMetaTypePrivate::QSequentialIterableImpl(reinterpret_cast<const QByteArrayList*>(v.constData())));
}
#endif
@@ -722,10 +723,11 @@ namespace QtPrivate {
{
static QAssociativeIterable invoke(const QVariant &v)
{
- if (v.userType() == qMetaTypeId<QVariantMap>()) {
+ const int typeId = v.userType();
+ if (typeId == qMetaTypeId<QVariantMap>()) {
return QAssociativeIterable(QtMetaTypePrivate::QAssociativeIterableImpl(reinterpret_cast<const QVariantMap*>(v.constData())));
}
- if (v.userType() == qMetaTypeId<QVariantHash>()) {
+ if (typeId == qMetaTypeId<QVariantHash>()) {
return QAssociativeIterable(QtMetaTypePrivate::QAssociativeIterableImpl(reinterpret_cast<const QVariantHash*>(v.constData())));
}
return QAssociativeIterable(v.value<QtMetaTypePrivate::QAssociativeIterableImpl>());
@@ -736,7 +738,8 @@ namespace QtPrivate {
{
static QVariantList invoke(const QVariant &v)
{
- if (QtMetaTypePrivate::isBuiltinSequentialType(v.userType()) || QMetaType::hasRegisteredConverterFunction(v.userType(), qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>())) {
+ const int typeId = v.userType();
+ if (QtMetaTypePrivate::isBuiltinSequentialType(typeId) || QMetaType::hasRegisteredConverterFunction(typeId, qMetaTypeId<QtMetaTypePrivate::QSequentialIterableImpl>())) {
QSequentialIterable iter = QVariantValueHelperInterface<QSequentialIterable>::invoke(v);
QVariantList l;
l.reserve(iter.size());
@@ -752,7 +755,8 @@ namespace QtPrivate {
{
static QVariantHash invoke(const QVariant &v)
{
- if (QtMetaTypePrivate::isBuiltinAssociativeType(v.userType()) || QMetaType::hasRegisteredConverterFunction(v.userType(), qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>())) {
+ const int typeId = v.userType();
+ if (QtMetaTypePrivate::isBuiltinAssociativeType(typeId) || QMetaType::hasRegisteredConverterFunction(typeId, qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>())) {
QAssociativeIterable iter = QVariantValueHelperInterface<QAssociativeIterable>::invoke(v);
QVariantHash l;
l.reserve(iter.size());
@@ -768,7 +772,8 @@ namespace QtPrivate {
{
static QVariantMap invoke(const QVariant &v)
{
- if (QtMetaTypePrivate::isBuiltinAssociativeType(v.userType()) || QMetaType::hasRegisteredConverterFunction(v.userType(), qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>())) {
+ const int typeId = v.userType();
+ if (QtMetaTypePrivate::isBuiltinAssociativeType(typeId) || QMetaType::hasRegisteredConverterFunction(typeId, qMetaTypeId<QtMetaTypePrivate::QAssociativeIterableImpl>())) {
QAssociativeIterable iter = QVariantValueHelperInterface<QAssociativeIterable>::invoke(v);
QVariantMap l;
for (QAssociativeIterable::const_iterator it = iter.begin(), end = iter.end(); it != end; ++it)
@@ -783,10 +788,11 @@ namespace QtPrivate {
{
static QPair<QVariant, QVariant> invoke(const QVariant &v)
{
- if (v.userType() == qMetaTypeId<QPair<QVariant, QVariant> >())
+ const int typeId = v.userType();
+ if (typeId == qMetaTypeId<QPair<QVariant, QVariant> >())
return QVariantValueHelper<QPair<QVariant, QVariant> >::invoke(v);
- if (QMetaType::hasRegisteredConverterFunction(v.userType(), qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>())) {
+ if (QMetaType::hasRegisteredConverterFunction(typeId, qMetaTypeId<QtMetaTypePrivate::QPairVariantInterfaceImpl>())) {
QtMetaTypePrivate::QPairVariantInterfaceImpl pi = v.value<QtMetaTypePrivate::QPairVariantInterfaceImpl>();
const QtMetaTypePrivate::VariantData d1 = pi.first();