/*************************************************************************** smb4tdeconfigdialog - The configuration dialog of Smb4K ------------------- begin : Sa Apr 14 2007 copyright : (C) 2007 by Alexander Reinholdt email : dustpuppy@users.berlios.de ***************************************************************************/ /*************************************************************************** * 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 * * 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., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301 USA * ***************************************************************************/ // TQt includes #include #include // KDE includes #include #include #include #include #include // system specific includes #include #include // application specific includes #include "smb4tdeconfigdialog.h" #include "smb4kuserinterfaceoptions.h" #include "smb4knetworkoptions.h" #include "smb4kshareoptions.h" #include "smb4kauthoptions.h" #include "smb4ksuperuseroptions.h" #include "smb4ksambaoptions.h" #include "smb4tdersyncoptions.h" #include "../core/smb4ksettings.h" #include "../core/smb4tdeglobal.h" #include "../core/smb4ksambaoptionsinfo.h" #include "../core/smb4ksambaoptionshandler.h" #include "../core/smb4kcore.h" #include "../core/smb4kauthinfo.h" #include "../core/smb4kpasswordhandler.h" using namespace Smb4TDEGlobal; TDEInstance *Smb4TDEConfigDialogFactory::m_instance = 0L; TDEAboutData *Smb4TDEConfigDialogFactory::m_about = 0L; // Variables we need to determine if super user entries // have to be written to /etc/sudoers or /etc/super.tab bool use_sudo = false; bool use_super = false; #ifdef __linux__ bool force_unmount = false; #endif bool always_use_su = false; // Use this variable to determine if the dialog should be // closed after Smb4KFileIO::finished() was emitted. bool close_dialog = false; Smb4TDEConfigDialog::Smb4TDEConfigDialog( Smb4KSettings *settings, TQWidget *parent, const char *name ) : TDEConfigDialog( parent, name, settings ) { // FIXME: I guess, normally we would not need to close destructively, // but at the moment there are issues with the KURLRequester in file // mode. To work around those, we are closing the dialog destructively. // Maybe we can remove this if we moved to KDE4. setWFlags( TQt::WDestructiveClose ); // Add the pages: Smb4KUserInterfaceOptions *interface_options = new Smb4KUserInterfaceOptions( this, "UserInterfaceOptions" ); Smb4KNetworkOptions* network_options = new Smb4KNetworkOptions( this, "NetworkOptions" ); Smb4KShareOptions *share_options= new Smb4KShareOptions( this, "ShareOptions" ); Smb4KAuthOptions *auth_options = new Smb4KAuthOptions( this, "AuthenticationOptions" ); Smb4KSambaOptions *samba_options = new Smb4KSambaOptions( this, "SambaOptions" ); Smb4KRsyncOptions *rsync_options = new Smb4KRsyncOptions( this, "SynchronizationOptions" ); Smb4KSuperUserOptions *super_user_options = new Smb4KSuperUserOptions( this, "SuperUserOptions" ); // Disable widgets if the respective programs are not installed. if ( Smb4KSettings::rsync().isEmpty() ) { rsync_options->setEnabled( false ); } if ( Smb4KSettings::sudo().isEmpty() && Smb4KSettings::super().isEmpty() ) { super_user_options->setEnabled( false ); } else { // The search for the programs and all related actions have been // done by the core. We only need to disable widgets here. if ( Smb4KSettings::sudo().isEmpty() ) { TQRadioButton *sudo = static_cast( TQT_TQWIDGET(super_user_options->child( "SudoButton", TQRADIOBUTTON_OBJECT_NAME_STRING, true )) ); if ( sudo ) { sudo->setEnabled( false ); } } else if ( Smb4KSettings::super().isEmpty() ) { TQRadioButton *super = static_cast( TQT_TQWIDGET(super_user_options->child( "SuperButton", TQRADIOBUTTON_OBJECT_NAME_STRING, true )) ); if ( super ) { super->setEnabled( false ); } } else { // Do nothing } } // There are a few settings we need to the initial values of. // Initialize them here: switch ( Smb4KSettings::superUserProgram() ) { case Smb4KSettings::EnumSuperUserProgram::Sudo: { use_sudo = true; break; } case Smb4KSettings::EnumSuperUserProgram::Super: { use_super = true; break; } default: { break; } } #ifdef __linux__ force_unmount = Smb4KSettings::useForceUnmount(); #endif always_use_su = Smb4KSettings::alwaysUseSuperUser(); // Now add the pages to the configuration dialog addPage( interface_options, i18n( "User Interface" ), "view_choose" ); addPage( network_options, i18n( "Network" ), "network" ); addPage( share_options, i18n( "Shares" ), "hdd_mount" ); addPage( auth_options, i18n( "Authentication" ), "identity" ); addPage( samba_options, i18n( "Samba" ), "samba" ); addPage( rsync_options, i18n( "Synchronization" ), "bottom" ); addPage( super_user_options, i18n( "Super User" ), "penguin" ); // Stuff that's not managed by TDEConfig XT is loaded by // Smb4TDEConfigDialog::showEvent()! // Resize the dialog setInitialSize( configDialogSize( *(Smb4KSettings::self()->config()), "ConfigDialog" ) ); // Connections connect( samba_options, TQT_SIGNAL( customSettingsChanged() ), this, TQT_SLOT( slotCustomSambaSettingsChanged() ) ); connect( super_user_options, TQT_SIGNAL( removeEntries() ), this, TQT_SLOT( slotRemoveSuperUserEntries() ) ); connect( Smb4KCore::fileIO(), TQT_SIGNAL( failed() ), this, TQT_SLOT( slotReceivedFileIOFailed() ) ); connect( Smb4KCore::fileIO(), TQT_SIGNAL( finished() ), this, TQT_SLOT( slotReceivedFileIOFinished() ) ); } Smb4TDEConfigDialog::~Smb4TDEConfigDialog() { } void Smb4TDEConfigDialog::loadCustomSambaOptions() { // Get the list view: TDEListView *custom_list = static_cast( TQT_TQWIDGET(child( "CustomOptionsList", "TDEListView", true )) ); if ( !custom_list ) { return; } // First of all clear the list view: custom_list->clear(); // Now get the default values: TQString default_filesystem, protocol_hint, default_uid, default_gid; bool write_access = true; switch( Smb4KSettings::filesystem() ) { case Smb4KSettings::EnumFilesystem::CIFS: { default_filesystem = "cifs"; break; } case Smb4KSettings::EnumFilesystem::SMBFS: { default_filesystem = "smbfs"; break; } default: { // FIXME: Set default_filesystem to "cifs"? break; } } switch ( Smb4KSettings::protocolHint() ) { case Smb4KSettings::EnumProtocolHint::Automatic: { // In this case the user leaves it to the net // command to determine the right protocol. protocol_hint = TQString(); break; } case Smb4KSettings::EnumProtocolHint::RPC: { protocol_hint = "rpc"; break; } case Smb4KSettings::EnumProtocolHint::RAP: { protocol_hint = "rap"; break; } case Smb4KSettings::EnumProtocolHint::ADS: { protocol_hint = "ads"; break; } default: { protocol_hint = TQString(); break; } } switch( Smb4KSettings::writeAccess() ) { case Smb4KSettings::EnumWriteAccess::ReadWrite: { write_access = true; break; } case Smb4KSettings::EnumWriteAccess::ReadOnly: { write_access = false; break; } default: { break; } } const TQValueList &list = optionsHandler()->customOptionsList(); for ( TQValueList::ConstIterator it = list.begin(); it != list.end(); ++it ) { // If the only modification is that the share is to be remounted, // we will not put it into the list: if ( (*it)->type() == Smb4KSambaOptionsInfo::Share && (*it)->remount() && (*it)->port() == Smb4KSettings::remotePort() && #ifndef __FreeBSD__ TQString::compare( (*it)->filesystem(), default_filesystem ) == 0 && (*it)->writeAccess() == write_access && (*it)->kerberos() == Smb4KSettings::useKerberos() /* FreeBSD does not know Kerberos for mounting */ && #endif ((TQString::compare( default_filesystem, "cifs" ) == 0 && (*it)->uid().toInt() == (int)getuid()) || (!(*it)->uid().isEmpty() && TQString::compare( (*it)->uid(), Smb4KSettings::userID() ) == 0)) && ((TQString::compare( default_filesystem, "cifs" ) == 0 && (*it)->gid().toInt() == (int)getgid()) || (!(*it)->gid().isEmpty() && TQString::compare( (*it)->gid(), Smb4KSettings::groupID() ) == 0)) ) { continue; } // Now put the item in the list: TDEListViewItem *item = new TDEListViewItem( custom_list ); item->setText( Smb4KSambaOptions::ItemName, (*it)->itemName() ); item->setText( Smb4KSambaOptions::Port, ((*it)->port() != -1 ? TQString( "%1" ).arg( (*it)->port() ) : TQString( "%1" ).arg( Smb4KSettings::remotePort() )) ); switch ( (*it)->type() ) { case Smb4KSambaOptionsInfo::Host: { item->setText( Smb4KSambaOptions::Protocol, !(*it)->protocol().isEmpty() ? (TQString::compare( (*it)->protocol(), "auto" ) == 0 ? i18n( "auto" ) : (*it)->protocol().upper()) : (protocol_hint.isEmpty() ? i18n( "auto" ) : protocol_hint.upper()) ); item->setText( Smb4KSambaOptions::Kerberos, (*it)->kerberos() ? i18n( "yes" ) : i18n( "no" ) ); #ifndef __FreeBSD__ item->setText( Smb4KSambaOptions::FileSystem, "-" ); item->setText( Smb4KSambaOptions::WriteAccess, "-" ); #endif item->setText( Smb4KSambaOptions::UID, "-" ); item->setText( Smb4KSambaOptions::GID, "-" ); break; } case Smb4KSambaOptionsInfo::Share: { item->setText( Smb4KSambaOptions::Protocol, "-" ); #ifndef __FreeBSD__ item->setText( Smb4KSambaOptions::Kerberos, (*it)->kerberos() ? i18n( "yes" ) : i18n( "no" ) ); item->setText( Smb4KSambaOptions::FileSystem, !(*it)->filesystem().isEmpty() ? (*it)->filesystem().upper() : default_filesystem.upper() ); item->setText( Smb4KSambaOptions::WriteAccess, (*it)->writeAccess() ? i18n( "read-write" ) : i18n( "read-only" ) ); #else // FreeBSD does not know Kerberos for mounting item->setText( Smb4KSambaOptions::Kerberos, "-" ); #endif item->setText( Smb4KSambaOptions::UID, !(*it)->uid().isEmpty() ? (*it)->uid() : Smb4KSettings::userID() ); item->setText( Smb4KSambaOptions::GID, !(*it)->gid().isEmpty() ? (*it)->gid() : Smb4KSettings::groupID() ); break; } default: { break; } } } Smb4KSambaOptions *samba_options = static_cast( TQT_TQWIDGET(child( "SambaOptions", "Smb4KSambaOptions", true )) ); if ( samba_options ) { samba_options->resetCustomTab(); } } void Smb4TDEConfigDialog::saveCustomSambaOptions() { // Get the list view: TDEListView *custom_list = static_cast( TQT_TQWIDGET(child( "CustomOptionsList", "TDEListView", true )) ); if ( !custom_list ) { return; } if ( custom_list->childCount() != 0 ) { // First remove all items that have been deleted in the // configuration dialog: TQValueList list = optionsHandler()->customOptionsList(); for ( TQValueList::Iterator it = list.begin(); it != list.end(); ++it ) { if ( !custom_list->findItem( (*it)->itemName(), Smb4KSambaOptions::ItemName ) ) { optionsHandler()->removeItem( (*it)->itemName(), false ); continue; } else { continue; } } // Now updated the remaining items: TQListViewItemIterator it( custom_list ); while ( it.current() ) { TQListViewItem *item = it.current(); Smb4KSambaOptionsInfo *info = optionsHandler()->findItem( item->text( Smb4KSambaOptions::ItemName ) ); if ( info ) { switch( info->type() ) { case Smb4KSambaOptionsInfo::Host: { info->setProtocol( (TQString::compare( item->text( Smb4KSambaOptions::Protocol ), "-" ) != 0 ? item->text( Smb4KSambaOptions::Protocol ).lower() : TQString()) ); info->setKerberos( (TQString::compare( item->text( Smb4KSambaOptions::Kerberos ), i18n( "yes" ) ) == 0) ); info->setPort( item->text( Smb4KSambaOptions::Port ).toInt() ); break; } case Smb4KSambaOptionsInfo::Share: { #ifndef __FreeBSD__ // FreeBSD does not know Kerberos for mounting info->setKerberos( (TQString::compare( item->text( Smb4KSambaOptions::Kerberos ), i18n( "yes" ) ) == 0) ); info->setFilesystem( (TQString::compare( item->text( Smb4KSambaOptions::FileSystem ), "-" ) != 0 ? item->text( Smb4KSambaOptions::FileSystem ).lower() : TQString()) ); info->setWriteAccess( (TQString::compare( item->text( Smb4KSambaOptions::WriteAccess ), i18n( "read-write" ) ) == 0) ); #endif info->setUID( (TQString::compare( item->text( Smb4KSambaOptions::UID ), i18n( "default" ) ) != 0 && TQString::compare( item->text( Smb4KSambaOptions::UID ), "-" ) != 0) ? item->text( Smb4KSambaOptions::UID ) : TQString() ); info->setGID( (TQString::compare( item->text( Smb4KSambaOptions::GID ), i18n( "default" ) ) != 0 && TQString::compare( item->text( Smb4KSambaOptions::GID ), "-" ) != 0) ? item->text( Smb4KSambaOptions::GID ) : TQString() ); info->setPort( item->text( Smb4KSambaOptions::Port ).toInt() ); break; } default: { break; } } } else { // We do not have this case. } ++it; } } else { // Remove all items, if the list view is empty: TQValueList list = optionsHandler()->customOptionsList(); for ( TQValueList::Iterator it = list.begin(); it != list.end(); ++it ) { if ( !(*it)->remount() ) { optionsHandler()->removeItem( (*it)->itemName(), false ); continue; } else { continue; } } } optionsHandler()->sync(); } void Smb4TDEConfigDialog::loadAuthenticationData() { // Load the default login info and put it into the configuration // page: Smb4KAuthInfo auth( TQString::null, TQString::null, TQString::null ); (void) passwordHandler()->readDefaultAuth( &auth ); KLineEdit *default_user = static_cast( TQT_TQWIDGET(child( "DefaultUserName", "KLineEdit", true )) ); if ( default_user ) { default_user->setText( auth.user() ); } KLineEdit *default_pass = static_cast( TQT_TQWIDGET(child( "DefaultPassword", "KLineEdit", true )) ); if ( default_pass ) { default_pass->setText( auth.password() ); } } void Smb4TDEConfigDialog::saveAuthenticationData() { // Read the default login info from the configuration page // and pass it to the password handler, but only if the wallet // is open at this time. Otherwise we could end up with empty // entries: if ( passwordHandler()->walletIsOpen() ) { Smb4KAuthInfo auth( TQString::null, TQString::null, TQString::null ); KLineEdit *default_user = static_cast( TQT_TQWIDGET(child( "DefaultUserName", "KLineEdit", true )) ); if ( default_user ) { auth.setUser( default_user->text() ); } KLineEdit *default_pass = static_cast( TQT_TQWIDGET(child( "DefaultPassword", "KLineEdit", true )) ); if ( default_pass ) { auth.setPassword( default_pass->text() ); } passwordHandler()->writeDefaultAuth( &auth ); } else { // Do nothing } } bool Smb4TDEConfigDialog::writeSuperUserEntries() { TQRadioButton *sudo = static_cast( TQT_TQWIDGET(child( "SudoButton", TQRADIOBUTTON_OBJECT_NAME_STRING, true )) ); TQRadioButton *super = static_cast( TQT_TQWIDGET(child( "SuperButton", TQRADIOBUTTON_OBJECT_NAME_STRING, true )) ); #ifdef __linux__ TQCheckBox *force = static_cast( TQT_TQWIDGET(child( "kcfg_UseForceUnmount", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); #endif TQCheckBox *full_use = static_cast( TQT_TQWIDGET(child( "kcfg_AlwaysUseSuperUser", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); // Check if we need to write anything at all: Smb4KFileIO::Operation op = Smb4KFileIO::NoOperation; bool success = true; #ifdef __linux__ if ( sudo && super && force && full_use ) #else if ( sudo && super && full_use ) #endif { if ( sudo->isChecked() ) { #ifdef __linux__ if ( (!use_sudo && (force->isChecked() || full_use->isChecked())) || (use_sudo && ((force->isChecked() && force_unmount != force->isChecked()) || (full_use->isChecked() && always_use_su != full_use->isChecked()))) ) #else if ( (!use_sudo && full_use->isChecked()) || (use_sudo && (full_use->isChecked() && always_use_su != full_use->isChecked())) ) #endif { success = Smb4KCore::fileIO()->writeSudoers( (op = Smb4KFileIO::Insert) ); } } else if ( super->isChecked() ) { #ifdef __linux__ if ( (!use_super && (force->isChecked() || full_use->isChecked())) || (use_super && ((force->isChecked() && force_unmount != force->isChecked()) || (full_use->isChecked() && always_use_su != full_use->isChecked()))) ) #else if ( (!use_super && full_use->isChecked()) || (use_super && (full_use->isChecked() && always_use_su != full_use->isChecked())) ) #endif { success = Smb4KCore::fileIO()->writeSuperTab( (op = Smb4KFileIO::Insert) ); } } else { // Do nothing } use_sudo = sudo->isChecked(); use_super = super->isChecked(); #ifdef __linux__ force_unmount = force->isChecked(); #endif always_use_su = full_use->isChecked(); } else { // Do nothing } return (!success || op == Smb4KFileIO::NoOperation) ? false : true; } void Smb4TDEConfigDialog::removeSuperUserEntries() { TQRadioButton *sudo = static_cast( TQT_TQWIDGET(child( "SudoButton", TQRADIOBUTTON_OBJECT_NAME_STRING, true )) ); TQRadioButton *super = static_cast( TQT_TQWIDGET(child( "SuperButton", TQRADIOBUTTON_OBJECT_NAME_STRING, true )) ); #ifdef __linux__ TQCheckBox *force = static_cast( TQT_TQWIDGET(child( "kcfg_UseForceUnmount", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); #endif TQCheckBox *full_use = static_cast( TQT_TQWIDGET(child( "kcfg_AlwaysUseSuperUser", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); #ifdef __linux__ if ( sudo && super && force && full_use ) #else if ( sudo && super && full_use ) #endif { if ( sudo->isChecked() ) { Smb4KCore::fileIO()->writeSudoers( Smb4KFileIO::Remove ); } else if ( super->isChecked() ) { Smb4KCore::fileIO()->writeSuperTab( Smb4KFileIO::Remove ); } else { // Do nothing } #ifdef __linux__ force->setChecked( false ); #endif full_use->setChecked( false ); use_sudo = sudo->isChecked(); use_super = super->isChecked(); #ifdef __linux__ force_unmount = force->isChecked(); #endif always_use_su = full_use->isChecked(); } else { // Do nothing } } bool Smb4TDEConfigDialog::checkSettings() { bool ok = true; TQString issues = TQString(); int index = 0; // If the user chose "Query custom master browser" in the // "Network" tab, there must be a master browser present: TQRadioButton *query_custom_master = static_cast( TQT_TQWIDGET(child( "CustomMasterBrowserLabel", TQRADIOBUTTON_OBJECT_NAME_STRING, true )) ); KLineEdit *custom_master_input = static_cast( TQT_TQWIDGET(child( "kcfg_CustomMasterBrowser", "KLineEdit", true )) ); if ( query_custom_master && custom_master_input && query_custom_master->isChecked() && custom_master_input->text().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Network] The custom master browser has not been entered.\n" ) ); } // If the user chose "Scan broadcast areas" in the // "Network" tab, there must broadcast areas present: TQRadioButton *scan_bcast_areas = static_cast( TQT_TQWIDGET(child( "BroadcastAreasLabel", TQRADIOBUTTON_OBJECT_NAME_STRING, true )) ); KLineEdit *bcast_areas_input = static_cast( TQT_TQWIDGET(child( "kcfg_BroadcastAreas", "KLineEdit", true )) ); if ( scan_bcast_areas && bcast_areas_input && scan_bcast_areas->isChecked() && bcast_areas_input->text().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Network] The broadcast areas have not been entered.\n" ) ); } // The mount prefix must not be empty: KURLRequester *mount_prefix = static_cast( TQT_TQWIDGET(child( "kcfg_MountPrefix", "KURLRequester", true )) ); if ( mount_prefix && mount_prefix->url().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Shares] The mount prefix is empty.\n" ) ); } // If the user wants to use a default login, the user // name must not be empty. TQCheckBox *use_default_login = static_cast( TQT_TQWIDGET(child( "kcfg_UseDefaultLogin", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); KLineEdit *default_user_name = static_cast( TQT_TQWIDGET(child( "kcfg_DefaultUserName", "KLineEdit", true )) ); if ( use_default_login && default_user_name && use_default_login->isChecked() && default_user_name->text().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Authentication] The default user name has not been entered.\n" ) ); } // The file mask must not be empty. KLineEdit *file_mask = static_cast( TQT_TQWIDGET(child( "kcfg_FileMask", "KLineEdit", true )) ); if ( file_mask && file_mask->text().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Samba] The file mask is empty.\n" ) ); } // The directory mask must not be empty. KLineEdit *directory_mask = static_cast( TQT_TQWIDGET(child( "kcfg_DirectoryMask", "KLineEdit", true )) ); if ( directory_mask && directory_mask->text().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Samba] The directory mask is empty.\n" ) ); } // The UID must not be empty. KLineEdit *user_id = static_cast( TQT_TQWIDGET(child( "kcfg_UserID", "KLineEdit", true )) ); if ( user_id && user_id->text().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Samba] The UID is empty.\n" ) ); } // The GID must not be empty. KLineEdit *group_id = static_cast( TQT_TQWIDGET(child( "kcfg_GroupID", "KLineEdit", true )) ); if ( group_id && group_id->text().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Samba] The GID is empty.\n" ) ); } // The rsync prefix must not be empty. KURLRequester *rsync_prefix = static_cast( TQT_TQWIDGET(child( "kcfg_RsyncPrefix", "KURLRequester", true )) ); if ( rsync_prefix && rsync_prefix->url().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Synchronization] The rsync prefix is empty.\n" ) ); } // The path where to store partial files must not be empty. TQCheckBox *use_partical_directory = static_cast( TQT_TQWIDGET(child( "kcfg_UsePartialDirectory", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); KURLRequester *partial_directory = static_cast( TQT_TQWIDGET(child( "kcfg_PartialDirectory", "KURLRequester", true )) ); if ( use_partical_directory && use_partical_directory->isChecked() && partial_directory && partial_directory->url().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Synchronization] The directory where partially transferred files should be stored is empty.\n" ) ); } // The the exclude patterns must not be empty. TQCheckBox *use_exclude_pattern = static_cast( TQT_TQWIDGET(child( "kcfg_UseExcludePattern", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); KLineEdit *exclude_pattern = static_cast( TQT_TQWIDGET(child( "kcfg_ExcludePattern", "KLineEdit", true )) ); if ( use_exclude_pattern && use_exclude_pattern->isChecked() && exclude_pattern && exclude_pattern->text().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Synchronization] The exclude patterns have not been entered.\n" ) ); } // The the path of the exclude file must not be empty. TQCheckBox *use_exclude_file = static_cast( TQT_TQWIDGET(child( "kcfg_UseExcludeFrom", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); KURLRequester *exclude_file = static_cast( TQT_TQWIDGET(child( "kcfg_ExcludeFrom", "KURLRequester", true )) ); if ( use_exclude_file && use_exclude_file->isChecked() && exclude_file && exclude_file->url().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Synchronization] The path of the exclude file is empty.\n" ) ); } // The the include patterns must not be empty. TQCheckBox *use_include_pattern = static_cast( TQT_TQWIDGET(child( "kcfg_UseIncludePattern", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); KLineEdit *include_pattern = static_cast( TQT_TQWIDGET(child( "kcfg_IncludePattern", "KLineEdit", true )) ); if ( use_include_pattern && use_include_pattern->isChecked() && include_pattern && include_pattern->text().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Synchronization] The include patterns have not been entered.\n" ) ); } // The the path of the exclude file must not be empty. TQCheckBox *use_include_file = static_cast( TQT_TQWIDGET(child( "kcfg_UseIncludeFrom", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); KURLRequester *include_file = static_cast( TQT_TQWIDGET(child( "kcfg_IncludeFrom", "KURLRequester", true )) ); if ( use_include_file && use_include_file->isChecked() && include_file && include_file->url().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Synchronization] The path of the include file is empty.\n" ) ); } // If you make backups, check that the suffix and that the // backup directory is not empty. TQCheckBox *make_backups = static_cast( TQT_TQWIDGET(child( "kcfg_MakeBackups", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); if ( make_backups && make_backups->isChecked() ) { // The backup suffix must not be empty. TQCheckBox *use_backup_suffix = static_cast( TQT_TQWIDGET(child( "kcfg_UseBackupSuffix", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); KLineEdit *backup_suffix = static_cast( TQT_TQWIDGET(child( "kcfg_BackupSuffix", "KLineEdit", true )) ); if ( use_backup_suffix && use_backup_suffix->isChecked() && backup_suffix && backup_suffix->text().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Synchronization] The backup suffix has not been defined.\n" ) ); } // The the path for backups must not be empty. TQCheckBox *use_backup_dir = static_cast( TQT_TQWIDGET(child( "kcfg_UseBackupDirectory", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); KURLRequester *backup_dir = static_cast( TQT_TQWIDGET(child( "kcfg_BackupDirectory", "KURLRequester", true )) ); if ( use_backup_dir && use_backup_dir->isChecked() && backup_dir && backup_dir->url().stripWhiteSpace().isEmpty() ) { ok = false; index++; issues.append( "* "+i18n( "[Synchronization] The backup directory is empty.\n" ) ); } } if ( !ok ) { if ( index == 1 ) { KMessageBox::error( this, i18n( "The configuration could not be written, because one setting is incomplete:\n%1Please correct this issue." ).arg( issues ) ); } else { KMessageBox::error( this, i18n( "The configuration could not be written, because %1 settings are incomplete:\n%1Please correct these issues." ).arg( index ).arg( issues ) ); } } return ok; } void Smb4TDEConfigDialog::showEvent( TQShowEvent *e ) { // Spontaneous show events come from outside the application. // We do not want to react on them. if ( !e->spontaneous() ) { loadCustomSambaOptions(); loadAuthenticationData(); } } ///////////////////////////////////////////////////////////////////////////// // TQT_SLOT IMPLEMENTATIONS ///////////////////////////////////////////////////////////////////////////// void Smb4TDEConfigDialog::slotApply() { // If some settings are not complete, stop here and give // the user the opportunity to fill in the needed string(s). if ( !checkSettings() ) { return; } saveCustomSambaOptions(); saveAuthenticationData(); if ( writeSuperUserEntries() ) { // Disable this widget until Smb4KFileIO::finished() // is received. setEnabled( false ); } // The 'Apply' button will be disabled by TDEConfigDialog, so we do not // need to do it here. TDEConfigDialog::slotApply(); } void Smb4TDEConfigDialog::slotOk() { // If some settings are not complete, stop here and give // the user the opportunity to fill in the needed string(s). if ( !checkSettings() ) { return; } saveCustomSambaOptions(); saveAuthenticationData(); saveDialogSize( *(Smb4KSettings::self()->config()), "ConfigDialog" ); // If the something needs to be written to either /etc/super.tab // or /etc/sudoers, do not close the dialog but wait until the // Smb4KFileIO::finished() signal is received. if ( !writeSuperUserEntries() ) { TDEConfigDialog::slotOk(); } else { // Disable this widget until Smb4KFileIO::finished() // is received. setEnabled( false ); // Tell Smb4TDEConfigDialog::slotReceivedFileIOFinished() // to close the dialog. close_dialog = true; } } void Smb4TDEConfigDialog::slotCancel() { // Reset the custom Samba options tab: Smb4KSambaOptions *samba_options = static_cast( TQT_TQWIDGET(child( "SambaOptions", "Smb4KSambaOptions", true )) ); if ( samba_options ) { samba_options->resetCustomTab(); } TDEConfigDialog::slotCancel(); } void Smb4TDEConfigDialog::slotCustomSambaSettingsChanged() { // Get the list view and all other input widgets: TDEListView *view = static_cast( TQT_TQWIDGET(child( "CustomOptionsList", "TDEListView", true )) ); if ( !view ) { return; } // Get the list of custom options: TQValueList list = optionsHandler()->customOptionsList(); bool changed = false; // Loop through the list view items to see what changed and if // we need to enable the 'Apply' button: for ( TQValueList::ConstIterator it = list.begin(); it != list.end(); ++it ) { // Find the item in the list view: TQListViewItem *item = view->findItem( (*it)->itemName(), Smb4KSambaOptions::ItemName ); if ( item ) { if ( (*it)->type() == Smb4KSambaOptionsInfo::Host ) { // Check if the protocol changed. if ( ((*it)->protocol().isEmpty() && TQString::compare( item->text( Smb4KSambaOptions::Protocol ).lower(), i18n( "auto" ) ) != 0) || TQString::compare( (*it)->protocol(), item->text( Smb4KSambaOptions::Protocol ).lower() ) != 0 ) { changed = true; break; } } else if ( (*it)->type() == Smb4KSambaOptionsInfo::Share ) { #ifndef __FreeBSD__ // Check if the file system changed. if ( TQString::compare( (*it)->filesystem(), item->text( Smb4KSambaOptions::FileSystem ).lower() ) != 0 ) { changed = true; break; } // Check if the write access changed. TQString write_access = (*it)->writeAccess() ? i18n( "read-write" ) : i18n( "read-only" ); if ( TQString::compare( write_access, item->text( Smb4KSambaOptions::WriteAccess ) ) != 0 ) { changed = true; break; } #endif // Check if the UID changed. if ( ((*it)->uid().isEmpty() && TQString::compare( i18n( "default" ), item->text( Smb4KSambaOptions::UID ) ) != 0) || TQString::compare( (*it)->uid(), item->text( Smb4KSambaOptions::UID ) ) != 0 ) { changed = true; break; } // Check if the GID changed. if ( ((*it)->gid().isEmpty() && TQString::compare( i18n( "default" ), item->text( Smb4KSambaOptions::GID ) ) != 0) || TQString::compare( (*it)->gid(), item->text( Smb4KSambaOptions::GID ) ) != 0 ) { changed = true; break; } } else { // Something went wrong. Stop right here. break; } // Check if the Kerberos entry changed. TQString kerberos = (*it)->kerberos() ? i18n( "yes" ) : i18n( "no" ); if ( TQString::compare( kerberos, item->text( Smb4KSambaOptions::Kerberos ) ) != 0 ) { changed = true; break; } // Check if the port value changed. if ( (*it)->port() != item->text( Smb4KSambaOptions::Port ).toInt() ) { changed = true; break; } } else { break; } } enableButtonApply( changed ); } void Smb4TDEConfigDialog::slotRemoveSuperUserEntries() { // Disable this widget until Smb4KFileIO::finished() // is received. setEnabled( false ); removeSuperUserEntries(); } void Smb4TDEConfigDialog::slotReceivedFileIOFailed() { #ifdef __linux__ TQCheckBox *force = static_cast( TQT_TQWIDGET(child( "kcfg_UseForceUnmount", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); #endif TQCheckBox *full_use = static_cast( TQT_TQWIDGET(child( "kcfg_AlwaysUseSuperUser", TQCHECKBOX_OBJECT_NAME_STRING, true )) ); #ifdef __linux__ if ( force && full_use ) { force->setChecked( false ); #else if ( full_use ) { #endif full_use->setChecked( false ); } } void Smb4TDEConfigDialog::slotReceivedFileIOFinished() { // Enable the widget again. setEnabled( true ); if ( close_dialog ) { TDEConfigDialog::slotOk(); } } ///////////////////////////////////////////////////////////////////////////// // FACTORY STUFF ///////////////////////////////////////////////////////////////////////////// Smb4TDEConfigDialogFactory::Smb4TDEConfigDialogFactory() : KLibFactory() { } Smb4TDEConfigDialogFactory::~Smb4TDEConfigDialogFactory() { delete m_instance; delete m_about; m_instance = 0L; } TDEInstance *Smb4TDEConfigDialogFactory::instance() { if( !m_instance ) { m_about = new TDEAboutData( "smb4tdeconfigdialog", I18N_NOOP( "Smb4TDEConfigDialog" ), "1.0" ); m_about->addAuthor("Alexander Reinholdt", 0, "dustpuppy@users.berlios.de"); m_about->setLicense( TDEAboutData::License_GPL ); m_instance = new TDEInstance( m_about ); } return m_instance; } TQObject *Smb4TDEConfigDialogFactory::createObject( TQObject *parent, const char *name, const char *, const TQStringList & ) { return TQT_TQOBJECT( new Smb4TDEConfigDialog( Smb4KSettings::self(), TQT_TQWIDGET( parent ), name ) ); } ///////////////////////////////////////////////////////////////////////////// // INIT ///////////////////////////////////////////////////////////////////////////// extern "C" { void *init_libsmb4tdeconfigdialog() { TDEGlobal::locale()->insertCatalogue( "smb4k" ); return new Smb4TDEConfigDialogFactory; } } #include "smb4tdeconfigdialog.moc"