From d2a1f356fc4f07c303c9e5dd291a57823a68c9e4 Mon Sep 17 00:00:00 2001
From: Emmanuel Lepage <emmanuel.lepage@savoirfairelinux.com>
Date: Tue, 29 May 2012 15:51:50 -0400
Subject: [PATCH] [ #11435 ] Fix trasfer, it apparently never worked, there was
 a bug in the state machine path

---
 kde/src/CallView.cpp             | 23 ++++++++++++-----------
 kde/src/lib/Call.cpp             |  6 +++---
 kde/src/lib/CallModel.cpp        |  1 -
 kde/src/lib/CallModel.hpp        |  5 ++---
 kde/src/widgets/CallTreeItem.cpp |  2 +-
 5 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/kde/src/CallView.cpp b/kde/src/CallView.cpp
index a71aa41d9c..20829835d6 100644
--- a/kde/src/CallView.cpp
+++ b/kde/src/CallView.cpp
@@ -89,7 +89,6 @@ CallView::CallView(QWidget* parent) : QTreeWidget(parent),m_pActiveOverlay(0),m_
       addConference(active);
    }
 
-   qDebug() << "\n\n\nHERE";
    //User Interface even
    //              SENDER                                   SIGNAL                              RECEIVER                     SLOT                        /
    /**/connect(this              , SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)              ) , this, SLOT( itemDoubleClicked(QTreeWidgetItem*,int)) );
