diff --git a/src/api/conversationmodel.h b/src/api/conversationmodel.h index 90e04543c6ce96cf21d6e6aaf5a7c27d6510b840..05eef0488c2b4e2a9f977aa8f82e4311f8e564a3 100644 --- a/src/api/conversationmodel.h +++ b/src/api/conversationmodel.h @@ -146,7 +146,6 @@ public: * @return a copy of the conversation */ OptRef<conversation::Info> filteredConversation(unsigned row) const; - /** * Get the search results * @return a searchResult @@ -202,8 +201,9 @@ public: * Send a message to the conversation * @param uid of the conversation * @param body of the message + * @param parentId id of parent message. Default is "" - last message in conversation. */ - void sendMessage(const QString& uid, const QString& body); + void sendMessage(const QString& uid, const QString& body, const QString& parentId = ""); /** * Modify the current filter (will change the result of getFilteredConversations) * @param filter the new filter @@ -276,7 +276,7 @@ public: void cancelTransfer(const QString& convUid, uint64_t interactionId); - void getTransferInfo(uint64_t interactionId, api::datatransfer::Info& info); + void getTransferInfo(const QString& conversationId, uint64_t interactionId, api::datatransfer::Info& info); /** * @param convUid, uid of the conversation * @return the number of unread messages for the conversation @@ -288,6 +288,36 @@ public: * @param isComposing if is composing */ void setIsComposing(const QString& uid, bool isComposing); + /** + * load messages for conversation + * @param conversationId conversation's id + * @param size number of messages should be loaded. Default 1 + * @return id for loading request. + */ + uint32_t loadConversationMessages(const QString& conversationId, + const int size = 1); + /** + * accept request for conversation + * @param conversationId conversation's id + */ + void acceptConversationRequest(const QString& conversationId); + /** + * decline request for conversation + * @param conversationId conversation's id + */ + void declineConversationRequest(const QString& conversationId); + /** + * add member to conversation + * @param conversationId conversation's id + * @param memberId members's id + */ + void addConversationMember(const QString& conversationId, const QString& memberId); + /** + * remove member from conversation + * @param conversationId conversation's id + * @param memberId members's id + */ + void removeConversationMember(const QString& conversationId, const QString& memberId); Q_SIGNALS: /** @@ -383,6 +413,19 @@ Q_SIGNALS: * Emitted when search result has been updated */ void searchResultUpdated() const; + /** + * Emitted when finish loading messages for conversation + * @param loadingRequestId loading request id + * @param conversationId conversation Id + */ + void conversationMessagesLoaded(uint32_t loadingRequestId, const QString& conversationId) const; + /** + * Emitted when new messages available. When messages loaded from loading request or + * receiving/sending new interactions + * @param accountId account id + * @param conversationId conversation Id + */ + void newMessagesAvailable(const QString& accountId, const QString& conversationId) const; /** * The following signals are intended for QAbtractListModel compatibility diff --git a/src/api/datatransfermodel.h b/src/api/datatransfermodel.h index 934c0196eac980a7860fa47cf2f8e68ee4fc0b49..acf99c3079980a9c8156dffdbd577b13d1587806 100644 --- a/src/api/datatransfermodel.h +++ b/src/api/datatransfermodel.h @@ -57,13 +57,13 @@ public: const QString& file_path, const QString& display_name); - void transferInfo(long long ringId, datatransfer::Info& lrc_info); + void transferInfo(const QString& accountId, const QString& conversationId, long long ringId, datatransfer::Info& lrc_info); - void bytesProgress(int interactionId, int64_t& total, int64_t& progress); + void bytesProgress(const QString& accountId, const QString& conversationId, int interactionId, int64_t& total, int64_t& progress); - QString accept(int interactionId, const QString& file_path, std::size_t offset); + QString accept(const QString& accountId, const QString& conversationId, int interactionId, const QString& file_path, std::size_t offset); - void cancel(int interactionId); + void cancel(const QString& accountId, const QString& conversationId, int interactionId); void registerTransferId(long long dringId, int interactionId); diff --git a/src/callbackshandler.cpp b/src/callbackshandler.cpp index 374be8561794a2644cefe1fc248ffbeedc8b2c95..22bb0da4c990bf299a56189a1a83bc350fcb1c95 100644 --- a/src/callbackshandler.cpp +++ b/src/callbackshandler.cpp @@ -262,6 +262,31 @@ CallbacksHandler::CallbacksHandler(const Lrc& parent) this, &CallbacksHandler::slotAudioMeterReceived, Qt::QueuedConnection); + connect(&ConfigurationManager::instance(), + &ConfigurationManagerInterface::conversationLoaded, + this, + &CallbacksHandler::slotConversationLoaded, + Qt::QueuedConnection); + connect(&ConfigurationManager::instance(), + &ConfigurationManagerInterface::messageReceived, + this, + &CallbacksHandler::slotMessageReceived, + Qt::QueuedConnection); + connect(&ConfigurationManager::instance(), + &ConfigurationManagerInterface::conversationRequestReceived, + this, + &CallbacksHandler::slotConversationRequestReceived, + Qt::QueuedConnection); + connect(&ConfigurationManager::instance(), + &ConfigurationManagerInterface::conversationReady, + this, + &CallbacksHandler::slotConversationReady, + Qt::QueuedConnection); + connect(&ConfigurationManager::instance(), + &ConfigurationManagerInterface::conversationMemberEvent, + this, + &CallbacksHandler::slotConversationMemberEvent, + Qt::QueuedConnection); } CallbacksHandler::~CallbacksHandler() {} @@ -487,12 +512,12 @@ CallbacksHandler::slotAccountMessageStatusChanged(const QString& accountId, } void -CallbacksHandler::slotDataTransferEvent(qulonglong dringId, uint codeStatus) +CallbacksHandler::slotDataTransferEvent(const QString& accountId, const QString& conversationId, qulonglong dringId, uint codeStatus) { auto event = DRing::DataTransferEventCode(codeStatus); api::datatransfer::Info info; - parent.getDataTransferModel().transferInfo(dringId, info); + parent.getDataTransferModel().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. @@ -631,4 +656,41 @@ CallbacksHandler::slotRemoteRecordingChanged(const QString& callId, emit remoteRecordingChanged(callId, peerNumber, state); } +void +CallbacksHandler::slotConversationLoaded(uint32_t requestId, + const QString& accountId, + const QString& conversationId, + const VectorMapStringString& messages) +{ + emit conversationLoaded(requestId, accountId, conversationId, messages); +} +void +CallbacksHandler::slotMessageReceived(const QString& accountId, + const QString& conversationId, + const MapStringString& message) +{ + emit messageReceived(accountId, conversationId, message); +} +void +CallbacksHandler::slotConversationRequestReceived(const QString& accountId, + const QString& conversationId, + const MapStringString& metadatas) +{ + emit conversationRequestReceived(accountId, conversationId, metadatas); +} +void +CallbacksHandler::slotConversationReady(const QString& accountId, const QString& conversationId) +{ + emit conversationReady(accountId, conversationId); +} + +void +CallbacksHandler::slotConversationMemberEvent(const QString& accountId, + const QString& conversationId, + const QString& memberId, + int event) +{ + emit conversationMemberEvent(accountId, conversationId, memberId, event); +} + } // namespace lrc diff --git a/src/callbackshandler.h b/src/callbackshandler.h index 8e16e64d3e55a3ae4aed11da2bd2f12774c7bc1d..1bf1a2f28ab712f4a5b9e0e4cfe083584ffe480b 100644 --- a/src/callbackshandler.h +++ b/src/callbackshandler.h @@ -332,6 +332,21 @@ Q_SIGNALS: * @param code */ void remoteRecordingChanged(const QString& callId, const QString& peerNumber, bool state); + void conversationLoaded(uint32_t requestId, + const QString& accountId, + const QString& conversationId, + const VectorMapStringString& messages); + void messageReceived(const QString& accountId, + const QString& conversationId, + const MapStringString& message); + void conversationRequestReceived(const QString& accountId, + const QString& conversationId, + const MapStringString& metadatas); + void conversationReady(const QString& accountId, const QString& conversationId); + void conversationMemberEvent(const QString& accountId, + const QString& conversationId, + const QString& memberId, + int event); private Q_SLOTS: /** @@ -491,7 +506,7 @@ private Q_SLOTS: const QString& to, int status); - void slotDataTransferEvent(qulonglong id, uint code); + void slotDataTransferEvent(const QString& accountId, const QString& conversationId, qulonglong id, uint code); /** * Emit knownDevicesChanged @@ -626,6 +641,21 @@ private Q_SLOTS: * @param state, new state */ void slotRemoteRecordingChanged(const QString& callId, const QString& contactId, bool state); + void slotConversationLoaded(uint32_t requestId, + const QString& accountId, + const QString& conversationId, + const VectorMapStringString& messages); + void slotMessageReceived(const QString& accountId, + const QString& conversationId, + const MapStringString& message); + void slotConversationRequestReceived(const QString& accountId, + const QString& conversationId, + const MapStringString& metadatas); + void slotConversationReady(const QString& accountId, const QString& conversationId); + void slotConversationMemberEvent(const QString& accountId, + const QString& conversationId, + const QString& memberId, + int event); private: const api::Lrc& parent; diff --git a/src/conversationmodel.cpp b/src/conversationmodel.cpp index b1c8117ac9e367f68d8f12dd0c75a76790c09581..928257c8ee0e5deccd61fb5da9ff263108927f70 100644 --- a/src/conversationmodel.cpp +++ b/src/conversationmodel.cpp @@ -313,6 +313,17 @@ public Q_SLOTS: void updateTransferStatus(long long dringId, api::datatransfer::Info info, interaction::Status newStatus); + void slotConversationLoaded(uint32_t requestId, + const QString& accountId, + const QString& conversationId, + const VectorMapStringString& messages); + void slotMessageReceived(const QString& accountId, + const QString& conversationId, + const MapStringString& message); + void slotConversationRequestReceived(const QString& accountId, + const QString& conversationId, + const MapStringString& metadatas); + void slotConversationReady(const QString& accountId, const QString& conversationId); }; ConversationModel::ConversationModel(const account::Info& owner, @@ -811,7 +822,7 @@ ConversationModel::placeCall(const QString& uid) } void -ConversationModel::sendMessage(const QString& uid, const QString& body) +ConversationModel::sendMessage(const QString& uid, const QString& body, const QString& parentId) { try { auto& conversation = pimpl_->getConversationForUid(uid, true).get(); @@ -1255,6 +1266,29 @@ ConversationModel::clearUnreadInteractions(const QString& convId) } } +uint32_t +ConversationModel::loadConversationMessages(const QString& conversationId, + const int size) +{ + return -1; +} + +void +ConversationModel::acceptConversationRequest(const QString& conversationId) +{} + +void +ConversationModel::declineConversationRequest(const QString& conversationId) +{} + +void +ConversationModel::addConversationMember(const QString& conversationId, const QString& memberId) +{} + +void +ConversationModel::removeConversationMember(const QString& conversationId, const QString& memberId) +{} + ConversationModelPimpl::ConversationModelPimpl(const ConversationModel& linked, Lrc& lrc, Database& db, @@ -1372,6 +1406,23 @@ ConversationModelPimpl::ConversationModelPimpl(const ConversationModel& linked, &CallbacksHandler::transferStatusUnjoinable, this, &ConversationModelPimpl::slotTransferStatusUnjoinable); + // swarm conversations + connect(&callbacksHandler, + &CallbacksHandler::conversationLoaded, + this, + &ConversationModelPimpl::slotConversationLoaded); + connect(&callbacksHandler, + &CallbacksHandler::messageReceived, + this, + &ConversationModelPimpl::slotMessageReceived); + connect(&callbacksHandler, + &CallbacksHandler::conversationRequestReceived, + this, + &ConversationModelPimpl::slotConversationRequestReceived); + connect(&callbacksHandler, + &CallbacksHandler::conversationReady, + this, + &ConversationModelPimpl::slotConversationReady); } ConversationModelPimpl::~ConversationModelPimpl() @@ -1475,6 +1526,23 @@ ConversationModelPimpl::~ConversationModelPimpl() &CallbacksHandler::transferStatusUnjoinable, this, &ConversationModelPimpl::slotTransferStatusUnjoinable); + // swarm conversations + disconnect(&callbacksHandler, + &CallbacksHandler::conversationLoaded, + this, + &ConversationModelPimpl::slotConversationLoaded); + disconnect(&callbacksHandler, + &CallbacksHandler::messageReceived, + this, + &ConversationModelPimpl::slotMessageReceived); + disconnect(&callbacksHandler, + &CallbacksHandler::conversationRequestReceived, + this, + &ConversationModelPimpl::slotConversationRequestReceived); + disconnect(&callbacksHandler, + &CallbacksHandler::conversationReady, + this, + &ConversationModelPimpl::slotConversationReady); } void @@ -1670,6 +1738,29 @@ ConversationModelPimpl::sendContactRequest(const QString& contactUri) if (isNotUsed) linked.owner.contactModel->addContact(contact); } +void +ConversationModelPimpl::slotConversationLoaded(uint32_t requestId, + const QString& accountId, + const QString& conversationId, + const VectorMapStringString& messages) +{} + +void +ConversationModelPimpl::slotMessageReceived(const QString& accountId, + const QString& conversationId, + const MapStringString& message) +{} + +void +ConversationModelPimpl::slotConversationRequestReceived(const QString& accountId, + const QString& conversationId, + const MapStringString& metadatas) +{} + +void +ConversationModelPimpl::slotConversationReady(const QString& accountId, + const QString& conversationId) +{} void ConversationModelPimpl::slotContactAdded(const QString& contactUri) @@ -2342,7 +2433,7 @@ void ConversationModel::acceptTransfer(const QString& convUid, uint64_t interactionId) { lrc::api::datatransfer::Info info = {}; - getTransferInfo(interactionId, info); + getTransferInfo(convUid, interactionId, info); acceptTransfer(convUid, interactionId, info.displayName); } @@ -2379,7 +2470,7 @@ ConversationModel::cancelTransfer(const QString& convUid, uint64_t interactionId } if (emitUpdated) { // Forward cancel action to daemon (will invoke slotTransferStatusCanceled) - pimpl_->lrc.getDataTransferModel().cancel(interactionId); + pimpl_->lrc.getDataTransferModel().cancel(owner.id, convUid, interactionId); pimpl_->invalidateModel(); emit interactionStatusUpdated(convUid, interactionId, itCopy); emit pimpl_->behaviorController.newReadInteraction(owner.id, convUid, interactionId); @@ -2387,11 +2478,11 @@ ConversationModel::cancelTransfer(const QString& convUid, uint64_t interactionId } void -ConversationModel::getTransferInfo(uint64_t interactionId, datatransfer::Info& info) +ConversationModel::getTransferInfo(const QString& conversationId, uint64_t interactionId, datatransfer::Info& info) { try { auto dringId = pimpl_->lrc.getDataTransferModel().getDringIdFromInteractionId(interactionId); - pimpl_->lrc.getDataTransferModel().transferInfo(dringId, info); + pimpl_->lrc.getDataTransferModel().transferInfo(owner.id, conversationId, dringId, info); } catch (...) { info.status = datatransfer::Status::INVALID; } @@ -2550,7 +2641,9 @@ ConversationModelPimpl::acceptTransfer(const QString& convUid, QDir dir = QFileInfo(destinationDir + path).absoluteDir(); if (!dir.exists()) dir.mkpath("."); - auto acceptedFilePath = lrc.getDataTransferModel().accept(interactionId, + auto acceptedFilePath = lrc.getDataTransferModel().accept(linked.owner.id, + convUid, + interactionId, destinationDir + path, 0); storage::updateInteractionBody(db, interactionId, acceptedFilePath); diff --git a/src/datatransfermodel.cpp b/src/datatransfermodel.cpp index 16a2f56cc2d2ef3cdd58ef7587cb3055cc4251ed..a5cb4ac515fbde97b2c742636f06771ebc6a544e 100644 --- a/src/datatransfermodel.cpp +++ b/src/datatransfermodel.cpp @@ -128,10 +128,10 @@ DataTransferModel::DataTransferModel() DataTransferModel::~DataTransferModel() = default; void -DataTransferModel::transferInfo(long long ringId, datatransfer::Info& lrc_info) +DataTransferModel::transferInfo(const QString& accountId, const QString& conversationId, long long ringId, datatransfer::Info& lrc_info) { DataTransferInfo infoFromDaemon; - if (ConfigurationManager::instance().dataTransferInfo(ringId, infoFromDaemon) == 0) { + if (ConfigurationManager::instance().dataTransferInfo(accountId, conversationId, ringId, infoFromDaemon) == 0) { // lrc_info.uid = ? lrc_info.status = convertDataTransferEvent( DRing::DataTransferEventCode(infoFromDaemon.lastEvent)); @@ -174,32 +174,32 @@ DataTransferModel::sendFile(const QString& account_id, } void -DataTransferModel::bytesProgress(int interactionId, int64_t& total, int64_t& progress) +DataTransferModel::bytesProgress(const QString& accountId, const QString& conversationId, int interactionId, int64_t& total, int64_t& progress) { ConfigurationManager::instance() #ifdef ENABLE_LIBWRAP - .dataTransferBytesProgress(pimpl_->lrc2dringIdMap.at(interactionId), total, progress); + .dataTransferBytesProgress(accountId, conversationId, pimpl_->lrc2dringIdMap.at(interactionId), total, progress); #else - .dataTransferBytesProgress(pimpl_->lrc2dringIdMap.at(interactionId), + .dataTransferBytesProgress(accountId, conversationId, pimpl_->lrc2dringIdMap.at(interactionId), reinterpret_cast<qlonglong&>(total), reinterpret_cast<qlonglong&>(progress)); #endif } QString -DataTransferModel::accept(int interactionId, const QString& file_path, std::size_t offset) +DataTransferModel::accept(const QString& accountId, const QString& conversationId, int interactionId, const QString& file_path, std::size_t offset) { auto unique_file_path = pimpl_->getUniqueFilePath(file_path); auto dring_id = pimpl_->lrc2dringIdMap.at(interactionId); - ConfigurationManager::instance().acceptFileTransfer(dring_id, unique_file_path, offset); + ConfigurationManager::instance().acceptFileTransfer(accountId, conversationId, dring_id, unique_file_path, offset); return unique_file_path; } void -DataTransferModel::cancel(int interactionId) +DataTransferModel::cancel(const QString& accountId, const QString& conversationId, int interactionId) { auto dring_id = pimpl_->lrc2dringIdMap.at(interactionId); - ConfigurationManager::instance().cancelDataTransfer(dring_id); + ConfigurationManager::instance().cancelDataTransfer(accountId, conversationId, dring_id); } int diff --git a/src/qtwrapper/configurationmanager_wrap.h b/src/qtwrapper/configurationmanager_wrap.h index ef1f3f13fd00d8fbf57a811823ecbf0551109650..8c1bb9d8e9c20e9757adf369fa76d55f74d16a8d 100644 --- a/src/qtwrapper/configurationmanager_wrap.h +++ b/src/qtwrapper/configurationmanager_wrap.h @@ -32,6 +32,7 @@ #include <configurationmanager_interface.h> #include <datatransfer_interface.h> #include <account_const.h> +#include <conversation_interface.h> #include "typedefs.h" #include "conversions_wrap.hpp" @@ -46,6 +47,7 @@ class ConfigurationManagerInterface : public QObject public: std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> confHandlers; std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> dataXferHandlers; + std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> conversationsHandlers; ConfigurationManagerInterface() { @@ -54,6 +56,7 @@ public: using DRing::ConfigurationSignal; using DRing::AudioSignal; using DRing::DataTransferSignal; + using DRing::ConversationSignal; setObjectName("ConfigurationManagerInterface"); confHandlers = { @@ -224,7 +227,10 @@ public: Q_EMIT this->messageSend(QString(message.c_str())); }), exportable_callback<ConfigurationSignal::ComposingStatusChanged>( - [this](const std::string& account_id, const std::string& from, int status) { + [this](const std::string& account_id, + const std::string& convId, + const std::string& from, + int status) { Q_EMIT this->composingStatusChanged(QString(account_id.c_str()), QString(from.c_str()), status > 0 ? true : false); @@ -243,10 +249,50 @@ public: dataXferHandlers = { exportable_callback<DataTransferSignal::DataTransferEvent>( - [this](const uint64_t& transfer_id, const uint32_t& code) { - Q_EMIT this->dataTransferEvent(transfer_id, code); + [this]( const std::string& accountId, const std::string& conversationId, const uint64_t& transfer_id, const uint32_t& code) { + Q_EMIT this->dataTransferEvent(QString(accountId.c_str()),QString(conversationId.c_str()),transfer_id, code); }), }; + conversationsHandlers + = {exportable_callback<ConversationSignal::ConversationLoaded>( + [this](uint32_t id, + const std::string& accountId, + const std::string& conversationId, + const std::vector<std::map<std::string, std::string>>& messages) { + Q_EMIT conversationLoaded(id, + QString(accountId.c_str()), + QString(conversationId.c_str()), + convertVecMap(messages)); + }), + exportable_callback<ConversationSignal::MessageReceived>( + [this](const std::string& accountId, + const std::string& conversationId, + const std::map<std::string, std::string>& message) { + Q_EMIT messageReceived(QString(accountId.c_str()), + QString(conversationId.c_str()), + convertMap(message)); + }), + exportable_callback<ConversationSignal::ConversationRequestReceived>( + [this](const std::string& accountId, + const std::string& conversationId, + const std::map<std::string, std::string>& metadata) { + Q_EMIT conversationRequestReceived(QString(accountId.c_str()), + QString(conversationId.c_str()), + convertMap(metadata)); + }), + exportable_callback<ConversationSignal::ConversationReady>( + [this](const std::string& accountId, const std::string& conversationId) { + Q_EMIT conversationReady(QString(accountId.c_str()), + QString(conversationId.c_str())); + }), + exportable_callback<ConversationSignal::ConversationMemberEvent>( + [this](const std::string& accountId, const std::string& conversationId, const std::string& memberId, int event) { + Q_EMIT conversationMemberEvent(QString(accountId.c_str()), + QString(conversationId.c_str()), + QString(memberId.c_str()), + event); + }) + }; } ~ConfigurationManagerInterface() {} @@ -727,8 +773,6 @@ public Q_SLOTS: // METHODS return convertMap(DRing::getContactDetails(accountID.toStdString(), uri.toStdString())); } - VectorULongLong dataTransferList() { return convertVectorULongLong(DRing::dataTransferList()); } - uint32_t sendFile(const DataTransferInfo& lrc_info, DRing::DataTransferId& id) { DRing::DataTransferInfo dring_info; @@ -744,10 +788,10 @@ public Q_SLOTS: // METHODS return uint32_t(DRing::sendFile(dring_info, id)); } - uint32_t dataTransferInfo(uint64_t transfer_id, DataTransferInfo& lrc_info) + uint32_t dataTransferInfo(QString accountId, QString conversationId, const DRing::DataTransferId& transfer_id, DataTransferInfo& lrc_info) { DRing::DataTransferInfo dring_info; - auto error = uint32_t(DRing::dataTransferInfo(transfer_id, dring_info)); + auto error = uint32_t(DRing::dataTransferInfo(accountId.toStdString(), conversationId.toStdString(), transfer_id, dring_info)); lrc_info.accountId = QString::fromStdString(dring_info.accountId); lrc_info.lastEvent = quint32(dring_info.lastEvent); lrc_info.flags = dring_info.flags; @@ -760,19 +804,19 @@ public Q_SLOTS: // METHODS return error; } - uint64_t dataTransferBytesProgress(uint64_t transfer_id, int64_t& total, int64_t& progress) + uint64_t dataTransferBytesProgress(QString accountId, QString conversationId, const DRing::DataTransferId& transfer_id, int64_t& total, int64_t& progress) { - return uint32_t(DRing::dataTransferBytesProgress(transfer_id, total, progress)); + return uint32_t(DRing::dataTransferBytesProgress(accountId.toStdString(), conversationId.toStdString(), transfer_id, total, progress)); } - uint32_t acceptFileTransfer(uint64_t transfer_id, const QString& file_path, int64_t offset) + uint32_t acceptFileTransfer(QString accountId, QString conversationId, const DRing::DataTransferId& transfer_id, const QString& file_path, int64_t offset) { - return uint32_t(DRing::acceptFileTransfer(transfer_id, file_path.toStdString(), offset)); + return uint32_t(DRing::acceptFileTransfer(accountId.toStdString(), conversationId.toStdString(), transfer_id, file_path.toStdString(), offset)); } - uint32_t cancelDataTransfer(int64_t transfer_id) + uint32_t cancelDataTransfer(QString accountId, QString conversationId, const DRing::DataTransferId& transfer_id) { - return uint32_t(DRing::cancelDataTransfer(transfer_id)); + return uint32_t(DRing::cancelDataTransfer(accountId.toStdString(), conversationId.toStdString(), transfer_id)); } void enableProxyClient(const QString& accountID, bool enable) @@ -810,6 +854,77 @@ public Q_SLOTS: // METHODS { return DRing::searchUser(accountId.toStdString(), query.toStdString()); } + //swarm + QString startConversation(const QString& accountId) + { + auto convId = DRing::startConversation(accountId.toStdString()); + return QString(convId.c_str()); + } + void acceptConversationRequest(const QString& accountId, const QString& conversationId) + { + DRing::acceptConversationRequest(accountId.toStdString(), conversationId.toStdString()); + } + void declineConversationRequest(const QString& accountId, const QString& conversationId) + { + DRing::declineConversationRequest(accountId.toStdString(), conversationId.toStdString()); + } + bool removeConversation(const QString& accountId, const QString& conversationId) + { + return DRing::removeConversation(accountId.toStdString(), conversationId.toStdString()); + } + VectorString getConversations(const QString& accountId) + { + auto conversations = DRing::getConversations(accountId.toStdString()); + return convertVectorString(conversations); + } + VectorMapStringString getConversationRequests(const QString& accountId) + { + auto requests = DRing::getConversationRequests(accountId.toStdString()); + return convertVecMap(requests); + } + void addConversationMember(const QString& accountId, + const QString& conversationId, + const QString& memberId) + { + DRing::addConversationMember(accountId.toStdString(), + conversationId.toStdString(), + memberId.toStdString()); + } + void removeConversationMember(const QString& accountId, + const QString& conversationId, + const QString& memberId) + { + DRing::removeConversationMember(accountId.toStdString(), + conversationId.toStdString(), + memberId.toStdString()); + } + VectorMapStringString getConversationMembers(const QString& accountId, + const QString& conversationId) + { + auto members = DRing::getConversationMembers(accountId.toStdString(), + conversationId.toStdString()); + return convertVecMap(members); + } + void sendMessage(const QString& accountId, + const QString& conversationId, + const QString& message, + const QString& parrent) + { + DRing::sendMessage(accountId.toStdString(), + conversationId.toStdString(), + message.toStdString(), + parrent.toStdString()); + } + uint32_t loadConversationMessages(const QString& accountId, + const QString& conversationId, + const QString& fromId, + const int size) + { + return DRing::loadConversationMessages(accountId.toStdString(), + conversationId.toStdString(), + fromId.toStdString(), + size); + } void setDefaultModerator(const QString& accountID, const QString& peerURI, const bool& state) { @@ -886,7 +1001,7 @@ Q_SIGNALS: // SIGNALS void contactAdded(const QString& accountID, const QString& uri, bool banned); void contactRemoved(const QString& accountID, const QString& uri, bool banned); void profileReceived(const QString& accountID, const QString& peer, const QString& vCard); - void dataTransferEvent(qulonglong transfer_id, uint code); + void dataTransferEvent(const QString& accountId, const QString& conversationId, qulonglong transfer_id, uint code); void deviceRevocationEnded(const QString& accountId, const QString& deviceId, int status); void accountProfileReceived(const QString& accountId, const QString& displayName, @@ -899,6 +1014,22 @@ Q_SIGNALS: // SIGNALS int status, const QString& query, VectorMapStringString results); + //swarm + void conversationLoaded(uint32_t requestId, + const QString& accountId, + const QString& conversationId, + const VectorMapStringString& messages); + void messageReceived(const QString& accountId, + const QString& conversationId, + const MapStringString& message); + void conversationRequestReceived(const QString& accountId, + const QString& conversationId, + const MapStringString& metadatas); + void conversationReady(const QString& accountId, const QString& conversationId); + void conversationMemberEvent(const QString& accountId, + const QString& conversationId, + const QString& memberId, + int event); }; namespace org { diff --git a/src/qtwrapper/instancemanager.cpp b/src/qtwrapper/instancemanager.cpp index a5aabdb8f5b01a813df0ea73604d474802bd51d5..6df98d353daa455a69539a0bc993b24755e2acf4 100644 --- a/src/qtwrapper/instancemanager.cpp +++ b/src/qtwrapper/instancemanager.cpp @@ -37,6 +37,7 @@ InstanceManagerInterface::InstanceManagerInterface(bool muteDring) using DRing::ConfigurationSignal; using DRing::PresenceSignal; using DRing::DataTransferSignal; + using DRing::ConversationSignal; #ifdef ENABLE_VIDEO using DRing::VideoSignal; @@ -58,6 +59,7 @@ InstanceManagerInterface::InstanceManagerInterface(bool muteDring) #ifdef ENABLE_VIDEO registerSignalHandlers(VideoManager::instance().videoHandlers); #endif + registerSignalHandlers(ConfigurationManager::instance().conversationsHandlers); if (!DRing::start()) printf("Error initializing daemon\n");