#include <QtDBus>
#include <QDropEvent>
-QString DragAndDropHelper::dropUrls(const KFileItem& destItem,
- const KUrl& destPath,
- QDropEvent* event)
+KonqOperations* DragAndDropHelper::dropUrls(const KFileItem& destItem, const KUrl& destUrl, QDropEvent* event, QString& error)
{
- const bool dropToItem = !destItem.isNull() && (destItem.isDir() || destItem.isDesktopFile());
- const KUrl destination = dropToItem ? destItem.url() : destPath;
+ error.clear();
+
+ if (!destItem.isNull() && !destItem.isWritable()) {
+ error = i18nc("@info:status", "Access denied. Could not write to <filename>%1</filename>", destUrl.pathOrUrl());
+ return 0;
+ }
const QMimeData* mimeData = event->mimeData();
- if (mimeData->hasFormat("application/x-kde-dndextract")) {
- const QString remoteDBusClient = mimeData->data("application/x-kde-dndextract");
- QDBusMessage message = QDBusMessage::createMethodCall(remoteDBusClient, "/DndExtract",
- "org.kde.DndExtract", "extractSelectedFilesTo");
- message.setArguments(QVariantList() << destination.pathOrUrl());
+ if (mimeData->hasFormat("application/x-kde-ark-dndextract-service") &&
+ mimeData->hasFormat("application/x-kde-ark-dndextract-path")) {
+ const QString remoteDBusClient = mimeData->data("application/x-kde-ark-dndextract-service");
+ const QString remoteDBusPath = mimeData->data("application/x-kde-ark-dndextract-path");
+
+ QDBusMessage message = QDBusMessage::createMethodCall(remoteDBusClient, remoteDBusPath,
+ "org.kde.ark.DndExtract", "extractSelectedFilesTo");
+ message.setArguments(QVariantList() << destUrl.pathOrUrl());
QDBusConnection::sessionBus().call(message);
- } else {
+ } else if (!destItem.isNull() && (destItem.isDir() || destItem.isDesktopFile())) {
+ // Drop into a directory or a desktop-file
const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData());
- const int urlsCount = urls.count();
- if (urlsCount == 1 && urls.first() == destination) {
- return i18nc("@info:status", "A folder cannot be dropped into itself");
- } else if (dropToItem) {
- KonqOperations::doDrop(destItem, destination, event, QApplication::activeWindow());
- } else {
- KonqOperations::doDrop(KFileItem(), destination, event, QApplication::activeWindow());
+ foreach (const KUrl& url, urls) {
+ if (url == destUrl) {
+ error = i18nc("@info:status", "A folder cannot be dropped into itself");
+ return 0;
+ }
}
+
+ return KonqOperations::doDrop(destItem, destUrl, event, QApplication::activeWindow(), QList<QAction*>());
+ } else {
+ return KonqOperations::doDrop(KFileItem(), destUrl, event, QApplication::activeWindow(), QList<QAction*>());
}
- return QString();
+ return 0;
}