1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2025-08-04 06:45:45 +02:00

datatransfer: remove path for non swarm conversations

Change-Id: I48a4a03910400c004da7b760923303636eba42e6
GitLab: https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/524
This commit is contained in:
Sébastien Blin 2022-07-20 13:18:21 -04:00
parent 932fbae84b
commit ce7089a7a4
6 changed files with 13 additions and 205 deletions

View file

@ -290,8 +290,6 @@ public:
void acceptTransfer(const QString& convUid, const QString& interactionId); void acceptTransfer(const QString& convUid, const QString& interactionId);
void acceptTransfer(const QString& convUid, const QString& interactionId, const QString& path);
void cancelTransfer(const QString& convUid, const QString& interactionId); void cancelTransfer(const QString& convUid, const QString& interactionId);
void getTransferInfo(const QString& conversationId, void getTransferInfo(const QString& conversationId,

View file

@ -52,13 +52,10 @@ public:
~DataTransferModel(); ~DataTransferModel();
void sendFile(const QString& account_id, void sendFile(const QString& account_id,
const QString& peer_uri,
const QString& conversationId, const QString& conversationId,
const QString& file_path, const QString& file_path,
const QString& display_name); const QString& display_name);
void transferInfo(const QString& accountId, const QString& fileId, datatransfer::Info& lrc_info);
void fileTransferInfo(const QString& accountId, void fileTransferInfo(const QString& accountId,
const QString& conversationId, const QString& conversationId,
const QString& fileId, const QString& fileId,

View file

@ -591,13 +591,7 @@ CallbacksHandler::slotDataTransferEvent(const QString& accountId,
api::datatransfer::Info info; api::datatransfer::Info info;
if (conversationId.isEmpty()) { if (conversationId.isEmpty()) {
try {
parent.getAccountModel()
.getAccountInfo(accountId)
.dataTransferModel->transferInfo(accountId, fileId, info);
} catch (...) {
return; return;
}
} else { } else {
info.uid = fileId; info.uid = fileId;
info.status = convertDataTransferEvent(event); info.status = convertDataTransferEvent(event);

View file

@ -210,13 +210,9 @@ public:
* accept a file transfer * accept a file transfer
* @param convUid * @param convUid
* @param interactionId * @param interactionId
* @param final name of the file
*/ */
void acceptTransfer(const QString& convUid, const QString& interactionId, const QString& path); void acceptTransfer(const QString& convUid, const QString& interactionId);
void handleIncomingFile(const QString& convId, void handleIncomingFile(const QString& convId, const QString& interactionId, int totalSize);
const QString& interactionId,
const QString& displayName,
int totalSize);
void addConversationRequest(const MapStringString& convRequest); void addConversationRequest(const MapStringString& convRequest);
void addContactRequest(const QString& contactUri); void addContactRequest(const QString& contactUri);
@ -2296,10 +2292,7 @@ ConversationModelPimpl::slotConversationLoaded(uint32_t requestId,
insertSwarmInteraction(msgId, msg, conversation, true); insertSwarmInteraction(msgId, msg, conversation, true);
if (downloadFile) { if (downloadFile) {
// Note, we must do this after insertSwarmInteraction to find the interaction // Note, we must do this after insertSwarmInteraction to find the interaction
handleIncomingFile(conversationId, handleIncomingFile(conversationId, msgId, message["totalSize"].toInt());
msgId,
message["displayName"],
message["totalSize"].toInt());
} }
} }
@ -2423,10 +2416,7 @@ ConversationModelPimpl::slotMessageReceived(const QString& accountId,
Q_EMIT linked.newInteraction(conversationId, msgId, msg); Q_EMIT linked.newInteraction(conversationId, msgId, msg);
Q_EMIT linked.modelChanged(); Q_EMIT linked.modelChanged();
if (msg.status == interaction::Status::TRANSFER_AWAITING_HOST) { if (msg.status == interaction::Status::TRANSFER_AWAITING_HOST) {
handleIncomingFile(conversationId, handleIncomingFile(conversationId, msgId, message["totalSize"].toInt());
msgId,
message["displayName"],
message["totalSize"].toInt());
} }
Q_EMIT linked.dataChanged(indexOf(conversationId)); Q_EMIT linked.dataChanged(indexOf(conversationId));
} catch (const std::exception& e) { } catch (const std::exception& e) {
@ -3607,7 +3597,7 @@ ConversationModel::sendFile(const QString& convUid, const QString& path, const Q
try { try {
auto& conversation = pimpl_->getConversationForUid(convUid, true).get(); auto& conversation = pimpl_->getConversationForUid(convUid, true).get();
if (conversation.isSwarm()) { if (conversation.isSwarm()) {
owner.dataTransferModel->sendFile(owner.id, "", convUid, path, filename); owner.dataTransferModel->sendFile(owner.id, convUid, path, filename);
return; return;
} }
auto peers = pimpl_->peersForConversation(conversation); auto peers = pimpl_->peersForConversation(conversation);
@ -3643,10 +3633,7 @@ ConversationModel::sendFile(const QString& convUid, const QString& path, const Q
qDebug() << "ContactModel::sendFile: denied, contact is banned"; qDebug() << "ContactModel::sendFile: denied, contact is banned";
return; return;
} }
auto& conversation = conversationOpt->get(); owner.dataTransferModel->sendFile(owner.id, conversationId, path, filename);
// for non swarm conversation id should be empty, so peerId will be takin in consideration
auto id = conversation.mode != conversation::Mode::NON_SWARM ? conversationId : "";
owner.dataTransferModel->sendFile(owner.id, peerId, id, path, filename);
} catch (...) { } catch (...) {
} }
}); });
@ -3679,15 +3666,7 @@ ConversationModel::acceptTransfer(const QString& convUid, const QString& interac
{ {
lrc::api::datatransfer::Info info = {}; lrc::api::datatransfer::Info info = {};
getTransferInfo(convUid, interactionId, info); getTransferInfo(convUid, interactionId, info);
acceptTransfer(convUid, interactionId, info.displayName); pimpl_->acceptTransfer(convUid, interactionId);
}
void
ConversationModel::acceptTransfer(const QString& convUid,
const QString& interactionId,
const QString& path)
{
pimpl_->acceptTransfer(convUid, interactionId, path);
} }
void void
@ -3737,11 +3716,7 @@ ConversationModel::getTransferInfo(const QString& conversationId,
return; return;
auto fileId = owner.dataTransferModel->getFileIdFromInteractionId(interactionId); auto fileId = owner.dataTransferModel->getFileIdFromInteractionId(interactionId);
if (convOpt->get().mode == conversation::Mode::NON_SWARM) { if (convOpt->get().mode == conversation::Mode::NON_SWARM) {
try { return;
owner.dataTransferModel->transferInfo(owner.id, fileId, info);
} catch (...) {
info.status = datatransfer::Status::INVALID;
}
} else { } else {
QString path; QString path;
qlonglong bytesProgress, totalSize; qlonglong bytesProgress, totalSize;
@ -3915,13 +3890,12 @@ ConversationModelPimpl::awaitingHost(const QString& fileId, datatransfer::Info i
return; return;
} }
} }
handleIncomingFile(conversationId, interactionId, info.displayName, info.totalSize); handleIncomingFile(conversationId, interactionId, info.totalSize);
} }
void void
ConversationModelPimpl::handleIncomingFile(const QString& convId, ConversationModelPimpl::handleIncomingFile(const QString& convId,
const QString& interactionId, const QString& interactionId,
const QString& displayName,
int totalSize) int totalSize)
{ {
// If it's an accepted file type and less than 20 MB, accept transfer. // If it's an accepted file type and less than 20 MB, accept transfer.
@ -3930,75 +3904,17 @@ ConversationModelPimpl::handleIncomingFile(const QString& convId,
|| (totalSize > 0 || (totalSize > 0
&& static_cast<unsigned>(totalSize) && static_cast<unsigned>(totalSize)
< linked.owner.accountModel->autoTransferSizeThreshold * 1024 * 1024)) { < linked.owner.accountModel->autoTransferSizeThreshold * 1024 * 1024)) {
acceptTransfer(convId, interactionId, displayName); acceptTransfer(convId, interactionId);
} }
} }
} }
void void
ConversationModelPimpl::acceptTransfer(const QString& convUid, ConversationModelPimpl::acceptTransfer(const QString& convUid, const QString& interactionId)
const QString& interactionId,
const QString& path)
{ {
auto& conversation = getConversationForUid(convUid).get(); auto& conversation = getConversationForUid(convUid).get();
if (conversation.isLegacy()) { if (conversation.isLegacy()) // Ignore legacy
// This is a fallback, will be removed when swarm will be mandatory
auto destinationDir = linked.owner.accountModel->downloadDirectory;
if (destinationDir.isEmpty()) {
return; return;
}
#ifdef Q_OS_WIN
if (destinationDir.right(1) != '/') {
destinationDir += "/";
}
#endif
QDir dir = QFileInfo(destinationDir + path).absoluteDir();
if (!dir.exists())
dir.mkpath(".");
auto acceptedFilePath = linked.owner.dataTransferModel->accept(linked.owner.id,
interactionId,
destinationDir + path);
auto fileId = linked.owner.dataTransferModel->getFileIdFromInteractionId(interactionId);
if (transfIdToDbIntId.find(fileId) != transfIdToDbIntId.end()) {
auto dbInteractionId = transfIdToDbIntId[fileId];
storage::updateInteractionBody(db, dbInteractionId, acceptedFilePath);
storage::updateInteractionStatus(db,
dbInteractionId,
interaction::Status::TRANSFER_ACCEPTED);
} else {
storage::updateInteractionBody(db, interactionId, acceptedFilePath);
storage::updateInteractionStatus(db,
interactionId,
interaction::Status::TRANSFER_ACCEPTED);
}
// prepare interaction Info and emit signal for the client
auto conversationIdx = indexOf(convUid);
interaction::Info itCopy;
bool emitUpdated = false;
if (conversationIdx != -1) {
std::lock_guard<std::mutex> lk(interactionsLocks[convUid]);
auto& interactions = conversations[conversationIdx].interactions;
auto it = interactions->find(interactionId);
if (it != interactions->end()) {
it->second.body = acceptedFilePath;
it->second.status = interaction::Status::TRANSFER_ACCEPTED;
using namespace MessageList;
interactions->emitDataChanged(it, {Role::Body, Role::Status});
emitUpdated = true;
itCopy = it->second;
}
}
if (emitUpdated) {
if (conversations[conversationIdx].isCoreDialog()) {
sendContactRequest(peersForConversation(conversations[conversationIdx]).front());
}
invalidateModel();
Q_EMIT linked.interactionStatusUpdated(convUid, interactionId, itCopy);
Q_EMIT behaviorController.newReadInteraction(linked.owner.id, convUid, interactionId);
}
return;
}
auto interaction = conversation.interactions->find(interactionId); auto interaction = conversation.interactions->find(interactionId);
if (interaction != conversation.interactions->end()) { if (interaction != conversation.interactions->end()) {

View file

@ -130,58 +130,12 @@ DataTransferModel::DataTransferModel()
DataTransferModel::~DataTransferModel() = default; DataTransferModel::~DataTransferModel() = default;
void
DataTransferModel::transferInfo(const QString& accountId,
const QString& fileId,
datatransfer::Info& lrc_info)
{
DataTransferInfo infoFromDaemon;
if (ConfigurationManager::instance().dataTransferInfo(accountId, fileId, infoFromDaemon) == 0) {
lrc_info.uid = fileId;
lrc_info.status = convertDataTransferEvent(
DRing::DataTransferEventCode(infoFromDaemon.lastEvent));
lrc_info.isOutgoing = !(infoFromDaemon.flags
& (1 << uint32_t(DRing::DataTransferFlags::direction)));
lrc_info.totalSize = infoFromDaemon.totalSize;
lrc_info.progress = infoFromDaemon.bytesProgress;
lrc_info.path = infoFromDaemon.path;
lrc_info.displayName = infoFromDaemon.displayName;
lrc_info.accountId = infoFromDaemon.accountId;
lrc_info.peerUri = infoFromDaemon.peer;
lrc_info.conversationId = infoFromDaemon.conversationId;
// lrc_info.timestamp = ?
return;
}
lrc_info.status = datatransfer::Status::INVALID;
}
void void
DataTransferModel::sendFile(const QString& accountId, DataTransferModel::sendFile(const QString& accountId,
const QString& peer_uri,
const QString& conversationId, const QString& conversationId,
const QString& filePath, const QString& filePath,
const QString& displayName) const QString& displayName)
{ {
if (conversationId.isEmpty()) {
// Fallback
DataTransferInfo info;
#ifdef ENABLE_LIBWRAP
DRing::DataTransferId id;
#else
qulonglong id;
#endif
info.accountId = accountId;
info.peer = peer_uri;
info.path = filePath;
info.conversationId = conversationId;
info.displayName = displayName;
info.bytesProgress = 0;
if (ConfigurationManager::instance().sendFileLegacy(info, id) != 0)
qWarning() << "DataTransferModel::sendFile(), error";
return;
}
ConfigurationManager::instance().sendFile(accountId, ConfigurationManager::instance().sendFile(accountId,
conversationId, conversationId,
filePath, filePath,
@ -201,15 +155,6 @@ DataTransferModel::fileTransferInfo(const QString& accountId,
.fileTransferInfo(accountId, conversationId, fileId, path, total, progress); .fileTransferInfo(accountId, conversationId, fileId, path, total, progress);
} }
QString
DataTransferModel::accept(const QString& accountId, const QString& fileId, const QString& filePath)
{
auto uniqueFilePath = pimpl_->getUniqueFilePath(filePath);
auto daemonFileId = pimpl_->interactionToFileId[fileId];
ConfigurationManager::instance().acceptFileTransfer(accountId, daemonFileId, uniqueFilePath);
return uniqueFilePath;
}
void void
DataTransferModel::download(const QString& accountId, DataTransferModel::download(const QString& accountId,
const QString& convId, const QString& convId,

View file

@ -907,22 +907,6 @@ public Q_SLOTS: // METHODS
return convertMap(DRing::getContactDetails(accountID.toStdString(), uri.toStdString())); return convertMap(DRing::getContactDetails(accountID.toStdString(), uri.toStdString()));
} }
uint32_t sendFileLegacy(const DataTransferInfo& lrc_info, DRing::DataTransferId& id)
{
DRing::DataTransferInfo transfer_info;
transfer_info.accountId = lrc_info.accountId.toStdString();
transfer_info.lastEvent = decltype(transfer_info.lastEvent)(lrc_info.lastEvent);
transfer_info.flags = lrc_info.flags;
transfer_info.totalSize = lrc_info.totalSize;
transfer_info.bytesProgress = lrc_info.bytesProgress;
transfer_info.peer = lrc_info.peer.toStdString();
transfer_info.conversationId = lrc_info.conversationId.toStdString();
transfer_info.displayName = lrc_info.displayName.toStdString();
transfer_info.path = lrc_info.path.toStdString();
transfer_info.mimetype = lrc_info.mimetype.toStdString();
return uint32_t(DRing::sendFileLegacy(transfer_info, id));
}
void sendFile(const QString& accountId, void sendFile(const QString& accountId,
const QString& conversationId, const QString& conversationId,
const QString& filePath, const QString& filePath,
@ -936,25 +920,6 @@ public Q_SLOTS: // METHODS
parent.toStdString()); parent.toStdString());
} }
uint32_t dataTransferInfo(QString accountId, QString transfer_id, DataTransferInfo& lrc_info)
{
DRing::DataTransferInfo transfer_info;
auto error = uint32_t(DRing::dataTransferInfo(accountId.toStdString(),
transfer_id.toStdString(),
transfer_info));
lrc_info.accountId = QString::fromStdString(transfer_info.accountId);
lrc_info.lastEvent = quint32(transfer_info.lastEvent);
lrc_info.flags = transfer_info.flags;
lrc_info.totalSize = transfer_info.totalSize;
lrc_info.bytesProgress = transfer_info.bytesProgress;
lrc_info.peer = QString::fromStdString(transfer_info.peer);
lrc_info.conversationId = QString::fromStdString(transfer_info.conversationId);
lrc_info.displayName = QString::fromStdString(transfer_info.displayName);
lrc_info.path = QString::fromStdString(transfer_info.path);
lrc_info.mimetype = QString::fromStdString(transfer_info.mimetype);
return error;
}
uint64_t fileTransferInfo(QString accountId, uint64_t fileTransferInfo(QString accountId,
QString conversationId, QString conversationId,
QString fileId, QString fileId,
@ -973,13 +938,6 @@ public Q_SLOTS: // METHODS
return result; return result;
} }
uint32_t acceptFileTransfer(QString accountId, const QString& fileId, const QString& file_path)
{
return uint32_t(DRing::acceptFileTransfer(accountId.toStdString(),
fileId.toStdString(),
file_path.toStdString()));
}
uint32_t cancelDataTransfer(QString accountId, QString conversationId, QString transfer_id) uint32_t cancelDataTransfer(QString accountId, QString conversationId, QString transfer_id)
{ {
return uint32_t(DRing::cancelDataTransfer(accountId.toStdString(), return uint32_t(DRing::cancelDataTransfer(accountId.toStdString(),