From a9f33bc1a6418dd6752babdc0b97c6a651572fc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Mesquita?= Date: Sat, 23 Jan 2010 06:50:13 +0000 Subject: [PATCH] Properly remove account. Requires http://jira.freeswitch.org/browse/MODENDP-284 git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16476 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- fscomm/account.h | 4 ++- fscomm/fshost.cpp | 29 ++++++++++--------- fscomm/preferences/accountdialog.cpp | 12 ++++++++ fscomm/preferences/prefaccounts.cpp | 42 ++++++++++++---------------- fscomm/preferences/prefaccounts.h | 2 +- 5 files changed, 50 insertions(+), 39 deletions(-) diff --git a/fscomm/account.h b/fscomm/account.h index ef66e70bd2..7a044151f3 100644 --- a/fscomm/account.h +++ b/fscomm/account.h @@ -12,6 +12,7 @@ #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[] = { @@ -23,7 +24,8 @@ static QString fscomm_gw_state_names[] = { QString("Failed"), QString("Failed"), QString("Expired"), - QString("Not applicable") + QString("Not applicable"), + QString("Not available") }; class Account { diff --git a/fscomm/fshost.cpp b/fscomm/fshost.cpp index 9533806e87..63b8e04c58 100644 --- a/fscomm/fshost.cpp +++ b/fscomm/fshost.cpp @@ -341,16 +341,9 @@ void FSHost::generalEventHandler(switch_event_t *event) { QString state = switch_event_get_header_nil(event, "State"); QString gw = switch_event_get_header_nil(event, "Gateway"); - QSharedPointer acc; - if (!_accounts.contains(gw)) - { - Account * accPtr = new Account(gw); - acc = QSharedPointer(accPtr); - _accounts.insert(gw, acc); - emit newAccount(acc); - } - else - acc = _accounts.value(gw); + QSharedPointer acc = _accounts.value(gw); + if (acc.isNull()) + return; if (state == "TRYING") { acc.data()->setState(FSCOMM_GW_STATE_TRYING); @@ -381,10 +374,20 @@ void FSHost::generalEventHandler(switch_event_t *event) emit accountStateChange(acc); } } - else if (strcmp(event->subclass_name, "fscomm::acc_removed") == 0) + else if (strcmp(event->subclass_name, "sofia::gateway_add") == 0) { - QSharedPointer acc = _accounts.take(switch_event_get_header_nil(event, "acc_name")); - emit delAccount(acc); + QString gw = switch_event_get_header_nil(event, "Gateway"); + Account * accPtr = new Account(gw); + QSharedPointer acc = QSharedPointer(accPtr); + acc.data()->setState(FSCOMM_GW_STATE_NOAVAIL); + _accounts.insert(gw, acc); + emit newAccount(acc); + } + else if (strcmp(event->subclass_name, "sofia::gateway_del") == 0) + { + QSharedPointer acc = _accounts.take(switch_event_get_header_nil(event, "Gateway")); + if (!acc.isNull()) + emit delAccount(acc); } else { diff --git a/fscomm/preferences/accountdialog.cpp b/fscomm/preferences/accountdialog.cpp index 3010d7f1f5..44cfb08143 100644 --- a/fscomm/preferences/accountdialog.cpp +++ b/fscomm/preferences/accountdialog.cpp @@ -111,6 +111,18 @@ void AccountDialog::writeConfig() _settings->beginGroup("FreeSWITCH/conf/sofia.conf/profiles/profile/gateways"); _settings->beginGroup(_accId); + + if (!g_FSHost.getAccountByUUID(_accId).isNull()) + { + QString res; + QString arg = QString("profile softphone killgw %1").arg(g_FSHost.getAccountByUUID(_accId).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", + g_FSHost.getAccountByUUID(_accId).data()->getName().toAscii().data()); + } + } _settings->beginGroup("gateway/attrs"); _settings->setValue("name", ui->sofiaGwNameEdit->text()); diff --git a/fscomm/preferences/prefaccounts.cpp b/fscomm/preferences/prefaccounts.cpp index 929b36baea..c551a11f6b 100644 --- a/fscomm/preferences/prefaccounts.cpp +++ b/fscomm/preferences/prefaccounts.cpp @@ -13,11 +13,6 @@ PrefAccounts::PrefAccounts(Ui::PrefDialog *ui) : connect(_ui->sofiaGwEditBtn, SIGNAL(clicked()), this, SLOT(editAccountBtnClicked())); _ui->accountsTable->horizontalHeader()->setStretchLastSection(true); - - if (switch_event_reserve_subclass(FSCOMM_EVENT_ACC_REMOVED) != SWITCH_STATUS_SUCCESS) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't register subclass!\n"); - } - } void PrefAccounts::addAccountBtnClicked() @@ -97,9 +92,14 @@ void PrefAccounts::remAccountBtnClicked() QSharedPointer acc = g_FSHost.getAccountByUUID(item->data(Qt::UserRole).toString()); if (!acc.isNull()) { - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "acc_name", acc.data()->getName().toAscii().data()); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "acc_uuid", acc.data()->getUUID().toAscii().data()); - switch_event_fire(&event); + 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()); + } } } _ui->accountsTable->removeRow(row-offset); @@ -108,16 +108,7 @@ void PrefAccounts::remAccountBtnClicked() } if (offset > 0) - { - QString res; - _settings->sync(); - 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; - } - readConfig(); - } + readConfig(false); } void PrefAccounts::writeConfig() @@ -125,7 +116,7 @@ void PrefAccounts::writeConfig() return; } -void PrefAccounts::readConfig() +void PrefAccounts::readConfig(bool reload) { _ui->accountsTable->clearContents(); @@ -155,12 +146,15 @@ void PrefAccounts::readConfig() _settings->endGroup(); - QString res; - _settings->sync(); - if (g_FSHost.sendCmd("sofia", "profile softphone rescan", &res) != SWITCH_STATUS_SUCCESS) + if (reload) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not rescan the softphone profile.\n"); - return; + QString res; + _settings->sync(); + 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; + } } if (_ui->accountsTable->rowCount() == 1) diff --git a/fscomm/preferences/prefaccounts.h b/fscomm/preferences/prefaccounts.h index 7d98b571d3..e995cab208 100644 --- a/fscomm/preferences/prefaccounts.h +++ b/fscomm/preferences/prefaccounts.h @@ -16,7 +16,7 @@ public: void writeConfig(); public slots: - void readConfig(); + void readConfig(bool reload=true); private slots: void addAccountBtnClicked();