kio Library API Documentation

kfilesharedlg.cpp

00001 /* This file is part of the KDE project 00002 Copyright (c) 2001 David Faure <david@mandrakesoft.com> 00003 Copyright (c) 2001 Laurent Montel <lmontel@mandrakesoft.com> 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License version 2 as published by the Free Software Foundation. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public License 00015 along with this library; see the file COPYING.LIB. If not, write to 00016 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00017 Boston, MA 02111-1307, USA. 00018 */ 00019 00020 #include "kfilesharedlg.h" 00021 #include <qvbox.h> 00022 #include <qlabel.h> 00023 #include <qdir.h> 00024 #include <qradiobutton.h> 00025 #include <qbuttongroup.h> 00026 #include <qlayout.h> 00027 #include <kprocess.h> 00028 #include <kprocio.h> 00029 #include <klocale.h> 00030 #include <kglobalsettings.h> 00031 #include <kstandarddirs.h> 00032 #include <kdebug.h> 00033 #include <stdio.h> 00034 #include <stdlib.h> 00035 #include <errno.h> 00036 #include <kio/kfileshare.h> 00037 #include <kseparator.h> 00038 #include <qpushbutton.h> 00039 #include <kapplication.h> 00040 #include <ksimpleconfig.h> 00041 #include <kmessagebox.h> 00042 00043 class KFileSharePropsPlugin::Private 00044 { 00045 public: 00046 QVBox *m_vBox; 00047 00048 }; 00049 00050 KFileSharePropsPlugin::KFileSharePropsPlugin( KPropertiesDialog *_props ) 00051 : KPropsDlgPlugin( _props ) 00052 { 00053 d = new Private; 00054 d->m_vBox = _props->addVBoxPage( i18n("&Share") ); 00055 properties->setFileSharingPage(d->m_vBox); 00056 m_widget = 0L; 00057 init(); 00058 } 00059 00060 KFileSharePropsPlugin::~KFileSharePropsPlugin() 00061 { 00062 delete d; 00063 } 00064 00065 bool KFileSharePropsPlugin::supports( const KFileItemList& items ) 00066 { 00067 // Do not show dialog if in advanced mode, 00068 // because the advanced dialog is shown already. 00069 if (KFileShare::shareMode() == KFileShare::Advanced) { 00070 kdDebug() << "KFileSharePropsPlugin::supports: false because sharemode is advanced" << endl; 00071 return false; 00072 } 00073 00074 KFileItemListIterator it( items ); 00075 for ( ; it.current(); ++it ) 00076 { 00077 bool isLocal = ( *it )->isLocalFile(); 00078 // We only support local dirs 00079 if ( !(*it)->isDir() || !isLocal ) 00080 return false; 00081 // And sharing the trash doesn't make sense 00082 if ( isLocal && (*it)->url().path( 1 ) == KGlobalSettings::trashPath() ) 00083 return false; 00084 } 00085 return true; 00086 } 00087 00088 void KFileSharePropsPlugin::init() 00089 { 00090 // We store the main widget, so that it's possible (later) to call init() 00091 // more than once, to update the page if something changed (e.g. after 00092 // the user has been authorized) 00093 delete m_widget; 00094 m_rbShare = 0L; 00095 m_rbUnShare = 0L; 00096 m_widget = new QWidget( d->m_vBox ); 00097 QVBoxLayout * vbox = new QVBoxLayout( m_widget ); 00098 00099 switch ( KFileShare::authorization() ) { 00100 case KFileShare::Authorized: 00101 { 00102 // Check if all selected dirs are in $HOME 00103 QString home = QDir::homeDirPath(); 00104 if ( home[home.length()-1] != '/' ) 00105 home += '/'; 00106 bool ok = true; 00107 KFileItemList items = properties->items(); 00108 // We have 3 possibilities: all shared, all unshared, or mixed. 00109 bool allShared = true; 00110 bool allUnshared = true; 00111 KFileItemListIterator it( items ); 00112 for ( ; it.current() && ok; ++it ) { 00113 QString path = (*it)->url().path(); 00114 if ( !path.startsWith( home ) ) 00115 ok = false; 00116 if ( KFileShare::isDirectoryShared( path ) ) 00117 allUnshared = false; 00118 else 00119 allShared = false; 00120 } 00121 if ( !ok ) 00122 { 00123 vbox->addWidget( new QLabel( i18n( "Only folders in your home folder can be shared."), 00124 m_widget ), 0 ); 00125 } 00126 else 00127 { 00128 // Everything ok, show the share/unshare GUI 00129 vbox->setSpacing( KDialog::spacingHint() ); 00130 vbox->setMargin( KDialog::marginHint() ); 00131 00132 QButtonGroup *rbGroup = new QButtonGroup( m_widget ); 00133 rbGroup->hide(); 00134 m_rbUnShare = new QRadioButton( i18n("Not shared"), m_widget ); 00135 connect( m_rbUnShare, SIGNAL( toggled(bool) ), SIGNAL( changed() ) ); 00136 vbox->addWidget( m_rbUnShare, 0 ); 00137 rbGroup->insert( m_rbUnShare ); 00138 00139 m_rbShare = new QRadioButton( i18n("Shared"), m_widget ); 00140 connect( m_rbShare, SIGNAL( toggled(bool) ), SIGNAL( changed() ) ); 00141 vbox->addWidget( m_rbShare, 0 ); 00142 rbGroup->insert( m_rbShare ); 00143 00144 // Activate depending on status 00145 if ( allShared ) 00146 m_rbShare->setChecked(true); 00147 if ( allUnshared ) 00148 m_rbUnShare->setChecked(true); 00149 00150 // Some help text 00151 QLabel *label = new QLabel( i18n("Sharing this folder makes it available under Linux/UNIX (NFS) and Windows (Samba).") , m_widget ); 00152 label->setAlignment( Qt::AlignAuto | Qt::AlignVCenter | Qt::WordBreak ); 00153 vbox->addWidget( label, 0 ); 00154 00155 KSeparator* sep=new KSeparator(m_widget); 00156 vbox->addWidget( sep, 0 ); 00157 label = new QLabel( i18n("You can also reconfigure file sharing authorization.") , m_widget ); 00158 label->setAlignment( Qt::AlignAuto | Qt::AlignVCenter | Qt::WordBreak ); 00159 vbox->addWidget( label, 0 ); 00160 m_pbConfig = new QPushButton( i18n("Configure File Sharing..."), m_widget ); 00161 connect( m_pbConfig, SIGNAL( clicked() ), SLOT( slotConfigureFileSharing() ) ); 00162 vbox->addWidget( m_pbConfig, 0, Qt::AlignHCenter ); 00163 00164 vbox->addStretch( 10 ); 00165 } 00166 } 00167 break; 00168 case KFileShare::ErrorNotFound: 00169 vbox->addWidget( new QLabel( i18n("Error running 'filesharelist'. Check if installed and in $PATH or /usr/sbin."), 00170 m_widget ), 0 ); 00171 break; 00172 case KFileShare::UserNotAllowed: 00173 { 00174 vbox->setSpacing( 10 ); 00175 if (KFileShare::sharingEnabled()) { 00176 vbox->addWidget( new QLabel( i18n("You need to be authorized to share folders."), 00177 m_widget ), 0 ); 00178 } else { 00179 vbox->addWidget( new QLabel( i18n("File sharing is disabled."), 00180 m_widget ), 0 ); 00181 } 00182 QHBoxLayout* hBox = new QHBoxLayout( (QWidget *)0L ); 00183 vbox->addLayout( hBox, 0 ); 00184 m_pbConfig = new QPushButton( i18n("Configure File Sharing..."), m_widget ); 00185 connect( m_pbConfig, SIGNAL( clicked() ), SLOT( slotConfigureFileSharing() ) ); 00186 hBox->addWidget( m_pbConfig, 0, Qt::AlignHCenter ); 00187 vbox->addStretch( 10 ); // align items on top 00188 break; 00189 } 00190 case KFileShare::NotInitialized: 00191 kdWarning() << "KFileShare Authorization still NotInitialized after calling authorization() - impossible" << endl; 00192 break; 00193 } 00194 } 00195 00196 void KFileSharePropsPlugin::slotConfigureFileSharing() 00197 { 00198 KProcess proc; 00199 proc << KStandardDirs::findExe("kdesu") << "kcmshell" << "fileshare"; 00200 proc.start( KProcess::DontCare ); 00201 m_pbConfig->setEnabled(false); 00202 } 00203 00204 void KFileSharePropsPlugin::applyChanges() 00205 { 00206 kdDebug() << "KFileSharePropsPlugin::applyChanges" << endl; 00207 if ( m_rbShare && m_rbUnShare ) 00208 { 00209 bool share = m_rbShare->isChecked(); 00210 KFileItemList items = properties->items(); 00211 KFileItemListIterator it( items ); 00212 bool ok = true; 00213 for ( ; it.current() && ok; ++it ) { 00214 QString path = (*it)->url().path(); 00215 ok = setShared( path, share ); 00216 if (!ok) { 00217 if (share) 00218 KMessageBox::detailedError(properties, 00219 i18n("Sharing folder '%1' failed.").arg(path), 00220 i18n("An error occurred while trying to share folder '%1'. " 00221 "Make sure that the Perl script 'fileshareset' is set suid root.") 00222 .arg(path)); 00223 else 00224 KMessageBox::error(properties, 00225 i18n("Unsharing folder '%1' failed.").arg(path), 00226 i18n("An error occurred while trying to unshare folder '%1'. " 00227 "Make sure that the Perl script 'fileshareset' is set suid root.") 00228 .arg(path)); 00229 00230 properties->abortApplying(); 00231 break; 00232 } 00233 } 00234 00235 // Get the change back into our cached info 00236 KFileShare::readShareList(); 00237 } 00238 } 00239 00240 bool KFileSharePropsPlugin::setShared( const QString& path, bool shared ) 00241 { 00242 kdDebug() << "KFileSharePropsPlugin::setShared " << path << "," << shared << endl; 00243 return KFileShare::setShared( path, shared ); 00244 } 00245 00246 QWidget* KFileSharePropsPlugin::page() const 00247 { 00248 return d->m_vBox; 00249 } 00250 00251 #include "kfilesharedlg.moc" 00252 00253 //TODO: do we need to monitor /etc/security/fileshare.conf ? 00254 // if the user is added to the 'fileshare' group, we wouldn't be notified 00255 // Of course the config module can notify us. 00256 // TODO: listen to such notifications ;)
KDE Logo
This file is part of the documentation for kio Library Version 3.3.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sun Oct 17 11:29:25 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003