<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[Freeswitch-trunk][17212] </title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<div id="header">FreeSWITCH Subversion</div>
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://fisheye.freeswitch.org/changelog/FreeSWITCH?cs=17212">17212</a></dd>
<dt>Author</dt> <dd>jmesquita</dd>
<dt>Date</dt> <dd>2010-04-05 01:03:06 -0500 (Mon, 05 Apr 2010)</dd>
</dl>

<h3>Log Message</h3>
<pre>Refactor the way we track events. Testing needed, please. Lots of bugs to be found, for sure.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#freeswitchtrunkfscommFSCommpro">freeswitch/trunk/fscomm/FSComm.pro</a></li>
<li><a href="#freeswitchtrunkfscommcallcpp">freeswitch/trunk/fscomm/call.cpp</a></li>
<li><a href="#freeswitchtrunkfscommcallh">freeswitch/trunk/fscomm/call.h</a></li>
<li><a href="#freeswitchtrunkfscommconffreeswitchxml">freeswitch/trunk/fscomm/conf/freeswitch.xml</a></li>
<li><a href="#freeswitchtrunkfscommfshostcpp">freeswitch/trunk/fscomm/fshost.cpp</a></li>
<li><a href="#freeswitchtrunkfscommfshosth">freeswitch/trunk/fscomm/fshost.h</a></li>
<li><a href="#freeswitchtrunkfscommmainwindowcpp">freeswitch/trunk/fscomm/mainwindow.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#freeswitchtrunkfscommchannelcpp">freeswitch/trunk/fscomm/channel.cpp</a></li>
<li><a href="#freeswitchtrunkfscommchannelh">freeswitch/trunk/fscomm/channel.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="freeswitchtrunkfscommFSCommpro"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/fscomm/FSComm.pro (17211 => 17212)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/fscomm/FSComm.pro        2010-04-04 02:28:34 UTC (rev 17211)
+++ freeswitch/trunk/fscomm/FSComm.pro        2010-04-05 06:03:06 UTC (rev 17212)
</span><span class="lines">@@ -32,7 +32,8 @@
</span><span class="cx">     preferences/accountdialog.cpp \
</span><span class="cx">     preferences/prefaccounts.cpp \
</span><span class="cx">     account.cpp \
</span><del>-    widgets/codecwidget.cpp
</del><ins>+    widgets/codecwidget.cpp \
+    channel.cpp
</ins><span class="cx"> HEADERS += mainwindow.h \
</span><span class="cx">     fshost.h \
</span><span class="cx">     call.h \
</span><span class="lines">@@ -43,7 +44,8 @@
</span><span class="cx">     preferences/accountdialog.h \
</span><span class="cx">     preferences/prefaccounts.h \
</span><span class="cx">     account.h \
</span><del>-    widgets/codecwidget.h
</del><ins>+    widgets/codecwidget.h \
+    channel.h
</ins><span class="cx"> FORMS += mainwindow.ui \
</span><span class="cx">     preferences/prefdialog.ui \
</span><span class="cx">     preferences/accountdialog.ui \
</span></span></pre></div>
<a id="freeswitchtrunkfscommcallcpp"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/fscomm/call.cpp (17211 => 17212)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/fscomm/call.cpp        2010-04-04 02:28:34 UTC (rev 17211)
+++ freeswitch/trunk/fscomm/call.cpp        2010-04-05 06:03:06 UTC (rev 17212)
</span><span class="lines">@@ -32,19 +32,8 @@
</span><span class="cx"> #include &lt;fshost.h&gt;
</span><span class="cx"> 
</span><span class="cx"> Call::Call()
</span><del>-{
-}
</del><ins>+{}
</ins><span class="cx"> 
</span><del>-Call::Call(int call_id, QString cid_name, QString cid_number, fscomm_call_direction_t direction, QString uuid) :
-        _call_id(call_id),
-        _cid_name(cid_name),
-        _cid_number(cid_number),
-        _direction(direction),
-        _uuid (uuid)
-{
-    _isActive = false;
-}
-
</del><span class="cx"> switch_status_t Call::toggleRecord(bool startRecord)
</span><span class="cx"> {
</span><span class="cx">     QDir conf_dir = QDir::home();
</span><span class="lines">@@ -56,14 +45,14 @@
</span><span class="cx">         _recording_filename = QString(&quot;%1/.fscomm/recordings/%2_%3.wav&quot;).arg(
</span><span class="cx">                                          conf_dir.absolutePath(),
</span><span class="cx">                                          QDateTime::currentDateTime().toString(&quot;yyyyMMddhhmmss&quot;),
</span><del>-                                         _cid_number);
-        status = g_FSHost.sendCmd(&quot;uuid_record&quot;, QString(&quot;%1 start %2&quot;).arg(_uuid, _recording_filename).toAscii().data(),&amp;result);
</del><ins>+                                         getCidNumber());
+        status = g_FSHost.sendCmd(&quot;uuid_record&quot;, QString(&quot;%1 start %2&quot;).arg(getUuid(), _recording_filename).toAscii().data(),&amp;result);
</ins><span class="cx">     }
</span><span class="cx">     else
</span><span class="cx">     {
</span><span class="cx">         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;Stopping call recording on call [%s]\n&quot;,
</span><del>-                          _uuid.toAscii().data());
-        status = g_FSHost.sendCmd(&quot;uuid_record&quot;, QString(&quot;%1 stop %2&quot;).arg(_uuid, _recording_filename).toAscii().data(),&amp;result);
</del><ins>+                          getUuid().toAscii().data());
+        status = g_FSHost.sendCmd(&quot;uuid_record&quot;, QString(&quot;%1 stop %2&quot;).arg(getUuid(), _recording_filename).toAscii().data(),&amp;result);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return status;
</span><span class="lines">@@ -74,7 +63,7 @@
</span><span class="cx">     QString result;
</span><span class="cx">     QString dtmf_string = QString(&quot;dtmf %1&quot;).arg(digit);
</span><span class="cx">     if (g_FSHost.sendCmd(&quot;pa&quot;, dtmf_string.toAscii(), &amp;result) == SWITCH_STATUS_FALSE) {
</span><del>-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Could not send DTMF digit %s on call[%s]&quot;, digit.toAscii().data(), _uuid.toAscii().data());
</del><ins>+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Could not send DTMF digit %s on call[%s]&quot;, digit.toAscii().data(), getUuid().toAscii().data());
</ins><span class="cx">         QMessageBox::critical(0, QWidget::tr(&quot;DTMF Error&quot;), QWidget::tr(&quot;There was an error sending DTMF, please report this bug.&quot;), QMessageBox::Ok);
</span><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="freeswitchtrunkfscommcallh"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/fscomm/call.h (17211 => 17212)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/fscomm/call.h        2010-04-04 02:28:34 UTC (rev 17211)
+++ freeswitch/trunk/fscomm/call.h        2010-04-05 06:03:06 UTC (rev 17212)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &lt;QtCore&gt;
</span><span class="cx"> #include &lt;QString&gt;
</span><span class="cx"> #include &lt;switch.h&gt;
</span><ins>+#include &quot;channel.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> typedef enum {
</span><span class="cx">     FSCOMM_CALL_STATE_RINGING = 0,
</span><span class="lines">@@ -48,12 +49,20 @@
</span><span class="cx"> class Call {
</span><span class="cx"> public:
</span><span class="cx">     Call();
</span><del>-    Call(int call_id, QString cid_name, QString cid_number, fscomm_call_direction_t direction, QString uuid);
-    QString getCidName(void) { return _cid_name; }
-    QString getCidNumber(void) { return _cid_number; }
-    int getCallID(void) { return _call_id; }
-    QString getUUID(void) { return _uuid; }
-    void setbUUID(QString uuid) { _buuid = uuid; }
</del><ins>+    /* Needs rework */
+    QString getCidName(void) { return _channel.data()-&gt;getCidName(); }
+    QString getCidNumber(void) { return _channel.data()-&gt;getCidNumber(); }
+    QString getDestinationNumber(void) { return _otherLegChannel.data()-&gt;getDestinationNumber(); }
+
+    void setChannel(QSharedPointer&lt;Channel&gt; channel) { _channel = channel; }
+    QSharedPointer&lt;Channel&gt; getChannel() { return _channel; }
+    void setOtherLegChannel(QSharedPointer&lt;Channel&gt; channel) { _otherLegChannel = channel; }
+    QSharedPointer&lt;Channel&gt; getOtherLegChannel() { return _otherLegChannel; }
+
+    QString getUuid(void) { return _channel.data()-&gt;getUuid(); }
+    QString getOtherLegUuid(void) { return _otherLegChannel.data()-&gt;getUuid(); }
+    void setCallDirection(fscomm_call_direction_t dir) { _direction = dir; }
+    int getCallID(void) { return _channel.data()-&gt;getPaCallId(); }
</ins><span class="cx">     fscomm_call_direction_t getDirection() { return _direction; }
</span><span class="cx">     fscomm_call_state_t getState() { return _state; }
</span><span class="cx">     void setState(fscomm_call_state_t state) { _state = state; }
</span><span class="lines">@@ -67,13 +76,12 @@
</span><span class="cx">     QTime getCurrentStateTime();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    int _call_id;
-    QString _cid_name;
-    QString _cid_number;
</del><ins>+    QSharedPointer&lt;Channel&gt; _channel; /* This should be our portaudio channel */
+    QSharedPointer&lt;Channel&gt; _otherLegChannel;
+
</ins><span class="cx">     QString _cause;
</span><span class="cx">     fscomm_call_direction_t _direction;
</span><del>-    QString _uuid;
-    QString _buuid;
</del><ins>+
</ins><span class="cx">     bool _isActive;
</span><span class="cx">     QString _recording_filename;
</span><span class="cx">     fscomm_call_state_t _state;
</span></span></pre></div>
<a id="freeswitchtrunkfscommchannelcpp"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/fscomm/channel.cpp (0 => 17212)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/fscomm/channel.cpp                                (rev 0)
+++ freeswitch/trunk/fscomm/channel.cpp        2010-04-05 06:03:06 UTC (rev 17212)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+#include &quot;channel.h&quot;
+
+Channel::Channel(QString uuid):
+        _uuid(uuid)
+{
+}
</ins></span></pre></div>
<a id="freeswitchtrunkfscommchannelh"></a>
<div class="addfile"><h4>Added: freeswitch/trunk/fscomm/channel.h (0 => 17212)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/fscomm/channel.h                                (rev 0)
+++ freeswitch/trunk/fscomm/channel.h        2010-04-05 06:03:06 UTC (rev 17212)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+#ifndef CHANNEL_H
+#define CHANNEL_H
+
+#include &lt;QtCore&gt;
+
+class Channel
+{
+public:
+    Channel() {}
+    Channel(QString uuid);
+    QString getUuid() { return _uuid; }
+    void setCidName(QString cidName) { _cidName = cidName; }
+    QString getCidName() { return _cidName; }
+    void setCidNumber(QString cidNumber) { _cidNumber = cidNumber; }
+    QString getCidNumber() { return _cidNumber; }
+    void setDestinatinonNumber(QString destinationNumber) { _destinationNumber = destinationNumber; }
+    QString getDestinationNumber() { return _destinationNumber; }
+
+    int getPaCallId() { return _pa_call_id; }
+
+private:
+    QString _uuid;
+    QString _cidName;
+    QString _cidNumber;
+    QString _destinationNumber;
+    int _pa_call_id;
+};
+
+Q_DECLARE_METATYPE(Channel)
+
+#endif // CHANNEL_H
</ins></span></pre></div>
<a id="freeswitchtrunkfscommconffreeswitchxml"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/fscomm/conf/freeswitch.xml (17211 => 17212)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/fscomm/conf/freeswitch.xml        2010-04-04 02:28:34 UTC (rev 17211)
+++ freeswitch/trunk/fscomm/conf/freeswitch.xml        2010-04-05 06:03:06 UTC (rev 17212)
</span><span class="lines">@@ -89,6 +89,7 @@
</span><span class="cx">                                 &lt;load module=&quot;mod_ilbc&quot;/&gt;
</span><span class="cx">                                 &lt;load module=&quot;mod_speex&quot;/&gt;
</span><span class="cx">                                 &lt;load module=&quot;mod_celt&quot;/&gt;
</span><ins>+                                &lt;load module=&quot;mod_silk&quot;/&gt;
</ins><span class="cx">                                 &lt;load module=&quot;mod_siren&quot;/&gt;
</span><span class="cx">                                 &lt;load module=&quot;mod_sndfile&quot;/&gt;
</span><span class="cx">                                 &lt;load module=&quot;mod_tone_stream&quot;/&gt;
</span></span></pre></div>
<a id="freeswitchtrunkfscommfshostcpp"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/fscomm/fshost.cpp (17211 => 17212)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/fscomm/fshost.cpp        2010-04-04 02:28:34 UTC (rev 17211)
+++ freeswitch/trunk/fscomm/fshost.cpp        2010-04-05 06:03:06 UTC (rev 17212)
</span><span class="lines">@@ -43,9 +43,10 @@
</span><span class="cx">     switch_core_set_globals();
</span><span class="cx"> 
</span><span class="cx">     qRegisterMetaType&lt;QSharedPointer&lt;Call&gt; &gt;(&quot;QSharedPointer&lt;Call&gt;&quot;);
</span><ins>+    qRegisterMetaType&lt;QSharedPointer&lt;Call&gt; &gt;(&quot;QSharedPointer&lt;Channel&gt;&quot;);
</ins><span class="cx">     qRegisterMetaType&lt;QSharedPointer&lt;Account&gt; &gt;(&quot;QSharedPointer&lt;Account&gt;&quot;);
</span><span class="cx"> 
</span><del>-    connect(this, SIGNAL(loadedModule(QString,QString,QString)), this, SLOT(minimalModuleLoaded(QString,QString,QString)));
</del><ins>+    connect(this, SIGNAL(loadedModule(QString,QString)), this, SLOT(minimalModuleLoaded(QString,QString)));
</ins><span class="cx"> 
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -167,191 +168,96 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-switch_status_t FSHost::processAlegEvent(switch_event_t * event, QString uuid)
</del><ins>+void FSHost::generalEventHandler(switch_event_t *event)
</ins><span class="cx"> {
</span><del>-    switch_status_t status = SWITCH_STATUS_SUCCESS;
-    QSharedPointer&lt;Call&gt; call = _active_calls.value(uuid);
</del><ins>+    QString uuid = switch_event_get_header_nil(event, &quot;Unique-ID&quot;);
</ins><span class="cx"> 
</span><del>-    if (call.isNull())
-    {
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, &quot;We don't have a call object for A leg on event %s.\n&quot;, switch_event_name(event-&gt;event_id));
-        qDebug() &lt;&lt; _active_calls.keys();
-        printEventHeaders(event);
-        return SWITCH_STATUS_FALSE;
-    }
-
-    /* Inbound call */
-    if (call.data()-&gt;getDirection() == FSCOMM_CALL_DIRECTION_INBOUND)
-    {
-        switch(event-&gt;event_id) {
-        case SWITCH_EVENT_CHANNEL_ANSWER:
-            {
-                QString answeredEpoch = switch_event_get_header_nil(event, &quot;Caller-Channel-Answered-Time&quot;);
-                call.data()-&gt;setAnsweredEpoch(answeredEpoch.toLong());
-                call.data()-&gt;setbUUID(switch_event_get_header_nil(event, &quot;Other-Leg-Unique-ID&quot;));
-                _bleg_uuids.insert(switch_event_get_header_nil(event, &quot;Other-Leg-Unique-ID&quot;), uuid);
-                call.data()-&gt;setState(FSCOMM_CALL_STATE_ANSWERED);
-                emit answered(call);
-                break;
-            }
-        case SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE:
-            {
-                emit hungup(_active_calls.take(uuid));
-                break;
-            }
-        case SWITCH_EVENT_CHANNEL_STATE:
-            {
-                qDebug() &lt;&lt; QString(&quot;CHANNEL_STATE Answer-State: %1 | Channel-State: %2 | %3 | %4\n&quot;).arg(switch_event_get_header_nil(event, &quot;Answer-State&quot;),switch_event_get_header_nil(event, &quot;Channel-State&quot;), uuid.toAscii().constData(), switch_event_get_header_nil(event, &quot;Other-Leg-Unique-ID&quot;));
-                break;
-            }
-        default:
-            {
-                break;
-            }
</del><ins>+    switch(event-&gt;event_id) {
+    case SWITCH_EVENT_CHANNEL_CREATE: /*1A - 17B*/
+        {
+            eventChannelCreate(event, uuid);
+            break;
</ins><span class="cx">         }
</span><del>-    }
-    /* Outbound call */
-    else
-    {
-        switch(event-&gt;event_id)
</del><ins>+    case SWITCH_EVENT_CHANNEL_ANSWER: /*2A - 31B*/
</ins><span class="cx">         {
</span><del>-        case SWITCH_EVENT_CHANNEL_BRIDGE:
-            {
-                _active_calls.value(uuid).data()-&gt;setbUUID(switch_event_get_header_nil(event, &quot;Other-Leg-Unique-ID&quot;));
-                _bleg_uuids.insert(switch_event_get_header_nil(event, &quot;Other-Leg-Unique-ID&quot;), uuid);
-                break;
-            }
-        case SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE:
-            {
-                if (call.data()-&gt;getState() == FSCOMM_CALL_STATE_TRYING)
-                {
-                    QString cause = switch_event_get_header_nil(event, &quot;Hangup-Cause&quot;);
-                    call.data()-&gt;setState(FSCOMM_CALL_STATE_FAILED);
-                    call.data()-&gt;setCause(cause);
-                    emit callFailed(call);
-                    _active_calls.take(uuid);
-                }
-                break;
-            }
-        default:
-            qDebug() &lt;&lt; QString(&quot;A leg: %1(%2)\n&quot;).arg(switch_event_name(event-&gt;event_id), switch_event_get_header_nil(event, &quot;Event-Subclass&quot;));
</del><ins>+            eventChannelAnswer(event, uuid);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><del>-    }
-    return status;
-}
-
-switch_status_t FSHost::processBlegEvent(switch_event_t * event, QString buuid)
-{
-    QString uuid = _bleg_uuids.value(buuid);
-    switch_status_t status = SWITCH_STATUS_SUCCESS;
-    QSharedPointer&lt;Call&gt; call = _active_calls.value(uuid);
-
-    if (call.isNull())
-    {
-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, &quot;We don't have a call object for B leg on event %s.\n&quot;, switch_event_name(event-&gt;event_id));
-        qDebug() &lt;&lt; _active_calls.keys();
-        printEventHeaders(event);
-        return SWITCH_STATUS_FALSE;
-    }
-
-    /* Inbound call */
-    if (call.data()-&gt;getDirection() == FSCOMM_CALL_DIRECTION_INBOUND)
-    {
-        qDebug() &lt;&lt; &quot; Inbound call&quot;;
-    }
-    /* Outbound call */
-    else
-    {
-        switch(event-&gt;event_id)
</del><ins>+    case SWITCH_EVENT_CODEC:/*3/4A - 24/25B*/
</ins><span class="cx">         {
</span><del>-        case SWITCH_EVENT_CHANNEL_ANSWER:
-            {
-                /* When do we get here? */
-                QString answeredEpoch = switch_event_get_header_nil(event, &quot;Caller-Channel-Answered-Time&quot;);
-                call.data()-&gt;setAnsweredEpoch(answeredEpoch.toULongLong());
-                emit answered(call);
-                break;
-            }
-        case SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE:
-            {
-                _active_calls.take(uuid);
-                emit hungup(call);
-                _bleg_uuids.take(buuid);
-                break;
-            }
-        case SWITCH_EVENT_CHANNEL_STATE:
-            {
-                if (QString(switch_event_get_header_nil(event, &quot;Answer-State&quot;)) == &quot;early&quot;)
-                {
-                    call.data()-&gt;setState(FSCOMM_CALL_STATE_RINGING);
-                    emit ringing(call);
-                }
-                else if (QString(switch_event_get_header_nil(event, &quot;Answer-State&quot;)) == &quot;answered&quot;)
-                {
-                    call.data()-&gt;setState(FSCOMM_CALL_STATE_ANSWERED);
-                    emit answered(call);
-                }
-                break;
-            }
-
-        default:
-            qDebug() &lt;&lt; QString(&quot;B leg: %1(%2)\n&quot;).arg(switch_event_name(event-&gt;event_id), switch_event_get_header_nil(event, &quot;Event-Subclass&quot;));
</del><ins>+            eventCodec(event, uuid);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><del>-    }
-    return status;
-}
-
-void FSHost::generalEventHandler(switch_event_t *event)
-{
-    /*printEventHeaders(event);*/
-    QString uuid = switch_event_get_header_nil(event, &quot;Unique-ID&quot;);
-
-    if (_bleg_uuids.contains(uuid))
-    {
-        if (processBlegEvent(event, uuid) == SWITCH_STATUS_SUCCESS)
</del><ins>+    case SWITCH_EVENT_CHANNEL_STATE:/*6/7/8/37/44/46A - 20/21/22/28/38/40/42B*/
</ins><span class="cx">         {
</span><del>-            return;
</del><ins>+            eventChannelState(event, uuid);
+            break;
</ins><span class="cx">         }
</span><del>-    }
-    if (_active_calls.contains(uuid))
-    {
-        if (processAlegEvent(event, uuid) == SWITCH_STATUS_SUCCESS)
</del><ins>+    case SWITCH_EVENT_CHANNEL_EXECUTE:/*9/11/13/15A*/
</ins><span class="cx">         {
</span><del>-            return;
</del><ins>+            eventChannelExecute(event, uuid);
+            break;
</ins><span class="cx">         }
</span><del>-    }
-
-    /* This is how we identify new calls, inbound and outbound */
-    switch(event-&gt;event_id) {
-    case SWITCH_EVENT_CUSTOM:
</del><ins>+    case SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE:/*10/12/14/16/35A*/
</ins><span class="cx">         {
</span><del>-            if (strcmp(event-&gt;subclass_name, &quot;portaudio::ringing&quot;) == 0 &amp;&amp; !_active_calls.contains(uuid))
</del><ins>+            eventChannelExecuteComplete(event, uuid);
+            break;
+        }
+    case SWITCH_EVENT_CHANNEL_OUTGOING:/*18B*/
+        {
+            eventChannelOutgoing(event, uuid);
+            break;
+        }
+    case SWITCH_EVENT_CHANNEL_ORIGINATE:/*19B*/
+        {
+            eventChannelOriginate(event, uuid);
+            break;
+        }
+    case SWITCH_EVENT_CALL_UPDATE:/*23/29/30B*/
+        {
+            eventCallUpdate(event, uuid);
+            break;
+        }
+    case SWITCH_EVENT_CHANNEL_PROGRESS_MEDIA:/*26B*/
+        {
+            eventChannelProgressMedia(event, uuid);
+            break;
+        }
+    case SWITCH_EVENT_CHANNEL_BRIDGE:/*27A*/
+        {
+            eventChannelBridge(event, uuid);
+            break;
+        }
+    /*32?*/
+    /*case SWITCH_EVENT_RECV_INFO:
+        {
+            eventRecvInfo(event, uuid);
+            break;
+        }*/
+    case SWITCH_EVENT_CHANNEL_HANGUP:/*36A-33B*/
+        {
+            eventChannelHangup(event, uuid);
+            break;
+        }
+    case SWITCH_EVENT_CHANNEL_UNBRIDGE:/*34A*/
+        {
+            eventChannelUnbridge(event, uuid);
+            break;
+        }
+    case SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE:/*39/43B*/
+        {
+            eventChannelHangupComplete(event, uuid);
+            break;
+        }
+    case SWITCH_EVENT_CHANNEL_DESTROY:/*45A-41B*/
+        {
+            eventChannelDestroy(event, uuid);
+            break;
+        }
+    case SWITCH_EVENT_CUSTOM:/*5A*/
+        {
+            if (strcmp(event-&gt;subclass_name, &quot;sofia::gateway_state&quot;) == 0)
</ins><span class="cx">             {
</span><del>-                Call *callPtr = new Call(atoi(switch_event_get_header_nil(event, &quot;call_id&quot;)),
-                                      switch_event_get_header_nil(event, &quot;Caller-Caller-ID-Name&quot;),
-                                      switch_event_get_header_nil(event, &quot;Caller-Caller-ID-Number&quot;),
-                                      FSCOMM_CALL_DIRECTION_INBOUND,
-                                      uuid);
-                QSharedPointer&lt;Call&gt; call(callPtr);
-                _active_calls.insert(uuid, call);
-                call.data()-&gt;setState(FSCOMM_CALL_STATE_RINGING);
-                emit ringing(call);
-            }
-            else if (strcmp(event-&gt;subclass_name, &quot;portaudio::makecall&quot;) == 0)
-            {
-                Call *callPtr = new Call(atoi(switch_event_get_header_nil(event, &quot;call_id&quot;)),NULL,
-                                      switch_event_get_header_nil(event, &quot;Caller-Destination-Number&quot;),
-                                      FSCOMM_CALL_DIRECTION_OUTBOUND,
-                                      uuid);
-                QSharedPointer&lt;Call&gt; call(callPtr);
-                _active_calls.insert(uuid, call);
-                call.data()-&gt;setState(FSCOMM_CALL_STATE_TRYING);
-                emit newOutgoingCall(call);
-            }
-            else if (strcmp(event-&gt;subclass_name, &quot;sofia::gateway_state&quot;) == 0)
-            {
</del><span class="cx">                 QString state = switch_event_get_header_nil(event, &quot;State&quot;);
</span><span class="cx">                 QString gw = switch_event_get_header_nil(event, &quot;Gateway&quot;);
</span><span class="cx">                 QSharedPointer&lt;Account&gt; acc = _accounts.value(gw);
</span><span class="lines">@@ -412,16 +318,15 @@
</span><span class="cx">             }
</span><span class="cx">             else
</span><span class="cx">             {
</span><del>-                printEventHeaders(event);
</del><ins>+                //printEventHeaders(event);
</ins><span class="cx">             }
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">     case SWITCH_EVENT_MODULE_LOAD:
</span><span class="cx">         {
</span><span class="cx">             QString modType = switch_event_get_header_nil(event, &quot;type&quot;);
</span><del>-            QString modName = switch_event_get_header_nil(event, &quot;name&quot;);
</del><span class="cx">             QString modKey = switch_event_get_header_nil(event, &quot;key&quot;);
</span><del>-            emit loadedModule(modType, modName, modKey);
</del><ins>+            emit loadedModule(modType, modKey);
</ins><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">     default:
</span><span class="lines">@@ -429,8 +334,91 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FSHost::minimalModuleLoaded(QString modType, QString modName, QString modKey)
</del><ins>+void FSHost::eventChannelCreate(switch_event_t *event, QString uuid)
</ins><span class="cx"> {
</span><ins>+    Channel *channelPtr = new Channel(uuid);
+    QSharedPointer&lt;Channel&gt;channel(channelPtr);
+    _channels.insert(uuid, channel);
+}
+void FSHost::eventChannelAnswer(switch_event_t *event, QString uuid)
+{
+    _channels.value(uuid).data()-&gt;setDestinatinonNumber(switch_event_get_header_nil(event, &quot;Caller-Destination-Number&quot;));
+    if (_active_calls.contains(uuid))
+    {
+        _active_calls.value(uuid).data()-&gt;setAnsweredEpoch(QString(switch_event_get_header_nil(event, &quot;Caller-Channel-Answered-Time&quot;)).toULongLong());
+        emit answered(_active_calls.value(uuid));
+    }
+}
+void FSHost::eventChannelState(switch_event_t *event, QString uuid)
+{}
+void FSHost::eventChannelExecute(switch_event_t *event, QString uuid)
+{}
+void FSHost::eventChannelExecuteComplete(switch_event_t *event, QString uuid)
+{}
+void FSHost::eventChannelOutgoing(switch_event_t *event, QString uuid)
+{
+    /* Checks if this is an inbound or outbound call */
+    /** Outbound call */
+    if ( strcmp(switch_event_get_header_nil(event, &quot;Caller-Source&quot;), &quot;mod_portaudio&quot;) == 0 )
+    {
+        Call *callPtr = new Call();
+
+        callPtr-&gt;setCallDirection(FSCOMM_CALL_DIRECTION_OUTBOUND);
+        callPtr-&gt;setChannel(_channels.value(uuid));
+        callPtr-&gt;setOtherLegChannel(_channels.value(switch_event_get_header_nil(event, &quot;Other-Leg-Unique-ID&quot;)));
+        QSharedPointer&lt;Call&gt; call(callPtr);
+        _active_calls.insert(uuid, call);
+        call.data()-&gt;setState(FSCOMM_CALL_STATE_TRYING);
+        emit newOutgoingCall(call);
+    }
+    /** Inbound call */
+    else
+    {
+        Call *callPtr = new Call();
+
+        callPtr-&gt;setCallDirection(FSCOMM_CALL_DIRECTION_INBOUND);
+        callPtr-&gt;setChannel(_channels.value(switch_event_get_header_nil(event, &quot;Other-Leg-Unique-ID&quot;)));
+        callPtr-&gt;setOtherLegChannel(_channels.value(uuid));
+        QSharedPointer&lt;Call&gt; call(callPtr);
+        _active_calls.insert(switch_event_get_header_nil(event, &quot;Other-Leg-Unique-ID&quot;), call);
+        call.data()-&gt;setState(FSCOMM_CALL_STATE_RINGING);
+        emit ringing(call);
+        qDebug() &lt;&lt; _channels.value(uuid).data()-&gt;getCidName() &lt;&lt; _channels.value(uuid).data()-&gt;getCidNumber();
+    }
+}
+void FSHost::eventChannelOriginate(switch_event_t *event, QString uuid)
+{}
+void FSHost::eventChannelProgressMedia(switch_event_t *event, QString uuid)
+{}
+void FSHost::eventChannelBridge(switch_event_t *event, QString uuid)
+{}
+void FSHost::eventChannelHangup(switch_event_t *event, QString uuid)
+{
+    if (_active_calls.contains(uuid))
+    {
+        emit hungup(_active_calls.take(uuid));
+    }
+}
+void FSHost::eventChannelUnbridge(switch_event_t *event, QString uuid)
+{}
+void FSHost::eventChannelHangupComplete(switch_event_t *event, QString uuid)
+{}
+void FSHost::eventChannelDestroy(switch_event_t *event, QString uuid)
+{
+    _channels.take(uuid);
+}
+void FSHost::eventCodec(switch_event_t *event, QString uuid)
+{
+    _channels.value(uuid).data()-&gt;setCidName(switch_event_get_header_nil(event, &quot;Caller-Caller-ID-Name&quot;));
+    _channels.value(uuid).data()-&gt;setCidNumber(switch_event_get_header_nil(event, &quot;Caller-Caller-ID-Number&quot;));
+}
+void FSHost::eventCallUpdate(switch_event_t *event, QString uuid)
+{}
+void FSHost::eventRecvInfo(switch_event_t *event, QString uuid)
+{}
+
+void FSHost::minimalModuleLoaded(QString modType, QString modKey)
+{
</ins><span class="cx">     if (modType == &quot;endpoint&quot;)
</span><span class="cx">     {
</span><span class="cx">         _loadedModules.append(modKey);
</span><span class="lines">@@ -504,7 +492,7 @@
</span><span class="cx"> void FSHost::printEventHeaders(switch_event_t *event)
</span><span class="cx"> {
</span><span class="cx">     switch_event_header_t *hp;
</span><del>-    qDebug() &lt;&lt; QString(&quot;Received event: %1(%2)\n&quot;).arg(switch_event_name(event-&gt;event_id), switch_event_get_header_nil(event, &quot;Event-Subclass&quot;));
</del><ins>+    qDebug() &lt;&lt; QString(&quot;Received event: %1(%2)&quot;).arg(switch_event_name(event-&gt;event_id), switch_event_get_header_nil(event, &quot;Event-Subclass&quot;));
</ins><span class="cx">     for (hp = event-&gt;headers; hp; hp = hp-&gt;next) {
</span><span class="cx">         qDebug() &lt;&lt; hp-&gt;name &lt;&lt; &quot;=&quot; &lt;&lt; hp-&gt;value;
</span><span class="cx">     }
</span></span></pre></div>
<a id="freeswitchtrunkfscommfshosth"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/fscomm/fshost.h (17211 => 17212)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/fscomm/fshost.h        2010-04-04 02:28:34 UTC (rev 17211)
+++ freeswitch/trunk/fscomm/fshost.h        2010-04-05 06:03:06 UTC (rev 17212)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #include &lt;QSharedPointer&gt;
</span><span class="cx"> #include &lt;switch.h&gt;
</span><span class="cx"> #include &quot;call.h&quot;
</span><ins>+#include &quot;channel.h&quot;
</ins><span class="cx"> #include &quot;account.h&quot;
</span><span class="cx"> 
</span><span class="cx"> class FSHost : public QThread
</span><span class="lines">@@ -57,15 +58,20 @@
</span><span class="cx">     void run(void);
</span><span class="cx"> 
</span><span class="cx"> signals:
</span><ins>+    /* Status signals */
</ins><span class="cx">     void coreLoadingError(QString);
</span><span class="cx">     void loadingModules(QString, int, QColor);
</span><del>-    void loadedModule(QString, QString, QString);
</del><ins>+    void loadedModule(QString, QString);
</ins><span class="cx">     void ready(void);
</span><ins>+
+    /* Call signals */
</ins><span class="cx">     void ringing(QSharedPointer&lt;Call&gt;);
</span><span class="cx">     void answered(QSharedPointer&lt;Call&gt;);
</span><span class="cx">     void newOutgoingCall(QSharedPointer&lt;Call&gt;);
</span><span class="cx">     void callFailed(QSharedPointer&lt;Call&gt;);
</span><span class="cx">     void hungup(QSharedPointer&lt;Call&gt;);
</span><ins>+
+    /* Account signals */
</ins><span class="cx">     void accountStateChange(QSharedPointer&lt;Account&gt;);
</span><span class="cx">     void newAccount(QSharedPointer&lt;Account&gt;);
</span><span class="cx">     void delAccount(QSharedPointer&lt;Account&gt;);
</span><span class="lines">@@ -73,16 +79,37 @@
</span><span class="cx"> private slots:
</span><span class="cx">     /* We need to wait for the gateway deletion before reloading it */
</span><span class="cx">     void accountReloadSlot(QSharedPointer&lt;Account&gt;);
</span><del>-    void minimalModuleLoaded(QString, QString, QString);
</del><ins>+    void minimalModuleLoaded(QString, QString);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    switch_status_t processBlegEvent(switch_event_t *, QString);
-    switch_status_t processAlegEvent(switch_event_t *, QString);
</del><span class="cx">     void createFolders();
</span><span class="cx">     void printEventHeaders(switch_event_t *event);
</span><ins>+
+    /*FSM State handlers*/
+    /**Channel Related*/
+    void eventChannelCreate(switch_event_t *event, QString uuid);
+    void eventChannelAnswer(switch_event_t *event, QString uuid);
+    void eventChannelState(switch_event_t *event, QString uuid);
+    void eventChannelExecute(switch_event_t *event, QString uuid);
+    void eventChannelExecuteComplete(switch_event_t *event, QString uuid);
+    void eventChannelOutgoing(switch_event_t *event, QString uuid);
+    void eventChannelOriginate(switch_event_t *event, QString uuid);
+    void eventChannelProgressMedia(switch_event_t *event, QString uuid);
+    void eventChannelBridge(switch_event_t *event, QString uuid);
+    void eventChannelHangup(switch_event_t *event, QString uuid);
+    void eventChannelUnbridge(switch_event_t *event, QString uuid);
+    void eventChannelHangupComplete(switch_event_t *event, QString uuid);
+    void eventChannelDestroy(switch_event_t *event, QString uuid);
+
+    /**Others*/
+    void eventCodec(switch_event_t *event, QString uuid);
+    void eventCallUpdate(switch_event_t *event, QString uuid);
+    void eventRecvInfo(switch_event_t *event, QString uuid);
+    /*END*/
+
</ins><span class="cx">     QHash&lt;QString, QSharedPointer&lt;Call&gt; &gt; _active_calls;
</span><span class="cx">     QHash&lt;QString, QSharedPointer&lt;Account&gt; &gt; _accounts;
</span><del>-    QHash&lt;QString, QString&gt; _bleg_uuids;
</del><ins>+    QHash&lt;QString, QSharedPointer&lt;Channel&gt; &gt; _channels;
</ins><span class="cx">     QList&lt;QString&gt; _reloading_Accounts;
</span><span class="cx">     QList&lt;QString&gt; _loadedModules;
</span><span class="cx"> };
</span></span></pre></div>
<a id="freeswitchtrunkfscommmainwindowcpp"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/fscomm/mainwindow.cpp (17211 => 17212)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/fscomm/mainwindow.cpp        2010-04-04 02:28:34 UTC (rev 17211)
+++ freeswitch/trunk/fscomm/mainwindow.cpp        2010-04-05 06:03:06 UTC (rev 17212)
</span><span class="lines">@@ -131,6 +131,7 @@
</span><span class="cx">     {
</span><span class="cx">         QTableWidgetItem* item = ui-&gt;tableCalls-&gt;item(row, 2);
</span><span class="cx">         QSharedPointer&lt;Call&gt; call = g_FSHost.getCallByUUID(item-&gt;data(Qt::UserRole).toString());
</span><ins>+        /*if (call.data() == NULL) continue;*/
</ins><span class="cx">         QTime time = call.data()-&gt;getCurrentStateTime();
</span><span class="cx">         item-&gt;setText(time.toString(&quot;hh:mm:ss&quot;));
</span><span class="cx">         item-&gt;setTextAlignment(Qt::AlignRight);
</span><span class="lines">@@ -357,26 +358,26 @@
</span><span class="cx">                              tr(&quot;&lt;p&gt;Could not get active call to start/stop recording.&quot;
</span><span class="cx">                                 &quot;&lt;p&gt;Please report this bug.&quot;),
</span><span class="cx">                              QMessageBox::Ok);
</span><del>-        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Could not record call [%s].\n&quot;, call.data()-&gt;getUUID().toAscii().data());
</del><ins>+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Could not record call [%s].\n&quot;, call.data()-&gt;getUuid().toAscii().data());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MainWindow::newOutgoingCall(QSharedPointer&lt;Call&gt; call)
</span><span class="cx"> {
</span><del>-    ui-&gt;textEdit-&gt;setText(QString(&quot;Calling %1 (%2)&quot;).arg(call.data()-&gt;getCidName(), call.data()-&gt;getCidNumber()));
</del><ins>+    ui-&gt;textEdit-&gt;setText(QString(&quot;Calling %1&quot;).arg(call.data()-&gt;getDestinationNumber()));
</ins><span class="cx"> 
</span><span class="cx">     ui-&gt;tableCalls-&gt;setRowCount(ui-&gt;tableCalls-&gt;rowCount()+1);
</span><del>-    QTableWidgetItem *item0 = new QTableWidgetItem(QString(&quot;%1 (%2)&quot;).arg(call.data()-&gt;getCidName(), call.data()-&gt;getCidNumber()));
-    item0-&gt;setData(Qt::UserRole, call.data()-&gt;getUUID());
</del><ins>+    QTableWidgetItem *item0 = new QTableWidgetItem(QString(&quot;%1&quot;).arg(call.data()-&gt;getDestinationNumber()));
+    item0-&gt;setData(Qt::UserRole, call.data()-&gt;getUuid());
</ins><span class="cx">     ui-&gt;tableCalls-&gt;setItem(ui-&gt;tableCalls-&gt;rowCount()-1,0,item0);
</span><span class="cx"> 
</span><span class="cx">     QTableWidgetItem *item1 = new QTableWidgetItem(tr(&quot;Dialing...&quot;));
</span><del>-    item1-&gt;setData(Qt::UserRole, call.data()-&gt;getUUID());
</del><ins>+    item1-&gt;setData(Qt::UserRole, call.data()-&gt;getUuid());
</ins><span class="cx">     ui-&gt;tableCalls-&gt;setItem(ui-&gt;tableCalls-&gt;rowCount()-1,1,item1);
</span><span class="cx"> 
</span><span class="cx">     QTableWidgetItem *item2 = new QTableWidgetItem(&quot;00:00:00&quot;);
</span><del>-    item2-&gt;setData(Qt::UserRole, call.data()-&gt;getUUID());
</del><ins>+    item2-&gt;setData(Qt::UserRole, call.data()-&gt;getUuid());
</ins><span class="cx">     ui-&gt;tableCalls-&gt;setItem(ui-&gt;tableCalls-&gt;rowCount()-1,2,item2);
</span><span class="cx"> 
</span><span class="cx">     ui-&gt;tableCalls-&gt;resizeColumnsToContents();
</span><span class="lines">@@ -393,7 +394,7 @@
</span><span class="cx">     for (int i=0; i&lt;ui-&gt;tableCalls-&gt;rowCount(); i++)
</span><span class="cx">     {
</span><span class="cx">         QTableWidgetItem *item = ui-&gt;tableCalls-&gt;item(i, 1);
</span><del>-        if (item-&gt;data(Qt::UserRole).toString() == call.data()-&gt;getUUID())
</del><ins>+        if (item-&gt;data(Qt::UserRole).toString() == call.data()-&gt;getUuid())
</ins><span class="cx">         {
</span><span class="cx">             item-&gt;setText(tr(&quot;Ringing&quot;));
</span><span class="cx">             ui-&gt;textEdit-&gt;setText(QString(&quot;Call from %1 (%2)&quot;).arg(call.data()-&gt;getCidName(), call.data()-&gt;getCidNumber()));
</span><span class="lines">@@ -405,15 +406,15 @@
</span><span class="cx"> 
</span><span class="cx">     ui-&gt;tableCalls-&gt;setRowCount(ui-&gt;tableCalls-&gt;rowCount()+1);
</span><span class="cx">     QTableWidgetItem *item0 = new QTableWidgetItem(QString(&quot;%1 (%2)&quot;).arg(call.data()-&gt;getCidName(), call.data()-&gt;getCidNumber()));
</span><del>-    item0-&gt;setData(Qt::UserRole, call.data()-&gt;getUUID());
</del><ins>+    item0-&gt;setData(Qt::UserRole, call.data()-&gt;getUuid());
</ins><span class="cx">     ui-&gt;tableCalls-&gt;setItem(ui-&gt;tableCalls-&gt;rowCount()-1,0,item0);
</span><span class="cx"> 
</span><span class="cx">     QTableWidgetItem *item1 = new QTableWidgetItem(tr(&quot;Ringing&quot;));
</span><del>-    item1-&gt;setData(Qt::UserRole, call.data()-&gt;getUUID());
</del><ins>+    item1-&gt;setData(Qt::UserRole, call.data()-&gt;getUuid());
</ins><span class="cx">     ui-&gt;tableCalls-&gt;setItem(ui-&gt;tableCalls-&gt;rowCount()-1,1,item1);
</span><span class="cx"> 
</span><span class="cx">     QTableWidgetItem *item2 = new QTableWidgetItem(&quot;00:00:00&quot;);
</span><del>-    item2-&gt;setData(Qt::UserRole, call.data()-&gt;getUUID());
</del><ins>+    item2-&gt;setData(Qt::UserRole, call.data()-&gt;getUuid());
</ins><span class="cx">     ui-&gt;tableCalls-&gt;setItem(ui-&gt;tableCalls-&gt;rowCount()-1,2,item2);
</span><span class="cx"> 
</span><span class="cx">     ui-&gt;tableCalls-&gt;resizeColumnsToContents();
</span><span class="lines">@@ -429,7 +430,7 @@
</span><span class="cx">     for (int i=0; i&lt;ui-&gt;tableCalls-&gt;rowCount(); i++)
</span><span class="cx">     {
</span><span class="cx">         QTableWidgetItem *item = ui-&gt;tableCalls-&gt;item(i, 1);
</span><del>-        if (item-&gt;data(Qt::UserRole).toString() == call.data()-&gt;getUUID())
</del><ins>+        if (item-&gt;data(Qt::UserRole).toString() == call.data()-&gt;getUuid())
</ins><span class="cx">         {
</span><span class="cx">             item-&gt;setText(tr(&quot;Answered&quot;));
</span><span class="cx">             ui-&gt;tableCalls-&gt;resizeColumnsToContents();
</span><span class="lines">@@ -463,7 +464,7 @@
</span><span class="cx">     for (int i=0; i&lt;ui-&gt;tableCalls-&gt;rowCount(); i++)
</span><span class="cx">     {
</span><span class="cx">         QTableWidgetItem *item = ui-&gt;tableCalls-&gt;item(i, 1);
</span><del>-        if (item-&gt;data(Qt::UserRole).toString() == call.data()-&gt;getUUID())
</del><ins>+        if (item-&gt;data(Qt::UserRole).toString() == call.data()-&gt;getUuid())
</ins><span class="cx">         {
</span><span class="cx">             ui-&gt;tableCalls-&gt;removeRow(i);
</span><span class="cx">             ui-&gt;tableCalls-&gt;resizeColumnsToContents();
</span><span class="lines">@@ -505,7 +506,7 @@
</span><span class="cx">     for (int i=0; i&lt;ui-&gt;tableCalls-&gt;rowCount(); i++)
</span><span class="cx">     {
</span><span class="cx">         QTableWidgetItem *item = ui-&gt;tableCalls-&gt;item(i, 1);
</span><del>-        if (item-&gt;data(Qt::UserRole).toString() == call.data()-&gt;getUUID())
</del><ins>+        if (item-&gt;data(Qt::UserRole).toString() == call.data()-&gt;getUuid())
</ins><span class="cx">         {
</span><span class="cx">             ui-&gt;tableCalls-&gt;removeRow(i);
</span><span class="cx">             ui-&gt;tableCalls-&gt;resizeColumnsToContents();
</span><span class="lines">@@ -515,7 +516,14 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     call.data()-&gt;setActive(false);
</span><del>-    ui-&gt;textEdit-&gt;setText(tr(&quot;Call with %1 (%2) hungup.&quot;).arg(call.data()-&gt;getCidName(), call.data()-&gt;getCidNumber()));
</del><ins>+    if (call.data()-&gt;getDirection() == FSCOMM_CALL_DIRECTION_INBOUND)
+    {
+        ui-&gt;textEdit-&gt;setText(tr(&quot;Call with %1 (%2) hungup.&quot;).arg(call.data()-&gt;getCidName(), call.data()-&gt;getCidNumber()));
+    }
+    else
+    {
+        ui-&gt;textEdit-&gt;setText(tr(&quot;Call with %1 hungup.&quot;).arg(call.data()-&gt;getCidNumber()));
+    }
</ins><span class="cx">     /* TODO: Will cause problems if 2 calls are received at the same time */
</span><span class="cx">     ui-&gt;recoredCallBtn-&gt;setEnabled(false);
</span><span class="cx">     ui-&gt;recoredCallBtn-&gt;setChecked(false);
</span></span></pre>
</div>
</div>
<div id="footer">See you at ClueCon</div>

</body>
</html>