Revision
16316
Author
jmesquita
Date
2010-01-14 21:30:11 -0600 (Thu, 14 Jan 2010)

Log Message

Change to start messing with QSharedPointer instead of regular pointers to deal with events correctly. Thanks Math.

Modified Paths

Diff

Modified: freeswitch/trunk/fscomm/call.cpp (16315 => 16316)


--- freeswitch/trunk/fscomm/call.cpp	2010-01-15 00:31:43 UTC (rev 16315)
+++ freeswitch/trunk/fscomm/call.cpp	2010-01-15 03:30:11 UTC (rev 16316)
@@ -28,6 +28,7 @@
  */
 
 #include "call.h"
+#include <fshost.h>
 
 Call::Call()
 {

Modified: freeswitch/trunk/fscomm/call.h (16315 => 16316)


--- freeswitch/trunk/fscomm/call.h	2010-01-15 00:31:43 UTC (rev 16315)
+++ freeswitch/trunk/fscomm/call.h	2010-01-15 03:30:11 UTC (rev 16316)
@@ -31,12 +31,12 @@
 
 #include <QtCore>
 #include <QString>
-#include <fshost.h>
 
 typedef enum {
     FSCOMM_CALL_STATE_RINGING = 0,
     FSCOMM_CALL_STATE_TRYING  = 1,
-    FSCOMM_CALL_STATE_ANSWERED = 2
+    FSCOMM_CALL_STATE_ANSWERED = 2,
+    FSCOMM_CALL_STATE_FAILED = 3
 } fscomm_call_state_t;
 
 typedef enum {
@@ -57,11 +57,14 @@
     fscomm_call_direction_t getDirection() { return _direction; }
     fscomm_call_state_t getState() { return _state; }
     void setState(fscomm_call_state_t state) { _state = state; }
+    void setCause(QString cause) { _cause = cause; }
+    QString getCause() { return _cause; }
 
 private:
     int _call_id;
     QString _cid_name;
     QString _cid_number;
+    QString _cause;
     fscomm_call_direction_t _direction;
     QString _uuid;
     QString _buuid;

Modified: freeswitch/trunk/fscomm/fshost.cpp (16315 => 16316)


--- freeswitch/trunk/fscomm/fshost.cpp	2010-01-15 00:31:43 UTC (rev 16315)
+++ freeswitch/trunk/fscomm/fshost.cpp	2010-01-15 03:30:11 UTC (rev 16316)
@@ -29,7 +29,6 @@
 
 #include <QtGui>
 #include "fshost.h"
-#include "call.h"
 #include "mod_qsettings/mod_qsettings.h"
 
 /* Declare it globally */
@@ -43,7 +42,7 @@
     switch_core_setrlimits();
     switch_core_set_globals();
 
-    qRegisterMetaType<Call>("Call");
+    qRegisterMetaType<QSharedPointer<Call> >("QSharedPointer<Call>");
 
 }
 
@@ -160,17 +159,17 @@
 switch_status_t FSHost::processAlegEvent(switch_event_t * event, QString uuid)
 {
     switch_status_t status = SWITCH_STATUS_SUCCESS;
-    Call * call = _active_calls.value(uuid);
+    QSharedPointer<Call> call = _active_calls.value(uuid);
     /* Inbound call */
-    if (call->getDirection() == FSCOMM_CALL_DIRECTION_INBOUND)
+    if (call.data()->getDirection() == FSCOMM_CALL_DIRECTION_INBOUND)
     {
         switch(event->event_id) {
         case SWITCH_EVENT_CHANNEL_ANSWER:
             {
-                call->setbUUID(switch_event_get_header_nil(event, "Other-Leg-Unique-ID"));
+                call.data()->setbUUID(switch_event_get_header_nil(event, "Other-Leg-Unique-ID"));
                 _bleg_uuids.insert(switch_event_get_header_nil(event, "Other-Leg-Unique-ID"), uuid);
-                call->setState(FSCOMM_CALL_STATE_ANSWERED);
-                emit answered(uuid);
+                call.data()->setState(FSCOMM_CALL_STATE_ANSWERED);
+                emit answered(call);
                 break;
             }
         case SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE:
@@ -180,7 +179,7 @@
             }
         case SWITCH_EVENT_CHANNEL_STATE:
             {
-                printf("CHANNEL_STATE Answer-State: %s | Channel-State: %s | %s | %s\n", switch_event_get_header_nil(event, "Answer-State"),switch_event_get_header_nil(event, "Channel-State"), uuid.toAscii().constData(), switch_event_get_header_nil(event, "Other-Leg-Unique-ID"));
+                qDebug() << QString("CHANNEL_STATE Answer-State: %1 | Channel-State: %2 | %3 | %4\n").arg(switch_event_get_header_nil(event, "Answer-State"),switch_event_get_header_nil(event, "Channel-State"), uuid.toAscii().constData(), switch_event_get_header_nil(event, "Other-Leg-Unique-ID"));
                 break;
             }
         default:
@@ -196,21 +195,24 @@
         {
         case SWITCH_EVENT_CHANNEL_BRIDGE:
             {
-                _active_calls.value(uuid)->setbUUID(switch_event_get_header_nil(event, "Other-Leg-Unique-ID"));
+                _active_calls.value(uuid).data()->setbUUID(switch_event_get_header_nil(event, "Other-Leg-Unique-ID"));
                 _bleg_uuids.insert(switch_event_get_header_nil(event, "Other-Leg-Unique-ID"), uuid);
                 break;
             }
         case SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE:
             {
-                if (call->getState() == FSCOMM_CALL_STATE_TRYING)
+                if (call.data()->getState() == FSCOMM_CALL_STATE_TRYING)
                 {
-                    emit callFailed(uuid);
+                    QString cause = switch_event_get_header_nil(event, "Hangup-Cause");
+                    call.data()->setState(FSCOMM_CALL_STATE_FAILED);
+                    call.data()->setCause(cause);
+                    emit callFailed(call);
                     _active_calls.take(uuid);
                 }
                 break;
             }
         default:
-            printf("A leg: %s(%s)\n",switch_event_name(event->event_id), switch_event_get_header_nil(event, "Event-Subclass"));
+            qDebug() << QString("A leg: %1(%2)\n").arg(switch_event_name(event->event_id), switch_event_get_header_nil(event, "Event-Subclass"));
             break;
         }
     }
@@ -221,9 +223,9 @@
 {
     QString uuid = _bleg_uuids.value(buuid);
     switch_status_t status = SWITCH_STATUS_SUCCESS;
-    Call * call = _active_calls.value(uuid);
+    QSharedPointer<Call> call = _active_calls.value(uuid);
     /* Inbound call */
-    if (call->getDirection() == FSCOMM_CALL_DIRECTION_INBOUND)
+    if (call.data()->getDirection() == FSCOMM_CALL_DIRECTION_INBOUND)
     {
         qDebug() << " Inbound call";
     }
@@ -234,12 +236,13 @@
         {
         case SWITCH_EVENT_CHANNEL_ANSWER:
             {
-                emit answered(uuid);
+                emit answered(call);
                 break;
             }
         case SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE:
             {
-                emit hungup(_active_calls.take(uuid));
+                _active_calls.take(uuid);
+                emit hungup(call);
                 _bleg_uuids.take(buuid);
                 break;
             }
@@ -247,15 +250,15 @@
             {
                 if (QString(switch_event_get_header_nil(event, "Answer-State")) == "early")
                 {
-                    call->setState(FSCOMM_CALL_STATE_RINGING);
-                    emit ringing(uuid);
+                    call.data()->setState(FSCOMM_CALL_STATE_RINGING);
+                    emit ringing(call);
                 }
                 //printEventHeaders(event);
                 break;
             }
 
         default:
-            printf("B leg: %s(%s)\n",switch_event_name(event->event_id), switch_event_get_header_nil(event, "Event-Subclass"));
+            qDebug() << QString("B leg: %1(%2)\n").arg(switch_event_name(event->event_id), switch_event_get_header_nil(event, "Event-Subclass"));
             break;
         }
     }
@@ -264,6 +267,7 @@
 
 void FSHost::generalEventHandler(switch_event_t *event)
 {
+    /*printEventHeaders(event);*/
     QString uuid = switch_event_get_header_nil(event, "Unique-ID");
 
     if (_bleg_uuids.contains(uuid))
@@ -287,24 +291,26 @@
         {
             if (strcmp(event->subclass_name, "portaudio::ringing") == 0 && !_active_calls.contains(uuid))
             {
-                Call *call = new Call(atoi(switch_event_get_header_nil(event, "call_id")),
+                Call *callPtr = new Call(atoi(switch_event_get_header_nil(event, "call_id")),
                                       switch_event_get_header_nil(event, "Caller-Caller-ID-Name"),
                                       switch_event_get_header_nil(event, "Caller-Caller-ID-Number"),
                                       FSCOMM_CALL_DIRECTION_INBOUND,
                                       uuid);
+                QSharedPointer<Call> call(callPtr);
                 _active_calls.insert(uuid, call);
-                call->setState(FSCOMM_CALL_STATE_RINGING);
-                emit ringing(uuid);
+                call.data()->setState(FSCOMM_CALL_STATE_RINGING);
+                emit ringing(call);
             }
             else if (strcmp(event->subclass_name, "portaudio::makecall") == 0)
             {
-                Call *call = new Call(atoi(switch_event_get_header_nil(event, "call_id")),NULL,
+                Call *callPtr = new Call(atoi(switch_event_get_header_nil(event, "call_id")),NULL,
                                       switch_event_get_header_nil(event, "Caller-Destination-Number"),
                                       FSCOMM_CALL_DIRECTION_OUTBOUND,
                                       uuid);
+                QSharedPointer<Call> call(callPtr);
                 _active_calls.insert(uuid, call);
-                call->setState(FSCOMM_CALL_STATE_TRYING);
-                emit newOutgoingCall(uuid);
+                call.data()->setState(FSCOMM_CALL_STATE_TRYING);
+                emit newOutgoingCall(call);
             }
             else if (strcmp(event->subclass_name, "sofia::gateway_state") == 0)
             {
@@ -331,7 +337,7 @@
             }
             else
             {
-                //printf("We got a not treated custom event: %s\n", (!zstr(event->subclass_name) ? event->subclass_name : "NULL"));
+                //qDebug() << QString("We got a not treated custom event: %1\n").arg(!zstr(event->subclass_name) ? event->subclass_name : "NULL"));
             }
             break;
         }
@@ -347,6 +353,7 @@
     SWITCH_STANDARD_STREAM(stream);
     status = switch_api_execute(cmd, args, NULL, &stream);
     *res = switch_str_nil((char *) stream.data);
+    switch_safe_free(stream.data);
 
     return status;
 }
@@ -354,9 +361,9 @@
 void FSHost::printEventHeaders(switch_event_t *event)
 {
     switch_event_header_t *hp;
-    printf("Received event: %s(%s)\n", switch_event_name(event->event_id), switch_event_get_header_nil(event, "Event-Subclass"));
+    qDebug() << QString("Received event: %1(%2)\n").arg(switch_event_name(event->event_id), switch_event_get_header_nil(event, "Event-Subclass"));
     for (hp = event->headers; hp; hp = hp->next) {
-        printf("%s=%s\n", hp->name, hp->value);
+        qDebug() << hp->name << "=" << hp->value;
     }
-    printf("\n\n");
+    qDebug() << "\n\n";
 }

Modified: freeswitch/trunk/fscomm/fshost.h (16315 => 16316)


--- freeswitch/trunk/fscomm/fshost.h	2010-01-15 00:31:43 UTC (rev 16315)
+++ freeswitch/trunk/fscomm/fshost.h	2010-01-15 03:30:11 UTC (rev 16316)
@@ -31,10 +31,10 @@
 
 #include <QThread>
 #include <QHash>
+#include <QSharedPointer>
 #include <switch.h>
+#include "call.h"
 
-class Call;
-
 #define FSCOMM_GW_STATE_TRYING 0
 #define FSCOMM_GW_STATE_REGISTER 1
 #define FSCOMM_GW_STATE_REGED 2
@@ -65,7 +65,7 @@
     explicit FSHost(QObject *parent = 0);
     switch_status_t sendCmd(const char *cmd, const char *args, QString *res);
     void generalEventHandler(switch_event_t *event);
-    Call * getCallByUUID(QString uuid) { return _active_calls.value(uuid, NULL); }
+    QSharedPointer<Call> getCallByUUID(QString uuid) { return _active_calls.value(uuid); }
     QString getGwStateName(int id) { return fscomm_gw_state_names[id]; }
 
 protected:
@@ -74,11 +74,11 @@
 signals:
     void coreLoadingError(QString);
     void ready(void);
-    void ringing(QString);
-    void answered(QString);
-    void newOutgoingCall(QString);
-    void callFailed(QString);
-    void hungup(Call*);
+    void ringing(QSharedPointer<Call>);
+    void answered(QSharedPointer<Call>);
+    void newOutgoingCall(QSharedPointer<Call>);
+    void callFailed(QSharedPointer<Call>);
+    void hungup(QSharedPointer<Call>);
     void gwStateChange(QString, int);
 
 private:
@@ -86,7 +86,7 @@
     switch_status_t processAlegEvent(switch_event_t *, QString);
     void createFolders();
     void printEventHeaders(switch_event_t *event);
-    QHash<QString, Call*> _active_calls;
+    QHash<QString, QSharedPointer<Call> > _active_calls;
     QHash<QString, QString> _bleg_uuids;
 };
 

Modified: freeswitch/trunk/fscomm/mainwindow.cpp (16315 => 16316)


--- freeswitch/trunk/fscomm/mainwindow.cpp	2010-01-15 00:31:43 UTC (rev 16315)
+++ freeswitch/trunk/fscomm/mainwindow.cpp	2010-01-15 03:30:11 UTC (rev 16316)
@@ -76,10 +76,10 @@
     connect(dialpadMapper, SIGNAL(mapped(QString)), this, SLOT(dialDTMF(QString)));
 
     connect(&g_FSHost, SIGNAL(ready()),this, SLOT(fshostReady()));
-    connect(&g_FSHost, SIGNAL(ringing(QString)), this, SLOT(ringing(QString)));
-    connect(&g_FSHost, SIGNAL(answered(QString)), this, SLOT(answered(QString)));
-    connect(&g_FSHost, SIGNAL(hungup(Call*)), this, SLOT(hungup(Call*)));
-    connect(&g_FSHost, SIGNAL(newOutgoingCall(QString)), this, SLOT(newOutgoingCall(QString)));
+    connect(&g_FSHost, SIGNAL(ringing(QSharedPointer<Call>)), this, SLOT(ringing(QSharedPointer<Call>)));
+    connect(&g_FSHost, SIGNAL(answered(QSharedPointer<Call>)), this, SLOT(answered(QSharedPointer<Call>)));
+    connect(&g_FSHost, SIGNAL(hungup(QSharedPointer<Call>)), this, SLOT(hungup(QSharedPointer<Call>)));
+    connect(&g_FSHost, SIGNAL(newOutgoingCall(QSharedPointer<Call>)), this, SLOT(newOutgoingCall(QSharedPointer<Call>)));
     connect(&g_FSHost, SIGNAL(gwStateChange(QString,int)), this, SLOT(gwStateChanged(QString,int)));
     /*connect(&g_FSHost, SIGNAL(coreLoadingError(QString)), this, SLOT(coreLoadingError(QString)));*/
 
@@ -152,11 +152,11 @@
 
 void MainWindow::callListDoubleClick(QListWidgetItem *item)
 {
-    Call *call = g_FSHost.getCallByUUID(item->data(Qt::UserRole).toString());
-    QString switch_str = QString("switch %1").arg(call->getCallID());
+    QSharedPointer<Call> call = g_FSHost.getCallByUUID(item->data(Qt::UserRole).toString());
+    QString switch_str = QString("switch %1").arg(call.data()->getCallID());
     QString result;
     if (g_FSHost.sendCmd("pa", switch_str.toAscii(), &result) == SWITCH_STATUS_FALSE) {
-        ui->textEdit->setText(QString("Error switching to call %1").arg(call->getCallID()));
+        ui->textEdit->setText(QString("Error switching to call %1").arg(call.data()->getCallID()));
         return;
     }
     ui->hangupBtn->setEnabled(true);
@@ -219,54 +219,51 @@
     ui->hangupBtn->setEnabled(false);
 }
 
-void MainWindow::newOutgoingCall(QString uuid)
+void MainWindow::newOutgoingCall(QSharedPointer<Call> call)
 {
-    Call *call = g_FSHost.getCallByUUID(uuid);
-    ui->textEdit->setText(QString("Calling %1 (%2)").arg(call->getCidName(), call->getCidNumber()));
-    QListWidgetItem *item = new QListWidgetItem(tr("%1 (%2) - Calling").arg(call->getCidName(), call->getCidNumber()));
-    item->setData(Qt::UserRole, uuid);
+    ui->textEdit->setText(QString("Calling %1 (%2)").arg(call.data()->getCidName(), call.data()->getCidNumber()));
+    QListWidgetItem *item = new QListWidgetItem(tr("%1 (%2) - Calling").arg(call.data()->getCidName(), call.data()->getCidNumber()));
+    item->setData(Qt::UserRole, call.data()->getUUID());
     ui->listCalls->addItem(item);
     ui->hangupBtn->setEnabled(true);
 }
 
-void MainWindow::ringing(QString uuid)
+void MainWindow::ringing(QSharedPointer<Call> call)
 {
 
-    Call *call = g_FSHost.getCallByUUID(uuid);
     for (int i=0; i<ui->listCalls->count(); i++)
     {
         QListWidgetItem *item = ui->listCalls->item(i);
-        if (item->data(Qt::UserRole).toString() == uuid)
+        if (item->data(Qt::UserRole).toString() == call.data()->getUUID())
         {
-            item->setText(tr("%1 - Ringing").arg(call->getCidNumber()));
-            ui->textEdit->setText(QString("Call from %1 (%2)").arg(call->getCidName(), call->getCidNumber()));
+            item->setText(tr("%1 - Ringing").arg(call.data()->getCidNumber()));
+            ui->textEdit->setText(QString("Call from %1 (%2)").arg(call.data()->getCidName(), call.data()->getCidNumber()));
             return;
         }
     }
 
-    ui->textEdit->setText(QString("Call from %1 (%2)").arg(call->getCidName(), call->getCidNumber()));
-    QListWidgetItem *item = new QListWidgetItem(tr("%1 (%2) - Ringing").arg(call->getCidName(), call->getCidNumber()));
-    item->setData(Qt::UserRole, uuid);
+    ui->textEdit->setText(QString("Call from %1 (%2)").arg(call.data()->getCidName(), call.data()->getCidNumber()));
+    QListWidgetItem *item = new QListWidgetItem(tr("%1 (%2) - Ringing").arg(call.data()->getCidName(), call.data()->getCidNumber()));
+    item->setData(Qt::UserRole, call.data()->getUUID());
     ui->listCalls->addItem(item);
     ui->answerBtn->setEnabled(true);
 }
 
-void MainWindow::answered(QString uuid)
+void MainWindow::answered(QSharedPointer<Call> call)
 {
-    Call *call = g_FSHost.getCallByUUID(uuid);
     for (int i=0; i<ui->listCalls->count(); i++)
     {
         QListWidgetItem *item = ui->listCalls->item(i);
-        if (item->data(Qt::UserRole).toString() == uuid)
+        if (item->data(Qt::UserRole).toString() == call.data()->getUUID())
         {
-            if (call->getDirection() == FSCOMM_CALL_DIRECTION_INBOUND)
+            if (call.data()->getDirection() == FSCOMM_CALL_DIRECTION_INBOUND)
             {
-                item->setText(tr("%1 (%2) - Active").arg(call->getCidName(), call->getCidNumber()));
+                item->setText(tr("%1 (%2) - Active").arg(call.data()->getCidName(), call.data()->getCidNumber()));
                 break;
             }
             else
             {
-                item->setText(tr("%1 - Active").arg(call->getCidNumber()));
+                item->setText(tr("%1 - Active").arg(call.data()->getCidNumber()));
                 break;
             }
         }
@@ -289,18 +286,18 @@
     ui->dtmfPoundBtn->setEnabled(true);
 }
 
-void MainWindow::hungup(Call* call)
+void MainWindow::hungup(QSharedPointer<Call> call)
 {
     for (int i=0; i<ui->listCalls->count(); i++)
     {
         QListWidgetItem *item = ui->listCalls->item(i);
-        if (item->data(Qt::UserRole).toString() == call->getUUID())
+        if (item->data(Qt::UserRole).toString() == call.data()->getUUID())
         {
             delete ui->listCalls->takeItem(i);
             break;
         }
     }
-    ui->textEdit->setText(tr("Call with %1 (%2) hungup.").arg(call->getCidName(), call->getCidNumber()));
+    ui->textEdit->setText(tr("Call with %1 (%2) hungup.").arg(call.data()->getCidName(), call.data()->getCidNumber()));
     /* TODO: Will cause problems if 2 calls are received at the same time */
     ui->answerBtn->setEnabled(false);
     ui->hangupBtn->setEnabled(false);
@@ -320,7 +317,6 @@
     ui->dtmfDBtn->setEnabled(false);
     ui->dtmfAstBtn->setEnabled(false);
     ui->dtmfPoundBtn->setEnabled(false);
-    delete call;
 }
 
 void MainWindow::changeEvent(QEvent *e)

Modified: freeswitch/trunk/fscomm/mainwindow.h (16315 => 16316)


--- freeswitch/trunk/fscomm/mainwindow.h	2010-01-15 00:31:43 UTC (rev 16315)
+++ freeswitch/trunk/fscomm/mainwindow.h	2010-01-15 03:30:11 UTC (rev 16316)
@@ -68,10 +68,10 @@
     void paAnswer();
     void paCall(QString);
     void paHangup();
-    void newOutgoingCall(QString);
-    void ringing(QString);
-    void answered(QString);
-    void hungup(Call*);
+    void newOutgoingCall(QSharedPointer<Call>);
+    void ringing(QSharedPointer<Call>);
+    void answered(QSharedPointer<Call>);
+    void hungup(QSharedPointer<Call>);
 
 private:
     Ui::MainWindow *ui;