summaryrefslogtreecommitdiffstats
path: root/src/app/GUI/mediabutton.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/GUI/mediabutton.cpp')
-rw-r--r--src/app/GUI/mediabutton.cpp692
1 files changed, 692 insertions, 0 deletions
diff --git a/src/app/GUI/mediabutton.cpp b/src/app/GUI/mediabutton.cpp
new file mode 100644
index 0000000..19a5d71
--- /dev/null
+++ b/src/app/GUI/mediabutton.cpp
@@ -0,0 +1,692 @@
+/***************************************************************************
+ mediabutton.cpp - description
+ -------------------
+ copyright : (C) 2006 + by Csaba Karai
+ e-mail : krusader@users.sourceforge.net
+ web site : http://krusader.sourceforge.net
+ ---------------------------------------------------------------------------
+ Description
+ ***************************************************************************
+
+ A
+
+ db dD d8888b. db db .d8888. .d8b. d8888b. d88888b d8888b.
+ 88 ,8P' 88 `8D 88 88 88' YP d8' `8b 88 `8D 88' 88 `8D
+ 88,8P 88oobY' 88 88 `8bo. 88ooo88 88 88 88ooooo 88oobY'
+ 88`8b 88`8b 88 88 `Y8b. 88~~~88 88 88 88~~~~~ 88`8b
+ 88 `88. 88 `88. 88b d88 db 8D 88 88 88 .8D 88. 88 `88.
+ YP YD 88 YD ~Y8888P' `8888Y' YP YP Y8888D' Y88888P 88 YD
+
+ S o u r c e F i l e
+
+ ***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+#include "mediabutton.h"
+#include "../krusader.h"
+#include "../krservices.h"
+#include "../kicons.h"
+#include "../krslots.h"
+#include "../MountMan/kdiskfreesp.h"
+#include "../MountMan/kmountman.h"
+
+#include <tqpopupmenu.h>
+#include <tqfile.h>
+#include <tqfontmetrics.h>
+
+#include <tdelocale.h>
+#include <kiconloader.h>
+
+#include <tdeversion.h>
+#include <tdeio/job.h>
+#include <tdemessagebox.h>
+#include <kmimetype.h>
+#include <kprotocolinfo.h>
+#include <tdefileitem.h>
+#include <tdeprocess.h>
+#include <tqcursor.h>
+
+#ifdef Q_OS_LINUX
+// For CD/DVD drive detection
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <stdint.h>
+#define CDROM_GET_CAPABILITY 0x5331
+#define CDSL_CURRENT ((int) (~0U>>1))
+#define CDC_DVD_R 0x10000 /* drive can write DVD-R */
+#define CDC_DVD_RAM 0x20000 /* drive can write DVD-RAM */
+#define CDC_CD_R 0x2000 /* drive is a CD-R */
+#define CDC_CD_RW 0x4000 /* drive is a CD-RW */
+#define CDC_DVD 0x8000 /* drive is a DVD */
+#include <tqfile.h>
+#endif
+
+
+
+MediaButton::MediaButton( TQWidget *parent, const char *name ) : TQToolButton( parent, name ),
+ popupMenu( 0 ), rightMenu( 0 ), hasMedia( false ), waitingForMount( -1 ), mountCheckerTimer()
+ {
+ TDEIconLoader * iconLoader = new TDEIconLoader();
+ TQPixmap icon = iconLoader->loadIcon( "blockdevice", TDEIcon::Toolbar, 16 );
+
+ setFixedSize( icon.width() + 4, icon.height() + 4 );
+ setPixmap( icon );
+ setTextLabel( i18n( "Open the available media list" ), true );
+ setPopupDelay( 1 ); // immediate press
+ setAcceptDrops( false );
+
+ popupMenu = new TQPopupMenu( this );
+ popupMenu->installEventFilter( this );
+ TQ_CHECK_PTR( popupMenu );
+
+ setPopup( popupMenu );
+
+ connect( popupMenu, TQ_SIGNAL( aboutToShow() ), this, TQ_SLOT( slotAboutToShow() ) );
+ connect( popupMenu, TQ_SIGNAL( aboutToHide() ), this, TQ_SLOT( slotAboutToHide() ) );
+ connect( popupMenu, TQ_SIGNAL( activated( int ) ), this, TQ_SLOT( slotPopupActivated( int ) ) );
+
+ connect( &mountCheckerTimer, TQ_SIGNAL( timeout() ), this, TQ_SLOT( slotTimeout() ) );
+}
+
+MediaButton::~MediaButton() {
+ busy = false;
+}
+
+void MediaButton::slotAboutToShow() {
+ hasMedia = KProtocolInfo::isKnownProtocol( TQString( "media" ) );
+ krConfig->setGroup( "Advanced" );
+ if( krConfig->readBoolEntry( "DontUseMediaProt", !hasMedia ) )
+ hasMedia = false;
+
+ popupMenu->clear();
+ urls.clear();
+ mediaUrls.clear();
+ mimes.clear();
+ quasiMounted.clear();
+ waitingForMount = -1;
+
+ if( hasMedia )
+ createListWithMedia();
+ else
+ createListWithoutMedia();
+
+ mountCheckerTimer.start( 1000, true );
+}
+
+void MediaButton::slotAboutToHide() {
+ if( rightMenu )
+ rightMenu->close();
+
+ if( waitingForMount < 0 )
+ mountCheckerTimer.stop();
+}
+
+void MediaButton::createListWithMedia() {
+ TDEIO::ListJob *job = TDEIO::listDir( KURL( "media:/" ), false );
+ connect( job, TQ_SIGNAL( entries( TDEIO::Job*, const TDEIO::UDSEntryList& ) ),
+ this, TQ_SLOT( slotEntries( TDEIO::Job*, const TDEIO::UDSEntryList& ) ) );
+ connect( job, TQ_SIGNAL( result( TDEIO::Job* ) ),
+ this, TQ_SLOT( slotListResult( TDEIO::Job* ) ) );
+ busy = true;
+
+ if( !busy )
+ tqApp->processEvents();
+}
+
+void MediaButton::slotEntries( TDEIO::Job *, const TDEIO::UDSEntryList& entries )
+{
+ KMountPoint::List mountList = KMountPoint::currentMountPoints();
+
+ TDEIO::UDSEntryListConstIterator it = entries.begin();
+ TDEIO::UDSEntryListConstIterator end = entries.end();
+
+ while( it != end )
+ {
+ KURL url;
+ TQString text;
+ TQString mime;
+ TQString localPath;
+ bool mounted = false;
+
+ TDEIO::UDSEntry::ConstIterator it2 = (*it).begin();
+
+ for( ; it2 != (*it).end(); it2++ ) {
+ switch ((*it2).m_uds) {
+ case TDEIO::UDS_NAME:
+ text = KURL::decode_string((*it2).m_str);
+ break;
+ case TDEIO::UDS_URL:
+ url = KURL::fromPathOrURL( (*it2).m_str );
+ break;
+ case TDEIO::UDS_MIME_TYPE:
+ mime = (*it2).m_str;
+ if( !mime.endsWith( "unmounted" ) )
+ mounted = true;
+ break;
+#if KDE_IS_VERSION(3,4,0)
+ case TDEIO::UDS_LOCAL_PATH:
+ localPath = (*it2).m_str;
+ break;
+#endif
+ }
+ }
+
+ if( text != "." && text != ".." ) {
+ int index = popupMenu->count();
+ TQPixmap pixmap = FL_LOADICON( KMimeType::mimeType( mime ) ->icon( TQString(), true ) );
+
+ mediaUrls.append( url );
+
+ if( mounted && !localPath.isEmpty() )
+ {
+ url = KURL::fromPathOrURL( localPath );
+ if( !text.contains( url.path() ) )
+ text += " [" + url.path() + "]";
+ }
+ else if( mounted )
+ {
+ url = getLocalPath( url, &mountList );
+ if( url.isLocalFile() && !text.contains( url.path() ) )
+ text += " [" + url.path() + "]";
+ }
+
+ popupMenu->insertItem( pixmap, text, index, index );
+
+ urls.append( url );
+ mimes.append( mime );
+ quasiMounted.append( false );
+ }
+ ++it;
+ }
+}
+
+void MediaButton::slotListResult( TDEIO::Job * ) {
+ busy = false;
+}
+
+KURL MediaButton::getLocalPath( const KURL &url, KMountPoint::List *mountList ) {
+ KMountPoint::List mountListRef;
+ if( mountList == 0 ) {
+ mountListRef = KMountPoint::currentMountPoints();
+ mountList = &mountListRef;
+ }
+
+ for (KMountPoint::List::iterator it = mountList->begin(); it != mountList->end(); ++it) {
+ TQString name = (*it)->mountedFrom();
+ name = name.mid( name.findRev( "/" ) + 1 );
+ if( name == url.fileName() ) {
+ TQString point = (*it)->mountPoint();
+ if( !point.isEmpty() )
+ return KURL::fromPathOrURL( point );
+ }
+ }
+ return url;
+}
+
+
+void MediaButton::createListWithoutMedia() {
+ /* WORKAROUND CODE START */
+
+ /* 1. the menu is drawn when we know all the mount points
+ 2. the menu is corrected, when the HDD volume sizes arrive from df
+
+ when the volume sizes are added to the items, some cases widget resize
+ is necessary. If transparency is set for the widget, TQt produces weird
+ looking widgets, and that's why this workaround is used.
+ Here we add additional spaces to the mounted HDD elements for avoiding
+ the buggy widget resize. These are extra spaces. */
+
+ extraSpaces = "";
+ TQFontMetrics fm( popupMenu->font() );
+ int requiredWidth = fm.width( "999.9 GB " );
+ while( fm.width( extraSpaces ) < requiredWidth )
+ extraSpaces+=" ";
+ /* WORKAROUND CODE END */
+
+ KMountPoint::List possibleMountList = KMountPoint::possibleMountPoints();
+ for (KMountPoint::List::iterator it = possibleMountList.begin(); it != possibleMountList.end(); ++it) {
+ addMountPoint( *it, false );
+ }
+
+ KMountPoint::List mountList = KMountPoint::currentMountPoints();
+ for (KMountPoint::List::iterator it = mountList.begin(); it != mountList.end(); ++it) {
+ addMountPoint( *it, true );
+ }
+}
+
+TQString MediaButton::detectType( KMountPoint *mp )
+{
+ TQString typeName = TQString();
+#ifdef Q_OS_LINUX
+ // Guessing device types by mount point is not exactly accurate...
+ // Do something accurate first, and fall back if necessary.
+
+ bool isCd=false;
+ TQString devname=mp->mountedFrom().section('/', -1);
+ if(devname.startsWith("scd") || devname.startsWith("sr"))
+ {
+ // SCSI CD/DVD drive
+ isCd=true;
+ }
+ else if(devname.startsWith("hd"))
+ {
+ // IDE device -- we can't tell if this is a
+ // CD/DVD drive or harddisk by just looking at the
+ // filename
+ TQFile m(TQString("/proc/ide/") + devname + "/media");
+ if(m.open(IO_ReadOnly))
+ {
+ TQTextStream in(&m);
+ TQString buf=in.readLine();
+ if(buf.contains("cdrom"))
+ isCd=true;
+ m.close();
+ }
+ }
+ if(isCd)
+ {
+ int device=::open((const char *)TQFile::encodeName(mp->mountedFrom()), O_RDONLY | O_NONBLOCK );
+ if(device>=0)
+ {
+ int drv=::ioctl(device, CDROM_GET_CAPABILITY, CDSL_CURRENT);
+ if(drv>=0)
+ {
+ if((drv & CDC_DVD_R) || (drv & CDC_DVD_RAM))
+ typeName = "dvdwriter";
+ else if((drv & CDC_CD_R) || (drv & CDC_CD_RW))
+ typeName = "cdwriter";
+ else if(drv & CDC_DVD)
+ typeName = "dvd";
+ else
+ typeName = "cdrom";
+ }
+
+ ::close(device);
+ }
+ }
+ if( !typeName.isNull() )
+ return typeName;
+
+#elif defined(__FreeBSD__)
+ if (-1!=mp->mountedFrom().find("/acd",0,false)) typeName="cdrom";
+ else if (-1!=mp->mountedFrom().find("/scd",0,false)) typeName="cdrom";
+ else if (-1!=mp->mountedFrom().find("/ad",0,false)) typeName="hdd";
+ else if (-1!=mp->mountedFrom().find("/da",0,false)) typeName="hdd";
+ else if (-1!=mp->mountedFrom().find("/afd",0,false)) typeName="zip";
+ else
+#endif
+
+ /* Guessing of cdrom and cd recorder devices */
+ if (-1!=mp->mountPoint().find("cdrom",0,false)) typeName="cdrom";
+ else if (-1!=mp->mountedFrom().find("cdrom",0,false)) typeName="cdrom";
+ else if (-1!=mp->mountPoint().find("cdwriter",0,false)) typeName="cdwriter";
+ else if (-1!=mp->mountedFrom().find("cdwriter",0,false)) typeName="cdwriter";
+ else if (-1!=mp->mountedFrom().find("cdrw",0,false)) typeName="cdwriter";
+ else if (-1!=mp->mountPoint().find("cdrw",0,false)) typeName="cdwriter";
+ else if (-1!=mp->mountedFrom().find("cdrecorder",0,false)) typeName="cdwriter";
+ else if (-1!=mp->mountPoint().find("cdrecorder",0,false)) typeName="cdwriter";
+ else if (-1!=mp->mountedFrom().find("dvdrecorder",0,false)) typeName="dvdwriter";
+ else if (-1!=mp->mountPoint().find("dvdrecorder",0,false)) typeName="dvdwriter";
+ else if (-1!=mp->mountPoint().find("dvdwriter",0,false)) typeName="dvdwriter";
+ else if (-1!=mp->mountedFrom().find("dvdwriter",0,false)) typeName="dvdwriter";
+ else if (-1!=mp->mountPoint().find("dvd",0,false)) typeName="dvd";
+ else if (-1!=mp->mountedFrom().find("dvd",0,false)) typeName="dvd";
+ else if (-1!=mp->mountedFrom().find("/dev/scd",0,false)) typeName="cdrom";
+ else if (-1!=mp->mountedFrom().find("/dev/sr",0,false)) typeName="cdrom";
+
+ /* Guessing of floppy types */
+ else if (-1!=mp->mountedFrom().find("fd",0,false)) {
+ if (-1!=mp->mountedFrom().find("360",0,false)) typeName="floppy5";
+ if (-1!=mp->mountedFrom().find("1200",0,false)) typeName="floppy5";
+ else typeName="floppy";
+ }
+ else if (-1!=mp->mountPoint().find("floppy",0,false)) typeName="floppy";
+
+ else if (-1!=mp->mountPoint().find("zip",0,false)) typeName="zip";
+ else if (-1!=mp->mountType().find("nfs",0,false)) typeName="nfs";
+ else if (-1!=mp->mountType().find("smb",0,false)) typeName="smb";
+ else if (-1!=mp->mountedFrom().find("//",0,false)) typeName="smb";
+ else typeName="hdd";
+
+ return typeName;
+}
+
+void MediaButton::slotPopupActivated( int elem ) {
+ if( !quasiMounted[ elem ] && mimes[ elem ].endsWith( "_unmounted" ) ) {
+ mount( elem );
+ waitingForMount = elem;
+ maxMountWait = 20;
+ newTabAfterMount = false;
+ mountCheckerTimer.start( 1000, true );
+ return;
+ }
+ emit openUrl( urls[ elem ] );
+}
+
+void MediaButton::gettingSpaceData(const TQString &mountPoint, unsigned long kBSize, unsigned long, unsigned long ) {
+ KURL mediaURL = KURL::fromPathOrURL( mountPoint );
+
+ TDEIO::filesize_t size = kBSize;
+ size *= 1024;
+ TQString sizeText = TDEIO::convertSize( size );
+
+ for( unsigned i=0; i != urls.size(); i++ ) {
+ if( mediaURL.equals( urls[ i ], true ) ) {
+ if( kBSize == 0 ) { // if df gives 0, it means the device is quasy umounted
+ TQString mime = mimes[ i ];
+ if( mimes[ i ].endsWith( "_mounted" ) ) {
+ quasiMounted[ i ] = true;
+ mimes[ i ] = mimes[ i ].replace( "_mounted", "_unmounted" );
+ }
+
+ TQPixmap pixmap = FL_LOADICON( KMimeType::mimeType( mimes[ i ] ) ->icon( TQString(), true ) );
+ popupMenu->changeItem( i, pixmap, popupMenu->text( i ) );
+ }
+ else if( mimes[ i ].contains( "hdd_" ) )
+ popupMenu->changeItem( i, sizeText + " " + popupMenu->text( i ).stripWhiteSpace() );
+ return;
+ }
+ }
+}
+
+void MediaButton::openPopup() {
+ TQPopupMenu * pP = popup();
+ if ( pP ) {
+ popup() ->exec( mapToGlobal( TQPoint( 0, height() ) ) );
+ }
+}
+
+void MediaButton::addMountPoint( KMountPoint * mp, bool isMounted ) {
+ TQString mountString = isMounted ? "_mounted" : "_unmounted";
+ if( mp->mountPoint() == "/dev/swap" ||
+ mp->mountPoint() == "/dev/pts" ||
+ mp->mountPoint().startsWith( "/sys/kernel" ) ||
+ mp->mountPoint().find( "/proc" ) == 0 )
+ return;
+ if( mp->mountType() == "swap" ||
+ mp->mountType() == "sysfs" ||
+ mp->mountType() == "tmpfs" ||
+ mp->mountType() == "kernfs" ||
+ mp->mountType() == "usbfs" ||
+ mp->mountType() == "unknown" ||
+ mp->mountType() == "none" ||
+ mp->mountType() == "sunrpc" )
+ return;
+ if( mp->mountedFrom() == "none" ||
+ mp->mountedFrom() == "tmpfs" ||
+ mp->mountedFrom().find( "shm" ) != -1 )
+ return;
+
+ int overwrite = -1;
+ KURL mountURL = KURL::fromPathOrURL( mp->mountPoint() );
+
+ for( unsigned i=0; i != urls.size(); i++ )
+ if( urls[ i ].equals( mountURL, true ) ) {
+ overwrite = i;
+ break;
+ }
+
+ TQString name;
+ TQString type = detectType( mp );
+
+ /* WORKAROUND CODE START */
+ /* add spaces to avoid widget resize in gettingSpaceData,
+ which is buggy in TQt when transparency is set */
+ TQString extSpc = ( isMounted && type == "hdd" ) ? extraSpaces : "";
+ /* WORKAROUND CODE END */
+
+#if KDE_IS_VERSION(3,4,0)
+ TQString mimeBase = "media/";
+#else
+ TQString mimeBase = "kdedevice/";
+#endif
+
+ TQString mime = mimeBase + type + mountString;
+
+ if( type == "hdd" )
+ name = i18n( "Hard Disk" ) ;
+ else if( type == "cdrom" )
+ name = i18n( "CD-ROM" );
+ else if( type == "cdwriter" )
+ name = i18n( "CD Recorder" );
+ else if( type == "dvdwriter" ) {
+ mime = mimeBase + "cdwriter" + mountString;
+ name = i18n( "DVD Recorder" );
+ }
+ else if( type == "dvd" )
+ name = i18n( "DVD" );
+ else if( type == "smb" )
+ name = i18n( "Remote Share" );
+ else if( type == "nfs" )
+ name = i18n( "Remote Share" );
+ else if( type == "floppy" )
+ name = i18n( "Floppy" );
+ else if( type == "floppy5" )
+ name = i18n( "Floppy" );
+ else if( type == "zip" )
+ name = i18n( "Zip Disk" );
+ else {
+ mime = mimeBase + "hdd" + mountString;
+ name = i18n( "Unknown" );
+ }
+
+ if( isMounted ) {
+ KDiskFreeSp *sp = KDiskFreeSp::findUsageInfo( mp->mountPoint() );
+ connect( sp, TQ_SIGNAL( foundMountPoint( const TQString &, unsigned long, unsigned long, unsigned long ) ),
+ this, TQ_SLOT( gettingSpaceData( const TQString&, unsigned long, unsigned long, unsigned long ) ) );
+ }
+
+ TQPixmap pixmap = FL_LOADICON( KMimeType::mimeType( mime ) ->icon( TQString(), true ) );
+
+ if( overwrite == -1 ) {
+ int index = popupMenu->count();
+ urls.append( KURL::fromPathOrURL( mp->mountPoint() ) );
+ mimes.append( mime );
+ mediaUrls.append( KURL() );
+ quasiMounted.append( false );
+ popupMenu->insertItem( pixmap, name + " [" + mp->mountPoint() + "]" + extSpc, index, index );
+ }
+ else {
+ mimes[ overwrite ] = mime;
+ popupMenu->changeItem( overwrite, pixmap, name + " [" + mp->mountPoint() + "]" + extSpc );
+ }
+}
+
+bool MediaButton::eventFilter( TQObject *o, TQEvent *e ) {
+ if( o == popupMenu ) {
+ if( e->type() == TQEvent::MouseButtonPress || e->type() == TQEvent::MouseButtonRelease ) {
+ TQMouseEvent *m = static_cast<TQMouseEvent*>(e);
+ if( m->button() == TQt::RightButton ) {
+ if( e->type() == TQEvent::MouseButtonPress ) {
+ int id = popupMenu->idAt( m->pos() );
+ if( id != -1 )
+ rightClickMenu( id );
+ }
+ m->accept();
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+void MediaButton::rightClickMenu( int index ) {
+ if( rightMenu )
+ rightMenu->close();
+
+ TQString mime = mimes[ index ];
+ bool ejectable = mime.contains( "dvd_" ) || mime.contains( "dvdwriter_" ) || mime.contains( "cdrom_" ) || mime.contains( "cdwriter_" );
+ bool mounted = mime.contains( "_mounted" );
+
+ TQPopupMenu * myMenu = rightMenu = new TQPopupMenu( popupMenu );
+ myMenu->insertItem( i18n( "Open" ), 1 );
+ myMenu->insertItem( i18n( "Open in a new tab" ), 2 );
+ myMenu->insertSeparator();
+ if( !mounted )
+ myMenu->insertItem( i18n( "Mount" ), 3 );
+ else
+ myMenu->insertItem( i18n( "Unmount" ), 4 );
+ if( ejectable )
+ myMenu->insertItem( i18n( "Eject" ), 5 );
+ int result = myMenu->exec( TQCursor::pos() );
+ delete myMenu;
+ if( rightMenu == myMenu )
+ rightMenu = 0;
+ else
+ return;
+
+ switch ( result ) {
+ case 1:
+ case 2:
+ popupMenu->close();
+ if( mounted || quasiMounted[ index ] ) {
+ if( result == 1 )
+ emit openUrl( urls[ index ] );
+ else
+ SLOTS->newTab( urls[ index ] );
+ } else {
+ mount( index ); // mount first, when mounted open the tab
+ waitingForMount = index;
+ maxMountWait = 20;
+ newTabAfterMount = ( result == 2 );
+ mountCheckerTimer.start( 1000, true );
+ }
+ break;
+ case 3:
+ mount( index );
+ break;
+ case 4:
+ umount( index );
+ break;
+ case 5:
+ eject( index );
+ break;
+ default:
+ break;
+ }
+}
+
+bool MediaButton::mount( int index ) {
+ if ( (unsigned)index < mimes.count() ) {
+ if( !mediaUrls[ index ].isEmpty() ) {
+ TDEProcess proc;
+ proc << KrServices::fullPathName( "tdeio_media_mounthelper" ) << "-m" << mediaUrls[ index ].url();
+ proc.start( TDEProcess::DontCare );
+ } else {
+ krMtMan.mount( urls[ index ].path(), false );
+ }
+ }
+ return false;
+}
+
+bool MediaButton::umount( int index ) {
+ if ( (unsigned)index < mimes.count() ) {
+ if( !mediaUrls[ index ].isEmpty() ) {
+ TDEProcess proc;
+ proc << KrServices::fullPathName( "tdeio_media_mounthelper" ) << "-u" << mediaUrls[ index ].url();
+ proc.start( TDEProcess::DontCare );
+ } else {
+ krMtMan.unmount( urls[ index ].path(), false );
+ }
+ }
+ return false;
+}
+
+bool MediaButton::eject( int index ) {
+ if ( (unsigned)index < mimes.count() ) {
+ if( !mediaUrls[ index ].isEmpty() ) {
+ TDEProcess proc;
+ proc << KrServices::fullPathName( "tdeio_media_mounthelper" ) << "-e" << mediaUrls[ index ].url();
+ proc.start( TDEProcess::DontCare );
+ } else {
+ krMtMan.eject( urls[ index ].path() );
+ }
+ }
+ return false;
+}
+
+void MediaButton::slotTimeout() {
+ if( isHidden() && ( waitingForMount < 0 ) )
+ return;
+
+ KMountPoint::List mountList = KMountPoint::currentMountPoints();
+
+ for( unsigned index = 0; index < urls.count(); index++ ) {
+ bool mounted = false;
+
+ TQString text = popupMenu->text( index );
+
+ if( mediaUrls[ index ].isEmpty() ) {
+ for (KMountPoint::List::iterator it = mountList.begin(); it != mountList.end(); ++it)
+ if( (*it)->mountPoint() == urls[ index ].path() ) {
+ mounted = true;;
+ break;
+ }
+ } else {
+ KURL uri = getLocalPath( mediaUrls[ index ], &mountList );
+ if( uri.isLocalFile() ) {
+ urls[ index ] = uri;
+ mounted = true;
+
+ if( !text.contains( uri.path() ) )
+ {
+ if( text.endsWith( "]" ) )
+ {
+ int ndx = text.findRev( " [" );
+ if( ndx >0 )
+ text.truncate( ndx );
+ }
+
+ text += " [" + uri.path() + "]";
+ }
+ }
+ else
+ {
+ if( text.endsWith( "]" ) )
+ {
+ int ndx = text.findRev( " [" );
+ if( ndx >0 )
+ text.truncate( ndx );
+ }
+ }
+ }
+
+ if( quasiMounted[ index ] ) // mounted but not listed with DF
+ mounted = false;
+
+ if( mimes[ index ].contains( "_mounted" ) && !mounted )
+ mimes[ index ] = mimes[ index ].replace( "_mounted", "_unmounted" );
+ if( mimes[ index ].contains( "_unmounted" ) && mounted )
+ mimes[ index ] = mimes[ index ].replace( "_unmounted", "_mounted" );
+
+ TQPixmap pixmap = FL_LOADICON( KMimeType::mimeType( mimes[ index ] ) ->icon( TQString(), true ) );
+ popupMenu->changeItem( index, pixmap, text );
+
+ if( ((int)index == waitingForMount) && mounted ) {
+ waitingForMount = -1;
+ if( newTabAfterMount )
+ SLOTS->newTab( urls[ index ] );
+ else
+ emit openUrl( urls[ index ] );
+ }
+ }
+
+ if( waitingForMount >= 0 ) { // maximum wait for mounting expired ?
+ if( --maxMountWait < 0 ) {
+ waitingForMount = -1;
+ return;
+ }
+ }
+
+ mountCheckerTimer.start( 1000, true );
+}
+
+
+#include "mediabutton.moc"