From 5afc29a2b5b52b2ac36a7e0ba083bb450acd8b83 Mon Sep 17 00:00:00 2001
From: Emmanuel Lepage <emmanuel.lepage@savoirfairelinux.com>
Date: Thu, 31 May 2012 11:39:51 -0400
Subject: [PATCH] [ #11731 ] Fix visual glitch when hang up, harden against 0
 participant conference

---
 kde/src/CallView.cpp             | 18 +++++++-----------
 kde/src/lib/CallModel.hpp        |  2 ++
 kde/src/widgets/CallTreeItem.cpp |  3 +++
 3 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/kde/src/CallView.cpp b/kde/src/CallView.cpp
index 20829835d6..92e2b03733 100644
--- a/kde/src/CallView.cpp
+++ b/kde/src/CallView.cpp
@@ -86,7 +86,8 @@ CallView::CallView(QWidget* parent) : QTreeWidget(parent),m_pActiveOverlay(0),m_
    }
 
    foreach(Call* active, SFLPhone::model()->getConferenceList()) {
-      addConference(active);
+      if (qobject_cast<Call*>(active)) //As of May 2012, the deamon still produce fake conferences
+         addConference(active);
    }
 
    //User Interface even
@@ -557,10 +558,6 @@ void CallView::destroyCall(Call* toDestroy)
       SFLPhone::model()->getIndex(toDestroy)->parent()->removeChild(SFLPhone::model()->getIndex(toDestroy));
       if (parent->childCount() == 0) /*This should never happen, but it does*/
          takeTopLevelItem(indexOfTopLevelItem(parent));
-      else if (parent->childCount() == 1) {
-         addTopLevelItem(extractItem(parent->child(0)));
-         takeTopLevelItem(indexOfTopLevelItem(parent));
-      } //TODO make sure it just never happen and remove this logic code
    }
    else
       kDebug() << "Call not found";
@@ -649,8 +646,6 @@ bool CallView::conferenceChanged(Call* conf)
 {
    if (!dynamic_cast<Call*>(conf)) return false;
    kDebug() << "Conference changed";
-   //if (!SFLPhone::model()->conferenceChanged(confId, state))
-   //  return false;
 
    CallManagerInterface& callManager = CallManagerInterfaceSingleton::getInstance();
    QStringList callList = callManager.getParticipantList(conf->getConfId());
@@ -666,10 +661,11 @@ bool CallView::conferenceChanged(Call* conf)
          kDebug() << "Call " << callId << " does not exist";
    }
 
-   if (SFLPhone::model()->getIndex(conf)) /*Can happen is the daemon crashed*/
-      for (int j =0; j < SFLPhone::model()->getIndex(conf)->childCount();j++) {
-         if (buffer.indexOf(SFLPhone::model()->getIndex(conf)->child(j)) == -1)
-            insertItem(extractItem(SFLPhone::model()->getIndex(conf)->child(j)));
+   QTreeWidgetItem* item = SFLPhone::model()->getIndex(conf);
+   if (item) /*Can happen if the daemon crashed*/
+      for (int j =0; j < item->childCount();j++) {
+         if (buffer.indexOf(item->child(j)) == -1)
+            insertItem(extractItem(item->child(j)));
       }
 
    Q_ASSERT_X(SFLPhone::model()->getIndex(conf)->childCount() == 0,"changing conference","A conference can't have no participants");
diff --git a/kde/src/lib/CallModel.hpp b/kde/src/lib/CallModel.hpp
index 89c8893aa7..5bd00bb6ce 100644
--- a/kde/src/lib/CallModel.hpp
+++ b/kde/src/lib/CallModel.hpp
@@ -785,6 +785,8 @@ CALLMODEL_TEMPLATE bool CALLMODEL_T::updateWidget     (Call* call, CallWidget va
 CALLMODEL_TEMPLATE bool CALLMODEL_T::updateIndex      (Call* call, Index value      )
 {
    updateCommon(call);
+   if (!m_sPrivateCallList_call[call])
+      return false;
    m_sPrivateCallList_call[call]->index = value                         ;
    m_sPrivateCallList_index[value]      = m_sPrivateCallList_call[call] ;
    return true;
diff --git a/kde/src/widgets/CallTreeItem.cpp b/kde/src/widgets/CallTreeItem.cpp
index 4076381b5a..c76787ffaa 100644
--- a/kde/src/widgets/CallTreeItem.cpp
+++ b/kde/src/widgets/CallTreeItem.cpp
@@ -92,6 +92,9 @@ Call* CallTreeItem::call() const
 ///Set the call item
 void CallTreeItem::setCall(Call *call)
 {
+   if (!call)
+      return;
+   
    m_pItemCall = call;
    setAcceptDrops(true);
 
-- 
GitLab