Revision
14542
Author
jmesquita
Date
2009-08-16 23:22:03 -0500 (Sun, 16 Aug 2009)

Log Message

Major esl cleanup and initial channel state machine. New realtime statistics (still buggy) on console plugin.

Modified Paths

Added Paths

Diff

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/fsgui/appmanager.cpp (14541 => 14542)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/fsgui/appmanager.cpp	2009-08-17 00:32:26 UTC (rev 14541)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/fsgui/appmanager.cpp	2009-08-17 04:22:03 UTC (rev 14542)
@@ -210,7 +210,7 @@
 {
     if (!reallyClose)
     {
-        reallyClose = new QMessageBox();
+        reallyClose = new QMessageBox(settingsDialog);
         reallyClose->setText("Do you really want to close FsGui?");
         reallyClose->setStandardButtons(QMessageBox::Yes | QMessageBox::No);
         reallyClose->setDefaultButton(QMessageBox::Yes);

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


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslconnection.cpp	2009-08-17 00:32:26 UTC (rev 14541)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslconnection.cpp	2009-08-17 04:22:03 UTC (rev 14542)
@@ -49,13 +49,24 @@
 
 ESLconnection::ESLconnection(const char *host, const char *port, const char *password, const char *name)
         : handle(NULL),_host(new QString(host)), _port(new QString(port)),
-        _pass(new QString(password)), _name(new QString(name)){}
+        _pass(new QString(password)), _name(new QString(name))
+{
+    qRegisterMetaType<ESLevent>("ESLevent");
+}
+
 ESLconnection::~ESLconnection()
 {
     if (isConnected()) {
+
+        {
+            QMutexLocker locker(&_commandQueueMutex);
+            while(!_commandQueue.isEmpty())
+                _commandQueue.dequeue();
+        }
+
         esl_disconnect(handle);
     }
-
+    wait();
 }
 
 QString ESLconnection::getName()
@@ -107,12 +118,13 @@
     if (esl_send_recv(handle, cmd) == ESL_SUCCESS) {
         esl_event_t *event;
         esl_event_dup(&event, handle->last_sr_event);
-        return new ESLevent(event, 1);
+        return new ESLevent(event);
     }
 
     return NULL;
 }
 
+/*
 void ESLconnection::api(QString cmd)
 {
     if (cmd.isEmpty()) {
@@ -125,18 +137,20 @@
         emit gotEvent(new ESLevent(event, 1));
     }
 }
+*/
 
-void ESLconnection::bgapi(QString cmd)
+ESLevent * ESLconnection::bgapi(QString cmd)
 {
     if (cmd.isEmpty()) {
-        return;
+        return NULL;
     }
 
     if (esl_send_recv(handle, QString("bgapi %1").arg(cmd).toAscii()) == ESL_SUCCESS) {
         esl_event_t *event;
         esl_event_dup(&event, handle->last_sr_event);
-        emit gotEvent(new ESLevent(event, 1));
+        return new ESLevent(event);;
     }
+    return NULL;
 }
 
 ESLevent *ESLconnection::getInfo()
@@ -144,7 +158,7 @@
     if (handle->connected && handle->info_event) {
         esl_event_t *event;
         esl_event_dup(&event, handle->info_event);
-        return new ESLevent(event, 1);
+        return new ESLevent(event);
     }
 
     return NULL;
@@ -184,46 +198,38 @@
     return r;
 }
 
+/*
 int ESLconnection::sendEvent(ESLevent *send_me)
 {
     return esl_sendevent(handle, send_me->event);
 }
+*/
 
 ESLevent *ESLconnection::recvEvent()
 {
-    if (last_event_obj) {
-        delete last_event_obj;
-    }
 
     if (esl_recv_event(handle, 1, NULL) == ESL_SUCCESS) {
         esl_event_t *e = handle->last_ievent ? handle->last_ievent : handle->last_event;
         if (e) {
             esl_event_t *event;
             esl_event_dup(&event, e);
-            last_event_obj = new ESLevent(event, 1);
-            return last_event_obj;
+            return new ESLevent(event);
         }
     }
 
-    last_event_obj = new ESLevent("server_disconnected");
+    //last_event_obj = new ESLevent("server_disconnected");
 
-    return last_event_obj;
+    return NULL;
 }
 
 ESLevent *ESLconnection::recvEventTimed(int ms)
 {
-    if (last_event_obj) {
-        delete last_event_obj;
-        last_event_obj = NULL;
-    }
-
     if (esl_recv_event_timed(handle, ms, 1, NULL) == ESL_SUCCESS) {
         esl_event_t *e = handle->last_ievent ? handle->last_ievent : handle->last_event;
         if (e) {
             esl_event_t *event;
             esl_event_dup(&event, e);
-            last_event_obj = new ESLevent(event, 1);
-            return last_event_obj;
+            return new ESLevent(event);
         }
     }
 
@@ -237,7 +243,7 @@
     if (status == ESL_SUCCESS && handle->last_sr_event) {
         esl_event_t *event;
         esl_event_dup(&event, handle->last_sr_event);
-        return new ESLevent(event, 1);
+        return new ESLevent(event);
     }
 
     return NULL;
@@ -255,26 +261,49 @@
     return esl_events(handle, type_id, value);
 }
 
