40 auto startMessage = QDBusMessage::createMethodCall(portalService, portalPath,
41 fileTransferInterface,
"StartTransfer"_L1);
42 const QVariantMap options{ {
"writable"_L1,
true }, {
"autostop"_L1,
true } };
43 startMessage.setArguments({ options });
44 const QDBusReply<QString> key = QDBusConnection::sessionBus().call(startMessage);
46 qCWarning(lcQpaPortalFileTransfer) <<
"failed to start transfer" << key.error();
49 QList<QDBusUnixFileDescriptor> fds;
50 for (
const auto &url : urls) {
51 if (
int fd = qt_safe_open(QFile::encodeName(url.toLocalFile()),
O_PATH); fd >= 0)
52 fds.emplaceBack().giveFileDescriptor(fd);
54 qCInfo(lcQpaPortalFileTransfer) <<
"failed to open" << url;
56 auto nextChunk = [&fds](
auto lastEnd) {
57 constexpr qsizetype chunkSize = 16;
58 const auto remaining = fds.cend() - lastEnd;
59 return std::pair{lastEnd, std::next(lastEnd, std::min(remaining, chunkSize))};
61 for (
auto chunk = nextChunk(fds.cbegin()); chunk.first != fds.cend(); chunk = nextChunk(chunk.second)) {
62 auto addFilesMessage = QDBusMessage::createMethodCall(portalService, portalPath, fileTransferInterface,
"AddFiles"_L1);
63 addFilesMessage.setArguments({key.value(), QVariant::fromValue(QList<QDBusUnixFileDescriptor>{chunk.first, chunk.second}), QVariantMap{}});
64 const QDBusReply<
void> addFilesResult = QDBusConnection::sessionBus().call(addFilesMessage, QDBus::Block, portalWaitTimeMs);
65 if (!addFilesResult.isValid()) {
66 qCWarning(lcQpaPortalFileTransfer) <<
"failed to add files" << addFilesResult.error();
75 qCDebug(lcQpaPortalFileTransfer) <<
"retrieving files for" << key;
76 auto message = QDBusMessage::createMethodCall(portalService, portalPath, fileTransferInterface,
"RetrieveFiles"_L1);
77 message.setArguments({key, QVariantMap()});
78 const QDBusReply<QStringList> reply = QDBusConnection::sessionBus().call(message, QDBus::Block, portalWaitTimeMs);
79 if (!reply.isValid()) {
80 qCDebug(lcQpaPortalFileTransfer) <<
"error retrieving files" << reply.error();