#include "DmsSyncAction.h" #include "dms_mq.h" #include #include namespace { const int TIMEOUT_MSEC = 500; } DmsSyncAction::DmsSyncAction(int aServerId, int aActionId, QObject* aObject, const QString& aSignal, QObject* aParent) : QObject(aParent) , mServerId(aServerId) , mActionId(aActionId) , mLoop(new QEventLoop(this)) , mTimer(new QTimer(this)) , mObject(aObject) , mSignal(aSignal) , mTimeoutMsec(TIMEOUT_MSEC) , mSendData() , mActionResult() , mIsResponsed(false) { mTimer->setSingleShot(true); connect(mObject, ("2" + mSignal).toStdString().c_str(), this, SLOT(saveActionResult(const QString&))); connect(mObject, ("2" + mSignal).toStdString().c_str(), mLoop, SLOT(quit())); connect(mTimer, &QTimer::timeout, mLoop, &QEventLoop::quit); } DmsSyncAction::~DmsSyncAction() { disconnect(mObject, ("2" + mSignal).toStdString().c_str(), mLoop, SLOT(quit())); disconnect(mObject, ("2" + mSignal).toStdString().c_str(), this, SLOT(saveActionResult(const QString&))); disconnect(mTimer, &QTimer::timeout, mLoop, &QEventLoop::quit); } DmsSyncActionResult DmsSyncAction::execute() { mIsResponsed = false; QByteArray byteArray = mSendData.toUtf8(); uint8_t* data = reinterpret_cast(byteArray.data()); if(dmsmq_send(mServerId, mActionId, data, byteArray.size()) < 0) { DmsSyncActionResult result(false, "mq error"); return result; } if(!waitUntilSignalReceived()) { DmsSyncActionResult result(false, "time out"); return result; } return DmsSyncActionResult(true, mActionResult); } void DmsSyncAction::saveActionResult(const QString& aResult) { mActionResult = aResult; } void DmsSyncAction::setSendData(const QString& aData) { mSendData = aData; } bool DmsSyncAction::waitUntilSignalReceived() { mTimer->start(mTimeoutMsec); mLoop->exec(); if(!mIsResponsed) { return false; } return true; } void DmsSyncAction::responsed() { if(mTimer->isActive()) { mIsResponsed = true; } }