84 lines
2.1 KiB
C++
84 lines
2.1 KiB
C++
#include "DmsSyncAction.h"
|
|
#include "dms_mq.h"
|
|
|
|
#include <QEventLoop>
|
|
#include <QTimer>
|
|
|
|
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<uint8_t*>(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;
|
|
}
|
|
}
|