From: <ck...@us...> - 2009-01-10 12:39:52
|
Revision: 6177 http://krusader.svn.sourceforge.net/krusader/?rev=6177&view=rev Author: ckarai Date: 2009-01-10 12:19:41 +0000 (Sat, 10 Jan 2009) Log Message: ----------- FIXED: MountMan: mount/umount/eject uses Solid if possible Modified Paths: -------------- trunk/krusader_kde4/ChangeLog trunk/krusader_kde4/krusader/Konfigurator/kgdependencies.cpp trunk/krusader_kde4/krusader/MountMan/kmountman.cpp trunk/krusader_kde4/krusader/MountMan/kmountman.h trunk/krusader_kde4/krusader/MountMan/kmountmangui.cpp trunk/krusader_kde4/krusader/Panel/krpopupmenu.cpp trunk/krusader_kde4/krusader/krslots.cpp Modified: trunk/krusader_kde4/ChangeLog =================================================================== --- trunk/krusader_kde4/ChangeLog 2009-01-06 21:33:59 UTC (rev 6176) +++ trunk/krusader_kde4/ChangeLog 2009-01-10 12:19:41 UTC (rev 6177) @@ -1,3 +1,4 @@ + FIXED: MountMan: mount/umount/eject uses Solid if possible FIXED: [ 2381505 ] Ctrl+Shift+D in editor (KWrite) not work FIXED: Krusader fails to edit files containing international chars with Shift+F4 Modified: trunk/krusader_kde4/krusader/Konfigurator/kgdependencies.cpp =================================================================== --- trunk/krusader_kde4/krusader/Konfigurator/kgdependencies.cpp 2009-01-06 21:33:59 UTC (rev 6176) +++ trunk/krusader_kde4/krusader/Konfigurator/kgdependencies.cpp 2009-01-10 12:19:41 UTC (rev 6177) @@ -62,18 +62,16 @@ pathsGrid->setContentsMargins( 11, 11, 11, 11 ); pathsGrid->setAlignment( Qt::AlignTop ); - addApplication( "df", pathsGrid, 0, general_tab, PAGE_GENERAL ); - addApplication( "eject", pathsGrid, 1, general_tab, PAGE_GENERAL ); - addApplication( "kdesu", pathsGrid, 2, general_tab, PAGE_GENERAL ); - addApplication( "kget", pathsGrid, 3, general_tab, PAGE_GENERAL ); - addApplication( "mailer", pathsGrid, 4, general_tab, PAGE_GENERAL ); - addApplication( "diff utility", pathsGrid, 5, general_tab, PAGE_GENERAL ); - addApplication( "krename", pathsGrid, 6, general_tab, PAGE_GENERAL ); - addApplication( "krusader", pathsGrid, 7, general_tab, PAGE_GENERAL ); - addApplication( "locate", pathsGrid, 8, general_tab, PAGE_GENERAL ); - addApplication( "mount", pathsGrid, 9, general_tab, PAGE_GENERAL ); - addApplication( "umount", pathsGrid,10, general_tab, PAGE_GENERAL ); - addApplication( "updatedb", pathsGrid,11, general_tab, PAGE_GENERAL ); + addApplication( "kdesu", pathsGrid, 0, general_tab, PAGE_GENERAL ); + addApplication( "kget", pathsGrid, 1, general_tab, PAGE_GENERAL ); + addApplication( "mailer", pathsGrid, 2, general_tab, PAGE_GENERAL ); + addApplication( "diff utility", pathsGrid, 3, general_tab, PAGE_GENERAL ); + addApplication( "krename", pathsGrid, 4, general_tab, PAGE_GENERAL ); + addApplication( "krusader", pathsGrid, 5, general_tab, PAGE_GENERAL ); + addApplication( "locate", pathsGrid, 6, general_tab, PAGE_GENERAL ); + addApplication( "mount", pathsGrid, 7, general_tab, PAGE_GENERAL ); + addApplication( "umount", pathsGrid, 8, general_tab, PAGE_GENERAL ); + addApplication( "updatedb", pathsGrid, 9, general_tab, PAGE_GENERAL ); // ---------------------------- PACKERS TAB ------------------------------------- QWidget *packers_tab = new QWidget( tabWidget ); Modified: trunk/krusader_kde4/krusader/MountMan/kmountman.cpp =================================================================== --- trunk/krusader_kde4/krusader/MountMan/kmountman.cpp 2009-01-06 21:33:59 UTC (rev 6176) +++ trunk/krusader_kde4/krusader/MountMan/kmountman.cpp 2009-01-10 12:19:41 UTC (rev 6177) @@ -55,13 +55,21 @@ #define FSTAB "/etc/fstab" #endif +#include <qdir.h> +#include <solid/block.h> +#include <solid/opticaldisc.h> +#include <solid/opticaldrive.h> +#include <solid/storageaccess.h> +#include <solid/storagevolume.h> + + static int __delayedIdx; // ugly: pass the processEvents deadlock KMountMan::KMountMan() : QObject(), Operational( false ), waiting(false), mountManGui( 0 ) { _actions = 0L; // added as a precaution, although we use kde services now - if( !KrServices::cmdExist( "df" ) || !KrServices::cmdExist( "mount" ) ) { + if( !KrServices::cmdExist( "mount" ) ) { Operational = false; } else { Operational = true; @@ -107,10 +115,16 @@ } KSharedPtr<KMountPoint> KMountMan::findInListByMntPoint(KMountPoint::List &lst, QString value) { + if( value.endsWith( "/" ) ) + value = value.left( value.length() - 1 ); + KSharedPtr<KMountPoint> m; for (KMountPoint::List::iterator it = lst.begin(); it != lst.end(); ++it) { m = *it; - if (m->mountPoint() == value) + QString mntPnt = m->mountPoint(); + if( mntPnt.length() > 1 && mntPnt.endsWith( "/" ) ) + mntPnt = mntPnt.left( mntPnt.length() - 1 ); + if (mntPnt == value) return m; } @@ -124,30 +138,44 @@ } void KMountMan::mount( QString mntPoint, bool blocking ) { - KMountPoint::List possible = KMountPoint::possibleMountPoints(KMountPoint::NeedMountOptions); - KSharedPtr<KMountPoint> m = findInListByMntPoint(possible, mntPoint); - if (!((bool)m)) return; - if (blocking) - waiting = true; // prepare to block + QString udi = findUdiForPath( mntPoint, Solid::DeviceInterface::StorageAccess ); + if( !udi.isNull() ) + { + Solid::Device device( udi ); + Solid::StorageAccess *access = device.as<Solid::StorageAccess>(); + if( access && !access->isAccessible() ) { + connect( access, SIGNAL( setupDone(Solid::ErrorType, QVariant, const QString &) ), + this, SLOT( slotSetupDone(Solid::ErrorType, QVariant, const QString &) ) ); + if (blocking) + waiting = true; // prepare to block + access->setup(); + } + } else { + KMountPoint::List possible = KMountPoint::possibleMountPoints(KMountPoint::NeedMountOptions); + KSharedPtr<KMountPoint> m = findInListByMntPoint(possible, mntPoint); + if (!((bool)m)) return; + if (blocking) + waiting = true; // prepare to block + + // KDE4 doesn't allow mounting devices as user, because they think it's the right behaviour. + // I add this patch, as I don't think so. + if( geteuid() ) // tries to mount as an user? + { + KProcess proc; + proc << KrServices::fullPathName( "mount" ) << mntPoint; + proc.start(); + if( !blocking ) + return; + proc.waitForFinished(-1); // -1 msec blocks without timeout + if ( proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0 ) + return; + } - // KDE4 doesn't allow mounting devices as user, because they think it's the right behaviour. - // I add this patch, as I don't think so. - if( geteuid() ) // tries to mount as an user? - { - KProcess proc; - proc << KrServices::fullPathName( "mount" ) << mntPoint; - proc.start(); - if( !blocking ) - return; - proc.waitForFinished(-1); // -1 msec blocks without timeout - if ( proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0 ) - return; + KIO::SimpleJob *job = KIO::mount(false, m->mountType().toLocal8Bit(), m->mountedFrom(), m->mountPoint(), false); + job->setUiDelegate(new KIO::JobUiDelegate() ); + KIO::getJobTracker()->registerJob(job); + connect(job, SIGNAL(result(KJob* )), this, SLOT(jobResult(KJob* ))); } - - KIO::SimpleJob *job = KIO::mount(false, m->mountType().toLocal8Bit(), m->mountedFrom(), m->mountPoint(), false); - job->setUiDelegate(new KIO::JobUiDelegate() ); - KIO::getJobTracker()->registerJob(job); - connect(job, SIGNAL(result(KJob* )), this, SLOT(jobResult(KJob* ))); while (blocking && waiting) { qApp->processEvents(); usleep( 1000 ); @@ -155,27 +183,39 @@ } void KMountMan::unmount( QString mntPoint, bool blocking ) { - if (blocking) - waiting = true; // prepare to block - - // KDE4 doesn't allow unmounting devices as user, because they think it's the right behaviour. - // I add this patch, as I don't think so. - if( geteuid() ) // tries to mount as an user? + QString udi = findUdiForPath( mntPoint, Solid::DeviceInterface::StorageAccess ); + if( !udi.isNull() ) { - KProcess proc; - proc << KrServices::fullPathName( "umount" ) << mntPoint; - proc.start(); - if( !blocking ) - return; - proc.waitForFinished(-1); // -1 msec blocks without timeout - if ( proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0 ) - return; + Solid::Device device( udi ); + Solid::StorageAccess *access = device.as<Solid::StorageAccess>(); + if( access && access->isAccessible() ) { + connect( access, SIGNAL( teardownDone(Solid::ErrorType, QVariant, const QString &) ), + this, SLOT( slotTeardownDone(Solid::ErrorType, QVariant, const QString &) ) ); + access->teardown(); + } + } else { + if (blocking) + waiting = true; // prepare to block + + // KDE4 doesn't allow unmounting devices as user, because they think it's the right behaviour. + // I add this patch, as I don't think so. + if( geteuid() ) // tries to mount as an user? + { + KProcess proc; + proc << KrServices::fullPathName( "umount" ) << mntPoint; + proc.start(); + if( !blocking ) + return; + proc.waitForFinished(-1); // -1 msec blocks without timeout + if ( proc.exitStatus() == QProcess::NormalExit && proc.exitCode() == 0 ) + return; + } + + KIO::SimpleJob *job = KIO::unmount(mntPoint, false); + job->setUiDelegate(new KIO::JobUiDelegate() ); + KIO::getJobTracker()->registerJob(job); + connect(job, SIGNAL(result(KJob* )), this, SLOT(jobResult(KJob* ))); } - - KIO::SimpleJob *job = KIO::unmount(mntPoint, false); - job->setUiDelegate(new KIO::JobUiDelegate() ); - KIO::getJobTracker()->registerJob(job); - connect(job, SIGNAL(result(KJob* )), this, SLOT(jobResult(KJob* ))); while (blocking && waiting) { qApp->processEvents(); usleep( 1000 ); @@ -224,28 +264,29 @@ } void KMountMan::eject( QString mntPoint ) { - KProcess proc; - proc << KrServices::fullPathName( "eject" ) << mntPoint; - proc.start(); - proc.waitForFinished(-1); // -1 msec blocks without timeout - if ( proc.exitStatus() != QProcess::NormalExit || proc.exitStatus() != 0 ) // if we failed with eject - KMessageBox::information( 0, //parent - i18n( "<qt>Error ejecting device!\n You have to configure the path to the 'eject' tool. " - "Please check the <b>Dependencies</b> page in Krusader's settings.</qt>"), - i18n( "Error" ), // caption - "CantExecuteEjectWarning" ); // don't-show-again config-key + QString udi = findUdiForPath( mntPoint, Solid::DeviceInterface::OpticalDrive ); + if( udi.isNull() ) + return; + + Solid::Device dev( udi ); + Solid::OpticalDrive *drive = dev.as<Solid::OpticalDrive>(); + if( drive == 0 ) + return; + + connect(drive, SIGNAL(ejectDone(Solid::ErrorType, QVariant, const QString &)), + this, SLOT(slotTeardownDone(Solid::ErrorType, QVariant, const QString &))); + + drive->eject(); } // returns true if the path is an ejectable mount point (at the moment CDROM and DVD) bool KMountMan::ejectable( QString path ) { -#if !defined(BSD) && !defined(_OS_SOLARIS_) - KMountPoint::List possible = KMountPoint::possibleMountPoints(); - KSharedPtr<KMountPoint> m = findInListByMntPoint(possible, path); - if (m && (m->mountType()=="iso9660" || m->mountedFrom().left(7)=="/dev/cd" || m->mountedFrom().left(8)=="/dev/dvd")) - return KrServices::cmdExist( "eject" ); -#endif + QString udi = findUdiForPath( path, Solid::DeviceInterface::OpticalDisc ); + if( udi.isNull() ) + return false; - return false; + Solid::Device dev( udi ); + return dev.as<Solid::OpticalDisc>() != 0; } @@ -369,4 +410,50 @@ disconnect( ( ( KToolBarPopupAction* ) krMountMan ) ->menu(), SIGNAL( triggered( QAction * ) ), 0, 0 ); } +QString KMountMan::findUdiForPath( QString path, const Solid::DeviceInterface::Type &expType ) +{ + KMountPoint::List current = KMountPoint::currentMountPoints(); + KMountPoint::List possible = KMountPoint::possibleMountPoints(); + KSharedPtr<KMountPoint> mp = findInListByMntPoint(current, path); + if( !(bool)mp ) + { + mp = findInListByMntPoint(possible, path); + if( !(bool)mp ) + return QString::null; + } + QString dev = QDir( mp->mountedFrom() ).canonicalPath(); + QList<Solid::Device> storageDevices = Solid::Device::listFromType( Solid::DeviceInterface::Block ); + + for( int p = storageDevices.count()-1 ; p >= 0; p-- ) { + Solid::Device device = storageDevices[ p ]; + QString udi = device.udi(); + + Solid::Block * sb = device.as<Solid::Block>(); + if( sb ) + { + QString devb = QDir( sb->device() ).canonicalPath(); + if( expType != Solid::DeviceInterface::Unknown && !device.isDeviceInterface( expType ) ) + continue; + if( devb == dev ) + return udi; + } + } + + return QString::null; +} + +void KMountMan::slotTeardownDone(Solid::ErrorType error, QVariant errorData, const QString &udi) { + waiting = false; + if (error != Solid::NoError && errorData.isValid()) { + KMessageBox::sorry( krApp, errorData.toString()); + } +} + +void KMountMan::slotSetupDone(Solid::ErrorType error, QVariant errorData, const QString &udi) { + waiting = false; + if (error != Solid::NoError && errorData.isValid()) { + KMessageBox::sorry( krApp, errorData.toString()); + } +} + #include "kmountman.moc" Modified: trunk/krusader_kde4/krusader/MountMan/kmountman.h =================================================================== --- trunk/krusader_kde4/krusader/MountMan/kmountman.h 2009-01-06 21:33:59 UTC (rev 6176) +++ trunk/krusader_kde4/krusader/MountMan/kmountman.h 2009-01-10 12:19:41 UTC (rev 6177) @@ -46,6 +46,9 @@ #include <stdlib.h> #include <math.h> +#include <solid/device.h> +#include <solid/solidnamespace.h> + class KMountManGUI; class KMountMan : public QObject { @@ -64,7 +67,7 @@ void unmount( QString mntPoint, bool blocking=true ); // this is probably what you need for unmount mntStatus getStatus( QString mntPoint ); // return the status of a mntPoint (if any) void autoMount( QString path ); // just call it before refreshing into a dir - static void eject( QString mntPoint ); + void eject( QString mntPoint ); bool ejectable( QString path ); QString convertSize( KIO::filesize_t size ); bool invalidFilesystem(QString type); @@ -73,6 +76,8 @@ KMountMan(); ~KMountMan(); + QString findUdiForPath( QString path, const Solid::DeviceInterface::Type &expType = Solid::DeviceInterface::Unknown ); + public slots: void delayedPerformAction( QAction * ); void performAction(); @@ -80,6 +85,8 @@ protected slots: void jobResult(KJob *job); + void slotTeardownDone(Solid::ErrorType error, QVariant errorData, const QString &udi); + void slotSetupDone(Solid::ErrorType error, QVariant errorData, const QString &udi); protected: // used internally Modified: trunk/krusader_kde4/krusader/MountMan/kmountmangui.cpp =================================================================== --- trunk/krusader_kde4/krusader/MountMan/kmountmangui.cpp 2009-01-06 21:33:59 UTC (rev 6176) +++ trunk/krusader_kde4/krusader/MountMan/kmountmangui.cpp 2009-01-10 12:19:41 UTC (rev 6177) @@ -87,6 +87,7 @@ SLOT( changeActive() ) ); getSpaceData(); + exec(); } @@ -405,7 +406,7 @@ case FORMAT_ID : break; case EJECT_ID : - KMountMan::eject( mountPoint ); + krMtMan.eject( mountPoint ); break; } } Modified: trunk/krusader_kde4/krusader/Panel/krpopupmenu.cpp =================================================================== --- trunk/krusader_kde4/krusader/Panel/krpopupmenu.cpp 2009-01-06 21:33:59 UTC (rev 6176) +++ trunk/krusader_kde4/krusader/Panel/krpopupmenu.cpp 2009-01-10 12:19:41 UTC (rev 6177) @@ -271,7 +271,7 @@ panel->func->deleteFiles( true ); break; case EJECT_ID : - KMountMan::eject( panel->func->files() ->vfs_getFile( item->name() ).path( KUrl::RemoveTrailingSlash ) ); + krMtMan.eject( panel->func->files() ->vfs_getFile( item->name() ).path( KUrl::RemoveTrailingSlash ) ); break; /* case SHRED_ID : if ( KMessageBox::warningContinueCancel( krApp, Modified: trunk/krusader_kde4/krusader/krslots.cpp =================================================================== --- trunk/krusader_kde4/krusader/krslots.cpp 2009-01-06 21:33:59 UTC (rev 6176) +++ trunk/krusader_kde4/krusader/krslots.cpp 2009-01-10 12:19:41 UTC (rev 6177) @@ -474,7 +474,7 @@ void KRslots::runMountMan() { // left as a precaution, although we use kde's services now - if( !KrServices::cmdExist( "df" ) || !KrServices::cmdExist( "mount" ) ) + if( !KrServices::cmdExist( "mount" ) ) { KMessageBox::error(0, i18n("Can't start 'mount'! Check the 'Dependencies' page in konfigurator.")); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |