// DICOMSRVDlg.cpp : implementation file // #include "stdafx.h" #include "DICOMSRV.h" #include "SRVDlg.h" #include // #include "..\..\..\..\include\l_ocx40.h" // #include "..\..\..\..\include\ltdicocx.h" // #include "..\..\..\..\include\ltdncocx.h" // #include "..\..\..\..\include\ltdlgocx.h" #include "AdminDlg.h" // #include "uiditem.h" // #include "dselemen.h" // #include "datevalu.h" // #include "timevalu.h" // #include "dicomtag.h" #include #include "Patients.h" #include "Studies.h" #include "Series.h" #include "Images.h" extern CDICOMSRVApp theApp; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif void CALLBACK EXPORT TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime); long glSec; const long SecurityModes[] = {DICOM_SECURE_NONE, DICOM_SECURE_ISCL, DICOM_SECURE_TLS}; ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDICOMSRVDlg dialog CDICOMSRVDlg::CDICOMSRVDlg(CWnd* pParent /*=NULL*/) : CDialog(CDICOMSRVDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDICOMSRVDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } BEGIN_EVENTSINK_MAP(CDICOMSRVDlg, CDialog) //{{AFX_EVENTSINK_MAP(CDICOMSRVDlg) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP() void CDICOMSRVDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDICOMSRVDlg) DDX_Control(pDX, IDC_LIST5, m_StudyList); DDX_Control(pDX, IDC_LIST4, m_PatientNameList); DDX_Control(pDX, IDC_LIST3, m_PatientIDList); DDX_Control(pDX, IDC_LIST2, m_EventLog); DDX_Control(pDX, IDC_LIST1, m_UserList); DDX_Control(pDX, IDC_BUTTON4, m_Close); DDX_Control(pDX, IDC_BUTTON3, m_Delete); DDX_Control(pDX, IDC_BUTTON2, m_Import); DDX_Control(pDX, IDC_BUTTON1, m_SetRoot); DDX_Control(pDX, IDC_TREE3, m_ConnectionList); DDX_Control(pDX, IDC_TREE2, m_KeyView); DDX_Control(pDX, IDC_TREE1, m_DicomDir); DDX_Control(pDX, IDC_LEADRASTERVIEW1, m_LEADRasterView1); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDICOMSRVDlg, CDialog) //{{AFX_MSG_MAP(CDICOMSRVDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_COMMAND(ID_SERVER_EXIT, OnServerExit) ON_COMMAND(ID_SERVER_CONNECTIONS, OnServerConnections) ON_WM_CLOSE() ON_COMMAND(ID_SERVER_ADMINISTRATION, OnServerAdministration) ON_BN_CLICKED(IDC_BUTTON4, OnButton4) ON_BN_CLICKED(IDC_BUTTON2, OnButton2) ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTree1) ON_NOTIFY(NM_DBLCLK, IDC_TREE1, OnDblclkTree1) ON_BN_CLICKED(IDC_BUTTON3, OnButton3) ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_WM_TIMER() ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDICOMSRVDlg message handlers const WCHAR BASED_CODE _szLicString[] = LEAD_LICENSE_STRING; BOOL CDICOMSRVDlg::OnInitDialog() { short nRet; CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon m_bImport = FALSE; //NOTE: change this to the directory where you put the MDB file!!! lstrcpy(m_szWorkDir, ""); if(!lstrlen(m_szWorkDir)) { CString csMsg; csMsg = "You must set a working directory for this demo to work properly.\nPlease change the code and recompile!\n\n\n"; csMsg += "PLEASE Read the SRVRMDB.DOC file for information about the database that\n"; csMsg += "this demo uses.\n"; csMsg += "A sample database has been provided for you in the \\IMAGES directory.\n"; csMsg += "This demo requires a working directory.\n"; csMsg += "Create a working directory such as D:\\DICOM\n"; csMsg += "In the source code, you must set the working directory to that directory.\n"; csMsg += "Recompile this demo.\n"; csMsg += "Copy the MDB file to the working directory.\n"; csMsg += "Copy the three sample .DIC files from \\IMAGES to the working directory.\n"; csMsg += "Rename the .DIC files:\n"; csMsg += " IMAGE1.DIC ==> 1.DIC\n"; csMsg += " IMAGE2.DIC ==> 2.DIC\n"; csMsg += " IMAGE3.DIC ==> 3.DIC\n"; csMsg += "When you first run this demo, you can use the Administration dialog to\n"; csMsg += "configure the server.\n"; MessageBox(csMsg); EndDialog(IDCANCEL); return TRUE; } BSTR lpLic = SysAllocString(_szLicString); ILEADDicomFactory *pFactory=NULL; CoCreateInstance(CLSID_LEADDicomFactory, NULL, CLSCTX_ALL, IID_ILEADDicomFactory, (void**)&pFactory); m_pLEADDICOMNet1 = pFactory->CreateObject("LEADDicomNet.LEADDicomNet", lpLic); m_pLEADDICOMNet2 = pFactory->CreateObject("LEADDicomNet.LEADDicomNet", lpLic); m_pLEADDICOMNETPassword = pFactory->CreateObject("LEADDicomNet.LEADDicomNet", lpLic);; m_pLEADDICOM1 = pFactory->CreateObject("LEADDicomDS.LEADDicomDS", lpLic); m_pLEADDICOM2 = pFactory->CreateObject("LEADDicomDS.LEADDicomDS", lpLic); m_pLEADTemp = pFactory->CreateObject("LEADDicomDS.LEADDicomDS", lpLic); m_pServerDS = pFactory->CreateObject("LEADDicomDS.LEADDicomDS", lpLic); ILEADDicomKernelPtr pLEADDicomKrn=NULL; pLEADDicomKrn = pFactory->CreateObject("LEADDicomKernel.LEADDicomKernel", lpLic); pLEADDicomKrn->UnlockSupport(L_SUPPORT_MEDICAL, L_KEY_MEDICAL); pLEADDicomKrn->UnlockSupport(L_SUPPORT_MEDICAL_NET, L_KEY_MEDICAL_NET); ILEADRasterDlgKrnPtr pLEADRasterDlgKrn; pLEADRasterDlgKrn = pFactory->CreateObject("LEADRasterDlgKrn.LEADRasterDlgKrn", lpLic); pLEADRasterDlgKrn->InitDlg(0); SysFreeString(lpLic); pFactory->Release();//we are done with this now m_pLEADDICOMNet1->EnableMethodErrors = FALSE; m_pLEADDICOMNet2->EnableMethodErrors = FALSE; m_pLEADDICOMNETPassword->EnableMethodErrors = FALSE; m_pLEADDICOM1->EnableMethodErrors = FALSE; m_pLEADDICOM2->EnableMethodErrors = FALSE; m_pLEADTemp->EnableMethodErrors = FALSE; m_pServerDS->EnableMethodErrors = FALSE; //Instantiate the sink class and hold a pointer to it. m_pDicomNetSink1 = new CDicomNetSink; m_pDicomNetSink1->m_pDlg = this; m_pDicomNetSink1->m_bSCU = TRUE; LPUNKNOWN pUnkSink = m_pDicomNetSink1->GetIDispatch(FALSE); AfxConnectionAdvise(m_pLEADDICOMNet1, DIID__LEADDicomNetEvents, pUnkSink, FALSE, &m_dwCookieNet1); m_pDicomNetSink2 = new CDicomNetSink; m_pDicomNetSink2->m_pDlg = this; m_pDicomNetSink2->m_bSCU = TRUE; pUnkSink = m_pDicomNetSink1->GetIDispatch(FALSE); AfxConnectionAdvise(m_pLEADDICOMNet2, DIID__LEADDicomNetEvents, pUnkSink, FALSE, &m_dwCookieNet2); m_pDicomNetPasswordSink = new CDicomNetPasswordSink; m_pDicomNetPasswordSink->m_pDlg = this; pUnkSink = m_pDicomNetPasswordSink->GetIDispatch(FALSE); AfxConnectionAdvise(m_pLEADDICOMNETPassword, DIID__LEADDicomNetEvents, pUnkSink, FALSE, &m_dwCookieNetPassword); theApp.m_strServerCertName = m_szWorkingDir + "server.pem"; theApp.m_strCACertName = m_szWorkingDir + "ca.pem"; //*********************************************************** //Remove some of the classes that we do not support RemoveClasses(); // image list CBitmap Bitmap; m_Image.Create(16, 16, ILC_MASK, 0, 2); Bitmap.LoadBitmap(IDB_BITMAP3); m_Image.Add(&Bitmap, (COLORREF)0xFFFFFF); Bitmap.DeleteObject(); Bitmap.LoadBitmap(IDB_BITMAP4); m_Image.Add(&Bitmap, (COLORREF)0xFFFFFF); Bitmap.DeleteObject(); Bitmap.LoadBitmap(IDB_BITMAP5); m_Image.Add(&Bitmap, (COLORREF)0xFFFFFF); Bitmap.DeleteObject(); m_ConnectionList.SetImageList(&m_Image, TVSIL_NORMAL); CRect rcStatus; rcStatus.SetRect(0,0,10,10); m_StatusBar1.Create(CCS_BOTTOM|CCS_NOMOVEY, rcStatus, this, IDC_STATUSBAR1); m_StatusBar1.ShowWindow(SW_SHOW); m_StatusBar1.GetWindowRect(&rcStatus); ScreenToClient(&rcStatus); CRect rcCtl; m_DicomDir.GetWindowRect(&rcCtl); ScreenToClient(&rcCtl); m_DicomDir.SetWindowPos(NULL, 0, 0, rcCtl.Width(), rcStatus.top - rcCtl.top, SWP_NOMOVE); m_LEADRasterView1.GetWindowRect(&rcCtl); ScreenToClient(&rcCtl); m_LEADRasterView1.SetWindowPos(NULL, 0, 0, rcCtl.Width(), rcStatus.top - rcCtl.top, SWP_NOMOVE); m_KeyView.SetWindowPos(NULL, 0, 0, rcCtl.Width(), rcStatus.top - rcCtl.top, SWP_NOMOVE); m_Close.ShowWindow(SW_HIDE); m_ConnectionList.ShowWindow(SW_HIDE); m_ConnectionList.GetWindowRect(&rcCtl); ScreenToClient(&rcCtl); m_ConnectionList.SetWindowPos(NULL, 0, 0, rcCtl.Width(), rcStatus.top - rcCtl.top, SWP_NOMOVE); //load settings LoadServerSettings(); m_UserList.InsertColumn(0, "User", LVCFMT_LEFT, 50, 0); m_UserList.InsertColumn(1, "IP", LVCFMT_LEFT, 50, 1); m_UserList.InsertColumn(2, "Port", LVCFMT_LEFT, 50, 2); LoadUserList(); m_EventLog.InsertColumn(0, "Date", LVCFMT_LEFT, 50, 0); m_EventLog.InsertColumn(1, "User", LVCFMT_LEFT, 50, 1); m_EventLog.InsertColumn(2, "Event", LVCFMT_LEFT, 50, 2); LoadEventLog(); m_hDisplay = 0; //build DICOM Dir file from the database InitServerDS(); //display the data set DisplayDICOMDir(); m_pLEADDICOMNETPassword->NetworkSecurityMode = DICOM_SECURE_TLS; m_pLEADDICOMNETPassword->StartUp(); //init server m_pLEADDICOMNet1->NetworkSecurityMode = (SecurityModes[m_lNetSecurityModeIndex]); nRet = m_pLEADDICOMNet1->StartUp(); if(nRet != DICOM_SUCCESS) { MessageBox("Error starting server!", "Error", MB_OK); EndDialog(IDCANCEL); } nRet = m_pLEADDICOMNet1->Listen("", m_lServerPort, m_lMaxClients); if(nRet != DICOM_SUCCESS) { SetStatus("Error starting server!"); MessageBox("Error starting server!", "Error", MB_OK); EndDialog(IDCANCEL); } SetStatus("Server is Running"); LogEvent(m_szServerAE, "Server StartUp"); return TRUE; // return TRUE unless you set the focus to a control } void CDICOMSRVDlg::RemoveClasses() { short nRet; nRet = m_pServerDS->FindUID(UID_PATIENT_ROOT_QUERY_GET); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_STUDY_ROOT_QUERY_FIND); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_STUDY_ROOT_QUERY_MOVE); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_STUDY_ROOT_QUERY_GET); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_PATIENT_STUDY_QUERY_FIND); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_PATIENT_STUDY_QUERY_MOVE); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_PATIENT_STUDY_QUERY_GET); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_MODALITY_WORKLIST_FIND); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); //************************************************************** nRet = m_pServerDS->FindUID(UID_MEDIA_STORAGE_DIRECTORY); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_BASIC_STUDY_NOTIFICATION_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_STORAGE_COMMITMENT_PUSH_MODEL_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_STORAGE_COMMITMENT_PUSH_MODEL_INSTANCE); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_STORAGE_COMMITMENT_PULL_MODEL_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_STORAGE_COMMITMENT_PULL_MODEL_INSTANCE); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_APPLICATION_CONTEXT_NAME); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_DETACHED_PATIENT_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_DETACHED_PATIENT_META_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_DETACHED_VISIT_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_DETACHED_STUDY_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_STUDY_COMPONENT_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_MODALITY_PERFORMED_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_MODALITY_PERFORMED_RETRIEVE_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_MODALITY_PERFORMED_NOTIFICATION_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_DETACHED_RESULTS_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_DETACHED_RESULTS_META_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_DETACHED_STUDY_META_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_DETACHED_INTERPRETATION_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_BASIC_FILM_SESSION_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_BASIC_FILM_BOX_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_BASIC_GRAYSCALE_IMAGE_BOX_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_BASIC_COLOR_IMAGE_BOX_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_REFERENCED_IMAGE_BOX_CLASS_RETIRED); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_BASIC_GRAYSCALE_PRINT_META_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_BASIC_GRAYSCALE_PRINT_META_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_PRINT_JOB_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_BASIC_ANNOTATION_BOX_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_PRINTER_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_PRINTER_INSTANCE); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_BASIC_COLOR_PRINT_META_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_REFERENCED_COLOR_PRINT_META_CLASS_RETIRED); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_VOI_LUT_BOX_CLASS_RETIRED); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_PRESENTATION_LUT_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_IMAGE_OVERLAY_BOX_CLASS_RETIRED); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_PRINT_QUEUE_INSTANCE); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_PRINT_QUEUE_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_STORED_PRINT_STORAGE_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_HARDCOPY_GRAYSCALE_IMAGE_STORAGE_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_HARDCOPY_COLOR_IMAGE_STORAGE_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_PULL_PRINT_REQUEST_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); nRet = m_pServerDS->FindUID(UID_PULL_STORED_PRINT_META_CLASS); if (nRet == DICOM_SUCCESS) m_pServerDS->DeleteUID(); } void CDICOMSRVDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CDICOMSRVDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CDICOMSRVDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CDICOMSRVDlg::OnServerExit() { if(Unload()) EndDialog(IDOK); } void CDICOMSRVDlg::OnServerConnections() { CMenu *pMenu=NULL; pMenu = GetMenu(); UINT uState = pMenu->GetMenuState(ID_SERVER_CONNECTIONS, MF_BYCOMMAND|MF_CHECKED); if(uState&MF_CHECKED) { m_Close.ShowWindow(SW_HIDE); m_ConnectionList.ShowWindow(SW_HIDE); m_SetRoot.ShowWindow(SW_SHOW); m_Import.ShowWindow(SW_SHOW); m_Delete.ShowWindow(SW_SHOW); m_DicomDir.ShowWindow(SW_SHOW); if(m_LEADRasterView1.GetRaster().GetBitmap()) m_LEADRasterView1.ShowWindow(SW_SHOW); else m_KeyView.ShowWindow(SW_SHOW); pMenu->CheckMenuItem(ID_SERVER_CONNECTIONS, MF_BYCOMMAND|MF_UNCHECKED); } else { m_Close.ShowWindow(SW_SHOW); m_ConnectionList.ShowWindow(SW_SHOW); m_SetRoot.ShowWindow(SW_HIDE); m_Import.ShowWindow(SW_HIDE); m_Delete.ShowWindow(SW_HIDE); m_KeyView.ShowWindow(SW_HIDE); m_DicomDir.ShowWindow(SW_HIDE); m_LEADRasterView1.ShowWindow(SW_HIDE); pMenu->CheckMenuItem(ID_SERVER_CONNECTIONS, MF_BYCOMMAND|MF_CHECKED); } } void CDICOMSRVDlg::LoadServerSettings() { //set some default values m_szServerAE = "LEAD_SERVER"; m_lServerPort = 104; m_lTimeOut = 1; m_lMaxClients = 5; m_lServerFileCount = 0; m_lNetSecurityModeIndex = 0; //DICOM_SECURE_NONE //load settings from ini CStdioFile f; char buf[1024]; CString szBuf; int nPos; memset(buf,0,1024); if(f.Open(m_szWorkingDir + "server.ini", CFile::modeRead|CFile::typeText)) { if(f.ReadString(buf, 1024)) { szBuf = buf; nPos = szBuf.Find(','); if(nPos != -1) m_szWorkingDir = szBuf.Mid(1, nPos-2); szBuf = szBuf.Right(szBuf.GetLength()-(nPos+1)); nPos = szBuf.Find(','); if(nPos != -1) m_szServerAE = szBuf.Mid(1, nPos-2); szBuf = szBuf.Right(szBuf.GetLength()-(nPos+1)); nPos = szBuf.Find(','); if(nPos != -1) m_lServerPort = atol(szBuf.Mid(0, nPos)); szBuf = szBuf.Right(szBuf.GetLength()-(nPos+1)); nPos = szBuf.Find(','); if(nPos != -1) m_lTimeOut = atol(szBuf.Mid(0, nPos)); szBuf = szBuf.Right(szBuf.GetLength()-(nPos+1)); nPos = szBuf.Find(','); if(nPos != -1) m_lMaxClients = atol(szBuf.Mid(0, nPos)); szBuf = szBuf.Right(szBuf.GetLength()-(nPos+1)); nPos = szBuf.Find(','); if(nPos != -1) m_lServerFileCount = atol(szBuf); szBuf = szBuf.Right(szBuf.GetLength()-(nPos+1)); if(szBuf.GetLength()) m_lNetSecurityModeIndex = atol(szBuf); } f.Close(); } } void CDICOMSRVDlg::LoadUserList() { CString szUser; CString szIP; CString szPort; m_UserList.DeleteAllItems(); //load settings from ini CStdioFile f; char buf[1024]; CString szBuf; int nPos; memset(buf,0,1024); if(f.Open(m_szWorkingDir + "userlist.ini", CFile::modeRead|CFile::typeText)) { while(f.ReadString(buf, 1024)) { szUser = ""; szIP = ""; szPort = "0"; szBuf = buf; nPos = szBuf.Find(','); if(nPos != -1) szUser = szBuf.Mid(1, nPos-2); szBuf = szBuf.Right(szBuf.GetLength()-(nPos+1)); nPos = szBuf.Find(','); if(nPos != -1) szIP = szBuf.Mid(1, nPos-2); szBuf = szBuf.Right(szBuf.GetLength()-(nPos+1)); if(szBuf.GetLength()) szPort = szBuf.Left(szBuf.GetLength()-1); nPos = m_UserList.InsertItem(m_UserList.GetItemCount(), szUser); if(nPos!=-1) { LV_ITEM lvi; lvi.mask = LVIF_TEXT; lvi.iItem = nPos; lvi.iSubItem = 1; lvi.pszText = szIP.GetBuffer(szIP.GetLength()+1); szIP.ReleaseBuffer(); m_UserList.SetItem(&lvi); lvi.iSubItem = 2; lvi.pszText = szPort.GetBuffer(szPort.GetLength()+1); szPort.ReleaseBuffer(); m_UserList.SetItem(&lvi); } } f.Close(); } } void CDICOMSRVDlg::LoadEventLog() { CString szDate; CString szUser; CString szEvent; m_EventLog.DeleteAllItems(); //load settings from ini CStdioFile f; char buf[1024]; CString szBuf; int nPos; memset(buf,0,1024); if(f.Open(m_szWorkingDir + "eventlog.log", CFile::modeRead|CFile::typeText)) { while(f.ReadString(buf, 1024)) { szDate = ""; szUser = ""; szEvent = ""; szBuf = buf; nPos = szBuf.Find(','); if(nPos != -1) szDate = szBuf.Mid(1, nPos-2); szBuf = szBuf.Right(szBuf.GetLength()-(nPos+1)); nPos = szBuf.Find(','); if(nPos != -1) szUser = szBuf.Mid(1, nPos-2); szBuf = szBuf.Right(szBuf.GetLength()-(nPos+1)); if(szBuf.GetLength()) szEvent = szBuf.Mid(1, szBuf.GetLength()-3); nPos = m_EventLog.InsertItem(m_EventLog.GetItemCount(), szDate); if(nPos!=-1) { LV_ITEM lvi; lvi.mask = LVIF_TEXT; lvi.iItem = nPos; lvi.iSubItem = 1; lvi.pszText = szUser.GetBuffer(szUser.GetLength()+1); szUser.ReleaseBuffer(); m_EventLog.SetItem(&lvi); lvi.iSubItem = 2; lvi.pszText = szEvent.GetBuffer(szEvent.GetLength()+1); szEvent.ReleaseBuffer(); m_EventLog.SetItem(&lvi); } } f.Close(); } } void CDICOMSRVDlg::SetStatus(CString szStatus) { m_StatusBar1.SetWindowText(szStatus); } void CDICOMSRVDlg::LogEvent(CString szUser, CString szEvent) { CTime theTime = CTime::GetCurrentTime(); CString szDate = theTime.Format("%m/%d/%Y %I:%M:%S %p"); int nPos; nPos = m_EventLog.InsertItem(m_EventLog.GetItemCount(), szDate); if(nPos!=-1) { LV_ITEM lvi; lvi.mask = LVIF_TEXT; lvi.iItem = nPos; lvi.iSubItem = 1; lvi.pszText = szUser.GetBuffer(szUser.GetLength()+1); szUser.ReleaseBuffer(); m_EventLog.SetItem(&lvi); lvi.iSubItem = 2; lvi.pszText = szEvent.GetBuffer(szEvent.GetLength()+1); szEvent.ReleaseBuffer(); m_EventLog.SetItem(&lvi); } //write info to logfile } BOOL CDICOMSRVDlg::Unload() { long lClients; short nRet; lClients = m_pLEADDICOMNet1->GetClientCount(m_pLEADDICOMNet1->GethNet()); if(lClients > 0) { nRet = MessageBox("There are clients connected!\nDo you wish to shutdown?", "Warning", MB_YESNO); if(nRet == IDNO) return FALSE; } if(m_pLEADDICOMNet1->GethNet() != 0) { m_pLEADDICOMNet1->ShutDown(); LogEvent(m_szServerAE, "Server ShutDown"); m_pLEADDICOMNETPassword->ShutDown(); } //save server settings SaveServerSettings(); SaveUserList(); SaveEventLog(); return TRUE; } void CDICOMSRVDlg::OnClose() { OnServerExit(); if(Unload()) CDialog::OnClose(); } void CDICOMSRVDlg::SaveServerSettings() { CStdioFile f; CString szBuf; char t[80]; if(f.Open(m_szWorkingDir + "server.ini", CFile::modeCreate|CFile::modeWrite|CFile::typeText)) { szBuf = "\"" + m_szWorkingDir + "\","; szBuf = szBuf + "\"" + m_szServerAE + "\","; itoa(m_lServerPort, t, 10); szBuf = szBuf + t + ","; itoa(m_lTimeOut, t, 10); szBuf = szBuf + t + ","; itoa(m_lMaxClients, t, 10); szBuf = szBuf + t + ","; itoa(m_lServerFileCount, t, 10); szBuf = szBuf + t + ","; itoa(m_lNetSecurityModeIndex, t, 10); szBuf = szBuf + t; szBuf = szBuf + "\n"; f.WriteString(szBuf); } else MessageBox("An error occured while trying to save the Server Settings!", "Error", MB_OK); } void CDICOMSRVDlg::SaveUserList() { CStdioFile f; CString szBuf; char buf[1024]; long x; CString szUser; CString szIP; CString szPort; if(f.Open(m_szWorkingDir + "userlist.ini", CFile::modeCreate|CFile::modeWrite|CFile::typeText)) { for(x=0; xGetClientCount(m_pLEADDICOMNet1->GethNet()) > 0) { MessageBox("Cannot change server settings, clients are connected!", "Warning", MB_OK); dlg.m_bEnableEdits = FALSE; bRestart = FALSE; } else { m_pLEADDICOMNet1->Close(m_pLEADDICOMNet1->GethNet()); //close server m_pLEADDICOMNet1->ShutDown(); SetStatus("Server was Stopped"); LogEvent(m_szServerAE, "Server ShutDown"); bRestart = TRUE; } dlg.m_pUserList = &m_UserList; dlg.m_pEventLog = &m_EventLog; dlg.m_szAETitle = m_szServerAE; dlg.m_lServerPort = m_lServerPort; dlg.m_lServerTimeOut = m_lTimeOut; dlg.m_lMaxClients = m_lMaxClients; dlg.m_pDICOMSRVDlg = this; dlg.DoModal(); m_szServerAE = dlg.m_szAETitle; m_lServerPort = dlg.m_lServerPort; m_lTimeOut = dlg.m_lServerTimeOut; m_lMaxClients = dlg.m_lMaxClients; //restart server if(bRestart) { m_pLEADDICOMNet1->NetworkSecurityMode = (SecurityModes[m_lNetSecurityModeIndex]); m_pLEADDICOMNet1->StartUp(); //init server nRet = m_pLEADDICOMNet1->Listen("", m_lServerPort, m_lMaxClients); if(nRet != DICOM_SUCCESS) MessageBox("Error starting server!", "Error", MB_OK); else { SetStatus("Server was Restarted"); LogEvent(m_szServerAE, "Server StartUp"); } } } // BEGIN_EVENTSINK_MAP(CDICOMSRVDlg, CDialog) // //{{AFX_EVENTSINK_MAP(CDICOMSRVDlg) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL2, 1 /* NetConnect */, OnNetConnectLeaddicomnetctrl2, VTS_I4 VTS_I2) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 2 /* NetAccept */, OnNetAcceptLeaddicomnetctrl1, VTS_I2) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 3 /* NetClose */, OnNetCloseLeaddicomnetctrl1, VTS_I4 VTS_I2 VTS_I4) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 6 /* NetReceiveAssociateRequest */, OnNetReceiveAssociateRequestLeaddicomnetctrl1, VTS_I4 VTS_I4) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL2, 7 /* NetReceiveAssociateAccept */, OnNetReceiveAssociateAcceptLeaddicomnetctrl2, VTS_I4 VTS_I4) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL2, 8 /* NetReceiveAssociateReject */, OnNetReceiveAssociateRejectLeaddicomnetctrl2, VTS_I4 VTS_I2 VTS_I2 VTS_I2) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 10 /* NetReceiveReleaseRequest */, OnNetReceiveReleaseRequestLeaddicomnetctrl1, VTS_I4) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 11 /* NetReceiveReleaseResponse */, OnNetReceiveReleaseResponseLeaddicomnetctrl1, VTS_I4) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 12 /* NetReceiveAbort */, OnNetReceiveAbortLeaddicomnetctrl1, VTS_I4 VTS_I2 VTS_I2) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 13 /* NetReceiveCStoreRequest */, OnNetReceiveCStoreRequestLeaddicomnetctrl1, VTS_I4 VTS_I2 VTS_I2 VTS_BSTR VTS_BSTR VTS_I2 VTS_BSTR VTS_I2 VTS_I4) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL2, 14 /* NetReceiveCStoreResponse */, OnNetReceiveCStoreResponseLeaddicomnetctrl2, VTS_I4 VTS_I2 VTS_I2 VTS_BSTR VTS_BSTR VTS_I2) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 15 /* NetReceiveCFindRequest */, OnNetReceiveCFindRequestLeaddicomnetctrl1, VTS_I4 VTS_I2 VTS_I2 VTS_BSTR VTS_I2 VTS_I4) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 19 /* NetReceiveCMoveRequest */, OnNetReceiveCMoveRequestLeaddicomnetctrl1, VTS_I4 VTS_I2 VTS_I2 VTS_BSTR VTS_I2 VTS_BSTR VTS_I4) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 22 /* NetReceiveCEchoRequest */, OnNetReceiveCEchoRequestLeaddicomnetctrl1, VTS_I4 VTS_I2 VTS_I2 VTS_BSTR) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 37 /* NetExternalAuthenticateISCL */, OnNetExternalAuthenticateISCLLeaddicomnetctrl1, VTS_I4 VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 38 /* NetGetChallengeISCL */, OnNetGetChallengeISCLLeaddicomnetctrl1, VTS_I4 VTS_PVARIANT VTS_PVARIANT) // ON_EVENT(CDICOMSRVDlg, IDC_LEADDICOMNETCTRL1, 39 /* NetInternalAuthenticateISCL */, OnNetInternalAuthenticateISCLLeaddicomnetctrl1, VTS_I4 VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT) // //}}AFX_EVENTSINK_MAP // END_EVENTSINK_MAP() // void CDICOMSRVDlg::OnNetAcceptLeaddicomnetctrl1(long nStatus) // { // long hClient; // long lClients; // CString szClient; // CString szUser; // long lClientPort; // HTREEITEM hItem=NULL; // HTREEITEM hChild=NULL; // // if(m_pLEADDICOMNet1->GetNetworkSecurityMode() == DICOM_SECURE_ISCL) // { // m_pLEADDICOMNet1->SetMutualAuthAlgISCL(m_pLEADDICOMNet1->GethNet(), DICOM_ISCL_MUTUAL_AUTH_3P4W); // COleCurrency cy; // cy.m_cur.int64 = 0x002948231925CEE1; // COleVariant vCy(cy); // m_pLEADDICOMNet1->SetMutualAuthKeyISCL(m_pLEADDICOMNet1->GethNet(), 1, vCy); // vCy.cyVal.int64 = 0x007990F7B05BDEFF; // m_pLEADDICOMNet1->SetMutualAuthKeyISCL(m_pLEADDICOMNet1->GethNet(), 2, vCy); // vCy.cyVal.int64 = 0x16496DF15B32E1E9; // m_pLEADDICOMNet1->SetMutualAuthKeyISCL(m_pLEADDICOMNet1->GethNet(), 3, vCy); // vCy.cyVal.int64 = 0x01EB0BB32EB8F03C; // m_pLEADDICOMNet1->SetMutualAuthKeyISCL(m_pLEADDICOMNet1->GethNet(), 4, vCy); // vCy.cyVal.int64 = 0x7E87390C0F3E9A24; // m_pLEADDICOMNet1->SetMutualAuthKeyISCL(m_pLEADDICOMNet1->GethNet(), 5, vCy); // vCy.cyVal.int64 = 0x305E440D496953B7; // m_pLEADDICOMNet1->SetMutualAuthKeyISCL(m_pLEADDICOMNet1->GethNet(), 6, vCy); // vCy.cyVal.int64 = 0x154754DE39E0194D; // m_pLEADDICOMNet1->SetMutualAuthKeyISCL(m_pLEADDICOMNet1->GethNet(), 7, vCy); // vCy.cyVal.int64 = 0x4DC8644366FDB1A6; // m_pLEADDICOMNet1->SetMutualAuthKeyISCL(m_pLEADDICOMNet1->GethNet(), 8, vCy); // // m_pLEADDICOMNet1->SetIndexForMutualAuthISCL(m_pLEADDICOMNet1->GethNet(), 2); // vCy.cyVal.int64 = 0x701F5D037AD0C209; // m_pLEADDICOMNet1->SetEncryptKeyISCL(m_pLEADDICOMNet1->GethNet(), 1, vCy); // vCy.cyVal.int64 = 0x12383B251E8D77D4; // m_pLEADDICOMNet1->SetEncryptKeyISCL(m_pLEADDICOMNet1->GethNet(), 2, vCy); // vCy.cyVal.int64 = 0x63CB6BFC80164345; // m_pLEADDICOMNet1->SetEncryptKeyISCL(m_pLEADDICOMNet1->GethNet(), 3, vCy); // vCy.cyVal.int64 = 0x323B221326788C0A; // m_pLEADDICOMNet1->SetEncryptKeyISCL(m_pLEADDICOMNet1->GethNet(), 4, vCy); // vCy.cyVal.int64 = 0x301C0BDB56B53320; // m_pLEADDICOMNet1->SetEncryptKeyISCL(m_pLEADDICOMNet1->GethNet(), 5, vCy); // vCy.cyVal.int64 = 0x759A235023399878; // m_pLEADDICOMNet1->SetEncryptKeyISCL(m_pLEADDICOMNet1->GethNet(), 6, vCy); // vCy.cyVal.int64 = 0x6B365CFD3E2CA832; // m_pLEADDICOMNet1->SetEncryptKeyISCL(m_pLEADDICOMNet1->GethNet(), 7, vCy); // vCy.cyVal.int64 = 0x3BF63A9E79DC56DC; // m_pLEADDICOMNet1->SetEncryptKeyISCL(m_pLEADDICOMNet1->GethNet(), 8, vCy); // // m_pLEADDICOMNet1->SetDefaultEncryptionISCL(m_pLEADDICOMNet1->GethNet(), DICOM_ISCL_ENCRYPT_DESCBC); // m_pLEADDICOMNet1->SetDefaultSigningISCL(m_pLEADDICOMNet1->GethNet(), DICOM_ISCL_MAC_MD5); // // m_pLEADDICOMNet1->SetIndexForEncryptISCL(m_pLEADDICOMNet1->GethNet(), 2); // // m_pLEADDICOMNet1->SetMaxMessageLengthISCL(m_pLEADDICOMNet1->GethNet(), 1024000); // m_pLEADDICOMNet1->SetMaxCommBlockLengthISCL(m_pLEADDICOMNet1->GethNet(), 8129); // COleVariant vBuf("LEAD server ISCL"); // m_pLEADDICOMNet1->SetAuthDataISCL(m_pLEADDICOMNet1->GethNet(), vBuf, 17); // } // else if(m_pLEADDICOMNet1->GetNetworkSecurityMode() == DICOM_SECURE_TLS) // { // m_pLEADDICOMNet1->SetCipherToIndexTLS(m_pLEADDICOMNet1->GethNet(), 0, DICOM_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA); // _bstr_t sTemp = m_szWorkingDir + "server.pem"; // _bstr_t sNull = ""; // m_pLEADDICOMNet1->SetServerCertificateTLS(m_pLEADDICOMNet1->GethNet(), sTemp, L_TLS_FILETYPE_PEM, sNull); // } // // //accepting the connection attempt // m_pLEADDICOMNet1->Accept(); // // //get the latest client // lClients = m_pLEADDICOMNet1->GetClientCount(m_pLEADDICOMNet1->GethNet()); // hClient = m_pLEADDICOMNet1->GetClient(m_pLEADDICOMNet1->GethNet(), lClients - 1); // // szClient = (char *)m_pLEADDICOMNet1->GetPeerAddress(hClient); // lClientPort = m_pLEADDICOMNet1->GetPeerPort(hClient); // // if(lClients > m_lMaxClients) //too many connections! // { // LogEvent(szClient, "Connection Rejected - Max Connections Reached"); // m_pLEADDICOMNet1->Close(hClient); // return; // } // // szUser = GetUserName(szClient); // if(szUser.GetLength() < 1) // { // //not a valid user, close connection // m_pLEADDICOMNet1->Close(hClient); // LogEvent(szClient, "Connection Rejected - Unknown User"); // return; // } // // LogEvent(szUser, "Connection Accepted"); // // //display some information about the connection: // CString szOut; // CTime theTime = CTime::GetCurrentTime(); // CString szDate = theTime.Format("%m/%d/%Y %I:%M:%S %p"); // szOut.Format("0x%X", hClient); // // hItem = m_ConnectionList.InsertItem(szOut, 0, 0); // m_ConnectionList.SetItemData(hItem, hClient); // // hChild = m_ConnectionList.InsertItem("Remote AE: " + szUser, 2, 2, hItem); // hChild = m_ConnectionList.InsertItem("Remote Host: " + szClient, 2, 2, hItem); // hChild = m_ConnectionList.InsertItem("Connection Time: " + szDate, 2, 2, hItem); // hChild = m_ConnectionList.InsertItem("Number of Messages: 0", 2, 2, hItem); // m_ConnectionList.SetItemData(hChild, 0); // // hChild = m_ConnectionList.InsertItem("Last Action: Connect", 2, 2, hItem); // // hChild = m_ConnectionList.InsertItem("Association:", 1, 1, hItem); // } CString CDICOMSRVDlg::GetUserName(CString szIP) { long lClient; CString szClient=""; for(lClient=0; lClientGetPeerAddress(hNet); // sUser = m_pLEADDICOMNet1->GetCalling(hPDU); // szUser = (LPSTR)sUser; // sCalled = m_pLEADDICOMNet1->GetCalled(hPDU); // LogEvent(szUser, "Associate Request received"); // // // //check the version, if not 1, reject it // // if(m_pLEADDICOMNet1->GetVersion(hPDU) != 1) // // { // // m_pLEADDICOMNet1->SendAssociateReject(hNet, PDU_REJECT_RESULT_PERMANENT, // // PDU_REJECT_SOURCE_USER, // // PDU_REJECT_REASON_VERSION); // // LogEvent(szClient, "Associate Reject sent - invalid Version"); // // return; // // } // // //reject based on called or calling application titles // if((LPSTR)sCalled != m_szServerAE) // { // m_pLEADDICOMNet1->SendAssociateReject(hNet, PDU_REJECT_RESULT_PERMANENT, // PDU_REJECT_SOURCE_USER, // PDU_REJECT_REASON_CALLING); // LogEvent((LPSTR)sClient, "Associate Reject sent - invalid Called AE Title"); // return; // } // // szUser = GetUserName((LPSTR)sClient); // if(szUser.GetLength() < 1) // { // LogEvent((LPSTR)sClient, "Associate Reject sent - invalid Calling AE Title"); // return; // } // // //send associate accept class back // m_pLEADDICOMNet1->CreateAssociate(FALSE); // m_pLEADDICOMNet1->ResetAssociate(m_pLEADDICOMNet1->GethPDU(), FALSE); // // _bstr_t sServerAE(m_szServerAE); // m_pLEADDICOMNet1->SetCalled(m_pLEADDICOMNet1->GethPDU(), sServerAE); // m_pLEADDICOMNet1->SetCalling(m_pLEADDICOMNet1->GethPDU(), sUser); // m_pLEADDICOMNet1->SetApplication(m_pLEADDICOMNet1->GethPDU(), UID_APPLICATION_CONTEXT_NAME); // // //copy all presenetation objects from received hPDU // //also, reply that we only support the first Transfer Syntax from the received hPDU // for(x=0; xGetPresentationCount(hPDU); x++) // { // nID = m_pLEADDICOMNet1->GetPresentationID(hPDU, x); // sAbstract = (LPSTR)m_pLEADDICOMNet1->GetPresentationAbstract(hPDU, nID); // // nRet = m_pLEADDICOM1->FindUID(sAbstract); //If I find the UID in our table, then I assume we support it // if(nRet == DICOM_SUCCESS) // nResult = PDU_ACCEPT_RESULT_SUCCESS; // else // nResult = PDU_ACCEPT_RESULT_ABSTRACT_SYNTAX; //indicate not supported // // m_pLEADDICOMNet1->AddPresentation(m_pLEADDICOMNet1->GethPDU(), nID, nResult, sAbstract); // if(nResult == PDU_ACCEPT_RESULT_SUCCESS) // { // //This server will report only supporting Explicit VR - Little Endian // sTransfer = UID_EXPLICIT_VR_LITTLE_ENDIAN; // m_pLEADDICOMNet1->AddTransferSyntax(m_pLEADDICOMNet1->GethPDU(), nID, sTransfer); // } // } // nRet = m_pLEADDICOMNet1->SendAssociateAccept(hNet); // LogEvent(szUser, "Associate Accept sent"); // // //now, display the recieved hPDU // DisplayAssociate(hNet, m_pLEADDICOMNet1->GethPDU()); // LastClientAction(hNet, "Associated", FALSE); // } void CDICOMSRVDlg::DisplayAssociate(long hPeer, long hPDU) { long x; CString szOut; _bstr_t sTest; CString szTemp; short nID; CString szAbstract; long lCount; long y; CString szTransfer; CString szClass; CString szVersion; short nRet; HTREEITEM hItem=NULL; HTREEITEM hChild=NULL; HTREEITEM hChildNode=NULL; HTREEITEM hTemp=NULL; hItem = m_ConnectionList.GetRootItem(); while(hItem) { if((long)m_ConnectionList.GetItemData(hItem) == hPeer) break; hItem = m_ConnectionList.GetNextItem(hItem, TVGN_NEXT); } if(!hItem) return; hChild = m_ConnectionList.InsertItem("Association:", 1, 1, hItem); szOut.Format("%d", m_pLEADDICOMNet1->GetVersion(hPDU)); //display version hChildNode = m_ConnectionList.InsertItem("Version: " + szOut, 2, 2, hChild); CString csCalled = (LPSTR)m_pLEADDICOMNet1->GetCalled(hPDU); szOut = "Called: " + csCalled; //display called application hChildNode = m_ConnectionList.InsertItem(szOut, 2, 2, hChild); CString csCalling = (LPSTR)m_pLEADDICOMNet1->GetCalling(hPDU); szOut = "Calling: " + csCalling; //display calling application hChildNode = m_ConnectionList.InsertItem(szOut, 2, 2, hChild); sTest = (LPSTR)m_pLEADDICOMNet1->GetApplication(hPDU); nRet = m_pLEADDICOM1->FindUID(sTest); if(nRet == DICOM_SUCCESS) szOut = "Application Context: " + (CString)(LPSTR)m_pLEADDICOM1->GetCurrentUID()->GetName() + " - " + (CString)(LPSTR)sTest; //display application context else szOut = "Application Context: " + (CString)(LPSTR)sTest; //display application context hChildNode = m_ConnectionList.InsertItem(szOut, 2, 2, hChild); //get each Presentation Context for(x=0; xGetPresentationCount(hPDU); x++) { nID = m_pLEADDICOMNet1->GetPresentationID(hPDU, x); switch(m_pLEADDICOMNet1->GetPresentationResult(hPDU, nID)) { case PDU_ACCEPT_RESULT_SUCCESS: szOut = "Acceptance"; break; case PDU_ACCEPT_RESULT_USER_REJECT: szOut = "User Rejection"; break; case PDU_ACCEPT_RESULT_PROVIDER_REJECT: szOut = "Provider Rejection"; break; case PDU_ACCEPT_RESULT_ABSTRACT_SYNTAX: szOut = "Abstract Syntax Not Supported"; break; case PDU_ACCEPT_RESULT_TRANSFER_SYNTAX: szOut = "Transfer Syntax(es) Not Supported"; break; default: szTemp.Format("%ld", m_pLEADDICOMNet1->GetPresentationResult(hPDU, nID)); szOut = "Unknown Reason - " + szTemp; break; } szTemp.Format("%d", nID); hChildNode = m_ConnectionList.InsertItem("ID: " + szTemp + " - " + szOut, 2, 2, hChild); //each Presentation Context can have one Abstract Syntax szAbstract = (LPSTR)m_pLEADDICOMNet1->GetPresentationAbstract(hPDU, nID); if(szAbstract.GetLength() > 0) { nRet = m_pLEADDICOM1->FindUID((_bstr_t)szAbstract); if(nRet == DICOM_SUCCESS) szOut = "Abstract Syntax: " + m_pLEADDICOM1->GetCurrentUID()->GetName() + " - " + szAbstract; else szOut = "Abstract Syntax: " + szAbstract; m_ConnectionList.InsertItem(szOut, 2, 2, hChildNode); } //each Presentation Context can have one or more Transfer Syntax(es) lCount = m_pLEADDICOMNet1->GetTransferCount(hPDU, nID); if(lCount > 0) { for(y=0; yGetTransferSyntax(hPDU, nID, y); if(szTransfer.GetLength() > 0) { _bstr_t sTransfer(szTransfer); nRet = m_pLEADDICOM1->FindUID(sTransfer); if(nRet == DICOM_SUCCESS) szOut = "Transfer Syntax: " + m_pLEADDICOM1->GetCurrentUID()->GetName() + " - " + szTransfer; else szOut = "Transfer Syntax: " + szTransfer; m_ConnectionList.InsertItem(szOut, 2, 2, hChildNode); } } } } szOut = "User Information"; hChildNode = m_ConnectionList.InsertItem(szOut, 2, 2, hChild); if(m_pLEADDICOMNet1->IsMaxLengthEnabled(hPDU)) { szTemp.Format("%ld", m_pLEADDICOMNet1->GetMaxLength(hPDU)); szOut = "Maximum Length = " + szTemp; m_ConnectionList.InsertItem(szOut, 2, 2, hChildNode); } if(m_pLEADDICOMNet1->IsImplementClass(hPDU)) { _bstr_t sClass; sClass = m_pLEADDICOMNet1->GetImplementClass(hPDU); nRet = m_pLEADDICOM1->FindUID(sClass); if(nRet == DICOM_SUCCESS) szOut = "Implementation Class: " + m_pLEADDICOM1->GetCurrentUID()->GetName() + " - " + (CString)(LPSTR)sClass; else szOut = "Implementation Class: " + szClass; m_ConnectionList.InsertItem(szOut, 2, 2, hChildNode); } if(m_pLEADDICOMNet1->IsAsyncOperations(hPDU)) { szOut = "Asynchronous Operations"; hTemp = m_ConnectionList.InsertItem(szOut, 2, 2, hChildNode); szTemp.Format("%ld", m_pLEADDICOMNet1->GetInvokedOperationsCount(hPDU)); szOut = "Invoked Operations: " + szTemp; m_ConnectionList.InsertItem(szOut, 2, 2, hTemp); szTemp.Format("%ld", m_pLEADDICOMNet1->GetPerformedOperationsCount(hPDU)); szOut = "Performed Operations: " + szTemp; m_ConnectionList.InsertItem(szOut, 2, 2, hTemp); } if(m_pLEADDICOMNet1->IsImplementVersion(hPDU)) { szVersion = (LPSTR)m_pLEADDICOMNet1->GetImplementVersion(hPDU); szOut = "Implementation Version: " + szVersion; m_ConnectionList.InsertItem(szOut, 2, 2, hChildNode); } lCount = m_pLEADDICOMNet1->GetUserInfoCount(hPDU); if(lCount > 0) { for(y=0; yGetUserInfoType(hPDU, y), m_pLEADDICOMNet1->GetUserInfoLength(hPDU, y)); m_ConnectionList.InsertItem(szOut, 2, 2, hChildNode); } } } void CDICOMSRVDlg::LastClientAction(long hClient, CString szAction, BOOL bMessage) { HTREEITEM hItem=NULL; CString szTemp; hItem = m_ConnectionList.GetRootItem(); while(hItem) { if((long)m_ConnectionList.GetItemData(hItem) == hClient) break; hItem = m_ConnectionList.GetNextItem(hItem, TVGN_NEXT); } if(!hItem) return; hItem = m_ConnectionList.GetNextItem(hItem, TVGN_CHILD); hItem = m_ConnectionList.GetNextItem(hItem, TVGN_NEXT); hItem = m_ConnectionList.GetNextItem(hItem, TVGN_NEXT); hItem = m_ConnectionList.GetNextItem(hItem, TVGN_NEXT); if(bMessage) { long count; count = m_ConnectionList.GetItemData(hItem)+1; m_ConnectionList.SetItemData(hItem, count); szTemp.Format("Number of Messages: %ld", count); m_ConnectionList.SetItemText(hItem, szTemp); } hItem = m_ConnectionList.GetNextItem(hItem, TVGN_NEXT); m_ConnectionList.SetItemText(hItem, "Last Action: " + szAction); } // void CDICOMSRVDlg::OnNetReceiveReleaseRequestLeaddicomnetctrl1(long hNet) // { // _bstr_t sUser; // CString csClient; // // //we have received a ReleaseRequest // csClient = (LPSTR)m_pLEADDICOMNet1->GetPeerAddress(hNet); // sUser = GetUserName(csClient); // // //send Release Response // m_pLEADDICOMNet1->SendReleaseResponse(hNet); // LogEvent((LPSTR)sUser, "Release Request received"); // LastClientAction(hNet, "Association Released", FALSE); // } void CDICOMSRVDlg::OnButton4() { HTREEITEM hItem=NULL; long hClient; short nRet; hItem = m_ConnectionList.GetSelectedItem(); if(!hItem) return; hClient = m_ConnectionList.GetItemData(hItem); if(hClient) { nRet = MessageBox("Forcefully close client?", "Warning", MB_YESNO); if(nRet == IDYES) { //send abort m_pLEADDICOMNet1->SendAbort(hClient, PDU_ABORT_SOURCE_PROVIDER, PDU_ABORT_REASON_UNKNOWN); //remove from list m_ConnectionList.DeleteItem(hItem); //close client m_pLEADDICOMNet1->Close(hClient); m_pLEADDICOMNet1->ShutDown(); } } } // void CDICOMSRVDlg::OnNetReceiveAbortLeaddicomnetctrl1(long hNet, short nSource, short nReason) // { // long hPDU; // CString szUser; // CString csCalling; // // //we have received an Abort // hPDU = m_pLEADDICOMNet1->GetAssociate(hNet); // csCalling = (LPSTR)m_pLEADDICOMNet1->GetCalling(hPDU); // szUser = GetUserName(csCalling); // LogEvent(szUser, "Abort received"); // LastClientAction(hNet, "Association Aborted", FALSE); // } // void CDICOMSRVDlg::OnNetReceiveReleaseResponseLeaddicomnetctrl1(long hNet) // { // long hPDU; // CString szUser; // // //we have received a ReleaseResponse // hPDU = m_pLEADDICOMNet1->GetAssociate(hNet); // szUser = (LPSTR)m_pLEADDICOMNet1->GetCalling(hPDU); // // LogEvent(szUser, "Release Response received"); // LastClientAction(hNet, "Association Released", FALSE); // } // void CDICOMSRVDlg::OnNetReceiveCEchoRequestLeaddicomnetctrl1(long hNet, short nPresentationID, short nMessageID, LPCTSTR pszClass) // { // short nRet; // long nStatus; // long hPDU; // short nID; // CString szClient; // CString szUser; // CString szCalled; // // hPDU = m_pLEADDICOMNet1->GetAssociate(hNet); // if(hPDU == 0) // { // //connection is not associated, so ignore the message // return; // } // // //we have received an C-ECHO-REQUEST // // szUser = m_pLEADDICOMNet1->GetCalling(hPDU); // // szCalled = m_pLEADDICOMNet1->GetCalled(hPDU); // LogEvent(szUser, "C-ECHO-REQUEST received"); // LastClientAction(hNet, "C-ECHO-REQUEST", TRUE); // // nRet = m_pLEADDICOM1->FindUID(pszClass); // if(nRet != DICOM_SUCCESS) // nStatus = COMMAND_STATUS_CLASS_NOT_SUPPORTED; // else // { // nID = m_pLEADDICOMNet1->FindPresentationAbstract(hPDU, pszClass); // if((nID == 0) || (m_pLEADDICOMNet1->GetPresentationResult(hPDU, nID) != PDU_ACCEPT_RESULT_SUCCESS)) // { // LogEvent(szUser, "C-ECHO-REQUEST - Abstract Syntax, " + (CString)(LPSTR)m_pLEADDICOM1->GetCurrentUID()->GetName() + ", Not Supported by Association!"); // nStatus = COMMAND_STATUS_CLASS_NOT_SUPPORTED; // } // else // nStatus = COMMAND_STATUS_SUCCESS; // } // // m_pLEADDICOMNet1->SendCEchoResponse(hNet, nPresentationID, nMessageID, pszClass, nStatus); // LogEvent(szUser, "C-ECHO-RESPONSE sent"); // } void CDICOMSRVDlg::DisplayDICOMDir() { short nRet; m_pServerDS->SetCurrentElement(0L); m_DicomDir.DeleteAllItems(); m_KeyView.DeleteAllItems(); m_LEADRasterView1.GetRaster().SetBitmap(0); nRet = m_pServerDS->MoveFirstKey(FALSE); nRet = m_pServerDS->MoveRootKey(); if(nRet == DICOM_SUCCESS) DisplayDirDS(NULL, FALSE); } void CDICOMSRVDlg::DisplayDirDS(HTREEITEM hParent, BOOL bChild) { short nRet; long hTemp; HTREEITEM hChild=NULL; IDicomDSElementPtr CurrentElement; hTemp = 0; CurrentElement=m_pServerDS->GetCurrentElement(); if(CurrentElement) hTemp = CurrentElement->GethElement(); if(hTemp == 0) return; hChild = DisplayDSKey(hTemp, hParent, bChild); //try children nRet = m_pServerDS->MoveChildKey(); if(nRet == DICOM_SUCCESS) { DisplayDirDS(hChild, TRUE); //recurse m_pServerDS->SetCurrentElement(hTemp); } //try next nRet = m_pServerDS->MoveNextKey(TRUE); while(nRet == DICOM_SUCCESS) { hTemp = m_pServerDS->GetCurrentElement()->GethElement(); hChild = DisplayDSKey(hTemp, hParent, bChild); nRet = m_pServerDS->MoveChildKey(); if(nRet == DICOM_SUCCESS) { DisplayDirDS(hChild, TRUE); //recurse m_pServerDS->SetCurrentElement(hTemp); } nRet = m_pServerDS->MoveNextKey(TRUE); } } HTREEITEM CDICOMSRVDlg::DisplayDSKey(long hKey, HTREEITEM hParent, BOOL bChild) { short nRet; CString szKey; HTREEITEM hItem=NULL; CString szOut; //display key szKey = (LPSTR)m_pServerDS->GetKeyValue(); szOut = ""; if(szKey == "PATIENT") { nRet = m_pServerDS->MoveChildElement(); nRet = m_pServerDS->FindFirstElement(TAG_PATIENT_NAME, TRUE); if(nRet != DICOM_SUCCESS) nRet = m_pServerDS->FindFirstElement(TAG_PATIENT_ID, TRUE); if(nRet == DICOM_SUCCESS) { nRet = m_pServerDS->GetConvertValue(); if(nRet == DICOM_SUCCESS) szOut = (CString)(LPSTR)m_pServerDS->GetStringValues(0); } } else if(szKey == "STUDY") { nRet = m_pServerDS->MoveChildElement(); nRet = m_pServerDS->FindFirstElement(TAG_STUDY_ID, TRUE); if(nRet != DICOM_SUCCESS) nRet = m_pServerDS->FindFirstElement(TAG_STUDY_INSTANCE_UID, TRUE); if(nRet == DICOM_SUCCESS) { nRet = m_pServerDS->GetConvertValue(); if(nRet == DICOM_SUCCESS) szOut = (LPSTR)m_pServerDS->GetStringValues(0); } } else if(szKey == "SERIES") { nRet = m_pServerDS->MoveChildElement(); nRet = m_pServerDS->FindFirstElement(TAG_SERIES_NUMBER, TRUE); if(nRet != DICOM_SUCCESS) nRet = m_pServerDS->FindFirstElement(TAG_SERIES_INSTANCE_UID, TRUE); if(nRet == DICOM_SUCCESS) { nRet = m_pServerDS->GetConvertValue(); if(nRet == DICOM_SUCCESS) szOut = (LPSTR)m_pServerDS->GetStringValues(0); } } else if(szKey == "IMAGE") { nRet = m_pServerDS->MoveChildElement(); nRet = m_pServerDS->FindFirstElement(TAG_INSTANCE_NUMBER, TRUE); if(nRet == DICOM_SUCCESS) { nRet = m_pServerDS->GetConvertValue(); if(nRet == DICOM_SUCCESS) szOut = (LPSTR)m_pServerDS->GetStringValues(0); } } else return(NULL); if(!hParent) hItem = m_DicomDir.InsertItem(szKey + "-" + szOut); else if(!bChild) hItem = m_DicomDir.InsertItem(szKey + "-" + szOut, m_DicomDir.GetNextItem(hParent, TVGN_PARENT)); else hItem = m_DicomDir.InsertItem(szKey + "-" + szOut, hParent); m_DicomDir.SetItemData(hItem, hKey); return(hItem); } void CDICOMSRVDlg::InitServerDS() { CString szPatientID; CString szStudyUID; CString szSeriesUID; CString szSOPUID; CString szQuery; CString szTemp; CString szVal; long nImageCount; long hPatient; long hStudy; long hSeries; long hImage; CDatabase conn; CDBVariant varValue; m_pServerDS->ResetDS(); m_pServerDS->InitDS(DICOM_CLASS_BASIC_DIRECTORY, DS_METAHEADER_PRESENT | DS_LITTLE_ENDIAN | DS_EXPLICIT_VR | DS_GROUP_LENGTHS); if(!conn.OpenEx(_T("DSN=DICOMSERVERDB;UID=sa"),CDatabase::noOdbcDialog)) { if(m_bImport) MessageBox("Error opening the data source", "Error", MB_OK); return; } //do the query szQuery = "SELECT * FROM Patients;"; //default query is all records CRecordset rstPatient(&conn); rstPatient.Open(CRecordset::dynaset, szQuery); while(!rstPatient.IsEOF()) { m_pServerDS->SetCurrentElement(0L); rstPatient.GetFieldValue("PatientID", varValue); szPatientID = *varValue.m_pstring; varValue.Clear(); //insert a key m_pServerDS->InsertKey("PATIENT", FALSE); hPatient = m_pServerDS->GetCurrentElement()->GethElement(); //insert the data fields m_pServerDS->MoveChildElement(); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_PATIENT_ID, szPatientID); rstPatient.GetFieldValue("PatientName", varValue); if(varValue.m_dwType == DBVT_STRING) { szVal = *varValue.m_pstring; SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_PATIENT_NAME, szVal); varValue.Clear(); } rstPatient.GetFieldValue("PatientBirthDate", varValue); if(varValue.m_dwType == DBVT_DATE) { szVal.Format("%d/%d/%d", varValue.m_pdate->month, varValue.m_pdate->day, varValue.m_pdate->year); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_PATIENT_BIRTH_DATE, szVal); varValue.Clear(); } rstPatient.GetFieldValue("PatientBirthTime", varValue); if(varValue.m_dwType == DBVT_DATE) { szVal.Format("%d/%d/%d", varValue.m_pdate->hour, varValue.m_pdate->minute, varValue.m_pdate->second); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_PATIENT_BIRTH_TIME, szVal); varValue.Clear(); } rstPatient.GetFieldValue("PatientSex", varValue); if(varValue.m_dwType == DBVT_STRING) { szVal = *varValue.m_pstring; SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_PATIENT_SEX, szVal); varValue.Clear(); } rstPatient.GetFieldValue("PatientEthnicGroup", varValue); if(varValue.m_dwType == DBVT_STRING) { szVal = *varValue.m_pstring; SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_ETHNIC_GROUP, szVal); varValue.Clear(); } rstPatient.GetFieldValue("PatientComments", varValue); if(varValue.m_dwType == DBVT_STRING) { szVal = *varValue.m_pstring; SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_PATIENT_COMMENTS, szVal); varValue.Clear(); } m_pServerDS->MoveParentElement(); szQuery = "SELECT * FROM Studies WHERE PatientID = '" + szPatientID + "';"; CRecordset rstStudy(&conn); rstStudy.Open(CRecordset::dynaset, szQuery); while(!rstStudy.IsEOF()) { rstStudy.GetFieldValue("StudyInstanceUID", varValue); szStudyUID = *varValue.m_pstring; varValue.Clear(); //insert a key m_pServerDS->SetCurrentElement(hPatient); m_pServerDS->InsertKey("STUDY", FALSE); hStudy = m_pServerDS->GetCurrentElement()->GethElement(); //insert the data fields m_pServerDS->MoveChildElement(); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_PATIENT_ID, szPatientID); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_STUDY_INSTANCE_UID, szStudyUID); rstStudy.GetFieldValue("StudyID", varValue); if(varValue.m_dwType == DBVT_STRING) { szVal = *varValue.m_pstring; SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_STUDY_ID, szVal); varValue.Clear(); } rstStudy.GetFieldValue("AccessionNumber", varValue); if(varValue.m_dwType == DBVT_STRING) { szVal = *varValue.m_pstring; SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_ACCESSION_NUMBER, szVal); varValue.Clear(); } rstStudy.GetFieldValue("ReferencedFile", varValue); if(varValue.m_dwType == DBVT_STRING) { szVal = *varValue.m_pstring; SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_REFERENCED_FILE_ID, szVal); varValue.Clear(); } rstStudy.GetFieldValue("StudyDesc", varValue); if(varValue.m_dwType == DBVT_STRING) { szVal = *varValue.m_pstring; SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_STUDY_DESCRIPTION, szVal); varValue.Clear(); } m_pServerDS->MoveParentElement(); szQuery = "SELECT * FROM Series WHERE StudyInstanceUID = '" + szStudyUID + "';"; CRecordset rstSeries(&conn); rstSeries.Open(CRecordset::dynaset, szQuery); while(!rstSeries.IsEOF()) { rstSeries.GetFieldValue("SeriesInstanceUID", varValue); szSeriesUID = *varValue.m_pstring; varValue.Clear(); //insert a key m_pServerDS->SetCurrentElement(hStudy); m_pServerDS->InsertKey("SERIES", FALSE); hSeries = m_pServerDS->GetCurrentElement()->GethElement(); //insert the data fields m_pServerDS->MoveChildElement(); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_PATIENT_ID, szPatientID); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_STUDY_INSTANCE_UID, szStudyUID); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_SERIES_INSTANCE_UID, szSeriesUID); rstSeries.GetFieldValue("Modality", varValue); if(varValue.m_dwType == DBVT_STRING) { szVal = *varValue.m_pstring; SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_MODALITY, szVal); varValue.Clear(); } rstSeries.GetFieldValue("ReferencedFile", varValue); if(varValue.m_dwType == DBVT_STRING) { szVal = *varValue.m_pstring; SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_REFERENCED_FILE_ID, szVal); varValue.Clear(); } m_pServerDS->MoveParentElement(); szQuery = "SELECT * FROM Images WHERE StudyInstanceUID = '" + szStudyUID + "' AND SeriesInstanceUID = '" + szSeriesUID + "';"; CImageRecordset rstImage(&conn); rstImage.Open(CRecordset::dynaset, szQuery); nImageCount = 0; while(!rstImage.IsEOF()) { rstImage.GetFieldValue("SOPInstanceUID", varValue); szSOPUID = *varValue.m_pstring; varValue.Clear(); nImageCount++; //insert a key m_pServerDS->SetCurrentElement(hSeries); m_pServerDS->InsertKey("IMAGE", FALSE); hImage = m_pServerDS->GetCurrentElement()->GethElement(); //insert the data fields m_pServerDS->MoveChildElement(); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_PATIENT_ID, szPatientID); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_STUDY_INSTANCE_UID, szStudyUID); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_SERIES_INSTANCE_UID, szSeriesUID); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_SOP_INSTANCE_UID, szSOPUID); rstImage.GetFieldValue("ReferencedFile", varValue); if(varValue.m_dwType == DBVT_STRING) { szVal = *varValue.m_pstring; SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_REFERENCED_FILE_ID, szVal); varValue.Clear(); } szVal.Format("%ld", nImageCount); SetElement2(m_pServerDS, m_pServerDS->GetCurrentElement()->GethElement(), TAG_INSTANCE_NUMBER, szVal); m_pServerDS->MoveParentElement(); rstImage.MoveNext(); } rstImage.Close(); rstSeries.MoveNext(); } rstSeries.Close(); rstStudy.MoveNext(); } rstStudy.Close(); rstPatient.MoveNext(); } rstPatient.Close(); conn.Close(); } short CDICOMSRVDlg::SetElement2(ILEADDicomDS *pTargetDS, long hElement, long lTag, CString szValue) { short nRet; pTargetDS->StringValueCount = 0; pTargetDS->SetCurrentElement(hElement); nRet = pTargetDS->FindFirstElement(lTag, TRUE); if(nRet != DICOM_SUCCESS) nRet = pTargetDS->InsertElement(FALSE, lTag, 0, FALSE, 0); if(nRet == DICOM_SUCCESS) { pTargetDS->StringValueCount=1; _bstr_t sValue(szValue); pTargetDS->PutStringValues(0, sValue); nRet = pTargetDS->SetConvertValue(); } return nRet; } // void CDICOMSRVDlg::OnNetReceiveCStoreRequestLeaddicomnetctrl1(long hNet, short nPresentationID, short nMessageID, LPCTSTR pszClass, LPCTSTR pszInstance, short nPriority, LPCTSTR pszMoveAE, short nMoveMessageID, long hDS) // { // short nRet; // long nStatus; // long hPDU=0; // short nID; // CString szClient; // CString szUser; // CString szCalled; // CString szFile; // // hPDU = m_pLEADDICOMNet1->GetAssociate(hNet); // if(hPDU == 0) // { // //connection is not associated, so ignore the message // return; // } // // //we have received an C-STORE-REQUEST // szUser = (CString)(LPSTR)m_pLEADDICOMNet1->GetCalling(hPDU); // LogEvent(szUser, "C-STORE-REQUEST received"); // LastClientAction(hNet, "C-STORE-REQUEST", TRUE); // // nRet = m_pLEADDICOM1->FindUID(pszClass); // if(nRet != DICOM_SUCCESS) // nStatus = COMMAND_STATUS_CLASS_NOT_SUPPORTED; // else // { // nID = m_pLEADDICOMNet1->FindPresentationAbstract(hPDU, pszClass); // if((nID == 0) || (m_pLEADDICOMNet1->GetPresentationResult(hPDU, nID) != PDU_ACCEPT_RESULT_SUCCESS)) // { // LogEvent(szUser, "C-STORE-REQUEST - Abstract Syntax, " + (CString)(LPSTR)m_pLEADDICOM1->GetCurrentUID()->GetName() + ", Not Supported by Association!"); // nStatus = COMMAND_STATUS_CLASS_NOT_SUPPORTED; // } // else // nStatus = COMMAND_STATUS_SUCCESS; // } // // //save the SOP Instance // if(nStatus == COMMAND_STATUS_SUCCESS) // { // //add the new data set to the root of the DICOM Dir // m_bImport = FALSE; // m_lServerFileCount++; // szFile.Format("%ld.dic", m_lServerFileCount); // m_pLEADDICOM1->ResetDS(); // m_pLEADDICOM1->SetCurrentElement(0L); // m_pLEADDICOM1->PuthDicomDS(hDS); // nRet = InsertDataSet(m_pLEADDICOM1, szFile); // if(nRet != 0) // { // if(nRet == 20000) // LogEvent(szUser, "DataSet already exists in Database!"); // else // LogEvent(szUser, "Error importing DICOM DataSet"); // } // else // { // //save the data set // _bstr_t sName(m_szWorkingDir + szFile); // nRet = m_pLEADDICOM1->SaveDS(sName, 0); // if(nRet != 0) // { // LogEvent(szUser, "Error importing DICOM DataSet"); // m_lServerFileCount--; // } // else // { // //update our DICOM DIR File // InitServerDS(); // } // } // m_pLEADDICOM1->ResetDS(); // //refresh the DICOM Dir display // DisplayDICOMDir(); // if(nRet == DICOM_SUCCESS) // nStatus = COMMAND_STATUS_SUCCESS; // else // nStatus = COMMAND_STATUS_PROCESSING_FAILURE; //this could be more descriptive. We could check the results of the database query and see if the SOP instance already exists, etc. // } // m_pLEADDICOMNet1->SendCStoreResponse(hNet, nPresentationID, nMessageID, pszClass, pszInstance, nStatus); // LogEvent(szUser, "C-STORE-RESPONSE sent"); // } short CDICOMSRVDlg::InsertDataSet(ILEADDicomDS *pSourceDS, CString szFile) { short nRet; CString szPatientName; CString szPatientID; CString szStudyInstanceUID; CString szSeriesInstanceUID; CString szSOPInstanceUID; CString szQuery; szPatientName = " "; szPatientID = " "; szStudyInstanceUID = " "; szSeriesInstanceUID = " "; szSOPInstanceUID = " "; //get Patient ID from the SourceDS nRet = pSourceDS->FindFirstElement(TAG_PATIENT_ID, FALSE); if(nRet != DICOM_SUCCESS) return(nRet); nRet = pSourceDS->GetStringValue(0, 1); if(nRet != DICOM_SUCCESS) return(nRet); szPatientID = (LPSTR)pSourceDS->GetStringValues(0); //get Patient Name from the SourceDS nRet = pSourceDS->FindFirstElement(TAG_PATIENT_NAME, FALSE); if(nRet != DICOM_SUCCESS) return(nRet); nRet = pSourceDS->GetStringValue(0, 1); if(nRet != DICOM_SUCCESS) return(nRet); szPatientName = (LPSTR)pSourceDS->GetStringValues(0); //get Study Instance UID from the SourceDS nRet = pSourceDS->FindFirstElement(TAG_STUDY_INSTANCE_UID, FALSE); if(nRet != DICOM_SUCCESS) return(nRet); nRet = pSourceDS->GetStringValue(0, 1); if(nRet != DICOM_SUCCESS) return(nRet); szStudyInstanceUID = (LPSTR)pSourceDS->GetStringValues(0); //get Series Instance UID from the SourceDS nRet = pSourceDS->FindFirstElement(TAG_SERIES_INSTANCE_UID, FALSE); if(nRet != DICOM_SUCCESS) return(nRet); nRet = pSourceDS->GetStringValue(0, 1); if(nRet != DICOM_SUCCESS) return(nRet); szSeriesInstanceUID = (LPSTR)pSourceDS->GetStringValues(0); //get SOP Instance UID from the SourceDS nRet = pSourceDS->FindFirstElement(TAG_SOP_INSTANCE_UID, FALSE); if(nRet != DICOM_SUCCESS) return(nRet); nRet = pSourceDS->GetStringValue(0, 1); if(nRet != DICOM_SUCCESS) return(nRet); szSOPInstanceUID = (LPSTR)pSourceDS->GetStringValues(0); CDatabase conn; nRet = 20000; if(!conn.OpenEx(_T("DSN=DICOMSERVERDB;UID=sa"),CDatabase::noOdbcDialog)) { return(nRet); } //does this patient already exist? szQuery = "SELECT * FROM Patients WHERE PatientID = '" + szPatientID + "';"; CPatientRecordset rstPatient(&conn); rstPatient.Open(CRecordset::dynaset, szQuery); if(rstPatient.IsEOF()) //add Patient { rstPatient.AddNew(); //add record to database rstPatient.m_PatientName = szPatientName; rstPatient.m_PatientID = szPatientID; //get some other elements nRet = pSourceDS->FindFirstElement(TAG_PATIENT_BIRTH_DATE, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetDateValue(0, 1); if(nRet == DICOM_SUCCESS) { memset(&rstPatient.m_PatientBirthDate, 0, sizeof(TIMESTAMP_STRUCT)); rstPatient.m_PatientBirthDate.year = pSourceDS->GetDateValues(0)->GetYear(); rstPatient.m_PatientBirthDate.month = pSourceDS->GetDateValues(0)->GetMonth(); rstPatient.m_PatientBirthDate.day = pSourceDS->GetDateValues(0)->GetDay(); } } nRet = pSourceDS->FindFirstElement(TAG_PATIENT_BIRTH_TIME, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetTimeValue(0, 1); if(nRet == DICOM_SUCCESS) { memset(&rstPatient.m_PatientBirthTime, 0, sizeof(TIMESTAMP_STRUCT)); rstPatient.m_PatientBirthTime.hour = pSourceDS->GetTimeValues(0)->GetHours(); rstPatient.m_PatientBirthTime.minute = pSourceDS->GetTimeValues(0)->GetMinutes(); rstPatient.m_PatientBirthTime.second = pSourceDS->GetTimeValues(0)->GetSeconds(); rstPatient.m_PatientBirthTime.fraction = pSourceDS->GetTimeValues(0)->GetFractions(); } } nRet = pSourceDS->FindFirstElement(TAG_PATIENT_SEX, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetConvertValue(); if(nRet == DICOM_SUCCESS) rstPatient.m_PatientSex = (LPSTR)pSourceDS->GetStringValues(0); } nRet = pSourceDS->FindFirstElement(TAG_ETHNIC_GROUP, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetConvertValue(); if(nRet == DICOM_SUCCESS) rstPatient.m_PatientEthnicGroup = (LPSTR)pSourceDS->GetStringValues(0); } nRet = pSourceDS->FindFirstElement(TAG_PATIENT_COMMENTS, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetConvertValue(); if(nRet == DICOM_SUCCESS) rstPatient.m_PatientComments = (LPSTR)pSourceDS->GetStringValues(0); } rstPatient.Update(); nRet = 0; } rstPatient.Close(); //does this study already exist? szQuery = "SELECT * FROM Studies WHERE PatientID = '" + szPatientID + "' AND StudyInstanceUID = '" + szStudyInstanceUID + "';"; CStudyRecordset rstStudy(&conn); rstStudy.Open(CRecordset::dynaset, szQuery); if(rstStudy.IsEOF()) //add Study { //add record to database rstStudy.AddNew(); rstStudy.m_PatientID = szPatientID; rstStudy.m_StudyInstanceUID = szStudyInstanceUID; //get Study ID from the SourceDS nRet = pSourceDS->FindFirstElement(TAG_STUDY_INSTANCE_UID, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetStringValue(0, 1); if(nRet == DICOM_SUCCESS) rstStudy.m_StudyID = (LPSTR)pSourceDS->GetStringValues(0); } //get Accession Number from the SourceDS nRet = pSourceDS->FindFirstElement(TAG_ACCESSION_NUMBER, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetStringValue(0, 1); if(nRet == DICOM_SUCCESS) rstStudy.m_AccessionNumber = (LPSTR)pSourceDS->GetStringValues(0); } //get Study Description from the SourceDS nRet = pSourceDS->FindFirstElement(TAG_STUDY_DESCRIPTION, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetConvertValue(); if(nRet == DICOM_SUCCESS) rstStudy.m_StudyDesc = (LPSTR)pSourceDS->GetStringValues(0); } //Set Referenced File rstStudy.m_ReferencedFile = szFile; rstStudy.Update(); nRet = 0; } rstStudy.Close(); //does this series already exist? szQuery = "SELECT * FROM Series where StudyInstanceUID = '" + szStudyInstanceUID + "' AND SeriesInstanceUID = '" + szSeriesInstanceUID + "';"; CSeriesRecordset rstSeries(&conn); rstSeries.Open(CRecordset::dynaset, szQuery); if(rstSeries.IsEOF()) //add Series { //add record to database rstSeries.AddNew(); rstSeries.m_StudyInstanceUID = szStudyInstanceUID; rstSeries.m_SeriesInstanceUID = szSeriesInstanceUID; //get Modality from the SourceDS nRet = pSourceDS->FindFirstElement(TAG_MODALITY, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetStringValue(0, 1); if(nRet == DICOM_SUCCESS) rstSeries.m_Modality = (LPSTR)pSourceDS->GetStringValues(0); } //Set Referenced File rstSeries.m_ReferencedFile = szFile; rstSeries.Update(); nRet = 0; } rstSeries.Close(); //does this image already exist? szQuery = "SELECT * FROM Images where StudyInstanceUID = '" + szStudyInstanceUID + "' AND SeriesInstanceUID = '" + szSeriesInstanceUID + "' AND SOPInstanceUID = '" + szSOPInstanceUID + "';"; CImageRecordset rstImage(&conn); rstImage.Open(CRecordset::dynaset, szQuery); if(rstImage.IsEOF()) //add Image { //add record to database rstImage.AddNew(); rstImage.m_StudyInstanceUID = szStudyInstanceUID; rstImage.m_SeriesInstanceUID = szSeriesInstanceUID; rstImage.m_SOPInstanceUID = szSOPInstanceUID; //Set Referenced File rstImage.m_ReferencedFile = szFile; rstImage.Update(); nRet = 0; } rstImage.Close(); conn.Close(); return(nRet); } void CDICOMSRVDlg::OnButton2() { short nRet; CString szFile; ILEADRasterDlgFile *pRasterDlgFile; ::CoCreateInstance(CLSID_LEADRasterDlgFile, NULL, CLSCTX_ALL, IID_ILEADRasterDlgFile, (void**)&pRasterDlgFile); pRasterDlgFile->DialogTitle = (_bstr_t)"Import DICOM Image"; pRasterDlgFile->Filter = (_bstr_t)("All Files (*.*)|*.*|DICOM Files (*.dic)|*.dic"); pRasterDlgFile->UIFlags = OPEN_SHOW_FILEINFO; nRet = pRasterDlgFile->ShowOpenDlg((long)this->m_hWnd); if(nRet == 0) { //load the data set nRet = m_pLEADDICOM1->LoadDS(pRasterDlgFile->GetFileName(), 0); if(nRet != 0) { MessageBox("Error loading DICOM DataSet", "Error", MB_OK); return; } //add the new data set to the root of the DICOM Dir m_bImport = TRUE; m_lServerFileCount++; szFile.Format("%ld.dic", m_lServerFileCount); nRet = InsertDataSet(m_pLEADDICOM1, szFile); if(nRet != 0) { if(nRet == 20000) MessageBox("DataSet already exists in Database!", "Warning", MB_OK); else MessageBox("Error importing DICOM DataSet", "Error", MB_OK); } else { //save the data set _bstr_t sWorkingDir(m_szWorkingDir + szFile); nRet = m_pLEADDICOM1->SaveDS(sWorkingDir, 0); if(nRet != 0) { MessageBox("Error importing DICOM DataSet", "Error", MB_OK); m_lServerFileCount--; } else { //update our DICOM DIR File InitServerDS(); } } m_pLEADDICOM1->ResetDS(); //refresh the DICOM Dir display DisplayDICOMDir(); } pRasterDlgFile->Release(); } void CDICOMSRVDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; HTREEITEM hItem=NULL; long hTemp; short nRet; CString szKey; *pResult = 0; hItem = m_DicomDir.GetSelectedItem(); if(!hItem) return; hTemp = m_DicomDir.GetItemData(hItem); if(hTemp != m_hDisplay) { m_hDisplay = hTemp; m_pServerDS->SetCurrentElement(hTemp); m_KeyView.DeleteAllItems(); m_LEADRasterView1.GetRaster().SetBitmap(0); m_LEADRasterView1.ShowWindow(SW_HIDE); m_KeyView.ShowWindow(SW_SHOW); m_pServerDS->SetCurrentElement(hTemp); nRet = m_pServerDS->MoveChildElement(); while(nRet == DICOM_SUCCESS) { hTemp = m_pServerDS->GetCurrentElement()->GethElement(); DisplayKey(hTemp, NULL); m_pServerDS->SetCurrentElement(hTemp); nRet = m_pServerDS->MoveNextElement(TRUE); } } } void CDICOMSRVDlg::DisplayKey(long hElement, HTREEITEM hParent) { short nRet; CString szTag; short x; HTREEITEM hItem=NULL; CString szName; long hTemp; CString szVal; long lCount; m_LEADRasterView1.ShowWindow(SW_HIDE); m_KeyView.ShowWindow(SW_SHOW); x = 0; hTemp = hElement; m_pServerDS->SetCurrentElement(hElement); szTag.Format("%04X:%04X", GETGROUP(m_pServerDS->GetCurrentElement()->GetTag()), GETELEMENT(m_pServerDS->GetCurrentElement()->GetTag())); nRet = m_pServerDS->FindTag(m_pServerDS->GetCurrentElement()->GetTag()); szName = "Unknown"; if(nRet == DICOM_SUCCESS) szName = (LPSTR)m_pServerDS->GetCurrentTag()->GetName(); //display value(s) szVal = ""; if(m_pServerDS->GetCurrentElement()->GetTag() != TAG_PIXEL_DATA) { if(m_pServerDS->GetCurrentElement()->GetLength() < 1000) //I don't display anything > 10K { szVal = ": "; nRet = m_pServerDS->GetConvertValue(); if(nRet == DICOM_SUCCESS) { lCount = m_pServerDS->GetStringValueCount(); for(x=0; xGetStringValues(x); if(x < lCount - 1) szVal = szVal + " \\ "; } } } else szVal = ": Value too large to display"; } if(hParent) hItem = m_KeyView.InsertItem(szTag + " - " + szName + szVal, hParent); else hItem = m_KeyView.InsertItem(szTag + " - " + szName + szVal); m_KeyView.SetItemData(hItem, hElement); hParent = hItem; nRet = m_pServerDS->MoveChildElement(); if(nRet == DICOM_SUCCESS) { hTemp = m_pServerDS->GetCurrentElement()->GethElement(); DisplayKey(hTemp, hParent); m_pServerDS->SetCurrentElement(hTemp); } else m_pServerDS->SetCurrentElement(hTemp); } void CDICOMSRVDlg::OnDblclkTree1(NMHDR* pNMHDR, LRESULT* pResult) { HTREEITEM hItem=NULL; short nRet; CString szKey; long hTemp=0; *pResult = 0; hItem = m_DicomDir.GetSelectedItem(); if(!hItem) return; hTemp = m_DicomDir.GetItemData(hItem); if( (hTemp == m_hDisplay) && (!m_LEADRasterView1.GetRaster().GetBitmap()) ) { m_hDisplay = hTemp; m_pServerDS->SetCurrentElement(hTemp); szKey = (LPSTR)m_pServerDS->GetKeyValue(); if(szKey == "IMAGE") //try to display the image { m_KeyView.DeleteAllItems(); m_LEADRasterView1.ShowWindow(SW_SHOW); m_KeyView.ShowWindow(SW_HIDE); nRet = m_pServerDS->MoveChildElement(); if(nRet == DICOM_SUCCESS) { //find the image nRet = m_pServerDS->FindFirstElement(TAG_REFERENCED_FILE_ID, TRUE); if(nRet == DICOM_SUCCESS) { nRet = m_pServerDS->GetConvertValue(); if(nRet == DICOM_SUCCESS) { DisplayImageData(m_szWorkingDir + (LPSTR)m_pServerDS->GetStringValues(0)); return; } else MessageBox("Error displaying Image!", "Error", MB_OK); } } } } else { if(hTemp != m_hDisplay) m_LEADRasterView1.GetRaster().SetBitmap(0); } } void CDICOMSRVDlg::DisplayImageData(CString szFile) { short nRet; HCURSOR hOld=NULL; hOld = SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_WAIT))); _bstr_t sFile(szFile); nRet = m_pLEADDICOM1->LoadDS(sFile, 0); if(nRet == DICOM_SUCCESS) { nRet = m_pLEADDICOM1->FindFirstElement(TAG_PIXEL_DATA, FALSE); if(nRet == DICOM_SUCCESS) nRet = m_pLEADDICOM1->GetBitmapValue(0, 0, ORDER_BGR,DICOM_GETIMAGE_AUTO_APPLY_MODALITY_LUT|DICOM_GETIMAGE_AUTO_APPLY_VOI_LUT|DICOM_GETIMAGE_ALLOW_RANGE_EXPANSION); } SetCursor(hOld); if(nRet == DICOM_SUCCESS) { m_LEADRasterView1.GetRaster().SetBitmap(m_pLEADDICOM1->GetBitmap()); m_LEADRasterView1.ShowWindow(SW_SHOW); m_KeyView.ShowWindow(SW_HIDE); } else MessageBox("Error in Image Data!", "Error", MB_OK); m_pLEADDICOM1->ResetDS(); } void CDICOMSRVDlg::OnButton3() { HTREEITEM hItem=NULL; CString szKey; long hTemp=0; hItem = m_DicomDir.GetSelectedItem(); if(!hItem) return; m_hDisplay = 0; hTemp = m_DicomDir.GetItemData(hItem); m_pServerDS->SetCurrentElement(hTemp); m_KeyView.DeleteAllItems(); m_LEADRasterView1.GetRaster().SetBitmap(0); m_LEADRasterView1.ShowWindow(SW_HIDE); m_KeyView.ShowWindow(SW_SHOW); DeleteKey(hTemp); } void CDICOMSRVDlg::DeleteKey(long hElement) { CString szKey; CString szPatientID; CString szStudyUID; CString szSeriesUID; CString szSOPUID; short nRet; //get patient id m_pServerDS->SetCurrentElement(hElement); m_pServerDS->MoveChildElement(); nRet = m_pServerDS->FindFirstElement(TAG_PATIENT_ID, TRUE); if(nRet == DICOM_SUCCESS) { m_pServerDS->GetStringValue(0, 1); szPatientID = (LPSTR)m_pServerDS->GetStringValues(0); } //get study uid m_pServerDS->SetCurrentElement(hElement); m_pServerDS->MoveChildElement(); nRet = m_pServerDS->FindFirstElement(TAG_STUDY_INSTANCE_UID, TRUE); if(nRet == DICOM_SUCCESS) { m_pServerDS->GetStringValue(0, 1); szStudyUID = (LPSTR)m_pServerDS->GetStringValues(0); } //get series uid m_pServerDS->SetCurrentElement(hElement); m_pServerDS->MoveChildElement(); nRet = m_pServerDS->FindFirstElement(TAG_SERIES_INSTANCE_UID, TRUE); if(nRet == DICOM_SUCCESS) { m_pServerDS->GetStringValue(0, 1); szSeriesUID = (LPSTR)m_pServerDS->GetStringValues(0); } //get SOP uid m_pServerDS->SetCurrentElement(hElement); m_pServerDS->MoveChildElement(); nRet = m_pServerDS->FindFirstElement(TAG_SOP_INSTANCE_UID, TRUE); if(nRet == DICOM_SUCCESS) { m_pServerDS->GetStringValue(0, 1); szSOPUID = (LPSTR)m_pServerDS->GetStringValues(0); } //what type of key is it? m_pServerDS->SetCurrentElement(hElement); szKey = (LPSTR)m_pServerDS->GetKeyValue(); if(szKey == "PATIENT") DeletePatient(szPatientID); else if(szKey == "STUDY") DeleteStudy(szStudyUID); else if(szKey == "SERIES") DeleteSeries(szStudyUID, szSeriesUID); else if(szKey == "IMAGE") DeleteImage(szStudyUID, szSeriesUID, szSOPUID); //redisplay the Dicom Dir //update our DICOM DIR File InitServerDS(); DisplayDICOMDir(); } void CDICOMSRVDlg::DeletePatient(CString szPatientID) { CDatabase conn; CString szQuery; CString szUID; if(!conn.OpenEx(_T("DSN=DICOMSERVERDB;UID=sa"),CDatabase::noOdbcDialog)) { MessageBox("Error opening the data source", "Error", MB_OK); return; } //find all studies, and delete them szQuery = "SELECT * FROM Studies WHERE PatientID = '" + szPatientID + "';"; CStudyRecordset rstStudy(&conn); rstStudy.Open(CRecordset::dynaset, szQuery); while(!rstStudy.IsEOF()) //Delete { szUID = rstStudy.m_StudyInstanceUID; DeleteStudy(szUID); rstStudy.MoveNext(); } rstStudy.Close(); //now delete the patient record CPatientRecordset rstPatient(&conn); szQuery = "SELECT * FROM Patients WHERE PatientID = '" + szPatientID + "';"; rstPatient.Open(CRecordset::dynaset, szQuery); if(!rstPatient.IsEOF()) //Delete { rstPatient.Delete(); // rstPatient.Update(); } rstPatient.Close(); conn.Close(); } void CDICOMSRVDlg::DeleteStudy(CString szStudyUID) { CDatabase conn; CString szQuery; CString szSeriesUID; if(!conn.OpenEx(_T("DSN=DICOMSERVERDB;UID=sa"),CDatabase::noOdbcDialog)) { MessageBox("Error opening the data source", "Error", MB_OK); return; } //find all series, and delete them szQuery = "SELECT * FROM Series WHERE StudyInstanceUID = '" + szStudyUID + "';"; CSeriesRecordset rstSeries(&conn); rstSeries.Open(CRecordset::dynaset, szQuery); while(!rstSeries.IsEOF()) //Delete { szSeriesUID = rstSeries.m_SeriesInstanceUID; DeleteSeries(szStudyUID, szSeriesUID); rstSeries.MoveNext(); } rstSeries.Close(); //now delete the study record szQuery = "SELECT * FROM Studies WHERE StudyInstanceUID = '" + szStudyUID + "';"; CStudyRecordset rstStudy(&conn); rstStudy.Open(CRecordset::dynaset, szQuery); if(!rstStudy.IsEOF()) //Delete { rstStudy.Delete(); // rstStudy.Update(); } rstStudy.Close(); conn.Close(); } void CDICOMSRVDlg::DeleteSeries(CString szStudyUID, CString szSeriesUID) { CDatabase conn; CString szQuery; CString szSOPUID; if(!conn.OpenEx(_T("DSN=DICOMSERVERDB;UID=sa"),CDatabase::noOdbcDialog)) { MessageBox("Error opening the data source", "Error", MB_OK); return; } //find all images, and delete them szQuery = "SELECT * FROM Images where StudyInstanceUID = '" + szStudyUID + "' AND SeriesInstanceUID = '" + szSeriesUID + "';"; CImageRecordset rstImage(&conn); rstImage.Open(CRecordset::dynaset, szQuery); while(!rstImage.IsEOF()) //Delete { szSOPUID = rstImage.m_SOPInstanceUID; DeleteImage(szStudyUID, szSeriesUID, szSOPUID); rstImage.MoveNext(); } rstImage.Close(); //now delete the series record szQuery = "SELECT * FROM Series where StudyInstanceUID = '" + szStudyUID + "' AND SeriesInstanceUID = '" + szSeriesUID + "';"; CSeriesRecordset rstSeries(&conn); rstSeries.Open(CRecordset::dynaset, szQuery); if(!rstSeries.IsEOF()) //Delete { rstSeries.Delete(); // rstSeries.Update(); } rstSeries.Close(); conn.Close(); } void CDICOMSRVDlg::DeleteImage(CString szStudyUID, CString szSeriesUID, CString szSOPUID) { CDatabase conn; CString szQuery; CString szFile; if(!conn.OpenEx(_T("DSN=DICOMSERVERDB;UID=sa"),CDatabase::noOdbcDialog)) { MessageBox("Error opening the data source", "Error", MB_OK); return; } szQuery = "SELECT * FROM Images where StudyInstanceUID = '" + szStudyUID + "' AND SeriesInstanceUID = '" + szSeriesUID + "' AND SOPInstanceUID = '" + szSOPUID + "';"; CImageRecordset rstImage(&conn); rstImage.Open(CRecordset::dynaset, szQuery); if(!rstImage.IsEOF()) //Delete { //delete the file szFile = m_szWorkingDir + rstImage.m_ReferencedFile; DeleteFile(szFile); //now delete the image record rstImage.Delete(); // rstImage.Update(); } rstImage.Close(); conn.Close(); } void CDICOMSRVDlg::OnButton1() { CDatabase conn; short nRet; CString szQuery; ILEADRasterDlgFile *pRasterDlgFile; ::CoCreateInstance(CLSID_LEADRasterDlgFile, NULL, CLSCTX_ALL, IID_ILEADRasterDlgFile, (void**)&pRasterDlgFile); if(m_pLEADDICOMNet1->GetClientCount(m_pLEADDICOMNet1->GethNet()) > 0) { MessageBox("Clients are connected! \n Cannot change directory at this time.", "Warning", MB_OK); return; } nRet = MessageBox("This will delete all records from the database, are you sure?", "Warning", MB_YESNO); if(nRet != IDYES) return; m_pLEADDICOMNet1->Close(m_pLEADDICOMNet1->GethNet()); //close server m_pLEADDICOMNet1->ShutDown(); SetStatus("Server was Stopped"); LogEvent(m_szServerAE, "Server ShutDown"); pRasterDlgFile->DialogTitle = (_bstr_t)("Pick Root DICOM Directory"); pRasterDlgFile->UIFlags= 0; pRasterDlgFile->Filter = (_bstr_t)("DICOM DataSets (*.dic)|*.dic"); nRet = pRasterDlgFile->ShowDirectoryDlg((long)this->m_hWnd); if(nRet == 0) { m_szWorkingDir = (LPSTR)pRasterDlgFile->GetDirectory(); if(m_szWorkingDir.Right(1) != "\\") m_szWorkingDir = m_szWorkingDir + "\\"; m_DicomDir.DeleteAllItems(); m_KeyView.DeleteAllItems(); m_LEADRasterView1.GetRaster().SetBitmap(0); m_lServerFileCount = 0; //delete all records from database if(!conn.OpenEx(_T("DSN=DICOMSERVERDB;UID=sa"),CDatabase::noOdbcDialog)) { MessageBox("Error opening the data source", "Error", MB_OK); return; } //find all records and delete them szQuery = "SELECT * FROM Patients;"; CPatientRecordset rstPatient(&conn); rstPatient.Open(CRecordset::dynaset, szQuery); while(!rstPatient.IsEOF()) { rstPatient.Delete(); } rstPatient.Close(); szQuery = "SELECT * FROM Studies;"; CStudyRecordset rstStudy(&conn); rstStudy.Open(CRecordset::dynaset, szQuery); while(!rstStudy.IsEOF()) { rstStudy.Delete(); } rstStudy.Close(); szQuery = "SELECT * FROM Series;"; CSeriesRecordset rstSeries(&conn); rstSeries.Open(CRecordset::dynaset, szQuery); while(!rstSeries.IsEOF()) { rstSeries.Delete(); } rstSeries.Close(); szQuery = "SELECT * FROM Images;"; CImageRecordset rstImage(&conn); rstImage.Open(CRecordset::dynaset, szQuery); while(!rstImage.IsEOF()) { rstImage.Delete(); } rstImage.Close(); conn.Close(); m_pServerDS->ResetDS(); InitServerDS(); DisplayDirDS(0, FALSE); } //init server m_pLEADDICOMNet1->NetworkSecurityMode = (SecurityModes[m_lNetSecurityModeIndex]); nRet = m_pLEADDICOMNet1->StartUp(); if(nRet == DICOM_SUCCESS) nRet = m_pLEADDICOMNet1->Listen("", m_lServerPort, m_lMaxClients); if(nRet != DICOM_SUCCESS) MessageBox("Error starting server!", "Error", MB_OK); SetStatus("Server was Restarted"); LogEvent(m_szServerAE, "Server StartUp"); pRasterDlgFile->Release(); } // void CDICOMSRVDlg::OnNetReceiveCFindRequestLeaddicomnetctrl1(long hNet, short nPresentationID, short nMessageID, LPCTSTR pszClass, short nPriority, long hDS) // { // short nRet; // long nStatus; // long hPDU; // short nID; // CString szClient; // CString szUser; // CString szCalled; // CString szFile; // CString szLevel; // CString szClass = pszClass; // // hPDU = m_pLEADDICOMNet1->GetAssociate(hNet); // if(hPDU == 0) // { // //connection is not associated, so ignore the message // return; // } // // //we have received an C-FIND-REQUEST // szClient = (LPSTR)m_pLEADDICOMNet1->GetPeerAddress(hNet); // szUser = (LPSTR)m_pLEADDICOMNet1->GetCalling(hPDU); // szCalled = (LPSTR)m_pLEADDICOMNet1->GetCalled(hPDU); // LogEvent(szUser, "C-FIND-REQUEST received"); // LastClientAction(hNet, "C-FIND-REQUEST", TRUE); // // _bstr_t sClass(szClass); // nRet = m_pLEADDICOM1->FindUID(sClass); // if(nRet != DICOM_SUCCESS) // nStatus = COMMAND_STATUS_CLASS_NOT_SUPPORTED; // else // { // nID = m_pLEADDICOMNet1->FindPresentationAbstract(hPDU, sClass); // if((nID == 0) || (m_pLEADDICOMNet1->GetPresentationResult(hPDU, nID) != PDU_ACCEPT_RESULT_SUCCESS)) // { // LogEvent(szUser, "C-FIND-REQUEST - Abstract Syntax, " + (CString)(LPSTR)m_pLEADDICOM1->GetCurrentUID()->GetName() + ", Not Supported by Association!"); // nStatus = COMMAND_STATUS_CLASS_NOT_SUPPORTED; // } // else // nStatus = COMMAND_STATUS_SUCCESS; // } // // if(hDS == 0) // { // nStatus = COMMAND_STATUS_INVALID_ARGUMENT_VALUE; // goto FIND_ERROR; // } // // //get the query level // m_pLEADDICOM1->hDicomDS = hDS; // nRet = m_pLEADDICOM1->FindFirstElement(TAG_QUERY_RETRIEVE_LEVEL, TRUE); // if(nRet != DICOM_SUCCESS) // { // nStatus = COMMAND_STATUS_INVALID_ARGUMENT_VALUE; // goto FIND_ERROR; // } // // nRet = m_pLEADDICOM1->GetStringValue(0, 1); // if(nRet != DICOM_SUCCESS) // { // nStatus = COMMAND_STATUS_INVALID_ARGUMENT_VALUE; // goto FIND_ERROR; // } // szLevel = (LPSTR)m_pLEADDICOM1->GetStringValues(0); // // //do the query // if(nStatus == COMMAND_STATUS_SUCCESS) // { // if(szClass == UID_PATIENT_ROOT_QUERY_FIND) // { // if(szLevel == "PATIENT") // DoFindPatient(hNet, nPresentationID, nMessageID, szClass, m_pLEADDICOM1, szUser); // else if(szLevel == "STUDY") // DoFindStudy(hNet, nPresentationID, nMessageID, szClass, m_pLEADDICOM1, szUser); // else if(szLevel == "SERIES") // DoFindSeries(hNet, nPresentationID, nMessageID, szClass, m_pLEADDICOM1, szUser); // else if(szLevel == "IMAGE") // DoFindImage(hNet, nPresentationID, nMessageID, szClass, m_pLEADDICOM1, szUser); // else // { // nStatus = COMMAND_STATUS_INVALID_ARGUMENT_VALUE; // goto FIND_ERROR; // } // } // else // { // nStatus = COMMAND_STATUS_INVALID_ARGUMENT_VALUE; // goto FIND_ERROR; // } // } // m_pLEADDICOM1->ResetDS(); // return; // // FIND_ERROR: // m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, nStatus, 0); // LogEvent(szUser, "C-FIND-RESPONSE sent"); // m_pLEADDICOM1->ResetDS(); // } void CDICOMSRVDlg::DoFindPatient(long hNet, short nPresentationID, short nMessageID, CString szClass, ILEADDicomDS *pSourceDS, CString szUser) { CDatabase conn; short nRet; CString szPatient; CString szPatientID; CString szQuery; long nSeriesCount; long nImageCount; CString szStudyUID; CString szSeriesUID; CString szPatientIDTemp; CString szTemp; long nPos; long nCount; _bstr_t sClass(szClass); if(!conn.OpenEx(_T("DSN=DICOMSERVERDB;UID=sa"),CDatabase::noOdbcDialog)) { m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, COMMAND_STATUS_PROCESSING_FAILURE, 0); LogEvent(szUser, "C-FIND-RESPONSE sent"); return; } szQuery = "SELECT * FROM Patients"; //default query is all records CPatientRecordset rstPatient(&conn); rstPatient.Open(CRecordset::dynaset, szQuery); m_PatientIDList.ResetContent(); m_PatientNameList.ResetContent(); while(!rstPatient.IsEOF()) { m_PatientIDList.AddString(rstPatient.m_PatientID); if(rstPatient.m_PatientName.GetLength() > 0) m_PatientNameList.AddString(rstPatient.m_PatientName); rstPatient.MoveNext(); } rstPatient.Close(); //get the query attributes nRet = pSourceDS->FindFirstElement(TAG_PATIENT_NAME, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetStringValue(0, 1); if(nRet == DICOM_SUCCESS) szPatient = (LPSTR)pSourceDS->GetStringValues(0); } nRet = pSourceDS->FindFirstElement(TAG_PATIENT_ID, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetStringValue(0, 1); if(nRet == DICOM_SUCCESS) szPatientID = (LPSTR)pSourceDS->GetStringValues(0); } if(szPatientID.GetLength() || szPatient.GetLength()) { szQuery = szQuery + " WHERE "; if(szPatientID.GetLength()) szQuery = szQuery + " PatientID LIKE '" + szPatientID + "'"; if(szPatient.GetLength()) { if(szPatientID.GetLength()) szQuery = szQuery + " AND "; szQuery = szQuery + " PatientName LIKE '" + szPatient + "'"; } } szQuery = szQuery + ";"; //replace '*' with '%' szTemp = "SELECT * FROM "; nPos = szTemp.GetLength(); //skip the first '*' for(; nPosInitDS(DICOM_CLASS_UNKNOWN, DS_METAHEADER_ABSENT | DS_LITTLE_ENDIAN | DS_EXPLICIT_VR); //set some elements if(rstPatient.m_PatientName.GetLength()) nRet = SetElement2(m_pLEADDICOM2, 0, TAG_PATIENT_NAME, rstPatient.m_PatientName); if(rstPatient.m_PatientID.GetLength()) nRet = SetElement2(m_pLEADDICOM2, 0, TAG_PATIENT_ID, rstPatient.m_PatientID); if(rstPatient.m_PatientBirthDate.year || rstPatient.m_PatientBirthDate.month || rstPatient.m_PatientBirthDate.day) { nRet = m_pLEADDICOM2->FindFirstElement(TAG_PATIENT_BIRTH_DATE, FALSE); if(nRet != DICOM_SUCCESS) nRet = m_pLEADDICOM2->InsertElement(FALSE, TAG_PATIENT_BIRTH_DATE, 0, FALSE, 0); if(nRet == DICOM_SUCCESS) { m_pLEADDICOM2->GetDateValues(0)->Year = (rstPatient.m_PatientBirthDate.year); m_pLEADDICOM2->GetDateValues(0)->Month = (rstPatient.m_PatientBirthDate.month); m_pLEADDICOM2->GetDateValues(0)->Day = (rstPatient.m_PatientBirthDate.day); m_pLEADDICOM2->SetDateValue(1); } } if(rstPatient.m_PatientBirthTime.hour || rstPatient.m_PatientBirthTime.minute || rstPatient.m_PatientBirthTime.second || rstPatient.m_PatientBirthTime.fraction) { nRet = m_pLEADDICOM2->FindFirstElement(TAG_PATIENT_BIRTH_TIME, FALSE); if(nRet != DICOM_SUCCESS) nRet = m_pLEADDICOM2->InsertElement(FALSE, TAG_PATIENT_BIRTH_TIME, 0, FALSE, 0); if(nRet == DICOM_SUCCESS) { m_pLEADDICOM2->GetTimeValues(0)->Hours = (rstPatient.m_PatientBirthTime.hour); m_pLEADDICOM2->GetTimeValues(0)->Minutes = (rstPatient.m_PatientBirthTime.minute); m_pLEADDICOM2->GetTimeValues(0)->Seconds = (rstPatient.m_PatientBirthTime.second); m_pLEADDICOM2->GetTimeValues(0)->Fractions = (rstPatient.m_PatientBirthTime.fraction); m_pLEADDICOM2->SetTimeValue(1); } } if(rstPatient.m_PatientSex.GetLength()) nRet = SetElement2(m_pLEADDICOM2, 0, TAG_PATIENT_SEX, rstPatient.m_PatientSex); if(rstPatient.m_PatientEthnicGroup.GetLength()) nRet = SetElement2(m_pLEADDICOM2, 0, TAG_ETHNIC_GROUP, rstPatient.m_PatientEthnicGroup); if(rstPatient.m_PatientComments.GetLength()) nRet = SetElement2(m_pLEADDICOM2, 0, TAG_PATIENT_COMMENTS, rstPatient.m_PatientComments); m_pLEADDICOM2->StringValueCount = m_PatientIDList.GetCount(); for(nCount=0; nCountPutStringValues(nCount, sItem); } nRet = m_pLEADDICOM2->InsertElement(FALSE, TAG_OTHER_PATIENT_IDS, 0, FALSE, 0); m_pLEADDICOM2->SetConvertValue(); m_pLEADDICOM2->StringValueCount = m_PatientNameList.GetCount(); for(nCount=0; nCountPutStringValues(nCount, sItem); } nRet = m_pLEADDICOM2->InsertElement(FALSE, TAG_OTHER_PATIENT_NAMES, 0, FALSE, 0); m_pLEADDICOM2->SetConvertValue(); //get the Study, Series, and Image count for each Patient nSeriesCount = 0; nImageCount = 0; szQuery = "SELECT * FROM Studies WHERE PatientID = '" + szPatientIDTemp + "';"; CStudyRecordset rstStudy(&conn); rstStudy.Open(CRecordset::dynaset, szQuery); szTemp.Format("%ld", rstStudy.GetRecordCount()); nRet = SetElement2(m_pLEADDICOM2, 0, TAG_NUMBER_OF_PATIENT_RELATED_STUDIES, szTemp); while(!rstStudy.IsEOF()) { szStudyUID = rstStudy.m_StudyInstanceUID; szQuery = "SELECT * FROM Series WHERE StudyInstanceUID = '" + szStudyUID + "';"; CSeriesRecordset rstSeries(&conn); rstSeries.Open(CRecordset::dynaset, szQuery); while(!rstSeries.IsEOF()) { szSeriesUID = rstSeries.m_SeriesInstanceUID; szQuery = "SELECT * FROM Images WHERE StudyInstanceUID = '" + szStudyUID + "' AND SeriesInstanceUID = '" + szSeriesUID + "';"; CImageRecordset rstImage(&conn); rstImage.Open(CRecordset::dynaset, szQuery); nImageCount += rstImage.GetRecordCount(); rstImage.Close(); rstSeries.MoveNext(); } nSeriesCount += rstSeries.GetRecordCount(); rstSeries.Close(); rstStudy.MoveNext(); } rstStudy.Close(); szTemp.Format("%ld", nSeriesCount); nRet = SetElement2(m_pLEADDICOM2, 0, TAG_NUMBER_OF_PATIENT_RELATED_SERIES, szTemp); szTemp.Format("%ld", nImageCount); nRet = SetElement2(m_pLEADDICOM2, 0, TAG_NUMBER_OF_PATIENT_RELATED_INSTANCES, szTemp); //send a response m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, -256, m_pLEADDICOM2->GethDicomDS()); m_pLEADDICOM2->ResetDS(); rstPatient.MoveNext(); } rstPatient.Close(); conn.Close(); nRet = COMMAND_STATUS_SUCCESS; m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, nRet, 0); LogEvent(szUser, "C-FIND-RESPONSE sent"); } void CDICOMSRVDlg::DoFindStudy(long hNet, short nPresentationID, short nMessageID, CString szClass, ILEADDicomDS *pSourceDS, CString szUser) { CDatabase conn; short nRet; CString szPatientID; CString szQuery; long nImageCount; CString szStudyUID; CString szSeriesUID; CString szPatientIDTemp; CString szTemp; long nPos; CString szFile; long nCount; _bstr_t sClass(szClass); if(!conn.OpenEx(_T("DSN=DICOMSERVERDB;UID=sa"),CDatabase::noOdbcDialog)) { m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, COMMAND_STATUS_PROCESSING_FAILURE, 0); LogEvent(szUser, "C-FIND-RESPONSE sent"); return; } szQuery = "SELECT * FROM Studies"; //default query is all records CStudyRecordset rstStudy(&conn); rstStudy.Open(CRecordset::dynaset, szQuery); m_StudyList.ResetContent(); while(!rstStudy.IsEOF()) //Send a response for each study that matches { m_StudyList.AddString(rstStudy.m_StudyInstanceUID); rstStudy.MoveNext(); } rstStudy.Close(); //get the query attributes nRet = pSourceDS->FindFirstElement(TAG_PATIENT_ID, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetStringValue(0, 1); if(nRet == DICOM_SUCCESS) szPatientID = (LPSTR)pSourceDS->GetStringValues(0); } if(szPatientID.GetLength()) { szQuery = szQuery + " WHERE "; if(szPatientID.GetLength()) szQuery = szQuery + " PatientID LIKE '" + szPatientID + "'"; } szQuery = szQuery + ";"; //replace '*' with '%' szTemp = "SELECT * FROM "; nPos = szTemp.GetLength(); //skip the first '*' for(; nPosInitDS(DICOM_CLASS_UNKNOWN, DS_METAHEADER_ABSENT | DS_LITTLE_ENDIAN | DS_EXPLICIT_VR); //set some elements if(rstStudy.m_PatientID.GetLength()) nRet = SetElement2(m_pLEADDICOM2, 0, TAG_PATIENT_ID, rstStudy.m_PatientID); if(rstStudy.m_StudyInstanceUID.GetLength()) nRet = SetElement2(m_pLEADDICOM2, 0, TAG_STUDY_INSTANCE_UID, rstStudy.m_StudyInstanceUID); if(rstStudy.m_StudyID.GetLength()) nRet = SetElement2(m_pLEADDICOM2, 0, TAG_STUDY_ID, rstStudy.m_StudyID); if(rstStudy.m_AccessionNumber.GetLength()) nRet = SetElement2(m_pLEADDICOM2, 0, TAG_ACCESSION_NUMBER, rstStudy.m_AccessionNumber); if(rstStudy.m_StudyDesc.GetLength()) nRet = SetElement2(m_pLEADDICOM2, 0, TAG_STUDY_DESCRIPTION, rstStudy.m_StudyDesc); //load the referenced file szFile = rstStudy.m_ReferencedFile; _bstr_t sName(m_szWorkingDir + szFile); nRet = m_pLEADTemp->LoadDS(sName, 0); if(nRet == DICOM_SUCCESS) { CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_STUDY_DATE, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_STUDY_TIME, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_MODALITIES_IN_STUDY, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_REFERRING_PHYSICIAN_NAME, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_NAME_OF_PHYSICIAN_READING_STUDY, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_ADMITTING_DIAGNOSES_DESCRIPTION, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_PATIENT_AGE, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_PATIENT_SIZE, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_PATIENT_WEIGHT, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_OCCUPATION, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_ADDITIONAL_PATIENT_HISTORY, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_INTERPRETATION_AUTHOR, FALSE); m_pLEADTemp->ResetDS(); } m_pLEADDICOM2->StringValueCount = (m_StudyList.GetCount()); for(nCount=0; nCountPutStringValues(nCount, sTemp); } nRet = m_pLEADDICOM2->InsertElement(FALSE, TAG_OTHER_STUDY_NUMBERS, 0, FALSE, 0); m_pLEADDICOM2->SetConvertValue(); //get the Series, and Image count for each Patient nImageCount = 0; szStudyUID = rstStudy.m_StudyInstanceUID; szQuery = "SELECT * FROM Series WHERE StudyInstanceUID = '" + szStudyUID + "';"; CSeriesRecordset rstSeries(&conn); rstSeries.Open(CRecordset::dynaset, szQuery); while(!rstSeries.IsEOF()) { szSeriesUID = rstSeries.m_SeriesInstanceUID; szQuery = "SELECT * FROM Images WHERE StudyInstanceUID = '" + szStudyUID + "' AND SeriesInstanceUID = '" + szSeriesUID + "';"; CImageRecordset rstImage(&conn); rstImage.Open(CRecordset::dynaset, szQuery); nImageCount += rstImage.GetRecordCount(); rstImage.Close(); rstSeries.MoveNext(); } szTemp.Format("%ld", rstSeries.GetRecordCount()); nRet = SetElement2(m_pLEADDICOM2, 0, TAG_NUMBER_OF_PATIENT_RELATED_SERIES, szTemp); szTemp.Format("%ld", nImageCount); nRet = SetElement2(m_pLEADDICOM2, 0, TAG_NUMBER_OF_PATIENT_RELATED_INSTANCES, szTemp); rstSeries.Close(); //send a response m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, -256, m_pLEADDICOM2->GethDicomDS()); m_pLEADDICOM2->ResetDS(); rstStudy.MoveNext(); } rstStudy.Close(); conn.Close(); nRet = COMMAND_STATUS_SUCCESS; m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, nRet, 0); LogEvent(szUser, "C-FIND-RESPONSE sent"); } short CDICOMSRVDlg::CopyElement(ILEADDicomDS *pTargetDS, long hDestElement, ILEADDicomDS *pSourceDS, long lTag, BOOL bValueRequired) { short nRet; CString szTag; long x; CString szValue; pTargetDS->StringValueCount=(0); pSourceDS->StringValueCount=(0); pTargetDS->SetCurrentElement(hDestElement); nRet = pTargetDS->InsertElement(FALSE, lTag, 0, FALSE, 0); if(nRet != DICOM_SUCCESS) //already exists nRet = pTargetDS->FindFirstElement(lTag, TRUE); if(nRet != DICOM_SUCCESS) { nRet = pTargetDS->FindTag(lTag); if(nRet == DICOM_SUCCESS) szTag = (LPSTR)pTargetDS->GetCurrentTag()->GetName(); else szTag.Format("%X", lTag); if(m_bImport) MessageBox("Tag - " + szTag + " error creating/setting element for Target Data Set!", "Error", MB_OK); return(ERROR_FAILURE); //failure } nRet = pSourceDS->FindFirstElement(lTag, TRUE); if(nRet != DICOM_SUCCESS) { nRet = pTargetDS->FindTag(lTag); if(nRet == DICOM_SUCCESS) szTag = (LPSTR)pTargetDS->GetCurrentTag()->GetName(); else szTag.Format("%X", lTag); if(bValueRequired) { if(m_bImport) MessageBox("Tag - " + szTag + " does not exist in source Data Set!", "Error", MB_OK); } return(ERROR_FAILURE); //failure } nRet = pSourceDS->GetConvertValue(); if(nRet != DICOM_SUCCESS) { nRet = pTargetDS->FindTag(lTag); if(nRet == DICOM_SUCCESS) szTag = (LPSTR)pTargetDS->GetCurrentTag()->GetName(); else szTag.Format("%X", lTag); if(bValueRequired) { if(m_bImport) MessageBox("Tag - " + szTag + " does not contain a value in source Data Set!", "Error", MB_OK); } return(ERROR_FAILURE); //failure } pTargetDS->StringValueCount = (pSourceDS->GetStringValueCount()); for(x=0; xGetStringValueCount(); x++) pTargetDS->PutStringValues(x, pSourceDS->GetStringValues(x)); nRet = pTargetDS->SetConvertValue(); if(nRet != DICOM_SUCCESS) { nRet = pTargetDS->FindTag(lTag); if(nRet == DICOM_SUCCESS) szTag = (LPSTR)pTargetDS->GetCurrentTag()->GetName(); else szTag.Format("%X", lTag); if(bValueRequired) { if(m_bImport) MessageBox("Tag - " + szTag + " error creating/setting element for Target Data Set!", "Error", MB_OK); } return(ERROR_FAILURE); //failure } return(0); //successful } void CDICOMSRVDlg::DoFindSeries(long hNet, short nPresentationID, short nMessageID, CString szClass, ILEADDicomDS *pSourceDS, CString szUser) { CDatabase conn; short nRet; CString szPatient; CString szPatientID; CString szQuery; CString szStudyUID; CString szSeriesUID; CString szTemp; CString szFile; _bstr_t sClass(szClass); //get the query attributes szStudyUID = " "; nRet = pSourceDS->FindFirstElement(TAG_STUDY_INSTANCE_UID, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetStringValue(0, 1); if(nRet == DICOM_SUCCESS) szStudyUID = (LPSTR)pSourceDS->GetStringValues(0); } //find all series with matching study instance uid //do the query if(!conn.OpenEx(_T("DSN=DICOMSERVERDB;UID=sa"),CDatabase::noOdbcDialog)) { m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, COMMAND_STATUS_PROCESSING_FAILURE, 0); LogEvent(szUser, "C-FIND-RESPONSE sent"); return; } szQuery = "SELECT * FROM Series WHERE StudyInstanceUID = '" + szStudyUID + "';"; CSeriesRecordset rstSeries(&conn); rstSeries.Open(CRecordset::dynaset, szQuery); while(!rstSeries.IsEOF()) { m_pLEADDICOM2->InitDS(DICOM_CLASS_UNKNOWN, DS_METAHEADER_ABSENT | DS_LITTLE_ENDIAN | DS_EXPLICIT_VR); //set some elements nRet = SetElement2(m_pLEADDICOM2, 0, TAG_STUDY_INSTANCE_UID, szStudyUID); if(rstSeries.m_SeriesInstanceUID.GetLength()) { nRet = SetElement2(m_pLEADDICOM2, 0, TAG_SERIES_INSTANCE_UID, rstSeries.m_SeriesInstanceUID); szSeriesUID = rstSeries.m_SeriesInstanceUID; } if(rstSeries.m_Modality.GetLength()) nRet = SetElement2(m_pLEADDICOM2, 0, TAG_MODALITY, rstSeries.m_Modality); szTemp.Format("%ld", rstSeries.GetRecordCount()); nRet = SetElement2(m_pLEADDICOM2, 0, TAG_NUMBER_OF_PATIENT_RELATED_SERIES, szTemp); szFile = m_szWorkingDir + rstSeries.m_ReferencedFile; _bstr_t sFile(szFile); nRet = m_pLEADTemp->LoadDS(sFile, 0); if(nRet == DICOM_SUCCESS) { CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_SERIES_NUMBER, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_LATERALITY, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_SERIES_DATE, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_SERIES_TIME, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_PERFORMING_PHYSICIAN_NAME, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_PROTOCOL_NAME, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_SERIES_DESCRIPTION, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_OPERATORS_NAME, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_BODY_PART_EXAMINED, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_PATIENT_POSITION, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_SMALLEST_PIXEL_VALUE_IN_SERIES, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_LARGEST_PIXEL_VALUE_IN_SERIES, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_PERFORMED_PROCEDURE_STEP_ID, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_PERFORMED_PROCEDURE_STEP_START_DATE, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_PERFORMED_PROCEDURE_STEP_START_TIME, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_PERFORMED_PROCEDURE_STEP_DESCRIPTION, FALSE); m_pLEADTemp->ResetDS(); } szQuery = "SELECT * FROM Images WHERE StudyInstanceUID = '" + szStudyUID + "' AND SeriesInstanceUID = '" + szSeriesUID + "';"; CImageRecordset rstImage(&conn); rstImage.Open(CRecordset::dynaset, szQuery); szTemp.Format("%ld", rstImage.GetRecordCount()); nRet = SetElement2(m_pLEADDICOM2, 0, TAG_NUMBER_OF_PATIENT_RELATED_INSTANCES, szTemp); rstImage.Close(); //send a response m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, -256, m_pLEADDICOM2->GethDicomDS()); m_pLEADDICOM2->ResetDS(); rstSeries.MoveNext(); } rstSeries.Close(); conn.Close(); nRet = COMMAND_STATUS_SUCCESS; m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, nRet, 0); LogEvent(szUser, "C-FIND-RESPONSE sent"); } void CDICOMSRVDlg::DoFindImage(long hNet, short nPresentationID, short nMessageID, CString szClass, ILEADDicomDS *pSourceDS, CString szUser) { CDatabase conn; short nRet; CString szQuery; CString szStudyUID; CString szSeriesUID; CString szTemp; CString szFile; long nImageCount; _bstr_t sClass(szClass); szStudyUID = " "; szSeriesUID = " "; nRet = pSourceDS->FindFirstElement(TAG_STUDY_INSTANCE_UID, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetStringValue(0, 1); if(nRet == DICOM_SUCCESS) szStudyUID = (LPSTR)pSourceDS->GetStringValues(0); } nRet = pSourceDS->FindFirstElement(TAG_SERIES_INSTANCE_UID, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetStringValue(0, 1); if(nRet == DICOM_SUCCESS) szSeriesUID = (LPSTR)pSourceDS->GetStringValues(0); } //find all series with matching study instance uid //do the query if(!conn.OpenEx(_T("DSN=DICOMSERVERDB;UID=sa"),CDatabase::noOdbcDialog)) { m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, COMMAND_STATUS_PROCESSING_FAILURE, 0); LogEvent(szUser, "C-FIND-RESPONSE sent"); return; } szQuery = "SELECT * FROM Images WHERE StudyInstanceUID = '" + szStudyUID + "' AND SeriesInstanceUID = '" + szSeriesUID + "';"; CImageRecordset rstImage(&conn); rstImage.Open(CRecordset::dynaset, szQuery); nImageCount = 0; while(!rstImage.IsEOF()) { nImageCount++; m_pLEADDICOM2->InitDS(DICOM_CLASS_UNKNOWN, DS_METAHEADER_ABSENT | DS_LITTLE_ENDIAN | DS_EXPLICIT_VR); //set some elements nRet = SetElement2(m_pLEADDICOM2, 0, TAG_STUDY_INSTANCE_UID, szStudyUID); nRet = SetElement2(m_pLEADDICOM2, 0, TAG_SERIES_INSTANCE_UID, szSeriesUID); if(rstImage.m_SOPInstanceUID.GetLength()) nRet = SetElement2(m_pLEADDICOM2, 0, TAG_SOP_INSTANCE_UID, rstImage.m_SOPInstanceUID); szTemp.Format("%ld", nImageCount); nRet = SetElement2(m_pLEADDICOM2, 0, TAG_INSTANCE_NUMBER, szTemp); szFile = m_szWorkingDir + rstImage.m_ReferencedFile; _bstr_t sFile(szFile); nRet = m_pLEADTemp->LoadDS(sFile, 0); if(nRet == DICOM_SUCCESS) { CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_PATIENT_ORIENTATION, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_CONTENT_DATE, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_CONTENT_TIME, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_IMAGE_TYPE, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_ACQUISITION_NUMBER, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_ACQUISITION_DATE, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_ACQUISITION_TIME, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_DERIVATION_DESCRIPTION, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_IMAGES_IN_ACQUISITION, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_IMAGE_COMMENTS, FALSE); CopyElement(m_pLEADDICOM2, 0, m_pLEADTemp, TAG_LOSSY_IMAGE_COMPRESSION, FALSE); m_pLEADTemp->ResetDS(); } m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, -256, m_pLEADDICOM2->GethDicomDS()); m_pLEADDICOM2->ResetDS(); rstImage.MoveNext(); } rstImage.Close(); conn.Close(); nRet = COMMAND_STATUS_SUCCESS; m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, nRet, 0); LogEvent(szUser, "C-FIND-RESPONSE sent"); } short CDICOMSRVDlg::SetElement(ILEADDicomDS *pTargetDS, long hElement, long lTag, CString szValue) { short nRet; _bstr_t sValue(szValue); pTargetDS->StringValueCount = 0; pTargetDS->SetCurrentElement(hElement); nRet = pTargetDS->FindFirstElement(lTag, TRUE); if(nRet != DICOM_SUCCESS) nRet = pTargetDS->InsertElement(FALSE, lTag, 0, FALSE, 0); if(nRet == DICOM_SUCCESS) { pTargetDS->StringValueCount = 1; pTargetDS->PutStringValues(0, sValue); nRet = pTargetDS->SetStringValue(1); } return(nRet); } void CDICOMSRVDlg::DoMoveImage(long hNet, short nPresentationID, short nMessageID, CString szClass, ILEADDicomDS *pSourceDS, CString szUser, CString szMoveAE) { CDatabase conn; short nRet; CString szQuery; CString szStudyUID; CString szSeriesUID; CString szSOPUID; CString szFile; short nFailed; long nImageCount; //get the query attributes szStudyUID = " "; szSeriesUID = " "; szSOPUID = " "; _bstr_t sClass(szClass); _bstr_t sMoveIP(m_szMoveIP); nRet = pSourceDS->FindFirstElement(TAG_STUDY_INSTANCE_UID, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetStringValue(0, 1); if(nRet == DICOM_SUCCESS) szStudyUID = (LPSTR)pSourceDS->GetStringValues(0); } nRet = pSourceDS->FindFirstElement(TAG_SERIES_INSTANCE_UID, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetStringValue(0, 1); if(nRet == DICOM_SUCCESS) szSeriesUID = (LPSTR)pSourceDS->GetStringValues(0); } nRet = pSourceDS->FindFirstElement(TAG_SOP_INSTANCE_UID, FALSE); if(nRet == DICOM_SUCCESS) { nRet = pSourceDS->GetStringValue(0, 1); if(nRet == DICOM_SUCCESS) szSOPUID = (LPSTR)pSourceDS->GetStringValues(0); } //do the query if(!conn.OpenEx(_T("DSN=DICOMSERVERDB;UID=sa"),CDatabase::noOdbcDialog)) { m_pLEADDICOMNet1->SendCFindResponse(hNet, nPresentationID, nMessageID, sClass, COMMAND_STATUS_PROCESSING_FAILURE, 0); LogEvent(szUser, "C-FIND-RESPONSE sent"); return; } szQuery = "SELECT * FROM Images where StudyInstanceUID = '" + szStudyUID + "' AND SeriesInstanceUID = '" + szSeriesUID + "' AND SOPInstanceUID = '" + szSOPUID + "';"; CImageRecordset rstImage(&conn); rstImage.Open(CRecordset::dynaset, szQuery); nImageCount = 0; nFailed = 0; if(rstImage.IsEOF()) { nFailed = 1; nRet = COMMAND_STATUS_PROCESSING_FAILURE; goto DONEMOVEIMAGE; } szFile = m_szWorkingDir + rstImage.m_ReferencedFile; m_szMoveAE = szMoveAE; m_szMoveFile = szFile; m_hMoveNet = hNet; m_nMovePresentationID = nPresentationID; m_nMoveMessageID = nMessageID; m_szMoveClass = szClass; m_szSOPInstanceUID = rstImage.m_SOPInstanceUID; rstImage.Close(); conn.Close(); //connect to the MoveAE glSec = 0; m_uTimer = SetTimer(99, 1000, NULL); m_pLEADDICOMNet2->NetworkSecurityMode = (SecurityModes[m_lNetSecurityModeIndex]); m_pLEADDICOMNet2->StartUp(); m_pLEADDICOMNet2->Connect("", 0, sMoveIP, m_lMovePort); DONEMOVEIMAGE: if(nFailed > 0) { m_pLEADDICOMNet1->SendCMoveResponse(hNet, nPresentationID, nMessageID, sClass, nRet, 0, 0, 1, 0, 0); LogEvent(szUser, "C-MOVE-RESPONSE sent"); } } // void CDICOMSRVDlg::OnNetReceiveCMoveRequestLeaddicomnetctrl1(long hNet, short nPresentationID, short nMessageID, LPCTSTR pszClass, short nPriority, LPCTSTR pszMoveAE, long hDS) // { // short nRet; // long nStatus; // long hPDU; // short nID; // CString szClient; // CString szUser; // CString szCalled; // CString szFile; // CString szLevel; // CString szMoveAE; // CString szClass; // long lClient; // CString szMoveIP; // long lMovePort; // BOOL bFound; // // hPDU = m_pLEADDICOMNet1->GetAssociate(hNet); // if(hPDU == 0) // { // //connection is not associated, so ignore the message // return; // } // // //we have received an C-MOVE-REQUEST // szClient = (LPSTR)m_pLEADDICOMNet1->GetPeerAddress(hNet); // szUser = (LPSTR)m_pLEADDICOMNet1->GetCalling(hPDU); // szCalled = (LPSTR)m_pLEADDICOMNet1->GetCalled(hPDU); // LogEvent(szUser, "C-MOVE-REQUEST received"); // LastClientAction(hNet, "C-MOVE-REQUEST", TRUE); // // nRet = m_pLEADDICOM1->FindUID(pszClass); // if(nRet != DICOM_SUCCESS) // nStatus = COMMAND_STATUS_CLASS_NOT_SUPPORTED; // else // { // nID = m_pLEADDICOMNet1->FindPresentationAbstract(hPDU, pszClass); // if((nID == 0) || (m_pLEADDICOMNet1->GetPresentationResult(hPDU, nID) != PDU_ACCEPT_RESULT_SUCCESS)) // { // LogEvent(szUser, "C-MOVE-REQUEST - Abstract Syntax, " + (CString)(LPSTR)m_pLEADDICOM1->GetCurrentUID()->GetName() + ", Not Supported by Association!"); // nStatus = COMMAND_STATUS_CLASS_NOT_SUPPORTED; // goto MOVE_ERROR; // } // else // nStatus = COMMAND_STATUS_SUCCESS; // } // // if(hDS == 0) // { // nStatus = COMMAND_STATUS_INVALID_ARGUMENT_VALUE; // goto MOVE_ERROR; // } // // //find the MOVE Target // bFound = FALSE; // szMoveAE = pszMoveAE; // for(lClient=0; lClientSendCMoveResponse(hNet, nPresentationID, nMessageID, pszClass, COMMAND_STATUS_PROCESSING_FAILURE, 0, 0, 0, 0, 0); // return; // } // // //get the query level // m_pLEADDICOM1->hDicomDS = (hDS); // nRet = m_pLEADDICOM1->FindFirstElement(TAG_QUERY_RETRIEVE_LEVEL, TRUE); // if(nRet != DICOM_SUCCESS) // { // nStatus = COMMAND_STATUS_INVALID_ARGUMENT_VALUE; // goto MOVE_ERROR; // } // // nRet = m_pLEADDICOM1->GetStringValue(0, 1); // if(nRet != DICOM_SUCCESS) // { // nStatus = COMMAND_STATUS_INVALID_ARGUMENT_VALUE; // goto MOVE_ERROR; // } // // szLevel = (LPSTR)m_pLEADDICOM1->GetStringValues(0); // // //do the query // if(nStatus == COMMAND_STATUS_SUCCESS) // { // szClass = pszClass; // if(szClass == UID_PATIENT_ROOT_QUERY_MOVE) // { // if(szLevel == "IMAGE") // { // m_szMoveIP = szMoveIP; // m_lMovePort = lMovePort; // DoMoveImage(hNet, nPresentationID, nMessageID, szClass, m_pLEADDICOM1, szUser, szMoveAE); // } // else // { // nStatus = COMMAND_STATUS_INVALID_ARGUMENT_VALUE; // goto MOVE_ERROR; // } // } // else // { // nStatus = COMMAND_STATUS_INVALID_ARGUMENT_VALUE; // goto MOVE_ERROR; // } // } // m_pLEADDICOM1->ResetDS(); // return; // // MOVE_ERROR: // m_pLEADDICOMNet1->SendCMoveResponse(hNet, nPresentationID, nMessageID, pszClass, nStatus, 0, 0, 0, 0, 0); // LogEvent(szUser, "C-FIND-RESPONSE sent"); // m_pLEADDICOM1->ResetDS(); // } // void CDICOMSRVDlg::OnNetConnectLeaddicomnetctrl2(long hNet, long nStatus) // { // KillTimer(m_uTimer); // // _bstr_t sMoveClass(m_szMoveClass); // _bstr_t sServerAE(m_szServerAE); // _bstr_t sMoveAE(m_szMoveAE); // // if(nStatus != DICOM_SUCCESS) //must have failed to connect // { // //error in connecting // m_pLEADDICOMNet1->SendCMoveResponse(hNet, m_nMovePresentationID, m_nMoveMessageID, sMoveClass, COMMAND_STATUS_PROCESSING_FAILURE, 0, 0, 1, 0, 0); // return; // } // // //now, we need to associate the connection // m_pLEADDICOMNet2->CreateAssociate(TRUE); // m_pLEADDICOMNet2->DefaultAssociate(m_pLEADDICOMNet2->GethPDU()); //just use default // glSec = 0; // m_uTimer = SetTimer(99, 1000, NULL); // m_pLEADDICOMNet2->SetCalling(m_pLEADDICOMNet2->GethPDU(), sServerAE); // m_pLEADDICOMNet2->SetCalled(m_pLEADDICOMNet2->GethPDU(), sMoveAE); // m_pLEADDICOMNet2->SendAssociateRequest(m_pLEADDICOMNet2->GethNet()); // } // void CDICOMSRVDlg::OnNetReceiveAssociateAcceptLeaddicomnetctrl2(long hNet, long hPDU) // { // short nRet; // short nPresentationID; // // KillTimer(m_uTimer); // _bstr_t sMoveFile(m_szMoveFile); // _bstr_t sMoveClass(m_szMoveClass); // _bstr_t sSOPInstanceUID(m_szSOPInstanceUID); // _bstr_t sMoveAE(m_szMoveAE); // // // //send a C-Store // nRet = m_pLEADDICOM2->LoadDS(sMoveFile, 0); //load the referenced file // if(nRet != DICOM_SUCCESS) // { // m_pLEADDICOMNet2->Close(m_pLEADDICOMNet2->GethNet()); // m_pLEADDICOMNet2->ShutDown(); // m_pLEADDICOMNet1->SendCMoveResponse(m_hMoveNet, m_nMovePresentationID, m_nMoveMessageID, sMoveClass, COMMAND_STATUS_PROCESSING_FAILURE, 0, 0, 1, 0, 0); // } // else // { // nPresentationID = m_pLEADDICOMNet2->FindPresentationAbstract(m_pLEADDICOMNet2->GethPDU(), sMoveClass); // nRet = m_pLEADDICOMNet2->SendCStoreRequest(hNet, nPresentationID, 1, sMoveClass, sSOPInstanceUID, 0, sMoveAE, m_nMoveMessageID, m_pLEADDICOM2->GethDicomDS()); // m_lSec = 0; // m_uTimer = SetTimer(99, 1000, NULL); // } // } // void CDICOMSRVDlg::OnNetReceiveAssociateRejectLeaddicomnetctrl2(long hNet, short nResult, short nSource, short nReason) // { // KillTimer(m_uTimer); // // _bstr_t sMoveClass(m_szMoveClass); // //error in association // m_pLEADDICOMNet2->Close(m_pLEADDICOMNet2->GethNet()); // m_pLEADDICOMNet2->ShutDown(); // m_pLEADDICOMNet1->SendCMoveResponse(m_hMoveNet, m_nMovePresentationID, m_nMoveMessageID, sMoveClass, COMMAND_STATUS_PROCESSING_FAILURE, 0, 0, 1, 0, 0); // } // void CDICOMSRVDlg::OnNetReceiveCStoreResponseLeaddicomnetctrl2(long hNet, short nPresentationID, short nMessageID, LPCTSTR pszClass, LPCTSTR pszInstance, long nStatus) // { // _bstr_t sMoveClass(m_szMoveClass); // KillTimer(m_uTimer); // m_pLEADDICOMNet2->Close(m_pLEADDICOMNet2->GethNet()); // m_pLEADDICOMNet1->SendCMoveResponse(m_hMoveNet, m_nMovePresentationID, m_nMoveMessageID, sMoveClass, nStatus, 0, 1, 0, 0, 0); // } void CDICOMSRVDlg::OnTimer(UINT nIDEvent) { _bstr_t sMoveClass(m_szMoveClass); m_lSec++; if(m_lSec > m_lTimeOut * 60) { KillTimer(m_uTimer); //timout has expired if(m_pLEADDICOMNet2->IsConnected(m_pLEADDICOMNet2->GethNet())) { m_pLEADDICOMNet2->Close(m_pLEADDICOMNet2->GethNet()); m_pLEADDICOMNet2->ShutDown(); m_pLEADDICOMNet1->SendCMoveResponse(m_hMoveNet, m_nMovePresentationID, m_nMoveMessageID, sMoveClass, COMMAND_STATUS_PROCESSING_FAILURE, 0, 0, 1, 0, 0); } } CDialog::OnTimer(nIDEvent); return; } // void CDICOMSRVDlg::OnNetExternalAuthenticateISCLLeaddicomnetctrl1(long hNet, VARIANT FAR* nChallenge, VARIANT FAR* nResponse, VARIANT FAR* nParameter) // { // if(nResponse->cyVal.int64 == nChallenge->cyVal.int64 + 1) // m_pLEADDICOMNet1->ISCLChallengeResponseSuccess = VARIANT_TRUE; // else // m_pLEADDICOMNet1->ISCLChallengeResponseSuccess = VARIANT_FALSE; // } // void CDICOMSRVDlg::OnNetGetChallengeISCLLeaddicomnetctrl1(long hNet, VARIANT FAR* nChallenge, VARIANT FAR* nParameter) // { // nChallenge->cyVal.int64 = 0x0123456789ABCDE1; // m_pLEADDICOMNet1->ISCLChallengeResponseSuccess= VARIANT_TRUE; // } // void CDICOMSRVDlg::OnNetInternalAuthenticateISCLLeaddicomnetctrl1(long hNet, VARIANT FAR* nChallenge, VARIANT FAR* nResponse, VARIANT FAR* nParameter) // { // nResponse->cyVal.int64 = nChallenge->cyVal.int64 + 1; // m_pLEADDICOMNet1->ISCLChallengeResponseSuccess= VARIANT_TRUE; // } void CDICOMSRVDlg::OnCancel() { OnServerExit(); } void CDICOMSRVDlg::OnDestroy() { CDialog::OnDestroy(); // Smart pointer--no need to Release // m_pLEADDICOMNet1->Release(); // m_pLEADDICOMNet2->Release(); // m_pLEADDICOM1->Release(); // m_pLEADDICOM2->Release(); // m_pLEADTemp->Release(); }