mirror of
https://git.jami.net/savoirfairelinux/jami-client-qt.git
synced 2025-09-10 12:03:18 +02:00
interaction: split status and transferStatus
This allow to show the correct sending/sent/state for the interaction separated from the status of the dataTransfer. Else, we see a sent check for a file even if the peer didn't receive the file Change-Id: I15b9f0abc6a26a2ffd007be26827e9a37e859bca
This commit is contained in:
parent
c5e15d26a0
commit
df3e76a1cf
12 changed files with 190 additions and 162 deletions
|
@ -40,9 +40,9 @@ Loader {
|
|||
property int seq: MsgSeq.single
|
||||
property string author: Author
|
||||
property string body: Body
|
||||
property int transferStatus: Status
|
||||
property int transferStatus: TransferStatus
|
||||
onTransferStatusChanged: {
|
||||
if (transferStatus === Interaction.Status.TRANSFER_FINISHED) {
|
||||
if (transferStatus === Interaction.TransferStatus.TRANSFER_FINISHED) {
|
||||
mediaInfo = MessagesAdapter.getMediaInfo(root.body);
|
||||
if (Object.keys(mediaInfo).length !== 0 && WITH_WEBENGINE) {
|
||||
sourceComponent = localMediaMsgComp;
|
||||
|
@ -66,7 +66,7 @@ Loader {
|
|||
|
||||
transferId: Id
|
||||
property var transferStats: MessagesAdapter.getTransferStats(transferId, root.transferStatus)
|
||||
property bool canOpen: root.transferStatus === Interaction.Status.TRANSFER_FINISHED || isOutgoing
|
||||
property bool canOpen: root.transferStatus === Interaction.TransferStatus.TRANSFER_FINISHED || isOutgoing
|
||||
property real maxMsgWidth: root.width - senderMargin -
|
||||
2 * hPadding - avatarBlockWidth
|
||||
- buttonsLoader.width - 24 - 6 - 24
|
||||
|
@ -112,18 +112,18 @@ Loader {
|
|||
|
||||
sourceComponent: {
|
||||
switch (root.transferStatus) {
|
||||
case Interaction.Status.TRANSFER_CREATED:
|
||||
case Interaction.Status.TRANSFER_FINISHED:
|
||||
case Interaction.TransferStatus.TRANSFER_CREATED:
|
||||
case Interaction.TransferStatus.TRANSFER_FINISHED:
|
||||
iconSource = JamiResources.link_black_24dp_svg
|
||||
return terminatedComp
|
||||
case Interaction.Status.TRANSFER_CANCELED:
|
||||
case Interaction.Status.TRANSFER_ERROR:
|
||||
case Interaction.Status.TRANSFER_UNJOINABLE_PEER:
|
||||
case Interaction.Status.TRANSFER_TIMEOUT_EXPIRED:
|
||||
case Interaction.Status.TRANSFER_AWAITING_HOST:
|
||||
case Interaction.TransferStatus.TRANSFER_CANCELED:
|
||||
case Interaction.TransferStatus.TRANSFER_ERROR:
|
||||
case Interaction.TransferStatus.TRANSFER_UNJOINABLE_PEER:
|
||||
case Interaction.TransferStatus.TRANSFER_TIMEOUT_EXPIRED:
|
||||
case Interaction.TransferStatus.TRANSFER_AWAITING_HOST:
|
||||
iconSource = JamiResources.download_black_24dp_svg
|
||||
return optionsComp
|
||||
case Interaction.Status.TRANSFER_ONGOING:
|
||||
case Interaction.TransferStatus.TRANSFER_ONGOING:
|
||||
iconSource = JamiResources.close_black_24dp_svg
|
||||
return optionsComp
|
||||
default:
|
||||
|
@ -158,7 +158,7 @@ Loader {
|
|||
normalColor: JamiTheme.chatviewBgColor
|
||||
imageColor: JamiTheme.chatviewButtonColor
|
||||
onClicked: {
|
||||
if (root.transferStatus === Interaction.Status.TRANSFER_ONGOING) {
|
||||
if (root.transferStatus === Interaction.TransferStatus.TRANSFER_ONGOING) {
|
||||
return MessagesAdapter.cancelFile(transferId)
|
||||
} else {
|
||||
return MessagesAdapter.acceptFile(transferId)
|
||||
|
@ -227,7 +227,7 @@ Loader {
|
|||
,ProgressBar {
|
||||
id: progressBar
|
||||
|
||||
visible: root.transferStatus === Interaction.Status.TRANSFER_ONGOING
|
||||
visible: root.transferStatus === Interaction.TransferStatus.TRANSFER_ONGOING
|
||||
height: visible * implicitHeight
|
||||
value: transferStats.progress / transferStats.totalSize
|
||||
width: transferItem.width
|
||||
|
|
|
@ -153,7 +153,7 @@ BaseContextMenu {
|
|||
GeneralMenuItem {
|
||||
id: removeLocally
|
||||
|
||||
canTrigger: type === Interaction.Type.DATA_TRANSFER && Status === Interaction.Status.TRANSFER_FINISHED
|
||||
canTrigger: type === Interaction.Type.DATA_TRANSFER && TransferStatus === Interaction.TransferStatus.TRANSFER_FINISHED
|
||||
iconSource: JamiResources.trash_black_24dp_svg
|
||||
itemName: JamiStrings.removeLocally
|
||||
onClicked: {
|
||||
|
|
|
@ -60,7 +60,7 @@ JamiListView {
|
|||
|
||||
property var messageListModel: MessagesAdapter.mediaMessageListModel
|
||||
readonly property int documentType: Interaction.Type.DATA_TRANSFER
|
||||
readonly property int transferFinishedType: Interaction.Status.TRANSFER_FINISHED
|
||||
readonly property int transferFinishedType: Interaction.TransferStatus.TRANSFER_FINISHED
|
||||
readonly property int transferSuccesType: Interaction.Status.SUCCESS
|
||||
|
||||
onMessageListModelChanged: sourceModel = root.visible && messageListModel ? messageListModel : null
|
||||
|
|
|
@ -335,40 +335,6 @@ MessagesAdapter::onPaste()
|
|||
}
|
||||
}
|
||||
|
||||
QString
|
||||
MessagesAdapter::getStatusString(int status)
|
||||
{
|
||||
switch (static_cast<interaction::Status>(status)) {
|
||||
case interaction::Status::SENDING:
|
||||
return QObject::tr("Sending");
|
||||
case interaction::Status::FAILURE:
|
||||
return QObject::tr("Failure");
|
||||
case interaction::Status::SUCCESS:
|
||||
return QObject::tr("Sent");
|
||||
case interaction::Status::TRANSFER_CREATED:
|
||||
return QObject::tr("Connecting");
|
||||
case interaction::Status::TRANSFER_ACCEPTED:
|
||||
return QObject::tr("Accept");
|
||||
case interaction::Status::TRANSFER_CANCELED:
|
||||
return QObject::tr("Canceled");
|
||||
case interaction::Status::TRANSFER_ERROR:
|
||||
case interaction::Status::TRANSFER_UNJOINABLE_PEER:
|
||||
return QObject::tr("Unable to make contact");
|
||||
case interaction::Status::TRANSFER_ONGOING:
|
||||
return QObject::tr("Ongoing");
|
||||
case interaction::Status::TRANSFER_AWAITING_PEER:
|
||||
return QObject::tr("Waiting for contact");
|
||||
case interaction::Status::TRANSFER_AWAITING_HOST:
|
||||
return QObject::tr("Incoming transfer");
|
||||
case interaction::Status::TRANSFER_TIMEOUT_EXPIRED:
|
||||
return QObject::tr("Timed out waiting for contact");
|
||||
case interaction::Status::TRANSFER_FINISHED:
|
||||
return QObject::tr("Finished");
|
||||
default:
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
QVariantMap
|
||||
MessagesAdapter::getTransferStats(const QString& msgId, int status)
|
||||
{
|
||||
|
|
|
@ -159,7 +159,6 @@ public:
|
|||
const QColor& linkColor = QColor(0x06, 0x45, 0xad),
|
||||
const QColor& backgroundColor = QColor(0x0, 0x0, 0x0));
|
||||
Q_INVOKABLE void onPaste();
|
||||
Q_INVOKABLE QString getStatusString(int status);
|
||||
Q_INVOKABLE QVariantMap getTransferStats(const QString& messageId, int);
|
||||
Q_INVOKABLE QVariant dataForInteraction(const QString& interactionId,
|
||||
int role = Qt::DisplayRole) const;
|
||||
|
|
|
@ -119,6 +119,12 @@ enum class Status {
|
|||
FAILURE,
|
||||
SUCCESS,
|
||||
DISPLAYED,
|
||||
COUNT__
|
||||
};
|
||||
Q_ENUM_NS(Status)
|
||||
|
||||
enum class TransferStatus {
|
||||
INVALID,
|
||||
TRANSFER_CREATED,
|
||||
TRANSFER_ACCEPTED,
|
||||
TRANSFER_CANCELED,
|
||||
|
@ -131,7 +137,7 @@ enum class Status {
|
|||
TRANSFER_FINISHED,
|
||||
COUNT__
|
||||
};
|
||||
Q_ENUM_NS(Status)
|
||||
Q_ENUM_NS(TransferStatus)
|
||||
|
||||
static inline const QString
|
||||
to_string(const Status& status)
|
||||
|
@ -147,26 +153,6 @@ to_string(const Status& status)
|
|||
return "SUCCESS";
|
||||
case Status::DISPLAYED:
|
||||
return "DISPLAYED";
|
||||
case Status::TRANSFER_CREATED:
|
||||
return "TRANSFER_CREATED";
|
||||
case Status::TRANSFER_ACCEPTED:
|
||||
return "TRANSFER_ACCEPTED";
|
||||
case Status::TRANSFER_CANCELED:
|
||||
return "TRANSFER_CANCELED";
|
||||
case Status::TRANSFER_ERROR:
|
||||
return "TRANSFER_ERROR";
|
||||
case Status::TRANSFER_UNJOINABLE_PEER:
|
||||
return "TRANSFER_UNJOINABLE_PEER";
|
||||
case Status::TRANSFER_ONGOING:
|
||||
return "TRANSFER_ONGOING";
|
||||
case Status::TRANSFER_AWAITING_HOST:
|
||||
return "TRANSFER_AWAITING_HOST";
|
||||
case Status::TRANSFER_AWAITING_PEER:
|
||||
return "TRANSFER_AWAITING_PEER";
|
||||
case Status::TRANSFER_TIMEOUT_EXPIRED:
|
||||
return "TRANSFER_TIMEOUT_EXPIRED";
|
||||
case Status::TRANSFER_FINISHED:
|
||||
return "TRANSFER_FINISHED";
|
||||
case Status::INVALID:
|
||||
case Status::COUNT__:
|
||||
default:
|
||||
|
@ -187,30 +173,68 @@ to_status(const QString& status)
|
|||
return Status::SUCCESS;
|
||||
else if (status == "DISPLAYED")
|
||||
return Status::DISPLAYED;
|
||||
else if (status == "TRANSFER_CREATED")
|
||||
return Status::TRANSFER_CREATED;
|
||||
else if (status == "TRANSFER_ACCEPTED")
|
||||
return Status::TRANSFER_ACCEPTED;
|
||||
else if (status == "TRANSFER_CANCELED")
|
||||
return Status::TRANSFER_CANCELED;
|
||||
else if (status == "TRANSFER_ERROR")
|
||||
return Status::TRANSFER_ERROR;
|
||||
else if (status == "TRANSFER_UNJOINABLE_PEER")
|
||||
return Status::TRANSFER_UNJOINABLE_PEER;
|
||||
else if (status == "TRANSFER_ONGOING")
|
||||
return Status::TRANSFER_ONGOING;
|
||||
else if (status == "TRANSFER_AWAITING_HOST")
|
||||
return Status::TRANSFER_AWAITING_HOST;
|
||||
else if (status == "TRANSFER_AWAITING_PEER")
|
||||
return Status::TRANSFER_AWAITING_PEER;
|
||||
else if (status == "TRANSFER_TIMEOUT_EXPIRED")
|
||||
return Status::TRANSFER_TIMEOUT_EXPIRED;
|
||||
else if (status == "TRANSFER_FINISHED")
|
||||
return Status::TRANSFER_FINISHED;
|
||||
else
|
||||
return Status::INVALID;
|
||||
}
|
||||
|
||||
static inline const QString
|
||||
to_string(const TransferStatus& status)
|
||||
{
|
||||
switch (status) {
|
||||
case TransferStatus::TRANSFER_CREATED:
|
||||
return "TRANSFER_CREATED";
|
||||
case TransferStatus::TRANSFER_ACCEPTED:
|
||||
return "TRANSFER_ACCEPTED";
|
||||
case TransferStatus::TRANSFER_CANCELED:
|
||||
return "TRANSFER_CANCELED";
|
||||
case TransferStatus::TRANSFER_ERROR:
|
||||
return "TRANSFER_ERROR";
|
||||
case TransferStatus::TRANSFER_UNJOINABLE_PEER:
|
||||
return "TRANSFER_UNJOINABLE_PEER";
|
||||
case TransferStatus::TRANSFER_ONGOING:
|
||||
return "TRANSFER_ONGOING";
|
||||
case TransferStatus::TRANSFER_AWAITING_HOST:
|
||||
return "TRANSFER_AWAITING_HOST";
|
||||
case TransferStatus::TRANSFER_AWAITING_PEER:
|
||||
return "TRANSFER_AWAITING_PEER";
|
||||
case TransferStatus::TRANSFER_TIMEOUT_EXPIRED:
|
||||
return "TRANSFER_TIMEOUT_EXPIRED";
|
||||
case TransferStatus::TRANSFER_FINISHED:
|
||||
return "TRANSFER_FINISHED";
|
||||
case TransferStatus::INVALID:
|
||||
case TransferStatus::COUNT__:
|
||||
default:
|
||||
return "INVALID";
|
||||
}
|
||||
}
|
||||
|
||||
static inline TransferStatus
|
||||
to_transferStatus(const QString& status)
|
||||
{
|
||||
if (status == "TRANSFER_CREATED")
|
||||
return TransferStatus::TRANSFER_CREATED;
|
||||
else if (status == "TRANSFER_ACCEPTED")
|
||||
return TransferStatus::TRANSFER_ACCEPTED;
|
||||
else if (status == "TRANSFER_CANCELED")
|
||||
return TransferStatus::TRANSFER_CANCELED;
|
||||
else if (status == "TRANSFER_ERROR")
|
||||
return TransferStatus::TRANSFER_ERROR;
|
||||
else if (status == "TRANSFER_UNJOINABLE_PEER")
|
||||
return TransferStatus::TRANSFER_UNJOINABLE_PEER;
|
||||
else if (status == "TRANSFER_ONGOING")
|
||||
return TransferStatus::TRANSFER_ONGOING;
|
||||
else if (status == "TRANSFER_AWAITING_HOST")
|
||||
return TransferStatus::TRANSFER_AWAITING_HOST;
|
||||
else if (status == "TRANSFER_AWAITING_PEER")
|
||||
return TransferStatus::TRANSFER_AWAITING_PEER;
|
||||
else if (status == "TRANSFER_TIMEOUT_EXPIRED")
|
||||
return TransferStatus::TRANSFER_TIMEOUT_EXPIRED;
|
||||
else if (status == "TRANSFER_FINISHED")
|
||||
return TransferStatus::TRANSFER_FINISHED;
|
||||
else
|
||||
return TransferStatus::INVALID;
|
||||
}
|
||||
|
||||
enum class ContactAction { ADD, JOIN, LEAVE, BANNED, UNBANNED, INVALID };
|
||||
Q_ENUM_NS(ContactAction)
|
||||
|
||||
|
@ -366,6 +390,7 @@ public:
|
|||
* @var duration
|
||||
* @var type
|
||||
* @var status
|
||||
* @var transferStatus
|
||||
* @var isRead
|
||||
* @var commit
|
||||
* @var linkPreviewInfo
|
||||
|
@ -381,6 +406,7 @@ struct Info
|
|||
std::time_t duration = 0;
|
||||
Type type = Type::INVALID;
|
||||
Status status = Status::INVALID;
|
||||
TransferStatus transferStatus = TransferStatus::INVALID;
|
||||
bool isRead = false;
|
||||
MapStringString commit;
|
||||
QVariantMap linkPreviewInfo = {};
|
||||
|
@ -397,7 +423,8 @@ struct Info
|
|||
std::time_t duration,
|
||||
Type type,
|
||||
Status status,
|
||||
bool isRead)
|
||||
bool isRead,
|
||||
TransferStatus transferStatus = TransferStatus::INVALID)
|
||||
{
|
||||
this->authorUri = authorUri;
|
||||
this->body = body;
|
||||
|
@ -406,6 +433,15 @@ struct Info
|
|||
this->type = type;
|
||||
this->status = status;
|
||||
this->isRead = isRead;
|
||||
this->transferStatus = transferStatus;
|
||||
}
|
||||
|
||||
static Info contact(const QString& authorUri,
|
||||
std::time_t timestamp)
|
||||
{
|
||||
return Info(authorUri, "", timestamp, 0,
|
||||
Type::CONTACT, authorUri.isEmpty() ? Status::UNKNOWN : Status::SUCCESS,
|
||||
authorUri.isEmpty());
|
||||
}
|
||||
|
||||
Info(const Info& other) = default;
|
||||
|
@ -415,7 +451,7 @@ struct Info
|
|||
|
||||
bool sent() const
|
||||
{
|
||||
return status == Status::SUCCESS || status == Status::DISPLAYED || status == Status::TRANSFER_FINISHED;
|
||||
return status == Status::SUCCESS || status == Status::DISPLAYED;
|
||||
}
|
||||
|
||||
void init(const MapStringString& message, const QString& accountURI)
|
||||
|
|
|
@ -40,6 +40,7 @@ struct Info;
|
|||
X(Duration) \
|
||||
X(Type) \
|
||||
X(Status) \
|
||||
X(TransferStatus) \
|
||||
X(IsRead) \
|
||||
X(ContactAction) \
|
||||
X(ActionUri) \
|
||||
|
@ -101,6 +102,7 @@ public:
|
|||
bool append(const QString& id, const interaction::Info& interaction);
|
||||
bool update(const QString& id, const interaction::Info& interaction);
|
||||
bool updateStatus(const QString& id, interaction::Status newStatus, const QString& newBody = {});
|
||||
bool updateTransferStatus(const QString& id, interaction::TransferStatus newStatus, const QString& newBody = {});
|
||||
QPair<bool, bool> addOrUpdate(const QString& id, const interaction::Info& interaction);
|
||||
|
||||
// Thread-safe access to interactions.
|
||||
|
|
|
@ -482,14 +482,7 @@ beginConversationWithPeer(Database& db,
|
|||
db.insertInto("conversations",
|
||||
{{":id", "id"}, {":participant", "participant"}},
|
||||
{{":id", newConversationsId}, {":participant", peer_uri}});
|
||||
api::interaction::Info msg {isOutgoing ? "" : peer_uri,
|
||||
{},
|
||||
timestamp ? timestamp : std::time(nullptr),
|
||||
0,
|
||||
api::interaction::Type::CONTACT,
|
||||
isOutgoing ? api::interaction::Status::SUCCESS
|
||||
: api::interaction::Status::UNKNOWN,
|
||||
isOutgoing};
|
||||
api::interaction::Info msg = api::interaction::Info::contact(isOutgoing ? "" : peer_uri, timestamp);
|
||||
// Add first interaction
|
||||
addMessageToConversation(db, newConversationsId, msg);
|
||||
return newConversationsId;
|
||||
|
@ -696,9 +689,9 @@ updateDataTransferInteractionForDaemonId(Database& db,
|
|||
return;
|
||||
}
|
||||
auto body = result[0];
|
||||
auto status = api::interaction::to_status(result[1]);
|
||||
auto status = api::interaction::to_transferStatus(result[1]);
|
||||
interaction.body = body;
|
||||
interaction.status = status;
|
||||
interaction.transferStatus = status;
|
||||
}
|
||||
|
||||
QString
|
||||
|
@ -731,6 +724,16 @@ updateInteractionStatus(Database& db, const QString& id, api::interaction::Statu
|
|||
{{":id", id}});
|
||||
}
|
||||
|
||||
void
|
||||
updateInteractionTransferStatus(Database& db, const QString& id, api::interaction::TransferStatus newStatus)
|
||||
{
|
||||
db.update("interactions",
|
||||
{"status=:status"},
|
||||
{{":status", api::interaction::to_string(newStatus)}},
|
||||
"id=:id",
|
||||
{{":id", id}});
|
||||
}
|
||||
|
||||
void
|
||||
setInteractionRead(Database& db, const QString& id)
|
||||
{
|
||||
|
|
|
@ -310,6 +310,7 @@ void updateInteractionBody(Database& db, const QString& id, const QString& newBo
|
|||
* @param isRead
|
||||
*/
|
||||
void updateInteractionStatus(Database& db, const QString& id, api::interaction::Status newStatus);
|
||||
void updateInteractionTransferStatus(Database& db, const QString& id, api::interaction::TransferStatus newStatus);
|
||||
|
||||
/**
|
||||
* Set interaction to the read state
|
||||
|
|
|
@ -342,7 +342,7 @@ public Q_SLOTS:
|
|||
void slotTransferStatusUnjoinable(const QString& fileId, api::datatransfer::Info info);
|
||||
bool updateTransferStatus(const QString& fileId,
|
||||
datatransfer::Info info,
|
||||
interaction::Status newStatus,
|
||||
interaction::TransferStatus newStatus,
|
||||
bool& updated);
|
||||
void slotSwarmLoaded(uint32_t requestId,
|
||||
const QString& accountId,
|
||||
|
@ -2047,17 +2047,17 @@ ConversationModelPimpl::initConversations()
|
|||
// Resolve any file transfer interactions were left in an incorrect state
|
||||
auto& interactions = conversations[convIdx].interactions;
|
||||
interactions->forEach([&](const QString& id, interaction::Info& interaction) {
|
||||
if (interaction.status == interaction::Status::TRANSFER_CREATED
|
||||
|| interaction.status == interaction::Status::TRANSFER_AWAITING_HOST
|
||||
|| interaction.status == interaction::Status::TRANSFER_AWAITING_PEER
|
||||
|| interaction.status == interaction::Status::TRANSFER_ONGOING
|
||||
|| interaction.status == interaction::Status::TRANSFER_ACCEPTED) {
|
||||
if (interaction.transferStatus == interaction::TransferStatus::TRANSFER_CREATED
|
||||
|| interaction.transferStatus == interaction::TransferStatus::TRANSFER_AWAITING_HOST
|
||||
|| interaction.transferStatus == interaction::TransferStatus::TRANSFER_AWAITING_PEER
|
||||
|| interaction.transferStatus == interaction::TransferStatus::TRANSFER_ONGOING
|
||||
|| interaction.transferStatus == interaction::TransferStatus::TRANSFER_ACCEPTED) {
|
||||
// If a datatransfer was left in a non-terminal status in DB, we switch this status
|
||||
// to ERROR
|
||||
// TODO : Improve for DBus clients as daemon and transfer may still be ongoing
|
||||
storage::updateInteractionStatus(db, id, interaction::Status::TRANSFER_ERROR);
|
||||
storage::updateInteractionTransferStatus(db, id, interaction::TransferStatus::TRANSFER_ERROR);
|
||||
|
||||
interaction.status = interaction::Status::TRANSFER_ERROR;
|
||||
interaction.transferStatus = interaction::TransferStatus::TRANSFER_ERROR;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -2292,9 +2292,9 @@ ConversationModelPimpl::slotSwarmLoaded(uint32_t requestId,
|
|||
} else {
|
||||
msg.body = path;
|
||||
}
|
||||
msg.status = bytesProgress == 0 ? interaction::Status::TRANSFER_AWAITING_HOST
|
||||
: bytesProgress == totalSize ? interaction::Status::TRANSFER_FINISHED
|
||||
: interaction::Status::TRANSFER_ONGOING;
|
||||
msg.transferStatus = bytesProgress == 0 ? interaction::TransferStatus::TRANSFER_AWAITING_HOST
|
||||
: bytesProgress == totalSize ? interaction::TransferStatus::TRANSFER_FINISHED
|
||||
: interaction::TransferStatus::TRANSFER_ONGOING;
|
||||
linked.owner.dataTransferModel->registerTransferId(fileId, msgId);
|
||||
downloadFile = (bytesProgress == 0);
|
||||
}
|
||||
|
@ -2406,9 +2406,9 @@ ConversationModelPimpl::slotMessageReceived(const QString& accountId,
|
|||
} else {
|
||||
msg.body = path;
|
||||
}
|
||||
msg.status = bytesProgress == 0 ? interaction::Status::TRANSFER_AWAITING_HOST
|
||||
: bytesProgress == totalSize ? interaction::Status::TRANSFER_FINISHED
|
||||
: interaction::Status::TRANSFER_ONGOING;
|
||||
msg.transferStatus = bytesProgress == 0 ? interaction::TransferStatus::TRANSFER_AWAITING_HOST
|
||||
: bytesProgress == totalSize ? interaction::TransferStatus::TRANSFER_FINISHED
|
||||
: interaction::TransferStatus::TRANSFER_ONGOING;
|
||||
linked.owner.dataTransferModel->registerTransferId(fileId, msgId);
|
||||
}
|
||||
|
||||
|
@ -2431,7 +2431,7 @@ ConversationModelPimpl::slotMessageReceived(const QString& accountId,
|
|||
}
|
||||
Q_EMIT linked.newInteraction(conversationId, msgId, msg);
|
||||
Q_EMIT linked.modelChanged();
|
||||
if (msg.status == interaction::Status::TRANSFER_AWAITING_HOST && updateUnread) {
|
||||
if (msg.transferStatus == interaction::TransferStatus::TRANSFER_AWAITING_HOST && updateUnread) {
|
||||
handleIncomingFile(conversationId,
|
||||
msgId,
|
||||
QString(message.body.value("totalSize")).toInt());
|
||||
|
@ -3496,8 +3496,7 @@ ConversationModelPimpl::updateInteractionStatus(const QString& accountId,
|
|||
using namespace libjami::Account;
|
||||
auto msgState = static_cast<MessageStates>(status);
|
||||
auto& interactions = conversation.interactions;
|
||||
interactions->with(messageId, [&](const QString& id, const interaction::Info& interaction) {
|
||||
if (interaction.type != interaction::Type::DATA_TRANSFER) {
|
||||
interactions->with(messageId, [&](const QString& id, const interaction::Info&) {
|
||||
interaction::Status newState;
|
||||
if (msgState == MessageStates::SENDING) {
|
||||
newState = interaction::Status::SENDING;
|
||||
|
@ -3512,10 +3511,6 @@ ConversationModelPimpl::updateInteractionStatus(const QString& accountId,
|
|||
&& newState == interaction::Status::DISPLAYED) {
|
||||
emitDisplayed = true;
|
||||
}
|
||||
} else if (msgState == MessageStates::DISPLAYED) {
|
||||
emitDisplayed = true; // Status for file transfer is managed otherwise,
|
||||
// But at least set interaction as read
|
||||
}
|
||||
});
|
||||
|
||||
if (emitDisplayed)
|
||||
|
@ -3683,11 +3678,11 @@ ConversationModel::cancelTransfer(const QString& convUid, const QString& fileId)
|
|||
bool emitUpdated = false;
|
||||
if (conversationIdx != -1) {
|
||||
auto& interactions = pimpl_->conversations[conversationIdx].interactions;
|
||||
if (interactions->updateStatus(fileId, interaction::Status::TRANSFER_CANCELED)) {
|
||||
if (interactions->updateTransferStatus(fileId, interaction::TransferStatus::TRANSFER_CANCELED)) {
|
||||
// update information in the db
|
||||
storage::updateInteractionStatus(pimpl_->db,
|
||||
storage::updateInteractionTransferStatus(pimpl_->db,
|
||||
fileId,
|
||||
interaction::Status::TRANSFER_CANCELED);
|
||||
interaction::TransferStatus::TRANSFER_CANCELED);
|
||||
emitUpdated = true;
|
||||
}
|
||||
}
|
||||
|
@ -3735,7 +3730,7 @@ ConversationModel::removeFile(const QString& conversationId,
|
|||
return;
|
||||
|
||||
QFile::remove(path);
|
||||
convOpt->get().interactions->updateStatus(interactionId, interaction::Status::TRANSFER_CANCELED);
|
||||
convOpt->get().interactions->updateTransferStatus(interactionId, interaction::TransferStatus::TRANSFER_CANCELED);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -3809,8 +3804,9 @@ ConversationModelPimpl::slotTransferStatusCreated(const QString& fileId, datatra
|
|||
std::time(nullptr),
|
||||
0,
|
||||
interaction::Type::DATA_TRANSFER,
|
||||
interaction::Status::TRANSFER_CREATED,
|
||||
false};
|
||||
interaction::Status::SENDING,
|
||||
false,
|
||||
interaction::TransferStatus::TRANSFER_CREATED};
|
||||
|
||||
// prepare interaction Info and emit signal for the client
|
||||
auto conversationIdx = indexOf(convId);
|
||||
|
@ -3839,7 +3835,7 @@ ConversationModelPimpl::slotTransferStatusAwaitingPeer(const QString& fileId,
|
|||
if (info.accountId != linked.owner.id)
|
||||
return;
|
||||
bool intUpdated;
|
||||
updateTransferStatus(fileId, info, interaction::Status::TRANSFER_AWAITING_PEER, intUpdated);
|
||||
updateTransferStatus(fileId, info, interaction::TransferStatus::TRANSFER_AWAITING_PEER, intUpdated);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -3876,7 +3872,7 @@ ConversationModelPimpl::awaitingHost(const QString& fileId, datatransfer::Info i
|
|||
|
||||
if (!updateTransferStatus(fileId,
|
||||
info,
|
||||
interaction::Status::TRANSFER_AWAITING_HOST,
|
||||
interaction::TransferStatus::TRANSFER_AWAITING_HOST,
|
||||
intUpdated)) {
|
||||
return;
|
||||
}
|
||||
|
@ -3969,7 +3965,7 @@ ConversationModelPimpl::slotTransferStatusOngoing(const QString& fileId, datatra
|
|||
return;
|
||||
bool intUpdated;
|
||||
|
||||
if (!updateTransferStatus(fileId, info, interaction::Status::TRANSFER_ONGOING, intUpdated)) {
|
||||
if (!updateTransferStatus(fileId, info, interaction::TransferStatus::TRANSFER_ONGOING, intUpdated)) {
|
||||
return;
|
||||
}
|
||||
if (!intUpdated) {
|
||||
|
@ -3996,14 +3992,14 @@ ConversationModelPimpl::slotTransferStatusFinished(const QString& fileId, datatr
|
|||
auto conversationIdx = indexOf(conversationId);
|
||||
if (conversationIdx != -1) {
|
||||
bool emitUpdated = false;
|
||||
auto newStatus = interaction::Status::TRANSFER_FINISHED;
|
||||
auto newStatus = interaction::TransferStatus::TRANSFER_FINISHED;
|
||||
auto& interactions = conversations[conversationIdx].interactions;
|
||||
interactions->with(interactionId, [&](const QString& id, interaction::Info& interaction) {
|
||||
// We need to check if current status is ONGOING as CANCELED must not be
|
||||
// transformed into FINISHED
|
||||
if (interaction.status == interaction::Status::TRANSFER_ONGOING) {
|
||||
if (interaction.transferStatus == interaction::TransferStatus::TRANSFER_ONGOING) {
|
||||
emitUpdated = true;
|
||||
interactions->updateStatus(id, newStatus);
|
||||
interactions->updateTransferStatus(id, newStatus);
|
||||
}
|
||||
});
|
||||
if (emitUpdated) {
|
||||
|
@ -4011,10 +4007,10 @@ ConversationModelPimpl::slotTransferStatusFinished(const QString& fileId, datatr
|
|||
if (conversations[conversationIdx].mode != conversation::Mode::NON_SWARM) {
|
||||
if (transfIdToDbIntId.find(fileId) != transfIdToDbIntId.end()) {
|
||||
auto dbIntId = transfIdToDbIntId[fileId];
|
||||
storage::updateInteractionStatus(db, dbIntId, newStatus);
|
||||
storage::updateInteractionTransferStatus(db, dbIntId, newStatus);
|
||||
}
|
||||
} else {
|
||||
storage::updateInteractionStatus(db, interactionId, newStatus);
|
||||
storage::updateInteractionTransferStatus(db, interactionId, newStatus);
|
||||
}
|
||||
transfIdToDbIntId.remove(fileId);
|
||||
}
|
||||
|
@ -4027,7 +4023,7 @@ ConversationModelPimpl::slotTransferStatusCanceled(const QString& fileId, datatr
|
|||
if (info.accountId != linked.owner.id)
|
||||
return;
|
||||
bool intUpdated;
|
||||
updateTransferStatus(fileId, info, interaction::Status::TRANSFER_CANCELED, intUpdated);
|
||||
updateTransferStatus(fileId, info, interaction::TransferStatus::TRANSFER_CANCELED, intUpdated);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -4036,7 +4032,7 @@ ConversationModelPimpl::slotTransferStatusError(const QString& fileId, datatrans
|
|||
if (info.accountId != linked.owner.id)
|
||||
return;
|
||||
bool intUpdated;
|
||||
updateTransferStatus(fileId, info, interaction::Status::TRANSFER_ERROR, intUpdated);
|
||||
updateTransferStatus(fileId, info, interaction::TransferStatus::TRANSFER_ERROR, intUpdated);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -4045,7 +4041,7 @@ ConversationModelPimpl::slotTransferStatusUnjoinable(const QString& fileId, data
|
|||
if (info.accountId != linked.owner.id)
|
||||
return;
|
||||
bool intUpdated;
|
||||
updateTransferStatus(fileId, info, interaction::Status::TRANSFER_UNJOINABLE_PEER, intUpdated);
|
||||
updateTransferStatus(fileId, info, interaction::TransferStatus::TRANSFER_UNJOINABLE_PEER, intUpdated);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -4055,13 +4051,13 @@ ConversationModelPimpl::slotTransferStatusTimeoutExpired(const QString& fileId,
|
|||
if (info.accountId != linked.owner.id)
|
||||
return;
|
||||
bool intUpdated;
|
||||
updateTransferStatus(fileId, info, interaction::Status::TRANSFER_TIMEOUT_EXPIRED, intUpdated);
|
||||
updateTransferStatus(fileId, info, interaction::TransferStatus::TRANSFER_TIMEOUT_EXPIRED, intUpdated);
|
||||
}
|
||||
|
||||
bool
|
||||
ConversationModelPimpl::updateTransferStatus(const QString& fileId,
|
||||
datatransfer::Info info,
|
||||
interaction::Status newStatus,
|
||||
interaction::TransferStatus newStatus,
|
||||
bool& updated)
|
||||
{
|
||||
QString interactionId;
|
||||
|
@ -4076,10 +4072,10 @@ ConversationModelPimpl::updateTransferStatus(const QString& fileId,
|
|||
}
|
||||
auto& conversation = conversations[conversationIdx];
|
||||
if (conversation.isLegacy()) {
|
||||
storage::updateInteractionStatus(db, interactionId, newStatus);
|
||||
storage::updateInteractionTransferStatus(db, interactionId, newStatus);
|
||||
}
|
||||
auto& interactions = conversations[conversationIdx].interactions;
|
||||
bool emitUpdated = interactions->updateStatus(interactionId,
|
||||
bool emitUpdated = interactions->updateTransferStatus(interactionId,
|
||||
newStatus,
|
||||
conversation.isSwarm() ? info.path : QString());
|
||||
if (emitUpdated) {
|
||||
|
@ -4099,9 +4095,9 @@ ConversationModelPimpl::updateTransferProgress(QTimer* timer,
|
|||
{
|
||||
const auto& interactions = conversations[conversationIdx].interactions;
|
||||
interactions->with(interactionId, [&](const QString& id, interaction::Info& interaction) {
|
||||
if (interaction.status == interaction::Status::TRANSFER_ONGOING) {
|
||||
if (interaction.transferStatus == interaction::TransferStatus::TRANSFER_ONGOING) {
|
||||
emitUpdated = true;
|
||||
interactions->updateStatus(id, interaction::Status::TRANSFER_ONGOING);
|
||||
interactions->updateTransferStatus(id, interaction::TransferStatus::TRANSFER_ONGOING);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -249,6 +249,29 @@ MessageListModel::updateStatus(const QString& id,
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
MessageListModel::updateTransferStatus(const QString& id,
|
||||
interaction::TransferStatus newStatus,
|
||||
const QString& newBody)
|
||||
{
|
||||
const std::lock_guard<std::recursive_mutex> lk(mutex_);
|
||||
auto it = find(id);
|
||||
if (it == interactions_.end()) {
|
||||
return false;
|
||||
}
|
||||
VectorInt roles;
|
||||
if (it->second.transferStatus == newStatus) {
|
||||
return false;
|
||||
}
|
||||
it->second.transferStatus = newStatus;
|
||||
roles.push_back(Role::TransferStatus);
|
||||
if (!newBody.isEmpty()) {
|
||||
it->second.body = newBody;
|
||||
roles.push_back(Role::Body);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
QPair<bool, bool>
|
||||
MessageListModel::addOrUpdate(const QString& id, const interaction::Info& interaction)
|
||||
{
|
||||
|
@ -529,6 +552,8 @@ MessageListModel::dataForItem(const item_t& item, int, int role) const
|
|||
return QVariant(static_cast<int>(item.second.type));
|
||||
case Role::Status:
|
||||
return QVariant(static_cast<int>(item.second.status));
|
||||
case Role::TransferStatus:
|
||||
return QVariant(static_cast<int>(item.second.transferStatus));
|
||||
case Role::IsRead:
|
||||
return QVariant(item.second.isRead);
|
||||
case Role::LinkPreviewInfo:
|
||||
|
|
|
@ -31,7 +31,7 @@ import "../../../src/app/commoncomponents"
|
|||
DataTransferMessageDelegate {
|
||||
id: uut
|
||||
timestamp: 0
|
||||
transferStatus: Interaction.Status.TRANSFER_FINISHED
|
||||
transferStatus: Interaction.TransferStatus.TRANSFER_FINISHED
|
||||
author: ""
|
||||
body: ""
|
||||
|
||||
|
@ -39,9 +39,9 @@ DataTransferMessageDelegate {
|
|||
name: "Check basic visibility for header buttons"
|
||||
function test_checkBasicVisibility() {
|
||||
var buttonsLoader = findChild(uut, "buttonsLoader")
|
||||
uut.transferStatus = Interaction.Status.TRANSFER_AWAITING_HOST
|
||||
uut.transferStatus = Interaction.TransferStatus.TRANSFER_AWAITING_HOST
|
||||
compare(buttonsLoader.iconSource, JamiResources.download_black_24dp_svg)
|
||||
uut.transferStatus = Interaction.Status.TRANSFER_FINISHED
|
||||
uut.transferStatus = Interaction.TransferStatus.TRANSFER_FINISHED
|
||||
compare(buttonsLoader.iconSource, JamiResources.link_black_24dp_svg)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue