#include "sdcmfindscudatacallback.h" #include #include #include #include #include #include #include #include "mainwindow.h" #include "charconvert.h" /* SDCMFindSCUDataCallback::SDCMFindSCUDataCallback() { m_pDCMViewList = NULL; m_pDCMDumpList = NULL; } */ SDCMFindSCUDataCallback::SDCMFindSCUDataCallback(DcmFindSCUExtractMode extractResponses, int cancelAfterNResponses, const char *outputDirectory, STD_NAMESPACE ofstream *outputStream, const unsigned int limitOutput)//:DcmFindSCUCallback()//DcmFindSCUDefaultCallback(extractResponses, cancelAfterNResponses, outputDirectory, outputStream)//, limitOutput) { m_pDCMViewList = NULL; m_pDCMDumpList = NULL; } SDCMFindSCUDataCallback::~SDCMFindSCUDataCallback() { if(m_pDCMViewList!=NULL) { Clear(); } if(m_pDCMDumpList!=NULL) { } } void SDCMFindSCUDataCallback::callback(T_DIMSE_C_FindRQ *request, int& responseCount, T_DIMSE_C_FindRSP *rsp, DcmDataset *responseIdentifiers) { //OFString temp_str; //DIMSE_dumpMessage(temp_str, *rsp, DIMSE_INCOMING); CommonData* pCommonData = MainWindow::GetCommonData(); QString strEnc = pCommonData->GetDICOMCharacterSet(); unsigned long i = 0; OFString tagValue; int nCount = 0; DcmTag tag; DcmItem* pSubItem = NULL; DcmElement* pElement = NULL; OFString strData; DcmTagKey dcmKey; //responseIdentifiers->saveFile("worklist.dcm"); WorklistResponseData wrd; WorklistResponseData* wr = &wrd; /* OFString strEnc = FindCharacterSet(responseIdentifiers); //responseIdentifiers->findAndGetOFStringArray(DCM_SpecificCharacterSet, strEnc); if (strEnc.length()==0) { //if(CSDCM) strEnc = "ISO_IR 192"; } CharacterSetConversion(responseIdentifiers, strEnc); */ #ifdef DCMTK_ENABLE_CHARSET_CONVERSION //OFCondition cond1 = responseIdentifiers->convertToUTF8(); #endif //CSDCM test1; for (i = 0; icard(); i++) { strData.clear(); pElement = NULL; pElement = responseIdentifiers->getElement(i); int nGroup = pElement->getGTag(); int nElement = pElement->getETag(); DcmTag tag(nGroup, nElement); DcmEVR vr; DcmTagKey tagKey; pElement->getTagVal(tagKey); vr = pElement->getVR(); if(vr==EVR_SQ) { ReadSequence(pElement, wr); } else { pElement->getOFStringArray(strData); DcmEVR vrChild = pElement->getVR(); if(vrChild==EVR_PN || vrChild==EVR_LO) { //strData = CharConvert::EUCKRtoUTF8(strData.data()).toStdString().c_str(); if(strEnc=="EUC-KR") { strData = CharConvert::Convert(strData.data(), "UTF-8").toStdString().c_str(); } } wr->InsertData(tag, strData); //test1.InsertTagValue(tag, strData); } if (tag == DCM_PatientName) { //char* pTest123 = new char[1024]; //ZeroMemory(pTest123, 1024); //pElement->getString(pTest123); wr->InsertData(tag, strData); } if(tag==DCM_Modality) { } } if (wr->m_Study.strStudyDate.length() == 0) { wr->m_Study.strStudyDate = wr->m_ScheduledData.strScheduledProcedureStepStartDate; } if (wr->m_Study.strStudyTime.length() == 0) { wr->m_Study.strStudyTime = wr->m_ScheduledData.strScheduledProcedureStepStartTime; } //m_pDCMViewList->Add(wr); //m_pDCMViewList->push_back(wrd); if(wr->m_ScheduledData.strScheduledStepDescription.length()>0) { wr->m_Study.strStudyDescription = wr->m_ScheduledData.strScheduledStepDescription; //QString strTest1 = CharConvert::EUCKRtoUTF8(wr->m_ScheduledData.strScheduledStepDescription.c_str()); if(strEnc=="EUC-KR") { //QString strTest1 = CharConvert::Convert(wr->m_ScheduledData.strScheduledStepDescription.c_str(), strEnc); //wr->m_Study.strStudyDescription = strTest1.toStdString().c_str(); } } if(wr->m_Series.strSeriesDescription.length()==0) { wr->m_Series.strSeriesDescription = wr->m_Study.strStudyDescription; } else { //QString strTest1 = CharConvert::EUCKRtoUTF8(wr->m_ScheduledData.strScheduledStepDescription.c_str()); if(strEnc=="EUC-KR") { //QString strTest1 = CharConvert::Convert(wr->m_Series.strSeriesDescription.c_str(), strEnc); //wr->m_Series.strSeriesDescription = strTest1.toStdString().c_str(); } } m_pDCMViewList->push_back(wrd); } void SDCMFindSCUDataCallback::AddView(WORD wGroup, WORD wElement) { /* SDCM_GROUP_ELEMENT* pNewGroupElement = NULL; SDCM_GROUP_ELEMENT* pGroupElement = NULL; SDCM_GROUP_ELEMENT nGroupElement(wGroup, wElement); POSITION pos = NULL; BOOL bExist = FALSE; pos = m_pViewReservedList->GetHeadPosition(); while(pos!=NULL) { pGroupElement = m_pViewReservedList->GetNext(pos)->GetData(); if(nGroupElement==*pGroupElement) { bExist = TRUE; break; } } if(bExist==FALSE) { pNewGroupElement = new SDCM_GROUP_ELEMENT(wGroup, wElement); m_pViewReservedList->Add(pNewGroupElement); } */ } int SDCMFindSCUDataCallback::GetWorklistSize() { return m_pDCMViewList->size(); //return m_pDCMViewList->GetCount(); } void SDCMFindSCUDataCallback::SetWorklistData(vector* pWorklistData) { m_pDCMViewList = pWorklistData; } void SDCMFindSCUDataCallback::SetWorklistDump(vector* pDCMDump) { m_pDCMDumpList = pDCMDump; } /* vector* SDCMFindSCUDataCallback::GetWorklistData() { return m_pDCMViewList; } */ vector* SDCMFindSCUDataCallback::GetDCMDumpList() { return m_pDCMDumpList; } void SDCMFindSCUDataCallback::Clear() { //m_pDCMViewList->DeleteAll(); if(m_pDCMViewList==NULL) { return; } int i=0; for(i=0 ; isize() ; i++) { //WorklistResponseData } m_pDCMViewList->clear(); if(m_pDCMDumpList==NULL) { return; } for(i=0 ; isize() ; i++) { CSDCM* pDCM = (*m_pDCMDumpList)[i]; delete pDCM; } m_pDCMDumpList->clear(); } int SDCMFindSCUDataCallback::CharacterSetConversion(DcmItem* pDcmItem, OFString strEnc) { int nConv = 0; int i = 0; OFString strData; /* CStringA strConv; if (strEnc == "ISO_IR 192") { strConv = "UTF-8"; } else if (strEnc == "ISO_IR 100") { strConv = "ASCII"; } else if (strEnc == "ISO 2022 IR 149") { strConv = "ISO-2022-KR"; } strConv = "EUC-KR"; for (i = 0; i < pDcmItem->card(); i++) { strData.empty(); DcmElement* pElement = NULL; pElement = pDcmItem->getElement(i); DcmTag tag; tag = pElement->getTag(); int nGroup = tag.getGroup(); int nElement = tag.getElement(); DcmEVR vr; vr = pElement->getVR(); if (tag == DCM_ScheduledProcedureStepSequence) { DcmSequenceOfItems* seq = NULL; seq = (DcmSequenceOfItems*)pElement; if (seq != NULL) { int j = 0; int nSubData = seq->card(); DcmItem* pItem = seq->getItem(0); if (pItem != NULL) { DcmElement* pSubElement = NULL; nSubData = pItem->card(); for (j = 0; jgetElement(j); if (pSubElement->getVR() == EVR_PN) { int nRet = 0; nRet = ConvertPatientName(pSubElement, strConv); pSubElement->getOFStringArray(strData); if (nRet>=0) { nConv++; } else { } } if (pSubElement != NULL) { tag = pSubElement->getTag(); pSubElement->getOFStringArray(strData); } } } } } else { pElement->getOFStringArray(strData); } if (vr == EVR_PN) { int nRet = 0; nRet = ConvertPatientName(pElement, strConv); pElement->getOFStringArray(strData); if (nRet >= 0) { nConv++; } else { } } } */ return nConv; } int SDCMFindSCUDataCallback::ConvertPatientName(DcmElement* pElement, OFString strEncDICOM) { int nRet = 0; /* CStringA strEncSystem = CSDCMStringEncoder::GetStringEncSystem(); OFString strData; pElement->getOFStringArray(strData); OFString strConv; nRet = CSDCMStringEncoder::ConvertString(strData, strConv, strEncDICOM, strEncSystem); if (nRet >= 0) { pElement->putOFStringArray(strConv); pElement->getOFStringArray(strData); } */ return nRet; } OFString SDCMFindSCUDataCallback::FindCharacterSet(DcmItem* pDcmItem) { int i = 0; OFString strData = ""; /* for (i = 0; i < pDcmItem->card(); i++) { strData.clear(); DcmElement* pElement = NULL; pElement = pDcmItem->getElement(i); DcmTag tag = pElement->getTag(); int nGroup = tag.getGroup(); int nElement = tag.getElement(); DcmEVR vr; vr = pElement->getVR(); if (tag == DCM_ScheduledProcedureStepSequence) { DcmSequenceOfItems* seq = NULL; seq = (DcmSequenceOfItems*)pElement; if (seq != NULL) { int j = 0; int nSubData = seq->card(); DcmItem* pItem = seq->getItem(0); if (pItem != NULL) { DcmElement* pSubElement = NULL; nSubData = pItem->card(); for (j = 0; j < nSubData; j++) { pSubElement = NULL; pSubElement = pItem->getElement(j); if (pSubElement != NULL) { tag = pSubElement->getTag(); if (tag == DCM_SpecificCharacterSet) { pSubElement->getOFStringArray(strData); return strData; } } } } } } else if(tag==DCM_SpecificCharacterSet) { pElement->getOFStringArray(strData); return strData; } } */ return ""; } void SDCMFindSCUDataCallback::ReadSequence(DcmElement* pElement, WorklistResponseData* wr) { CommonData* pCommonData = MainWindow::GetCommonData(); QString strEnc = pCommonData->GetDICOMCharacterSet(); DcmSequenceOfItems* seq = NULL; seq = (DcmSequenceOfItems*)pElement; //CSDCM test1; DcmTag tag; DcmItem* pSubItem = NULL; OFString strData; DcmTagKey dcmKey; DcmEVR vr; DcmTagKey tagKey; pElement->getTagVal(tagKey); vr = pElement->getVR(); if (seq != NULL) { //CSDCM* pChild = test1.InsertSequence(tag); int j = 0; int nSubData = seq->card(); DcmItem* pItem = seq->getItem(0); if (pItem != NULL) { DcmElement* pSubElement = NULL; nSubData = pItem->card(); for (j = 0; jgetElement(j); if (pSubElement != NULL) { tag = pSubElement->getTag(); pSubElement->getOFStringArray(strData); DcmEVR vrChild = pSubElement->getVR(); if(vrChild==EVR_SQ) { ReadSequence(pSubElement, wr); } if(vrChild==EVR_PN || vrChild==EVR_LO) { //strData = CharConvert::EUCKRtoUTF8(strData.data()).toStdString().c_str(); if(strEnc=="EUC-KR") { strData = CharConvert::Convert(strData.data(), "UTF-8").toStdString().c_str(); } } wr->InsertData(tag, strData); //pChild->InsertTagValue(tag, strData); } } } } /* if (tag == DCM_ScheduledProcedureStepSequence) { DcmSequenceOfItems* seq = NULL; seq = (DcmSequenceOfItems*)pElement; if (seq != NULL) { int j = 0; int nSubData = seq->card(); DcmItem* pItem = seq->getItem(0); if (pItem != NULL) { DcmElement* pSubElement = NULL; nSubData = pItem->card(); for (j = 0; jgetElement(j); if (pSubElement != NULL) { tag = pSubElement->getTag(); pSubElement->getOFStringArray(strData); if(tag==DCM_PatientName) { strData = MainWindow::EUCKRtoUTF8(strData.data()).toStdString(); } wr->InsertData(tag, strData); } } } } } */ }