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.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Jul 22 10:17:16 2005 by doxygen 1.3.6 written by Dimitri van Heesch, © 1997-2003