diff --git a/src/dicom/CEchoAction.cpp b/src/dicom/CEchoAction.cpp new file mode 100644 index 0000000..8742b19 --- /dev/null +++ b/src/dicom/CEchoAction.cpp @@ -0,0 +1,97 @@ +#include "CEchoAction.h" + +#include "recon/ReconManager.h" + +#include +#include + +CEchoAction::CEchoAction(QObject* aParent):AsyncAction(aParent) +{ + +} + +CEchoAction::~CEchoAction() +{ + +} + + +void CEchoAction::run(){ + for (size_t i = 0; i < mSettings.length(); i++) + { + if (mSettings[i].Type==0) + { + emit actionStepStart(QString(tr("Connecting from device to %1:%2......").arg(mSettings[i].IP.data()).arg(mSettings[i].Port))); + DcmSCU scu; + scu.setMaxReceivePDULength(ASC_DEFAULTMAXPDU); + scu.setACSETimeout(3); + scu.setDIMSEBlockingMode(DIMSE_BLOCKING); + scu.setDIMSETimeout(3); + scu.setAETitle(mSettings[i].AETitle.data()); + scu.setPeerHostName(mSettings[i].IP.data()); + scu.setPeerPort(mSettings[i].Port); + scu.setPeerAETitle(mSettings[i].ServerTitle.data()); + scu.setVerbosePCMode(OFFalse); + OFList syntaxes; + syntaxes.push_back(UID_LittleEndianImplicitTransferSyntax); + scu.addPresentationContext(UID_VerificationSOPClass, syntaxes); + scu.setConnectionTimeout(3); + + OFCondition cond = scu.initNetwork(); + QString errorMessage = QString(tr("Connection from device test to %1:%2 failed")).arg(mSettings[i].IP.data()).arg(mSettings[i].Port); + if (cond.bad()) + { + doCompletedEmit(ActionResult(Failed,errorMessage),i,mSettings.length()); + continue; + } + cond = scu.negotiateAssociation(); + if (cond.bad()) + { + doCompletedEmit(ActionResult(Failed,errorMessage),i,mSettings.length()); + continue; + } + cond = scu.sendECHORequest(scu.findPresentationContextID(UID_VerificationSOPClass,"")); + if (cond.bad()) + { + doCompletedEmit(ActionResult(Failed,errorMessage),i,mSettings.length()); + continue; + } + scu.releaseAssociation(); + QString message = QString(tr("Connection test from device to %1:%2 successed")).arg(mSettings[i].IP.data()).arg(mSettings[i].Port); + doCompletedEmit(ActionResult(Sucessed,message),i,mSettings.length()); + } + else{ + emit actionStepStart(QString(tr("Connecting from server to %1:%2......").arg(mSettings[i].IP.data()).arg(mSettings[i].Port))); + bool ret = true; + QString message; + ReconManager::CEcho(mSettings[i].IP.data(),mSettings[i].Port,mSettings[i].ServerTitle.data(),ret,message); + if(ret){ + message = QString(tr("Connection test from server to %1:%2 successed")).arg(mSettings[i].IP.data()).arg(mSettings[i].Port); + doCompletedEmit(ActionResult(Sucessed,message),i,mSettings.length()); + } + else{ + QString errorMessage = QString(tr("Connection test from Recon to %1:%2 failed")) + .arg(mSettings[i].IP.data()).arg(mSettings[i].Port); + doCompletedEmit(ActionResult(Failed,errorMessage),i,mSettings.length()); + } + } + } + +} + +void CEchoAction::addCEchoActionItem(const CEchoSetting& aSetting) +{ + mSettings.append(aSetting); +} + +void CEchoAction::doCompletedEmit(const ActionResult& aResult, size_t aIndex, size_t aLength) +{ + if (aIndex == aLength-1){ + emit actionCompleted(aResult); + } + else{ + emit actionStepCompleted(aResult); + } +} + + diff --git a/src/dicom/CEchoAction.h b/src/dicom/CEchoAction.h new file mode 100644 index 0000000..0827cfa --- /dev/null +++ b/src/dicom/CEchoAction.h @@ -0,0 +1,29 @@ +#ifndef AAD49461_3276_47D6_B033_156B91C94F74 +#define AAD49461_3276_47D6_B033_156B91C94F74 + +#include "action/AsyncAction.h" +#include "CEchoSetting.h" + +#include +enum CEchoType{ + LOCAL,REMOTE +}; + +class CEchoAction : public AsyncAction +{ + Q_OBJECT +public: + explicit CEchoAction(QObject* aParent = nullptr); + ~CEchoAction() override; + void run() override; + void addCEchoActionItem(const CEchoSetting& aSetting); +signals: + void actionStepCompleted(const ActionResult& aResult); + void actionStepStart(const QString& aMessage); + +private: + QList mSettings; + void doCompletedEmit(const ActionResult& aResult, size_t aIndex, size_t aLength); +}; + +#endif /* AAD49461_3276_47D6_B033_156B91C94F74 */