虚拟L_VOIDLDicomNet: OnBeforeSendCommandSet(电脑)
通知一个连接的命令集部分DIMSE之前LDicomNet:SendXxxResponse传播。
一个指针指向一个LDicomDS包含的命令集部分DIMSE SendXxxResponse消息。
一个也没有。
这个回调之前解雇的原因是以下功能:发送命令集部分
这允许一个SCP命令集添加/删除DICOM元素cs之前的传播。
这是有用的添加可选状态元素提供了额外的状态信息包括:
Win32, x64
这个例子展示了如何发送/检索额外的元素在DICOM命令集。
C-STORE-REQ是SCP。
SCP发送一个C-STORE-RSP与拒绝的状态:资源,并设置可选元素ErrorComment (0000、0902)
并读取可选的命令集元素ErrorComment (0000、0902)
名称空间LDicomNet_OnBeforeSendCommandSet_Namespace
{
/ /日志消息
/ /这个实现日志到控制台,并调试窗口
L_VOID LogMessage (TCHAR * szMsg)
{
wprintf(文本(“\ n”));
wprintf (szMsg);
OutputDebugStringW(文本(“\ n”));
OutputDebugStringW (szMsg);
}
L_VOID LogMessage (TCHAR * s, L_INT n)
{
TCHAR szLog [200] = {0};
wsprintf (szLog文本(“% s (% d)”)、s、n);
LogMessage (szLog);
}
L_VOID LogMessage (TCHAR * s, TCHAR * s2)
{
TCHAR szLog [200] = {0};
wsprintf (szLog文本(“% s (% s)”),年代,s2);
LogMessage (szLog);
}
/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
/ /客户端类
/ /
/ /类,用于连接到服务器
/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
类CMyClient:公共LDicomNet
{
公共:
CMyClient (L_INT32 nMode): LDicomNet (NULL, nMode)
{
m_waitEvent = CreateEvent (NULL,真的,真的,文本(“ClientEvent”));
ResetEvent (m_waitEvent);
}
~ CMyClient (无效)
{
CloseHandle (m_waitEvent);
}
/ /客户端
L_VOID OnConnect (L_INT nError);
L_VOID OnReceiveAssociateAccept (LDicomAssociate * pPDU);
L_VOID OnReceiveReleaseResponse ();
L_VOID OnReceiveCStoreResponse (L_UCHAR nPresentationID, L_UINT16 nMessageID, L_TCHAR * pszClass L_TCHAR * pszInstance L_UINT16 nStatus);
L_BOOL等(DWORD超时= 5000);
私人:
处理m_waitEvent;
};
/ /继续发送消息,直到hEvent暗示,我们的超时
/ /返回TRUE hEvent是否暗示
/ /如果超时,返回FALSE
L_BOOL MessageLoop (
处理hEvent,/ /处理需要等待
DWORD超时/ /超时时间,以毫秒为单位
)
{
DWORD dwStart = GetTickCount ();
味精味精= {0};
挥发性L_BOOL bRunForever = TRUE;
而(bRunForever)
{
如果(PeekMessage(味精,NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(味精);
DispatchMessage(味精);
}
如果(WaitForSingleObject (hEvent 0) = = WAIT_OBJECT_0)
{
ResetEvent (hEvent);
返回真正的;
}
DWORD dwCurrent = GetTickCount ();
如果((dwCurrent - dwStart) >超时)
{
返回虚假的;
}
}
返回真正的;
}
L_VOID CMyClient:: OnConnect (L_INT nError)
{
L_TCHAR szMsg [200] = {0};
wsprintf (szMsg文本(“CMyClient:: OnConnect: nError [% d]”),nError);
LogMessage (szMsg);
}
L_VOID CMyClient: OnReceiveAssociateAccept (LDicomAssociate * pPDU)
{
UNREFERENCED_PARAMETER (pPDU);
LogMessage(文本(“CMyClient:: OnReceiveAssociateAccept”));
SetEvent (m_waitEvent);
}
L_VOID CMyClient:: OnReceiveCStoreResponse (L_UCHAR nPresentationID, L_UINT16 nMessageID, L_TCHAR * pszClass L_TCHAR * pszInstance L_UINT16 nStatus)
{
如果(pszClass = = NULL)
{
pszClass =文本(”“);
}
LogMessage(文本(“CMyClient:: OnReceiveCStoreResponse”));
LogMessage(文本(“\ t nPresentationID”),nPresentationID);
LogMessage(文本(“\ t nMessageID”),nMessageID);
LogMessage(文本(“\ t pszClass”),pszClass);
LogMessage(文本(“\ t pszInstance”),pszInstance);
开关(nStatus)
{
情况下COMMAND_STATUS_WARNING:
LogMessage(文本(“\ t nStatus: COMMAND_STATUS_WARNING”));
打破;
情况下COMMAND_STATUS_PENDING_WARNING:
LogMessage(文本(“\ t nStatus: COMMAND_STATUS_PENDING_WARNING”));
打破;
情况下COMMAND_STATUS_PENDING:
LogMessage(文本(“\ t nStatus: COMMAND_STATUS_PENDING”));
打破;
情况下COMMAND_STATUS_SUCCESS:
LogMessage(文本(“\ t nStatus: COMMAND_STATUS_SUCCESS”));
SetEvent (m_waitEvent);
打破;
情况下COMMAND_STATUS_REFUSED_OUT_OF_RESOURCES:
{
LogMessage(文本(“\ t nStatus: COMMAND_STATUS_REFUSED_OUT_OF_RESOURCES”));
/ /获取额外的额外元素命令集
LDicomDS *电脑= GetCommandSet ();
如果(电脑! = NULL)
{
pDICOMELEMENT pElement = pc - > FindFirstElement (NULL, TAG_ERROR_COMMENT,真实);
如果(pElement ! = NULL)
{
L_TCHAR * pszErrorComment = pc - > GetStringValue (pElement 0 1);
LogMessage(文本(“\ t ErrorComment:“),pszErrorComment);
}
}
}
SetEvent (m_waitEvent);
打破;
}
SetEvent (m_waitEvent);
}
L_VOID CMyClient: OnReceiveReleaseResponse ()
{
LogMessage(文本(“CMyClient:: OnReceiveReleaseResponse”));
SetEvent (m_waitEvent);
}
L_BOOL CMyClient:等待(DWORD超时)
{
L_BOOL bRet = MessageLoop (m_waitEvent,超时);
返回bRet;
}
/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
/ /服务器连接类
/ /
/ /当一个客户端连接,CMyServer CMyServerConnection类的创建一个新的实例
/ /并接受连接。
/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
类CMyServerConnection:公共LDicomNet
{
公共:
CMyServerConnection (L_INT32 nMode): LDicomNet (NULL, nMode)
{
}
~ CMyServerConnection (无效)
{
}
/ /服务器
L_VOID OnReceiveAssociateRequest (LDicomAssociate * pPDU);
L_VOID OnReceiveCStoreRequest (L_UCHAR nPresentationID, L_UINT16 nMessageID, L_TCHAR * pszClass L_TCHAR * pszInstance L_UINT16 nPriority, L_TCHAR * pszMoveAE L_UINT16 nMoveMessageID, LDicomDS * pDS);
L_VOID OnReceiveReleaseRequest ();
L_VOID OnBeforeSendCommandSet (LDicomDS * pc);
};
#定义SIZEINWORD (p)运算符(p) /运算符(L_TCHAR)
L_VOID CMyServerConnection: OnReceiveAssociateRequest (LDicomAssociate * pPDU)
{
LogMessage(文本(“\ tCMyServerConnection:: OnReceiveAssociateRequest”));
LDicomAssociate DicomAssociate(假);
L_TCHAR clientAE [20] = {0};
pPDU - > GetCalling (clientAE 20);
/ /复制从收到表示对象
/ /答复,我们只支持第一个收到hPDU转移语法
L_TCHAR szTransfer (PDU_MAX_UID_SIZE + 1) = {0};
L_TCHAR szAbstract (PDU_MAX_UID_SIZE + 1) = {0};
L_INT iPresentationCount = pPDU - > GetPresentationCount ();
为(L_UCHAR我= 0;我< iPresentationCount;我+ +)
{
= pPDU L_UCHAR国家免疫日- > GetPresentation(我);
,pPDU - > GetTransfer(国家免疫日0,szTransfer, PDU_MAX_UID_SIZE + 1);
L_UCHAR nResult = PDU_ACCEPT_RESULT_SUCCESS;
,pPDU - > GetAbstract(国家免疫日szAbstract, PDU_MAX_UID_SIZE + 1);
DicomAssociate。,AddPresentation(国家免疫日nResult szAbstract);
DicomAssociate。,AddTransfer(国家免疫日szTransfer);
}
LogMessage(文本(“\ tCMyServerConnection:: SendAssociateAccept”));
SendAssociateAccept (&DicomAssociate);
}
L_VOID CMyServerConnection:: OnReceiveCStoreRequest (L_UCHAR nPresentationID, L_UINT16 nMessageID, L_TCHAR * pszClass L_TCHAR * pszInstance L_UINT16 nPriority, L_TCHAR * pszMoveAE L_UINT16 nMoveMessageID, LDicomDS * pDS)
{
UNREFERENCED_PARAMETER (pDS);
UNREFERENCED_PARAMETER (pszMoveAE);
LogMessage(文本(“\ tCMyServerConnection:: OnReceiveCStoreRequest”));
LogMessage(文本(“\ t nMoveMessageID”),nMoveMessageID);
LogMessage(文本(“\ t nPriority”),nPriority);
/ /……
/ /……做这里的商店
/ /……nStatus =存储的状态
LogMessage(文本(“\ \ t做这里的商店”));
/ /发送C-Store-RSP
LogMessage(文本(“\ tCMyServerConnection:: SendCStoreResponse”));
SendCStoreResponse (nPresentationID、nMessageID pszClass、pszInstance COMMAND_STATUS_SUCCESS);
}
L_VOID CMyServerConnection: OnBeforeSendCommandSet (LDicomDS *个人电脑)
{
/ /命令添加任何额外的元素
/ /对于这个示例,存储请求将失败的状态“拒绝了:资源”
/ /在TAG_ERROR_COMMENT的原因
如果(电脑! = NULL)
{
pDICOMELEMENT pElement =零;
pElement = pc - > FindFirstElement (NULL, TAG_STATUS,真实);
如果(pElement ! = NULL)
{
L_UINT16 nStatus = COMMAND_STATUS_REFUSED_OUT_OF_RESOURCES;
pc - > SetShortValue (pElement (L_INT16 *) &nStatus 1);
}
pElement = pc - > InsertElement (NULL,假,TAG_ERROR_COMMENT VR_LO,假的,0);
如果(pElement ! = NULL)
{
L_TCHAR szErrorComment[] =文本(“磁盘空间”);
pc - > SetStringValue (pElement szErrorComment 1);
}
}
}
L_VOID CMyServerConnection: OnReceiveReleaseRequest ()
{
LogMessage(文本(“\ tCMyServerConnection:: OnReceiveReleaseRequest”));
LogMessage(文本(“\ tCMyServerConnection:: SendReleaseResponse”));
SendReleaseResponse ();
}
/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
/ /服务器类
/ /
/ /监听连接
/ /客户端连接时,这个类创建一个CMyServerConnection并接受连接
/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
类CMyServer:公共LDicomNet
{
公共:
CMyServer (L_INT32 nMode): LDicomNet (NULL, nMode)
{
m_pServerConnection =零;
}
~ CMyServer (无效)
{
如果(m_pServerConnection ! = NULL)
{
删除m_pServerConnection;
}
}
L_VOID OnAccept (L_INT nError);
L_VOID OnClose (L_INT nError, LDicomNet * pServerConnection);
CMyServerConnection * m_pServerConnection;
};
L_VOID CMyServer:: OnAccept (L_INT nError)
{
LogMessage(文本(“\ tCMyServer:: OnAccept”));
如果(nError ! = DICOM_SUCCESS)
{
返回;
}
如果(m_pServerConnection ! = NULL)
{
删除m_pServerConnection;
m_pServerConnection =零;
}
m_pServerConnection =新CMyServerConnection (DICOM_SECURE_NONE);
如果(m_pServerConnection = = NULL)
{
返回;
}
/ / m_pServerConnection - > EnableOptimizedSend(真正的);
nError = LDicomNet:接受(m_pServerConnection);
如果(nError ! = DICOM_SUCCESS)
{
删除m_pServerConnection;
返回;
}
}
L_VOID CMyServer:: OnClose (L_INT nError, LDicomNet * pServerConnection)
{
UNREFERENCED_PARAMETER (nError);
LogMessage(文本(“\ tCMyServer:: OnClose”));
如果(m_pServerConnection = = pServerConnection)
{
m_pServerConnection =零;
}
删除(CMyServerConnection *) pServerConnection;
}
/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
/ /样本从这里开始
/ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#定义WaitForProcessing () \
{\
如果(! client.Wait ()) \
{\
LogMessage(文本(“超时:client.Connect”));\
nRet = DICOM_ERROR_NET_TIME_OUT;\
转到清理;\
}\
}
L_INT LDicomNet_OnBeforeSendCommandSetExample ()
{
LogMessage(文本(“\ n \ n * * * OnBeforeSendCommandSetExample * * *”));
L_TCHAR * pszServerAddress =文本(“127.0.0.1”);
L_UINT uServerPort = 504;
L_INT nRet = DICOM_SUCCESS;
/ /加载客户端将存储的DICOM数据集
LDicomDS ds;
/ / ds.LoadDS (MAKE_IMAGE_PATH(文本(“IMAGE1.dcm”))、DS_LOAD_CLOSE);
ds.LoadDS(文本(“d: \ \ \ \ image3.dcm图像”)),DS_LOAD_CLOSE);
L_TCHAR * pszStorageClass =零;
pDICOMELEMENT pElement = ds。FindFirstElement (NULL, TAG_MEDIA_STORAGE_SOP_CLASS_UID,真实);
如果(pElement ! = NULL)
{
pszStorageClass = ds。GetStringValue (pElement 0 1);
}
如果(pszStorageClass = = NULL | | _tcslen (pszStorageClass) = = 0)
{
pElement = ds。FindFirstElement (NULL, TAG_SOP_CLASS_UID,真实);
如果(pElement ! = NULL)
{
pszStorageClass = ds。GetStringValue (pElement 0 1);
}
}
如果(pszStorageClass = = NULL | | _tcslen (pszStorageClass) = = 0)
{
pszStorageClass = UID_CT_IMAGE_STORAGE;/ /默认CT图像存储
}
/ /
/ /得到图像传输语法
/ /
L_TCHAR * pszTransferSyntax =零;
L_TCHAR * pszStorageInstance =零;
pElement = ds。FindFirstElement (NULL, TAG_TRANSFER_SYNTAX_UID,真实);
如果(pElement ! = NULL)
{
pszTransferSyntax = ds。GetStringValue (pElement 0 1);
}
pElement = ds。FindFirstElement (NULL, TAG_SOP_INSTANCE_UID,真实);
如果(pElement ! = NULL)
{
pszStorageInstance = ds。GetStringValue (pElement 0 1);
}
LDicomNet:启动();
CMyClient客户机(DICOM_SECURE_NONE);
CMyServer服务器(DICOM_SECURE_NONE);
LogMessage(文本(“\ tCMyServer:听”));
nRet =服务器。听(pszServerAddress uServerPort 5);
LogMessage(文本(“CMyClient:连接”));
客户端。连接(NULL, 0, pszServerAddress uServerPort);
如果(! client.Wait (2000))
{
如果(! client.IsConnected ())
{
LogMessage(文本(“超时:client.Connect”));
nRet = DICOM_ERROR_NET_TIME_OUT;
转到清理;
}
}
如果(nRet = = DICOM_SUCCESS)
{
/ /创建关联类的请求
LDicomAssociate dicomAssociateRequest(真正的);
dicomAssociateRequest.SetCalled(文本(“L20_PACS_SCP32”));
dicomAssociateRequest.SetCalling(文本(“LEAD_CLIENT”));
dicomAssociateRequest。SetImplementClass(真的,文本(“1.2.840.114257.1”));
dicomAssociateRequest。SetImplementVersion(真的,文本(“1”));
dicomAssociateRequest。SetMaxLength(真的,0 x100000);
dicomAssociateRequest。AddPresentation (1 0 UID_VERIFICATION_CLASS);
dicomAssociateRequest。UID_IMPLICIT_VR_LITTLE_ENDIAN AddTransfer(1日);
dicomAssociateRequest。AddPresentation (3 0 pszStorageClass);
dicomAssociateRequest。UID_IMPLICIT_VR_LITTLE_ENDIAN AddTransfer (3);
/ /发送A-Associate-RQ消息
LogMessage(文本(“CMyClient:: SendAssociateRequest”));
nRet = client.SendAssociateRequest (&dicomAssociateRequest);
如果(! client.Wait (5000))
{
LogMessage(文本(“超时:client.Connect”));
nRet = DICOM_ERROR_NET_TIME_OUT;
转到清理;
}
}
如果(nRet = = DICOM_SUCCESS)
{
L_UCHAR nPresentationID = client.GetAssociate () - > FindAbstract (pszStorageClass);
L_UINT16 uUniqueID = 99;
LogMessage(文本(“CMyClient:: SendCStoreRequest”));
客户端。发送CStoreRequest(nPresentationID, uUniqueID, pszStorageClass, pszStorageInstance, COMMAND_PRIORITY_MEDIUM, TEXT(“没有”),1 ds);
WaitForProcessing ();
}
LogMessage(文本(“CMyClient:: SendReleaseRequest”));
client.SendReleaseRequest ();
WaitForProcessing ();
清理:
LogMessage(文本(“CMyClient:接近”));
client.Close ();
client.Wait (1000);
LogMessage(文本(“\ tCMyServer:接近”));
server.Close ();
LDicomNet:关闭();
返回nRet;
}
}
/ /