@@ -180,7 +179,7 @@ bool CallView::callToCall(QTreeWidgetItem *parent, int index, const QMimeData *d
       else if ((parent->parent()) || (parent->childCount())) {
          kDebug() << "Call dropped on a conference";
 
-         if ((SFLPhone::model()->getIndex(encodedCallId)->childCount()) && (!parent->childCount())) {
+         if (SFLPhone::model()->getIndex(encodedCallId)->childCount() && (SFLPhone::model()->getIndex(encodedCallId)->childCount()) && (!parent->childCount())) {
             kDebug() << "Conference dropped on a call (doing nothing)";
             return true;
          }
@@ -215,7 +214,7 @@ bool CallView::callToCall(QTreeWidgetItem *parent, int index, const QMimeData *d
          SFLPhone::model()->addParticipant(SFLPhone::model()->getCall(call1),SFLPhone::model()->getCall(call2));
          return true;
       }
-      else if ((SFLPhone::model()->getIndex(encodedCallId)->childCount()) && (!parent->childCount())) {
+      else if (SFLPhone::model()->getIndex(encodedCallId) && (SFLPhone::model()->getIndex(encodedCallId)->childCount()) && (!parent->childCount())) {
          kDebug() << "Call dropped on it's own conference (doing nothing)";
          return true;
       }
@@ -383,6 +382,7 @@ void CallView::transfer()
    
    m_pCallPendingTransfer = 0;
    m_pTransferLE->clear();
+
    m_pTransferOverlay->setVisible(false);
 }
 
@@ -414,14 +414,13 @@ bool CallView::haveOverlay()
 ///Remove the active overlay
 void CallView::hideOverlay()
 {
-   if (m_pActiveOverlay)
+   if (m_pActiveOverlay){
+      disconnect(m_pCallPendingTransfer,SIGNAL(changed()),this,SLOT(hideOverlay()));
       m_pActiveOverlay->setVisible(false);
-   m_pActiveOverlay = 0;
-
-   if (m_pCallPendingTransfer && m_pCallPendingTransfer->getState() == CALL_STATE_TRANSFER ) {
-      m_pCallPendingTransfer->actionPerformed(CALL_ACTION_TRANSFER);
    }
    
+   m_pActiveOverlay = 0;
+   
    m_pCallPendingTransfer = 0;
 } //hideOverlay
 
@@ -489,6 +488,8 @@ QTreeWidgetItem* CallView::extractItem(const QString& callId)
 ///Extract an item from the TreeView and return it, the item is -not- deleted
 QTreeWidgetItem* CallView::extractItem(QTreeWidgetItem* item)
 {
+   if (!item)
+      return nullptr;
    QTreeWidgetItem* parentItem = item->parent();
 
    if (parentItem) {
@@ -514,7 +515,7 @@ CallTreeItem* CallView::insertItem(QTreeWidgetItem* item, Call* parent)
 ///Insert a TreeView item in the TreeView as child of parent or as a top level item, also restore the item Widget
 CallTreeItem* CallView::insertItem(QTreeWidgetItem* item, QTreeWidgetItem* parent)
 {
-   if (!dynamic_cast<QTreeWidgetItem*>(item) && !dynamic_cast<QTreeWidgetItem*>(parent))
+   if (!dynamic_cast<QTreeWidgetItem*>(item) && SFLPhone::model()->getCall(item) && !dynamic_cast<QTreeWidgetItem*>(parent))
       return nullptr;
    
    if (!item) {
@@ -620,8 +621,8 @@ void CallView::itemClicked(QTreeWidgetItem* item, int column) {
 ///Add a new conference, get the call list and update the interface as needed
 Call* CallView::addConference(Call* conf)
 {
-   kDebug() << "\n\n\nConference created";
-   Call* newConf =  conf;//SFLPhone::model()->addConference(confID);//TODO ELV?
+   kDebug() << "Conference created";
+   Call* newConf =  conf;
 
    QTreeWidgetItem* confItem = new QTreeWidgetItem();
    SFLPhone::model()->updateIndex(conf,confItem);
diff --git a/kde/src/lib/Call.cpp b/kde/src/lib/Call.cpp
index ede7b5399c..809c244183 100644
--- a/kde/src/lib/Call.cpp
+++ b/kde/src/lib/Call.cpp
@@ -56,8 +56,8 @@ const function Call::actionPerformedFunctionMap[11][5] =
 /*HOLD           */  {&Call::nothing    , &Call::hangUp   , &Call::nothing        , &Call::unhold      ,  &Call::setRecord     },/**/
 /*FAILURE        */  {&Call::nothing    , &Call::hangUp   , &Call::nothing        , &Call::nothing     ,  &Call::nothing       },/**/
 /*BUSY           */  {&Call::nothing    , &Call::hangUp   , &Call::nothing        , &Call::nothing     ,  &Call::nothing       },/**/
-/*TRANSFERT      */  {&Call::transfer   , &Call::hangUp   , &Call::nothing        , &Call::hold        ,  &Call::setRecord     },/**/
-/*TRANSFERT_HOLD */  {&Call::transfer   , &Call::hangUp   , &Call::nothing        , &Call::unhold      ,  &Call::setRecord     },/**/
+/*TRANSFERT      */  {&Call::transfer   , &Call::hangUp   , &Call::transfer       , &Call::hold        ,  &Call::setRecord     },/**/
+/*TRANSFERT_HOLD */  {&Call::transfer   , &Call::hangUp   , &Call::transfer       , &Call::unhold      ,  &Call::setRecord     },/**/
 /*OVER           */  {&Call::nothing    , &Call::nothing  , &Call::nothing        , &Call::nothing     ,  &Call::nothing       },/**/
 /*ERROR          */  {&Call::nothing    , &Call::nothing  , &Call::nothing        , &Call::nothing     ,  &Call::nothing       } /**/
 };//                                                                                                                                 
@@ -712,7 +712,7 @@ void Call::call()
 void Call::transfer()
 {
    CallManagerInterface & callManager = CallManagerInterfaceSingleton::getInstance();
-   qDebug() << "Transferring call to number : " << m_TransferNumber << ". callId : " << m_CallId;
+   qDebug() << "\n\n\nTransferring call to number : " << m_TransferNumber << ". callId : " << m_CallId << "\n\n\n";
    callManager.transfer(m_CallId, m_TransferNumber);
    this->m_pStopTime = new QDateTime(QDateTime::currentDateTime());
 }
diff --git a/kde/src/lib/CallModel.cpp b/kde/src/lib/CallModel.cpp
index 7a466f05e3..76db9efe2a 100644
--- a/kde/src/lib/CallModel.cpp
+++ b/kde/src/lib/CallModel.cpp
@@ -136,7 +136,6 @@ Call* CallModelBase::addCall(Call* call, Call* parent)
 
 Call* CallModelBase::addConferenceS(Call* conf)
 {
-   qDebug() << "-----Emitting conference" << conf->getConfId();
    emit conferenceCreated(conf);
    return conf;
 }
diff --git a/kde/src/lib/CallModel.hpp b/kde/src/lib/CallModel.hpp
index 39e910f5bc..b456f551f2 100644
--- a/kde/src/lib/CallModel.hpp
+++ b/kde/src/lib/CallModel.hpp
@@ -322,8 +322,7 @@ CALLMODEL_TEMPLATE void CALLMODEL_T::transfer(Call* toTransfer, QString target)
 {
    qDebug() << "Transferring call " << toTransfer->getCallId() << "to" << target;
    toTransfer->setTransferNumber(target);
-   toTransfer->changeCurrentState(CALL_STATE_TRANSFER);
-   toTransfer->actionPerformed(CALL_ACTION_ACCEPT);
+   toTransfer->actionPerformed(CALL_ACTION_TRANSFER);
    toTransfer->changeCurrentState(CALL_STATE_OVER);
 } //transfer
 
@@ -345,7 +344,7 @@ CALLMODEL_TEMPLATE Call* CALLMODEL_T::addConference(const QString & confID)
       qDebug() << "This conference (" + confID + ") contain no call";
       return 0;
    }
-
+   
    if (!m_sPrivateCallList_callId[callList[0]]) {
       qDebug() << "Invalid call";
       return 0;
diff --git a/kde/src/widgets/CallTreeItem.cpp b/kde/src/widgets/CallTreeItem.cpp
index c62b65c2c1..09eaa12276 100644
--- a/kde/src/widgets/CallTreeItem.cpp
+++ b/kde/src/widgets/CallTreeItem.cpp
@@ -228,7 +228,7 @@ void CallTreeItem::updated()
    else {
       //kDebug() << "Updating item of call of state OVER. Doing nothing.";
    }
-   if (state == CALL_STATE_TRANSFER) {
+   if (state == CALL_STATE_TRANSFER || state == CALL_STATE_TRANSF_HOLD) {
       kDebug() << "emmiting tranfer signal";
       emit askTransfer(m_pItemCall);
    }
-- 
GitLab