Skip to content
Snippets Groups Projects
Commit 58ffa3ed authored by Kateryna Kostiuk's avatar Kateryna Kostiuk Committed by Sébastien Blin
Browse files

swarm: transfer model per account

Change-Id: Iac73a4ae43fec2228e04f3156239ca9a4ebeab85
parent f83034bd
No related branches found
No related tags found
No related merge requests found
......@@ -37,6 +37,7 @@ class NewAccountModel;
class NewDeviceModel;
class NewCodecModel;
class PeerDiscoveryModel;
class DataTransferModel;
namespace account {
Q_NAMESPACE
......@@ -224,6 +225,7 @@ struct Info
std::unique_ptr<lrc::api::NewDeviceModel> deviceModel;
std::unique_ptr<lrc::api::NewCodecModel> codecModel;
std::unique_ptr<lrc::api::PeerDiscoveryModel> peerDiscoveryModel;
std::unique_ptr<DataTransferModel> dataTransferModel;
NewAccountModel* accountModel {nullptr};
// daemon config
......
......@@ -47,7 +47,6 @@ class Info;
class LIB_EXPORT DataTransferModel : public QObject
{
Q_OBJECT
Q_PROPERTY(QString downloadDirectory_qml MEMBER downloadDirectory)
public:
DataTransferModel();
~DataTransferModel();
......@@ -85,12 +84,6 @@ public:
DataTransferId getDringIdFromInteractionId(const QString& interactionId);
/**
* Used when images < 20 Mb are automatically accepted and downloaded
* Should contains the full directory with the end marker (/ on linux for example)
*/
QString downloadDirectory;
/**
* Creates APPDATA/received and return the path
*/
......
......@@ -59,11 +59,6 @@ public:
* @return a BehaviorController&.
*/
BehaviorController& getBehaviorController() const;
/**
* get a reference on the DataTransfer controller.
* @return a DataTransferModel&.
*/
DataTransferModel& getDataTransferModel() const;
/**
* get a reference on the audio-video controller.
* @return a AVModel&.
......
......@@ -48,6 +48,7 @@ class BehaviorController;
class LIB_EXPORT NewAccountModel : public QObject
{
Q_OBJECT
Q_PROPERTY(QString downloadDirectory_qml MEMBER downloadDirectory)
public:
NewAccountModel(Lrc& lrc,
const CallbacksHandler& callbackHandler,
......@@ -70,6 +71,12 @@ public:
* flag account corresponding to passed id as freeable.
*/
void flagFreeable(const QString& accountId) const;
/**
* Used when images < 20 Mb are automatically accepted and downloaded
* Should contains the full directory with the end marker (/ on linux for example)
*/
QString downloadDirectory;
/**
* set account enable/disable, save config and do unregister for account
* @param accountId.
......@@ -154,11 +161,10 @@ public:
* @param config
* @return the account id
*/
static QString connectToAccountManager(
const QString& username,
const QString& password,
const QString& serverUri,
const MapStringString& config = MapStringString());
static QString connectToAccountManager(const QString& username,
const QString& password,
const QString& serverUri,
const MapStringString& config = MapStringString());
/**
* Create a new Ring or SIP account
* @param type determine if the new account will be a Ring account or a SIP one
......
......@@ -519,12 +519,17 @@ CallbacksHandler::slotAccountMessageStatusChanged(const QString& accountId,
}
void
CallbacksHandler::slotDataTransferEvent(const QString& accountId, const QString& conversationId, DataTransferId dringId, uint codeStatus)
CallbacksHandler::slotDataTransferEvent(const QString& accountId,
const QString& conversationId,
DataTransferId dringId,
uint codeStatus)
{
auto event = DRing::DataTransferEventCode(codeStatus);
api::datatransfer::Info info;
parent.getDataTransferModel().transferInfo(accountId, conversationId, dringId, info);
parent.getAccountModel()
.getAccountInfo(accountId)
.dataTransferModel->transferInfo(accountId, conversationId, dringId, info);
// WARNING: info.status could be INVALID in case of async signaling
// So listeners must only take account of dringId in such case.
......
......@@ -2160,7 +2160,10 @@ ConversationModelPimpl::slotMessageReceived(const QString& accountId,
// conversation id and db id
QString transferId = message["tid"];
transferIdInt = std::stoull(message["tid"].toStdString());
lrc.getDataTransferModel().transferInfo(accountId, conversationId, transferIdInt, info);
linked.owner.dataTransferModel->transferInfo(accountId,
conversationId,
transferIdInt,
info);
// create db entry for valid data transfer
if (info.status != datatransfer::Status::INVALID) {
msg.body = info.path;
......@@ -2168,12 +2171,10 @@ ConversationModelPimpl::slotMessageReceived(const QString& accountId,
&& !interaction::isOutgoing(msg))
? interaction::Status::TRANSFER_AWAITING_HOST
: interaction::Status::TRANSFER_CREATED;
auto interactionId = storage::addDataTransferToConversation(db,
conversationId,
info);
transfIdToDbIntId[transferId] = interactionId;
lrc.getDataTransferModel().registerTransferId(transferIdInt, msgId);
}
auto interactionId = storage::addDataTransferToConversation(db, conversationId, info);
transfIdToDbIntId[transferId] = interactionId;
linked.owner.dataTransferModel->registerTransferId(transferIdInt, msgId);
} else if (msg.type == interaction::Type::CALL) {
msg.body = storage::getCallInteractionString(msg.authorUri, msg.duration);
} else if (msg.type == interaction::Type::TEXT
......@@ -3244,7 +3245,7 @@ ConversationModel::sendFile(const QString& convUid, const QString& path, const Q
conversationReady callback could be updated to ONE_TO_ONE. We still use conversationReady
callback for one_to_one conversation to check if contact is blocked*/
if (peers.size() > 1) {
pimpl_->lrc.getDataTransferModel().sendFile(owner.id, "", convUid, path, filename);
owner.dataTransferModel->sendFile(owner.id, "", convUid, path, filename);
}
const auto peerId = peers.front();
bool isTemporary = peerId == convUid;
......@@ -3257,7 +3258,7 @@ ConversationModel::sendFile(const QString& convUid, const QString& path, const Q
pimpl_->sendContactRequest(peerId);
auto cb = ([this, isTemporary, peerId, path, filename](QString conversationId) {
auto cb = ([this, peerId, path, filename](QString conversationId) {
try {
auto conversationOpt = getConversationForUid(conversationId);
if (!conversationOpt.has_value()) {
......@@ -3272,7 +3273,7 @@ ConversationModel::sendFile(const QString& convUid, const QString& path, const Q
auto& conversation = conversationOpt->get();
// for non swarm conversation id should be empty, so peerId will be takin in consideration
auto id = conversation.mode != conversation::Mode::NON_SWARM ? conversationId : "";
pimpl_->lrc.getDataTransferModel().sendFile(owner.id, peerId, id, path, filename);
owner.dataTransferModel->sendFile(owner.id, peerId, id, path, filename);
} catch (...) {
}
});
......@@ -3346,7 +3347,7 @@ ConversationModel::cancelTransfer(const QString& convUid, const QString& interac
getTransferInfo(convUid, interactionId, info);
auto identifier = info.conversationId.isEmpty() ? info.peerUri : convUid;
// Forward cancel action to daemon (will invoke slotTransferStatusCanceled)
pimpl_->lrc.getDataTransferModel().cancel(owner.id, identifier, interactionId);
owner.dataTransferModel->cancel(owner.id, identifier, interactionId);
pimpl_->invalidateModel();
emit interactionStatusUpdated(convUid, interactionId, itCopy);
emit pimpl_->behaviorController.newReadInteraction(owner.id, convUid, interactionId);
......@@ -3359,8 +3360,12 @@ ConversationModel::getTransferInfo(const QString& conversationId,
datatransfer::Info& info)
{
try {
auto dringId = pimpl_->lrc.getDataTransferModel().getDringIdFromInteractionId(interactionId);
pimpl_->lrc.getDataTransferModel().transferInfo(owner.id, conversationId, dringId, info);
auto dringId = pimpl_->linked.owner.dataTransferModel->getDringIdFromInteractionId(
interactionId);
pimpl_->linked.owner.dataTransferModel->transferInfo(owner.id,
conversationId,
dringId,
info);
} catch (...) {
info.status = datatransfer::Status::INVALID;
}
......@@ -3381,7 +3386,7 @@ ConversationModelPimpl::usefulDataFromDataTransfer(DataTransferId dringId,
if (info.accountId != linked.owner.id)
return false;
try {
interactionId = lrc.getDataTransferModel().getInteractionIdFromDringId(dringId);
interactionId = linked.owner.dataTransferModel->getInteractionIdFromDringId(dringId);
conversationId = info.conversationId.isEmpty()
? storage::conversationIdFromInteractionId(db, interactionId)
: info.conversationId;
......@@ -3424,7 +3429,7 @@ ConversationModelPimpl::slotTransferStatusCreated(DataTransferId dringId, datatr
auto interactionId = storage::addDataTransferToConversation(db, convId, info);
// map dringId and interactionId for latter retrivial from client (that only known the interactionId)
lrc.getDataTransferModel().registerTransferId(dringId, interactionId);
linked.owner.dataTransferModel->registerTransferId(dringId, interactionId);
auto interaction = interaction::Info {info.isOutgoing ? "" : info.peerUri,
info.isOutgoing ? info.path : info.displayName,
......@@ -3462,6 +3467,8 @@ void
ConversationModelPimpl::slotTransferStatusAwaitingPeer(DataTransferId dringId,
datatransfer::Info info)
{
if (info.accountId != linked.owner.id)
return;
bool intUpdated;
updateTransferStatus(dringId, info, interaction::Status::TRANSFER_AWAITING_PEER, intUpdated);
}
......@@ -3470,6 +3477,8 @@ void
ConversationModelPimpl::slotTransferStatusAwaitingHost(DataTransferId dringId,
datatransfer::Info info)
{
if (info.accountId != linked.owner.id)
return;
awaitingHost(dringId, info);
}
......@@ -3487,6 +3496,8 @@ ConversationModelPimpl::hasOneOneSwarmWith(const QString& participant)
void
ConversationModelPimpl::awaitingHost(DataTransferId dringId, datatransfer::Info info)
{
if (info.accountId != linked.owner.id)
return;
QString interactionId;
QString conversationId;
if (not usefulDataFromDataTransfer(dringId, info, interactionId, conversationId))
......@@ -3506,7 +3517,7 @@ ConversationModelPimpl::awaitingHost(DataTransferId dringId, datatransfer::Info
auto conversationIdx = indexOf(conversationId);
auto& peers = peersForConversation(conversations[conversationIdx]);
// Only accept if contact is added or it is a group conversation
if (lrc.getDataTransferModel().acceptFromUnstrusted && peers.size() == 1) {
if (linked.owner.dataTransferModel->acceptFromUnstrusted && peers.size() == 1) {
try {
auto contactUri = peers.front();
auto contactInfo = linked.owner.contactModel->getContact(contactUri);
......@@ -3517,9 +3528,9 @@ ConversationModelPimpl::awaitingHost(DataTransferId dringId, datatransfer::Info
}
}
// If it's an accepted file type and less than 20 MB, accept transfer.
if (lrc.getDataTransferModel().automaticAcceptTransfer) {
if (lrc.getDataTransferModel().acceptBehindMb == 0
|| info.totalSize < lrc.getDataTransferModel().acceptBehindMb * 1024 * 1024) {
if (linked.owner.dataTransferModel->automaticAcceptTransfer) {
if (linked.owner.dataTransferModel->acceptBehindMb == 0
|| info.totalSize < linked.owner.dataTransferModel->acceptBehindMb * 1024 * 1024) {
acceptTransfer(conversationId, interactionId, info.displayName);
}
}
......@@ -3530,7 +3541,7 @@ ConversationModelPimpl::acceptTransfer(const QString& convUid,
const QString& interactionId,
const QString& path)
{
auto destinationDir = lrc.getDataTransferModel().downloadDirectory;
auto destinationDir = linked.owner.accountModel->downloadDirectory;
if (destinationDir.isEmpty()) {
return;
}
......@@ -3547,12 +3558,12 @@ ConversationModelPimpl::acceptTransfer(const QString& convUid,
auto identifier = conversation.mode != conversation::Mode::NON_SWARM
? convUid
: peersForConversation(conversation).front();
auto acceptedFilePath = lrc.getDataTransferModel().accept(linked.owner.id,
identifier,
interactionId,
destinationDir + path,
0);
auto dringId = lrc.getDataTransferModel().getDringIdFromInteractionId(interactionId);
auto acceptedFilePath = linked.owner.dataTransferModel->accept(linked.owner.id,
identifier,
interactionId,
destinationDir + path,
0);
auto dringId = linked.owner.dataTransferModel->getDringIdFromInteractionId(interactionId);
if (transfIdToDbIntId.find(QString::number(dringId)) != transfIdToDbIntId.end()) {
auto dbInteractionId = transfIdToDbIntId[QString::number(dringId)];
storage::updateInteractionBody(db, dbInteractionId, acceptedFilePath);
......@@ -3598,6 +3609,8 @@ ConversationModelPimpl::invalidateModel()
void
ConversationModelPimpl::slotTransferStatusOngoing(DataTransferId dringId, datatransfer::Info info)
{
if (info.accountId != linked.owner.id)
return;
QString interactionId;
QString conversationId;
if (not usefulDataFromDataTransfer(dringId, info, interactionId, conversationId))
......@@ -3621,6 +3634,8 @@ ConversationModelPimpl::slotTransferStatusOngoing(DataTransferId dringId, datatr
void
ConversationModelPimpl::slotTransferStatusFinished(DataTransferId dringId, datatransfer::Info info)
{
if (info.accountId != linked.owner.id)
return;
QString interactionId;
QString conversationId;
if (not usefulDataFromDataTransfer(dringId, info, interactionId, conversationId))
......@@ -3664,6 +3679,8 @@ ConversationModelPimpl::slotTransferStatusFinished(DataTransferId dringId, datat
void
ConversationModelPimpl::slotTransferStatusCanceled(DataTransferId dringId, datatransfer::Info info)
{
if (info.accountId != linked.owner.id)
return;
bool intUpdated;
updateTransferStatus(dringId, info, interaction::Status::TRANSFER_CANCELED, intUpdated);
}
......@@ -3671,6 +3688,8 @@ ConversationModelPimpl::slotTransferStatusCanceled(DataTransferId dringId, datat
void
ConversationModelPimpl::slotTransferStatusError(DataTransferId dringId, datatransfer::Info info)
{
if (info.accountId != linked.owner.id)
return;
bool intUpdated;
updateTransferStatus(dringId, info, interaction::Status::TRANSFER_ERROR, intUpdated);
}
......@@ -3678,6 +3697,8 @@ ConversationModelPimpl::slotTransferStatusError(DataTransferId dringId, datatran
void
ConversationModelPimpl::slotTransferStatusUnjoinable(DataTransferId dringId, datatransfer::Info info)
{
if (info.accountId != linked.owner.id)
return;
bool intUpdated;
updateTransferStatus(dringId, info, interaction::Status::TRANSFER_UNJOINABLE_PEER, intUpdated);
}
......@@ -3686,6 +3707,8 @@ void
ConversationModelPimpl::slotTransferStatusTimeoutExpired(DataTransferId dringId,
datatransfer::Info info)
{
if (info.accountId != linked.owner.id)
return;
bool intUpdated;
updateTransferStatus(dringId, info, interaction::Status::TRANSFER_TIMEOUT_EXPIRED, intUpdated);
}
......@@ -3724,6 +3747,7 @@ ConversationModelPimpl::updateTransferStatus(DataTransferId dringId,
if (it != interactions.end()) {
emitUpdated = true;
it->second.status = newStatus;
it->second.body = info.path;
itCopy = it->second;
}
}
......
......@@ -60,7 +60,6 @@ public:
std::unique_ptr<BehaviorController> behaviorController;
std::unique_ptr<CallbacksHandler> callbackHandler;
std::unique_ptr<NewAccountModel> accountModel;
std::unique_ptr<DataTransferModel> dataTransferModel;
std::unique_ptr<AVModel> AVModel_;
std::unique_ptr<PluginModel> PluginModel_;
};
......@@ -100,12 +99,6 @@ Lrc::getBehaviorController() const
return *lrcPimpl_->behaviorController;
}
DataTransferModel&
Lrc::getDataTransferModel() const
{
return *lrcPimpl_->dataTransferModel;
}
AVModel&
Lrc::getAVModel() const
{
......@@ -229,7 +222,6 @@ LrcPimpl::LrcPimpl(Lrc& linked, MigrationCb& willMigrateCb, MigrationCb& didMigr
*behaviorController,
willMigrateCb,
didMigrateCb))
, dataTransferModel {std::make_unique<DataTransferModel>()}
, AVModel_ {std::make_unique<AVModel>(*callbackHandler)}
, PluginModel_ {std::make_unique<PluginModel>()}
{}
......
......@@ -29,6 +29,7 @@
#include "api/newcodecmodel.h"
#include "api/newdevicemodel.h"
#include "api/behaviorcontroller.h"
#include "api/datatransfermodel.h"
#include "authority/storagehelper.h"
#include "callbackshandler.h"
#include "database.h"
......@@ -751,6 +752,7 @@ NewAccountModelPimpl::addToAccounts(const QString& accountId, std::shared_ptr<Da
accountId);
newAccInfo.deviceModel = std::make_unique<NewDeviceModel>(newAccInfo, callbacksHandler);
newAccInfo.codecModel = std::make_unique<NewCodecModel>(newAccInfo, callbacksHandler);
newAccInfo.dataTransferModel = std::make_unique<DataTransferModel>();
}
void
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment