diff --git a/doc/global/externalsites/qtcreator.qdoc b/doc/global/externalsites/qtcreator.qdoc
index 46609de1606..a98fbd0a56c 100644
--- a/doc/global/externalsites/qtcreator.qdoc
+++ b/doc/global/externalsites/qtcreator.qdoc
@@ -483,3 +483,15 @@
\externalpage http://qt-project.org/doc/qtcreator/creator-developing-winrt.html
\title Qt Creator: Connecting Windows Runtime Devices
*/
+/*!
+ \externalpage http://qt-project.org/doc/qtcreator/creator-clang-codemodel.html
+ \title Qt Creator: Parsing C++ Files
+*/
+/*!
+ \externalpage http://qt-project.org/doc/qtcreator/creator-quick-ui-forms.html
+ \title Qt Creator: Qt Quick UI Forms
+*/
+/*!
+ \externalpage http://qt-project.org/doc/qtcreator/creator-clang-static-analyzer.html
+ \title Qt Creator: Using Clang Static Analyzer
+*/
diff --git a/doc/global/template/images/Qt-logo.png b/doc/global/template/images/Qt-logo.png
index 64c1c4aaa34..01256ab08dc 100644
Binary files a/doc/global/template/images/Qt-logo.png and b/doc/global/template/images/Qt-logo.png differ
diff --git a/doc/global/template/images/logo.png b/doc/global/template/images/logo.png
index 1e7ed4cf213..698dde9215c 100644
Binary files a/doc/global/template/images/logo.png and b/doc/global/template/images/logo.png differ
diff --git a/doc/global/template/images/sprites-combined.png b/doc/global/template/images/sprites-combined.png
index 3a48b21f6b8..c4f01c4bb95 100644
Binary files a/doc/global/template/images/sprites-combined.png and b/doc/global/template/images/sprites-combined.png differ
diff --git a/doc/global/template/style/offline.css b/doc/global/template/style/offline.css
index 5957e3840d0..126df9d806f 100644
--- a/doc/global/template/style/offline.css
+++ b/doc/global/template/style/offline.css
@@ -2,7 +2,6 @@ body {
font: normal 400 14px/1.2 Arial;
margin-top: 85px;
font-family: Arial, Helvetica;
- color: #313131;
text-align: left;
margin-left: 5px;
margin-right: 5px;
diff --git a/examples/opengl/legacy/framebufferobject2/cubelogo.png b/examples/opengl/legacy/framebufferobject2/cubelogo.png
index 3ae0f9ba3f8..2ccbede7748 100644
Binary files a/examples/opengl/legacy/framebufferobject2/cubelogo.png and b/examples/opengl/legacy/framebufferobject2/cubelogo.png differ
diff --git a/examples/opengl/legacy/pbuffers/cubelogo.png b/examples/opengl/legacy/pbuffers/cubelogo.png
index 3ae0f9ba3f8..2ccbede7748 100644
Binary files a/examples/opengl/legacy/pbuffers/cubelogo.png and b/examples/opengl/legacy/pbuffers/cubelogo.png differ
diff --git a/examples/sql/doc/images/drilldown-example.png b/examples/sql/doc/images/drilldown-example.png
index fd315a437e0..fed51d36292 100644
Binary files a/examples/sql/doc/images/drilldown-example.png and b/examples/sql/doc/images/drilldown-example.png differ
diff --git a/examples/sql/drilldown/images/qt-creator.png b/examples/sql/drilldown/images/qt-creator.png
index fa0f6ed7cef..0602bdcad1d 100644
Binary files a/examples/sql/drilldown/images/qt-creator.png and b/examples/sql/drilldown/images/qt-creator.png differ
diff --git a/examples/sql/drilldown/images/qt-logo.png b/examples/sql/drilldown/images/qt-logo.png
index 53bc39c38c1..7603fa0c903 100644
Binary files a/examples/sql/drilldown/images/qt-logo.png and b/examples/sql/drilldown/images/qt-logo.png differ
diff --git a/examples/sql/drilldown/images/qt-project.png b/examples/sql/drilldown/images/qt-project.png
index c34d3f099dd..e066fbe3f98 100644
Binary files a/examples/sql/drilldown/images/qt-project.png and b/examples/sql/drilldown/images/qt-project.png differ
diff --git a/examples/sql/drilldown/images/qt-quick.png b/examples/sql/drilldown/images/qt-quick.png
index f66127e8e74..90d9fd075d8 100644
Binary files a/examples/sql/drilldown/images/qt-quick.png and b/examples/sql/drilldown/images/qt-quick.png differ
diff --git a/examples/widgets/animation/animatedtiles/images/kinetic.png b/examples/widgets/animation/animatedtiles/images/kinetic.png
index 55cfa5515f5..d5fc0af0f24 100644
Binary files a/examples/widgets/animation/animatedtiles/images/kinetic.png and b/examples/widgets/animation/animatedtiles/images/kinetic.png differ
diff --git a/examples/widgets/animation/easing/images/qt-logo.png b/examples/widgets/animation/easing/images/qt-logo.png
index 14ddf2a0289..6b72d5fb72c 100644
Binary files a/examples/widgets/animation/easing/images/qt-logo.png and b/examples/widgets/animation/easing/images/qt-logo.png differ
diff --git a/examples/widgets/doc/images/dropsite-example.png b/examples/widgets/doc/images/dropsite-example.png
index 2c42c7be69b..c555dd3609e 100644
Binary files a/examples/widgets/doc/images/dropsite-example.png and b/examples/widgets/doc/images/dropsite-example.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_16x16.png b/examples/widgets/doc/images/icons_qt_extended_16x16.png
index 92743690e30..8bae9499e45 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_16x16.png and b/examples/widgets/doc/images/icons_qt_extended_16x16.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_17x17.png b/examples/widgets/doc/images/icons_qt_extended_17x17.png
index e9bb24a282d..7ef4222f936 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_17x17.png and b/examples/widgets/doc/images/icons_qt_extended_17x17.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_32x32.png b/examples/widgets/doc/images/icons_qt_extended_32x32.png
index cd3d0f32551..7b0c54bac3a 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_32x32.png and b/examples/widgets/doc/images/icons_qt_extended_32x32.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_33x33.png b/examples/widgets/doc/images/icons_qt_extended_33x33.png
index a67565cc2bf..1a38f6e44b0 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_33x33.png and b/examples/widgets/doc/images/icons_qt_extended_33x33.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_48x48.png b/examples/widgets/doc/images/icons_qt_extended_48x48.png
index 5aa2d73f71a..85dcb5f26c6 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_48x48.png and b/examples/widgets/doc/images/icons_qt_extended_48x48.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_64x64.png b/examples/widgets/doc/images/icons_qt_extended_64x64.png
index 5aa2d73f71a..d0bfd97f10b 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_64x64.png and b/examples/widgets/doc/images/icons_qt_extended_64x64.png differ
diff --git a/examples/widgets/doc/images/icons_qt_extended_8x8.png b/examples/widgets/doc/images/icons_qt_extended_8x8.png
index 8de7fce038a..dcbb5811c6b 100644
Binary files a/examples/widgets/doc/images/icons_qt_extended_8x8.png and b/examples/widgets/doc/images/icons_qt_extended_8x8.png differ
diff --git a/examples/widgets/draganddrop/puzzle/example.jpg b/examples/widgets/draganddrop/puzzle/example.jpg
index e09fb707570..023203c57aa 100644
Binary files a/examples/widgets/draganddrop/puzzle/example.jpg and b/examples/widgets/draganddrop/puzzle/example.jpg differ
diff --git a/examples/widgets/graphicsview/boxes/qt-logo.jpg b/examples/widgets/graphicsview/boxes/qt-logo.jpg
index 4014b4659c1..8d7fab052a0 100644
Binary files a/examples/widgets/graphicsview/boxes/qt-logo.jpg and b/examples/widgets/graphicsview/boxes/qt-logo.jpg differ
diff --git a/examples/widgets/graphicsview/boxes/qt-logo.png b/examples/widgets/graphicsview/boxes/qt-logo.png
index 7d3e97eb36e..0b0b15480cd 100644
Binary files a/examples/widgets/graphicsview/boxes/qt-logo.png and b/examples/widgets/graphicsview/boxes/qt-logo.png differ
diff --git a/examples/widgets/itemviews/puzzle/example.jpg b/examples/widgets/itemviews/puzzle/example.jpg
index e09fb707570..023203c57aa 100644
Binary files a/examples/widgets/itemviews/puzzle/example.jpg and b/examples/widgets/itemviews/puzzle/example.jpg differ
diff --git a/examples/widgets/painting/basicdrawing/images/qt-logo.png b/examples/widgets/painting/basicdrawing/images/qt-logo.png
index a8b452e07a5..abfc8caadbb 100644
Binary files a/examples/widgets/painting/basicdrawing/images/qt-logo.png and b/examples/widgets/painting/basicdrawing/images/qt-logo.png differ
diff --git a/examples/widgets/widgets/icons/images/qt_extended_16x16.png b/examples/widgets/widgets/icons/images/qt_extended_16x16.png
index 95d3bae8389..bee4e7d6cd2 100644
Binary files a/examples/widgets/widgets/icons/images/qt_extended_16x16.png and b/examples/widgets/widgets/icons/images/qt_extended_16x16.png differ
diff --git a/examples/widgets/widgets/icons/images/qt_extended_32x32.png b/examples/widgets/widgets/icons/images/qt_extended_32x32.png
index 7b7a790c122..6e7d000c047 100644
Binary files a/examples/widgets/widgets/icons/images/qt_extended_32x32.png and b/examples/widgets/widgets/icons/images/qt_extended_32x32.png differ
diff --git a/examples/widgets/widgets/icons/images/qt_extended_48x48.png b/examples/widgets/widgets/icons/images/qt_extended_48x48.png
index 8434dc26dbd..7a93d889001 100644
Binary files a/examples/widgets/widgets/icons/images/qt_extended_48x48.png and b/examples/widgets/widgets/icons/images/qt_extended_48x48.png differ
diff --git a/mkspecs/common/qcc-base.conf b/mkspecs/common/qcc-base.conf
index 122f940ec3e..f529d7fc7ba 100644
--- a/mkspecs/common/qcc-base.conf
+++ b/mkspecs/common/qcc-base.conf
@@ -11,11 +11,15 @@
QMAKE_COMPILER = rim_qcc gcc # qcc is mostly gcc in disguise
+QMAKE_CFLAGS_OPTIMIZE = -O2
+QMAKE_CFLAGS_OPTIMIZE_FULL = -O3
+
QMAKE_CFLAGS += -Wno-psabi
QMAKE_CFLAGS_DEPS += -M
QMAKE_CFLAGS_WARN_ON += -Wall -W
QMAKE_CFLAGS_WARN_OFF += -w
-QMAKE_CFLAGS_RELEASE += -O2
+QMAKE_CFLAGS_RELEASE += $$QMAKE_CFLAGS_OPTIMIZE
+QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -g
QMAKE_CFLAGS_DEBUG += -g
QMAKE_CFLAGS_SHLIB += -fPIC -shared
QMAKE_CFLAGS_STATIC_LIB += -fPIC
@@ -36,6 +40,7 @@ QMAKE_CXXFLAGS_DEPS += $$QMAKE_CFLAGS_DEPS
QMAKE_CXXFLAGS_WARN_ON += $$QMAKE_CFLAGS_WARN_ON
QMAKE_CXXFLAGS_WARN_OFF += $$QMAKE_CFLAGS_WARN_OFF
QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE
+QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_CXXFLAGS_DEBUG += $$QMAKE_CFLAGS_DEBUG
QMAKE_CXXFLAGS_SHLIB += $$QMAKE_CFLAGS_SHLIB
QMAKE_CXXFLAGS_STATIC_LIB += $$QMAKE_CFLAGS_STATIC_LIB
diff --git a/mkspecs/common/winrt_winphone/manifests/8.1/AppxManifest.xml.in b/mkspecs/common/winrt_winphone/manifests/8.1/AppxManifest.xml.in
index 97d34074037..a6fc9697f41 100644
--- a/mkspecs/common/winrt_winphone/manifests/8.1/AppxManifest.xml.in
+++ b/mkspecs/common/winrt_winphone/manifests/8.1/AppxManifest.xml.in
@@ -34,7 +34,7 @@
-
+ $${WINRT_MANIFEST.rotation_preference}
$${WINRT_MANIFEST.capabilities}$${WINRT_MANIFEST.dependencies}
diff --git a/mkspecs/common/winrt_winphone/manifests/8.1_wp/AppxManifest.xml.in b/mkspecs/common/winrt_winphone/manifests/8.1_wp/AppxManifest.xml.in
index cf18a4dc790..b75570ad4e3 100644
--- a/mkspecs/common/winrt_winphone/manifests/8.1_wp/AppxManifest.xml.in
+++ b/mkspecs/common/winrt_winphone/manifests/8.1_wp/AppxManifest.xml.in
@@ -37,7 +37,7 @@
-
+ $${WINRT_MANIFEST.rotation_preference}
$${WINRT_MANIFEST.capabilities}$${WINRT_MANIFEST.dependencies}
diff --git a/mkspecs/features/winrt/package_manifest.prf b/mkspecs/features/winrt/package_manifest.prf
index b4242bfdaa5..2ccb5db9633 100644
--- a/mkspecs/features/winrt/package_manifest.prf
+++ b/mkspecs/features/winrt/package_manifest.prf
@@ -24,6 +24,7 @@
# WINRT_MANIFEST.logo_medium: Medium logo image file. Default provided by the mkspec.
# WINRT_MANIFEST.logo_large: Large logo image file. Default provided by the mkspec.
# WINRT_MANIFEST.splash_screen: Splash screen image file. Default provided by the mkspec.
+# WINRT_MANIFEST.rotation_preference: Orientation specification. Default is empty. (portrait, landscape, landscapeFlipped)
# WINRT_MANIFEST.iconic_tile_icon: Image file for the "iconic" tile template icon. Default provided by the mkspec.
# WINRT_MANIFEST.iconic_tile_small: Image file for the small "iconic" tile template logo. Default provided by the mkspec.
# WINRT_MANIFEST.default_language: Specifies the default language of the application
@@ -87,6 +88,20 @@
isEmpty(WINRT_MANIFEST.foreground): WINRT_MANIFEST.foreground = light
isEmpty(WINRT_MANIFEST.default_language): WINRT_MANIFEST.default_language = en
+ INDENT = "$$escape_expand(\\r\\n) "
+
+ VS_XML_NAMESPACE = "m2"
+ winphone: VS_XML_NAMESPACE = "m3"
+ WINRT_MANIFEST.rotation_preference = $$unique(WINRT_MANIFEST.rotation_preference)
+ !isEmpty(WINRT_MANIFEST.rotation_preference) {
+ MANIFEST_ROTATION += "<$${VS_XML_NAMESPACE}:InitialRotationPreference>"
+ for(ROTATION, WINRT_MANIFEST.rotation_preference): \
+ MANIFEST_ROTATION += " <$${VS_XML_NAMESPACE}:Rotation Preference=\"$$ROTATION\" />"
+ MANIFEST_ROTATION += "$${VS_XML_NAMESPACE}:InitialRotationPreference>"
+
+ WINRT_MANIFEST.rotation_preference = $$join(MANIFEST_ROTATION, $$INDENT, $$INDENT)
+ }
+
INDENT = "$$escape_expand(\\r\\n) "
# Capabilities are given as a string list and may change with the configuration (network, sensors, etc.)
diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h
index 949617fa7c0..4c84daae136 100644
--- a/src/corelib/global/qcompilerdetection.h
+++ b/src/corelib/global/qcompilerdetection.h
@@ -78,7 +78,7 @@
# define Q_NO_USING_KEYWORD
#elif defined(_MSC_VER)
-# define Q_CC_MSVC
+# define Q_CC_MSVC (_MSC_VER)
# define Q_CC_MSVC_NET
# define Q_OUTOFLINE_TEMPLATE inline
# if _MSC_VER < 1600
@@ -137,14 +137,14 @@
# endif
#elif defined(__GNUC__)
-# define Q_CC_GNU
+# define Q_CC_GNU (__GNUC__ * 100 + __GNUC_MINOR__)
# define Q_C_CALLBACKS
# if defined(__MINGW32__)
# define Q_CC_MINGW
# endif
# if defined(__INTEL_COMPILER)
/* Intel C++ also masquerades as GCC */
-# define Q_CC_INTEL
+# define Q_CC_INTEL (__INTEL_COMPILER)
# define Q_ASSUME_IMPL(expr) __assume(expr)
# define Q_UNREACHABLE_IMPL() __builtin_unreachable()
# if __INTEL_COMPILER >= 1300 && !defined(__APPLE__)
@@ -152,7 +152,26 @@
# endif
# elif defined(__clang__)
/* Clang also masquerades as GCC */
-# define Q_CC_CLANG
+# if defined(__apple_build_version__)
+# /* http://en.wikipedia.org/wiki/Xcode#Toolchain_Versions */
+# if __apple_build_version__ >= 600051
+# define Q_CC_CLANG 305
+# elif __apple_build_version__ >= 503038
+# define Q_CC_CLANG 304
+# elif __apple_build_version__ >= 500275
+# define Q_CC_CLANG 303
+# elif __apple_build_version__ >= 425024
+# define Q_CC_CLANG 302
+# elif __apple_build_version__ >= 318045
+# define Q_CC_CLANG 301
+# elif __apple_build_version__ >= 211101
+# define Q_CC_CLANG 300
+# else
+# error "Unknown Apple Clang version"
+# endif
+# else
+# define Q_CC_CLANG ((__clang_major__ * 100) + __clang_minor__)
+# endif
# define Q_ASSUME_IMPL(expr) if (expr){} else __builtin_unreachable()
# define Q_UNREACHABLE_IMPL() __builtin_unreachable()
# if !defined(__has_extension)
@@ -168,7 +187,7 @@
# endif
# else
/* Plain GCC */
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405
+# if Q_CC_GNU >= 405
# define Q_ASSUME_IMPL(expr) if (expr){} else __builtin_unreachable()
# define Q_UNREACHABLE_IMPL() __builtin_unreachable()
# define Q_DECL_DEPRECATED_X(text) __attribute__ ((__deprecated__(text)))
@@ -202,7 +221,7 @@
# define QT_NO_ARM_EABI
# endif
# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403 && !defined(Q_CC_CLANG)
+# if Q_CC_GNU >= 403 && !defined(Q_CC_CLANG)
# define Q_ALLOC_SIZE(x) __attribute__((alloc_size(x)))
# endif
@@ -308,7 +327,7 @@
/* Using the `using' keyword avoids Intel C++ for Linux warnings */
# elif defined(__INTEL_COMPILER)
-# define Q_CC_INTEL
+# define Q_CC_INTEL (__INTEL_COMPILER)
/* Uses CFront, make sure to read the manual how to tweak templates. */
# elif defined(__ghs)
@@ -566,7 +585,7 @@
# endif
// Variadic macros are supported for gnu++98, c++11, c99 ... since 2.9
-# if ((__clang_major__ * 100) + __clang_minor__) >= 209
+# if Q_CC_CLANG >= 209
# if !defined(__STRICT_ANSI__) || defined(__GXX_EXPERIMENTAL_CXX0X__) \
|| (defined(__cplusplus) && (__cplusplus >= 201103L)) \
|| (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L))
@@ -668,7 +687,7 @@
# define Q_COMPILER_VARIADIC_TEMPLATES
# endif
/* Features that have no __has_feature() check */
-# if ((__clang_major__ * 100) + __clang_minor__) >= 209 /* since clang 2.9 */
+# if Q_CC_CLANG >= 209 /* since clang 2.9 */
# define Q_COMPILER_EXTERN_TEMPLATES
# endif
# endif
@@ -709,7 +728,7 @@
#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG)
# define Q_COMPILER_RESTRICTED_VLA
# define Q_COMPILER_THREADSAFE_STATICS
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
+# if Q_CC_GNU >= 403
// GCC supports binary literals in C, C++98 and C++11 modes
# define Q_COMPILER_BINARY_LITERALS
# endif
@@ -720,13 +739,13 @@
# define Q_COMPILER_VARIADIC_MACROS
# endif
# if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
+# if Q_CC_GNU >= 403
/* C++11 features supported in GCC 4.3: */
# define Q_COMPILER_DECLTYPE
# define Q_COMPILER_RVALUE_REFS
# define Q_COMPILER_STATIC_ASSERT
# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404
+# if Q_CC_GNU >= 404
/* C++11 features supported in GCC 4.4: */
# define Q_COMPILER_AUTO_FUNCTION
# define Q_COMPILER_AUTO_TYPE
@@ -735,7 +754,7 @@
# define Q_COMPILER_UNICODE_STRINGS
# define Q_COMPILER_VARIADIC_TEMPLATES
# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405
+# if Q_CC_GNU >= 405
/* C++11 features supported in GCC 4.5: */
# define Q_COMPILER_EXPLICIT_CONVERSIONS
/* GCC 4.4 implements initializer_list but does not define typedefs required
@@ -745,7 +764,7 @@
# define Q_COMPILER_RAW_STRINGS
# define Q_COMPILER_CLASS_ENUM
# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
+# if Q_CC_GNU >= 406
/* Pre-4.6 compilers implement a non-final snapshot of N2346, hence default and delete
* functions are supported only if they are public. Starting from 4.6, GCC handles
* final version - the access modifier is not relevant. */
@@ -757,7 +776,7 @@
# define Q_COMPILER_UNRESTRICTED_UNIONS
# define Q_COMPILER_RANGE_FOR
# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407
+# if Q_CC_GNU >= 407
/* GCC 4.4 implemented and std::atomic using its old intrinsics.
* However, the implementation is incomplete for most platforms until GCC 4.7:
* instead, std::atomic would use an external lock. Since we need an std::atomic
@@ -773,20 +792,20 @@
# define Q_COMPILER_TEMPLATE_ALIAS
# define Q_COMPILER_UDL
# endif
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408
+# if Q_CC_GNU >= 408
# define Q_COMPILER_ATTRIBUTES
# define Q_COMPILER_ALIGNAS
# define Q_COMPILER_ALIGNOF
# define Q_COMPILER_INHERITING_CONSTRUCTORS
# define Q_COMPILER_THREAD_LOCAL
-# if (__GNUC__ * 100 + __GNUC_MINOR__) > 408 || __GNUC_PATCHLEVEL__ >= 1
+# if Q_CC_GNU > 408 || __GNUC_PATCHLEVEL__ >= 1
# define Q_COMPILER_REF_QUALIFIERS
# endif
# endif
/* C++11 features are complete as of GCC 4.8.1 */
# endif
# if __cplusplus > 201103L
-# if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409
+# if Q_CC_GNU >= 409
/* C++1y features in GCC 4.9 - deprecated, do not update this list */
//# define Q_COMPILER_BINARY_LITERALS // already supported since GCC 4.3 as an extension
# define Q_COMPILER_LAMBDA_CAPTURES
diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h
index 8bc489e5095..f17ff3dea08 100644
--- a/src/corelib/global/qglobal.h
+++ b/src/corelib/global/qglobal.h
@@ -877,7 +877,7 @@ public:
// (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#382).
// GCC 4.3 and 4.4 have support for decltype, but are affected by DR 382.
# if defined(Q_COMPILER_DECLTYPE) && \
- (defined(Q_CC_CLANG) || defined(Q_CC_INTEL) || !defined(Q_CC_GNU) || (__GNUC__ * 100 + __GNUC_MINOR__) >= 405)
+ (defined(Q_CC_CLANG) || defined(Q_CC_INTEL) || !defined(Q_CC_GNU) || Q_CC_GNU >= 405)
# define QT_FOREACH_DECLTYPE(x) typename QtPrivate::remove_reference::type
# else
# define QT_FOREACH_DECLTYPE(x) __typeof__((x))
diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp
index c3ec2bc7f67..7ca0aa7f0bf 100644
--- a/src/corelib/global/qlibraryinfo.cpp
+++ b/src/corelib/global/qlibraryinfo.cpp
@@ -84,14 +84,7 @@ class QLibraryInfoPrivate
{
public:
static QSettings *findConfiguration();
-#ifndef QT_BOOTSTRAPPED
- static void cleanup()
- {
- QLibrarySettings *ls = qt_library_settings();
- if (ls)
- ls->settings.reset(0);
- }
-#else
+#ifdef QT_BOOTSTRAPPED
static bool haveGroup(QLibraryInfo::PathGroup group)
{
QLibrarySettings *ls = qt_library_settings();
@@ -114,7 +107,6 @@ QLibrarySettings::QLibrarySettings()
: settings(QLibraryInfoPrivate::findConfiguration())
{
#ifndef QT_BOOTSTRAPPED
- qAddPostRoutine(QLibraryInfoPrivate::cleanup);
bool haveEffectivePaths;
bool havePaths;
#endif
diff --git a/src/corelib/global/qprocessordetection.h b/src/corelib/global/qprocessordetection.h
index 26ac56396b7..55cb31c62b9 100644
--- a/src/corelib/global/qprocessordetection.h
+++ b/src/corelib/global/qprocessordetection.h
@@ -87,9 +87,9 @@
ARM is bi-endian, detect using __ARMEL__ or __ARMEB__, falling back to
auto-detection implemented below.
*/
-#if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(__arm64__)
+#if defined(__arm__) || defined(__TARGET_ARCH_ARM) || defined(_M_ARM) || defined(__aarch64__)
# define Q_PROCESSOR_ARM
-# if defined(__arm64__)
+# if defined(__aarch64__)
# define Q_PROCESSOR_ARM_64
# else
# define Q_PROCESSOR_ARM_32
diff --git a/src/corelib/kernel/qjni.cpp b/src/corelib/kernel/qjni.cpp
index 452e3464d65..b179323fdc0 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(const char *methodName, const char *sig, va_list args) const
+void QJNIObjectPrivate::callMethodV(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(const char *methodName, const char *sig
{
va_list args;
va_start(args, sig);
- callMethod(methodName, sig, args);
+ callMethodV(methodName, sig, args);
va_end(args);
}
template <>
-jboolean QJNIObjectPrivate::callMethod(const char *methodName, const char *sig, va_list args) const
+jboolean QJNIObjectPrivate::callMethodV(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jboolean res = 0;
@@ -437,13 +437,13 @@ jboolean QJNIObjectPrivate::callMethod(const char *methodName, const c
{
va_list args;
va_start(args, sig);
- jboolean res = callMethod(methodName, sig, args);
+ jboolean res = callMethodV(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jbyte QJNIObjectPrivate::callMethod(const char *methodName, const char *sig, va_list args) const
+jbyte QJNIObjectPrivate::callMethodV(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jbyte res = 0;
@@ -459,13 +459,13 @@ jbyte QJNIObjectPrivate::callMethod(const char *methodName, const char *s
{
va_list args;
va_start(args, sig);
- jbyte res = callMethod(methodName, sig, args);
+ jbyte res = callMethodV(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jchar QJNIObjectPrivate::callMethod(const char *methodName, const char *sig, va_list args) const
+jchar QJNIObjectPrivate::callMethodV(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jchar res = 0;
@@ -481,13 +481,13 @@ jchar QJNIObjectPrivate::callMethod(const char *methodName, const char *s
{
va_list args;
va_start(args, sig);
- jchar res = callMethod(methodName, sig, args);
+ jchar res = callMethodV(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jshort QJNIObjectPrivate::callMethod(const char *methodName, const char *sig, va_list args) const
+jshort QJNIObjectPrivate::callMethodV(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jshort res = 0;
@@ -503,13 +503,13 @@ jshort QJNIObjectPrivate::callMethod(const char *methodName, const char
{
va_list args;
va_start(args, sig);
- jshort res = callMethod(methodName, sig, args);
+ jshort res = callMethodV(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jint QJNIObjectPrivate::callMethod(const char *methodName, const char *sig, va_list args) const
+jint QJNIObjectPrivate::callMethodV(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jint res = 0;
@@ -525,13 +525,13 @@ jint QJNIObjectPrivate::callMethod(const char *methodName, const char *sig
{
va_list args;
va_start(args, sig);
- jint res = callMethod(methodName, sig, args);
+ jint res = callMethodV(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jlong QJNIObjectPrivate::callMethod(const char *methodName, const char *sig, va_list args) const
+jlong QJNIObjectPrivate::callMethodV(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jlong res = 0;
@@ -547,13 +547,13 @@ jlong QJNIObjectPrivate::callMethod(const char *methodName, const char *s
{
va_list args;
va_start(args, sig);
- jlong res = callMethod(methodName, sig, args);
+ jlong res = callMethodV(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jfloat QJNIObjectPrivate::callMethod(const char *methodName, const char *sig, va_list args) const
+jfloat QJNIObjectPrivate::callMethodV(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jfloat res = 0.f;
@@ -569,13 +569,13 @@ jfloat QJNIObjectPrivate::callMethod(const char *methodName, const char
{
va_list args;
va_start(args, sig);
- jfloat res = callMethod(methodName, sig, args);
+ jfloat res = callMethodV(methodName, sig, args);
va_end(args);
return res;
}
template <>
-jdouble QJNIObjectPrivate::callMethod(const char *methodName, const char *sig, va_list args) const
+jdouble QJNIObjectPrivate::callMethodV(const char *methodName, const char *sig, va_list args) const
{
QJNIEnvironmentPrivate env;
jdouble res = 0.;
@@ -591,7 +591,7 @@ jdouble QJNIObjectPrivate::callMethod(const char *methodName, const cha
{
va_list args;
va_start(args, sig);
- jdouble res = callMethod(methodName, sig, args);
+ jdouble res = callMethodV(methodName, sig, args);
va_end(args);
return res;
}
@@ -651,10 +651,10 @@ jdouble QJNIObjectPrivate::callMethod(const char *methodName) const
}
template <>
-void QJNIObjectPrivate::callStaticMethod(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+void QJNIObjectPrivate::callStaticMethodV(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(const char *className,
{
va_list args;
va_start(args, sig);
- callStaticMethod(className, methodName, sig, args);
+ callStaticMethodV(className, methodName, sig, args);
va_end(args);
}
template <>
-void QJNIObjectPrivate::callStaticMethod(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+void QJNIObjectPrivate::callStaticMethodV(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(jclass clazz,
{
va_list args;
va_start(args, sig);
- callStaticMethod(clazz, methodName, sig, args);
+ callStaticMethodV(clazz, methodName, sig, args);
va_end(args);
}
template <>
-jboolean QJNIObjectPrivate::callStaticMethod(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jboolean QJNIObjectPrivate::callStaticMethodV(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jboolean res = 0;
@@ -730,16 +730,16 @@ jboolean QJNIObjectPrivate::callStaticMethod(const char *className,
{
va_list args;
va_start(args, sig);
- jboolean res = callStaticMethod(className, methodName, sig, args);
+ jboolean res = callStaticMethodV(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jboolean QJNIObjectPrivate::callStaticMethod(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jboolean QJNIObjectPrivate::callStaticMethodV(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jboolean res = 0;
@@ -759,16 +759,16 @@ jboolean QJNIObjectPrivate::callStaticMethod(jclass clazz,
{
va_list args;
va_start(args, sig);
- jboolean res = callStaticMethod(clazz, methodName, sig, args);
+ jboolean res = callStaticMethodV(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jbyte QJNIObjectPrivate::callStaticMethod(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jbyte QJNIObjectPrivate::callStaticMethodV(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jbyte res = 0;
@@ -791,16 +791,16 @@ jbyte QJNIObjectPrivate::callStaticMethod(const char *className,
{
va_list args;
va_start(args, sig);
- jbyte res = callStaticMethod(className, methodName, sig, args);
+ jbyte res = callStaticMethodV(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jbyte QJNIObjectPrivate::callStaticMethod(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jbyte QJNIObjectPrivate::callStaticMethodV(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jbyte res = 0;
@@ -820,16 +820,16 @@ jbyte QJNIObjectPrivate::callStaticMethod(jclass clazz,
{
va_list args;
va_start(args, sig);
- jbyte res = callStaticMethod(clazz, methodName, sig, args);
+ jbyte res = callStaticMethodV(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jchar QJNIObjectPrivate::callStaticMethod(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jchar QJNIObjectPrivate::callStaticMethodV(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jchar res = 0;
@@ -852,16 +852,16 @@ jchar QJNIObjectPrivate::callStaticMethod(const char *className,
{
va_list args;
va_start(args, sig);
- jchar res = callStaticMethod(className, methodName, sig, args);
+ jchar res = callStaticMethodV(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jchar QJNIObjectPrivate::callStaticMethod(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jchar QJNIObjectPrivate::callStaticMethodV(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jchar res = 0;
@@ -881,16 +881,16 @@ jchar QJNIObjectPrivate::callStaticMethod(jclass clazz,
{
va_list args;
va_start(args, sig);
- jchar res = callStaticMethod(clazz, methodName, sig, args);
+ jchar res = callStaticMethodV(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jshort QJNIObjectPrivate::callStaticMethod(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jshort QJNIObjectPrivate::callStaticMethodV(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jshort res = 0;
@@ -913,16 +913,16 @@ jshort QJNIObjectPrivate::callStaticMethod(const char *className,
{
va_list args;
va_start(args, sig);
- jshort res = callStaticMethod(className, methodName, sig, args);
+ jshort res = callStaticMethodV(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jshort QJNIObjectPrivate::callStaticMethod(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jshort QJNIObjectPrivate::callStaticMethodV(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jshort res = 0;
@@ -942,16 +942,16 @@ jshort QJNIObjectPrivate::callStaticMethod(jclass clazz,
{
va_list args;
va_start(args, sig);
- jshort res = callStaticMethod(clazz, methodName, sig, args);
+ jshort res = callStaticMethodV(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jint QJNIObjectPrivate::callStaticMethod(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jint QJNIObjectPrivate::callStaticMethodV(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jint res = 0;
@@ -974,16 +974,16 @@ jint QJNIObjectPrivate::callStaticMethod(const char *className,
{
va_list args;
va_start(args, sig);
- jint res = callStaticMethod(className, methodName, sig, args);
+ jint res = callStaticMethodV(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jint QJNIObjectPrivate::callStaticMethod(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jint QJNIObjectPrivate::callStaticMethodV(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jint res = 0;
@@ -1003,16 +1003,16 @@ jint QJNIObjectPrivate::callStaticMethod(jclass clazz,
{
va_list args;
va_start(args, sig);
- jint res = callStaticMethod(clazz, methodName, sig, args);
+ jint res = callStaticMethodV(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jlong QJNIObjectPrivate::callStaticMethod(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jlong QJNIObjectPrivate::callStaticMethodV(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jlong res = 0;
@@ -1035,16 +1035,16 @@ jlong QJNIObjectPrivate::callStaticMethod(const char *className,
{
va_list args;
va_start(args, sig);
- jlong res = callStaticMethod(className, methodName, sig, args);
+ jlong res = callStaticMethodV(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jlong QJNIObjectPrivate::callStaticMethod(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jlong QJNIObjectPrivate::callStaticMethodV(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jlong res = 0;
@@ -1064,16 +1064,16 @@ jlong QJNIObjectPrivate::callStaticMethod(jclass clazz,
{
va_list args;
va_start(args, sig);
- jlong res = callStaticMethod(clazz, methodName, sig, args);
+ jlong res = callStaticMethodV(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jfloat QJNIObjectPrivate::callStaticMethod(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jfloat QJNIObjectPrivate::callStaticMethodV(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(const char *className,
{
va_list args;
va_start(args, sig);
- jfloat res = callStaticMethod(className, methodName, sig, args);
+ jfloat res = callStaticMethodV(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jfloat QJNIObjectPrivate::callStaticMethod(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jfloat QJNIObjectPrivate::callStaticMethodV(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jfloat res = 0.f;
@@ -1125,16 +1125,16 @@ jfloat QJNIObjectPrivate::callStaticMethod(jclass clazz,
{
va_list args;
va_start(args, sig);
- jfloat res = callStaticMethod(clazz, methodName, sig, args);
+ jfloat res = callStaticMethodV(clazz, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jdouble QJNIObjectPrivate::callStaticMethod(const char *className,
- const char *methodName,
- const char *sig,
- va_list args)
+jdouble QJNIObjectPrivate::callStaticMethodV(const char *className,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jdouble res = 0.;
@@ -1157,16 +1157,16 @@ jdouble QJNIObjectPrivate::callStaticMethod(const char *className,
{
va_list args;
va_start(args, sig);
- jdouble res = callStaticMethod(className, methodName, sig, args);
+ jdouble res = callStaticMethodV(className, methodName, sig, args);
va_end(args);
return res;
}
template <>
-jdouble QJNIObjectPrivate::callStaticMethod(jclass clazz,
- const char *methodName,
- const char *sig,
- va_list args)
+jdouble QJNIObjectPrivate::callStaticMethodV(jclass clazz,
+ const char *methodName,
+ const char *sig,
+ va_list args)
{
QJNIEnvironmentPrivate env;
jdouble res = 0.;
@@ -1186,7 +1186,7 @@ jdouble QJNIObjectPrivate::callStaticMethod(jclass clazz,
{
va_list args;
va_start(args, sig);
- jdouble res = callStaticMethod(clazz, methodName, sig, args);
+ jdouble res = callStaticMethodV(clazz, methodName, sig, args);
va_end(args);
return res;
}
@@ -1299,9 +1299,9 @@ jdouble QJNIObjectPrivate::callStaticMethod(jclass clazz, const char *m
return callStaticMethod(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(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 19f2cf76012..5f573624c68 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
- 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
- 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
- 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 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 callStaticObjectMethod(jclass clazz,
- 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/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index 33827926c69..dc56ad88a11 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -426,9 +426,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/plugin/qplugin.h b/src/corelib/plugin/qplugin.h
index 4e9a60504a5..c424344c3a2 100644
--- a/src/corelib/plugin/qplugin.h
+++ b/src/corelib/plugin/qplugin.h
@@ -71,7 +71,7 @@ Q_DECLARE_TYPEINFO(QStaticPlugin, Q_PRIMITIVE_TYPE);
void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin staticPlugin);
-#if defined (Q_OF_ELF) && (defined (Q_CC_GNU) || defined(Q_CC_CLANG))
+#if (defined(Q_OF_ELF) || defined(Q_OS_WIN)) && (defined (Q_CC_GNU) || defined(Q_CC_CLANG))
# define QT_PLUGIN_METADATA_SECTION \
__attribute__ ((section (".qtmetadata"))) __attribute__((used))
#elif defined(Q_OS_MAC)
diff --git a/src/corelib/thread/qbasicatomic.h b/src/corelib/thread/qbasicatomic.h
index 09500e92d76..be293f58e34 100644
--- a/src/corelib/thread/qbasicatomic.h
+++ b/src/corelib/thread/qbasicatomic.h
@@ -84,13 +84,9 @@ QT_END_NAMESPACE
// New atomics
#if defined(Q_COMPILER_CONSTEXPR) && defined(Q_COMPILER_DEFAULT_MEMBERS) && defined(Q_COMPILER_DELETE_MEMBERS)
-# if defined(Q_CC_CLANG) && ((((__clang_major__ * 100) + __clang_minor__) < 303) \
- || defined(__apple_build_version__) \
- )
- /* Do not define QT_BASIC_ATOMIC_HAS_CONSTRUCTORS for "stock" clang before version 3.3.
- Apple's version has different (higher!) version numbers, so disable it for all of them for now.
- (The only way to distinguish between them seems to be a check for __apple_build_version__ .)
-
+# if defined(Q_CC_CLANG) && Q_CC_CLANG < 303
+ /*
+ Do not define QT_BASIC_ATOMIC_HAS_CONSTRUCTORS for Clang before version 3.3.
For details about the bug: see http://llvm.org/bugs/show_bug.cgi?id=12670
*/
# else
diff --git a/src/corelib/tools/qelapsedtimer_unix.cpp b/src/corelib/tools/qelapsedtimer_unix.cpp
index 5b26d551a72..9dd5df02669 100644
--- a/src/corelib/tools/qelapsedtimer_unix.cpp
+++ b/src/corelib/tools/qelapsedtimer_unix.cpp
@@ -35,8 +35,12 @@
#define _POSIX_C_SOURCE 200809L
#include "qelapsedtimer.h"
-#ifdef Q_OS_VXWORKS
+#if defined(Q_OS_VXWORKS)
#include "qfunctions_vxworks.h"
+#elif defined(Q_OS_QNX)
+#include
+#include
+#include
#else
#include
#include
@@ -84,7 +88,18 @@ QT_BEGIN_NAMESPACE
* see http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html
*/
-#ifndef CLOCK_REALTIME
+#if defined(Q_OS_QNX)
+static inline void qt_clock_gettime(clockid_t clock, struct timespec *ts)
+{
+ // The standard POSIX clock calls only have 1ms accuracy on QNX. To get
+ // higher accuracy, this platform-specific function must be used instead
+ quint64 cycles_per_sec = SYSPAGE_ENTRY(qtime)->cycles_per_sec;
+ quint64 cycles = ClockCycles();
+ ts->tv_sec = cycles / cycles_per_sec;
+ quint64 mod = cycles % cycles_per_sec;
+ ts->tv_nsec = mod * Q_INT64_C(1000000000) / cycles_per_sec;
+}
+#elif !defined(CLOCK_REALTIME)
# define CLOCK_REALTIME 0
static inline void qt_clock_gettime(int, struct timespec *ts)
{
diff --git a/src/corelib/tools/qsimd.cpp b/src/corelib/tools/qsimd.cpp
index 0b3bbc0ad0d..5281723c5da 100644
--- a/src/corelib/tools/qsimd.cpp
+++ b/src/corelib/tools/qsimd.cpp
@@ -519,7 +519,7 @@ QBasicAtomicInt qt_cpu_features = Q_BASIC_ATOMIC_INITIALIZER(0);
void qDetectCpuFeatures()
{
#if defined(Q_CC_GNU) && !defined(Q_CC_CLANG) && !defined(Q_CC_INTEL)
-# if (__GNUC__ * 100 + __GNUC_MINOR__) < 403
+# if Q_CC_GNU < 403
// GCC 4.2 (at least the one that comes with Apple's XCode, on Mac) is
// known to be broken beyond repair in dealing with the inline assembly
// above. It will generate bad code that could corrupt important registers
diff --git a/src/corelib/tools/qsimd_p.h b/src/corelib/tools/qsimd_p.h
index 434819aa61d..891a3ff0534 100644
--- a/src/corelib/tools/qsimd_p.h
+++ b/src/corelib/tools/qsimd_p.h
@@ -218,8 +218,8 @@
#endif
// other x86 intrinsics
-#if defined(Q_PROCESSOR_X86) && ((defined(Q_CC_GNU) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 404)) \
- || (defined(Q_CC_CLANG) && (__clang_major__ * 100 + __clang_minor__ >= 208)) \
+#if defined(Q_PROCESSOR_X86) && ((defined(Q_CC_GNU) && (Q_CC_GNU >= 404)) \
+ || (defined(Q_CC_CLANG) && (Q_CC_CLANG >= 208)) \
|| defined(Q_CC_INTEL))
# define QT_COMPILER_SUPPORTS_X86INTRIN
# ifdef Q_CC_INTEL
@@ -332,7 +332,7 @@ static __forceinline unsigned long _bit_scan_forward(uint val)
_BitScanForward(&result, val);
return result;
}
-# elif (defined(Q_CC_CLANG) || (defined(Q_CC_GNU) && __GNUC__ * 100 + __GNUC_MINOR__ < 405)) \
+# elif (defined(Q_CC_CLANG) || (defined(Q_CC_GNU) && Q_CC_GNU < 405)) \
&& !defined(Q_CC_INTEL)
// Clang is missing the intrinsic for _bit_scan_reverse
// GCC only added it in version 4.5
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
index 71ca4239d05..ef12c1b8e30 100644
--- a/src/corelib/tools/qstring.cpp
+++ b/src/corelib/tools/qstring.cpp
@@ -6336,8 +6336,7 @@ ushort QString::toUShort(bool *ok, int base) const
\snippet qstring/main.cpp 66
- Various string formats for floating point numbers can be converted
- to double values:
+ \warning The QString content may only contain valid numerical characters which includes the plus/minus sign, the characters g and e used in scientific notation, and the decimal point. Including the unit or additional characters leads to a conversion error.
\snippet qstring/main.cpp 67
@@ -6346,7 +6345,7 @@ ushort QString::toUShort(bool *ok, int base) const
\snippet qstring/main.cpp 68
- For historic reasons, this function does not handle
+ For historical reasons, this function does not handle
thousands group separators. If you need to convert such numbers,
use QLocale::toDouble().
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index b0fbbc15701..99bf469f871 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -1122,6 +1122,10 @@ Qt::WindowState QWindow::windowState() const
This is a hint to the window manager that this window is a dialog or pop-up
on behalf of the given window.
+ In order to cause the window to be centered above its transient parent by
+ default, depending on the window manager, it may also be necessary to call
+ setFlags() with a suitable \l Qt::WindowType (such as \c Qt::Dialog).
+
\sa transientParent(), parent()
*/
void QWindow::setTransientParent(QWindow *parent)
diff --git a/src/gui/opengl/qopengltextureglyphcache.cpp b/src/gui/opengl/qopengltextureglyphcache.cpp
index 0f70a01014a..cd268cd685f 100644
--- a/src/gui/opengl/qopengltextureglyphcache.cpp
+++ b/src/gui/opengl/qopengltextureglyphcache.cpp
@@ -82,10 +82,12 @@ QOpenGLTextureGlyphCache::~QOpenGLTextureGlyphCache()
clear();
}
+#if !defined(QT_OPENGL_ES_2)
static inline bool isCoreProfile()
{
return QOpenGLContext::currentContext()->format().profile() == QSurfaceFormat::CoreProfile;
}
+#endif
void QOpenGLTextureGlyphCache::createTextureData(int width, int height)
{
diff --git a/src/gui/text/qtextimagehandler.cpp b/src/gui/text/qtextimagehandler.cpp
index f6525448def..37c18e3624c 100644
--- a/src/gui/text/qtextimagehandler.cpp
+++ b/src/gui/text/qtextimagehandler.cpp
@@ -44,31 +44,49 @@
QT_BEGIN_NAMESPACE
-static QString resolve2xFile(const QString &fileName, qreal targetDevicePixelRatio)
+static QString resolveFileName(QString fileName, QUrl *url, qreal targetDevicePixelRatio)
{
+ // We might use the fileName for loading if url loading fails
+ // try to make sure it is a valid file path.
+ // Also, QFile{Info}::exists works only on filepaths (not urls)
+
+ if (url->isValid()) {
+ if (url->scheme() == QLatin1Literal("qrc")) {
+ fileName = fileName.right(fileName.length() - 3);
+ }
+ else if (url->scheme() == QLatin1Literal("file")) {
+ fileName = url->toLocalFile();
+ }
+ }
+
if (targetDevicePixelRatio <= 1.0)
return fileName;
- int dotIndex = fileName.lastIndexOf(QLatin1Char('.'));
+ // try to find a 2x version
+
+ const int dotIndex = fileName.lastIndexOf(QLatin1Char('.'));
if (dotIndex != -1) {
QString at2xfileName = fileName;
at2xfileName.insert(dotIndex, QStringLiteral("@2x"));
- if (QFile::exists(at2xfileName))
- return at2xfileName;
+ if (QFile::exists(at2xfileName)) {
+ fileName = at2xfileName;
+ *url = QUrl(fileName);
+ }
}
+
return fileName;
}
-static QPixmap getPixmap(QTextDocument *doc, const QTextImageFormat &format)
+
+static QPixmap getPixmap(QTextDocument *doc, const QTextImageFormat &format, const qreal devicePixelRatio = 1.0)
{
QPixmap pm;
QString name = format.name();
- if (name.startsWith(QLatin1String(":/"))) // auto-detect resources
+ if (name.startsWith(QLatin1String(":/"))) // auto-detect resources and convert them to url
name.prepend(QLatin1String("qrc"));
- QPaintDevice *pdev = doc->documentLayout()->paintDevice();
- name = resolve2xFile(name, pdev ? pdev->devicePixelRatio() : qApp->devicePixelRatio());
QUrl url = QUrl(name);
+ name = resolveFileName(name, &url, devicePixelRatio);
const QVariant data = doc->resource(QTextDocument::ImageResource, url);
if (data.type() == QVariant::Pixmap || data.type() == QVariant::Image) {
pm = qvariant_cast(data);
@@ -77,19 +95,18 @@ static QPixmap getPixmap(QTextDocument *doc, const QTextImageFormat &format)
}
if (pm.isNull()) {
- QString context;
#if 0
+ QString context;
// ### Qt5
QTextBrowser *browser = qobject_cast(doc->parent());
if (browser)
context = browser->source().toString();
#endif
+ // try direct loading
QImage img;
- if (img.isNull()) { // try direct loading
- name = format.name(); // remove qrc:/ prefix again
- if (name.isEmpty() || !img.load(name))
- return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-16.png"));
- }
+ if (name.isEmpty() || !img.load(name))
+ return QPixmap(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-16.png"));
+
pm = QPixmap::fromImage(img);
doc->addResource(QTextDocument::ImageResource, url, pm);
}
@@ -142,16 +159,15 @@ static QSize getPixmapSize(QTextDocument *doc, const QTextImageFormat &format)
return size;
}
-static QImage getImage(QTextDocument *doc, const QTextImageFormat &format)
+static QImage getImage(QTextDocument *doc, const QTextImageFormat &format, const qreal devicePixelRatio = 1.0)
{
QImage image;
QString name = format.name();
if (name.startsWith(QLatin1String(":/"))) // auto-detect resources
name.prepend(QLatin1String("qrc"));
- QPaintDevice *pdev = doc->documentLayout()->paintDevice();
- name = resolve2xFile(name, pdev ? pdev->devicePixelRatio() : qApp->devicePixelRatio());
QUrl url = QUrl(name);
+ name = resolveFileName(name, &url, devicePixelRatio);
const QVariant data = doc->resource(QTextDocument::ImageResource, url);
if (data.type() == QVariant::Image) {
image = qvariant_cast(data);
@@ -160,19 +176,18 @@ static QImage getImage(QTextDocument *doc, const QTextImageFormat &format)
}
if (image.isNull()) {
- QString context;
-
#if 0
+ QString context;
// ### Qt5
QTextBrowser *browser = qobject_cast(doc->parent());
if (browser)
context = browser->source().toString();
#endif
- if (image.isNull()) { // try direct loading
- name = format.name(); // remove qrc:/ prefix again
- if (name.isEmpty() || !image.load(name))
- return QImage(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-16.png"));
- }
+ // try direct loading
+
+ if (name.isEmpty() || !image.load(name))
+ return QImage(QLatin1String(":/qt-project.org/styles/commonstyle/images/file-16.png"));
+
doc->addResource(QTextDocument::ImageResource, url, image);
}
@@ -241,10 +256,10 @@ void QTextImageHandler::drawObject(QPainter *p, const QRectF &rect, QTextDocumen
const QTextImageFormat imageFormat = format.toImageFormat();
if (QCoreApplication::instance()->thread() != QThread::currentThread()) {
- const QImage image = getImage(doc, imageFormat);
+ const QImage image = getImage(doc, imageFormat, p->device()->devicePixelRatio());
p->drawImage(rect, image, image.rect());
} else {
- const QPixmap pixmap = getPixmap(doc, imageFormat);
+ const QPixmap pixmap = getPixmap(doc, imageFormat, p->device()->devicePixelRatio());
p->drawPixmap(rect, pixmap, pixmap.rect());
}
}
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index f00b58a8ce7..52d56fb0716 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -1135,7 +1135,12 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
if (!d->networkSessionStrongRef && (d->initializeSession || !d->networkConfiguration.identifier().isEmpty())) {
QNetworkConfigurationManager manager;
if (!d->networkConfiguration.identifier().isEmpty()) {
- d->createSession(d->networkConfiguration);
+ if ((d->networkConfiguration.state() & QNetworkConfiguration::Defined)
+ && d->networkConfiguration != manager.defaultConfiguration())
+ d->createSession(manager.defaultConfiguration());
+ else
+ d->createSession(d->networkConfiguration);
+
} else {
if (manager.capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)
d->createSession(manager.defaultConfiguration());
@@ -1590,6 +1595,11 @@ void QNetworkAccessManagerPrivate::_q_onlineStateChanged(bool isOnline)
if (customNetworkConfiguration) {
online = (networkConfiguration.state() & QNetworkConfiguration::Active);
} else {
+ if (isOnline && online != isOnline) {
+ networkSessionStrongRef.clear();
+ networkSessionWeakRef.clear();
+ }
+
online = isOnline;
}
}
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index 27b085ddbd9..8887f478dd1 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -1908,18 +1908,14 @@ qint64 QSslSocket::readData(char *data, qint64 maxlen)
if (d->mode == UnencryptedMode && !d->autoStartHandshake) {
readBytes = d->plainSocket->read(data, maxlen);
- } else {
- int bytesToRead = qMin(maxlen, d->buffer.size());
- readBytes = d->buffer.read(data, bytesToRead);
- }
-
#ifdef QSSLSOCKET_DEBUG
- qDebug() << "QSslSocket::readData(" << (void *)data << ',' << maxlen << ") ==" << readBytes;
+ qDebug() << "QSslSocket::readData(" << (void *)data << ',' << maxlen << ") =="
+ << readBytes;
#endif
-
- // possibly trigger another transmit() to decrypt more data from the socket
- if (d->buffer.isEmpty() && d->plainSocket->bytesAvailable()) {
- QMetaObject::invokeMethod(this, "_q_flushReadBuffer", Qt::QueuedConnection);
+ } else {
+ // possibly trigger another transmit() to decrypt more data from the socket
+ if (d->plainSocket->bytesAvailable())
+ QMetaObject::invokeMethod(this, "_q_flushReadBuffer", Qt::QueuedConnection);
}
return readBytes;
diff --git a/src/plugins/bearer/connman/connman.pro b/src/plugins/bearer/connman/connman.pro
index bc4efe8b621..efa13a6ebdc 100644
--- a/src/plugins/bearer/connman/connman.pro
+++ b/src/plugins/bearer/connman/connman.pro
@@ -8,14 +8,14 @@ QT = core network-private dbus
CONFIG += link_pkgconfig
HEADERS += qconnmanservice_linux_p.h \
- qofonoservice_linux_p.h \
+ ../linux_common/qofonoservice_linux_p.h \
qconnmanengine.h \
../qnetworksession_impl.h \
../qbearerengine_impl.h
SOURCES += main.cpp \
qconnmanservice_linux.cpp \
- qofonoservice_linux.cpp \
+ ../linux_common/qofonoservice_linux.cpp \
qconnmanengine.cpp \
../qnetworksession_impl.cpp
diff --git a/src/plugins/bearer/connman/qconnmanengine.h b/src/plugins/bearer/connman/qconnmanengine.h
index 52e8b384a04..a995d8ed25d 100644
--- a/src/plugins/bearer/connman/qconnmanengine.h
+++ b/src/plugins/bearer/connman/qconnmanengine.h
@@ -48,7 +48,7 @@
#include "../qbearerengine_impl.h"
#include "qconnmanservice_linux_p.h"
-#include "qofonoservice_linux_p.h"
+#include "../linux_common/qofonoservice_linux_p.h"
#include
#include
diff --git a/src/plugins/bearer/connman/qofonoservice_linux.cpp b/src/plugins/bearer/linux_common/qofonoservice_linux.cpp
similarity index 74%
rename from src/plugins/bearer/connman/qofonoservice_linux.cpp
rename to src/plugins/bearer/linux_common/qofonoservice_linux.cpp
index 2ce2bd40e45..b2e2131a92d 100644
--- a/src/plugins/bearer/connman/qofonoservice_linux.cpp
+++ b/src/plugins/bearer/linux_common/qofonoservice_linux.cpp
@@ -95,14 +95,12 @@ QStringList QOfonoManagerInterface::getModems()
{
if (modemList.isEmpty()) {
QList argumentList;
- QDBusPendingReply reply = asyncCallWithArgumentList(QLatin1String("GetModems"), argumentList);
+ QDBusPendingReply reply = callWithArgumentList(QDBus::Block, QLatin1String("GetModems"), argumentList);
reply.waitForFinished();
if (!reply.isError()) {
foreach (ObjectPathProperties modem, reply.value()) {
modemList << modem.path.path();
}
- } else {
- qDebug() << reply.error().message();
}
}
@@ -114,7 +112,8 @@ QString QOfonoManagerInterface::currentModem()
QStringList modems = getModems();
foreach (const QString &modem, modems) {
QOfonoModemInterface device(modem);
- if (device.isPowered() && device.isOnline())
+ if (device.isPowered() && device.isOnline()
+ && device.interfaces().contains(QStringLiteral("org.ofono.NetworkRegistration")))
return modem;
}
return QString();
@@ -171,11 +170,17 @@ bool QOfonoModemInterface::isOnline()
return qdbus_cast(var);
}
+QStringList QOfonoModemInterface::interfaces()
+{
+ const QVariant var = getProperty(QStringLiteral("Interfaces"));
+ return var.toStringList();
+}
+
QVariantMap QOfonoModemInterface::getProperties()
{
if (propertiesMap.isEmpty()) {
QList argumentList;
- QDBusPendingReply reply = asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList);
+ QDBusPendingReply reply = callWithArgumentList(QDBus::Block, QLatin1String("GetProperties"), argumentList);
if (!reply.isError()) {
propertiesMap = reply.value();
}
@@ -187,7 +192,8 @@ QVariant QOfonoModemInterface::getProperty(const QString &property)
{
QVariant var;
QVariantMap map = getProperties();
- var = map.value(property);
+ if (map.contains(property))
+ var = map.value(property);
return var;
}
@@ -214,7 +220,8 @@ QVariant QOfonoNetworkRegistrationInterface::getProperty(const QString &property
{
QVariant var;
QVariantMap map = getProperties();
- var = map.value(property);
+ if (map.contains(property))
+ var = map.value(property);
return var;
}
@@ -222,12 +229,10 @@ QVariantMap QOfonoNetworkRegistrationInterface::getProperties()
{
if (propertiesMap.isEmpty()) {
QList argumentList;
- QDBusPendingReply reply = asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList);
+ QDBusPendingReply reply = callWithArgumentList(QDBus::Block, QLatin1String("GetProperties"), argumentList);
reply.waitForFinished();
if (!reply.isError()) {
propertiesMap = reply.value();
- } else {
- qDebug() << reply.error().message();
}
}
return propertiesMap;
@@ -270,11 +275,18 @@ bool QOfonoDataConnectionManagerInterface::roamingAllowed()
return qdbus_cast(var);
}
+QString QOfonoDataConnectionManagerInterface::bearer()
+{
+ QVariant var = getProperty(QStringLiteral("Bearer"));
+ return qdbus_cast(var);
+}
+
QVariant QOfonoDataConnectionManagerInterface::getProperty(const QString &property)
{
QVariant var;
QVariantMap map = getProperties();
- var = map.value(property);
+ if (map.contains(property))
+ var = map.value(property);
return var;
}
@@ -282,7 +294,7 @@ QVariantMap QOfonoDataConnectionManagerInterface::getProperties()
{
if (propertiesMap.isEmpty()) {
QList argumentList;
- QDBusPendingReply reply = asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList);
+ QDBusPendingReply reply = callWithArgumentList(QDBus::Block, QLatin1String("GetProperties"), argumentList);
if (!reply.isError()) {
propertiesMap = reply.value();
}
@@ -297,6 +309,68 @@ void QOfonoDataConnectionManagerInterface::propertyChanged(const QString &name,
Q_EMIT roamingAllowedChanged(value.variant().toBool());
}
+
+QOfonoConnectionContextInterface::QOfonoConnectionContextInterface(const QString &dbusPathName, QObject *parent)
+ : QDBusAbstractInterface(QLatin1String(OFONO_SERVICE),
+ dbusPathName,
+ OFONO_CONNECTION_CONTEXT_INTERFACE,
+ QDBusConnection::systemBus(), parent)
+{
+ QDBusConnection::systemBus().connect(QLatin1String(OFONO_SERVICE),
+ path(),
+ QLatin1String(OFONO_MODEM_INTERFACE),
+ QLatin1String("PropertyChanged"),
+ this,SLOT(propertyChanged(QString,QDBusVariant)));
+}
+
+QOfonoConnectionContextInterface::~QOfonoConnectionContextInterface()
+{
+}
+
+QVariantMap QOfonoConnectionContextInterface::getProperties()
+{
+ if (propertiesMap.isEmpty()) {
+ QList argumentList;
+ QDBusPendingReply reply = callWithArgumentList(QDBus::Block, QLatin1String("GetProperties"), argumentList);
+ if (!reply.isError()) {
+ propertiesMap = reply.value();
+ }
+ }
+ return propertiesMap;
+}
+
+void QOfonoConnectionContextInterface::propertyChanged(const QString &name, const QDBusVariant &value)
+{
+ propertiesMap[name] = value.variant();
+}
+
+QVariant QOfonoConnectionContextInterface::getProperty(const QString &property)
+{
+ QVariant var;
+ QVariantMap map = getProperties();
+ if (map.contains(property))
+ var = map.value(property);
+ return var;
+}
+
+bool QOfonoConnectionContextInterface::active()
+{
+ QVariant var = getProperty(QStringLiteral("Active"));
+ return qdbus_cast(var);
+}
+
+QString QOfonoConnectionContextInterface::accessPointName()
+{
+ QVariant var = getProperty(QStringLiteral("AccessPointName"));
+ return qdbus_cast(var);
+}
+
+QString QOfonoConnectionContextInterface::name()
+{
+ QVariant var = getProperty(QStringLiteral("Name"));
+ return qdbus_cast(var);
+}
+
QT_END_NAMESPACE
#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/connman/qofonoservice_linux_p.h b/src/plugins/bearer/linux_common/qofonoservice_linux_p.h
similarity index 88%
rename from src/plugins/bearer/connman/qofonoservice_linux_p.h
rename to src/plugins/bearer/linux_common/qofonoservice_linux_p.h
index 8a6a932e0d6..0ed00d94ff4 100644
--- a/src/plugins/bearer/connman/qofonoservice_linux_p.h
+++ b/src/plugins/bearer/linux_common/qofonoservice_linux_p.h
@@ -67,6 +67,7 @@
#define OFONO_MODEM_INTERFACE "org.ofono.Modem"
#define OFONO_NETWORK_REGISTRATION_INTERFACE "org.ofono.NetworkRegistration"
#define OFONO_DATA_CONNECTION_MANAGER_INTERFACE "org.ofono.ConnectionManager"
+#define OFONO_CONNECTION_CONTEXT_INTERFACE "org.ofono.ConnectionContext"
QT_BEGIN_NAMESPACE
@@ -114,6 +115,7 @@ public:
bool isPowered();
bool isOnline();
+ QStringList interfaces();
private:
QVariantMap getProperties();
QVariantMap propertiesMap;
@@ -152,17 +154,39 @@ public:
QStringList contexts();
bool roamingAllowed();
+ QVariant getProperty(const QString &);
+ QString bearer();
Q_SIGNALS:
void roamingAllowedChanged(bool);
private:
QVariantMap getProperties();
QVariantMap propertiesMap;
- QVariant getProperty(const QString &);
QStringList contextList;
private slots:
void propertyChanged(const QString &, const QDBusVariant &value);
};
+class QOfonoConnectionContextInterface : public QDBusAbstractInterface
+{
+ Q_OBJECT
+
+public:
+
+ explicit QOfonoConnectionContextInterface(const QString &dbusPathName, QObject *parent = 0);
+ ~QOfonoConnectionContextInterface();
+
+ QVariant getProperty(const QString &);
+ bool active();
+ QString accessPointName();
+ QString name();
+
+Q_SIGNALS:
+private:
+ QVariantMap getProperties();
+ QVariantMap propertiesMap;
+private slots:
+ void propertyChanged(const QString &, const QDBusVariant &value);
+};
QT_END_NAMESPACE
diff --git a/src/plugins/bearer/networkmanager/networkmanager.pro b/src/plugins/bearer/networkmanager/networkmanager.pro
index 1ed9bfaa1b4..b3a270615cc 100644
--- a/src/plugins/bearer/networkmanager/networkmanager.pro
+++ b/src/plugins/bearer/networkmanager/networkmanager.pro
@@ -6,16 +6,16 @@ load(qt_plugin)
QT = core network-private dbus
-HEADERS += qnmdbushelper.h \
- qnetworkmanagerservice.h \
+HEADERS += qnetworkmanagerservice.h \
qnetworkmanagerengine.h \
+ ../linux_common/qofonoservice_linux_p.h \
../qnetworksession_impl.h \
../qbearerengine_impl.h
SOURCES += main.cpp \
- qnmdbushelper.cpp \
qnetworkmanagerservice.cpp \
qnetworkmanagerengine.cpp \
+ ../linux_common/qofonoservice_linux.cpp \
../qnetworksession_impl.cpp
OTHER_FILES += networkmanager.json
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
index 5f49ea0b6de..a8244f05cf5 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.cpp
@@ -47,6 +47,7 @@
#include
#include
#include
+#include "../linux_common/qofonoservice_linux_p.h"
#ifndef QT_NO_BEARERMANAGEMENT
#ifndef QT_NO_DBUS
@@ -57,45 +58,80 @@ QNetworkManagerEngine::QNetworkManagerEngine(QObject *parent)
: QBearerEngineImpl(parent),
managerInterface(new QNetworkManagerInterface(this)),
systemSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE, this)),
- userSettings(new QNetworkManagerSettings(NM_DBUS_SERVICE, this))
+ ofonoManager(new QOfonoManagerInterface(this))
{
+
if (!managerInterface->isValid())
return;
- managerInterface->setConnections();
+ qDBusRegisterMetaType();
+
connect(managerInterface, SIGNAL(deviceAdded(QDBusObjectPath)),
this, SLOT(deviceAdded(QDBusObjectPath)));
connect(managerInterface, SIGNAL(deviceRemoved(QDBusObjectPath)),
this, SLOT(deviceRemoved(QDBusObjectPath)));
connect(managerInterface, SIGNAL(activationFinished(QDBusPendingCallWatcher*)),
this, SLOT(activationFinished(QDBusPendingCallWatcher*)));
- connect(managerInterface, SIGNAL(propertiesChanged(QString,QMap)),
- this, SLOT(interfacePropertiesChanged(QString,QMap)));
+ connect(managerInterface, SIGNAL(propertiesChanged(QMap)),
+ this, SLOT(interfacePropertiesChanged(QMap)));
+ managerInterface->setConnections();
- qDBusRegisterMetaType();
-
- systemSettings->setConnections();
connect(systemSettings, SIGNAL(newConnection(QDBusObjectPath)),
this, SLOT(newConnection(QDBusObjectPath)));
-
- userSettings->setConnections();
- connect(userSettings, SIGNAL(newConnection(QDBusObjectPath)),
- this, SLOT(newConnection(QDBusObjectPath)));
+ systemSettings->setConnections();
}
QNetworkManagerEngine::~QNetworkManagerEngine()
{
qDeleteAll(connections);
+ connections.clear();
qDeleteAll(accessPoints);
+ accessPoints.clear();
qDeleteAll(wirelessDevices);
- qDeleteAll(activeConnections);
+ wirelessDevices.clear();
+ qDeleteAll(activeConnectionsList);
+ activeConnectionsList.clear();
+ qDeleteAll(interfaceDevices);
+ interfaceDevices.clear();
+
+ connectionInterfaces.clear();
+
+ qDeleteAll(ofonoContextManagers);
+ ofonoContextManagers.clear();
+
+ qDeleteAll(wiredDevices);
+ wiredDevices.clear();
}
void QNetworkManagerEngine::initialize()
{
QMutexLocker locker(&mutex);
- // Get current list of access points.
+ if (ofonoManager->isValid()) {
+ Q_FOREACH (const QString &modem, ofonoManager->getModems()) {
+ QOfonoDataConnectionManagerInterface *ofonoContextManager
+ = new QOfonoDataConnectionManagerInterface(modem,this);
+ ofonoContextManagers.insert(modem, ofonoContextManager);
+ }
+ }
+ // Get active connections.
+ foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
+
+ QNetworkManagerConnectionActive *activeConnection =
+ new QNetworkManagerConnectionActive(acPath.path(),this);
+ activeConnectionsList.insert(acPath.path(), activeConnection);
+ connect(activeConnection, SIGNAL(propertiesChanged(QMap)),
+ this, SLOT(activeConnectionPropertiesChanged(QMap)));
+ activeConnection->setConnections();
+
+ QStringList devices = activeConnection->devices();
+ if (!devices.isEmpty()) {
+ QNetworkManagerInterfaceDevice device(devices.at(0),this);
+ connectionInterfaces.insert(activeConnection->connection().path(),device.networkInterface());
+ }
+ }
+
+ // Get current list of access points.
foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
locker.unlock();
deviceAdded(devicePath); //add all accesspoints
@@ -103,7 +139,6 @@ void QNetworkManagerEngine::initialize()
}
// Get connections.
-
foreach (const QDBusObjectPath &settingsPath, systemSettings->listConnections()) {
locker.unlock();
if (!hasIdentifier(settingsPath.path()))
@@ -111,57 +146,19 @@ void QNetworkManagerEngine::initialize()
locker.relock();
}
- foreach (const QDBusObjectPath &settingsPath, userSettings->listConnections()) {
- locker.unlock();
- if (!hasIdentifier(settingsPath.path()))
- newConnection(settingsPath, userSettings);
- locker.relock();
- }
-
- // Get active connections.
- foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
- QNetworkManagerConnectionActive *activeConnection =
- new QNetworkManagerConnectionActive(acPath.path(),this);
- activeConnections.insert(acPath.path(), activeConnection);
-
- activeConnection->setConnections();
- connect(activeConnection, SIGNAL(propertiesChanged(QString,QMap)),
- this, SLOT(activeConnectionPropertiesChanged(QString,QMap)));
- }
Q_EMIT updateCompleted();
}
bool QNetworkManagerEngine::networkManagerAvailable() const
{
- QMutexLocker locker(&mutex);
-
return managerInterface->isValid();
}
-QString QNetworkManagerEngine::getInterfaceFromId(const QString &id)
+QString QNetworkManagerEngine::getInterfaceFromId(const QString &settingsPath)
{
- QMutexLocker locker(&mutex);
-
- foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
- QNetworkManagerConnectionActive activeConnection(acPath.path());
-
- const QString identifier = activeConnection.connection().path();
-
- if (id == identifier) {
- QList devices = activeConnection.devices();
-
- if (devices.isEmpty())
- continue;
-
- QNetworkManagerInterfaceDevice device(devices.at(0).path());
- return device.networkInterface();
- }
- }
-
- return QString();
+ return connectionInterfaces.value(settingsPath);
}
-
bool QNetworkManagerEngine::hasIdentifier(const QString &id)
{
QMutexLocker locker(&mutex);
@@ -177,35 +174,34 @@ void QNetworkManagerEngine::connectToId(const QString &id)
if (!connection)
return;
- QNmSettingsMap map = connection->getSettings();
- const QString connectionType = map.value("connection").value("type").toString();
+ NMDeviceType connectionType = connection->getType();
QString dbusDevicePath;
- foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
- QNetworkManagerInterfaceDevice device(devicePath.path());
- if (device.deviceType() == DEVICE_TYPE_ETHERNET &&
- connectionType == QLatin1String("802-3-ethernet")) {
- dbusDevicePath = devicePath.path();
+ const QString settingsPath = connection->connectionInterface()->path();
+ QString specificPath = configuredAccessPoints.key(settingsPath);
+
+ QHashIterator i(interfaceDevices);
+ while (i.hasNext()) {
+ i.next();
+ if (i.value()->deviceType() == DEVICE_TYPE_ETHERNET &&
+ connectionType == DEVICE_TYPE_ETHERNET) {
+ dbusDevicePath = i.key();
break;
- } else if (device.deviceType() == DEVICE_TYPE_WIFI &&
- connectionType == QLatin1String("802-11-wireless")) {
- dbusDevicePath = devicePath.path();
+ } else if (i.value()->deviceType() == DEVICE_TYPE_WIFI &&
+ connectionType == DEVICE_TYPE_WIFI) {
+ dbusDevicePath = i.key();
break;
- } else if (device.deviceType() == DEVICE_TYPE_MODEM &&
- connectionType == QLatin1String("gsm")) {
- dbusDevicePath = devicePath.path();
+ } else if (i.value()->deviceType() == DEVICE_TYPE_MODEM &&
+ connectionType == DEVICE_TYPE_MODEM) {
+ dbusDevicePath = i.key();
break;
}
}
- const QString service = connection->connectionInterface()->service();
- const QString settingsPath = connection->connectionInterface()->path();
- QString specificPath = configuredAccessPoints.key(settingsPath);
-
if (specificPath.isEmpty())
specificPath = "/";
- managerInterface->activateConnection(service, QDBusObjectPath(settingsPath),
+ managerInterface->activateConnection(QDBusObjectPath(settingsPath),
QDBusObjectPath(dbusDevicePath), QDBusObjectPath(specificPath));
}
@@ -221,13 +217,11 @@ void QNetworkManagerEngine::disconnectFromId(const QString &id)
return;
}
- foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
- QNetworkManagerConnectionActive activeConnection(acPath.path());
-
- const QString identifier = activeConnection.connection().path();
-
- if (id == identifier && accessPointConfigurations.contains(id)) {
- managerInterface->deactivateConnection(acPath);
+ QHashIterator i(activeConnectionsList);
+ while (i.hasNext()) {
+ i.next();
+ if (id == i.value()->connection().path() && accessPointConfigurations.contains(id)) {
+ managerInterface->deactivateConnection(QDBusObjectPath(i.key()));
break;
}
}
@@ -250,12 +244,9 @@ void QNetworkManagerEngine::scanFinished()
QMetaObject::invokeMethod(this, "updateCompleted", Qt::QueuedConnection);
}
-void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
- const QMap &properties)
+void QNetworkManagerEngine::interfacePropertiesChanged(const QMap &properties)
{
- Q_UNUSED(path)
QMutexLocker locker(&mutex);
-
QMapIterator i(properties);
while (i.hasNext()) {
i.next();
@@ -267,22 +258,20 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
qdbus_cast >(i.value().value());
QStringList identifiers = accessPointConfigurations.keys();
- foreach (const QString &id, identifiers)
- QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
-
- QStringList priorActiveConnections = this->activeConnections.keys();
+ QStringList priorActiveConnections = activeConnectionsList.keys();
foreach (const QDBusObjectPath &acPath, activeConnections) {
priorActiveConnections.removeOne(acPath.path());
QNetworkManagerConnectionActive *activeConnection =
- this->activeConnections.value(acPath.path());
+ activeConnectionsList.value(acPath.path());
+
if (!activeConnection) {
activeConnection = new QNetworkManagerConnectionActive(acPath.path(),this);
- this->activeConnections.insert(acPath.path(), activeConnection);
+ activeConnectionsList.insert(acPath.path(), activeConnection);
+ connect(activeConnection, SIGNAL(propertiesChanged(QMap)),
+ this, SLOT(activeConnectionPropertiesChanged(QMap)));
activeConnection->setConnections();
- connect(activeConnection, SIGNAL(propertiesChanged(QString,QMap)),
- this, SLOT(activeConnectionPropertiesChanged(QString,QMap)));
}
const QString id = activeConnection->connection().path();
@@ -295,6 +284,11 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
if (activeConnection->state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED &&
ptr->state != QNetworkConfiguration::Active) {
ptr->state = QNetworkConfiguration::Active;
+
+ if (activeConnectionsList.value(id) && activeConnectionsList.value(id)->defaultRoute()
+ && managerInterface->state() < QNetworkManagerInterface::NM_STATE_CONNECTED_GLOBAL) {
+ ptr->purpose = QNetworkConfiguration::PrivatePurpose;
+ }
ptr->mutex.unlock();
locker.unlock();
@@ -307,7 +301,7 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
}
while (!priorActiveConnections.isEmpty())
- delete this->activeConnections.take(priorActiveConnections.takeFirst());
+ delete activeConnectionsList.take(priorActiveConnections.takeFirst());
while (!identifiers.isEmpty()) {
QNetworkConfigurationPrivatePointer ptr =
@@ -330,14 +324,13 @@ void QNetworkManagerEngine::interfacePropertiesChanged(const QString &path,
}
}
-void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QString &path,
- const QMap &properties)
+void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QMap &properties)
{
QMutexLocker locker(&mutex);
Q_UNUSED(properties)
- QNetworkManagerConnectionActive *activeConnection = activeConnections.value(path);
+ QNetworkManagerConnectionActive *activeConnection = qobject_cast(sender());
if (!activeConnection)
return;
@@ -347,8 +340,13 @@ void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QString &pat
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
if (ptr) {
ptr->mutex.lock();
- if (activeConnection->state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED &&
- ptr->state != QNetworkConfiguration::Active) {
+ if (properties.value("State").toUInt() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
+ QStringList devices = activeConnection->devices();
+ if (!devices.isEmpty()) {
+ QNetworkManagerInterfaceDevice device(devices.at(0),this);
+ connectionInterfaces.insert(id,device.networkInterface());
+ }
+
ptr->state |= QNetworkConfiguration::Active;
ptr->mutex.unlock();
@@ -356,22 +354,17 @@ void QNetworkManagerEngine::activeConnectionPropertiesChanged(const QString &pat
emit configurationChanged(ptr);
locker.relock();
} else {
+ connectionInterfaces.remove(id);
ptr->mutex.unlock();
}
}
}
-void QNetworkManagerEngine::devicePropertiesChanged(const QString &/*path*/,quint32 /*state*/)
-{
-// Q_UNUSED(path);
-// Q_UNUSED(state)
-}
-
-void QNetworkManagerEngine::deviceConnectionsChanged(const QStringList &activeConnectionsList)
+void QNetworkManagerEngine::deviceConnectionsChanged(const QStringList &connectionsList)
{
QMutexLocker locker(&mutex);
for (int i = 0; i < connections.count(); ++i) {
- if (activeConnectionsList.contains(connections.at(i)->connectionInterface()->path()))
+ if (connectionsList.contains(connections.at(i)->connectionInterface()->path()))
continue;
const QString settingsPath = connections.at(i)->connectionInterface()->path();
@@ -392,33 +385,36 @@ void QNetworkManagerEngine::deviceConnectionsChanged(const QStringList &activeCo
void QNetworkManagerEngine::deviceAdded(const QDBusObjectPath &path)
{
- QMutexLocker locker(&mutex);
QNetworkManagerInterfaceDevice *iDevice;
iDevice = new QNetworkManagerInterfaceDevice(path.path(),this);
connect(iDevice,SIGNAL(connectionsChanged(QStringList)),
this,SLOT(deviceConnectionsChanged(QStringList)));
- connect(iDevice,SIGNAL(stateChanged(QString,quint32)),
- this,SLOT(devicePropertiesChanged(QString,quint32)));
iDevice->setConnections();
interfaceDevices.insert(path.path(),iDevice);
-
if (iDevice->deviceType() == DEVICE_TYPE_WIFI) {
QNetworkManagerInterfaceDeviceWireless *wirelessDevice =
new QNetworkManagerInterfaceDeviceWireless(iDevice->connectionInterface()->path(),this);
- wirelessDevice->setConnections();
connect(wirelessDevice, SIGNAL(accessPointAdded(QString)),
this, SLOT(newAccessPoint(QString)));
connect(wirelessDevice, SIGNAL(accessPointRemoved(QString)),
this, SLOT(removeAccessPoint(QString)));
connect(wirelessDevice,SIGNAL(scanDone()),this,SLOT(scanFinished()));
+ wirelessDevice->setConnections();
foreach (const QDBusObjectPath &apPath, wirelessDevice->getAccessPoints())
newAccessPoint(apPath.path());
wirelessDevices.insert(path.path(), wirelessDevice);
}
+
+ if (iDevice->deviceType() == DEVICE_TYPE_ETHERNET) {
+ QNetworkManagerInterfaceDeviceWired *wiredDevice =
+ new QNetworkManagerInterfaceDeviceWired(iDevice->connectionInterface()->path(),this);
+ connect(wiredDevice,SIGNAL(carrierChanged(bool)),this,SLOT(wiredCarrierChanged(bool)));
+ wiredDevices.insert(iDevice->connectionInterface()->path(), wiredDevice);
+ }
}
void QNetworkManagerEngine::deviceRemoved(const QDBusObjectPath &path)
@@ -435,6 +431,41 @@ void QNetworkManagerEngine::deviceRemoved(const QDBusObjectPath &path)
delete wirelessDevices.take(path.path());
locker.relock();
}
+ if (wiredDevices.contains(path.path())) {
+ locker.unlock();
+ delete wiredDevices.take(path.path());
+ locker.relock();
+ }
+}
+
+void QNetworkManagerEngine::wiredCarrierChanged(bool carrier)
+{
+ QNetworkManagerInterfaceDeviceWired *deviceWired = qobject_cast(sender());
+ if (!deviceWired)
+ return;
+ QMutexLocker locker(&mutex);
+ foreach (const QDBusObjectPath &settingsPath, systemSettings->listConnections()) {
+ for (int i = 0; i < connections.count(); ++i) {
+ QNetworkManagerSettingsConnection *connection = connections.at(i);
+ if (connection->getType() == DEVICE_TYPE_ETHERNET
+ && settingsPath.path() == connection->connectionInterface()->path()) {
+ QNetworkConfigurationPrivatePointer ptr =
+ accessPointConfigurations.value(settingsPath.path());
+
+ if (ptr) {
+ ptr->mutex.lock();
+ if (carrier)
+ ptr->state |= QNetworkConfiguration::Discovered;
+ else
+ ptr->state = QNetworkConfiguration::Defined;
+ ptr->mutex.unlock();
+ locker.unlock();
+ emit configurationChanged(ptr);
+ return;
+ }
+ }
+ }
+ }
}
void QNetworkManagerEngine::newConnection(const QDBusObjectPath &path,
@@ -444,57 +475,72 @@ void QNetworkManagerEngine::newConnection(const QDBusObjectPath &path,
if (!settings)
settings = qobject_cast(sender());
- if (!settings)
+ if (!settings) {
return;
+ }
- settings->deleteLater();
QNetworkManagerSettingsConnection *connection =
new QNetworkManagerSettingsConnection(settings->connectionInterface()->service(),
path.path(),this);
- QString apPath;
- for (int i = 0; i < accessPoints.count(); ++i) {
- if (connection->getSsid() == accessPoints.at(i)->ssid()) {
- // remove the corresponding accesspoint from configurations
- apPath = accessPoints.at(i)->connectionInterface()->path();
-
- QNetworkConfigurationPrivatePointer ptr
- = accessPointConfigurations.take(apPath);
- if (ptr) {
- locker.unlock();
- emit configurationRemoved(ptr);
- locker.relock();
- }
- }
+ const QString settingsPath = connection->connectionInterface()->path();
+ if (accessPointConfigurations.contains(settingsPath)) {
+ return;
}
+
connections.append(connection);
connect(connection,SIGNAL(removed(QString)),this,SLOT(removeConnection(QString)));
connect(connection,SIGNAL(updated()),this,SLOT(updateConnection()));
connection->setConnections();
- const QString settingsPath = connection->connectionInterface()->path();
+ NMDeviceType deviceType = connection->getType();
- if (connection->getType() == DEVICE_TYPE_WIFI
- && !configuredAccessPoints.contains(settingsPath))
- configuredAccessPoints.insert(apPath,settingsPath);
+ if (deviceType == DEVICE_TYPE_WIFI) {
+ QString apPath;
+ for (int i = 0; i < accessPoints.count(); ++i) {
+ if (connection->getSsid() == accessPoints.at(i)->ssid()) {
+ // remove the corresponding accesspoint from configurations
+ apPath = accessPoints.at(i)->connectionInterface()->path();
+ QNetworkConfigurationPrivatePointer ptr
+ = accessPointConfigurations.take(apPath);
+ if (ptr) {
+ locker.unlock();
+ emit configurationRemoved(ptr);
+ locker.relock();
+ }
+ }
+ }
+ if (!configuredAccessPoints.contains(settingsPath))
+ configuredAccessPoints.insert(apPath,settingsPath);
+ }
QNetworkConfigurationPrivate *cpPriv =
parseConnection(settingsPath, connection->getSettings());
// Check if connection is active.
- foreach (const QDBusObjectPath &acPath, managerInterface->activeConnections()) {
- QNetworkManagerConnectionActive activeConnection(acPath.path());
-
- if (activeConnection.defaultRoute() &&
- activeConnection.connection().path() == settingsPath &&
- activeConnection.state() == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
+ QHashIterator i(activeConnectionsList);
+ while (i.hasNext()) {
+ i.next();
+ if (i.value()->connection().path() == settingsPath) {
cpPriv->state |= QNetworkConfiguration::Active;
break;
}
}
+ if (deviceType == DEVICE_TYPE_ETHERNET) {
+ QHashIterator i(interfaceDevices);
+ while (i.hasNext()) {
+ i.next();
+ if (i.value()->deviceType() == deviceType) {
+ QNetworkManagerInterfaceDeviceWired *wiredDevice
+ = wiredDevices.value(i.value()->connectionInterface()->path());
+ if (wiredDevice->carrier()) {
+ cpPriv->state |= QNetworkConfiguration::Discovered;
+ }
+ }
+ }
+ }
QNetworkConfigurationPrivatePointer ptr(cpPriv);
accessPointConfigurations.insert(ptr->id, ptr);
-
locker.unlock();
emit configurationAdded(ptr);
}
@@ -505,6 +551,7 @@ void QNetworkManagerEngine::removeConnection(const QString &path)
QNetworkManagerSettingsConnection *connection =
qobject_cast(sender());
+
if (!connection)
return;
@@ -525,6 +572,7 @@ void QNetworkManagerEngine::removeConnection(const QString &path)
while (i.hasNext()) {
i.next();
if (i.value() == path) {
+ configuredAccessPoints.remove(i.key());
newAccessPoint(i.key());
}
}
@@ -538,8 +586,6 @@ void QNetworkManagerEngine::updateConnection()
qobject_cast(sender());
if (!connection)
return;
-
- connection->deleteLater();
const QString settingsPath = connection->connectionInterface()->path();
QNetworkConfigurationPrivate *cpPriv = parseConnection(settingsPath, connection->getSettings());
@@ -575,10 +621,9 @@ void QNetworkManagerEngine::updateConnection()
void QNetworkManagerEngine::activationFinished(QDBusPendingCallWatcher *watcher)
{
QMutexLocker locker(&mutex);
-
+ QDBusPendingReply reply(*watcher);
watcher->deleteLater();
- QDBusPendingReply reply(*watcher);
if (!reply.isError()) {
QDBusObjectPath result = reply.value();
@@ -620,15 +665,14 @@ void QNetworkManagerEngine::newAccessPoint(const QString &path)
if (okToAdd) {
accessPoints.append(accessPoint);
accessPoint->setConnections();
- connect(accessPoint, SIGNAL(propertiesChanged(QMap)),
- this, SLOT(updateAccessPoint(QMap)));
}
-
// Check if configuration exists for connection.
if (!accessPoint->ssid().isEmpty()) {
+
for (int i = 0; i < connections.count(); ++i) {
QNetworkManagerSettingsConnection *connection = connections.at(i);
const QString settingsPath = connection->connectionInterface()->path();
+
if (accessPoint->ssid() == connection->getSsid()) {
if (!configuredAccessPoints.contains(path)) {
configuredAccessPoints.insert(path,settingsPath);
@@ -655,11 +699,7 @@ void QNetworkManagerEngine::newAccessPoint(const QString &path)
ptr->isValid = true;
ptr->id = path;
ptr->type = QNetworkConfiguration::InternetAccessPoint;
- if (accessPoint->flags() == NM_802_11_AP_FLAGS_PRIVACY) {
- ptr->purpose = QNetworkConfiguration::PrivatePurpose;
- } else {
- ptr->purpose = QNetworkConfiguration::PublicPurpose;
- }
+ ptr->purpose = QNetworkConfiguration::PublicPurpose;
ptr->state = QNetworkConfiguration::Undefined;
ptr->bearerType = QNetworkConfiguration::BearerWLAN;
@@ -674,13 +714,13 @@ void QNetworkManagerEngine::removeAccessPoint(const QString &path)
QMutexLocker locker(&mutex);
for (int i = 0; i < accessPoints.count(); ++i) {
QNetworkManagerInterfaceAccessPoint *accessPoint = accessPoints.at(i);
-
if (accessPoint->connectionInterface()->path() == path) {
accessPoints.removeOne(accessPoint);
if (configuredAccessPoints.contains(accessPoint->connectionInterface()->path())) {
// find connection and change state to Defined
configuredAccessPoints.remove(accessPoint->connectionInterface()->path());
+
for (int i = 0; i < connections.count(); ++i) {
QNetworkManagerSettingsConnection *connection = connections.at(i);
@@ -705,8 +745,6 @@ void QNetworkManagerEngine::removeAccessPoint(const QString &path)
accessPointConfigurations.take(path);
if (ptr) {
- locker.unlock();
-
locker.unlock();
emit configurationRemoved(ptr);
locker.relock();
@@ -718,42 +756,9 @@ void QNetworkManagerEngine::removeAccessPoint(const QString &path)
}
}
-void QNetworkManagerEngine::updateAccessPoint(const QMap &map)
-{
- QMutexLocker locker(&mutex);
-
- Q_UNUSED(map)
-
- QNetworkManagerInterfaceAccessPoint *accessPoint =
- qobject_cast(sender());
- if (!accessPoint)
- return;
- accessPoint->deleteLater();
- for (int i = 0; i < connections.count(); ++i) {
- QNetworkManagerSettingsConnection *connection = connections.at(i);
-
- if (accessPoint->ssid() == connection->getSsid()) {
- const QString settingsPath = connection->connectionInterface()->path();
- const QString connectionId = settingsPath;
-
- QNetworkConfigurationPrivatePointer ptr =
- accessPointConfigurations.value(connectionId);
- ptr->mutex.lock();
- QNetworkConfiguration::StateFlags flag = QNetworkConfiguration::Defined;
- ptr->state = (flag | QNetworkConfiguration::Discovered);
- ptr->mutex.unlock();
-
- locker.unlock();
- emit configurationChanged(ptr);
- return;
- }
- }
-}
-
QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QString &settingsPath,
const QNmSettingsMap &map)
{
- // Q_UNUSED(service);
QMutexLocker locker(&mutex);
QNetworkConfigurationPrivate *cpPriv = new QNetworkConfigurationPrivate;
cpPriv->name = map.value("connection").value("id").toString();
@@ -765,18 +770,16 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
cpPriv->state = QNetworkConfiguration::Defined;
-
const QString connectionType = map.value("connection").value("type").toString();
if (connectionType == QLatin1String("802-3-ethernet")) {
cpPriv->bearerType = QNetworkConfiguration::BearerEthernet;
- cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
- QNetworkManagerInterfaceDevice device(devicePath.path());
+ QNetworkManagerInterfaceDevice device(devicePath.path(),this);
if (device.deviceType() == DEVICE_TYPE_ETHERNET) {
- QNetworkManagerInterfaceDeviceWired wiredDevice(device.connectionInterface()->path());
- if (wiredDevice.carrier()) {
+ QNetworkManagerInterfaceDeviceWired *wiredDevice = wiredDevices.value(device.connectionInterface()->path());
+ if (wiredDevice->carrier()) {
cpPriv->state |= QNetworkConfiguration::Discovered;
break;
}
@@ -786,12 +789,6 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
cpPriv->bearerType = QNetworkConfiguration::BearerWLAN;
const QString connectionSsid = map.value("802-11-wireless").value("ssid").toString();
- const QString connectionSecurity = map.value("802-11-wireless").value("security").toString();
- if (!connectionSecurity.isEmpty()) {
- cpPriv->purpose = QNetworkConfiguration::PrivatePurpose;
- } else {
- cpPriv->purpose = QNetworkConfiguration::PublicPurpose;
- }
for (int i = 0; i < accessPoints.count(); ++i) {
if (connectionSsid == accessPoints.at(i)->ssid()
&& map.value("802-11-wireless").value("seen-bssids").toStringList().contains(accessPoints.at(i)->hwAddress())) {
@@ -814,30 +811,13 @@ QNetworkConfigurationPrivate *QNetworkManagerEngine::parseConnection(const QStri
}
} else if (connectionType == QLatin1String("gsm")) {
- foreach (const QDBusObjectPath &devicePath, managerInterface->getDevices()) {
- QNetworkManagerInterfaceDevice device(devicePath.path());
+ const QString contextPath = map.value("connection").value("id").toString();
+ cpPriv->name = contextName(contextPath);
+ cpPriv->bearerType = currentBearerType(contextPath);
- if (device.deviceType() == DEVICE_TYPE_MODEM) {
- QNetworkManagerInterfaceDeviceModem deviceModem(device.connectionInterface()->path(),this);
- switch (deviceModem.currentCapabilities()) {
- case 2:
- cpPriv->bearerType = QNetworkConfiguration::Bearer2G;
- break;
- case 4:
- cpPriv->bearerType = QNetworkConfiguration::Bearer3G;
- break;
- case 8:
- cpPriv->bearerType = QNetworkConfiguration::Bearer4G;
- break;
- default:
- cpPriv->bearerType = QNetworkConfiguration::BearerUnknown;
- break;
- };
- }
+ if (map.value("connection").contains("timestamp")) {
+ cpPriv->state |= QNetworkConfiguration::Discovered;
}
-
- cpPriv->purpose = QNetworkConfiguration::PrivatePurpose;
- cpPriv->state |= QNetworkConfiguration::Discovered;
}
return cpPriv;
@@ -857,7 +837,6 @@ QNetworkManagerSettingsConnection *QNetworkManagerEngine::connectionFromId(const
QNetworkSession::State QNetworkManagerEngine::sessionStateForId(const QString &id)
{
QMutexLocker locker(&mutex);
-
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
if (!ptr)
@@ -866,8 +845,8 @@ QNetworkSession::State QNetworkManagerEngine::sessionStateForId(const QString &i
if (!ptr->isValid)
return QNetworkSession::Invalid;
- foreach (const QString &acPath, activeConnections.keys()) {
- QNetworkManagerConnectionActive *activeConnection = activeConnections.value(acPath);
+ foreach (const QString &acPath, activeConnectionsList.keys()) {
+ QNetworkManagerConnectionActive *activeConnection = activeConnectionsList.value(acPath);
const QString identifier = activeConnection->connection().path();
@@ -899,7 +878,7 @@ quint64 QNetworkManagerEngine::bytesWritten(const QString &id)
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
if (ptr && (ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- const QString networkInterface = getInterfaceFromId(id);
+ const QString networkInterface = connectionInterfaces.value(id);
if (!networkInterface.isEmpty()) {
const QString devFile = QLatin1String("/sys/class/net/") +
networkInterface +
@@ -927,7 +906,7 @@ quint64 QNetworkManagerEngine::bytesReceived(const QString &id)
QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id);
if (ptr && (ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) {
- const QString networkInterface = getInterfaceFromId(id);
+ const QString networkInterface = connectionInterfaces.value(id);
if (!networkInterface.isEmpty()) {
const QString devFile = QLatin1String("/sys/class/net/") +
networkInterface +
@@ -974,9 +953,67 @@ QNetworkSessionPrivate *QNetworkManagerEngine::createSessionBackend()
QNetworkConfigurationPrivatePointer QNetworkManagerEngine::defaultConfiguration()
{
+ QHashIterator i(activeConnectionsList);
+ while (i.hasNext()) {
+ i.next();
+ QNetworkManagerConnectionActive *activeConnection = i.value();
+ if ((activeConnection->defaultRoute() || activeConnection->default6Route())) {
+ return accessPointConfigurations.value(activeConnection->connection().path());
+ }
+ }
+
return QNetworkConfigurationPrivatePointer();
}
+QNetworkConfiguration::BearerType QNetworkManagerEngine::currentBearerType(const QString &id)
+{
+ if (ofonoManager->isValid()) {
+ QString contextPart = id.section('/', -1);
+
+ QHashIterator i(ofonoContextManagers);
+ while (i.hasNext()) {
+ i.next();
+ QString contextPath = i.key() +"/"+contextPart;
+ if (i.value()->contexts().contains(contextPath)) {
+
+ QString bearer = i.value()->bearer();
+ if (bearer == QStringLiteral("gsm")) {
+ return QNetworkConfiguration::Bearer2G;
+ } else if (bearer == QStringLiteral("edge")) {
+ return QNetworkConfiguration::Bearer2G;
+ } else if (bearer == QStringLiteral("umts")) {
+ return QNetworkConfiguration::BearerWCDMA;
+ } else if (bearer == QStringLiteral("hspa")
+ || bearer == QStringLiteral("hsdpa")
+ || bearer == QStringLiteral("hsupa")) {
+ return QNetworkConfiguration::BearerHSPA;
+ } else if (bearer == QStringLiteral("lte")) {
+ return QNetworkConfiguration::BearerLTE;
+ }
+ }
+ }
+ }
+ return QNetworkConfiguration::BearerUnknown;
+}
+
+QString QNetworkManagerEngine::contextName(const QString &path)
+{
+ if (ofonoManager->isValid()) {
+ QString contextPart = path.section('/', -1);
+ QHashIterator i(ofonoContextManagers);
+ while (i.hasNext()) {
+ i.next();
+ Q_FOREACH (const QString &oContext, i.value()->contexts()) {
+ if (oContext.contains(contextPart)) {
+ QOfonoConnectionContextInterface contextInterface(oContext,this);
+ return contextInterface.name();
+ }
+ }
+ }
+ }
+ return path;
+}
+
QT_END_NAMESPACE
#endif // QT_NO_DBUS
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
index ab1cfea71ef..671ed80dab0 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerengine.h
@@ -49,6 +49,8 @@
#include "qnetworkmanagerservice.h"
+#include "../linux_common/qofonoservice_linux_p.h"
+
#include
#include
@@ -89,11 +91,8 @@ public:
QNetworkConfigurationPrivatePointer defaultConfiguration();
private Q_SLOTS:
- void interfacePropertiesChanged(const QString &path,
- const QMap &properties);
- void activeConnectionPropertiesChanged(const QString &path,
- const QMap &properties);
- void devicePropertiesChanged(const QString &path, quint32);
+ void interfacePropertiesChanged(const QMap &properties);
+ void activeConnectionPropertiesChanged(const QMap &properties);
void deviceAdded(const QDBusObjectPath &path);
void deviceRemoved(const QDBusObjectPath &path);
@@ -106,9 +105,10 @@ private Q_SLOTS:
void newAccessPoint(const QString &path);
void removeAccessPoint(const QString &path);
- void updateAccessPoint(const QMap &map);
void scanFinished();
+ void wiredCarrierChanged(bool);
+
private:
QNetworkConfigurationPrivate *parseConnection(const QString &settingsPath,
const QNmSettingsMap &map);
@@ -116,14 +116,22 @@ private:
QNetworkManagerInterface *managerInterface;
QNetworkManagerSettings *systemSettings;
- QNetworkManagerSettings *userSettings;
+ QHash wiredDevices;
QHash wirelessDevices;
- QHash activeConnections;
+
+ QHash activeConnectionsList;
QList connections;
QList accessPoints;
QHash interfaceDevices;
QMap configuredAccessPoints; //ap, settings path
+ QHash connectionInterfaces; // ac, interface
+
+ QOfonoManagerInterface *ofonoManager;
+ QHash ofonoContextManagers;
+ QNetworkConfiguration::BearerType currentBearerType(const QString &id);
+ QString contextName(const QString &path);
+
};
QT_END_NAMESPACE
diff --git a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
index f249ac6100c..dc3b71ec8eb 100644
--- a/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
+++ b/src/plugins/bearer/networkmanager/qnetworkmanagerservice.cpp
@@ -44,7 +44,6 @@
#include
#include "qnetworkmanagerservice.h"
-#include "qnmdbushelper.h"
#ifndef QT_NO_DBUS
@@ -64,18 +63,38 @@ QNetworkManagerInterface::QNetworkManagerInterface(QObject *parent)
d->connectionInterface = new QDBusInterface(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
- QDBusConnection::systemBus());
+ QDBusConnection::systemBus(),parent);
if (!d->connectionInterface->isValid()) {
d->valid = false;
return;
}
d->valid = true;
- nmDBusHelper = new QNmDBusHelper(this);
- connect(nmDBusHelper, SIGNAL(pathForPropertiesChanged(QString,QMap)),
- this,SIGNAL(propertiesChanged(QString,QMap)));
- connect(nmDBusHelper,SIGNAL(pathForStateChanged(QString,quint32)),
- this, SIGNAL(stateChanged(QString,quint32)));
+ QDBusInterface managerPropertiesInterface(QLatin1String(NM_DBUS_SERVICE),
+ QLatin1String(NM_DBUS_PATH),
+ QLatin1String("org.freedesktop.DBus.Properties"),
+ QDBusConnection::systemBus());
+ QList argumentList;
+ argumentList << QLatin1String(NM_DBUS_INTERFACE);
+ QDBusPendingReply propsReply
+ = managerPropertiesInterface.callWithArgumentList(QDBus::Block,QLatin1String("GetAll"),
+ argumentList);
+ if (!propsReply.isError()) {
+ propertyMap = propsReply.value();
+ }
+
+ QDBusPendingReply > nmReply
+ = d->connectionInterface->call(QLatin1String("GetDevices"));
+ nmReply.waitForFinished();
+ if (!nmReply.isError()) {
+ devicesPathList = nmReply.value();
+ }
+
+ QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
+ QLatin1String(NM_DBUS_PATH),
+ QLatin1String(NM_DBUS_INTERFACE),
+ QLatin1String("PropertiesChanged"),
+ this,SLOT(propertiesSwap(QMap)));
}
QNetworkManagerInterface::~QNetworkManagerInterface()
@@ -91,27 +110,24 @@ bool QNetworkManagerInterface::isValid()
bool QNetworkManagerInterface::setConnections()
{
- if(!isValid() )
+ if (!isValid())
return false;
- QDBusConnection dbusConnection = QDBusConnection::systemBus();
-
- bool allOk = false;
- if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
QLatin1String("PropertiesChanged"),
- nmDBusHelper,SLOT(slotPropertiesChanged(QMap)))) {
- allOk = true;
- }
- if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ this,SLOT(propertiesSwap(QMap)));
+
+ bool allOk = false;
+ if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
QLatin1String("DeviceAdded"),
this,SIGNAL(deviceAdded(QDBusObjectPath)))) {
allOk = true;
}
- if (dbusConnection.connect(QLatin1String(NM_DBUS_SERVICE),
+ if (QDBusConnection::systemBus().connect(QLatin1String(NM_DBUS_SERVICE),
QLatin1String(NM_DBUS_PATH),
QLatin1String(NM_DBUS_INTERFACE),
QLatin1String("DeviceRemoved"),
@@ -127,14 +143,17 @@ QDBusInterface *QNetworkManagerInterface::connectionInterface() const
return d->connectionInterface;
}
-QList QNetworkManagerInterface::getDevices() const
+QList QNetworkManagerInterface::getDevices()
{
- QDBusReply > reply = d->connectionInterface->call(QLatin1String("GetDevices"));
- return reply.value();
+ if (devicesPathList.isEmpty()) {
+ qWarning() << "using blocking call!";
+ QDBusReply > reply = d->connectionInterface->call(QLatin1String("GetDevices"));
+ devicesPathList = reply.value();
+ }
+ return devicesPathList;
}
-void QNetworkManagerInterface::activateConnection( const QString &,
- QDBusObjectPath connectionPath,
+void QNetworkManagerInterface::activateConnection(QDBusObjectPath connectionPath,
QDBusObjectPath devicePath,
QDBusObjectPath specificObject)
{
@@ -150,28 +169,80 @@ void QNetworkManagerInterface::activateConnection( const QString &,
void QNetworkManagerInterface::deactivateConnection(QDBusObjectPath connectionPath) const
{
- d->connectionInterface->call(QLatin1String("DeactivateConnection"), QVariant::fromValue(connectionPath));
+ d->connectionInterface->asyncCall(QLatin1String("DeactivateConnection"), QVariant::fromValue(connectionPath));
}
bool QNetworkManagerInterface::wirelessEnabled() const
{
- return d->connectionInterface->property("WirelessEnabled").toBool();
+ if (propertyMap.contains("WirelessEnabled"))
+ return propertyMap.value("WirelessEnabled").toBool();
+ return false;
}
bool QNetworkManagerInterface::wirelessHardwareEnabled() const
{
- return d->connectionInterface->property("WirelessHardwareEnabled").toBool();
+ if (propertyMap.contains("WirelessHardwareEnabled"))
+ return propertyMap.value("WirelessHardwareEnabled").toBool();
+ return false;
}
QList QNetworkManagerInterface::activeConnections() const
{
- QVariant prop = d->connectionInterface->property("ActiveConnections");
- return prop.value >();
+ if (propertyMap.contains("ActiveConnections")) {
+
+ const QDBusArgument &dbusArgs = propertyMap.value("ActiveConnections").value();
+ QDBusObjectPath path;
+ QList list;
+
+ dbusArgs.beginArray();
+ while (!dbusArgs.atEnd()) {
+ dbusArgs >> path;
+ list.append(path);
+ }
+ dbusArgs.endArray();
+
+ return list;
+ }
+
+ QList list;
+ list << QDBusObjectPath();
+ return list;
}
-quint32 QNetworkManagerInterface::state()
+QNetworkManagerInterface::NMState QNetworkManagerInterface::state()
{
- return d->connectionInterface->property("State").toUInt();
+ if (propertyMap.contains("State"))
+ return static_cast