diff options
author | Thomas Preud'homme <robotux@celest.fr> | 2020-08-11 22:35:12 +0100 |
---|---|---|
committer | Thomas Preud'homme <robotux@celest.fr> | 2020-08-11 22:35:12 +0100 |
commit | 3ac113857071fc1f225b2e1b42547269e568c6b7 (patch) | |
tree | 8b28dd9c44a0d3c7ab8187cd8d8f19d47591d813 /libfm-qt-ultracopier | |
parent | 9b10c21f5cad0e2ec27d23c59e65af7141a226f3 (diff) |
New upstream version 2.2.4.4
Diffstat (limited to 'libfm-qt-ultracopier')
-rw-r--r-- | libfm-qt-ultracopier/README | 1 | ||||
-rw-r--r-- | libfm-qt-ultracopier/libfm-qt-ultracopier.pro | 14 | ||||
-rw-r--r-- | libfm-qt-ultracopier/utilities.cpp | 89 | ||||
-rw-r--r-- | libfm-qt-ultracopier/utilities.h | 21 |
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 |