+void ESLconnection::addCommand(CommandTransaction *commandT)
+{
+    QMutexLocker locker(&_commandQueueMutex);
+    _commandQueue.enqueue(commandT);
+}
+
 void ESLconnection::run(void)
 {
 
     handle = new esl_handle_t;
     memset(handle, 0, sizeof(esl_handle_t));
-    last_event_obj = NULL;
+
+    CommandTransaction *commandTransaction = 0;
+    ESLevent * event = NULL;
+
     if (esl_connect(handle, _host->toAscii(), _port->toInt(), _pass->toAscii()) == ESL_SUCCESS)
     {
-        send("event plain ALL");
+        events("plain", "all");
         send("log 7");
         emit connected();
     }
+
     while(isConnected())
     {
-        ESLevent * event = recvEventTimed(10);
+        // Process 1 received event
+        event = recvEventTimed(10);
         if (event)
         {
-            ESLevent * e = new ESLevent(event);
-            emit gotEvent(e);
+            processReceivedEvent(event);
         }
+
+        // Process all pending commands
+        {
+            QMutexLocker locker(&_commandQueueMutex);
+            while (!_commandQueue.isEmpty())
+            {
+                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);
+            }
+        }
     }
     if (!QString(handle->err).isEmpty())
     {
@@ -286,193 +315,37 @@
     }
 }
 
