summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gnu/local.mk5
-rw-r--r--gnu/packages/jami.scm46
-rw-r--r--gnu/packages/patches/jami-fix-qml-imports.patch78
-rw-r--r--gnu/packages/patches/jami-fix-unit-tests-build.patch139
-rw-r--r--gnu/packages/patches/jami-libjami-headers-search.patch109
-rw-r--r--gnu/packages/patches/jami-sip-unregister.patch48
-rw-r--r--gnu/packages/patches/jami-xcb-link.patch72
7 files changed, 488 insertions, 9 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index f747653a6f..e3e02314bb 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1342,7 +1342,12 @@ dist_patch_DATA =						\
   %D%/packages/patches/isl-0.11.1-aarch64-support.patch	\
   %D%/packages/patches/itk-snap-alt-glibc-compat.patch		\
   %D%/packages/patches/jami-disable-integration-tests.patch	\
+  %D%/packages/patches/jami-fix-qml-imports.patch		\
+  %D%/packages/patches/jami-fix-unit-tests-build.patch          \
+  %D%/packages/patches/jami-libjami-headers-search.patch	\
   %D%/packages/patches/jami-no-webengine.patch			\
+  %D%/packages/patches/jami-sip-unregister.patch		\
+  %D%/packages/patches/jami-xcb-link.patch			\
   %D%/packages/patches/jamvm-1.5.1-aarch64-support.patch	\
   %D%/packages/patches/jamvm-1.5.1-armv7-support.patch	\
   %D%/packages/patches/jamvm-2.0.0-aarch64-support.patch	\
diff --git a/gnu/packages/jami.scm b/gnu/packages/jami.scm
index 7849a36e27..a9a988ca5a 100644
--- a/gnu/packages/jami.scm
+++ b/gnu/packages/jami.scm
@@ -95,7 +95,12 @@
      (base32
       "0hbsjjs61n7268lyjnjb9lzfpkkd65fmz76l1bg4awlz1f3cyywm"))
     (patches (search-patches "jami-disable-integration-tests.patch"
-                             "jami-no-webengine.patch"))))
+                             "jami-libjami-headers-search.patch"
+                             "jami-fix-unit-tests-build.patch"
+                             "jami-fix-qml-imports.patch"
+                             "jami-no-webengine.patch"
+                             "jami-sip-unregister.patch"
+                             "jami-xcb-link.patch"))))
 
 ;; Jami maintains a set of patches for some key dependencies (currently
 ;; pjproject and ffmpeg) of Jami that haven't yet been integrated upstream.
