Revision
14543
Author
jmesquita
Date
2009-08-17 02:28:19 -0500 (Mon, 17 Aug 2009)

Log Message

Fix buggy realtime statistics and a few things at MonitorStateMachine. Too late to remember what...

Modified Paths

Diff

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslconnection.cpp (14542 => 14543)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslconnection.cpp	2009-08-17 04:22:03 UTC (rev 14542)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslconnection.cpp	2009-08-17 07:28:19 UTC (rev 14543)
@@ -299,7 +299,6 @@
             {
                 commandTransaction = _commandQueue.dequeue();
                 event = bgapi(commandTransaction->getCommand());
-                qDebug() << "Sent a command and got this response : " << event;
                 if (event)
                     _commandHash.insert(event->_headers.value("Job-UUID"), commandTransaction);
             }

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/monitorstatemachine.cpp (14542 => 14543)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/monitorstatemachine.cpp	2009-08-17 04:22:03 UTC (rev 14542)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/monitorstatemachine.cpp	2009-08-17 07:28:19 UTC (rev 14543)
@@ -2,6 +2,13 @@
 #include "eslconnection.h"
 #include "esl.h"
 
+Call::Call(QString orig_uuid, Channel *orig_channel, QString caller_uuid, Channel *caller_channel) :
+        _orig_uuid(orig_uuid),
+        _orig_channel(orig_channel),
+        _caller_uuid(caller_uuid),
+        _caller_channel(caller_channel)
+{}
+
 MonitorStateMachine::MonitorStateMachine()
 {
 }
@@ -37,6 +44,44 @@
             }
             break;
         }
+        case (ESL_EVENT_CHANNEL_BRIDGE) :
+        {
+            QString orig_uuid = e._headers.value("Other-Leg-Unique-ID");
+            QString caller_uuid = e._headers.value("Unique-ID");
+            Channel * orig_chan = _channels.value(orig_uuid, NULL);
+            Channel * caller_chan = _channels.value(caller_uuid, NULL);
+            if (!orig_chan || !caller_chan)
+            {
+                qDebug() << QString("Channel %1 or %2 do not exist! [ESL_EVENT_CHANNEL_BRIDGE]").arg(orig_uuid, caller_uuid);
+            }
+            else
+            {
+                Call * new_call = new Call(orig_uuid, orig_chan, caller_uuid, caller_chan);
+                _calls.insert(caller_uuid,new_call);
+                caller_chan->stateChanged(e._headers);
+                emit callCreated(new_call);
+            }
+            break;
+        }
+        case (ESL_EVENT_CHANNEL_UNBRIDGE) :
+        {
+            QString orig_uuid = e._headers.value("Other-Leg-Unique-ID");
+            QString caller_uuid = e._headers.value("Unique-ID");
+            Channel * orig_chan = _channels.value(orig_uuid, NULL);
+            Channel * caller_chan = _channels.value(caller_uuid, NULL);
+            if (!orig_chan || !caller_chan)
+            {
+                qDebug() << QString("Channel %1 or %2 do not exist! [ESL_EVENT_CHANNEL_UNBRIDGE]").arg(orig_uuid, caller_uuid);
+            }
+            else
+            {
+                Call *ecall = _calls.take(caller_uuid);
+                _inactive_calls.insert(caller_uuid, ecall);
+                caller_chan->stateChanged(e._headers);
+                emit callDestroyed(ecall);
+            }
+            break;
+        }
         case (ESL_EVENT_CHANNEL_STATE) :
         {
             if (!_channels.contains(e._headers.value("Unique-ID")))
@@ -48,7 +93,6 @@
                 _channels[e._headers.value("Unique-ID")]->stateChanged(e._headers);
                 emit channelStateChanged(_channels.value(e._headers.value("Unique-ID")));
             }
-
             break;
         }
         case (ESL_EVENT_CHANNEL_DESTROY):
@@ -59,15 +103,15 @@
             }
             else
             {
-                _channels[e._headers.value("Unique-ID")]->stateChanged(e._headers);
-                emit channelDestroyed(_channels.value(e._headers.value("Unique-ID")));
+                Channel * chan = _channels.take(e._headers.value("Unique-ID"));
+                _inactive_channels.insert(e._headers.value("Unique-ID"), chan);
+                emit channelDestroyed(chan);
             }
             break;
         }
         default:
         {
-            if (e.getType() != "COMMAND")
-                qDebug() << "Event not treated: " << e.getType();
+            break;
         }
     }
 

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/monitorstatemachine.h (14542 => 14543)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/monitorstatemachine.h	2009-08-17 04:22:03 UTC (rev 14542)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/monitorstatemachine.h	2009-08-17 07:28:19 UTC (rev 14543)
@@ -18,15 +18,37 @@
     QHash<QString, QString> getVariables() { return _variables; }
     QString getUUID() { return _uuid; }
     QString getHeader(QString header) { return _variables.value(header, ""); }
+    QHash<QString, QString> getHeaders() { return _variables; }
     void stateChanged(QHash<QString, QString> variables) { _variables = variables; }
 };
 
