⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 settingsdialog.cxx

📁 这是一个开源码的sip用户代理 写的都很清楚是用C++语言开发的 对于研究sip协议的朋友绝对是有很好的参考价值
💻 CXX
字号:
/* *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU Library General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *//* Copyright (C) 2004  * * Authors: Erik Eliasson <eliasson@it.kth.se> *          Johan Bilien <jobi@via.ecp.fr>*/#include"SettingsDialog.h"#include"CertificateDialog.h"#include"AccountsList.h"#include"../../../sip/SipSoftPhoneConfiguration.h"#ifdef OLDLIBGLADEMM#define SLOT(a,b) SigC::slot(a,b)#define BIND SigC::bind#else#define SLOT(a,b) sigc::mem_fun(a,b)#define BIND sigc::bind#endifSettingsDialog::SettingsDialog( Glib::RefPtr<Gnome::Glade::Xml>  refXml,		                CertificateDialog * certificateDialog){	this->certificateDialog = certificateDialog;	refXml->get_widget( "settingsDialog", dialogWindow );	Gtk::Button * settingsOkButton;	Gtk::Button * settingsCancelButton;		/* Connect the Ok and cancel buttons */		refXml->get_widget( "settingsOkButton", settingsOkButton );	refXml->get_widget( "settingsCancelButton", settingsCancelButton );	settingsOkButton->signal_clicked().connect( SLOT( *this, &SettingsDialog::accept ) );	settingsCancelButton->signal_clicked().connect( SLOT( *this, &SettingsDialog::reject ) );	refXml->get_widget( "certificateButton", certificateButton );	certificateButton->signal_clicked().connect( SLOT( *certificateDialog, &CertificateDialog::run ) );		generalSettings = new GeneralSettings( refXml );	securitySettings = new SecuritySettings( refXml );	advancedSettings = new AdvancedSettings( refXml );	dialogWindow->hide();#ifdef IPAQ//	dialogWindow->maximize();	dialogWindow->set_type_hint( Gdk::WINDOW_TYPE_HINT_NORMAL );#endif}SettingsDialog::~SettingsDialog(){	delete generalSettings;	delete securitySettings;	delete advancedSettings;}void SettingsDialog::setConfig( MRef<SipSoftPhoneConfiguration *> config ){	this->config = config;	generalSettings->setConfig( config );	securitySettings->setConfig( config );	advancedSettings->setConfig( config );	}int SettingsDialog::run(){	int ret = dialogWindow->run();	dialogWindow->hide();	return ret;}void SettingsDialog::show(){	dialogWindow->show();//	dialogWindow->hide();}void SettingsDialog::accept(){	string warning( "" );	warning += generalSettings->apply();	warning += securitySettings->apply();	warning += advancedSettings->apply();		config->save();	if( warning != "" ){#ifdef OLDLIBGLADEMM		Gtk::MessageDialog messageDialog( warning, 				Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, 				/* use markup */false,				/* Modal */true );#else		Gtk::MessageDialog messageDialog( warning,				/* use markup */false, 				Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK,				/* Modal */ true );#endif		messageDialog.run();	}		dialogWindow->response( Gtk::RESPONSE_OK );	dialogWindow->hide();}void SettingsDialog::reject(){	dialogWindow->response( Gtk::RESPONSE_CANCEL );	dialogWindow->hide();}GeneralSettings::GeneralSettings( Glib::RefPtr<Gnome::Glade::Xml>  refXml ):		accountsList( new AccountsList( new AccountsListColumns ) ){	refXml->get_widget( "accountsTreeView", accountsTreeView );	if( accountsTreeView == NULL ){		exit( 1 );	}		refXml->get_widget( "accountsAddButton", accountsAddButton );	if( accountsAddButton == NULL ){		exit( 1 );	}	refXml->get_widget( "accountsRemoveButton", accountsRemoveButton );	if( accountsRemoveButton == NULL ){		exit( 1 );	}		refXml->get_widget( "accountsEditButton", accountsEditButton );	if( accountsEditButton == NULL ){		exit( 1 );	}		refXml->get_widget( "defaultButton", defaultButton );	if( defaultButton == NULL ){		exit( 1 );	}		refXml->get_widget( "pstnButton", pstnButton );	if( pstnButton == NULL ){		exit( 1 );	}		refXml->get_widget( "soundEntry", soundEntry );	if( soundEntry == NULL ){		exit( 1 );	}	accountsTreeView->set_headers_visible( true );	accountsTreeView->set_rules_hint( true );	accountsList->setTreeView( accountsTreeView );	accountsAddButton->signal_clicked().connect( SLOT( *accountsList, &AccountsList::addAccount ) );	accountsEditButton->signal_clicked().connect( 			SLOT( *this, &GeneralSettings::editAccount ));	accountsRemoveButton->signal_clicked().connect( 			SLOT( *this, &GeneralSettings::removeAccount ));	defaultButton->signal_clicked().connect( 			SLOT( *this, &GeneralSettings::setDefaultAccount ));	pstnButton->signal_clicked().connect( 			SLOT( *this, &GeneralSettings::setPstnAccount ));#ifdef IPAQ	// Make the buttons smaller to fit the screen	defaultButton->set_label( "Default" );	pstnButton->set_label( "PSTN" );#endif}void GeneralSettings::editAccount(){	if( accountsTreeView->get_selection()->get_selected() ){		accountsList->editAccount( accountsTreeView->get_selection()->get_selected() );	}}void GeneralSettings::removeAccount(){	if( accountsTreeView->get_selection()->get_selected() ){#ifdef OLDLIBGLADEMM		Gtk::MessageDialog dialog( "Are you sure you want to erase "			"this account?", 			Gtk::MESSAGE_QUESTION, 			Gtk::BUTTONS_YES_NO, true, false );#else		Gtk::MessageDialog dialog( "Are you sure you want to erase "			"this account?", 			/* use markup*/false,			Gtk::MESSAGE_QUESTION, 			Gtk::BUTTONS_YES_NO, 			/* Modal */true );#endif		if( dialog.run() == Gtk::RESPONSE_YES ){			accountsList->erase( 			accountsTreeView->get_selection()->get_selected() );		}	}}void GeneralSettings::setDefaultAccount(){	if( accountsTreeView->get_selection()->get_selected() ){		accountsList->setDefaultAccount(  accountsTreeView->get_selection()->get_selected() );	}}void GeneralSettings::setPstnAccount(){	if( accountsTreeView->get_selection()->get_selected() ){		accountsList->setPstnAccount(  accountsTreeView->get_selection()->get_selected() );	}}void GeneralSettings::setConfig( MRef<SipSoftPhoneConfiguration *> config ){	this->config = config;	accountsList->loadFromConfig( config );	soundEntry->set_text( config->soundDevice );}string GeneralSettings::apply(){	string err;	err += accountsList->saveToConfig( config );	config->soundDevice = soundEntry->get_text();	return err;}SecuritySettings::SecuritySettings( Glib::RefPtr<Gnome::Glade::Xml>  refXml ){		refXml->get_widget( "dhCheck", dhCheck );	refXml->get_widget( "pskCheck", pskCheck );	refXml->get_widget( "pskEntry", pskEntry );	refXml->get_widget( "secureCheck", secureCheck );		refXml->get_widget( "secureTable", secureTable );		refXml->get_widget( "kaEntry", kaEntry );	refXml->get_widget( "kaCombo", kaCombo );	refXml->get_widget( "pskBox", pskBox );		dhCheck->signal_toggled().connect( SLOT( 		*this, &SecuritySettings::kaChange ) );		pskCheck->signal_toggled().connect( SLOT( 		*this, &SecuritySettings::kaChange ) );	secureCheck->signal_toggled().connect( SLOT( 		*this, &SecuritySettings::secureChange ) );		//kaCombo->set_value_in_list( true );	kaEntry->set_editable( false );	}void SecuritySettings::setConfig( MRef<SipSoftPhoneConfiguration *> config ){ 	this->config = config;	dhCheck->set_active( config->securityConfig.dh_enabled );	pskCheck->set_active( config->securityConfig.psk_enabled );	string psk( (const char *)config->securityConfig.psk, config->securityConfig.psk_length );	pskEntry->set_text( psk );	if( config->securityConfig.ka_type == KEY_MGMT_METHOD_MIKEY_DH ){		kaEntry->set_text( "Diffie-Hellman" );	}	else if( config->securityConfig.ka_type == KEY_MGMT_METHOD_MIKEY_PSK ){		kaEntry->set_text( "Pre-shared key" );	}	secureCheck->set_active( config->securityConfig.secured );		kaChange();	secureChange();}void SecuritySettings::kaChange(){	pskBox->set_sensitive( pskCheck->get_active() );		secureCheck->set_sensitive( pskCheck->get_active() 			|| dhCheck->get_active() );	if( !( pskCheck->get_active() || dhCheck->get_active() ) ){		secureCheck->set_active( false );	}	kaCombo->set_sensitive( pskCheck->get_active()			     || dhCheck->get_active() );		std::list<string> list;	if( dhCheck->get_active() ){		list.push_back( "Diffie-Hellman" );	}	if( pskCheck->get_active() ){		list.push_back( "Pre-shared key" );	}	if( list.size() > 0 ){		kaCombo->set_popdown_strings( list );	}}void SecuritySettings::secureChange(){	secureTable->set_sensitive( secureCheck->get_active() );}string SecuritySettings::apply(){	string err;	if( dhCheck->get_active() ){		config->securityConfig.cert->lock();		if( config->securityConfig.cert->is_empty() ){			err += "You have selected the Diffie-Hellman key agreement\n"		       "but have not selected a certificate file.\n"		       "The D-H key agreement has been disabled.";			dhCheck->set_active( false );		}				else if( !config->securityConfig.cert->get_first()->get_openssl_private_key() ){			err += "You have selected the Diffie-Hellman key agreement\n"		       "but have not selected a private key file.\n"		       "The D-H key agreement has been disabled.";			dhCheck->set_active( false );		}		config->securityConfig.cert->unlock();	}	config->securityConfig.dh_enabled = dhCheck->get_active();	config->securityConfig.psk_enabled = pskCheck->get_active();	string s = pskEntry->get_text();        const unsigned char * psk = (const unsigned char *)s.c_str();        unsigned int psk_length = s.size();        if( config->securityConfig.psk != NULL )                delete [] config->securityConfig.psk;        config->securityConfig.psk = new unsigned char[psk_length];        memcpy( config->securityConfig.psk, psk, psk_length );        config->securityConfig.psk_length = psk_length;	config->securityConfig.secured = secureCheck->get_active();	if( config->inherited.sipIdentity ){		config->inherited.sipIdentity->securitySupport = secureCheck->get_active();	}	if( config->securityConfig.secured ){		if( kaEntry->get_text() == "Pre-shared key" ){			config->securityConfig.ka_type = KEY_MGMT_METHOD_MIKEY_PSK;		}		else if( kaEntry->get_text() == "Diffie-Hellman" ){			config->securityConfig.ka_type = KEY_MGMT_METHOD_MIKEY_DH;		}	}	return err;}AdvancedSettings::AdvancedSettings( Glib::RefPtr<Gnome::Glade::Xml>  refXml ){		refXml->get_widget( "udpSpin", udpSpin );	refXml->get_widget( "tcpSpin", tcpSpin );	refXml->get_widget( "tlsSpin", tlsSpin );		refXml->get_widget( "tcpCheck", tcpCheck );	refXml->get_widget( "tlsCheck", tlsCheck );	refXml->get_widget( "transportEntry", transportEntry );	refXml->get_widget( "transportCombo", transportCombo );		refXml->get_widget( "stunCheck", stunCheck );	refXml->get_widget( "stunAutodetectCheck", stunAutodetectCheck );	refXml->get_widget( "stunEntry", stunEntry );		tcpCheck->signal_toggled().connect( SLOT( 		*this, &AdvancedSettings::transportChange ) );	tlsCheck->signal_toggled().connect( SLOT( 		*this, &AdvancedSettings::transportChange ) );		stunAutodetectCheck->signal_toggled().connect( SLOT( 		*this, &AdvancedSettings::stunAutodetectChange ) );	transportCombo->set_value_in_list( true );	}void AdvancedSettings::setConfig( MRef<SipSoftPhoneConfiguration *> config ){ 	this->config = config;	udpSpin->set_value( config->inherited.localUdpPort );	tcpSpin->set_value( config->inherited.localTcpPort );	tlsSpin->set_value( config->inherited.localTlsPort );	tcpCheck->set_active( config->tcp_server );	tlsCheck->set_active( config->tls_server );	transportChange();	transportEntry->set_text( config->inherited.transport );	stunCheck->set_active( config->useSTUN );	stunAutodetectCheck->set_active( config->useUserDefinedStunServer );	stunEntry->set_text( config->userDefinedStunServer );}void AdvancedSettings::transportChange(){	tlsSpin->set_sensitive( tlsCheck->get_active() );	tcpSpin->set_sensitive( tcpCheck->get_active() );		std::list<string> list;	list.push_back( "UDP" );	if( tcpCheck->get_active() ){		list.push_back( "TCP" );	}	if( tlsCheck->get_active() ){		list.push_back( "TLS" );	}	transportCombo->set_popdown_strings( list );	transportCombo->set_sensitive( list.size() > 1 );	stunAutodetectChange();}void AdvancedSettings::stunAutodetectChange(){	stunEntry->set_sensitive( !stunAutodetectCheck->get_active() );	if( stunAutodetectCheck->get_active() ){		stunEntry->set_text( "" );	}}string AdvancedSettings::apply(){	config->inherited.localUdpPort = udpSpin->get_value_as_int();	config->inherited.localTcpPort = tcpSpin->get_value_as_int();	config->inherited.localTlsPort = tlsSpin->get_value_as_int();	config->tcp_server = tcpCheck->get_active();	config->tls_server = tlsCheck->get_active();	config->inherited.transport = transportEntry->get_text();	config->useSTUN = stunCheck->get_active();	config->useUserDefinedStunServer = stunAutodetectCheck->get_active()		&& stunEntry->get_text() != "";	config->userDefinedStunServer = stunEntry->get_text();		return "";}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -