#include "MPPSAsyncAction.h" #include #include #include #include #include #include #include #include "json/jsonobject.h" #include "MPPSSCU.h" MPPSAsyncAction::MPPSAsyncAction(QObject* aParent):AsyncAction(aParent) { } MPPSAsyncAction::~MPPSAsyncAction() { } void MPPSAsyncAction::run() { if (mPatient.isNull()||mPatient->PatientUID.isEmpty() || !mPatient->MPPSUID.isEmpty())return; if (!dcmDataDict.isDictionaryLoaded()) { qDebug() << "dcmdatadict error"; emit actionCompleted(ActionResult(Failed,tr("MPPS fail by dcmdatadict error!"))); return; } MPPSSCU scu; host serverInfo = JsonObject::Instance()->getServer(JsonObject::MPPS); /*scu*/ OFList syntaxes; syntaxes.push_back(UID_LittleEndianImplicitTransferSyntax); scu.setMaxReceivePDULength(ASC_DEFAULTMAXPDU); scu.setACSETimeout(30); scu.setDIMSEBlockingMode(DIMSE_BLOCKING); scu.setDIMSETimeout(0); scu.setAETitle(serverInfo.localAE.toLatin1().data()); scu.setPeerHostName(serverInfo.ip.toLatin1().data()); scu.setPeerPort(OFstatic_cast(Uint16, serverInfo.port.toInt())); scu.setPeerAETitle(serverInfo.ae.toLatin1().data()); scu.setVerbosePCMode(OFFalse); scu.addPresentationContext(UID_ModalityPerformedProcedureStepSOPClass, syntaxes); OFCondition cond = scu.initNetwork(); if (cond.bad()) { qDebug() << cond.code() << cond.text(); qDebug() << "MPPS initNetwork failed"; emit actionCompleted(ActionResult(Failed,tr("MPPS initNetwork failed!"))); return; } cond = scu.negotiateAssociation(); if (cond.bad()) { qDebug() << cond.code(); //<< "----"<putAndInsertString(DCM_StudyInstanceUID, mPatient->StudyUID.toStdString().data()); DcmSequenceOfItems *refSeq = new DcmSequenceOfItems(DCM_ReferencedStudySequence); attr_item->insert(refSeq); attr_item->putAndInsertString(DCM_AccessionNumber, mPatient->AccessionNumber.toStdString().data()); attr_item->putAndInsertString(DCM_RequestedProcedureID, mPatient->RPID.toStdString().data()); attr_item->putAndInsertString(DCM_ScheduledProcedureStepID, mPatient->SPSID.toStdString().data()); DcmSequenceOfItems *protocolSeq = new DcmSequenceOfItems(DCM_ScheduledProtocolCodeSequence); attr_item->insert(protocolSeq); attr_Seq->insert(attr_item); dset->insert(attr_Seq); DcmSequenceOfItems *codeSeq = new DcmSequenceOfItems(DCM_ProcedureCodeSequence); dset->insert(codeSeq); dset->putAndInsertString(DCM_PatientName, mPatient->Name.toStdString().data()); dset->putAndInsertString(DCM_PatientID, mPatient->ID.toStdString().data()); dset->putAndInsertString(DCM_PatientBirthDate, mPatient->BirthDate.toStdString().data()); dset->putAndInsertString(DCM_PatientSex, mPatient->Sex.toStdString().data()); DcmSequenceOfItems *refPSeq = new DcmSequenceOfItems(DCM_ReferencedPatientSequence); dset->insert(refPSeq); dset->putAndInsertString(DCM_PerformedProcedureStepID, QDateTime::currentDateTime().toString("yyyyMMddHHmmss").toStdString().data()); dset->putAndInsertString(DCM_PerformedStationAETitle, serverInfo.localAE.toStdString().data()); dset->putAndInsertString(DCM_PerformedStationName, ""); dset->putAndInsertString(DCM_PerformedLocation, ""); dset->putAndInsertString(DCM_PerformedProcedureStepStartDate, QDateTime::currentDateTime().toString("yyyyMMdd").toStdString().data()); dset->putAndInsertString(DCM_PerformedProcedureStepStartTime, QDateTime::currentDateTime().toString("hhmmss").toStdString().data()); // set status dset->putAndInsertString(DCM_PerformedProcedureStepStatus, "IN PROGRESS"); dset->putAndInsertString(DCM_PerformedProcedureStepDescription, ""); dset->putAndInsertString(DCM_PerformedProcedureTypeDescription, ""); dset->putAndInsertString(DCM_PerformedProcedureStepEndDate, ""); dset->putAndInsertString(DCM_PerformedProcedureStepEndTime, ""); // get modality from MWL query resault dset->putAndInsertString(DCM_Modality, mPatient->Modality.toStdString().data()); dset->putAndInsertString(DCM_StudyID, ""); DcmSequenceOfItems *refpPSeq = new DcmSequenceOfItems(DCM_PerformedProtocolCodeSequence); dset->insert(refpPSeq); // dset->print(std::cout); Uint16 responses = 0; OFString uid; { char uidbuff[100]; dcmGenerateUniqueIdentifier(uidbuff); uid.append(uidbuff); mPatient->MPPSUID = uidbuff; } cond = scu.sendNCreateRequest(pcid, uid, dset, responses); bool result = true; if (responses != 0) { OFString statusString; const char *statusStringPtr = DU_ncreateStatusString(responses); statusString.append(tr("MPPS fail by error:").toStdString().data()); statusString.append(statusStringPtr); if (statusStringPtr != NULL) { // 输出错误消息 qDebug() << "Error Message: " << statusString.data() ; } emit actionCompleted(ActionResult(Failed,statusString.data())); return; } if (cond == EC_Normal) { scu.releaseAssociation(); } else { if (cond == DUL_PEERREQUESTEDRELEASE) scu.closeAssociation(DCMSCU_PEER_REQUESTED_RELEASE); else if (cond == DUL_PEERABORTEDASSOCIATION) scu.closeAssociation(DCMSCU_PEER_ABORTED_ASSOCIATION); else { scu.abortAssociation(); } } emit actionCompleted(ActionResult(Sucessed,QString("%0|%1").arg(mPatient->PatientUID).arg(mPatient->MPPSUID))); return; } void MPPSAsyncAction::setPatient(PatientInformationPointer aPatient) { mPatient = aPatient; } PatientInformationPointer MPPSAsyncAction::getPatient() { return mPatient; }