+class Call
+{
+private:
+    QString _orig_uuid;
+    Channel *_orig_channel;
+    QString _caller_uuid;
+    Channel *_caller_channel;
+public:
+    Call(QString orig_uuid, Channel *orig_channel,
+         QString caller_uuid, Channel *caller_channel);
+    QString getCallerUUID() { return _caller_uuid; }
+    QString getOriginateeUUID() { return _orig_uuid; }
+    Channel *getCallerChannel() { return _caller_channel; }
+    Channel *getOriginateeChannel() { return _orig_channel; }
+};
+
 class MonitorStateMachine : public QObject
 {
     Q_OBJECT
 private:
     QList<ESLconnection *> _listESL;
     QHash <QString, Channel *> _channels;
+    QHash <QString, Channel *> _inactive_channels;
+    /*! Always indexed by caller UUID */
+    QHash <QString, Call *> _calls;
+    /*! Always indexed by caller UUID */
+    QHash <QString, Call *> _inactive_calls;
 public:
     MonitorStateMachine();
     void addESLconnection(ESLconnection *);
@@ -39,6 +61,8 @@
 signals:
     void channelStateChanged(Channel *);
     void channelCreated(Channel *);
+    void callCreated(Call *);
+    void callDestroyed(Call *);
     void channelDestroyed(Channel *);
 };
 

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.cpp (14542 => 14543)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.cpp	2009-08-17 04:22:03 UTC (rev 14542)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.cpp	2009-08-17 07:28:19 UTC (rev 14543)
@@ -9,12 +9,23 @@
     _sm(sm)
 {
     m_ui->setupUi(this);
+
+    /* Connect channel stuff */
     connect(sm, SIGNAL(channelCreated(Channel*)),
             this, SLOT(channelCreate(Channel*)));
     connect(sm, SIGNAL(channelDestroyed(Channel*)),
             this, SLOT(channelDestroy(Channel*)));
+    connect(sm, SIGNAL(channelStateChanged(Channel*)),
+            this, SLOT(channelStateChanged(Channel*)));
     connect(m_ui->listActiveChannels, SIGNAL(itemClicked(QListWidgetItem*)),
             this, SLOT(channelSelected(QListWidgetItem*)));
+
+    /* Connect call stuff */
+    connect(sm, SIGNAL(callCreated(Call*)),
+            this, SLOT(callCreate(Call*)));
+    connect(sm, SIGNAL(callDestroyed(Call*)),
+            this, SLOT(callDestroy(Call*)));
+
     delete m_ui->tab_2;
 }
 
@@ -37,6 +48,10 @@
 
 void RealtimeStatisticsDialog::channelCreate(Channel *ch)
 {
+    /* Sanity checking */
+    if (!ch)
+        return;
+
     QListWidgetItem *item = new QListWidgetItem(QString("%1 - %2").arg(ch->getUUID(), ch->getHeader("Channel-State")),
                                                 m_ui->listActiveChannels);
     item->setData(Qt::UserRole, ch->getUUID());
@@ -44,6 +59,10 @@
 
 void RealtimeStatisticsDialog::channelDestroy(Channel *ch)
 {
+    /* Sanity checking */
+    if (!ch)
+        return;
+
     for (int i = 0; i < m_ui->listActiveChannels->count(); i++)
     {
         if (m_ui->listActiveChannels->item(i)->data(Qt::UserRole) == ch->getUUID())
@@ -56,6 +75,23 @@
     }
 }
 
+void RealtimeStatisticsDialog::channelStateChanged(Channel * ch)
+{
+    /* Sanity checking */
+    if (!ch)
+        return;
+
+    for (int i = 0; i < m_ui->listActiveChannels->count(); i++)
+    {
+        if (m_ui->listActiveChannels->item(i)->data(Qt::UserRole).toString() == ch->getUUID())
+            if (m_ui->listActiveChannels->currentItem() == m_ui->listActiveChannels->item(i))
+            {
+                channelSelected(m_ui->listActiveChannels->item(i));
+            }
+        m_ui->listActiveChannels->item(i)->setText(QString("%1 - %2").arg(ch->getUUID(), ch->getHeader("Channel-State")));
+    }
+}
+
 void RealtimeStatisticsDialog::channelSelected(QListWidgetItem *item)
 {
     m_ui->listActiveVariables->clear();
@@ -69,3 +105,30 @@
         m_ui->listActiveVariables->addItem(QString("%1 = %2").arg(key, ch->getVariables().value(key)));
     }
 }
+
+void RealtimeStatisticsDialog::callCreate(Call *c)
+{
+    /* Sanity checking */
+    if (!c)
+        return;
+    QString caller_cidnum = c->getCallerChannel()->getHeader("Caller-Caller-ID-Number");
+    QString caller_cidname = c->getCallerChannel()->getHeader("variable_effective_caller_id_name");
+    QString orig_cidnum = c->getCallerChannel()->getHeader("Caller-Destination-Number");
+    QListWidgetItem *item = new QListWidgetItem(QString("%1(%2) <-> %3").arg(caller_cidnum,
+                                                                             caller_cidname,
+                                                                             orig_cidnum), m_ui->listActiveCalls);
+    item->setData(Qt::UserRole, c->getCallerUUID());
+}
+
+void RealtimeStatisticsDialog::callDestroy(Call *c)
+{
+    /* Sanity checking */
+    if (!c)
+        return;
+
+    for (int i = 0; i < m_ui->listActiveCalls->count(); i++)
+    {
+        if (m_ui->listActiveCalls->item(i)->data(Qt::UserRole) == c->getCallerUUID())
+            delete m_ui->listActiveCalls->item(i);
+    }
+}

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.h (14542 => 14543)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.h	2009-08-17 04:22:03 UTC (rev 14542)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.h	2009-08-17 07:28:19 UTC (rev 14543)
@@ -10,6 +10,7 @@
 class QListWidgetItem;
 class MonitorStateMachine;
 class Channel;
+class Call;
 
 class RealtimeStatisticsDialog : public QDialog {
     Q_OBJECT
@@ -24,7 +25,10 @@
 private slots:
     void channelCreate(Channel *);
     void channelDestroy(Channel *);
+    void channelStateChanged(Channel *);
     void channelSelected(QListWidgetItem *);
+    void callCreate(Call *);
+    void callDestroy(Call *);
 
 private:
     Ui::RealtimeStatisticsDialog *m_ui;