#include "SCPClient.h"
#include "DicomError.h"
#include "LogEvent.h"
#include <QDateTime>
#include <QDir>
SCPClient::SCPClient()
:LDicomNet((L_TCHAR*)NULL, DICOM_SECURE_NONE)
{
}
L_VOID SCPClient::OnReceiveAssociateRequest(LDicomAssociate *pPDU)
{
outputLog(m_strSCUIP + ":收到 SCU Associate 请求...");
//要先调用 GetCalled 后调用 GetCalling,否则出错
L_TCHAR szCalled[PDU_MAX_TITLE_SIZE];
pPDU->GetCalled(szCalled, PDU_MAX_TITLE_SIZE);
L_TCHAR szCalling[PDU_MAX_TITLE_SIZE];
pPDU->GetCalling(szCalling, PDU_MAX_TITLE_SIZE);
QString strClientAE = QString::fromWCharArray(szCalling);
m_strSCUAETitle = strClientAE;
//验证客户端版本
L_UINT16 nVer=pPDU->GetVersion();
if(nVer != 1) {
outputLog(QString("%1:不支持的协议版本(%2),拒绝该连接请求。").arg(m_strSCUIP).arg(nVer));
SendAssociateReject(PDU_REJECT_RESULT_PERMANENT, PDU_REJECT_SOURCE_PROVIDER1, PDU_REJECT_REASON_VERSION);
return;
}
LDicomAssociate dicomAssociate(L_FALSE);
dicomAssociate.Reset(L_FALSE);
dicomAssociate.SetCalled(szCalled);
dicomAssociate.SetCalling(szCalling);
dicomAssociate.SetApplication(const_cast<L_TCHAR*>(UID_APPLICATION_CONTEXT_NAME));
dicomAssociate.SetVersion(1);
L_TCHAR szUID[] = L"1.2.3.108.56497.33";
L_TCHAR szVersion[] = L"StoreSCP";
dicomAssociate.SetImplementClass(L_TRUE, szUID);
dicomAssociate.SetImplementVersion(L_TRUE, szVersion);
QStringList firstTransferList;
firstTransferList.append(QString::fromWCharArray(UID_JPEG_LOSSLESS_NONHIER_14B));
firstTransferList.append(QString::fromWCharArray(UID_JPEG_LOSSLESS_NONHIER_14));
firstTransferList.append(QString::fromWCharArray(UID_JPEG_LOSSLESS_NONHIER_15));
firstTransferList.append(QString::fromWCharArray(UID_JPEG_LOSSLESS_HIER_PROCESS_28));
firstTransferList.append(QString::fromWCharArray(UID_JPEG_LOSSLESS_HIER_PROCESS_29));
firstTransferList.append(QString::fromWCharArray(UID_JPEG2000_LOSSLESS_ONLY));
firstTransferList.append(QString::fromWCharArray(UID_RLE_LOSSLESS));
firstTransferList.append(QString::fromWCharArray(UID_EXPLICIT_VR_LITTLE_ENDIAN));
firstTransferList.append(QString::fromWCharArray(UID_IMPLICIT_VR_LITTLE_ENDIAN));
firstTransferList.append(QString::fromWCharArray(UID_EXPLICIT_VR_BIG_ENDIAN));
QList<L_TCHAR*> szFirstTransferList;
szFirstTransferList.append(const_cast<L_TCHAR*>(UID_JPEG_LOSSLESS_NONHIER_14B));
szFirstTransferList.append(const_cast<L_TCHAR*>(UID_JPEG_LOSSLESS_NONHIER_14));
szFirstTransferList.append(const_cast<L_TCHAR*>(UID_JPEG_LOSSLESS_NONHIER_15));
szFirstTransferList.append(const_cast<L_TCHAR*>(UID_JPEG_LOSSLESS_HIER_PROCESS_28));
szFirstTransferList.append(const_cast<L_TCHAR*>(UID_JPEG_LOSSLESS_HIER_PROCESS_29));
szFirstTransferList.append(const_cast<L_TCHAR*>(UID_JPEG2000_LOSSLESS_ONLY));
szFirstTransferList.append(const_cast<L_TCHAR*>(UID_RLE_LOSSLESS));
szFirstTransferList.append(const_cast<L_TCHAR*>(UID_EXPLICIT_VR_LITTLE_ENDIAN));
szFirstTransferList.append(const_cast<L_TCHAR*>(UID_IMPLICIT_VR_LITTLE_ENDIAN));
szFirstTransferList.append(const_cast<L_TCHAR*>(UID_EXPLICIT_VR_BIG_ENDIAN));
//在 Abstract 表中查找,如果存在(并能找到Transfer),表示支持。优先支持无损压缩的传输语法。
QStringList acceptClassUIDs;
L_TCHAR szAbstract[PDU_MAX_UID_SIZE];
L_INT nPresentationCount = pPDU->GetPresentationCount();
for (int ind = 0; ind < nPresentationCount; ind++) {
L_UCHAR nID = pPDU->GetPresentation(ind);
pPDU->GetAbstract(nID, szAbstract, PDU_MAX_UID_SIZE);
QString strAbstract = QString::fromWCharArray(szAbstract);
if (acceptClassUIDs.contains(strAbstract)) {
dicomAssociate.AddPresentation(nID, PDU_ACCEPT_RESULT_ABSTRACT_SYNTAX, szAbstract);
continue;
} else {
acceptClassUIDs.append(strAbstract);
}
dicomAssociate.AddPresentation(nID, PDU_ACCEPT_RESULT_SUCCESS, szAbstract);
QStringList transferList;
L_TCHAR szTransfer[PDU_MAX_UID_SIZE];
L_INT transferCount = pPDU->GetTransferCount(nID);
for (int j = 0; j < transferCount; j++) {
pPDU->GetTransfer(nID, j, szTransfer, PDU_MAX_UID_SIZE);
QString strTransfer = QString::fromWCharArray(szTransfer);
if (transferList.contains(strTransfer) == false) {
transferList.append(strTransfer);
}
}
bool bFound = false;
for (int j = 0; j < firstTransferList.length(); j++) {
if (transferList.contains(firstTransferList.at(j))) {
dicomAssociate.AddTransfer(nID, szFirstTransferList[j]);
bFound = true;
break;
}
}
if (false == bFound && transferList.length() > 0) {
L_TCHAR pszTransfer[PDU_MAX_TITLE_SIZE];
transferList.at(0).toWCharArray(pszTransfer);
pszTransfer[transferList.at(0).length()] = '\0';
dicomAssociate.AddTransfer(nID, pszTransfer);
bFound = true;
}
if (bFound) {
dicomAssociate.SetResult(nID, PDU_ACCEPT_RESULT_SUCCESS);
} else {
dicomAssociate.SetResult(nID, PDU_ACCEPT_RESULT_TRANSFER_SYNTAX);
}
}
L_INT nRet = SendAssociateAccept(&dicomAssociate);
if (nRet != DICOM_SUCCESS) {
QString dcmError = DicomError::instance().text(nRet);
QString strError = QString("%1:发送 associate accept 发生错误,原因:%2").arg(m_strSCUIP, dcmError);
outputLog(strError);
return;
}
outputLog(m_strSCUIP + ":SCU Associate 已接受。");
}
L_VOID SCPClient::OnReceiveCStoreRequest(L_UCHAR nPresentationID, L_UINT16 nMessageID, L_TCHAR* pszClass, L_TCHAR* pszInstance, L_UINT16 nPriority, L_TCHAR* pszMoveAE, L_UINT16 nMoveMessageID, LDicomDS* pDS)
{
Q_UNUSED(nPriority)
Q_UNUSED(pszMoveAE)
Q_UNUSED(nMoveMessageID)
if (nullptr == pDS) {
outputLog(m_strSCUIP + ":C-STORE DataSet Is NULL,返回 COMMAND_STATUS_PROCESSING_FAILURE。");
SendCStoreResponse(nPresentationID, nMessageID, pszClass, pszInstance, COMMAND_STATUS_PROCESSING_FAILURE);
return;
}
QString strInstanceUID = QString::fromWCharArray(pszInstance);
QString strPatientID, strPatientName;
getElementValue(pDS, TAG_PATIENT_ID, strPatientID);
getElementValue(pDS, TAG_PATIENT_NAME, strPatientName);
outputLog(QString("%1:收到 C-STORE 请求,PatientName:%2,InstanceUID:%3,ClassUID:%4").arg(m_strSCUIP, strPatientName, strInstanceUID, pszClass));
if (strPatientName.isEmpty() || "***" == strPatientName) { //此处对***做特殊处理,是因为测试图像的PatientName是***
strPatientName = "UnknownName";
}
QString strStudyDate;
QDateTime dtStudyTime;
bool bSuccess = getDateTime(pDS, TAG_STUDY_DATE, TAG_STUDY_TIME, dtStudyTime);
if (bSuccess) {
strStudyDate = dtStudyTime.toString("yyyyMMdd");
} else {
strStudyDate = QDateTime::currentDateTime().toString("yyyyMMdd");
}
QString strModality;
getElementValue(pDS, TAG_MODALITY, strModality);
QString strSopInstanceUID = QString::fromWCharArray(pszInstance);
QString strImagePath = QString("%1/%2").arg(m_strImageFolder, strPatientName);
QDir qDir;
if (qDir.exists(strImagePath) == false) {
qDir.mkpath(strImagePath);
}
QString strImageFilename = QString("%1/%2_%3.dcm").arg(strImagePath, strModality, strSopInstanceUID);
L_TCHAR pszImageFilename[_MAX_PATH];
strImageFilename.toWCharArray(pszImageFilename);
pszImageFilename[strImageFilename.length()] = '\0';
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
CStoreSCPDemo.zip (66个子文件)
CStoreSCPDemo
release
Ltkrnu.dll 495KB
arrow_down.svg 133B
bearer
qgenericbearer.dll 43KB
style.qss 1KB
styles
qwindowsvistastyle.dll 130KB
libGLESv2.dll 2.8MB
Qt5Gui.dll 5.62MB
imageformats
qjpeg.dll 365KB
qsvg.dll 28KB
qtga.dll 27KB
qtiff.dll 345KB
qwebp.dll 403KB
qgif.dll 33KB
qicns.dll 37KB
qwbmp.dll 26KB
qico.dll 31KB
Qt5Core.dll 5.13MB
Qt5Svg.dll 258KB
Qt5Widgets.dll 4.25MB
translations
qt_lv.qm 150KB
qt_sk.qm 123KB
qt_cs.qm 171KB
qt_de.qm 215KB
qt_ja.qm 127KB
qt_fi.qm 176KB
qt_da.qm 177KB
qt_ko.qm 153KB
qt_fr.qm 162KB
qt_pl.qm 159KB
qt_ar.qm 156KB
qt_tr.qm 190KB
qt_it.qm 157KB
qt_bg.qm 161KB
qt_gd.qm 185KB
qt_es.qm 161KB
qt_en.qm 33B
qt_uk.qm 155KB
qt_zh_TW.qm 125KB
qt_ca.qm 205KB
qt_hu.qm 157KB
qt_he.qm 135KB
qt_ru.qm 199KB
iconengines
qsvgicon.dll 35KB
platforms
qwindows.dll 1.16MB
libEGL.dll 22KB
CStoreSCPDemo.exe 86KB
Ltdicu.dll 2.94MB
opengl32sw.dll 15.25MB
Qt5Network.dll 1MB
D3Dcompiler_47.dll 3.31MB
Ltwvcu.dll 2.35MB
CStoreSCPDemo
DicomError.cpp 5KB
arrow_down.svg 133B
style.qss 1KB
LogEvent.cpp 113B
SCPClient.cpp 14KB
SCPServer.cpp 3KB
main.cpp 431B
DicomError.h 332B
CStoreSCPDemo.pro 1KB
SCPClient.h 2KB
SCPServer.h 837B
MainWindow.cpp 5KB
MainWindow.ui 2KB
LogEvent.h 291B
MainWindow.h 669B
共 66 条
- 1
资源评论
blackwood-cliff
- 粉丝: 126
- 资源: 57
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功