/** * Returns true if this is a desktop file. * Mimetype determination is optional. */ static bool checkDesktopFile(const KFileItem& item, bool _determineMimeType) { // only local files bool isLocal; const KUrl url = item.mostLocalUrl(isLocal); if (!isLocal) return false; // only regular files if (!item.isRegularFile()) return false; // only if readable if (!item.isReadable()) return false; // return true if desktop file KMimeType::Ptr mime = _determineMimeType ? item.determineMimeType() : item.mimeTypePtr(); return mime->is("application/x-desktop"); }
void KonqOperations::asyncDrop( const KFileItem & destItem ) { assert(m_info); // setDropInfo should have been called before asyncDrop bool m_destIsLocal = false; m_destUrl = destItem.mostLocalUrl(m_destIsLocal); // #168154 //kDebug(1203) << "destItem->mode=" << destItem->mode() << " url=" << m_destUrl; // Check what the destination is if ( destItem.isDir() ) { doDropFileCopy(); return; } if ( !m_destIsLocal ) { // We dropped onto a remote URL that is not a directory! // (e.g. an HTTP link in the sidebar). // Can't do that, but we can't prevent it before stating the dest.... kWarning(1203) << "Cannot drop onto " << m_destUrl ; deleteLater(); return; } if ( destItem.isDesktopFile() ) { // Local .desktop file. What type ? KDesktopFile desktopFile( m_destUrl.path() ); KConfigGroup desktopGroup = desktopFile.desktopGroup(); if ( desktopFile.hasApplicationType() ) { QString error; const QStringList urlStrList = m_info->urls.toStringList(); if ( KToolInvocation::startServiceByDesktopPath( m_destUrl.path(), urlStrList, &error ) > 0 ) KMessageBox::error( parentWidget(), error ); } else { // Device or Link -> adjust dest if ( desktopFile.hasDeviceType() && desktopGroup.hasKey("MountPoint") ) { QString point = desktopGroup.readEntry( "MountPoint" ); m_destUrl.setPath( point ); QString dev = desktopFile.readDevice(); KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByDevice( dev ); // Is the device already mounted ? if ( mp ) { doDropFileCopy(); } else { const bool ro = desktopGroup.readEntry( "ReadOnly", false ); const QByteArray fstype = desktopGroup.readEntry( "FSType" ).toLatin1(); KAutoMount* am = new KAutoMount( ro, fstype, dev, point, m_destUrl.path(), false ); connect( am, SIGNAL(finished()), this, SLOT(doDropFileCopy()) ); } return; } else if ( desktopFile.hasLinkType() && desktopGroup.hasKey("URL") ) { m_destUrl = desktopGroup.readPathEntry("URL", QString()); doDropFileCopy(); return; } // else, well: mimetype, service, servicetype or .directory. Can't really drop anything on those. } } else { // Should be a local executable // (If this fails, there is a bug in KFileItem::acceptsDrops / KDirModel::flags) kDebug(1203) << m_destUrl.path() << "should be an executable"; Q_ASSERT ( access( QFile::encodeName(m_destUrl.path()), X_OK ) == 0 ); // Launch executable for each of the files QStringList args; const KUrl::List lst = m_info->urls; KUrl::List::ConstIterator it = lst.begin(); for ( ; it != lst.end() ; it++ ) args << (*it).path(); // assume local files kDebug(1203) << "starting " << m_destUrl.path() << " with " << lst.count() << " arguments"; QProcess::startDetached( m_destUrl.path(), args ); } deleteLater(); }