mirror of
https://git.jami.net/savoirfairelinux/jami-client-qt.git
synced 2025-08-04 14:55:43 +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:
parent
932fbae84b
commit
ce7089a7a4
6 changed files with 13 additions and 205 deletions
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
Loading…
Add table
Reference in a new issue