-// ESLevent
-///////////////////////////////////////////////////////////////////////
-
-ESLevent::ESLevent(const char *type, const char *subclass_name)
+void ESLconnection::processReceivedEvent(ESLevent *event)
 {
-    esl_event_types_t event_id;
-
-    event_construct_common();
-
-    if (esl_name_event(type, &event_id) != ESL_SUCCESS) {
-        event_id = ESL_EVENT_MESSAGE;
+    CommandTransaction *commandTransaction = 0;
+    /* Process all log messages */
+    if (QString(event->_headers.value("Content-Type")) == QString("log/data"))
+    {
+        emit receivedLogMessage(*event);
     }
-
-    if (!esl_strlen_zero(subclass_name) && event_id != ESL_EVENT_CUSTOM) {
-        esl_log(ESL_LOG_WARNING, "Changing event type to custom because you specified a subclass name!\n");
-        event_id = ESL_EVENT_CUSTOM;
+    /* Process command responses */
+    if (event->_headers.value("Job-UUID") != NULL)
+    {
+        if(_commandHash.contains(event->_headers.value("Job-UUID")))
+        {
+            commandTransaction = _commandHash.value(event->_headers.value("Job-UUID"));
+            commandTransaction->setResponse(*event);
+        }
+        else
+        {
+            qDebug() << "Something went wrong... We should log this...";
+        }
     }
-
-    if (esl_event_create_subclass(&event, event_id, subclass_name) != ESL_SUCCESS) {
-        esl_log(ESL_LOG_ERROR, "Failed to create event!\n");
-        event = NULL;
-    }
-
-    serialized_string = NULL;
-    mine = 1;
+    /* Process all other events*/
+    emit receivedChannelEvent(*event);
 }
 
-ESLevent::ESLevent(esl_event_t *wrap_me, int free_me)
+CommandTransaction::CommandTransaction(QString command)
 {
-    event_construct_common();
-    event = wrap_me;
-    mine = free_me;
-    serialized_string = NULL;
+    _command = command;
 }
 
-
-ESLevent::ESLevent(ESLevent *me)
+void CommandTransaction::setResponse(ESLevent e)
 {
-    /* workaround for silly php thing */
-    event = me->event;
-    mine = me->mine;
-    serialized_string = NULL;
-    me->event = NULL;
-    me->mine = 0;
-    esl_safe_free(me->serialized_string);
+    emit gotResponse(e);
 }
-
-ESLevent::~ESLevent()
-{
-
-    if (serialized_string) {
-        free(serialized_string);
-    }
-
-    if (event && mine) {
-        esl_event_destroy(&event);
-    }
-}
-
-const char *ESLevent::nextHeader(void)
-{
-    const char *name = NULL;
-
-    if (hp) {
-        name = hp->name;
-        hp = hp->next;
-    }
-
-    return name;
-}
-
-const char *ESLevent::firstHeader(void)
-{
-    if (event) {
-        hp = event->headers;
-    }
-
-    return nextHeader();
-}
-
-const char *ESLevent::serialize()
-{
-    this_check("");
-
-    esl_safe_free(serialized_string);
-
-    if (!event) {
-        return "";
-    }
-
-    if (esl_event_serialize(event, &serialized_string, ESL_TRUE) == ESL_SUCCESS) {
-        return serialized_string;
-    }
-
-    return "";
-
-}
-
-bool ESLevent::setPriority(esl_priority_t priority)
-{
-    this_check(false);
-
-    if (event) {
-        esl_event_set_priority(event, priority);
-        return true;
-    } else {
-        esl_log(ESL_LOG_ERROR, "Trying to setPriority an event that does not exist!\n");
-    }
-    return false;
-}
-
-const char *ESLevent::getHeader(const char *header_name)
-{
-    this_check("");
-
-    if (event) {
-        return esl_event_get_header(event, header_name);
-    } else {
-        esl_log(ESL_LOG_ERROR, "Trying to getHeader an event that does not exist!\n");
-    }
-    return NULL;
-}
-
-bool ESLevent::addHeader(const char *header_name, const char *value)
-{
-    this_check(false);
-
-    if (event) {
-        return esl_event_add_header_string(event, ESL_STACK_BOTTOM, header_name, value) == ESL_SUCCESS ? true : false;
-    } else {
-        esl_log(ESL_LOG_ERROR, "Trying to addHeader an event that does not exist!\n");
-    }
-
-    return false;
-}
-
-bool ESLevent::delHeader(const char *header_name)
-{
-    this_check(false);
-
-    if (event) {
-        return esl_event_del_header(event, header_name) == ESL_SUCCESS ? true : false;
-    } else {
-        esl_log(ESL_LOG_ERROR, "Trying to delHeader an event that does not exist!\n");
-    }
-
-    return false;
-}
-
-
-bool ESLevent::addBody(const char *value)
-{
-    this_check(false);
-
-    if (event) {
-        return esl_event_add_body(event, "%s", value) == ESL_SUCCESS ? true : false;
-    } else {
-        esl_log(ESL_LOG_ERROR, "Trying to addBody an event that does not exist!\n");
-    }
-
-    return false;
-}
-
-char *ESLevent::getBody(void)
-{
-
-    this_check((char *)"");
-
-    if (event) {
-        return esl_event_get_body(event);
-    } else {
-        esl_log(ESL_LOG_ERROR, "Trying to getBody an event that does not exist!\n");
-    }
-
-    return NULL;
-}
-
-const char *ESLevent::getType(void)
-{
-    this_check("");
-
-    if (event) {
-        return esl_event_name(event->event_id);
-    } else {
-        esl_log(ESL_LOG_ERROR, "Trying to getType an event that does not exist!\n");
-    }
-
-    return (char *) "invalid";
-}
-

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


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslconnection.h	2009-08-17 00:32:26 UTC (rev 14541)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslconnection.h	2009-08-17 04:22:03 UTC (rev 14542)
@@ -41,33 +41,20 @@
 #include <QThread>
 #include <QtGui>
 #include <esl.h>
+#include "eslevent.h"
 
-#define this_check(x) do { if (!this) { esl_log(ESL_LOG_ERROR, "object is not initalized\n"); return x;}} while(0)
-#define this_check_void() do { if (!this) { esl_log(ESL_LOG_ERROR, "object is not initalized\n"); return;}} while(0)
-
-
-class ESLevent {
- private:
-        esl_event_header_t *hp;
- public:
-        esl_event_t *event;
-        char *serialized_string;
-        int mine;
-
-        ESLevent(const char *type, const char *subclass_name = NULL);
-        ESLevent(esl_event_t *wrap_me, int free_me = 0);
-        ESLevent(ESLevent *me);
-        virtual ~ESLevent();
-        const char *serialize();
-        bool setPriority(esl_priority_t priority = ESL_PRIORITY_NORMAL);
-        const char *getHeader(const char *header_name);
-        char *getBody(void);
-        const char *getType(void);
-        bool addBody(const char *value);
-        bool addHeader(const char *header_name, const char *value);
-        bool delHeader(const char *header_name);
-        const char *firstHeader(void);
-        const char *nextHeader(void);
+class CommandTransaction : public QObject
+{
+    Q_OBJECT
+public:
+    CommandTransaction(QString command);
+    QString getCommand() { return _command; }
+    void setCommand(QString command) { _command = command; }
+    void setResponse(ESLevent e);
+signals:
+    void gotResponse(ESLevent);
+private:
+    QString _command;
 };
 
 class ESLconnection : public QThread
@@ -75,38 +62,44 @@
     Q_OBJECT
  private:
     esl_handle_t *handle;
-    ESLevent *last_event_obj;
     QString *_host;
     QString *_port;
     QString *_pass;
     QString *_name;
+    QQueue<CommandTransaction *> _commandQueue;
+    QHash<QString, CommandTransaction *> _commandHash;
+    QMutex _commandQueueMutex;
+
+    void processReceivedEvent(ESLevent *);
+    ESLevent *sendRecv(const char *cmd);
+    //int sendEvent(ESLevent *send_me);
+    ESLevent *recvEvent();
+    ESLevent *recvEventTimed(int ms);
+    bool setConsoleLogLevel(int);
+    /*void api(QString cmd);*/
+    ESLevent* bgapi(QString cmd);
+    void send(QString cmd);
+    ESLevent *filter(const char *header, const char *value);
+    int events(const char *etype, const char *value);
  public:
     ESLconnection(const char *host, const char *port, const char *password, const char *name);
     virtual ~ESLconnection();
+    void addCommand(CommandTransaction *);
     int isConnected();
     void connect();
     ESLevent *getInfo();
-    ESLevent *sendRecv(const char *cmd);
-    int sendEvent(ESLevent *send_me);
-    ESLevent *recvEvent();
-    ESLevent *recvEventTimed(int ms);
-    ESLevent *filter(const char *header, const char *value);
-    int events(const char *etype, const char *value);
     int execute(const char *app, const char *arg = NULL, const char *uuid = NULL);
     int executeAsync(const char *app, const char *arg = NULL, const char *uuid = NULL);
     int setAsyncExecute(const char *val);
     int setEventLock(const char *val);
     int disconnect(void);
-    bool setConsoleLogLevel(int);
-    void api(QString cmd);
-    void bgapi(QString cmd);
-    void send(QString cmd);
     QString getName();
 signals:
     void connected(void);
     void disconnected(void);
     void connectionFailed(QString);
-    void gotEvent(ESLevent*);
+    void receivedLogMessage(ESLevent);
+    void receivedChannelEvent(ESLevent);
 protected:
     void run();
 };

Added: freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslevent.cpp (0 => 14542)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslevent.cpp	                        (rev 0)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslevent.cpp	2009-08-17 04:22:03 UTC (rev 14542)
@@ -0,0 +1,18 @@
+#include <QtGui>
+#include "eslevent.h"
+
+
+ESLevent::ESLevent()
+{
+}
+
+ESLevent::ESLevent(esl_event_t *e)
+{
+    for (esl_event_header_t *hp = e->headers; hp; hp = hp->next)
+    {
+        _headers[hp->name] = hp->value;
+    }
+    _body = e->body;
+    _event_id = e->event_id;
+    _event_name = esl_event_name(e->event_id);
+}

Added: freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslevent.h (0 => 14542)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslevent.h	                        (rev 0)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/eslevent.h	2009-08-17 04:22:03 UTC (rev 14542)
@@ -0,0 +1,25 @@
+#ifndef ESLEVENT_H
+#define ESLEVENT_H
+
+#include <QtGui>
+#include "esl_event.h"
+
+class ESLevent
+{
+private:
+    QString _body;
+    int _event_id;
+    QString _event_name;
+public:
+    ESLevent();
+    ESLevent(esl_event_t *e);
+    QString getBody() { return _body; }
+    int getID() { return _event_id; }
+    QString getType() { return _event_name; }
+
+    QHash<QString, QString> _headers;
+};
+
+Q_DECLARE_METATYPE(ESLevent)
+
+#endif // ESLEVENT_H

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/interfaces.pro (14541 => 14542)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/interfaces.pro	2009-08-17 00:32:26 UTC (rev 14541)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/interfaces.pro	2009-08-17 04:22:03 UTC (rev 14542)
@@ -1,39 +1,30 @@
-######################################
+# #####################################
 # version check qt
-######################################
-contains(QT_VERSION, ^4\.[0-4]\..*) {
+# #####################################
+contains(QT_VERSION, ^4\.[0-4]\..*) { 
     message("Cannot build FsGui with Qt version $$QT_VERSION.")
     error("Use at least Qt 4.5.")
 }
-######################################
 
-#####################################
+# #####################################
+# ####################################
 # Generates the version of FsGui
 # based on SVN Revision
-#####################################
-!win32 {
+# ####################################
+!win32 { 
     SVN_REV = $$system(svnversion -n .)
-    isEmpty ( SVN_REV ) {
-    SVN_REV = \\"Unknown or SVN not present\\"
-    }
+    isEmpty ( SVN_REV ):SVN_REV = \\"Unknown or SVN not present\\"
     DEFINES += 'FSGUI_SVN_VERSION=\\"$$SVN_REV\\"'
 }
-win32 {
-    INCLUDEPATH += ../../../../../src/include/
-}
-######################################
+win32:INCLUDEPATH += ../../../../../src/include/
 
-#####################################
+# #####################################
+# ####################################
 # ESL must be compiled
-#####################################
-!win32 {
-    !exists ( ../../../../../libs/esl/libesl.a ) {
-        error("lib esl must be compiled before FsGui")
-    }
-}
-#####################################
+# ####################################
+!win32:!exists ( ../../../../../libs/esl/libesl.a ):error("lib esl must be compiled before FsGui")
 
-
+# ####################################
 TEMPLATE = lib
 CONFIG += staticlib
 VERSION = 0.1
@@ -42,12 +33,16 @@
 HEADERS = interfaces.h \
     settingsdialog.h \
     servermanager.h \
-    eslconnection.h
+    eslconnection.h \
+    monitorstatemachine.h \
+    eslevent.h
 SOURCES = settingsdialog.cpp \
     servermanager.cpp \
-    eslconnection.cpp
+    eslconnection.cpp \
+    monitorstatemachine.cpp \
+    eslevent.cpp
 FORMS += settingsdialog.ui \
     servermanager.ui
-LIBS+=-L../../../../../libs/esl/ \
+LIBS += -L../../../../../libs/esl/ \
     -lesl
 RESOURCES += ../resources/resources.qrc

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


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/monitorstatemachine.cpp	                        (rev 0)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/monitorstatemachine.cpp	2009-08-17 04:22:03 UTC (rev 14542)
@@ -0,0 +1,74 @@
+#include "monitorstatemachine.h"
+#include "eslconnection.h"
+#include "esl.h"
+
+MonitorStateMachine::MonitorStateMachine()
+{
+}
+
+void MonitorStateMachine::addESLconnection(ESLconnection *esl)
+{
+    _listESL.append(esl);
+    connect(esl, SIGNAL(receivedChannelEvent(ESLevent)),
+            this, SLOT(processEvent(ESLevent)));
+}
+
+void MonitorStateMachine::delESLconnection(ESLconnection *esl)
+{
+    int i = _listESL.indexOf(esl);
+    if (i != -1)
+        _listESL.removeAt(i);
+}
+
+void MonitorStateMachine::processEvent(ESLevent e)
+{
+    switch(e.getID())
+    {
+        case (ESL_EVENT_CHANNEL_CREATE):
+        {
+            if (_channels.contains(e._headers.value("Unique-ID")))
+            {
+                qDebug() << "How on earth can we have 2 channels with same UUID? : " << e._headers.value("Unique-ID");
+            }
+            else
+            {
+                _channels[e._headers.value("Unique-ID")] = new Channel(e._headers.value("Unique-ID"), e._headers);
+                emit channelCreated(_channels.value(e._headers.value("Unique-ID")));
+            }
+            break;
+        }
+        case (ESL_EVENT_CHANNEL_STATE) :
+        {
+            if (!_channels.contains(e._headers.value("Unique-ID")))
+            {
+                qDebug() << "Something went wrong because we do not have this UUID: " << e._headers.value("Unique-ID");
+            }
+            else
+            {
+                _channels[e._headers.value("Unique-ID")]->stateChanged(e._headers);
+                emit channelStateChanged(_channels.value(e._headers.value("Unique-ID")));
+            }
+
+            break;
+        }
+        case (ESL_EVENT_CHANNEL_DESTROY):
+        {
+            if (!_channels.contains(e._headers.value("Unique-ID")))
+            {
+                qDebug() << "Something went wrong because we do not have this UUID: " << e._headers.value("Unique-ID");
+            }
+            else
+            {
+                _channels[e._headers.value("Unique-ID")]->stateChanged(e._headers);
+                emit channelDestroyed(_channels.value(e._headers.value("Unique-ID")));
+            }
+            break;
+        }
+        default:
+        {
+            if (e.getType() != "COMMAND")
+                qDebug() << "Event not treated: " << e.getType();
+        }
+    }
+
+}

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


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/monitorstatemachine.h	                        (rev 0)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/interfaces/monitorstatemachine.h	2009-08-17 04:22:03 UTC (rev 14542)
@@ -0,0 +1,45 @@
+#ifndef MONITORSTATEMACHINE_H
+#define MONITORSTATEMACHINE_H
+
+#include <QObject>
+#include <QtCore>
+#include "eslevent.h"
+
+class ESLconnection;
+
+class Channel
+{
+private:
+    QString _uuid;
+    QHash<QString, QString> _variables;
+public:
+    Channel() {}
+    Channel(QString uuid, QHash<QString, QString> variables) : _uuid(uuid), _variables(variables) {}
+    QHash<QString, QString> getVariables() { return _variables; }
+    QString getUUID() { return _uuid; }
+    QString getHeader(QString header) { return _variables.value(header, ""); }
+    void stateChanged(QHash<QString, QString> variables) { _variables = variables; }
+};
+
+class MonitorStateMachine : public QObject
+{
+    Q_OBJECT
+private:
+    QList<ESLconnection *> _listESL;
+    QHash <QString, Channel *> _channels;
+public:
+    MonitorStateMachine();
+    void addESLconnection(ESLconnection *);
+    void delESLconnection(ESLconnection *);
+    int channelCount() { return _channels.count(); }
+    QList<Channel *> getChannels() { return _channels.values(); }
+    Channel * getChannel(QString uuid) { return _channels.value(uuid, NULL); }
+private slots:
+    void processEvent(ESLevent);
+signals:
+    void channelStateChanged(Channel *);
+    void channelCreated(Channel *);
+    void channelDestroyed(Channel *);
+};
+
+#endif // MONITORSTATEMACHINE_H

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/centralWidget.ui (14541 => 14542)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/centralWidget.ui	2009-08-17 00:32:26 UTC (rev 14541)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/centralWidget.ui	2009-08-17 04:22:03 UTC (rev 14542)
@@ -77,6 +77,8 @@
      <string>&amp;Console</string>
     </property>
     <addaction name="actionAutomatic_Scroll"/>
+    <addaction name="separator"/>
+    <addaction name="actionRealtime_Statistics"/>
    </widget>
    <addaction name="menu_File"/>
    <addaction name="menu_Edit"/>
@@ -129,6 +131,11 @@
     <string>&amp;Automatic Scroll</string>
    </property>
   </action>
+  <action name="actionRealtime_Statistics">
+   <property name="text">
+    <string>Realtime &amp;Statistics</string>
+   </property>
+  </action>
  </widget>
  <resources>
   <include location="../../resources/resources.qrc"/>

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


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.cpp	2009-08-17 00:32:26 UTC (rev 14541)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.cpp	2009-08-17 04:22:03 UTC (rev 14542)
@@ -27,6 +27,8 @@
                      this, SLOT(disconnect()));
     QObject::connect(consoleWindow->action_Clear, SIGNAL(triggered()),
                      this, SLOT(clearLogContents()));
+    QObject::connect(consoleWindow->actionRealtime_Statistics, SIGNAL(triggered()),
+                     this, SLOT(showRealtimeStats()));
     QObject::connect(consoleWindow->actionAutomatic_Scroll, SIGNAL(toggled(bool)),
                      this, SLOT(setAutoScroll(bool)));
 }
@@ -147,6 +149,13 @@
         tab->clearConsoleContents();
 }
 
+void ConsolePlugin::showRealtimeStats()
+{
+    ConsoleTabWidget *tab = qobject_cast<ConsoleTabWidget*>(consoleWindow->tabConsole->currentWidget());
+    if (tab)
+        tab->showRealtimeStats();
+}
+
 void ConsolePlugin::connectionStateChanged()
 {
     tabChanged(consoleWindow->tabConsole->currentIndex());

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


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.h	2009-08-17 00:32:26 UTC (rev 14541)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.h	2009-08-17 04:22:03 UTC (rev 14542)
@@ -34,6 +34,7 @@
     void disconnect();
     void newConnection();
     void clearLogContents();
+    void showRealtimeStats();
     void changeConsoleBackgroundColor();
     void changeAlertBackgroundColor();
     void changeCriticalBackgroundColor();

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.pro (14541 => 14542)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.pro	2009-08-17 00:32:26 UTC (rev 14541)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoleplugin.pro	2009-08-17 04:22:03 UTC (rev 14542)
@@ -1,46 +1,45 @@
-######################################
+# #####################################
 # version check qt
-######################################
-contains(QT_VERSION, ^4\.[0-4]\..*) {
+# #####################################
+contains(QT_VERSION, ^4\.[0-4]\..*) { 
     message("Cannot build FsGui with Qt version $$QT_VERSION.")
     error("Use at least Qt 4.5.")
 }
-######################################
 
-#####################################
+# #####################################
+# ####################################
 # Generates the version of FsGui
 # based on SVN Revision
-#####################################
-!win32 {
+# ####################################
+!win32 { 
     SVN_REV = $$system(svnversion -n .)
-    isEmpty ( SVN_REV ) {
-    SVN_REV = \\"Unknown or SVN not present\\"
-    }
+    isEmpty ( SVN_REV ):SVN_REV = \\"Unknown or SVN not present\\"
     DEFINES += 'FSGUI_SVN_VERSION=\\"$$SVN_REV\\"'
 }
-win32 {
-    INCLUDEPATH += ../../../../../src/include/
-}
-######################################
+win32:INCLUDEPATH += ../../../../../src/include/
 
-TEMPLATE    = lib
-TARGET      = consoleplugin
-DESTDIR     = ../../../bin/plugins/
-CONFIG     += plugin
+# #####################################
+TEMPLATE = lib
+TARGET = consoleplugin
+DESTDIR = ../../../bin/plugins/
+CONFIG += plugin
 INCLUDEPATH = ../../fsgui/ \
-            ../../interfaces \
-            ../../../../../../libs/esl/src/include/
-HEADERS     = consoleplugin.h \
-            sortfilterproxymodel.h \
-            consoletabwidget.h
-SOURCES     = consoleplugin.cpp \
-            sortfilterproxymodel.cpp \
-            consoletabwidget.cpp
-FORMS     += centralWidget.ui \
-            console_settings.ui \
-            consoletabwidget.ui
-LIBS      += -L../../interfaces \
-            -linterfaces \
-            -L../../../../../../libs/esl/ \
-            -lesl
+    ../../interfaces \
+    ../../../../../../libs/esl/src/include/
+HEADERS = consoleplugin.h \
+    sortfilterproxymodel.h \
+    consoletabwidget.h \
+    realtimestatisticsdialog.h
+SOURCES = consoleplugin.cpp \
+    sortfilterproxymodel.cpp \
+    consoletabwidget.cpp \
+    realtimestatisticsdialog.cpp
+FORMS += centralWidget.ui \
+    console_settings.ui \
+    consoletabwidget.ui \
+    realtimestatisticsdialog.ui
+LIBS += -L../../interfaces \
+    -linterfaces \
+    -L../../../../../../libs/esl/ \
+    -lesl
 RESOURCES += ../../resources/resources.qrc

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


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.cpp	2009-08-17 00:32:26 UTC (rev 14541)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.cpp	2009-08-17 04:22:03 UTC (rev 14542)
@@ -1,12 +1,15 @@
 #include "consoletabwidget.h"
 #include "ui_consoletabwidget.h"
 #include "eslconnection.h"
+#include "monitorstatemachine.h"
+#include "realtimestatisticsdialog.h"
 
 ConsoleTabWidget::ConsoleTabWidget(QWidget *parent, ESLconnection *eslconnection) :
     QWidget(parent),
     m_ui(new Ui::ConsoleTabWidget),
     esl(eslconnection),
     scrollTimer(new QTimer),
+    _rtStatsDlg(NULL),
     findNext(false),
     autoScroll(true)
 {
@@ -51,13 +54,16 @@
                      this, SLOT(connectionFailed(QString)));
     QObject::connect(esl, SIGNAL(disconnected()),
                      this, SLOT(disconnected()));
-    QObject::connect(esl, SIGNAL(gotEvent(ESLevent*)),
-                     this, SLOT(gotEvent(ESLevent*)));
+    QObject::connect(esl, SIGNAL(receivedLogMessage(ESLevent)),
+                     this, SLOT(gotEvent(ESLevent)));
 
     QObject::connect(scrollTimer, SIGNAL(timeout()),
                      this, SLOT(conditionalScroll()));
 
     esl->connect();
+
+    msm = new MonitorStateMachine();
+    msm->addESLconnection(esl);
 }
 
 ConsoleTabWidget::~ConsoleTabWidget()
@@ -158,11 +164,11 @@
     addNewConsoleItem(item);
 }
 
-void ConsoleTabWidget::gotEvent(ESLevent * event)
+void ConsoleTabWidget::gotEvent(ESLevent event)
 {
-    if (event->getBody())
+    if (!event.getBody().isEmpty())
     {
-        QString text(event->getBody());
+        QString text(event.getBody());
 
         /* Remove \r\n */
         QStringList textList = text.split(QRegExp("(\r+)"), QString::SkipEmptyParts);
@@ -175,12 +181,11 @@
         for (int line = 0; line < lines.size(); ++line)
         {
             QStandardItem *item = new QStandardItem(lines[line]);
-            item->setData(QString(event->getHeader("Log-Level")).toInt(), Qt::UserRole);
+            item->setData(event._headers.value("Log-Level").toInt(), Qt::UserRole);
             addNewConsoleItem(item);
         }
     }
-    delete event;
-
+    //delete event;
 }
 
 void ConsoleTabWidget::addNewConsoleItem(QStandardItem *item)
@@ -195,10 +200,25 @@
 
 void ConsoleTabWidget::cmdSendClicked()
 {
-    esl->bgapi(m_ui->lineCmd->text());
+    CommandTransaction *transaction = new CommandTransaction(m_ui->lineCmd->text());
+    QObject::connect(transaction, SIGNAL(gotResponse(ESLevent)),
+                     this, SLOT(gotEvent(ESLevent)));
+    esl->addCommand(transaction);
     m_ui->lineCmd->clear();
 }
 
+void ConsoleTabWidget::showRealtimeStats()
+{
+    if (!_rtStatsDlg)
+    {
+        _rtStatsDlg = new RealtimeStatisticsDialog(this, msm);
+    }
+
+    _rtStatsDlg->show();
+    _rtStatsDlg->raise();
+    _rtStatsDlg->activateWindow();
+}
+
 void ConsoleTabWidget::lineCmdChanged(QString text)
 {
     m_ui->btnSend->setDisabled(text.isEmpty());

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


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.h	2009-08-17 00:32:26 UTC (rev 14541)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.h	2009-08-17 04:22:03 UTC (rev 14542)
@@ -3,6 +3,7 @@
 
 #include <QtGui/QWidget>
 #include "sortfilterproxymodel.h"
+#include "eslevent.h"
 
 namespace Ui {
     class ConsoleTabWidget;
@@ -12,7 +13,8 @@
 class QStandardItemModel;
 class QTimer;
 class ESLconnection;
-class ESLevent;
+class MonitorStateMachine;
+class RealtimeStatisticsDialog;
 
 class ConsoleTabWidget : public QWidget {
     Q_OBJECT
@@ -22,6 +24,7 @@
 
 public slots:
     void clearConsoleContents();
+    void showRealtimeStats();
     void flipScrollTimer();
     void setAutomaticScroll(bool enabled);
     bool getAutomaticScroll();
@@ -36,7 +39,7 @@
     void connected();
     void disconnected();
     void connectionFailed(QString);
-    void gotEvent(ESLevent *);
+    void gotEvent(ESLevent);
     void addNewConsoleItem(QStandardItem *item);
     void cmdSendClicked();
     void lineCmdChanged(QString);
@@ -55,6 +58,8 @@
     SortFilterProxyModel *model;
     ESLconnection *esl;
     QTimer *scrollTimer;
+    MonitorStateMachine *msm;
+    RealtimeStatisticsDialog *_rtStatsDlg;
     bool findNext;
     bool autoScroll;
 

Modified: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.ui (14541 => 14542)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.ui	2009-08-17 00:32:26 UTC (rev 14541)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/consoletabwidget.ui	2009-08-17 04:22:03 UTC (rev 14542)
@@ -6,14 +6,14 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>657</width>
-    <height>445</height>
+    <width>859</width>
+    <height>557</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout_3">
+  <layout class="QVBoxLayout" name="verticalLayout_6">
    <item>
     <widget class="QGroupBox" name="groupBox_2">
      <property name="title">
@@ -111,112 +111,123 @@
       </widget>
      </item>
      <item>
-      <widget class="QGroupBox" name="groupBox">
-       <property name="maximumSize">
-        <size>
-         <width>120</width>
-         <height>16777215</height>
-        </size>
-       </property>
-       <property name="title">
-        <string>Log Level</string>
-       </property>
-       <layout class="QVBoxLayout" name="verticalLayout">
-        <item>
-         <widget class="QCheckBox" name="checkEmerg">
-          <property name="text">
-           <string>Console</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QCheckBox" name="checkAlert">
-          <property name="text">
-           <string>Alert</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QCheckBox" name="checkCrit">
-          <property name="text">
-           <string>Critical</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QCheckBox" name="checkError">
-          <property name="text">
-           <string>Error</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QCheckBox" name="checkWarn">
-          <property name="text">
-           <string>Warning</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QCheckBox" name="checkNotice">
-          <property name="text">
-           <string>Notice</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QCheckBox" name="checkInfo">
-          <property name="text">
-           <string>Info</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QCheckBox" name="checkDebug">
-          <property name="text">
-           <string>Debug</string>
-          </property>
-          <property name="checked">
-           <bool>true</bool>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <spacer name="verticalSpacer">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>18</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-       </layout>
-      </widget>
+      <layout class="QVBoxLayout" name="verticalLayout_3">
+       <item>
+        <widget class="QGroupBox" name="groupBox">
+         <property name="maximumSize">
+          <size>
+           <width>120</width>
+           <height>16777215</height>
+          </size>
+         </property>
+         <property name="title">
+          <string>Log Level</string>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <item>
+           <widget class="QCheckBox" name="checkEmerg">
+            <property name="text">
+             <string>Console</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QCheckBox" name="checkAlert">
+            <property name="text">
+             <string>Alert</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QCheckBox" name="checkCrit">
+            <property name="text">
+             <string>Critical</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QCheckBox" name="checkError">
+            <property name="text">
+             <string>Error</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QCheckBox" name="checkWarn">
+            <property name="text">
+             <string>Warning</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QCheckBox" name="checkNotice">
+            <property name="text">
+             <string>Notice</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QCheckBox" name="checkInfo">
+            <property name="text">
+             <string>Info</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QCheckBox" name="checkDebug">
+            <property name="text">
+             <string>Debug</string>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <spacer name="verticalSpacer">
+            <property name="orientation">
+             <enum>Qt::Vertical</enum>
+            </property>
+            <property name="sizeHint" stdset="0">
+             <size>
+              <width>20</width>
+              <height>18</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="Line" name="line">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+        </widget>
+       </item>
+      </layout>
      </item>
     </layout>
    </item>

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


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.cpp	                        (rev 0)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.cpp	2009-08-17 04:22:03 UTC (rev 14542)
@@ -0,0 +1,71 @@
+#include <QtGui>
+#include "realtimestatisticsdialog.h"
+#include "ui_realtimestatisticsdialog.h"
+#include "monitorstatemachine.h"
+
+RealtimeStatisticsDialog::RealtimeStatisticsDialog(QWidget *parent, MonitorStateMachine *sm) :
+    QDialog(parent),
+    m_ui(new Ui::RealtimeStatisticsDialog),
+    _sm(sm)
+{
+    m_ui->setupUi(this);
+    connect(sm, SIGNAL(channelCreated(Channel*)),
+            this, SLOT(channelCreate(Channel*)));
+    connect(sm, SIGNAL(channelDestroyed(Channel*)),
+            this, SLOT(channelDestroy(Channel*)));
+    connect(m_ui->listActiveChannels, SIGNAL(itemClicked(QListWidgetItem*)),
+            this, SLOT(channelSelected(QListWidgetItem*)));
+    delete m_ui->tab_2;
+}
+
+RealtimeStatisticsDialog::~RealtimeStatisticsDialog()
+{
+    delete m_ui;
+}
+
+void RealtimeStatisticsDialog::changeEvent(QEvent *e)
+{
+    QDialog::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        m_ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+void RealtimeStatisticsDialog::channelCreate(Channel *ch)
+{
+    QListWidgetItem *item = new QListWidgetItem(QString("%1 - %2").arg(ch->getUUID(), ch->getHeader("Channel-State")),
+                                                m_ui->listActiveChannels);
+    item->setData(Qt::UserRole, ch->getUUID());
+}
+
+void RealtimeStatisticsDialog::channelDestroy(Channel *ch)
+{
+    for (int i = 0; i < m_ui->listActiveChannels->count(); i++)
+    {
+        if (m_ui->listActiveChannels->item(i)->data(Qt::UserRole) == ch->getUUID())
+        {
+            if (m_ui->listActiveChannels->currentItem() == m_ui->listActiveChannels->item(i))
+                m_ui->listActiveVariables->clear();
+
+            delete m_ui->listActiveChannels->item(i);
+        }
+    }
+}
+
+void RealtimeStatisticsDialog::channelSelected(QListWidgetItem *item)
+{
+    m_ui->listActiveVariables->clear();
+
+    Channel * ch = _sm->getChannel(item->data(Qt::UserRole).toString());
+    if (!ch)
+        return;
+
+    foreach (QString key, ch->getVariables().keys())
+    {
+        m_ui->listActiveVariables->addItem(QString("%1 = %2").arg(key, ch->getVariables().value(key)));
+    }
+}

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


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.h	                        (rev 0)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.h	2009-08-17 04:22:03 UTC (rev 14542)
@@ -0,0 +1,34 @@
+#ifndef REALTIMESTATISTICSDIALOG_H
+#define REALTIMESTATISTICSDIALOG_H
+
+#include <QtGui/QDialog>
+
+namespace Ui {
+    class RealtimeStatisticsDialog;
+}
+
+class QListWidgetItem;
+class MonitorStateMachine;
+class Channel;
+
+class RealtimeStatisticsDialog : public QDialog {
+    Q_OBJECT
+public:
+    RealtimeStatisticsDialog(QWidget *parent = 0);
+    RealtimeStatisticsDialog(QWidget *parent, MonitorStateMachine *sm);
+    ~RealtimeStatisticsDialog();
+
+protected:
+    void changeEvent(QEvent *e);
+
+private slots:
+    void channelCreate(Channel *);
+    void channelDestroy(Channel *);
+    void channelSelected(QListWidgetItem *);
+
+private:
+    Ui::RealtimeStatisticsDialog *m_ui;
+    MonitorStateMachine *_sm;
+};
+
+#endif // REALTIMESTATISTICSDIALOG_H

Added: freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.ui (0 => 14542)


--- freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.ui	                        (rev 0)
+++ freeswitch/trunk/contrib/jmesquita/fsgui/src/plugins/consoleplugin/realtimestatisticsdialog.ui	2009-08-17 04:22:03 UTC (rev 14542)
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>RealtimeStatisticsDialog</class>
+ <widget class="QDialog" name="RealtimeStatisticsDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>612</width>
+    <height>534</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Realtime Statistics</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <widget class="QTabWidget" name="tabWidget">
+     <property name="currentIndex">
+      <number>0</number>
+     </property>
+     <widget class="QWidget" name="tab">
+      <attribute name="title">
+       <string>Active</string>
+      </attribute>
+      <layout class="QHBoxLayout" name="horizontalLayout_5">
+       <item>
+        <layout class="QVBoxLayout" name="verticalLayout">
+         <item>
+          <widget class="QGroupBox" name="groupBox">
+           <property name="title">
+            <string>Channels</string>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout">
+            <item>
+             <widget class="QListWidget" name="listActiveChannels">
+              <property name="editTriggers">
+               <set>QAbstractItemView::NoEditTriggers</set>
+              </property>
+              <property name="alternatingRowColors">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="groupBox_3">
+           <property name="title">
+            <string>Calls</string>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_3">
+            <item>
+             <widget class="QListWidget" name="listActiveCalls">
+              <property name="editTriggers">
+               <set>QAbstractItemView::NoEditTriggers</set>
+              </property>
+              <property name="alternatingRowColors">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="groupBox_2">
+         <property name="title">
+          <string>Variables</string>
+         </property>
+         <layout class="QHBoxLayout" name="horizontalLayout_2">
+          <item>
+           <widget class="QListWidget" name="listActiveVariables">
+            <property name="editTriggers">
+             <set>QAbstractItemView::NoEditTriggers</set>
+            </property>
+            <property name="alternatingRowColors">
+             <bool>true</bool>
+            </property>
+            <property name="sortingEnabled">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="tab_2">
+      <attribute name="title">
+       <string>Inactive</string>
+      </attribute>
+      <layout class="QHBoxLayout" name="horizontalLayout_12">
+       <item>
+        <layout class="QVBoxLayout" name="verticalLayout_4">
+         <item>
+          <widget class="QGroupBox" name="groupBox_7">
+           <property name="title">
+            <string>Channels</string>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_9">
+            <item>
+             <widget class="QListWidget" name="listInactiveChannels">
+              <property name="editTriggers">
+               <set>QAbstractItemView::NoEditTriggers</set>
+              </property>
+              <property name="alternatingRowColors">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="groupBox_8">
+           <property name="title">
+            <string>Calls</string>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_10">
+            <item>
+             <widget class="QListWidget" name="listInactiveCalls">
+              <property name="editTriggers">
+               <set>QAbstractItemView::NoEditTriggers</set>
+              </property>
+              <property name="alternatingRowColors">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="groupBox_9">
+         <property name="title">
+          <string>Variables</string>
+         </property>
+         <layout class="QHBoxLayout" name="horizontalLayout_11">
+          <item>
+           <widget class="QListWidget" name="listInactiveVariables">
+            <property name="editTriggers">
+             <set>QAbstractItemView::NoEditTriggers</set>
+            </property>
+            <property name="alternatingRowColors">
+             <bool>true</bool>
+            </property>
+            <property name="sortingEnabled">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>