From df63960974c306d1402d2961f856d07b63b10226 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Thu, 26 Jan 2023 16:25:05 -0500
Subject: [PATCH] callmodel: avoid to add empty medias

If a user join a conference with video enabled, but without any
valid camera and try to un-mute/mute in loop, it will add
new empty medias with incorrect sources causing duplicated participants
in the conference.

Change-Id: Ifa0dc090ca49ae6f9799f1209f3514cf540365da
---
 src/app/qmlregister.cpp     |  1 -
 src/libclient/callmodel.cpp | 24 ++++++++++++------------
 2 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/src/app/qmlregister.cpp b/src/app/qmlregister.cpp
index 1c203dbb1..1ecd207b2 100644
--- a/src/app/qmlregister.cpp
+++ b/src/app/qmlregister.cpp
@@ -43,7 +43,6 @@
 #include "moderatorlistmodel.h"
 #include "deviceitemlistmodel.h"
 #include "smartlistmodel.h"
-#include "conversationlistmodelbase.h"
 #include "filestosendlistmodel.h"
 #include "callInformationListModel.h"
 #include "rendererinformationlistmodel.h"
diff --git a/src/libclient/callmodel.cpp b/src/libclient/callmodel.cpp
index 9ef31038f..57b169c89 100644
--- a/src/libclient/callmodel.cpp
+++ b/src/libclient/callmodel.cpp
@@ -509,12 +509,14 @@ void
 CallModel::addMedia(const QString& callId, const QString& source, MediaRequestType type, bool mute)
 {
     auto& callInfo = pimpl_->calls[callId];
-    if (!callInfo)
+    if (!callInfo || source.isEmpty())
         return;
 
     QString resource {};
     auto id = 0;
     for (const auto& media : callInfo->mediaList) {
+        if (media[MediaAttributeKey::SOURCE] == source)
+            break;
         if (media[MediaAttributeKey::MEDIA_TYPE] == MediaAttributeValue::VIDEO)
             id++;
     }
@@ -947,14 +949,11 @@ CallModel::getDisplay(int idx, int x, int y, int w, int h)
         .arg(h);
 }
 
-
-
 #ifdef WIN32
 BOOL CALLBACK
 EnumWindowsProcMy(HWND hwnd, LPARAM lParam)
 {
-    std::pair<DWORD, QString>* dataPair = reinterpret_cast<std::pair<DWORD, QString>*>(
-        lParam);
+    std::pair<DWORD, QString>* dataPair = reinterpret_cast<std::pair<DWORD, QString>*>(lParam);
     DWORD lpdwProcessId;
     if (auto parent = GetWindow(hwnd, GW_OWNER))
         GetWindowThreadProcessId(parent, &lpdwProcessId);
@@ -978,12 +977,13 @@ QString
 CallModel::getDisplay(const QString& windowProcessId, const QString& windowId)
 {
     QString sep = libjami::Media::VideoProtocolPrefix::SEPARATOR;
-    QString ret{};
+    QString ret {};
 #if (defined(Q_OS_UNIX) && !defined(__APPLE__))
+    Q_UNUSED(windowId);
     ret = QString("%1%2:+0,0 window-id:%3")
-        .arg(libjami::Media::VideoProtocolPrefix::DISPLAY)
-        .arg(sep)
-        .arg(windowProcessId);
+              .arg(libjami::Media::VideoProtocolPrefix::DISPLAY)
+              .arg(sep)
+              .arg(windowProcessId);
 #endif
 #ifdef WIN32
     // If window changed the name we must look for the parent process window
@@ -999,9 +999,9 @@ CallModel::getDisplay(const QString& windowProcessId, const QString& windowId)
     }
 
     ret = QString("%1%2:+0,0 window-id:title=%3")
-        .arg(libjami::Media::VideoProtocolPrefix::DISPLAY)
-        .arg(sep)
-        .arg(newWindowId);
+              .arg(libjami::Media::VideoProtocolPrefix::DISPLAY)
+              .arg(sep)
+              .arg(newWindowId);
 #endif
     return ret;
 }
-- 
GitLab