@@ -504,19 +509,14 @@ protocols, as well as decentralized calling using P2P-DHT.")
     (arguments
      (list
       #:qtbase qtbase
-      ;; The test suite fails to build (see:
-      ;; https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/882).
-      #:tests? #f
       #:configure-flags
-      #~(list "-DENABLE_TESTS=OFF"
+      #~(list "-DENABLE_TESTS=ON"
               ;; Disable the webengine since it grows the closure size by
               ;; about 450 MiB and requires more resources.
               "-DWITH_WEBENGINE=OFF"
               ;; Use libwrap to link directly to libjami instead of
               ;; communicating via D-Bus to jamid, the Jami daemon.
-              "-DENABLE_LIBWRAP=ON"
-              (string-append "-DLIBJAMI_INCLUDE_DIR="
-                             #$(this-package-input "libjami") "/include/jami"))
+              "-DENABLE_LIBWRAP=ON")
       #:phases
       #~(modify-phases %standard-phases
           (add-after 'unpack 'change-directory/maybe
@@ -531,7 +531,32 @@ protocols, as well as decentralized calling using P2P-DHT.")
                 (("// clang-format on.*" anchor)
                  (string-append "const char VERSION_STRING[] = \""
                                 #$version "\";\n"
-                                anchor))))))))
+                                anchor)))))
+          (replace 'check
+            (lambda* (#:key tests? #:allow-other-keys)
+              (when tests?
+                (setenv "QT_QPA_PLATFORM" "offscreen")
+                (setenv "QT_QUICK_BACKEND" "software")
+                ;; The tests require a writable HOME.
+                (setenv "HOME" "/tmp")
+
+                (display "Running unittests...\n")
+                (invoke "tests/unittests" "-mutejamid")
+
+                ;; XXX: There are currently multiple failures with the
+                ;; functional tests (see:
+                ;; https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/883),
+                ;; so the code below is disabled for now.
+                ;;
+                ;; (display "Running functional tests...\n")
+                ;; ;; This is to allow building from the source tarball or
+                ;; ;; directly from the git repository.
+                ;; (let  ((tests-qml (if (file-exists? "../client-qt/tests")
+                ;;                       "../client-qt/tests/qml"
+                ;;                       "../tests/qml")))
+                ;;   (invoke "tests/qml_tests" "-mutejamid"
+                ;;           "-input" tests-qml))
+                ))))))
     (native-inputs
      (list googletest
            pkg-config
@@ -539,11 +564,14 @@ protocols, as well as decentralized calling using P2P-DHT.")
            qttools
            doxygen
            graphviz
+           gsettings-desktop-schemas    ;for tests
            vulkan-headers))
     (inputs
      (list ffmpeg-jami
+           glib                         ;for integration with GNOME
            libjami
            libnotify
+           libxcb
            libxkbcommon
            network-manager
            qrencode
diff --git a/gnu/packages/patches/jami-fix-qml-imports.patch b/gnu/packages/patches/jami-fix-qml-imports.patch
new file mode 100644
index 0000000000..e24171785d
--- /dev/null
+++ b/gnu/packages/patches/jami-fix-qml-imports.patch
@@ -0,0 +1,78 @@
+From 9c4d065093d18b5495d3193028457b7393daea4b Mon Sep 17 00:00:00 2001
+From: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
+Date: Mon, 7 Nov 2022 16:26:50 -0500
+Subject: [PATCH] tests: Fix broken QML import directives.
+
+Fixes
+<https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/883>.
+
+Automated via:
+  $ find tests -name '*.qml'  | xargs sed -i 's,qrc:/src,../../../src,'
+
+Change-Id: Ic1a2f419e3e328e8bf861e7fdf370f15da66675f
+---
+Upstream status: https://review.jami.net/c/jami-client-qt/+/22990
+
+ tests/qml/src/tst_ChatViewFooter.qml       | 2 +-
+ tests/qml/src/tst_FilesToSendContainer.qml | 2 +-
+ tests/qml/src/tst_PresenceIndicator.qml    | 2 +-
+ tests/qml/src/tst_WizardView.qml           | 4 ++--
+ 4 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/client-qt/tests/qml/src/tst_ChatViewFooter.qml b/client-qt/tests/qml/src/tst_ChatViewFooter.qml
+index 84316d78..b0cffe1a 100644
+--- a/client-qt/tests/qml/src/tst_ChatViewFooter.qml
++++ b/client-qt/tests/qml/src/tst_ChatViewFooter.qml
+@@ -25,7 +25,7 @@ import QtTest
+ import net.jami.Models 1.1
+ import net.jami.Constants 1.1
+ 
+-import "qrc:/src/app/mainview/components"
++import "../../../src/app/mainview/components"
+ 
+ ColumnLayout {
+     id: root
+diff --git a/client-qt/tests/qml/src/tst_FilesToSendContainer.qml b/client-qt/tests/qml/src/tst_FilesToSendContainer.qml
+index b7f4810a..9432a44d 100644
+--- a/client-qt/tests/qml/src/tst_FilesToSendContainer.qml
++++ b/client-qt/tests/qml/src/tst_FilesToSendContainer.qml
+@@ -25,7 +25,7 @@ import QtTest
+ import net.jami.Models 1.1
+ import net.jami.Constants 1.1
+ 
+-import "qrc:/src/app/mainview/components"
++import "../../../src/app/mainview/components"
+ 
+ ColumnLayout {
+     id: root
+diff --git a/client-qt/tests/qml/src/tst_PresenceIndicator.qml b/client-qt/tests/qml/src/tst_PresenceIndicator.qml
+index 0eda9169..46c048e8 100644
+--- a/client-qt/tests/qml/src/tst_PresenceIndicator.qml
++++ b/client-qt/tests/qml/src/tst_PresenceIndicator.qml
+@@ -22,7 +22,7 @@ import QtTest
+ import net.jami.Models 1.1
+ import net.jami.Constants 1.1
+ 
+-import "qrc:/src/app/commoncomponents"
++import "../../../src/app/commoncomponents"
+ 
+ PresenceIndicator {
+     id: uut
+diff --git a/client-qt/tests/qml/src/tst_WizardView.qml b/client-qt/tests/qml/src/tst_WizardView.qml
+index 08698b7a..6a4f971d 100644
+--- a/client-qt/tests/qml/src/tst_WizardView.qml
++++ b/client-qt/tests/qml/src/tst_WizardView.qml
+@@ -24,8 +24,8 @@ import net.jami.Models 1.1
+ import net.jami.Constants 1.1
+ import net.jami.Enums 1.1
+ 
+-import "qrc:/src/app/wizardview"
+-import "qrc:/src/app/commoncomponents"
++import "../../../src/app/wizardview"
++import "../../../src/app/commoncomponents"
+ 
+ WizardView {
+     id: uut
+-- 
+2.37.3
+
diff --git a/gnu/packages/patches/jami-fix-unit-tests-build.patch b/gnu/packages/patches/jami-fix-unit-tests-build.patch
new file mode 100644
index 0000000000..0216a4bd67
--- /dev/null
+++ b/gnu/packages/patches/jami-fix-unit-tests-build.patch
@@ -0,0 +1,139 @@
+From 82ecd786a29344d57e6dd95ef0800bef9dd44542 Mon Sep 17 00:00:00 2001
+From: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
+Date: Sun, 6 Nov 2022 00:16:34 -0400
+Subject: [PATCH 3/3] tests: Fix various compilation failures.
+
+Fixes <https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/882>.
+
+* tests/CMakeLists.txt: Add "Widgets" Qt module to find_package call.
+(QML_TEST_LIBS): Add Qt::Widgets.
+* tests/CMakeLists.txt: Rename QML_LIBS to QT_LIBS, a regression
+introduced in d82e3820706214d15d7cb7462978b7a43b798355.  Remove the
+dependency on on the Widgets module, now provided via QT_LIBS.
+* tests/qml/main.cpp [WITH_WEBENGINE]: Include QtWebEngine modules
+conditionally.
+(main) [WITH_WEBENGINE]: Initialize webengine conditionally.
+* tests/CMakeLists.txt: Link test objects with ${LIBCLIENT_NAME}.
+* src/app/qmlregister.h (registerTypes): Change parent type from
+MainApplication* to QObject*
+* src/app/qmlregister.cpp (registerTypes): Likewise.
+* tests/unittests/account_unittest.cpp (globalEnv): Remove variable.
+* tests/unittests/contact_unittest.cpp: Likewise.
+---
+Upstream status: https://review.jami.net/c/jami-client-qt/+/22984/1
+
+ src/app/qmlregister.cpp              | 2 +-
+ src/app/qmlregister.h                | 2 +-
+ tests/CMakeLists.txt                 | 6 +++---
+ tests/qml/main.cpp                   | 7 ++++---
+ tests/unittests/account_unittest.cpp | 2 --
+ tests/unittests/contact_unittest.cpp | 2 --
+ 6 files changed, 9 insertions(+), 12 deletions(-)
+
+diff --git a/client-qt/client-qt/src/app/qmlregister.cpp b/client-qt/src/app/qmlregister.cpp
+index 285f7814..67222eb5 100644
+--- a/client-qt/client-qt/src/app/qmlregister.cpp
++++ b/client-qt/src/app/qmlregister.cpp
+@@ -105,7 +105,7 @@ registerTypes(QQmlEngine* engine,
+               AppSettingsManager* settingsManager,
+               PreviewEngine* previewEngine,
+               ScreenInfo* screenInfo,
+-              MainApplication* parent)
++              QObject* parent)
+ {
+     // setup the adapters (their lifetimes are that of MainApplication)
+     auto callAdapter = new CallAdapter(systemTray, lrcInstance, parent);
+diff --git a/client-qt/client-qt/src/app/qmlregister.h b/client-qt/src/app/qmlregister.h
+index 38bfd091..aac0a887 100644
+--- a/client-qt/client-qt/src/app/qmlregister.h
++++ b/client-qt/src/app/qmlregister.h
+@@ -67,5 +67,5 @@ void registerTypes(QQmlEngine* engine,
+                    AppSettingsManager* appSettingsManager,
+                    PreviewEngine* previewEngine,
+                    ScreenInfo* screenInfo,
+-                   MainApplication* parent);
++                   QObject* parent);
+ }
+diff --git a/client-qt/client-qt/tests/CMakeLists.txt b/client-qt/tests/CMakeLists.txt
+index 8904d5ec..4e42b307 100644
+--- a/client-qt/client-qt/tests/CMakeLists.txt
++++ b/client-qt/tests/CMakeLists.txt
+@@ -1,4 +1,4 @@
+-find_package(Qt${QT_VERSION_MAJOR} CONFIG REQUIRED QuickTest Test)
++find_package(Qt${QT_VERSION_MAJOR} CONFIG REQUIRED QuickTest Test Widgets)
+ 
+ if(MSVC)
+     # Download and unpack googletest for windows
+@@ -15,7 +15,7 @@ else()
+ endif()
+ 
+ enable_testing(true)
+-set(QML_TEST_LIBS ${QML_LIBS} Qt::QuickTest Qt::Test)
++set(QML_TEST_LIBS ${QT_LIBS} ${LIBCLIENT_NAME} Qt::QuickTest Qt::Test Qt::Widgets)
+ set(TESTS_INCLUDES
+     ${CMAKE_SOURCE_DIR}/src
+     ${CMAKE_SOURCE_DIR}/tests/qml
+@@ -192,4 +192,4 @@ else()
+                                ${LRC}/include)
+ 
+     add_test(NAME UnitTests COMMAND unittests)
+-endif()
+\ No newline at end of file
++endif()
+diff --git a/client-qt/client-qt/tests/qml/main.cpp b/client-qt/tests/qml/main.cpp
+index 09c02f3e..4c42027c 100644
+--- a/client-qt/client-qt/tests/qml/main.cpp
++++ b/client-qt/tests/qml/main.cpp
+@@ -31,9 +31,10 @@
+ #include <QQmlEngine>
+ #include <QQmlContext>
+ #include <QFontDatabase>
++#ifdef WITH_WEBENGINE
+ #include <QtWebEngineCore>
+ #include <QtWebEngineQuick>
+-
++#endif
+ #ifdef Q_OS_WIN
+ #include <windows.h>
+ #endif
+@@ -155,9 +156,9 @@ main(int argc, char** argv)
+         // Adjust the argument count.
+         argc = std::distance(argv, end);
+     }
+-
++#ifdef WITH_WEBENGINE
+     QtWebEngineQuick::initialize();
+-
++#endif
+     QTEST_SET_MAIN_SOURCE_PATH
+     Setup setup(muteDring);
+     return quick_test_main_with_setup(argc, argv, "qml_test", nullptr, &setup);
+diff --git a/client-qt/client-qt/tests/unittests/account_unittest.cpp b/client-qt/tests/unittests/account_unittest.cpp
+index aa98453e..5af2ad6e 100644
+--- a/client-qt/client-qt/tests/unittests/account_unittest.cpp
++++ b/client-qt/tests/unittests/account_unittest.cpp
+@@ -19,8 +19,6 @@
+ 
+ #include "globaltestenvironment.h"
+ 
+-TestEnvironment globalEnv;
+-
+ /*!
+  * Test fixture for AccountAdapter testing
+  */
+diff --git a/client-qt/client-qt/tests/unittests/contact_unittest.cpp b/client-qt/tests/unittests/contact_unittest.cpp
+index af8a9a22..b05cc856 100644
+--- a/client-qt/client-qt/tests/unittests/contact_unittest.cpp
++++ b/client-qt/tests/unittests/contact_unittest.cpp
+@@ -18,8 +18,6 @@
+ 
+ #include "globaltestenvironment.h"
+ 
+-TestEnvironment globalEnv;
+-
+ /*!
+  * Test fixture for AccountAdapter testing
+  */
+-- 
+2.37.3
+
diff --git a/gnu/packages/patches/jami-libjami-headers-search.patch b/gnu/packages/patches/jami-libjami-headers-search.patch
new file mode 100644
index 0000000000..44e099a610
--- /dev/null
+++ b/gnu/packages/patches/jami-libjami-headers-search.patch
@@ -0,0 +1,109 @@
+From 1168aba6181e30ee4c322e5f437bde22bece5698 Mon Sep 17 00:00:00 2001
+From: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
+Date: Sat, 5 Nov 2022 23:18:13 -0400
+Subject: [PATCH 1/3] cmake: Simplify lookup logic for libjami headers.
+
+* extras/build/cmake/modules/FindLibJami.cmake: Rename
+LIBJAMI_INCLUDE_DIRS to LIBJAMI_INCLUDE_DIR.  Use find_path to search
+for jami.h directory.
+* CMakeLists.txt: Adjust accordingly.
+* src/libclient/CMakeLists.txt: Likewise.
+* src/libclient/qtwrapper/CMakeLists.txt: Likewise.
+
+Change-Id: I494358f9bfafb41f000daeec4196747b2c184401
+---
+Upstream status: https://review.jami.net/c/jami-client-qt/+/22973
+
+ CMakeLists.txt                               |  2 +-
+ extras/build/cmake/modules/FindLibJami.cmake | 21 ++++++--------------
+ src/libclient/CMakeLists.txt                 |  2 +-
+ src/libclient/qtwrapper/CMakeLists.txt       |  2 +-
+ 4 files changed, 9 insertions(+), 18 deletions(-)
+
+diff --git a/client-qt/CMakeLists.txt b/CMakeLists.txt
+index d0a8fd70..94ac6074 100644
+--- a/client-qt/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -118,7 +118,7 @@ set(CMAKE_MODULE_PATH
+   ${CMAKE_MODULE_PATH} "${EXTRAS_DIR}/build/cmake/modules")
+ find_package(LibJami REQUIRED)
+ if(LIBJAMI_FOUND)
+-  include_directories(${LIBJAMI_INCLUDE_DIRS})
++  include_directories(${LIBJAMI_INCLUDE_DIR})
+ endif()
+ 
+ include(FindPython3)
+diff --git a/client-qt/extras/build/cmake/modules/FindLibJami.cmake b/extras/build/cmake/modules/FindLibJami.cmake
+index ddb05319..9ad20d2b 100644
+--- a/client-qt/extras/build/cmake/modules/FindLibJami.cmake
++++ b/extras/build/cmake/modules/FindLibJami.cmake
+@@ -20,28 +20,19 @@
+ 
+ # Once done, this find module will set:
+ #
+-#   LIBJAMI_INCLUDE_DIRS - libjami include directories
++#   LIBJAMI_INCLUDE_DIR - libjami include directories
+ #   LIBJAMI_FOUND - whether it was able to find the include directories
+ #   LIBJAMI_LIB - path to libjami or libring library
+ 
+ set(LIBJAMI_FOUND true)
+ 
+ if(WITH_DAEMON_SUBMODULE)
+-  set(LIBJAMI_INCLUDE_DIRS ${DAEMON_DIR}/src/jami)
++  set(LIBJAMI_INCLUDE_DIR ${DAEMON_DIR}/src/jami)
+ else()
+-  if(EXISTS ${LIBJAMI_INCLUDE_DIR}/jami.h)
+-    set(LIBJAMI_INCLUDE_DIRS ${LIBJAMI_INCLUDE_DIR})
+-  elseif(EXISTS ${LIBJAMI_BUILD_DIR}/jami/jami.h)
+-    set(LIBJAMI_INCLUDE_DIRS ${LIBJAMI_BUILD_DIR}/jami)
+-  elseif(EXISTS ${RING_INCLUDE_DIR}/jami.h)
+-    set(LIBJAMI_INCLUDE_DIRS ${RING_INCLUDE_DIR})
+-  elseif(EXISTS ${RING_BUILD_DIR}/jami/jami.h)
+-    set(LIBJAMI_INCLUDE_DIRS ${RING_BUILD_DIR}/jami)
+-  elseif(EXISTS ${CMAKE_INSTALL_PREFIX}/include/jami/jami.h)
+-    set(LIBJAMI_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/include/jami)
+-  else()
++  find_path(LIBJAMI_INCLUDE_DIR jami.h PATH_SUFFIXES jami)
++  if(NOT LIBJAMI_INCLUDE_DIR)
+     message(STATUS "Jami daemon headers not found!
+-Set -DLIBJAMI_BUILD_DIR or -DCMAKE_INSTALL_PREFIX")
++Set -DCMAKE_INSTALL_PREFIX or use -DWITH_DAEMON_SUBMODULE")
+     set(LIBJAMI_FOUND false)
+   endif()
+ endif()
+@@ -102,5 +93,5 @@ endif()
+ # Restore the original value of CMAKE_FIND_LIBRARY_SUFFIXES.
+ set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_orig})
+ 
+-message(STATUS "Jami daemon headers are in " ${LIBJAMI_INCLUDE_DIRS})
++message(STATUS "Jami daemon headers are in " ${LIBJAMI_INCLUDE_DIR})
+ message(STATUS "Jami daemon library is at " ${LIBJAMI_LIB})
+diff --git a/client-qt/src/libclient/CMakeLists.txt b/src/libclient/CMakeLists.txt
+index 2676c9c4..ac58ea2b 100644
+--- a/client-qt/src/libclient/CMakeLists.txt
++++ b/src/libclient/CMakeLists.txt
+@@ -62,7 +62,7 @@ set(CMAKE_MODULE_PATH
+   ${CMAKE_MODULE_PATH} "${EXTRAS_DIR}/build/cmake/modules")
+ find_package(LibJami REQUIRED)
+ if(LIBJAMI_FOUND)
+-  include_directories(${LIBJAMI_INCLUDE_DIRS})
++  include_directories(${LIBJAMI_INCLUDE_DIR})
+ endif()
+ 
+ string(SUBSTRING ${CMAKE_GENERATOR} 0 14 CMAKE_GENERATOR_SHORT)
+diff --git a/client-qt/src/libclient/qtwrapper/CMakeLists.txt b/src/libclient/qtwrapper/CMakeLists.txt
+index acee0d0c..ba68aac4 100644
+--- a/client-qt/src/libclient/qtwrapper/CMakeLists.txt
++++ b/client-qt/src/libclient/qtwrapper/CMakeLists.txt
+@@ -46,7 +46,7 @@ else()
+ endif()
+ 
+ include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+-include_directories(${LIBJAMI_INCLUDE_DIRS})
++include_directories(${LIBJAMI_INCLUDE_DIR})
+ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../)
+ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../dbus)
+ 
+-- 
+2.37.3
+
diff --git a/gnu/packages/patches/jami-sip-unregister.patch b/gnu/packages/patches/jami-sip-unregister.patch
new file mode 100644
index 0000000000..1f0302bb12
--- /dev/null
+++ b/gnu/packages/patches/jami-sip-unregister.patch
@@ -0,0 +1,48 @@
+From c1e6d664601b35a466f4e02e86a2c8181fdcca12 Mon Sep 17 00:00:00 2001
+From: Antoine Noreau <antoine.noreau@savoirfairelinux.com>
+Date: Thu, 3 Nov 2022 15:35:40 -0400
+Subject: [PATCH] sip: ensure correct unregister upon closure
+
+Ensure SIP connections are gracefully terminated:
+Removed duplicated register calls to SIP server
+
+Change-Id: I330e67cf9534504f92517996eb7b693b43d359d3
+Gitlab: #786
+---
+ src/upnp/upnp_context.cpp | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+diff --git a/daemon/src/upnp/upnp_context.cpp b/daemon/src/upnp/upnp_context.cpp
+index a447e2d75..c68fe502c 100644
+--- a/daemon/src/upnp/upnp_context.cpp
++++ b/daemon/src/upnp/upnp_context.cpp
+@@ -143,7 +143,7 @@ void
+ UPnPContext::stopUpnp(bool forceRelease)
+ {
+     if (not isValidThread()) {
+-        runOnUpnpContextQueue([this] { stopUpnp(); });
++        runOnUpnpContextQueue([this, forceRelease] { stopUpnp(forceRelease); });
+         return;
+     }
+ 
+@@ -168,10 +168,15 @@ UPnPContext::stopUpnp(bool forceRelease)
+         preferredIgd_.reset();
+         validIgdList_.clear();
+     }
+-
+     for (auto const& map : toRemoveList) {
+         requestRemoveMapping(map);
+-        updateMappingState(map, MappingState::FAILED);
++
++        /* Notify is not needed in updateMappingState when
++        shutting down (hence set it to false). NotifyCallback
++        would trigger a new SIP registration and create a
++        false registered state upon program close.  */
++
++        updateMappingState(map, MappingState::FAILED, false);
+         // We dont remove mappings with auto-update enabled,
+         // unless forceRelease is true.
+         if (not map->getAutoUpdate() or forceRelease) {
+-- 
+2.37.3
+
diff --git a/gnu/packages/patches/jami-xcb-link.patch b/gnu/packages/patches/jami-xcb-link.patch
new file mode 100644
index 0000000000..6879493123
--- /dev/null
+++ b/gnu/packages/patches/jami-xcb-link.patch
@@ -0,0 +1,72 @@
+From 3db2a7802422e69f50030db854abfb72fbc9caa4 Mon Sep 17 00:00:00 2001
+From: Maxim Cournoyer <maxim.cournoyer@savoirfairelinux.com>
+Date: Fri, 11 Nov 2022 22:38:32 -0500
+Subject: [PATCH] Move xcb include/link directives from jami to libclient.
+
+Relates to <https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/882>.
+
+This problem was discovered when attempting to build the test suite:
+
+   ld: ../src/libclient/liblibjamiclient.a(avmodel.cpp.o): undefined
+   reference to symbol 'xcb_get_setup'
+
+* CMakeLists.txt: [!(APPLE or MSVC] Move xcb includes and link directives to...
+* src/libclient/CMakeLists.txt [!(APPLE or MSVC]: ... here.
+
+Change-Id: If9b6653e157081300caad8f13cafe4979a49630b
+---
+ CMakeLists.txt               | 6 +-----
+ src/libclient/CMakeLists.txt | 6 ++++++
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/client-qt/CMakeLists.txt b/client-qt/CMakeLists.txt
+index d0a8fd70..2a09fd6c 100644
+--- a/client-qt/CMakeLists.txt
++++ b/client-qt/CMakeLists.txt
+@@ -384,8 +384,6 @@ elseif (NOT APPLE)
+     add_definitions(${LIBGDKPIXBUF_CFLAGS})
+   endif()
+ 
+-  pkg_check_modules(XCB xcb)
+-
+   list(PREPEND CMAKE_PREFIX_PATH
+     ${LIBJAMI_CONTRIB_DIR}/native/ffmpeg/libavutil)
+   pkg_check_modules(LIBAVUTIL libavutil>=55.75.100)
+@@ -398,7 +396,6 @@ elseif (NOT APPLE)
+     ${LIBNOTIFY_INCLUDE_DIRS}
+     ${LIBGDKPIXBUF_INCLUDE_DIRS}
+     ${GLIB_INCLUDE_DIRS}
+-    ${XCB_INCLUDE_DIRS}
+     ${LIBAVUTIL_INCLUDE_DIRS})
+ 
+   set(JAMI_DATA_PREFIX "${CMAKE_INSTALL_PREFIX}/share")
+@@ -586,8 +583,7 @@ elseif (NOT APPLE)
+     ${LIBNOTIFY_LIBRARIES}
+     ${LIBGDKPIXBUF_LIBRARIES}
+     ${GLIB_LIBRARIES}
+-    ${GIO_LIBRARIES}
+-    ${XCB_LIBRARIES})
++    ${GIO_LIBRARIES})
+ 
+   # Installation rules
+   install(
+diff --git a/client-qt/src/libclient/CMakeLists.txt b/client-qt/src/libclient/CMakeLists.txt
+index 99780f5f..1dd32677 100644
+--- a/client-qt/src/libclient/CMakeLists.txt
++++ b/client-qt/src/libclient/CMakeLists.txt
+@@ -475,6 +475,12 @@ add_library(${LIBCLIENT_NAME} STATIC
+ foreach(QT_LIB ${QT_LIBS})
+   target_link_libraries(${LIBCLIENT_NAME} ${QT_LIB})
+ endforeach()
++
++if(NOT(APPLE OR MSVC))
++  pkg_check_modules(XCB xcb IMPORTED_TARGET)
++  target_link_libraries(${LIBCLIENT_NAME} PkgConfig::XCB)
++endif()
++
+ if(ENABLE_LIBWRAP)
+   target_link_libraries(${LIBCLIENT_NAME} qtwrapper ${LIBJAMI_LIB})
+   if (NOT (CMAKE_CXX_COMPILER_ID MATCHES "MSVC"))
+-- 
+2.37.3
+