summaryrefslogtreecommitdiff
path: root/libfm-qt-ultracopier
diff options
context:
space:
mode:
authorThomas Preud'homme <robotux@celest.fr>2020-08-11 22:35:12 +0100
committerThomas Preud'homme <robotux@celest.fr>2020-08-11 22:35:12 +0100
commit3ac113857071fc1f225b2e1b42547269e568c6b7 (patch)
tree8b28dd9c44a0d3c7ab8187cd8d8f19d47591d813 /libfm-qt-ultracopier
parent9b10c21f5cad0e2ec27d23c59e65af7141a226f3 (diff)
New upstream version 2.2.4.4
Diffstat (limited to 'libfm-qt-ultracopier')
-rw-r--r--libfm-qt-ultracopier/README1
-rw-r--r--libfm-qt-ultracopier/libfm-qt-ultracopier.pro14
-rw-r--r--libfm-qt-ultracopier/utilities.cpp89
-rw-r--r--libfm-qt-ultracopier/utilities.h21
4 files changed, 125 insertions, 0 deletions
diff --git a/libfm-qt-ultracopier/README b/libfm-qt-ultracopier/README
new file mode 100644
index 0000000..b3f7dd6
--- /dev/null
+++ b/libfm-qt-ultracopier/README
@@ -0,0 +1 @@
+LD_LIBRARY_PATH=/home/user/Desktop/ultracopier/sources/build-libfm-qt-ultracopier-Desktop-Debug/libfm-qt.so.1.0.0 pcmanfm-qt
diff --git a/libfm-qt-ultracopier/libfm-qt-ultracopier.pro b/libfm-qt-ultracopier/libfm-qt-ultracopier.pro
new file mode 100644
index 0000000..19cedba
--- /dev/null
+++ b/libfm-qt-ultracopier/libfm-qt-ultracopier.pro
@@ -0,0 +1,14 @@
+CONFIG += c++11
+
+TEMPLATE = lib
+QT += network widgets
+TARGET = $$qtLibraryTarget(fm-qt)
+LIBS += -Llibfm-qt
+INCLUDEPATH += /usr/include/glib-2.0/ /usr/lib64/glib-2.0/include/
+DEFINES += QT_NO_KEYWORDS
+
+HEADERS += \
+ utilities.h
+
+SOURCES += \
+ utilities.cpp
diff --git a/libfm-qt-ultracopier/utilities.cpp b/libfm-qt-ultracopier/utilities.cpp
new file mode 100644
index 0000000..38b87f6
--- /dev/null
+++ b/libfm-qt-ultracopier/utilities.cpp
@@ -0,0 +1,89 @@
+#include "utilities.h"
+#include <QClipboard>
+#include <QApplication>
+#include <libfm-qt/foldermodel.h>
+#include <libfm-qt/fileoperation.h>
+#include <dlfcn.h>
+
+namespace Fm {
+
+void sendRawOrderList(const QStringList & order, QLocalSocket &socket, int idNextOrder)
+{
+ QByteArray block;
+ QDataStream out(&block, QIODevice::WriteOnly);
+ out.setVersion(QDataStream::Qt_4_4);
+ out << int(0);
+ out << idNextOrder;
+ out << order;
+ out.device()->seek(0);
+ out << block.size();
+ do //cut string list and send it as block of 32KB
+ {
+ QByteArray blockToSend;
+ int byteWriten;
+ blockToSend=block.left(32*1024);//32KB
+ block.remove(0,blockToSend.size());
+ byteWriten = socket.write(blockToSend);
+ }
+ while(block.size());
+}
+
+void pasteFilesFromClipboard(const Fm::FilePath& destPath, QWidget* parent) {
+ //https://gist.github.com/mooware/1174572
+ typedef std::pair<Fm::FilePathList, bool> (*methodType)(const QMimeData& data);
+
+ static methodType origMethod = 0;
+
+ // use the mangled method name here. RTLD_NEXT means something like
+ // "search this symbol in any libraries loaded after the current one".
+ void *tmpPtr = dlsym(RTLD_NEXT, "pasteFilesFromClipboard");
+
+ // not even reinterpret_cast can convert between void* and a method ptr,
+ // so i'm doing the worst hack i've ever seen.
+ memcpy(&origMethod, &tmpPtr, sizeof(tmpPtr));
+
+ QClipboard* clipboard = QApplication::clipboard();
+ const QMimeData* data = clipboard->mimeData();
+ Fm::FilePathList paths;
+ bool isCut = false;
+
+ std::tie(paths, isCut) = (*origMethod)(*data);
+
+ if(!paths.empty()) {
+ QLocalSocket socket;
+ socket.connectToServer(QString::fromStdString("advanced-copier-"+std::to_string(getuid())));
+ socket.waitForConnected();
+ if(socket.state()==QLocalSocket::ConnectedState)
+ {
+ sendRawOrderList(QStringList() << "protocol" << "0002", socket, 1);
+ socket.waitForReadyRead();
+ socket.readAll();
+ QStringList l;
+ if(isCut) {
+ l << "mv";
+ clipboard->clear(QClipboard::Clipboard);
+ }
+ else {
+ l << "cp";
+ }
+ for(const FilePath &n : paths)
+ l << n.toString().get();
+ l << destPath.toString().get();
+ sendRawOrderList(l, socket, 2);
+ socket.waitForBytesWritten();
+ socket.close();
+ }
+ else
+ {
+ if(isCut) {
+ FileOperation::moveFiles(paths, destPath, parent);
+ clipboard->clear(QClipboard::Clipboard);
+ }
+ else {
+ FileOperation::copyFiles(paths, destPath, parent);
+ }
+ }
+ }
+}
+
+} // namespace Fm
diff --git a/libfm-qt-ultracopier/utilities.h b/libfm-qt-ultracopier/utilities.h
new file mode 100644
index 0000000..e96e0d4
--- /dev/null
+++ b/libfm-qt-ultracopier/utilities.h
@@ -0,0 +1,21 @@
+#include <QWidget>
+#include <QStringList>
+#include <QLocalSocket>
+
+#include <libfm-qt/utilities.h>
+#include <libfm-qt/core/filepath.h>
+
+#ifndef FM_UTILITIESUC_H
+#define FM_UTILITIESUC_H
+
+namespace Fm {
+
+__attribute__((visibility("default"))) void pasteFilesFromClipboard(const Fm::FilePath& destPath, QWidget* parent);
+
+std::string pathSocket();
+char * toHex(const char *str);
+void sendRawOrderList(const QStringList & order, QLocalSocket &socket);
+
+}
+
+#endif // FM_UTILITIESUC_H