diff --git a/retroshare-gui/src/gui/TheWire/PulseAddDialog.cpp b/retroshare-gui/src/gui/TheWire/PulseAddDialog.cpp index 6109e3866..d3b666a7e 100644 --- a/retroshare-gui/src/gui/TheWire/PulseAddDialog.cpp +++ b/retroshare-gui/src/gui/TheWire/PulseAddDialog.cpp @@ -25,6 +25,7 @@ #include "gui/gxs/GxsIdDetails.h" #include "gui/common/FilesDefs.h" #include "util/misc.h" +#include "util/qtthreadsutils.h" #include "PulseAddDialog.h" @@ -98,11 +99,31 @@ void PulseAddDialog::setGroup(RsWireGroup &group) // set ReplyWith Group. void PulseAddDialog::setGroup(const RsGxsGroupId &grpId) { - /* fetch in the background */ - RsWireGroupSPtr pGroup; - rsWire->getWireGroup(grpId, pGroup); + if(grpId.isNull()){ + return; + } - setGroup(*pGroup); + RsThread::async([this,grpId](){ + + RsWireGroupSPtr pGroup; + if(!rsWire->getWireGroup(grpId,pGroup)) + { + std::cerr << __PRETTY_FUNCTION__ << " failed to retrieve wire group info for wire id: " << grpId << std::endl; + return; + } + + RsQThreadUtils::postToObject( [pGroup,this]() + { + /* Here it goes any code you want to be executed on the Qt Gui + * thread, for example to update the data model with new information + * after a blocking call to RetroShare API complete, note that + * Qt::QueuedConnection is important! + */ + + setGroup(*pGroup); + }, this ); + + }); } void PulseAddDialog::cleanup() @@ -236,30 +257,46 @@ void PulseAddDialog::setReplyTo(const RsWirePulse &pulse, RsWirePulseSPtr pPulse void PulseAddDialog::setReplyTo(const RsGxsGroupId &grpId, const RsGxsMessageId &msgId, uint32_t replyType) { + if(grpId.isNull()){ + return; + } /* fetch in the background */ - RsWireGroupSPtr pGroup; - if (!rsWire->getWireGroup(grpId, pGroup)) - { - std::cerr << "PulseAddDialog::setRplyTo() failed to fetch group"; - std::cerr << std::endl; - return; - } - RsWirePulseSPtr pPulse; - if (!rsWire->getWirePulse(grpId, msgId, pPulse)) - { - std::cerr << "PulseAddDialog::setRplyTo() failed to fetch pulse"; - std::cerr << std::endl; - return; - } + RsThread::async([this,grpId,msgId,replyType](){ - // update GroupPtr - // TODO - this should be handled in libretroshare if possible. - if (pPulse->mGroupPtr == NULL) { - pPulse->mGroupPtr = pGroup; - } + RsWireGroupSPtr pGroup; + RsWirePulseSPtr pPulse; + if(!rsWire->getWireGroup(grpId,pGroup)) + { + std::cerr << __PRETTY_FUNCTION__ << "PulseAddDialog::setRplyTo() failed to fetch group id: " << grpId << std::endl; + return; + } + + if (!rsWire->getWirePulse(grpId, msgId, pPulse)) + { + std::cerr << "PulseAddDialog::setRplyTo() failed to fetch pulse of group id: " << grpId << std::endl; + return; + } + + // update GroupPtr + // TODO - this should be handled in libretroshare if possible. + if (pPulse->mGroupPtr == NULL) { + pPulse->mGroupPtr = pGroup; + } + + RsQThreadUtils::postToObject( [pGroup,this,pPulse,replyType]() + { + /* Here it goes any code you want to be executed on the Qt Gui + * thread, for example to update the data model with new information + * after a blocking call to RetroShare API complete, note that + * Qt::QueuedConnection is important! + */ + + setReplyTo(*pPulse, pPulse, pGroup->mMeta.mGroupName, replyType); + }, this ); + + }); - setReplyTo(*pPulse, pPulse, pGroup->mMeta.mGroupName, replyType); } void PulseAddDialog::addURL() @@ -309,26 +346,39 @@ void PulseAddDialog::postOriginalPulse() std::cerr << "PulseAddDialog::postOriginalPulse()"; std::cerr << std::endl; - RsWirePulseSPtr pPulse(new RsWirePulse()); + RsWirePulseSPtr pPulse(new RsWirePulse()); - pPulse->mSentiment = WIRE_PULSE_SENTIMENT_NO_SENTIMENT; - pPulse->mPulseText = ui.textEdit_Pulse->toPlainText().toStdString(); - // set images here too. - pPulse->mImage1 = mImage1; - pPulse->mImage2 = mImage2; - pPulse->mImage3 = mImage3; - pPulse->mImage4 = mImage4; + pPulse->mSentiment = WIRE_PULSE_SENTIMENT_NO_SENTIMENT; + pPulse->mPulseText = ui.textEdit_Pulse->toPlainText().toStdString(); + // set images here too. + pPulse->mImage1 = mImage1; + pPulse->mImage2 = mImage2; + pPulse->mImage3 = mImage3; + pPulse->mImage4 = mImage4; - // this should be in async thread, so doesn't block UI thread. - if (!rsWire->createOriginalPulse(mGroup.mMeta.mGroupId, pPulse)) - { - std::cerr << "PulseAddDialog::postOriginalPulse() FAILED"; - std::cerr << std::endl; - return; - } + RsThread::async([this,pPulse](){ + + if (!rsWire->createOriginalPulse(mGroup.mMeta.mGroupId, pPulse)) + { + std::cerr << "PulseAddDialog::postOriginalPulse() FAILED"; + std::cerr << std::endl; + return; + } + + RsQThreadUtils::postToObject( [this]() + { + /* Here it goes any code you want to be executed on the Qt Gui + * thread, for example to update the data model with new information + * after a blocking call to RetroShare API complete, note that + * Qt::QueuedConnection is important! + */ + + clearDialog(); + hide(); + }, this ); + + }); - clearDialog(); - hide(); } uint32_t PulseAddDialog::toPulseSentiment(int index) @@ -358,15 +408,15 @@ void PulseAddDialog::postReplyPulse() std::cerr << "PulseAddDialog::postReplyPulse()"; std::cerr << std::endl; - RsWirePulseSPtr pPulse(new RsWirePulse()); + RsWirePulseSPtr pPulse(new RsWirePulse()); - pPulse->mSentiment = toPulseSentiment(ui.comboBox_sentiment->currentIndex()); - pPulse->mPulseText = ui.textEdit_Pulse->toPlainText().toStdString(); - // set images here too. - pPulse->mImage1 = mImage1; - pPulse->mImage2 = mImage2; - pPulse->mImage3 = mImage3; - pPulse->mImage4 = mImage4; + pPulse->mSentiment = toPulseSentiment(ui.comboBox_sentiment->currentIndex()); + pPulse->mPulseText = ui.textEdit_Pulse->toPlainText().toStdString(); + // set images here too. + pPulse->mImage1 = mImage1; + pPulse->mImage2 = mImage2; + pPulse->mImage3 = mImage3; + pPulse->mImage4 = mImage4; if (mReplyType & WIRE_PULSE_TYPE_REPUBLISH) { // Copy details from parent, and override @@ -380,20 +430,33 @@ void PulseAddDialog::postReplyPulse() pPulse->mImage4 = mReplyToPulse.mImage4; } - // this should be in async thread, so doesn't block UI thread. - if (!rsWire->createReplyPulse(mReplyToPulse.mMeta.mGroupId, - mReplyToPulse.mMeta.mOrigMsgId, - mGroup.mMeta.mGroupId, - mReplyType, - pPulse)) - { - std::cerr << "PulseAddDialog::postReplyPulse() FAILED"; - std::cerr << std::endl; - return; - } + RsThread::async([this, pPulse](){ + + if (!rsWire->createReplyPulse(mReplyToPulse.mMeta.mGroupId, + mReplyToPulse.mMeta.mOrigMsgId, + mGroup.mMeta.mGroupId, + mReplyType, + pPulse)) + { + std::cerr << "PulseAddDialog::postReplyPulse() FAILED"; + std::cerr << std::endl; + return; + } + + RsQThreadUtils::postToObject( [this]() + { + /* Here it goes any code you want to be executed on the Qt Gui + * thread, for example to update the data model with new information + * after a blocking call to RetroShare API complete, note that + * Qt::QueuedConnection is important! + */ + + clearDialog(); + hide(); + }, this ); + + }); - clearDialog(); - hide(); } void PulseAddDialog::clearDialog() diff --git a/retroshare-gui/src/gui/TheWire/WireDialog.cpp b/retroshare-gui/src/gui/TheWire/WireDialog.cpp index 6738be68a..36a201a7f 100644 --- a/retroshare-gui/src/gui/TheWire/WireDialog.cpp +++ b/retroshare-gui/src/gui/TheWire/WireDialog.cpp @@ -140,6 +140,7 @@ WireDialog::~WireDialog() processSettings(false); clearTwitterView(); + std::cerr << "WireDialog::~WireDialog()" << std::endl; delete(mWireQueue); rsEvents->unregisterEventsHandler(mEventHandlerId); @@ -474,13 +475,13 @@ bool WireDialog::loadGroupData(const uint32_t &token) std::cerr << "WireDialog::loadGroupData()"; std::cerr << std::endl; - std::vector groups; - rsWire->getGroupData(token, groups); + std::vector groups; + rsWire->getGroupData(token, groups); - // save list of groups. - updateGroups(groups); - showGroups(); - return true; + // save list of groups. + updateGroups(groups); + showGroups(); + return true; } rstime_t WireDialog::getFilterTimestamp() @@ -688,6 +689,7 @@ void WireDialog::PVHrate(const RsGxsId &authorId) void WireDialog::postTestTwitterView() { clearTwitterView(); + std::cerr << "WireDialog::postTestTwitterView()" << std::endl; addTwitterView(new PulseTopLevel(NULL,RsWirePulseSPtr())); addTwitterView(new PulseReply(NULL,RsWirePulseSPtr())); @@ -844,6 +846,7 @@ void WireDialog::requestPulseFocus(const RsGxsGroupId groupId, const RsGxsMessag void WireDialog::showPulseFocus(const RsGxsGroupId groupId, const RsGxsMessageId msgId) { clearTwitterView(); + std::cerr << "WireDialog::showPulseFocus()" << std::endl; // background thread for loading. RsThread::async([this, groupId, msgId]() @@ -873,6 +876,8 @@ void WireDialog::showPulseFocus(const RsGxsGroupId groupId, const RsGxsMessageId void WireDialog::postPulseFocus(RsWirePulseSPtr pPulse) { clearTwitterView(); + std::cerr << "WireDialog::postPulseFocus()" << std::endl; + if (!pPulse) { std::cerr << "WireDialog::postPulseFocus() Invalid pulse"; @@ -945,7 +950,7 @@ void WireDialog::requestGroupFocus(const RsGxsGroupId groupId) void WireDialog::showGroupFocus(const RsGxsGroupId groupId) { clearTwitterView(); - + std::cerr << "WireDialog::showGroupFocus()" << std::endl; // background thread for loading. RsThread::async([this, groupId]() { @@ -1022,6 +1027,7 @@ void WireDialog::requestGroupsPulses(const std::list& groupIds) void WireDialog::showGroupsPulses(const std::list& groupIds) { clearTwitterView(); + std::cerr << "WireDialog::showGroupPulses()" << std::endl; // background thread for loading. RsThread::async([this, groupIds]() diff --git a/retroshare-gui/src/gui/TheWire/WireDialog.h b/retroshare-gui/src/gui/TheWire/WireDialog.h index a55369fc0..fcd33ad37 100644 --- a/retroshare-gui/src/gui/TheWire/WireDialog.h +++ b/retroshare-gui/src/gui/TheWire/WireDialog.h @@ -150,7 +150,7 @@ private: // Loading Data. void requestGroupData(); - bool loadGroupData(const uint32_t &token); + bool loadGroupData(const uint32_t &token); void acknowledgeGroup(const uint32_t &token, const uint32_t &userType); virtual void loadRequest(const TokenQueue *queue, const TokenRequest &req) override;