From: Scott Murray Date: Tue, 7 Jun 2022 20:12:25 +0000 (-0400) Subject: Update vehicle signal using app recipes X-Git-Tag: 13.0.2~12 X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=commitdiff_plain;h=0536b1b7eaadc6a20540757c9b19350f83820279;p=AGL%2Fmeta-agl-demo.git Update vehicle signal using app recipes Update the recipes for the Qt demo applications that were previously using signal-composer either directly or indirectly to work with the new VehicleSignals API in libqtappfw. For most of them this means installing the new configuration file and associated JSON web token file for KUKSA.val authorization. At present all the apps are using one of the default read-write tokens from the KUKSA.val install, but ideally this will end up migrated to app specific tokens with appropriate permissions JSON down the road, potentially obtained via OAuth or similar mechanism. Additionally, the tbtnavi recipe has been updated to install a systemd unit to start it at boot. Bug-AGL: SPEC-4409, SPEC-4426 Signed-off-by: Scott Murray Change-Id: Ia87b9f16b8db0eb43863da3e9656d9d1f094fe20 --- diff --git a/recipes-demo/cluster-dashboard/cluster-dashboard/cluster-dashboard.conf b/recipes-demo/cluster-dashboard/cluster-dashboard/cluster-dashboard.conf new file mode 100644 index 000000000..b24c64e2e --- /dev/null +++ b/recipes-demo/cluster-dashboard/cluster-dashboard/cluster-dashboard.conf @@ -0,0 +1,3 @@ +[vis-client] +server = "192.168.20.93" +authorization = "/etc/xdg/AGL/cluster-dashboard/cluster-dashboard.token" diff --git a/recipes-demo/cluster-dashboard/cluster-dashboard/cluster-dashboard.token b/recipes-demo/cluster-dashboard/cluster-dashboard/cluster-dashboard.token new file mode 100644 index 000000000..770aadcff --- /dev/null +++ b/recipes-demo/cluster-dashboard/cluster-dashboard/cluster-dashboard.token @@ -0,0 +1 @@ +eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJrdWtzYS52YWwiLCJpc3MiOiJFY2xpcHNlIEtVS1NBIERldiIsImFkbWluIjp0cnVlLCJpYXQiOjE1MTYyMzkwMjIsImV4cCI6MTc2NzIyNTU5OSwia3Vrc2EtdnNzIjp7IioiOiJydyJ9fQ.QQcVR0RuRJIoasPXYsMGZhdvhLjUalk4GcRaxhh3-0_j3CtVSZ0lTbv_Z3As5BfIYzaMlwUzFGvCVOq2MXVjRK81XOAZ6wIsyKOxva16zjbZryr2V_m3yZ4twI3CPEzJch11_qnhInirHltej-tGg6ySfLaTYeAkw4xYGwENMBBhN5t9odANpScZP_xx5bNfwdW1so6FkV1WhpKlCywoxk_vYZxo187d89bbiu-xOZUa5D-ycFkd1-1rjPXLGE_g5bc4jcQBvNBc-5FDbvt4aJlTQqjpdeppxhxn_gjkPGIAacYDI7szOLC-WYajTStbksUju1iQCyli11kPx0E66me_ZVwOX07f1lRF6D2brWm1LcMAHM3bQUK0LuyVwWPxld64uSAEsvSKsRyJERc7nZUgLf7COnUrrkxgIUNjukbdT2JVN_I-3l3b4YXg6JVD7Y5g0QYBKgXEFpZrDbBVhzo7PXPAhJD6-c3DcUQyRZExbrnFV56RwWuExphw8lYnbMvxPWImiVmB9nRVgFKD0TYaw1sidPSSlZt8Uw34VZzHWIZQAQY0BMjR33fefg42XQ1YzIwPmDx4GYXLl7HNIIVbsRsibKaJnf49mz2qnLC1K272zXSPljO11Ke1MNnsnKyUH7mcwEs9nhTsnMgEOx_TyMLRYo-VEHBDLuEOiBo \ No newline at end of file diff --git a/recipes-demo/cluster-dashboard/cluster-dashboard_git.bb b/recipes-demo/cluster-dashboard/cluster-dashboard_git.bb index 2f5bbecf5..e50fb102a 100644 --- a/recipes-demo/cluster-dashboard/cluster-dashboard_git.bb +++ b/recipes-demo/cluster-dashboard/cluster-dashboard_git.bb @@ -19,6 +19,8 @@ PV = "1.0+git${SRCPV}" SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-cluster-demo-dashboard;protocol=https;branch=${AGL_BRANCH} \ file://cluster-dashboard.service \ + file://cluster-dashboard.conf \ + file://cluster-dashboard.token \ " SRCREV = "${AGL_APP_REVISION}" @@ -30,6 +32,14 @@ do_install:append() { install -d ${D}${systemd_user_unitdir}/agl-session.target.wants install -m 0644 ${WORKDIR}/${BPN}.service ${D}${systemd_user_unitdir}/${BPN}.service ln -s ../${BPN}.service ${D}${systemd_user_unitdir}/agl-session.target.wants/${BPN}.service + + # VIS authorization token file for KUKSA.val should ideally not + # be readable by other users, but currently that's not doable + # until a packaging/sandboxing/MAC scheme is (re)implemented or + # something like OAuth is plumbed in as an alternative. + install -d ${D}${sysconfdir}/xdg/AGL/cluster-dashboard + install -m 0644 ${WORKDIR}/cluster-dashboard.conf ${D}${sysconfdir}/xdg/AGL/ + install -m 0644 ${WORKDIR}/cluster-dashboard.token ${D}${sysconfdir}/xdg/AGL/cluster-dashboard/ } FILES:${PN} += " ${systemd_user_unitdir}" @@ -43,4 +53,5 @@ RDEPENDS:${PN} += " \ qtquickcontrols2-qmlplugins \ qtgraphicaleffects-qmlplugins \ qtsvg-plugins \ + kuksa-val-client-certificates \ " diff --git a/recipes-demo/dashboard/dashboard/dashboard.conf b/recipes-demo/dashboard/dashboard/dashboard.conf new file mode 100644 index 000000000..23695db39 --- /dev/null +++ b/recipes-demo/dashboard/dashboard/dashboard.conf @@ -0,0 +1,2 @@ +[vis-client] +authorization = "/etc/xdg/AGL/dashboard/dashboard.token" diff --git a/recipes-demo/dashboard/dashboard/dashboard.token b/recipes-demo/dashboard/dashboard/dashboard.token new file mode 100644 index 000000000..770aadcff --- /dev/null +++ b/recipes-demo/dashboard/dashboard/dashboard.token @@ -0,0 +1 @@ +eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJrdWtzYS52YWwiLCJpc3MiOiJFY2xpcHNlIEtVS1NBIERldiIsImFkbWluIjp0cnVlLCJpYXQiOjE1MTYyMzkwMjIsImV4cCI6MTc2NzIyNTU5OSwia3Vrc2EtdnNzIjp7IioiOiJydyJ9fQ.QQcVR0RuRJIoasPXYsMGZhdvhLjUalk4GcRaxhh3-0_j3CtVSZ0lTbv_Z3As5BfIYzaMlwUzFGvCVOq2MXVjRK81XOAZ6wIsyKOxva16zjbZryr2V_m3yZ4twI3CPEzJch11_qnhInirHltej-tGg6ySfLaTYeAkw4xYGwENMBBhN5t9odANpScZP_xx5bNfwdW1so6FkV1WhpKlCywoxk_vYZxo187d89bbiu-xOZUa5D-ycFkd1-1rjPXLGE_g5bc4jcQBvNBc-5FDbvt4aJlTQqjpdeppxhxn_gjkPGIAacYDI7szOLC-WYajTStbksUju1iQCyli11kPx0E66me_ZVwOX07f1lRF6D2brWm1LcMAHM3bQUK0LuyVwWPxld64uSAEsvSKsRyJERc7nZUgLf7COnUrrkxgIUNjukbdT2JVN_I-3l3b4YXg6JVD7Y5g0QYBKgXEFpZrDbBVhzo7PXPAhJD6-c3DcUQyRZExbrnFV56RwWuExphw8lYnbMvxPWImiVmB9nRVgFKD0TYaw1sidPSSlZt8Uw34VZzHWIZQAQY0BMjR33fefg42XQ1YzIwPmDx4GYXLl7HNIIVbsRsibKaJnf49mz2qnLC1K272zXSPljO11Ke1MNnsnKyUH7mcwEs9nhTsnMgEOx_TyMLRYo-VEHBDLuEOiBo \ No newline at end of file diff --git a/recipes-demo/dashboard/dashboard_git.bb b/recipes-demo/dashboard/dashboard_git.bb index 60ff6370a..5a56ff715 100644 --- a/recipes-demo/dashboard/dashboard_git.bb +++ b/recipes-demo/dashboard/dashboard_git.bb @@ -9,17 +9,34 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984" DEPENDS = " \ qttools-native \ qtquickcontrols2 \ + libqtappfw \ " PV = "2.0+git${SRCPV}" -SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/dashboard;protocol=https;branch=${AGL_BRANCH}" +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/dashboard;protocol=https;branch=${AGL_BRANCH} \ + file://dashboard.conf \ + file://dashboard.token \ +" SRCREV = "${AGL_APP_REVISION}" S = "${WORKDIR}/git" inherit qmake5 pkgconfig +do_install:append() { + # Currently using default global client and CA certificates + # for KUKSA.val SSL, installing app specific ones would go here. + + # VIS authorization token file for KUKSA.val should ideally not + # be readable by other users, but currently that's not doable + # until a packaging/sandboxing/MAC scheme is (re)implemented or + # something like OAuth is plumbed in as an alternative. + install -d ${D}${sysconfdir}/xdg/AGL/dashboard + install -m 0644 ${WORKDIR}/dashboard.conf ${D}${sysconfdir}/xdg/AGL/ + install -m 0644 ${WORKDIR}/dashboard.token ${D}${sysconfdir}/xdg/AGL/dashboard/ +} + FILES:${PN} += "${datadir}/icons/" RDEPENDS:${PN} += " \ diff --git a/recipes-demo/mediaplayer/mediaplayer/mediaplayer.conf b/recipes-demo/mediaplayer/mediaplayer/mediaplayer.conf new file mode 100644 index 000000000..bc9e0d833 --- /dev/null +++ b/recipes-demo/mediaplayer/mediaplayer/mediaplayer.conf @@ -0,0 +1,2 @@ +[vis-client] +authorization = "/etc/xdg/AGL/mediaplayer/mediaplayer.token" diff --git a/recipes-demo/mediaplayer/mediaplayer/mediaplayer.token b/recipes-demo/mediaplayer/mediaplayer/mediaplayer.token new file mode 100644 index 000000000..770aadcff --- /dev/null +++ b/recipes-demo/mediaplayer/mediaplayer/mediaplayer.token @@ -0,0 +1 @@ +eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJrdWtzYS52YWwiLCJpc3MiOiJFY2xpcHNlIEtVS1NBIERldiIsImFkbWluIjp0cnVlLCJpYXQiOjE1MTYyMzkwMjIsImV4cCI6MTc2NzIyNTU5OSwia3Vrc2EtdnNzIjp7IioiOiJydyJ9fQ.QQcVR0RuRJIoasPXYsMGZhdvhLjUalk4GcRaxhh3-0_j3CtVSZ0lTbv_Z3As5BfIYzaMlwUzFGvCVOq2MXVjRK81XOAZ6wIsyKOxva16zjbZryr2V_m3yZ4twI3CPEzJch11_qnhInirHltej-tGg6ySfLaTYeAkw4xYGwENMBBhN5t9odANpScZP_xx5bNfwdW1so6FkV1WhpKlCywoxk_vYZxo187d89bbiu-xOZUa5D-ycFkd1-1rjPXLGE_g5bc4jcQBvNBc-5FDbvt4aJlTQqjpdeppxhxn_gjkPGIAacYDI7szOLC-WYajTStbksUju1iQCyli11kPx0E66me_ZVwOX07f1lRF6D2brWm1LcMAHM3bQUK0LuyVwWPxld64uSAEsvSKsRyJERc7nZUgLf7COnUrrkxgIUNjukbdT2JVN_I-3l3b4YXg6JVD7Y5g0QYBKgXEFpZrDbBVhzo7PXPAhJD6-c3DcUQyRZExbrnFV56RwWuExphw8lYnbMvxPWImiVmB9nRVgFKD0TYaw1sidPSSlZt8Uw34VZzHWIZQAQY0BMjR33fefg42XQ1YzIwPmDx4GYXLl7HNIIVbsRsibKaJnf49mz2qnLC1K272zXSPljO11Ke1MNnsnKyUH7mcwEs9nhTsnMgEOx_TyMLRYo-VEHBDLuEOiBo \ No newline at end of file diff --git a/recipes-demo/mediaplayer/mediaplayer_git.bb b/recipes-demo/mediaplayer/mediaplayer_git.bb index 7962f76c9..b4fa58c85 100644 --- a/recipes-demo/mediaplayer/mediaplayer_git.bb +++ b/recipes-demo/mediaplayer/mediaplayer_git.bb @@ -10,13 +10,29 @@ DEPENDS = "qtquickcontrols2 libqtappfw" PV = "2.0+git${SRCPV}" -SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/mediaplayer;protocol=https;branch=${AGL_BRANCH}" +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/mediaplayer;protocol=https;branch=${AGL_BRANCH} \ + file://mediaplayer.conf \ + file://mediaplayer.token \ +" SRCREV = "${AGL_APP_REVISION}" S = "${WORKDIR}/git" inherit qmake5 +do_install:append() { + # Currently using default global client and CA certificates + # for KUKSA.val SSL, installing app specific ones would go here. + + # VIS authorization token file for KUKSA.val should ideally not + # be readable by other users, but currently that's not doable + # until a packaging/sandboxing/MAC scheme is (re)implemented or + # something like OAuth is plumbed in as an alternative. + install -d ${D}${sysconfdir}/xdg/AGL/mediaplayer + install -m 0644 ${WORKDIR}/mediaplayer.conf ${D}${sysconfdir}/xdg/AGL/ + install -m 0644 ${WORKDIR}/mediaplayer.token ${D}${sysconfdir}/xdg/AGL/mediaplayer/ +} + FILES:${PN} += "${datadir}/icons/" RDEPENDS:${PN} += "libqtappfw mpd" diff --git a/recipes-demo/navigation/ondemandnavi/navigation.conf b/recipes-demo/navigation/ondemandnavi/navigation.conf new file mode 100644 index 000000000..fca29cdf8 --- /dev/null +++ b/recipes-demo/navigation/ondemandnavi/navigation.conf @@ -0,0 +1,2 @@ +[vis-client] +authorization = "/etc/xdg/AGL/navigation/navigation.token" diff --git a/recipes-demo/navigation/ondemandnavi/navigation.token b/recipes-demo/navigation/ondemandnavi/navigation.token new file mode 100644 index 000000000..770aadcff --- /dev/null +++ b/recipes-demo/navigation/ondemandnavi/navigation.token @@ -0,0 +1 @@ +eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJrdWtzYS52YWwiLCJpc3MiOiJFY2xpcHNlIEtVS1NBIERldiIsImFkbWluIjp0cnVlLCJpYXQiOjE1MTYyMzkwMjIsImV4cCI6MTc2NzIyNTU5OSwia3Vrc2EtdnNzIjp7IioiOiJydyJ9fQ.QQcVR0RuRJIoasPXYsMGZhdvhLjUalk4GcRaxhh3-0_j3CtVSZ0lTbv_Z3As5BfIYzaMlwUzFGvCVOq2MXVjRK81XOAZ6wIsyKOxva16zjbZryr2V_m3yZ4twI3CPEzJch11_qnhInirHltej-tGg6ySfLaTYeAkw4xYGwENMBBhN5t9odANpScZP_xx5bNfwdW1so6FkV1WhpKlCywoxk_vYZxo187d89bbiu-xOZUa5D-ycFkd1-1rjPXLGE_g5bc4jcQBvNBc-5FDbvt4aJlTQqjpdeppxhxn_gjkPGIAacYDI7szOLC-WYajTStbksUju1iQCyli11kPx0E66me_ZVwOX07f1lRF6D2brWm1LcMAHM3bQUK0LuyVwWPxld64uSAEsvSKsRyJERc7nZUgLf7COnUrrkxgIUNjukbdT2JVN_I-3l3b4YXg6JVD7Y5g0QYBKgXEFpZrDbBVhzo7PXPAhJD6-c3DcUQyRZExbrnFV56RwWuExphw8lYnbMvxPWImiVmB9nRVgFKD0TYaw1sidPSSlZt8Uw34VZzHWIZQAQY0BMjR33fefg42XQ1YzIwPmDx4GYXLl7HNIIVbsRsibKaJnf49mz2qnLC1K272zXSPljO11Ke1MNnsnKyUH7mcwEs9nhTsnMgEOx_TyMLRYo-VEHBDLuEOiBo \ No newline at end of file diff --git a/recipes-demo/navigation/ondemandnavi_git.bb b/recipes-demo/navigation/ondemandnavi_git.bb index 3b9fce4d5..2cc972a35 100644 --- a/recipes-demo/navigation/ondemandnavi_git.bb +++ b/recipes-demo/navigation/ondemandnavi_git.bb @@ -10,13 +10,29 @@ DEPENDS = "qtquickcontrols2 qtlocation libqtappfw" PV = "2.0+git${SRCPV}" -SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/ondemandnavi;protocol=https;branch=${AGL_BRANCH}" +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/ondemandnavi;protocol=https;branch=${AGL_BRANCH} \ + file://navigation.conf \ + file://navigation.token \ +" SRCREV = "${AGL_APP_REVISION}" S = "${WORKDIR}/git" inherit qmake5 pkgconfig +do_install:append() { + # Currently using default global client and CA certificates + # for KUKSA.val SSL, installing app specific ones would go here. + + # VIS authorization token file for KUKSA.val should ideally not + # be readable by other users, but currently that's not doable + # until a packaging/sandboxing/MAC scheme is (re)implemented or + # something like OAuth is plumbed in as an alternative. + install -d ${D}${sysconfdir}/xdg/AGL/navigation + install -m 0644 ${WORKDIR}/navigation.conf ${D}${sysconfdir}/xdg/AGL/ + install -m 0644 ${WORKDIR}/navigation.token ${D}${sysconfdir}/xdg/AGL/navigation/ +} + FILES:${PN} += "${datadir}/icons/" RDEPENDS:${PN} += " \ diff --git a/recipes-demo/navigation/tbtnavi/tbtnavi.conf b/recipes-demo/navigation/tbtnavi/tbtnavi.conf new file mode 100644 index 000000000..c962f305c --- /dev/null +++ b/recipes-demo/navigation/tbtnavi/tbtnavi.conf @@ -0,0 +1,2 @@ +[vis-client] +authorization = "/etc/xdg/AGL/tbtnavi/tbtnavi.token" diff --git a/recipes-demo/navigation/tbtnavi/tbtnavi.service b/recipes-demo/navigation/tbtnavi/tbtnavi.service new file mode 100644 index 000000000..cc040009c --- /dev/null +++ b/recipes-demo/navigation/tbtnavi/tbtnavi.service @@ -0,0 +1,11 @@ +[Unit] +Requires=agl-compositor.service +After=agl-compositor.service + +[Service] +Type=simple +ExecStart=/usr/bin/tbtnavi +Restart=on-failure + +[Install] +WantedBy=agl-session.target diff --git a/recipes-demo/navigation/tbtnavi/tbtnavi.token b/recipes-demo/navigation/tbtnavi/tbtnavi.token new file mode 100644 index 000000000..770aadcff --- /dev/null +++ b/recipes-demo/navigation/tbtnavi/tbtnavi.token @@ -0,0 +1 @@ +eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJrdWtzYS52YWwiLCJpc3MiOiJFY2xpcHNlIEtVS1NBIERldiIsImFkbWluIjp0cnVlLCJpYXQiOjE1MTYyMzkwMjIsImV4cCI6MTc2NzIyNTU5OSwia3Vrc2EtdnNzIjp7IioiOiJydyJ9fQ.QQcVR0RuRJIoasPXYsMGZhdvhLjUalk4GcRaxhh3-0_j3CtVSZ0lTbv_Z3As5BfIYzaMlwUzFGvCVOq2MXVjRK81XOAZ6wIsyKOxva16zjbZryr2V_m3yZ4twI3CPEzJch11_qnhInirHltej-tGg6ySfLaTYeAkw4xYGwENMBBhN5t9odANpScZP_xx5bNfwdW1so6FkV1WhpKlCywoxk_vYZxo187d89bbiu-xOZUa5D-ycFkd1-1rjPXLGE_g5bc4jcQBvNBc-5FDbvt4aJlTQqjpdeppxhxn_gjkPGIAacYDI7szOLC-WYajTStbksUju1iQCyli11kPx0E66me_ZVwOX07f1lRF6D2brWm1LcMAHM3bQUK0LuyVwWPxld64uSAEsvSKsRyJERc7nZUgLf7COnUrrkxgIUNjukbdT2JVN_I-3l3b4YXg6JVD7Y5g0QYBKgXEFpZrDbBVhzo7PXPAhJD6-c3DcUQyRZExbrnFV56RwWuExphw8lYnbMvxPWImiVmB9nRVgFKD0TYaw1sidPSSlZt8Uw34VZzHWIZQAQY0BMjR33fefg42XQ1YzIwPmDx4GYXLl7HNIIVbsRsibKaJnf49mz2qnLC1K272zXSPljO11Ke1MNnsnKyUH7mcwEs9nhTsnMgEOx_TyMLRYo-VEHBDLuEOiBo \ No newline at end of file diff --git a/recipes-demo/navigation/tbtnavi_git.bb b/recipes-demo/navigation/tbtnavi_git.bb index 5981cc584..66cafe6a9 100644 --- a/recipes-demo/navigation/tbtnavi_git.bb +++ b/recipes-demo/navigation/tbtnavi_git.bb @@ -22,12 +22,35 @@ DEPENDS = " \ PV = "2.0+git${SRCPV}" -SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/tbtnavi;protocol=https;branch=${AGL_BRANCH}" +SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/tbtnavi;protocol=https;branch=${AGL_BRANCH} \ + file://tbtnavi.service \ + file://tbtnavi.conf \ + file://tbtnavi.token \ +" SRCREV = "${AGL_APP_REVISION}" S = "${WORKDIR}/git" -inherit qmake5 pkgconfig +inherit qmake5 systemd pkgconfig + +do_install:append() { + install -d ${D}${systemd_user_unitdir}/agl-session.target.wants + install -m0644 ${WORKDIR}/tbtnavi.service ${D}${systemd_user_unitdir}/tbtnavi.service + ln -s ../tbtnavi.service ${D}${systemd_user_unitdir}/agl-session.target.wants/tbtnavi.service + + # Currently using default global client and CA certificates + # for KUKSA.val SSL, installing app specific ones would go here. + + # VIS authorization token file for KUKSA.val should ideally not + # be readable by other users, but currently that's not doable + # until a packaging/sandboxing/MAC scheme is (re)implemented or + # something like OAuth is plumbed in as an alternative. + install -d ${D}${sysconfdir}/xdg/AGL/tbtnavi + install -m 0644 ${WORKDIR}/tbtnavi.conf ${D}${sysconfdir}/xdg/AGL/ + install -m 0644 ${WORKDIR}/tbtnavi.token ${D}${sysconfdir}/xdg/AGL/tbtnavi/ +} + +FILES:${PN} += " ${systemd_user_unitdir}" RDEPENDS:${PN} += " \ qtlocation \