--- kio/kfile/kfilesharedlg.cpp +++ kio/kfile/kfilesharedlg.cpp 2004/08/06 08:38:31 @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -93,8 +94,10 @@ delete m_widget; m_rbShare = 0L; m_rbUnShare = 0L; + m_rbSharerw = 0L; m_widget = new QWidget( d->m_vBox ); QVBoxLayout * vbox = new QVBoxLayout( m_widget ); + //QHBoxLayout * hbox = new QHBoxLayout( vbox ); switch ( KFileShare::authorization() ) { case KFileShare::Authorized: @@ -105,18 +108,31 @@ home += '/'; bool ok = true; KFileItemList items = properties->items(); - // We have 3 possibilities: all shared, all unshared, or mixed. + // We have some possibilities: all shared, all unshared (ro,rw), or mixed. bool allShared = true; bool allUnshared = true; + bool allreadonly = true; KFileItemListIterator it( items ); for ( ; it.current() && ok; ++it ) { QString path = (*it)->url().path(); + + // 0 => not shared + // 1 => shared read only + // 3 => shared writeable + int dirStatus = KFileShare::isDirectoryShared( path ); if ( !path.startsWith( home ) ) ok = false; - if ( KFileShare::isDirectoryShared( path ) ) + if ( dirStatus == 1 ) { allUnshared = false; - else + } + else if ( dirStatus == 3 ) { + allUnshared = false; + allreadonly = false; + } + else { allShared = false; + allreadonly = false; + } } if ( !ok ) { @@ -136,16 +152,31 @@ vbox->addWidget( m_rbUnShare, 0 ); rbGroup->insert( m_rbUnShare ); - m_rbShare = new QRadioButton( i18n("Shared"), m_widget ); + m_rbShare = new QRadioButton( i18n("Shared - read only for others"), m_widget ); connect( m_rbShare, SIGNAL( toggled(bool) ), SIGNAL( changed() ) ); vbox->addWidget( m_rbShare, 0 ); rbGroup->insert( m_rbShare ); + m_rbSharerw = new QRadioButton( i18n("Shared - writeable for others"), m_widget ); + connect( m_rbSharerw, SIGNAL( toggled(bool) ), SIGNAL( changed() ) ); + vbox->addWidget( m_rbSharerw, 0 ); + rbGroup->insert( m_rbSharerw ); + + //QLabel *testlabel1 = new QLabel(i18n("Enter Samba Share Name here"),m_widget); + //m_leSmbShareName = new QLineEdit(m_widget); + //m_leSmbShareName->setMaxLength(12); + + //hbox->addWidget( testlabel1, 0 ); + //hbox->addWidget( m_leSmbShareName ); + //vbox->addLayout( hbox ); + // Activate depending on status if ( allShared ) - m_rbShare->setChecked(true); + m_rbSharerw->setChecked(true); if ( allUnshared ) m_rbUnShare->setChecked(true); + if ( allreadonly ) + m_rbShare->setChecked(true); // Some help text QLabel *label = new QLabel( i18n("Sharing this folder makes it available under Linux/UNIX (NFS) and Windows (Samba).") , m_widget ); @@ -204,7 +235,7 @@ void KFileSharePropsPlugin::applyChanges() { kdDebug() << "KFileSharePropsPlugin::applyChanges" << endl; - if ( m_rbShare && m_rbUnShare ) + if ( m_rbShare && m_rbUnShare && m_rbSharerw ) { bool share = m_rbShare->isChecked(); KFileItemList items = properties->items(); @@ -212,7 +243,7 @@ bool ok = true; for ( ; it.current() && ok; ++it ) { QString path = (*it)->url().path(); - ok = setShared( path, share ); + ok = SuSEsetShared( path, share, m_rbSharerw->isChecked() ); if (!ok) { if (share) KMessageBox::detailedError(properties, @@ -239,8 +270,14 @@ bool KFileSharePropsPlugin::setShared( const QString& path, bool shared ) { - kdDebug() << "KFileSharePropsPlugin::setShared " << path << "," << shared << endl; - return KFileShare::setShared( path, shared ); + return SuSEsetShared( path, shared, true ); +} + +bool KFileSharePropsPlugin::SuSEsetShared( const QString& path, bool shared, bool readonly ) +{ + kdDebug() << "KFileSharePropsPlugin::setShared " << path << "," + << shared << readonly << endl; + return KFileShare::SuSEsetShared( path, shared, readonly ); } QWidget* KFileSharePropsPlugin::page() const --- kio/kfile/kfilesharedlg.h +++ kio/kfile/kfilesharedlg.h 2004/08/06 08:38:31 @@ -54,10 +54,13 @@ private: void init(); bool setShared( const QString&path, bool shared ); + bool SuSEsetShared( const QString&path, bool shared, bool readonly ); QWidget *m_widget; QRadioButton *m_rbShare; + QRadioButton *m_rbSharerw; QRadioButton *m_rbUnShare; + //QLineEdit *m_leSmbShareName; QPushButton *m_pbConfig; class Private; Private *d; --- kio/kio/kfileshare.cpp +++ kio/kio/kfileshare.cpp 2004/08/06 08:38:51 @@ -20,6 +20,7 @@ #include "kfileshare.h" #include #include +#include #include #include #include @@ -35,8 +36,10 @@ #include KFileShare::Authorization KFileShare::s_authorization = NotInitialized; -QStringList* KFileShare::s_shareList = 0L; -static KStaticDeleter sdShareList; +//QStringList* KFileShare::s_shareList = 0L; +//static KStaticDeleter sdShareList; +QMap* KFileShare::s_shareMap = 0L; +static KStaticDeleter > sdShareMap; KFileShare::ShareMode KFileShare::s_shareMode; bool KFileShare::s_sambaEnabled; @@ -164,10 +167,10 @@ void KFileShare::readShareList() { KFileSharePrivate::self(); - if ( !s_shareList ) - sdShareList.setObject( s_shareList, new QStringList ); + if ( !s_shareMap ) + sdShareMap.setObject( s_shareMap, new QMap ); else - s_shareList->clear(); + s_shareMap->clear(); // /usr/sbin on Mandrake, $PATH allows flexibility for other distributions QString exe = findExe( "filesharelist" ); @@ -185,29 +188,45 @@ // Reading code shamelessly stolen from khostname.cpp ;) QString line; + QString options; + QString path; int length; + QRegExp rx_line("([^\\s]+)\\s+(.*)"); do { length = proc.readln(line, true); if ( length > 0 ) { if ( line[length-1] != '/' ) line += '/'; - s_shareList->append(line); + if( rx_line.search( line ) != -1 ) { + options = rx_line.cap(1); + path = rx_line.cap(2); + (*s_shareMap)[path] = options; + } kdDebug(7000) << "Shared dir:" << line << endl; } } while (length > -1); } -bool KFileShare::isDirectoryShared( const QString& _path ) +int KFileShare::isDirectoryShared( const QString& _path ) { - if ( ! s_shareList ) + int ret(0); + + if ( ! s_shareMap ) readShareList(); QString path( _path ); if ( path[path.length()-1] != '/' ) path += '/'; - return s_shareList && s_shareList->contains( path ); + //return s_shareList && s_shareList->contains( path ); + if( (*s_shareMap).contains(path) && !((*s_shareMap)[path].isEmpty()) ) { + ret+=1; + if( (*s_shareMap)[path].find("readwrite") != -1 ) + ret+=2; + } + + return ret; } KFileShare::Authorization KFileShare::authorization() @@ -230,17 +249,30 @@ bool KFileShare::setShared( const QString& path, bool shared ) { + return SuSEsetShared( path, shared, false ); +} + +bool KFileShare::SuSEsetShared( const QString& path, bool shared, bool rw ) +{ if (! KFileShare::sharingEnabled() || KFileShare::shareMode() == Advanced) return false; - kdDebug(7000) << "KFileShare::setShared " << path << "," << shared << endl; QString exe = KFileShare::findExe( "fileshareset" ); if (exe.isEmpty()) return false; - + + // we want to share, so we kick it first - just to be sure KProcess proc; proc << exe; + proc << "--remove"; + proc << path; + proc.start( KProcess::Block ); + proc.clearArguments(); + + proc << exe; + if( rw ) + proc << "--rw"; if ( shared ) proc << "--add"; else --- kio/kio/kfileshare.h +++ kio/kio/kfileshare.h 2004/08/06 08:38:31 @@ -65,7 +65,7 @@ /** * Call this to know if a directory is currently shared */ - static bool isDirectoryShared( const QString& path ); + static int isDirectoryShared( const QString& path ); enum Authorization { NotInitialized, ErrorNotFound, Authorized, UserNotAllowed }; /** @@ -83,7 +83,12 @@ * @returns wether the perl script was successful */ static bool setShared( const QString& path, bool shared ); - + + /* + * SuSE only enhancement for now + */ + static bool SuSEsetShared( const QString& path, bool shared, bool ro ); + /** * The used share mode. * Simple means that the simple sharing dialog is used and @@ -132,7 +137,8 @@ private: static Authorization s_authorization; - static QStringList* s_shareList; +// static QStringList* s_shareList; + static QMap* s_shareMap; static ShareMode s_shareMode; static bool s_sambaEnabled; static bool s_nfsEnabled;