From dc10442a556f2c7c97d9a9930633b976a88f02d1 Mon Sep 17 00:00:00 2001
From: Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>
Date: Tue, 9 Sep 2014 18:20:25 +0200
Subject: [PATCH] [ #53051 ] Fix multiple history issues

---
 src/call.cpp         | 19 ++++++++++++++-----
 src/call.h           |  4 ++++
 src/sflphone_const.h |  1 +
 3 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/call.cpp b/src/call.cpp
index dc5abead..591fb769 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -117,8 +117,8 @@ const TypedStateMachine< TypedStateMachine< Call::State , Call::DaemonState> , C
 const TypedStateMachine< TypedStateMachine< function , Call::DaemonState > , Call::State > Call::stateChangedFunctionMap =
 {{
 //                      RINGING                  CURRENT             BUSY              HOLD                    HUNGUP           FAILURE            /**/
-/*INCOMING       */  {{&Call::nothing    , &Call::start     , &Call::startWeird     , &Call::startWeird   ,  &Call::startStop    , &Call::start   }},/**/
-/*RINGING        */  {{&Call::nothing    , &Call::start     , &Call::start          , &Call::start        ,  &Call::startStop    , &Call::start   }},/**/
+/*INCOMING       */  {{&Call::nothing    , &Call::start     , &Call::startWeird     , &Call::startWeird   ,  &Call::startStop    , &Call::failure }},/**/
+/*RINGING        */  {{&Call::nothing    , &Call::start     , &Call::start          , &Call::start        ,  &Call::startStop    , &Call::failure }},/**/
 /*CURRENT        */  {{&Call::nothing    , &Call::nothing   , &Call::warning        , &Call::nothing      ,  &Call::stop         , &Call::nothing }},/**/
 /*DIALING        */  {{&Call::nothing    , &Call::warning   , &Call::warning        , &Call::warning      ,  &Call::stop         , &Call::warning }},/**/
 /*HOLD           */  {{&Call::nothing    , &Call::nothing   , &Call::warning        , &Call::nothing      ,  &Call::stop         , &Call::nothing }},/**/
@@ -370,7 +370,7 @@ Call* Call::buildHistoryCall(const QMap<QString,QString>& hc)
    const QString& number          = hc[ Call::HistoryMapFields::PEER_NUMBER     ]          ;
    const QString& type            = hc[ Call::HistoryMapFields::STATE           ]          ;
    const QString& direction       = hc[ Call::HistoryMapFields::DIRECTION       ]          ;
-   const bool     missed          = hc[ Call::HistoryMapFields::MISSED          ] == "true";
+   const bool     missed          = hc[ Call::HistoryMapFields::MISSED          ] == "1";
    time_t         startTimeStamp  = hc[ Call::HistoryMapFields::TIMESTAMP_START ].toUInt() ;
    time_t         stopTimeStamp   = hc[ Call::HistoryMapFields::TIMESTAMP_STOP  ].toUInt() ;
    QString accId                  = hc[ Call::HistoryMapFields::ACCOUNT_ID      ]          ;
@@ -681,7 +681,7 @@ bool Call::isHistory()
 ///Is this call missed
 bool Call::isMissed() const
 {
-   return m_Missed;
+   return m_Missed || m_HistoryState == Call::LegacyHistoryState::MISSED;
 }
 
 ///Is the call incoming or outgoing
@@ -1055,6 +1055,15 @@ void Call::error()
    https://projects.savoirfairelinux.com/projects/sflphone/issues");
 }
 
+///Change history state to failure
+void Call::failure()
+{
+   m_Missed = true;
+   //This is how it always was done
+   //The main point is to leave the call in the CallList
+   start();
+}
+
 ///Accept the call
 void Call::accept()
 {
@@ -1673,7 +1682,7 @@ QVariant Call::roleData(int role) const
          return property("dropState");
          break;
       case Call::Role::Missed:
-         return m_Missed;
+         return isMissed();
       case Call::Role::CallLifeCycleState:
          return static_cast<int>(lifeCycleState()); //TODO Qt5, use the Q_ENUM
       case Call::Role::DTMFAnimState:
diff --git a/src/call.h b/src/call.h
index 3a981fba..480c1e20 100644
--- a/src/call.h
+++ b/src/call.h
@@ -279,6 +279,9 @@ public:
 
    /** @enum Call::LifeCycleState
     * This enum help track the call meta state
+    * @todo Eventually add a meta state between progress and finished for
+    *  calls that are still relevant enough to be in the main UI, such
+    *  as BUSY OR FAILURE while also finished
     */
    enum class LifeCycleState {
       INITIALIZATION = 0, /** Anything before the media transfer start   */
@@ -460,6 +463,7 @@ private:
    // to know when it is called.
    void nothing      () __attribute__ ((const));
    void error        () __attribute__ ((noreturn));
+   void failure      ();
    void accept       ();
    void refuse       ();
    void acceptTransf ();
diff --git a/src/sflphone_const.h b/src/sflphone_const.h
index 3312859d..8b24f38b 100644
--- a/src/sflphone_const.h
+++ b/src/sflphone_const.h
@@ -48,6 +48,7 @@
 #define ICON_HISTORY_INCOMING             ":/images/icons/incoming.svg"
 #define ICON_HISTORY_OUTGOING             ":/images/icons/outgoing.svg"
 #define ICON_HISTORY_MISSED               ":/images/icons/missed.svg"
+#define ICON_HISTORY_MISSED_OUT           ":/images/icons/missed_out.svg"
 #define ICON_SFLPHONE                     ":/images/icons/sflphone.svg"
 
 // #define ACCOUNT_TYPES_TAB                 {QString(Account::ProtocolName::SIP), QString(Account::ProtocolName::IAX)}
-- 
GitLab