From f0fed269eb5c23d94b190a4fbf1dc4c93b31d679 Mon Sep 17 00:00:00 2001 From: Joao Mesquita Date: Sat, 3 Jul 2010 13:37:32 -0300 Subject: [PATCH] Fix the mess I've made on the last commit. Now we really don't depend on QSettings or mod_qsettings. --- fscomm/FSComm.pro | 11 +- fscomm/account.cpp | 1 + fscomm/account.h | 26 +-- fscomm/conf/freeswitch.xml | 6 +- fscomm/fscomm.h | 1 + fscomm/fshost.cpp | 44 ++-- fscomm/fshost.h | 31 +-- fscomm/main.cpp | 9 +- fscomm/mainwindow.cpp | 46 ++-- fscomm/mainwindow.h | 1 + fscomm/preferences/accountdialog.cpp | 218 ++++++++++++------- fscomm/preferences/accountdialog.h | 12 +- fscomm/preferences/prefaccounts.cpp | 144 ++++++------ fscomm/preferences/prefaccounts.h | 10 +- fscomm/preferences/prefdialog.cpp | 35 ++- fscomm/preferences/prefdialog.h | 6 +- fscomm/preferences/prefdialog.ui | 2 +- fscomm/preferences/prefportaudio.cpp | 197 ++++++++--------- fscomm/preferences/prefportaudio.h | 5 +- fscomm/preferences/prefsofia.cpp | 314 +++++++++++++++++++-------- fscomm/preferences/prefsofia.h | 1 + fscomm/widgets/codecwidget.cpp | 11 + 22 files changed, 667 insertions(+), 464 deletions(-) diff --git a/fscomm/FSComm.pro b/fscomm/FSComm.pro index c435cfca73..05819d5f70 100644 --- a/fscomm/FSComm.pro +++ b/fscomm/FSComm.pro @@ -25,7 +25,6 @@ SOURCES += main.cpp \ mainwindow.cpp \ fshost.cpp \ call.cpp \ - mod_qsettings/mod_qsettings.cpp \ preferences/prefdialog.cpp \ preferences/prefportaudio.cpp \ preferences/prefsofia.cpp \ @@ -36,11 +35,12 @@ SOURCES += main.cpp \ channel.cpp \ debugtools/consolewindow.cpp \ debugtools/sortfilterproxymodel.cpp \ - debugtools/statedebugdialog.cpp + debugtools/statedebugdialog.cpp \ + isettings.cpp \ + accountmanager.cpp HEADERS += mainwindow.h \ fshost.h \ call.h \ - mod_qsettings/mod_qsettings.h \ preferences/prefdialog.h \ preferences/prefportaudio.h \ preferences/prefsofia.h \ @@ -51,7 +51,10 @@ HEADERS += mainwindow.h \ channel.h \ debugtools/consolewindow.h \ debugtools/sortfilterproxymodel.h \ - debugtools/statedebugdialog.h + debugtools/statedebugdialog.h \ + isettings.h \ + fscomm.h \ + accountmanager.h FORMS += mainwindow.ui \ preferences/prefdialog.ui \ preferences/accountdialog.ui \ diff --git a/fscomm/account.cpp b/fscomm/account.cpp index 3309c01b6a..c7a45c85d5 100644 --- a/fscomm/account.cpp +++ b/fscomm/account.cpp @@ -1,5 +1,6 @@ #include #include "account.h" +#include "fscomm.h" Account::Account(QString name) : _name(name) diff --git a/fscomm/account.h b/fscomm/account.h index 302a112678..5b2651d02e 100644 --- a/fscomm/account.h +++ b/fscomm/account.h @@ -2,31 +2,7 @@ #define ACCOUNT_H #include - -#define FSCOMM_GW_STATE_TRYING 0 -#define FSCOMM_GW_STATE_REGISTER 1 -#define FSCOMM_GW_STATE_REGED 2 -#define FSCOMM_GW_STATE_UNREGED 3 -#define FSCOMM_GW_STATE_UNREGISTER 4 -#define FSCOMM_GW_STATE_FAILED 5 -#define FSCOMM_GW_STATE_FAIL_WAIT 6 -#define FSCOMM_GW_STATE_EXPIRED 7 -#define FSCOMM_GW_STATE_NOREG 8 -#define FSCOMM_GW_STATE_NOAVAIL 9 - - -static QString fscomm_gw_state_names[] = { - QString("Trying"), - QString("Registering"), - QString("Registered"), - QString("Un-Registered"), - QString("Un-Registering"), - QString("Failed"), - QString("Failed"), - QString("Expired"), - QString("Not applicable"), - QString("Not available") -}; +//#include "fscomm.h" Why does this break AccountManager? class Account { public: diff --git a/fscomm/conf/freeswitch.xml b/fscomm/conf/freeswitch.xml index 285940ad18..ab8b9ff1b7 100644 --- a/fscomm/conf/freeswitch.xml +++ b/fscomm/conf/freeswitch.xml @@ -45,10 +45,6 @@ - - - - @@ -85,7 +81,7 @@ - + diff --git a/fscomm/fscomm.h b/fscomm/fscomm.h index 7fca6c7e93..7b9397ec94 100644 --- a/fscomm/fscomm.h +++ b/fscomm/fscomm.h @@ -1,6 +1,7 @@ #ifndef FSCOMM_H #define FSCOMM_H +#include "account.h" #include "isettings.h" #include "fshost.h" #include "accountmanager.h" diff --git a/fscomm/fshost.cpp b/fscomm/fshost.cpp index 5bc214c343..2bb5b36cd6 100644 --- a/fscomm/fshost.cpp +++ b/fscomm/fshost.cpp @@ -29,7 +29,6 @@ #include #include "fshost.h" -#include "mod_qsettings/mod_qsettings.h" /* Declare it globally */ FSHost *g_FSHost; @@ -146,12 +145,6 @@ void FSHost::run(void) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't bind!\n"); } - /* Load our QSettings module */ - if (mod_qsettings_load() != SWITCH_STATUS_SUCCESS) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't load mod_qsettings\n"); - } - emit loadingModules("Loading modules...", Qt::AlignRight|Qt::AlignBottom, Qt::blue); if (switch_core_init_and_modload(flags, console, &err) != SWITCH_STATUS_SUCCESS) { fprintf(stderr, "Failed to initialize FreeSWITCH's core: %s\n", err); @@ -501,7 +494,7 @@ switch_status_t FSHost::sendCmd(const char *cmd, const char *args, QString *res) switch_status_t status = SWITCH_STATUS_FALSE; switch_stream_handle_t stream = { 0 }; SWITCH_STANDARD_STREAM(stream); - qDebug() << "Sending command: " << cmd << args << endl; + //qDebug() << "Sending command: " << cmd << args << endl; status = switch_api_execute(cmd, args, NULL, &stream); *res = switch_str_nil((char *) stream.data); switch_safe_free(stream.data); @@ -551,9 +544,34 @@ QSharedPointer FSHost::getAccountByName(QString accStr) QSharedPointer FSHost::getCurrentDefaultAccount() { - QSettings settings; - settings.beginGroup("FreeSWITCH/conf/globals"); - QString accString = settings.value("default_gateway").toString(); - settings.endGroup(); - return getAccountByName(accString); + ISettings *settings = new ISettings(); + //settings->beginGroup("FreeSWITCH/conf/globals"); + //QString accString = settings->value("default_gateway").toString(); + //settings->endGroup(); + delete (settings); + return getAccountByName("Other"); /* Pay attention to this! */ +} + +/* + Used to match callback from fs core. We dup the event and call the class + method callback to make use of the signal/slot infrastructure. + */ +static void eventHandlerCallback(switch_event_t *event) +{ + switch_event_t *clone = NULL; + if (switch_event_dup(&clone, event) == SWITCH_STATUS_SUCCESS) { + QSharedPointer e(clone); + g_FSHost->generalEventHandler(e); + } +} + +/* + Used to propagate logs on the application + */ +static switch_status_t loggerHandler(const switch_log_node_t *node, switch_log_level_t level) +{ + switch_log_node_t *clone = switch_log_node_dup(node); + QSharedPointer l(clone); + g_FSHost->generalLoggerHandler(l, level); + return SWITCH_STATUS_SUCCESS; } diff --git a/fscomm/fshost.h b/fscomm/fshost.h index 77404eac79..ce4371191d 100644 --- a/fscomm/fshost.h +++ b/fscomm/fshost.h @@ -37,6 +37,11 @@ #include "call.h" #include "channel.h" #include "account.h" +#include "fscomm.h" + + +static void eventHandlerCallback(switch_event_t *); +static switch_status_t loggerHandler(const switch_log_node_t *, switch_log_level_t); class FSHost : public QThread { @@ -46,6 +51,7 @@ public: switch_status_t sendCmd(const char *cmd, const char *args, QString *res); void generalEventHandler(QSharedPointerevent); void generalLoggerHandler(QSharedPointernode, switch_log_level_t level); + void printEventHeaders(QSharedPointerevent); QSharedPointer getCallByUUID(QString uuid) { return _active_calls.value(uuid); } QSharedPointer getCurrentActiveCall(); QList > getAccounts() { return _accounts.values(); } @@ -90,7 +96,6 @@ private slots: private: /* Helper methods */ void createFolders(); - void printEventHeaders(QSharedPointerevent); /*FSM State handlers*/ /** Channel Related*/ @@ -124,28 +129,4 @@ private: extern FSHost *g_FSHost; -/* - Used to match callback from fs core. We dup the event and call the class - method callback to make use of the signal/slot infrastructure. - */ -static void eventHandlerCallback(switch_event_t *event) -{ - switch_event_t *clone = NULL; - if (switch_event_dup(&clone, event) == SWITCH_STATUS_SUCCESS) { - QSharedPointer e(clone); - g_FSHost->generalEventHandler(e); - } -} - -/* - Used to propagate logs on the application - */ -static switch_status_t loggerHandler(const switch_log_node_t *node, switch_log_level_t level) -{ - switch_log_node_t *clone = switch_log_node_dup(node); - QSharedPointer l(clone); - g_FSHost->generalLoggerHandler(l, level); - return SWITCH_STATUS_SUCCESS; -} - #endif // FSHOST_H diff --git a/fscomm/main.cpp b/fscomm/main.cpp index 7a91762d01..c1069eded1 100644 --- a/fscomm/main.cpp +++ b/fscomm/main.cpp @@ -30,23 +30,20 @@ #include #include #include "mainwindow.h" +#include "isettings.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); - QCoreApplication::setOrganizationName("FreeSWITCH"); - QCoreApplication::setOrganizationDomain("freeswitch.org"); - QCoreApplication::setApplicationName("FSComm"); - + QApplication::setOrganizationDomain("freeswitch.org"); QPixmap image(":/images/splash.png"); QSplashScreen *splash = new QSplashScreen(image); splash->show(); splash->showMessage("Loading core, please wait...", Qt::AlignRight|Qt::AlignBottom, Qt::blue); - g_FSHost = new FSHost(); + g_FSHost = new FSHost(); QObject::connect(g_FSHost, SIGNAL(loadingModules(QString,int,QColor)), splash, SLOT(showMessage(QString,int,QColor))); - QObject::connect(g_FSHost, SIGNAL(ready()), splash, SLOT(close())); MainWindow w; QObject::connect(g_FSHost, SIGNAL(ready()), &w, SLOT(show())); diff --git a/fscomm/mainwindow.cpp b/fscomm/mainwindow.cpp index d2f36626a7..30450e1215 100644 --- a/fscomm/mainwindow.cpp +++ b/fscomm/mainwindow.cpp @@ -151,11 +151,12 @@ void MainWindow::setDefaultAccount() if (accName.isEmpty()) return; - QSettings settings; - settings.beginGroup("FreeSWITCH/conf/globals"); + ISettings *settings = new ISettings(); + //settings->beginGroup("FreeSWITCH/conf/globals"); switch_core_set_variable("default_gateway", accName.toAscii().data()); - settings.setValue("default_gateway", accName); - settings.endGroup(); + //settings->setValue("default_gateway", accName); + //settings->endGroup(); + delete (settings); } void MainWindow::debugEventsTriggered() @@ -287,30 +288,31 @@ void MainWindow::makeCall() QSharedPointer acc = g_FSHost->getCurrentDefaultAccount(); if (!acc.isNull()) { - QSettings settings; - settings.beginGroup("FreeSWITCH/conf/sofia.conf/profiles/profile/gateways/"); - settings.beginGroup(acc.data()->getUUID()); - settings.beginGroup("gateway/global_vars"); - QString cidName = settings.value("caller_id_name").toString(); - QString cidNum = settings.value("caller_id_num").toString(); - settings.endGroup(); - settings.endGroup(); - settings.endGroup(); + /*QSettings *settings = fscommSettings(); + settings->beginGroup("FreeSWITCH/conf/sofia.conf/profiles/profile/gateways/"); + settings->beginGroup(acc.data()->getUUID()); + settings->beginGroup("gateway/global_vars"); + QString cidName = settings->value("caller_id_name").toString(); + QString cidNum = settings->value("caller_id_num").toString(); + settings->endGroup(); + settings->endGroup(); + settings->endGroup(); if (cidName.isEmpty()) { - settings.beginGroup("FreeSWITCH/conf/portaudio.conf/settings/params"); - cidName = settings.value("cid-name").toString(); - settings.endGroup(); + settings->beginGroup("FreeSWITCH/conf/portaudio.conf/settings/params"); + cidName = settings->value("cid-name").toString(); + settings->endGroup(); } if (cidNum.isEmpty()) { - settings.beginGroup("FreeSWITCH/conf/portaudio.conf/settings/params"); - cidNum = settings.value("cid-num").toString(); - settings.endGroup(); - } + settings->beginGroup("FreeSWITCH/conf/portaudio.conf/settings/params"); + cidNum = settings->value("cid-num").toString(); + settings->endGroup(); + }*/ /* Set the vars for this call */ - switch_core_set_variable("fscomm_caller_id_name", cidName.toAscii().data()); - switch_core_set_variable("fscomm_caller_id_num", cidNum.toAscii().data()); + //switch_core_set_variable("fscomm_caller_id_name", cidName.toAscii().data()); + //switch_core_set_variable("fscomm_caller_id_num", cidNum.toAscii().data()); + //delete (settings); } diff --git a/fscomm/mainwindow.h b/fscomm/mainwindow.h index 32c4466d20..84f4103b3e 100644 --- a/fscomm/mainwindow.h +++ b/fscomm/mainwindow.h @@ -96,6 +96,7 @@ private: StateDebugDialog * _stateDebugDialog; QSystemTrayIcon *sysTray; QTimer *callTimer; + AccountManager _accountManager; }; #endif // MAINWINDOW_H diff --git a/fscomm/preferences/accountdialog.cpp b/fscomm/preferences/accountdialog.cpp index 0fca4c547f..aa5b322267 100644 --- a/fscomm/preferences/accountdialog.cpp +++ b/fscomm/preferences/accountdialog.cpp @@ -1,16 +1,12 @@ -#include #include #include "accountdialog.h" #include "ui_accountdialog.h" -#include "fshost.h" -AccountDialog::AccountDialog(QString accId, QWidget *parent) : +AccountDialog::AccountDialog(QWidget *parent) : QDialog(parent), - _accId(accId), ui(new Ui::AccountDialog) -{ +{ ui->setupUi(this); - _settings = new QSettings; connect(this, SIGNAL(accepted()), this, SLOT(writeConfig())); connect(ui->sofiaExtraParamAddBtn, SIGNAL(clicked()), this, SLOT(addExtraParam())); connect(ui->sofiaExtraParamRemBtn, SIGNAL(clicked()), this, SLOT(remExtraParam())); @@ -83,100 +79,165 @@ void AccountDialog::addExtraParam() ui->sofiaExtraParamTable->horizontalHeader()->setStretchLastSection(true); } +/* TODO: We need to figure out the callerID thing... */ void AccountDialog::readConfig() { - _settings->beginGroup("FreeSWITCH/conf/sofia.conf/profiles/profile/gateways"); - _settings->beginGroup(_accId); - _settings->beginGroup("gateway/attrs"); - ui->sofiaGwNameEdit->setText(_settings->value("name").toString()); - _settings->endGroup(); + /* We already know the name of the gateway, so... */ + ui->sofiaGwNameEdit->setText(_name); - _settings->beginGroup("gateway/params"); - ui->sofiaGwUsernameEdit->setText(_settings->value("username").toString()); - ui->sofiaGwRealmEdit->setText(_settings->value("realm").toString()); - ui->sofiaGwPasswordEdit->setText(_settings->value("password").toString()); - ui->sofiaGwExpireSecondsSpin->setValue(_settings->value("expire-seconds").toInt()); - ui->sofiaGwRegisterCombo->setCurrentIndex(ui->sofiaGwRegisterCombo->findText(_settings->value("register").toString(), - Qt::MatchExactly)); - ui->sofiaGwRegisterTransportCombo->setCurrentIndex(ui->sofiaGwRegisterTransportCombo->findText(_settings->value("register-transport").toString(), - Qt::MatchExactly)); - ui->sofiaGwRetrySecondsSpin->setValue(_settings->value("retry-seconds").toInt()); - _settings->endGroup(); + ISettings settings(this); + QDomElement cfg = settings.getConfigNode("sofia.conf"); - _settings->beginGroup("gateway/customParams"); - int row = 0; - ui->sofiaExtraParamTable->clearContents(); - foreach(QString k, _settings->childKeys()) - { - row++; - ui->sofiaExtraParamTable->setRowCount(row); - QTableWidgetItem *varName = new QTableWidgetItem(k); - QTableWidgetItem *varVal = new QTableWidgetItem(_settings->value(k).toString()); - ui->sofiaExtraParamTable->setItem(row-1, 0,varName); - ui->sofiaExtraParamTable->setItem(row-1, 1,varVal); + QDomNodeList nl = cfg.elementsByTagName("gateway"); + + for (int i = 0; i < nl.count(); i++) { + QDomElement gw = nl.at(i).toElement(); + if (gw.attributeNode("name").value() == _name) { + /* Iterate the params and set the values */ + QDomNodeList params = gw.elementsByTagName("param"); + int row = 0; /* Used for extra params */ + ui->sofiaExtraParamTable->clearContents(); + for (int j = 0; j < params.count(); j++) { + QDomElement param = params.at(j).toElement(); + QString var = param.attributeNode("name").value(); + QString val = param.attributeNode("value").value(); + if ( var == "username" ) { + ui->sofiaGwUsernameEdit->setText(val); + } else if ( var == "realm" ) { + ui->sofiaGwRealmEdit->setText(val); + } else if ( var == "password" ) { + ui->sofiaGwPasswordEdit->setText(val); + } else if ( var == "expire-seconds" ) { + ui->sofiaGwExpireSecondsSpin->setValue(val.toInt()); + } else if ( var == "register" ) { + ui->sofiaGwRegisterCombo->setCurrentIndex(ui->sofiaGwRegisterCombo->findText(val, Qt::MatchExactly)); + } else if ( var == "register-transport" ) { + ui->sofiaGwRegisterTransportCombo->setCurrentIndex(ui->sofiaGwRegisterTransportCombo->findText(val, Qt::MatchExactly)); + } else if ( var == "retry-seconds" ) { + ui->sofiaGwRetrySecondsSpin->setValue(val.toInt()); + } else { + /* Set custom parameters */ + row++; + ui->sofiaExtraParamTable->setRowCount(row); + QTableWidgetItem *varName = new QTableWidgetItem(var); + QTableWidgetItem *varVal = new QTableWidgetItem(val); + ui->sofiaExtraParamTable->setItem(row-1, 0,varName); + ui->sofiaExtraParamTable->setItem(row-1, 1,varVal); + } + } + /* Stop processing the gateway list */ + break; + } } - _settings->endGroup(); - - _settings->endGroup(); - _settings->endGroup(); ui->sofiaExtraParamTable->resizeColumnsToContents(); ui->sofiaExtraParamTable->resizeRowsToContents(); ui->sofiaExtraParamTable->horizontalHeader()->setStretchLastSection(true); } +/* TODO: Figure out the callerID thing... */ void AccountDialog::writeConfig() { - QSharedPointer acc = g_FSHost->getAccountByUUID(_accId); - if (!acc.isNull()) - { - g_FSHost->accountReloadCmd(acc); - } - - _settings->beginGroup("FreeSWITCH/conf/sofia.conf/profiles/profile/gateways"); - - _settings->beginGroup(_accId); - - _settings->beginGroup("gateway/global_vars"); + /* TODO: This is where we need to figure out the caller ID if (ui->clidSettingsCombo->currentIndex() == 0) { - _settings->remove("caller_id_name"); - _settings->remove("caller_id_num"); + settings->remove("caller_id_name"); + settings->remove("caller_id_num"); } else { - _settings->setValue("caller_id_name", ui->sofiaCallerIDName->text()); - _settings->setValue("caller_id_num", ui->sofiaCallerIDNum->text()); + settings->setValue("caller_id_name", ui->sofiaCallerIDName->text()); + settings->setValue("caller_id_num", ui->sofiaCallerIDNum->text()); } - _settings->endGroup(); - - _settings->beginGroup("gateway/attrs"); - _settings->setValue("name", ui->sofiaGwNameEdit->text()); - _settings->endGroup(); + */ + ISettings settings(this); + QDomElement cfg = settings.getConfigNode("sofia.conf"); + /* First check to see if we are editing */ + if (!_name.isEmpty()) { - _settings->beginGroup("gateway/params"); - _settings->setValue("username", ui->sofiaGwUsernameEdit->text()); - _settings->setValue("realm", ui->sofiaGwRealmEdit->text()); - _settings->setValue("password", ui->sofiaGwPasswordEdit->text()); - _settings->setValue("expire-seconds", ui->sofiaGwExpireSecondsSpin->value()); - _settings->setValue("register", ui->sofiaGwRegisterCombo->currentText()); - _settings->setValue("register-transport", ui->sofiaGwRegisterTransportCombo->currentText()); - _settings->setValue("retry-seconds", ui->sofiaGwRetrySecondsSpin->value()); - _settings->endGroup(); + /* Find our gateway */ + QDomElement gw; + QDomNodeList gws = cfg.elementsByTagName("gateway"); + for (int i = 0; i < gws.count(); i++) { + if ( gws.at(i).toElement().attributeNode("name").value() == _name) { + gw = gws.at(i).toElement(); + /* Set the new gateway name */ + if ( _name != ui->sofiaGwNameEdit->text() ) { + _name = ui->sofiaGwNameEdit->text(); + gws.at(i).toElement().attributeNode("name").setValue(ui->sofiaGwNameEdit->text()); + } + break; + } + } + if ( gw.isNull() ) { + qDebug() << "Hey, there is no gateway!"; + return; + } - _settings->beginGroup("gateway/customParams"); - for (int i = 0; i< ui->sofiaExtraParamTable->rowCount(); i++) - { - _settings->setValue(ui->sofiaExtraParamTable->item(i, 0)->text(), - ui->sofiaExtraParamTable->item(i, 1)->text()); + /* Found the gateway, now iterate the parameters */ + QDomNodeList params = gw.elementsByTagName("param"); + for (int i = 0; i < params.count(); i++) { + QDomElement param = params.at(i).toElement(); + QString var = param.attributeNode("name").value(); + QDomAttr val = param.attributeNode("value"); + if ( var == "username" ) { + val.setValue(ui->sofiaGwUsernameEdit->text()); + } else if ( var == "realm" ) { + val.setValue(ui->sofiaGwRealmEdit->text()); + } else if ( var == "password" ) { + val.setValue(ui->sofiaGwPasswordEdit->text()); + } else if ( var == "expire-seconds" ) { + val.setValue(QString::number(ui->sofiaGwExpireSecondsSpin->value())); + } else if ( var == "register" ) { + val.setValue(ui->sofiaGwRegisterCombo->currentText()); + } else if ( var == "register-transport" ) { + val.setValue(ui->sofiaGwRegisterTransportCombo->currentText()); + } else if ( var == "retry-seconds" ) { + val.setValue(QString::number(ui->sofiaGwRetrySecondsSpin->value())); + } + } + /* Set extra parameters */ + QDomDocument d = gw.toDocument(); + for (int i = 0; i< ui->sofiaExtraParamTable->rowCount(); i++) + { + QDomElement ePar = d.createElement("param"); + QDomAttr var = d.createAttribute(ui->sofiaExtraParamTable->item(i, 0)->text()); + ePar.appendChild(var); + QDomAttr val = d.createAttribute(ui->sofiaExtraParamTable->item(i, 1)->text()); + ePar.appendChild(val); + gw.appendChild(ePar); + } + } else { + QDomElement gws = cfg.elementsByTagName("gateways").at(0).toElement(); + QDomDocument d = gws.toDocument(); + QDomElement nGw = d.createElement("gateway"); + gws.insertAfter(nGw, QDomNode()); + nGw.setAttribute("name",ui->sofiaGwNameEdit->text()); + + /* Set each one of the parameters */ + setParam(nGw, "username", ui->sofiaGwUsernameEdit->text()); + setParam(nGw, "password", ui->sofiaGwPasswordEdit->text()); + setParam(nGw, "register", ui->sofiaGwRegisterCombo->currentText()); + setParam(nGw, "realm", ui->sofiaGwRealmEdit->text()); + setParam(nGw, "expire-seconds", QString::number(ui->sofiaGwExpireSecondsSpin->value())); + setParam(nGw, "register-transport", ui->sofiaGwRegisterTransportCombo->currentText()); + setParam(nGw, "retry-seconds", QString::number(ui->sofiaGwRetrySecondsSpin->value())); + for (int i = 0; i< ui->sofiaExtraParamTable->rowCount(); i++) + { + setParam(nGw, ui->sofiaExtraParamTable->item(i, 0)->text(), ui->sofiaExtraParamTable->item(i, 1)->text()); + } } - _settings->endGroup(); - _settings->endGroup(); + settings.setConfigNode(cfg, "sofia.conf"); + emit gwAdded(_name); +} - _settings->endGroup(); - - emit gwAdded(_accId); +void AccountDialog::setParam(QDomElement &parent, QString name, QString value) { + QDomDocument d = parent.toDocument(); + QDomElement e = d.createElement("param"); + e.setAttribute("name", name); + e.setAttribute("value", value); + parent.appendChild(e); } void AccountDialog::clear() @@ -194,11 +255,6 @@ void AccountDialog::clear() ui->sofiaGwRetrySecondsSpin->setValue(30); } -void AccountDialog::setAccId(QString accId) -{ - _accId = accId; -} - void AccountDialog::changeEvent(QEvent *e) { QDialog::changeEvent(e); diff --git a/fscomm/preferences/accountdialog.h b/fscomm/preferences/accountdialog.h index 40831f56b6..997a08f4cb 100644 --- a/fscomm/preferences/accountdialog.h +++ b/fscomm/preferences/accountdialog.h @@ -2,21 +2,20 @@ #define ACCOUNTDIALOG_H #include +#include "fscomm.h" namespace Ui { class AccountDialog; } -class QSettings; - class AccountDialog : public QDialog { Q_OBJECT public: - AccountDialog(QString accId, QWidget *parent = 0); + AccountDialog(QWidget *parent = 0); ~AccountDialog(); void clear(); - void setAccId(QString); void readConfig(); + void setName(QString name) { _name = name; } signals: void gwAdded(QString); @@ -32,9 +31,10 @@ protected: void changeEvent(QEvent *e); private: - QString _accId; + void setParam(QDomElement &parent, QString name, QString value); + /* Might need the profile as well someday */ + QString _name; /* Needs to be empty when not editing */ Ui::AccountDialog *ui; - QSettings *_settings; }; #endif // ACCOUNTDIALOG_H diff --git a/fscomm/preferences/prefaccounts.cpp b/fscomm/preferences/prefaccounts.cpp index fd8c88f22c..57b578ef5e 100644 --- a/fscomm/preferences/prefaccounts.cpp +++ b/fscomm/preferences/prefaccounts.cpp @@ -1,12 +1,10 @@ #include #include "prefaccounts.h" #include "accountdialog.h" -#include "fshost.h" PrefAccounts::PrefAccounts(Ui::PrefDialog *ui) : _ui(ui) { - _settings = new QSettings(); _accDlg = NULL; connect(_ui->sofiaGwAddBtn, SIGNAL(clicked()), this, SLOT(addAccountBtnClicked())); connect(_ui->sofiaGwRemBtn, SIGNAL(clicked()), this, SLOT(remAccountBtnClicked())); @@ -19,27 +17,15 @@ void PrefAccounts::addAccountBtnClicked() { if (!_accDlg) { - QString uuid; - if (g_FSHost->sendCmd("create_uuid", "", &uuid) != SWITCH_STATUS_SUCCESS) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not create UUID for account. Reason: %s\n", uuid.toAscii().constData()); - return; - } - _accDlg = new AccountDialog(uuid); + _accDlg = new AccountDialog(); connect(_accDlg, SIGNAL(gwAdded(QString)), this, SLOT(readConfig())); } else { - QString uuid; - if (g_FSHost->sendCmd("create_uuid", "", &uuid) != SWITCH_STATUS_SUCCESS) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not create UUID for account. Reason: %s\n", uuid.toAscii().constData()); - return; - } - _accDlg->setAccId(uuid); + /* Needs to be set to empty because we are not editing */ + _accDlg->setName(QString()); _accDlg->clear(); } - _accDlg->show(); _accDlg->raise(); _accDlg->activateWindow(); @@ -53,18 +39,18 @@ void PrefAccounts::editAccountBtnClicked() return; QTableWidgetSelectionRange range = selList[0]; - QString uuid = _ui->accountsTable->item(range.topRow(),0)->data(Qt::UserRole).toString(); + /* Get the selected item */ + QString gwName = _ui->accountsTable->item(range.topRow(),0)->text(); if (!_accDlg) { - _accDlg = new AccountDialog(uuid); + /* TODO: We need a way to read this sucker... Might as well just already pass the profile name */ + _accDlg = new AccountDialog(); connect(_accDlg, SIGNAL(gwAdded(QString)), this, SLOT(readConfig())); } - else - { - _accDlg->setAccId(uuid); - } + /* TODO: Should pass the profile name someday */ + _accDlg->setName(gwName); _accDlg->readConfig(); _accDlg->show(); @@ -83,32 +69,28 @@ void PrefAccounts::remAccountBtnClicked() { QTableWidgetItem *item = _ui->accountsTable->item(row-offset,0); - _settings->beginGroup("FreeSWITCH/conf/sofia.conf/profiles/profile/gateways"); - _settings->remove(item->data(Qt::UserRole).toString()); - _settings->endGroup(); - /* Fire event to remove account */ - switch_event_t *event; - if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, FSCOMM_EVENT_ACC_REMOVED) == SWITCH_STATUS_SUCCESS) { - QSharedPointer acc = g_FSHost->getAccountByUUID(item->data(Qt::UserRole).toString()); - if (!acc.isNull()) - { - QString res; - QString arg = QString("profile softphone killgw %1").arg(acc.data()->getName()); - - if (g_FSHost->sendCmd("sofia", arg.toAscii().data() , &res) != SWITCH_STATUS_SUCCESS) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not killgw %s from profile softphone.\n", - acc.data()->getName().toAscii().data()); - } + ISettings settings(this); + QDomElement cfg = settings.getConfigNode("sofia.conf"); + QDomNodeList gws = cfg.elementsByTagName("gateway"); + for (int i = 0; i < gws.count(); i++) { + QDomElement gw = gws.at(i).toElement(); + if ( gw.attributeNode("name").value() == item->text()) { + cfg.elementsByTagName("gateways").at(0).removeChild(gw); + break; } } + settings.setConfigNode(cfg, "sofia.conf"); + + /* Mark the account to be deleted */ + _toDelete.append(item->text()); + _ui->accountsTable->removeRow(row-offset); offset++; } } - if (offset > 0) - readConfig(false); + if (offset) + readConfig(); } void PrefAccounts::writeConfig() @@ -116,46 +98,68 @@ void PrefAccounts::writeConfig() return; } -void PrefAccounts::readConfig(bool reload) +void PrefAccounts::postWriteConfig() { + + QString res; + if (g_FSHost->sendCmd("sofia", "profile softphone rescan", &res) != SWITCH_STATUS_SUCCESS) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not rescan the softphone profile.\n"); + } + + foreach (QString gw, _toDelete) { + if (g_FSHost->sendCmd("sofia", QString("profile softphone killgw %1").arg(gw).toAscii().constData(), &res) != SWITCH_STATUS_SUCCESS) + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not remove gateway from profile [%s].\n", gw.toAscii().constData()); + } + } +} + +void PrefAccounts::readConfig() { _ui->accountsTable->clearContents(); _ui->accountsTable->setRowCount(0); - _settings->beginGroup("FreeSWITCH/conf/sofia.conf/profiles/profile/gateways"); - - foreach(QString accId, _settings->childGroups()) - { - _settings->beginGroup(accId); - _settings->beginGroup("gateway/attrs"); - QTableWidgetItem *item0 = new QTableWidgetItem(_settings->value("name").toString()); - item0->setData(Qt::UserRole, accId); - _settings->endGroup(); - _settings->beginGroup("gateway/params"); - QTableWidgetItem *item1 = new QTableWidgetItem(_settings->value("username").toString()); - item1->setData(Qt::UserRole, accId); - _settings->endGroup(); - _settings->endGroup(); + ISettings settings(this); + + QDomElement cfg = settings.getConfigNode("sofia.conf"); + + if ( cfg.elementsByTagName("gateways").count() == 0 ) { + QDomElement profile = cfg.elementsByTagName("profile").at(0).toElement(); + QDomDocument d = profile.toDocument(); + QDomElement gws = d.createElement("gateways"); + profile.insertBefore(gws, QDomNode()); /* To make it look nicer */ + settings.setConfigNode(cfg, "sofia.conf"); + return; + } + + QDomNodeList l = cfg.elementsByTagName("gateway"); + + for (int i = 0; i < l.count(); i++) { + QDomElement gw = l.at(i).toElement(); + QTableWidgetItem *item0 = new QTableWidgetItem(gw.attribute("name")); + QTableWidgetItem *item1 = NULL; + /* Iterate until we find what we need */ + QDomNodeList params = gw.elementsByTagName("param"); + for(int j = 0; i < params.count(); j++) { + QDomElement e = params.at(j).toElement(); + QString var = e.attributeNode("name").value(); + if (var == "username" ) { + item1 = new QTableWidgetItem(e.attributeNode("value").value()); + break; /* We found, so stop looping */ + } + } _ui->accountsTable->setRowCount(_ui->accountsTable->rowCount()+1); _ui->accountsTable->setItem(_ui->accountsTable->rowCount()-1, 0, item0); _ui->accountsTable->setItem(_ui->accountsTable->rowCount()-1, 1, item1); } + _ui->accountsTable->resizeRowsToContents(); _ui->accountsTable->resizeColumnsToContents(); _ui->accountsTable->horizontalHeader()->setStretchLastSection(true); - _settings->endGroup(); - - if (reload) - { - QString res; - if (g_FSHost->sendCmd("sofia", "profile softphone rescan", &res) != SWITCH_STATUS_SUCCESS) - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not rescan the softphone profile.\n"); - return; - } - } - + /* + TODO: We have to figure out what to do with the default account stuff! if (_ui->accountsTable->rowCount() == 1) { QString default_gateway = _settings->value(QString("/FreeSWITCH/conf/sofia.conf/profiles/profile/gateways/%1/gateway/attrs/name").arg(_ui->accountsTable->item(0,0)->data(Qt::UserRole).toString())).toString(); @@ -163,6 +167,6 @@ void PrefAccounts::readConfig(bool reload) _settings->setValue("default_gateway", default_gateway); _settings->endGroup(); switch_core_set_variable("default_gateway", default_gateway.toAscii().data()); - } + }*/ } diff --git a/fscomm/preferences/prefaccounts.h b/fscomm/preferences/prefaccounts.h index e995cab208..55ad7caebc 100644 --- a/fscomm/preferences/prefaccounts.h +++ b/fscomm/preferences/prefaccounts.h @@ -3,10 +3,8 @@ #include #include "ui_prefdialog.h" +#include "fscomm.h" -#define FSCOMM_EVENT_ACC_REMOVED "fscomm::acc_removed" - -class QSettings; class AccountDialog; class PrefAccounts : public QObject { @@ -14,9 +12,10 @@ class PrefAccounts : public QObject { public: explicit PrefAccounts(Ui::PrefDialog *ui); void writeConfig(); + void postWriteConfig(); public slots: - void readConfig(bool reload=true); + void readConfig(); private slots: void addAccountBtnClicked(); @@ -24,9 +23,10 @@ private slots: void remAccountBtnClicked(); private: + void markAccountToDelete(QString gwName); /* TODO: Might be interesting to pass the account instead */ Ui::PrefDialog *_ui; AccountDialog *_accDlg; - QSettings *_settings; + QList _toDelete; }; #endif // PREFACCOUNTS_H diff --git a/fscomm/preferences/prefdialog.cpp b/fscomm/preferences/prefdialog.cpp index 233de4eb1b..3b435e23a6 100644 --- a/fscomm/preferences/prefdialog.cpp +++ b/fscomm/preferences/prefdialog.cpp @@ -10,8 +10,8 @@ PrefDialog::PrefDialog(QWidget *parent) : ui(new Ui::PrefDialog) { ui->setupUi(this); - _settings = new QSettings(); connect(this, SIGNAL(accepted()), this, SLOT(writeConfig())); + connect(ui->buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(clicked(QAbstractButton*))); _pref_accounts = new PrefAccounts(ui); _mod_portaudio = new PrefPortaudio(ui, this); @@ -25,11 +25,44 @@ PrefDialog::~PrefDialog() delete ui; } +void PrefDialog::clicked(QAbstractButton *b) { + if (ui->buttonBox->buttonRole(b) == QDialogButtonBox::ApplyRole) { + writeConfig(); + readConfig(); + } + if ( ui->buttonBox->buttonRole(b) == QDialogButtonBox::RejectRole) { + /* This doesn't really work because we need to reset the DOM as well to discard changes... */ + readConfig(); + } +} + void PrefDialog::writeConfig() { + /* Ask modules to write their configs. */ _mod_portaudio->writeConfig(); _mod_sofia->writeConfig(); + _pref_accounts->writeConfig(); + /* Write it to file */ + ISettings settings(this); + settings.saveToFile(); + + /* Re-read the configuration to memory */ + const char *err; + switch_xml_t xml_root; + + if ((xml_root = switch_xml_open_root(1, &err))) { + switch_xml_free(xml_root); + } else { + QMessageBox::critical(0, tr("Unable to save settings"), + tr("There was an error saving your settings.\nPlease report this bug.\n%1").arg(err), + QMessageBox::Ok); + return; + } + + /* Tell modules new config is in memory so they get a chance */ + _mod_portaudio->postWriteConfig(); + _pref_accounts->postWriteConfig(); } void PrefDialog::changeEvent(QEvent *e) diff --git a/fscomm/preferences/prefdialog.h b/fscomm/preferences/prefdialog.h index 2704a501a8..1d60bbfc71 100644 --- a/fscomm/preferences/prefdialog.h +++ b/fscomm/preferences/prefdialog.h @@ -3,12 +3,12 @@ #include #include -#include -#include +#include "fscomm.h" class PrefPortaudio; class PrefSofia; class PrefAccounts; +class QAbstractButton; namespace Ui { class PrefDialog; @@ -25,13 +25,13 @@ protected: private slots: void writeConfig(); + void clicked(QAbstractButton*); signals: void preprocessorsApplied(QStringList); private: void readConfig(); - QSettings *_settings; PrefAccounts *_pref_accounts; Ui::PrefDialog *ui; PrefPortaudio *_mod_portaudio; diff --git a/fscomm/preferences/prefdialog.ui b/fscomm/preferences/prefdialog.ui index fbab506dab..aca5eff198 100644 --- a/fscomm/preferences/prefdialog.ui +++ b/fscomm/preferences/prefdialog.ui @@ -1170,7 +1170,7 @@ Qt::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok diff --git a/fscomm/preferences/prefportaudio.cpp b/fscomm/preferences/prefportaudio.cpp index 0a28174c27..e2bd8d3bd0 100644 --- a/fscomm/preferences/prefportaudio.cpp +++ b/fscomm/preferences/prefportaudio.cpp @@ -1,12 +1,10 @@ #include -#include #include "prefportaudio.h" PrefPortaudio::PrefPortaudio(Ui::PrefDialog *ui, QObject *parent) : QObject(parent), _ui(ui) { - _settings = new QSettings(); connect(_ui->PaRingFileBtn, SIGNAL(clicked()), this, SLOT(ringFileChoose())); connect(_ui->PaHoldFileBtn, SIGNAL(clicked()), this, SLOT(holdFileChoose())); connect(_ui->PaIndevCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(indevChangeDev(int))); @@ -139,111 +137,111 @@ void PrefPortaudio::ringFileChoose() void PrefPortaudio::writeConfig() { - _settings->beginGroup("FreeSWITCH/conf"); - _settings->beginGroup("portaudio.conf/settings/params"); - - QString cid_name = _settings->value("cid-name").toString(); - QString ncid_name = _ui->PaCallerIdNameEdit->text(); - - QString cid_num = _settings->value("cid-num").toString(); - QString ncid_num = _ui->PaCallerIdNumEdit->text(); - - QString hold_file = _settings->value("hold-file").toString(); - QString nhold_file = _ui->PaHoldFileEdit->text(); - - QString ring_file = _settings->value("ring-file").toString(); - QString nring_file = _ui->PaRingFileEdit->text(); - - int ring_interval = _settings->value("ring-interval").toInt(); - int nring_interval = _ui->PaRingIntervalSpin->value(); - - QString sample_rate = _settings->value("sample-rate").toString(); - QString nsample_rate = _ui->PaSampleRateEdit->text(); - - QString codec_ms = _settings->value("codec-ms").toString(); - QString ncodec_ms = _ui->PaCodecMSEdit->text(); + /* We can do better error control here, can't we? */ + ISettings *_settings = new ISettings(); + QDomElement cfg = _settings->getConfigNode("portaudio.conf"); + QDomNodeList nl = cfg.elementsByTagName("param"); + for (int i = 0; i < nl.count(); i++) { + QDomAttr var = nl.at(i).toElement().attributeNode("name"); + QDomAttr val = nl.at(i).toElement().attributeNode("value"); + if (var.value() == "indev") { + val.setValue(QString::number(_ui->PaIndevCombo->itemData(_ui->PaIndevCombo->currentIndex(), Qt::UserRole).toInt())); + } + if (var.value() == "outdev") { + val.setValue(QString::number(_ui->PaOutdevCombo->itemData(_ui->PaOutdevCombo->currentIndex(), Qt::UserRole).toInt())); + } + if (var.value() == "ringdev") { + val.setValue(QString::number(_ui->PaRingdevCombo->itemData(_ui->PaRingdevCombo->currentIndex(), Qt::UserRole).toInt())); + } + if (var.value() == "ring-file") { + val.setValue(_ui->PaRingFileEdit->text()); + } + if (var.value() == "ring-interval") { + val.setValue(QString::number(_ui->PaRingIntervalSpin->value())); + } + if (var.value() == "hold-file") { + val.setValue(_ui->PaHoldFileEdit->text()); + } + if (var.value() == "cid-name") { + val.setValue(_ui->PaCallerIdNameEdit->text()); + } + if (var.value() == "cid-num") { + val.setValue(_ui->PaCallerIdNumEdit->text()); + } + if (var.value() == "sample-rate") { + val.setValue(_ui->PaSampleRateEdit->text()); + } + if (var.value() == "codec-ms") { + val.setValue(_ui->PaCodecMSEdit->text()); + } + /* Not used currently + if (var.value() == "dialplan") { + val.setValue(); + } + if (var.value() == "timer-name") { + val.setValue(); + }*/ + } + /* Save the config to the file */ + _settings->setConfigNode(cfg, "portaudio.conf"); +} +void PrefPortaudio::postWriteConfig() { QString result; - - if (cid_name != ncid_name || - cid_num != ncid_num || - hold_file != nhold_file || - ring_file != nring_file || - ring_interval != nring_interval || - sample_rate != nsample_rate|| - codec_ms != ncodec_ms) + if (g_FSHost->sendCmd("reload", "mod_portaudio", &result) != SWITCH_STATUS_SUCCESS) { - if (g_FSHost->sendCmd("reload", "mod_portaudio", &result) == SWITCH_STATUS_SUCCESS) - { - _settings->setValue("cid-name", ncid_name); - _settings->setValue("cid-num", ncid_num); - _settings->setValue("ring-file", nring_file); - _settings->setValue("ring-interval", nring_interval); - _settings->setValue("hold-file", nhold_file); - _settings->setValue("sample-rate", nsample_rate); - _settings->setValue("codec-ms", ncodec_ms); - } - else - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error while issuing reload command to mod_portaudio!\n"); - QMessageBox::critical(0, tr("Unable to save settings"), - tr("There was an error saving your settings.\nPlease report this bug."), - QMessageBox::Ok); - } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error while issuing reload command to mod_portaudio!\n"); + QMessageBox::critical(0, tr("Unable to save settings"), + tr("There was an error saving your settings.\nPlease report this bug."), + QMessageBox::Ok); } - - int nindev = _ui->PaIndevCombo->itemData(_ui->PaIndevCombo->currentIndex(), Qt::UserRole).toInt(); - int indev = _settings->value("indev").toInt(); - int noutdev = _ui->PaOutdevCombo->itemData(_ui->PaOutdevCombo->currentIndex(), Qt::UserRole).toInt(); - int outdev = _settings->value("outdev").toInt(); - int nringdev = _ui->PaRingdevCombo->itemData(_ui->PaRingdevCombo->currentIndex(), Qt::UserRole).toInt(); - int ringdev = _settings->value("ringdev").toInt(); - - if (nindev != indev) - { - if (g_FSHost->sendCmd("pa", QString("indev #%1").arg(nindev).toAscii().constData(), &result) == SWITCH_STATUS_SUCCESS) - { - _settings->setValue("indev", nindev); - } - else - { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error setting indev from #%d to #%d on mod_portaudio!\n", - indev, nindev); - QMessageBox::critical(0, tr("Unable to save settings"), - tr("There was an error changing the indev.\nPlease report this bug."), - QMessageBox::Ok); - } - } - - if (noutdev!= outdev) - { - _settings->setValue("outdev", noutdev); - } - if (nringdev != ringdev) - { - _settings->setValue("ringdev", nringdev); - } - - _settings->endGroup(); - _settings->endGroup(); } void PrefPortaudio::readConfig() { - getPaDevlist(); - _settings->beginGroup("FreeSWITCH/conf"); + getPaDevlist(); /* To populate the combo */ - _settings->beginGroup("portaudio.conf/settings/params"); - _ui->PaCallerIdNameEdit->setText(_settings->value("cid-name").toString()); - _ui->PaCallerIdNumEdit->setText(_settings->value("cid-num").toString()); - _ui->PaHoldFileEdit->setText(_settings->value("hold-file").toString()); - _ui->PaRingFileEdit->setText(_settings->value("ring-file").toString()); - _ui->PaRingIntervalSpin->setValue(_settings->value("ring-interval").toInt()); - _ui->PaSampleRateEdit->setText(_settings->value("sample-rate").toString()); - _ui->PaCodecMSEdit->setText(_settings->value("codec-ms").toString()); - _settings->endGroup(); - - _settings->endGroup(); + ISettings *_settings = new ISettings(); + QDomElement cfg = _settings->getConfigNode("portaudio.conf"); + QDomNodeList nl = cfg.elementsByTagName("param"); + for (int i = 0; i < nl.count(); i++) { + QDomAttr var = nl.at(i).toElement().attributeNode("name"); + QDomAttr val = nl.at(i).toElement().attributeNode("value"); + /* Set when getting the device list */ + if (var.value() == "indev") { + } + if (var.value() == "outdev") { + } + if (var.value() == "ringdev") { + } + if (var.value() == "ring-file") { + _ui->PaRingFileEdit->setText(val.value()); + } + if (var.value() == "ring-interval") { + _ui->PaRingIntervalSpin->setValue(val.value().toInt()); + } + if (var.value() == "hold-file") { + _ui->PaHoldFileEdit->setText(val.value()); + } + /* Not yet used. + if (var.value() == "dialplan") { + } + if (var.value() == "timer-name") { + } + */ + if (var.value() == "cid-name") { + _ui->PaCallerIdNameEdit->setText(val.value()); + } + if (var.value() == "cid-num") { + _ui->PaCallerIdNumEdit->setText(val.value()); + } + if (var.value() == "sample-rate") { + _ui->PaSampleRateEdit->setText(val.value()); + } + if (var.value() == "codec-ms") { + _ui->PaCodecMSEdit->setText(val.value()); + } + } } void PrefPortaudio::getPaDevlist() @@ -259,6 +257,9 @@ void PrefPortaudio::getPaDevlist() QMessageBox::Ok); return; } + _ui->PaOutdevCombo->clear(); + _ui->PaIndevCombo->clear(); + _ui->PaRingdevCombo->clear(); if (!_xmlPaDevList.setContent(result, &errorMsg, &errorLine, &errorColumn)) { diff --git a/fscomm/preferences/prefportaudio.h b/fscomm/preferences/prefportaudio.h index d12750ab65..6566c9321d 100644 --- a/fscomm/preferences/prefportaudio.h +++ b/fscomm/preferences/prefportaudio.h @@ -4,8 +4,7 @@ #include #include #include "ui_prefdialog.h" - -class QSettings; +#include "fscomm.h" class PrefPortaudio : public QObject { @@ -13,6 +12,7 @@ Q_OBJECT public: explicit PrefPortaudio(Ui::PrefDialog *ui, QObject *parent = 0); void writeConfig(); + void postWriteConfig(); void readConfig(); private slots: @@ -31,7 +31,6 @@ signals: private: void getPaDevlist(void); - QSettings *_settings; Ui::PrefDialog *_ui; QDomDocument _xmlPaDevList; }; diff --git a/fscomm/preferences/prefsofia.cpp b/fscomm/preferences/prefsofia.cpp index 01347184ff..2c0bb69ed0 100644 --- a/fscomm/preferences/prefsofia.cpp +++ b/fscomm/preferences/prefsofia.cpp @@ -10,120 +10,242 @@ PrefSofia::PrefSofia(Ui::PrefDialog *ui, QObject *parent) : void PrefSofia::readConfig() { - QSettings settings; + ISettings *settings = new ISettings(); + QDomElement cfg = settings->getConfigNode("sofia.conf"); + if ( cfg.isNull() ) { + qDebug() << "Issue a big warning!"; + return; + } int guess_mask; char guess_ip[80]; switch_find_local_ip(guess_ip, sizeof(guess_ip), &guess_mask, AF_INET); _ui->sofiaRtpIpEdit->setText(QString(guess_ip)); _ui->sofiaSipIpEdit->setText(QString(guess_ip)); - settings.beginGroup("FreeSWITCH/conf"); - settings.beginGroup("sofia.conf"); - /* General Settings */ - settings.beginGroup("global_settings/params"); - _ui->sofiaLogLevelSpin->setValue(settings.value("log-level").toInt()); - _ui->sofiaAutoRestartCombo->setCurrentIndex(_ui->sofiaAutoRestartCombo->findText(settings.value("auto-restart").toString())); - _ui->sofiaDebugPresenceSpin->setValue(settings.value("debug-presence").toInt()); - _ui->sofiaRewriteMulticastedFsPathCombo->setCurrentIndex(_ui->sofiaRewriteMulticastedFsPathCombo->findText(settings.value("rewrite-multicasted-fs-path").toString())); - settings.endGroup(); + QDomNodeList l = cfg.elementsByTagName("global_settings"); + QDomNodeList global_params = l.at(0).toElement().elementsByTagName("param"); + for (int i = 0; i < global_params.count(); i++) { + QDomElement el = global_params.at(i).toElement(); + if ( el.attribute("name") == "log-level" ) { + _ui->sofiaLogLevelSpin->setValue(el.attribute("value").toInt()); + } + if ( el.attribute("name") == "auto-restart") { + _ui->sofiaAutoRestartCombo->setCurrentIndex(_ui->sofiaAutoRestartCombo->findText(el.attribute("value"))); + } + if ( el.attribute("name") == "debug-presence") { + _ui->sofiaDebugPresenceSpin->setValue(el.attribute("value").toInt()); + } + } /* Profile settings */ - settings.beginGroup("profiles"); - settings.beginGroup("profile"); + /* Get only the first settings, meaning one profile supported so far */ + QDomNodeList params = cfg.elementsByTagName("settings").at(0).toElement().elementsByTagName("param"); + for (int i = 0; i < params.count(); i++) { + QDomElement el = params.at(i).toElement(); + if ( el.attribute("name") == "user-agent-string") { + _ui->sofiaUserAgentStringEdit->setText(el.attribute("value")); + } + if ( el.attribute("name") == "debug") { + _ui->sofiaDebugSpin->setValue(el.attribute("value").toInt()); + } + if ( el.attribute("name") == "sip-trace") { + _ui->sofiaSipTraceCombo->setCurrentIndex(_ui->sofiaSipTraceCombo->findText(el.attribute("value"))); + } + if ( el.attribute("name") == "context") { + _ui->sofiaContextEdit->setText(el.attribute("value")); + } + if ( el.attribute("name") == "rfc2833-pt") { + _ui->sofiaRfc2833PtEdit->setText(el.attribute("value")); + } + if ( el.attribute("name") == "sip-port") { + _ui->sofiaSipPortSpin->setValue(el.attribute("value").toInt()); + } + if ( el.attribute("name") == "dialplan") { + _ui->sofiaDialplanEdit->setText(el.attribute("value")); + } + if ( el.attribute("name") == "dtmf-duration") { + _ui->sofiaDtmfDurationSpin->setValue(el.attribute("value").toInt()); + } + if ( el.attribute("name") == "codec-prefs") { + _ui->sofiaProfileCodecWidget->setCodecString(el.attribute("value")); + } + if ( el.attribute("name") == "use-rtp-timer") { + _ui->sofiaUseRtpTimerCombo->setCurrentIndex(_ui->sofiaUseRtpTimerCombo->findText(el.attribute("value"))); + } + if ( el.attribute("name") == "rtp-timer-name") { + _ui->sofiaRtpTimerNameEdit->setText(el.attribute("value")); + } + if ( el.attribute("name") == "rtp-ip") { + _ui->sofiaRtpIpEdit->setText(el.attribute("value")); + } + if ( el.attribute("name") == "sip-ip") { + _ui->sofiaSipIpEdit->setText(el.attribute("value")); + } + if ( el.attribute("name") == "hold-music") { + _ui->sofiaHoldMusicEdit->setText(el.attribute("value")); + } + if ( el.attribute("name") == "apply-nat-acl") { + _ui->sofiaApplyNatAclEdit->setText(el.attribute("value")); + } + if ( el.attribute("name") == "manage-presence") { + _ui->sofiaManagePresenceCombo->setCurrentIndex(_ui->sofiaManagePresenceCombo->findText(el.attribute("value"))); + } + if ( el.attribute("name") == "max-proceeding") { + _ui->sofiaMaxProceedingEdit->setValue(el.attribute("value").toInt()); + } + if ( el.attribute("name") == "inbound-codec-negotiation") { + _ui->sofiaInboundCodecNegotiationCombo->setCurrentIndex(_ui->sofiaInboundCodecNegotiationCombo->findText(el.attribute("value"))); + } + if ( el.attribute("name") == "nonce-ttl") { + _ui->sofiaNonceTtlSpin->setValue(el.attribute("value").toInt()); + } + if ( el.attribute("name") == "auth-calls") { + _ui->sofiaAuthCallsCombo->setCurrentIndex(_ui->sofiaAuthCallsCombo->findText(el.attribute("value"))); + } + if ( el.attribute("name") == "auth-all-packets") { + _ui->sofiaAuthAllPacketsCombo->setCurrentIndex(_ui->sofiaAuthAllPacketsCombo->findText(el.attribute("value"))); + } + if ( el.attribute("name") == "ext-sip-ip") { + _ui->sofiaExtSipIpEdit->setText(el.attribute("value")); + } + if ( el.attribute("name") == "rtp-timeout-sec") { + _ui->sofiaRtpTimeoutSecSpin->setValue(el.attribute("value").toInt()); + } + if ( el.attribute("name") == "rtp-hold-timeout-sec") { + _ui->sofiaRtpHoldTimeoutSecSpin->setValue(el.attribute("value").toInt()); + } + if ( el.attribute("name") == "disable-register") { + _ui->sofiaDisableRegisterCombo->setCurrentIndex(_ui->sofiaDisableRegisterCombo->findText(el.attribute("value"))); + } + if ( el.attribute("name") == "challenge-realm") { + _ui->sofiaChallengeRealmCombo->setCurrentIndex(_ui->sofiaChallengeRealmCombo->findText(el.attribute("value"))); + } + } + delete (settings); +} - settings.beginGroup("settings/params"); - _ui->sofiaUserAgentStringEdit->setText(settings.value("user-agent-string").toString()); - _ui->sofiaDebugSpin->setValue(settings.value("debug").toInt()); - _ui->sofiaSipTraceCombo->setCurrentIndex(_ui->sofiaSipTraceCombo->findText(settings.value("sip-trace").toString())); - _ui->sofiaContextEdit->setText(settings.value("context").toString()); - _ui->sofiaRfc2833PtEdit->setText(settings.value("rfc2833-pt").toString()); - _ui->sofiaSipPortSpin->setValue(settings.value("sip-port").toInt()); - _ui->sofiaDialplanEdit->setText(settings.value("dialplan").toString()); - _ui->sofiaDtmfDurationSpin->setValue(settings.value("dtmf-duration").toInt()); - _ui->sofiaProfileCodecWidget->setCodecString(settings.value("codec-prefs").toString()); - _ui->sofiaUseRtpTimerCombo->setCurrentIndex(_ui->sofiaUseRtpTimerCombo->findText(settings.value("use-rtp-timer").toString())); - _ui->sofiaRtpTimerNameEdit->setText(settings.value("rtp-timer-name").toString()); - _ui->sofiaRtpIpEdit->setText(settings.value("rtp-ip").toString()); - _ui->sofiaSipIpEdit->setText(settings.value("sip-ip").toString()); - _ui->sofiaHoldMusicEdit->setText(settings.value("hold-music").toString()); - _ui->sofiaApplyNatAclEdit->setText(settings.value("apply-nat-acl").toString()); - _ui->sofiaManagePresenceCombo->setCurrentIndex(_ui->sofiaManagePresenceCombo->findText(settings.value("manage-presence").toString())); - _ui->sofiaMaxProceedingEdit->setValue(settings.value("max-proceeding").toInt()); - _ui->sofiaInboundCodecNegotiationCombo->setCurrentIndex(_ui->sofiaInboundCodecNegotiationCombo->findText(settings.value("inbound-codec-negotiation").toString())); - _ui->sofiaNonceTtlSpin->setValue(settings.value("nonce-ttl").toInt()); - _ui->sofiaAuthCallsCombo->setCurrentIndex(_ui->sofiaAuthCallsCombo->findText(settings.value("auth-calls").toString())); - _ui->sofiaAuthAllPacketsCombo->setCurrentIndex(_ui->sofiaAuthAllPacketsCombo->findText(settings.value("auth-all-packets").toString())); - _ui->sofiaExtRtpIpEdit->setText(settings.value("ext-rtp-ip").toString()); - _ui->sofiaExtSipIpEdit->setText(settings.value("ext-sip-ip").toString()); - _ui->sofiaRtpTimeoutSecSpin->setValue(settings.value("rtp-timeout-sec").toInt()); - _ui->sofiaRtpHoldTimeoutSecSpin->setValue(settings.value("rtp-hold-timeout-sec").toInt()); - _ui->sofiaDisableRegisterCombo->setCurrentIndex(_ui->sofiaDisableRegisterCombo->findText(settings.value("disable-register").toString())); - _ui->sofiaChallengeRealmCombo->setCurrentIndex(_ui->sofiaChallengeRealmCombo->findText(settings.value("challenge-realm").toString())); - settings.endGroup(); - - settings.endGroup(); - settings.endGroup(); - settings.endGroup(); - settings.endGroup(); - +void PrefSofia::postWriteConfig() { + /* Here, we have to know if we need to restart the profile or not */ + return; } void PrefSofia::writeConfig() { - QSettings settings; - settings.beginGroup("FreeSWITCH/conf"); - settings.beginGroup("sofia.conf"); + ISettings *settings = new ISettings(this); + + QDomElement e = settings->getConfigNode("sofia.conf"); + QDomNodeList nl = e.elementsByTagName("global_settings").at(0).toElement().elementsByTagName("param"); /* General Settings */ - settings.beginGroup("global_settings/params"); - settings.setValue("log-level", _ui->sofiaLogLevelSpin->value()); - settings.setValue("auto-restart", _ui->sofiaAutoRestartCombo->currentText()); - settings.setValue("debug-presence", _ui->sofiaDebugPresenceSpin->value()); - settings.setValue("rewrite-multicasted-fs-path", _ui->sofiaRewriteMulticastedFsPathCombo->currentText()); - settings.endGroup(); + for (int i = 0; i < nl.count(); i++) { + QDomElement el = nl.at(i).toElement(); + QDomAttr val = el.attributeNode("value"); + QDomAttr var = el.attributeNode("name"); + if ( var.value() == "log-level" ) { + val.setValue(QString::number(_ui->sofiaLogLevelSpin->value())); + } + if ( var.value() == "auto-restart" ) { + val.setValue(_ui->sofiaAutoRestartCombo->currentText()); + } + if ( var.value() == "debug-presence" ) { + val.setValue(QString::number(_ui->sofiaDebugPresenceSpin->value())); + } + if ( var.value() == "rewrite-multicasted-fs-path" ) { + val.setValue(_ui->sofiaRewriteMulticastedFsPathCombo->currentText()); + } + } /* Profile settings */ - settings.beginGroup("profiles"); - settings.beginGroup("profile"); + /* Get only the first settings, meaning one profile supported so far */ + QDomNodeList params = e.elementsByTagName("settings").at(0).toElement().elementsByTagName("param"); + for (int i = 0; i < params.count(); i++) { + QDomElement el = params.at(i).toElement(); + QDomAttr val = el.attributeNode("value"); + if ( el.attribute("name") == "user-agent-string") { + val.setValue(_ui->sofiaUserAgentStringEdit->text()); + } + if ( el.attribute("name") == "debug") { + val.setValue(QString::number(_ui->sofiaDebugSpin->value())); + } + if ( el.attribute("name") == "sip-trace") { + val.setValue(_ui->sofiaSipTraceCombo->currentText()); + } + if ( el.attribute("name") == "context") { + val.setValue(_ui->sofiaContextEdit->text()); + } + if ( el.attribute("name") == "rfc2833-pt") { + val.setValue(_ui->sofiaRfc2833PtEdit->text()); + } + if ( el.attribute("name") == "sip-port") { + val.setValue(QString::number(_ui->sofiaSipPortSpin->value())); + } + if ( el.attribute("name") == "dialplan") { + val.setValue(_ui->sofiaDialplanEdit->text()); + } + if ( el.attribute("name") == "dtmf-duration") { + val.setValue(QString::number(_ui->sofiaDtmfDurationSpin->value())); + } + if ( el.attribute("name") == "codec-prefs") { + val.setValue(_ui->sofiaProfileCodecWidget->getCodecString()); + } + if ( el.attribute("name") == "use-rtp-timer") { + val.setValue(_ui->sofiaUseRtpTimerCombo->currentText()); + } + if ( el.attribute("name") == "rtp-timer-name") { + val.setValue(_ui->sofiaRtpTimerNameEdit->text()); + } + if ( el.attribute("name") == "rtp-ip") { + val.setValue(_ui->sofiaRtpIpEdit->text()); + } + if ( el.attribute("name") == "sip-ip") { + val.setValue(_ui->sofiaSipIpEdit->text()); + } + if ( el.attribute("name") == "hold-music") { + val.setValue(_ui->sofiaHoldMusicEdit->text()); + } + if ( el.attribute("name") == "apply-nat-acl") { + val.setValue(_ui->sofiaApplyNatAclEdit->text()); + } + if ( el.attribute("name") == "manage-presence") { + val.setValue(_ui->sofiaManagePresenceCombo->currentText()); + } + if ( el.attribute("name") == "max-proceeding") { + val.setValue(_ui->sofiaMaxProceedingEdit->text()); + } + if ( el.attribute("name") == "inbound-codec-negotiation") { + val.setValue(_ui->sofiaInboundCodecNegotiationCombo->currentText()); + } + if ( el.attribute("name") == "nonce-ttl") { + val.setValue(QString::number(_ui->sofiaNonceTtlSpin->value())); + } + if ( el.attribute("name") == "auth-calls") { + val.setValue(_ui->sofiaAuthCallsCombo->currentText()); + } + if ( el.attribute("name") == "auth-all-packets") { + val.setValue(_ui->sofiaAuthAllPacketsCombo->currentText()); + } + if ( el.attribute("name") == "ext-rtp-ip") { + val.setValue(_ui->sofiaExtRtpIpEdit->text()); + } + if ( el.attribute("name") == "ext-sip-ip") { + val.setValue(_ui->sofiaExtSipIpEdit->text()); + } + if ( el.attribute("name") == "rtp-timeout-sec") { + val.setValue(QString::number(_ui->sofiaRtpTimeoutSecSpin->value())); + } + if ( el.attribute("name") == "rtp-hold-timeout-sec") { + val.setValue(QString::number(_ui->sofiaRtpHoldTimeoutSecSpin->value())); + } + if ( el.attribute("name") == "disable-register") { + val.setValue(_ui->sofiaDisableRegisterCombo->currentText()); + } + if ( el.attribute("name") == "challenge-realm") { + val.setValue(_ui->sofiaChallengeRealmCombo->currentText()); + } + } - settings.beginGroup("attrs"); - settings.setValue("name", "softphone"); - settings.endGroup(); - - settings.beginGroup("settings/params"); - settings.setValue("user-agent-string", _ui->sofiaUserAgentStringEdit->text()); - settings.setValue("debug", _ui->sofiaDebugSpin->value()); - settings.setValue("sip-trace", _ui->sofiaSipTraceCombo->currentText()); - settings.setValue("context", _ui->sofiaContextEdit->text()); - settings.setValue("rfc2833-pt", _ui->sofiaRfc2833PtEdit->text()); - settings.setValue("sip-port", _ui->sofiaSipPortSpin->value()); - settings.setValue("dialplan", _ui->sofiaDialplanEdit->text()); - settings.setValue("dtmf-duration", _ui->sofiaDtmfDurationSpin->value()); - settings.setValue("codec-prefs", _ui->sofiaProfileCodecWidget->getCodecString()); - settings.setValue("use-rtp-timer", _ui->sofiaUseRtpTimerCombo->currentText()); - settings.setValue("rtp-timer-name", _ui->sofiaRtpTimerNameEdit->text()); - settings.setValue("rtp-ip", _ui->sofiaRtpIpEdit->text()); - settings.setValue("sip-ip", _ui->sofiaSipIpEdit->text()); - settings.setValue("hold-music", _ui->sofiaHoldMusicEdit->text()); - settings.setValue("apply-nat-acl", _ui->sofiaApplyNatAclEdit->text()); - settings.setValue("manage-presence", _ui->sofiaManagePresenceCombo->currentText()); - settings.setValue("max-proceeding", _ui->sofiaMaxProceedingEdit->text()); - settings.setValue("inbound-codec-negotiation", _ui->sofiaInboundCodecNegotiationCombo->currentText()); - settings.setValue("nonce-ttl", _ui->sofiaNonceTtlSpin->value()); - settings.setValue("auth-calls", _ui->sofiaAuthCallsCombo->currentText()); - settings.setValue("auth-all-packets", _ui->sofiaAuthAllPacketsCombo->currentText()); - settings.setValue("ext-rtp-ip", _ui->sofiaExtRtpIpEdit->text()); - settings.setValue("ext-sip-ip", _ui->sofiaExtSipIpEdit->text()); - settings.setValue("rtp-timeout-sec", _ui->sofiaRtpTimeoutSecSpin->value()); - settings.setValue("rtp-hold-timeout-sec", _ui->sofiaRtpHoldTimeoutSecSpin->value()); - settings.setValue("disable-register", _ui->sofiaDisableRegisterCombo->currentText()); - settings.setValue("challenge-realm", _ui->sofiaChallengeRealmCombo->currentText()); - settings.endGroup(); - - settings.endGroup(); - settings.endGroup(); - settings.endGroup(); - settings.endGroup(); + settings->setConfigNode(e, "sofia.conf"); + delete(settings); } diff --git a/fscomm/preferences/prefsofia.h b/fscomm/preferences/prefsofia.h index f5f12d64ca..8c43814be5 100644 --- a/fscomm/preferences/prefsofia.h +++ b/fscomm/preferences/prefsofia.h @@ -11,6 +11,7 @@ public: explicit PrefSofia(Ui::PrefDialog *ui, QObject *parent = 0); void writeConfig(); void readConfig(); + void postWriteConfig(); private: Ui::PrefDialog *_ui; diff --git a/fscomm/widgets/codecwidget.cpp b/fscomm/widgets/codecwidget.cpp index 049fc4ba4d..42b10febfd 100644 --- a/fscomm/widgets/codecwidget.cpp +++ b/fscomm/widgets/codecwidget.cpp @@ -126,6 +126,17 @@ QString CodecWidget::getCodecString() void CodecWidget::setCodecString(QString codecList) { + /* Mostly for backwards compatibility. */ + if ( codecList.startsWith("$")) { + QStringList parsed = codecList.split("{"); + QString var = parsed.at(1); + var = var.split("}").at(0); + var = switch_core_get_variable(var.toAscii().data()); + if ( ! var.isEmpty() ) { + codecList = var; + } + } + QStringList rawEnCodecs; QStringList split = codecList.split(","); foreach(QString s, split)