From 182bc5354f5e807d791d33e856819f29fd6128bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= Date: Fri, 23 Feb 2018 14:09:57 -0500 Subject: [PATCH] interaction: add unjoinable peer status Change-Id: Iabe3b6d410f108bc47a95bd9bec1f01626e20595 Reviewed-by: Olivier Soldano --- src/api/interaction.h | 5 +++++ src/callbackshandler.cpp | 4 +++- src/callbackshandler.h | 1 + src/conversationmodel.cpp | 29 +++++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/api/interaction.h b/src/api/interaction.h index 70c13fde..668fb5b8 100644 --- a/src/api/interaction.h +++ b/src/api/interaction.h @@ -90,6 +90,7 @@ enum class Status { TRANSFER_ACCEPTED, TRANSFER_CANCELED, TRANSFER_ERROR, + TRANSFER_UNJOINABLE_PEER, TRANSFER_ONGOING, TRANSFER_AWAITING, TRANSFER_FINISHED @@ -119,6 +120,8 @@ to_string(const Status& status) 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: @@ -154,6 +157,8 @@ to_status(const std::string& status) return interaction::Status::TRANSFER_CANCELED; else if (status == "TRANSFER_ERROR") return interaction::Status::TRANSFER_ERROR; + else if (status == "TRANSFER_UNJOINABLE_PEER") + return interaction::Status::TRANSFER_UNJOINABLE_PEER; else if (status == "TRANSFER_ONGOING") return interaction::Status::TRANSFER_ONGOING; else if (status == "TRANSFER_AWAITING") diff --git a/src/callbackshandler.cpp b/src/callbackshandler.cpp index f1821c56..2605bcaf 100644 --- a/src/callbackshandler.cpp +++ b/src/callbackshandler.cpp @@ -313,10 +313,12 @@ CallbacksHandler::slotDataTransferEvent(qulonglong dringId, uint codeStatus) emit transferStatusFinished(static_cast(dringId), info); break; case DRing::DataTransferEventCode::invalid_pathname: - case DRing::DataTransferEventCode::unjoinable_peer: case DRing::DataTransferEventCode::unsupported: emit transferStatusError(static_cast(dringId), info); break; + case DRing::DataTransferEventCode::unjoinable_peer: + emit transferStatusUnjoinable(static_cast(dringId), info); + break; } } diff --git a/src/callbackshandler.h b/src/callbackshandler.h index 23ebd44d..e26b3aa6 100644 --- a/src/callbackshandler.h +++ b/src/callbackshandler.h @@ -167,6 +167,7 @@ Q_SIGNALS: void transferStatusOngoing(long long dringId, api::datatransfer::Info info); void transferStatusFinished(long long dringId, api::datatransfer::Info info); void transferStatusError(long long dringId, api::datatransfer::Info info); + void transferStatusUnjoinable(long long dringId, api::datatransfer::Info info); private Q_SLOTS: /** diff --git a/src/conversationmodel.cpp b/src/conversationmodel.cpp index 9829a537..b1182926 100644 --- a/src/conversationmodel.cpp +++ b/src/conversationmodel.cpp @@ -235,6 +235,7 @@ public Q_SLOTS: void slotTransferStatusOngoing(long long dringId, api::datatransfer::Info info); void slotTransferStatusFinished(long long dringId, api::datatransfer::Info info); void slotTransferStatusError(long long dringId, api::datatransfer::Info info); + void slotTransferStatusUnjoinable(long long dringId, api::datatransfer::Info info); }; ConversationModel::ConversationModel(const account::Info& owner, @@ -752,6 +753,10 @@ ConversationModelPimpl::ConversationModelPimpl(const ConversationModel& linked, &CallbacksHandler::transferStatusError, this, &ConversationModelPimpl::slotTransferStatusError); + connect(&callbacksHandler, + &CallbacksHandler::transferStatusUnjoinable, + this, + &ConversationModelPimpl::slotTransferStatusUnjoinable); } ConversationModelPimpl::~ConversationModelPimpl() @@ -1538,6 +1543,30 @@ ConversationModelPimpl::slotTransferStatusError(long long dringId, datatransfer: } } +void +ConversationModelPimpl::slotTransferStatusUnjoinable(long long dringId, datatransfer::Info info) +{ + int interactionId; + std::string convId; + if (not usefulDataFromDataTransfer(dringId, info, interactionId, convId)) + return; + + // update information in the db + database::updateInteractionStatus(db, interactionId, interaction::Status::TRANSFER_UNJOINABLE_PEER); + + // prepare interaction Info and emit signal for the client + auto conversationIdx = indexOf(convId); + if (conversationIdx != -1) { + auto& interactions = conversations[conversationIdx].interactions; + auto it = interactions.find(interactionId); + if (it != interactions.end()) { + it->second.status = interaction::Status::TRANSFER_UNJOINABLE_PEER; + dirtyConversations = true; + emit linked.interactionStatusUpdated(convId, interactionId, it->second); + } + } +} + void ConversationModelPimpl::updateTransfer(QTimer* timer, const std::string& conversation, int conversationIdx, int interactionId) -- GitLab