// NetDlg.cpp : implementation file // #include "stdafx.h" #include "NetApp.h" #include "NetDlg.h" #include "NetSecurityDlg.h" #include "Session.h" #include "Patient.h" #include "Study.h" #include "NetInfo.h" #include "Associat.h" #include "UID.h" #include "OptsDlg.h" static UINT BITMAPLIST[] = { IDB_DISCONNECTED, IDB_CONNECTED, IDB_WORKING, }; enum { COMPUTER_DISCONNECTED, COMPUTER_CONNECTED, COMPUTER_WORKING, }; static CODETEXT m_Error[] = { { DICOM_SUCCESS, "Success" }, { DICOM_ERROR_LOCKED, "Support locked" }, { DICOM_ERROR_MEMORY, "Memory not available" }, { DICOM_ERROR_OPEN, "Open file error" }, { DICOM_ERROR_READ, "Read file error" }, { DICOM_ERROR_WRITE, "Write file error" }, { DICOM_ERROR_SEEK, "Seek file error" }, { DICOM_ERROR_END, "End-of-file" }, { DICOM_ERROR_FORMAT, "Wrong file format" }, { DICOM_ERROR_PARAMETER, "Wrong parameter passed" }, { DICOM_ERROR_IMAGE, "Wrong image" }, { DICOM_ERROR_COMPRESSION, "Wrong compression type for image" }, { DICOM_ERROR_PHOTOMETRIC, "Wrong photometric type for image" }, { DICOM_ERROR_CONVERSION, "The image cannot be converted" }, { DICOM_ERROR_RANGE, "Wrong range" }, { DICOM_ERROR_BITSPERPIXEL, "Wrong BitsPerPixel for image" }, { DICOM_ERROR_QFACTOR, "Wrong QFactor for image compression" }, { DICOM_ERROR_PDU_TYPE, "Wrong PDU's type" }, { DICOM_ERROR_PDU_LENGTH, "Wrong length for this PDU" }, { DICOM_ERROR_PDU_ID, "Wronk PDU's ID" }, { DICOM_ERROR_NET_FAILURE, "General failure" }, { DICOM_ERROR_NET_ACCESS, "Broadcast address" }, { DICOM_ERROR_NET_ADDRESS_IN_USE, "Address already in use" }, { DICOM_ERROR_NET_ADDRESS_NOT_AVAILABLE, "Address not available" }, { DICOM_ERROR_NET_ADDRESS_NOT_SUPPORTED, "Address family not supported" }, { DICOM_ERROR_NET_CONNECTION_ABORTED, "Connection aborted" }, { DICOM_ERROR_NET_CONNECTION_REFUSED, "Connection rejected" }, { DICOM_ERROR_NET_CONNECTION_RESET, "Connection reset by the remote side" }, { DICOM_ERROR_NET_DESTINATION_REQUIRED, "Destination address required" }, { DICOM_ERROR_NET_ARGUMENT_INCORRECT, "Argument incorrect" }, { DICOM_ERROR_NET_IN_PROGRESS, "Operation in progress" }, { DICOM_ERROR_NET_BLOCKING_CANCELED, "Blocking call canceled" }, { DICOM_ERROR_NET_INVALID, "Invalid connection" }, { DICOM_ERROR_NET_IS_CONNECTED, "Already connected" }, { DICOM_ERROR_NET_NO_MORE_FILE, "No more descriptors available" }, { DICOM_ERROR_NET_MESSAGE_SIZE, "The datagram is larger than the maximum supported" }, { DICOM_ERROR_NET_DOWN, "Network subsystem failed" }, { DICOM_ERROR_NET_RESET, "The connection must be reset" }, { DICOM_ERROR_NET_UN_REACH, "The network can't be reached from this host at this time" }, { DICOM_ERROR_NET_NO_BUFFERS, "No buffer space is available" }, { DICOM_ERROR_NET_NOT_CONNECTED, "Not connected" }, { DICOM_ERROR_NET_NOT_SOCKET, "Wrong descriptor" }, { DICOM_ERROR_NET_OPERATION_NOT_SUPPORTED, "Connection-oriented service not supported" }, { DICOM_ERROR_NET_PROTOCOL_NOT_SUPPORTED, "Protocol not supported" }, { DICOM_ERROR_NET_PROTOCOL_TYPE, "Wrong protocol type" }, { DICOM_ERROR_NET_SHUTDOWN, "Network shut down" }, { DICOM_ERROR_NET_SOCKET_NOT_SUPPORTED, "Type not supported in this address family" }, { DICOM_ERROR_NET_TIME_OUT, "Time out" }, { DICOM_ERROR_NET_WOULD_BLOCK, "Nonblocking connection and the requested operation would block" }, { DICOM_ERROR_NET_HOST_NOT_FOUND, "Host not found" }, { DICOM_ERROR_NET_NO_DATA, "No data record of requested type" }, { DICOM_ERROR_NET_NO_RECOVERY, "Nonrecoverable errors" }, { DICOM_ERROR_NET_NOT_INITIALISED, "System not initialized" }, { DICOM_ERROR_NET_SYSTEM_NOT_READY, "Not ready for network communication" }, { DICOM_ERROR_NET_TRY_AGAIN, "Host not found, or server faild" }, { DICOM_ERROR_NET_VERSION_NOT_SUPPORTED, "Version requested not supported" }, { DICOM_ERROR_USER_CLIENT_ADDRESS, "Unrecognized client address" }, { DICOM_ERROR_USER_CLIENT_TITLE, "Unrecognized Calling AE title" }, { DICOM_ERROR_USER_SERVER_TITLE, "Unrecognized Called AE title" }, }; extern CNetApp theApp; ///////////////////////////////////////////////////////////////////////////// // CNetDlg dialog CNetDlg::CNetDlg(CWnd* pParent /*=NULL*/) : CDialog(CNetDlg::IDD, pParent), m_pDS(NULL), m_Associate(TRUE) { // L_INT j; //{{AFX_DATA_INIT(CNetDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CNetDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CNetDlg) DDX_Control(pDX, IDC_MESSAGE, m_Message); DDX_Control(pDX, IDC_KEY, m_Key); DDX_Control(pDX, IDC_DIR, m_Dir); DDX_Control(pDX, IDC_SESSION, m_Session); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CNetDlg, CDialog) //{{AFX_MSG_MAP(CNetDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_CLOSE() ON_WM_SIZE() ON_WM_TIMER() ON_NOTIFY(NM_DBLCLK, IDC_SESSION, OnDblclkSession) ON_NOTIFY(LVN_DELETEITEM, IDC_SESSION, OnDeleteitemSession) ON_NOTIFY(NM_DBLCLK, IDC_DIR, OnDblclkDir) ON_NOTIFY(TVN_SELCHANGED, IDC_DIR, OnSelchangedDir) ON_COMMAND(ID_SESSION_CONNECT, OnSessionConnect) ON_COMMAND(ID_SESSION_DISCONNECT, OnSessionDisconnect) ON_COMMAND(ID_SESSION_INSERT, OnSessionInsert) ON_COMMAND(ID_SESSION_MODIFY, OnSessionModify) ON_COMMAND(ID_SESSION_DELETE, OnSessionDelete) ON_COMMAND(ID_SESSION_INFO, OnSessionInfo) ON_COMMAND(ID_SESSION_EXIT, OnSessionExit) ON_COMMAND(ID_VIEW_NORMAL, OnViewNormal) ON_COMMAND(ID_VIEW_FIT, OnViewFit) ON_COMMAND(ID_COMMAND_C_ECHO, OnCommandCEcho) ON_COMMAND(ID_COMMAND_C_STORE, OnCommandCStore) ON_COMMAND(ID_COMMAND_C_FIND_PATIENT_ROOT, OnCommandCFindPatientRoot) ON_COMMAND(ID_COMMAND_C_FIND_STUDY_ROOT, OnCommandCFindStudyRoot) ON_COMMAND(ID_COMMAND_C_FIND_PATIENT_STUDY_ONLY, OnCommandCFindPatientStudyOnly) ON_COMMAND(ID_COMMAND_C_CANCEL, OnCommandCCancel) ON_COMMAND(ID_PREFERENCES_ASSOCIATION, OnPreferencesAssociation) ON_COMMAND(ID_PREFERENCES_UID, OnPreferencesUID) ON_WM_PALETTECHANGED() ON_WM_QUERYNEWPALETTE() ON_WM_SYSCOLORCHANGE() ON_COMMAND(ID_SECURITY_SETTINGS, OnSecuritySettings) ON_COMMAND(ID_SECURITY_NOSECUREMODE, OnSecurityNosecuremode) ON_COMMAND(ID_SECURITY_ISCLSECUREMODE, OnSecurityIsclsecuremode) ON_COMMAND(ID_SECURITY_TLSSECUREMODE, OnSecurityTlssecuremode) ON_COMMAND(ID_PREFERENCES_OPTIONS, OnPreferencesOptions) ON_COMMAND(ID_COMMAND_C_MOVE, OnCommandCMove) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CNetDlg message handlers BOOL CNetDlg::OnInitDialog() { CDialog::OnInitDialog(); // 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 if (LSettings::IsSupportLocked(L_SUPPORT_MEDICAL)) { AfxMessageBox("Medical-Express support must be unlocked for this demo!"); EndDialog(-1); } if (LSettings::IsSupportLocked(L_SUPPORT_MEDICAL_NET)) { AfxMessageBox("Medical-Express Network support must be unlocked for this demo!"); EndDialog(-1); } L_INT i; CBitmap Bitmap; m_SessionIcon.Create(34, 34, ILC_MASK, 0, sizeof(BITMAPLIST) / sizeof(BITMAPLIST[0])); for (i = 0; i < sizeof(BITMAPLIST) / sizeof(BITMAPLIST[0]); i++) { Bitmap.LoadBitmap(BITMAPLIST[i]); m_SessionIcon.Add(&Bitmap, (COLORREF)0xFFFFFF); Bitmap.DeleteObject(); } m_Session.SetImageList(&m_SessionIcon, TVSIL_NORMAL); m_bZoom = TRUE; GetMenu()->CheckMenuItem(ID_VIEW_NORMAL, (m_bZoom == FALSE) ? MF_CHECKED : MF_UNCHECKED); GetMenu()->CheckMenuItem(ID_VIEW_FIT, (m_bZoom != FALSE) ? MF_CHECKED : MF_UNCHECKED); DrawMenuBar(); m_hItem = NULL; LoadConfig(); m_nSessionIndex = 9000; m_nPresentationID = 0; m_nMessageID = 1; m_strLoadPath = ""; m_pDS = new LDicomDS((L_CHAR*)(LPCTSTR) m_strTempFilesFolder); m_SecurityMode = DICOM_SECURE_NONE; m_Client = new CNetClient((L_CHAR*)(LPCTSTR) m_strTempFilesFolder, DICOM_SECURE_NONE); m_ClientISCL = new CNetClient((L_CHAR*)(LPCTSTR) m_strTempFilesFolder, DICOM_SECURE_ISCL); m_ClientTLS = new CNetClient((L_CHAR*)(LPCTSTR) m_strTempFilesFolder, DICOM_SECURE_TLS); if (LoadFromFileSettings() == 0) { LoadDefaultSettings(); } /*m_ClientISCL->SetMutualAuthAlgISCL(m_Security.m_ISCLAuthAlg); for (j = 0; j < 8; j++) { if (m_Security.m_ISCLAuthKeys[j] != 0) { m_ClientISCL->SetMutualAuthKeyISCL(j, m_Security.m_ISCLAuthKeys[j]); } } m_ClientISCL->SetIndexForMutualAuthISCL(m_Security.m_ISCLAuthCurrentKey); m_ClientISCL->SetDefaultEncryptionISCL(m_Security.m_ISCLEncAlg); m_ClientISCL->SetDefaultSigningISCL(m_Security.m_ISCLEncSign); for (j = 0; j < 8; j++) { if (m_Security.m_ISCLEncKeys[j] != 0) { m_ClientISCL->SetEncryptKeyISCL(j, m_Security.m_ISCLEncKeys[j]); } } m_ClientISCL->SetIndexForEncryptISCL(m_Security.m_ISCLEncCurrentKey); m_ClientISCL->SetMaxMessageLengthISCL(1024); m_ClientISCL->SetMaxCommBlockLengthISCL(8129);*/ m_nQueryMethod = QUERY_PATIENT_ROOT; SetTimer(IDC_TIMER, 1000, NULL); return TRUE; // return TRUE unless you set the focus to a control } void CNetDlg::OnClose() { switch (m_SecurityMode) { case DICOM_SECURE_NONE: { m_Client->Close(); break; } case DICOM_SECURE_ISCL: { m_ClientISCL->CloseForced(TRUE); break; } } KillTimer(IDC_TIMER); SaveConfig(); m_Bitmap.SetHandle(NULL, TRUE); m_Bitmap.SetWndHandle(NULL); CDialog::OnClose(); } // 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 CNetDlg::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 { CRect rcRect, rcRect1; L_UINT32 h1; GetClientRect(rcRect); h1 = (rcRect.Height() * 7) / 10; rcRect1.SetRect(0, 0, rcRect.Width() / 2, h1); m_Dir.MoveWindow(rcRect1, TRUE); rcRect1.SetRect(rcRect.Width() / 2, 0, rcRect.Width(), h1); m_Key.MoveWindow(rcRect1, TRUE); rcRect1.SetRect(0, h1, rcRect.Width() / 2, rcRect.Height()); m_Message.MoveWindow(rcRect1, TRUE); rcRect1.SetRect(rcRect.Width() / 2, h1, rcRect.Width(), rcRect.Height()); m_Session.MoveWindow(rcRect1, TRUE); m_Bitmap.Repaint(); CDialog::OnPaint(); } } void CNetDlg::OnPaletteChanged(CWnd* pFocusWnd) { m_Bitmap.HandlePalette(WM_PALETTECHANGED, (WPARAM)pFocusWnd->m_hWnd, (LPARAM)0); CDialog::OnPaletteChanged(pFocusWnd); } void CNetDlg::OnSysColorChange() { m_Bitmap.HandlePalette(WM_SYSCOLORCHANGE, (WPARAM)0, (LPARAM)0); CDialog::OnSysColorChange(); } BOOL CNetDlg::OnQueryNewPalette() { m_Bitmap.HandlePalette(WM_QUERYNEWPALETTE, (WPARAM)0, (LPARAM)0); return CDialog::OnQueryNewPalette(); } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CNetDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CNetDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); RedrawWindow(); } void CNetDlg::OnTimer(UINT nIDEvent) { L_UINT32 nTime; L_INT nProcess; L_UINT16 nStatus; L_UINT32 nCurrent; L_INT i; LV_ITEM Item; L_UCHAR nID; CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } nCurrent = GetTickCount() / 1000; pClient->InfoProcess(nProcess, nStatus, nTime); for (i = 0; i < m_Session.GetItemCount(); i++) { if (i != m_nSessionIndex) { Item.iItem = i; Item.iSubItem = 0; Item.mask = LVIF_IMAGE; m_Session.GetItem(&Item); if (Item.iImage != COMPUTER_DISCONNECTED) { Item.iImage = COMPUTER_DISCONNECTED; m_Session.SetItem(&Item); } } } Item.iItem = m_nSessionIndex; Item.iSubItem = 0; Item.mask = LVIF_IMAGE; m_Session.GetItem(&Item); if ((nStatus == COMMAND_STATUS_PENDING) || (nStatus == COMMAND_STATUS_PENDING_WARNING)) { Item.iImage = (Item.iImage == COMPUTER_WORKING) ? COMPUTER_CONNECTED : COMPUTER_WORKING; m_Session.SetItem(&Item); } else { if (pClient->IsConnected() == FALSE) { if (Item.iImage != COMPUTER_DISCONNECTED) { Item.iImage = COMPUTER_DISCONNECTED; m_Session.SetItem(&Item); } } else { if (Item.iImage != COMPUTER_CONNECTED) { Item.iImage = COMPUTER_CONNECTED; m_Session.SetItem(&Item); } } } if (pClient->IsActivated() == FALSE) { if ((GetMenu()->GetMenuState(ID_SESSION_DISCONNECT, MF_BYCOMMAND) & MF_GRAYED) == 0) { GetMenu()->EnableMenuItem(ID_SESSION_CONNECT, MF_ENABLED); GetMenu()->EnableMenuItem(ID_SESSION_DISCONNECT, MF_GRAYED); GetMenu()->EnableMenuItem(ID_SESSION_INFO, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_ECHO, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_STORE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_PATIENT_ROOT, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_STUDY_ROOT, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_PATIENT_STUDY_ONLY, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_MOVE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_CANCEL, MF_GRAYED); GetMenu()->EnableMenuItem(ID_SECURITY_NOSECUREMODE, MF_ENABLED); GetMenu()->EnableMenuItem(ID_SECURITY_ISCLSECUREMODE, MF_ENABLED); GetMenu()->EnableMenuItem(ID_SECURITY_TLSSECUREMODE, MF_ENABLED); GetMenu()->EnableMenuItem(ID_SECURITY_SETTINGS, MF_ENABLED); DrawMenuBar(); } } else if (pClient->IsAssociated() == FALSE) { if ((GetMenu()->GetMenuState(ID_SESSION_CONNECT, MF_BYCOMMAND) & MF_GRAYED) == 0) { GetMenu()->EnableMenuItem(ID_SESSION_CONNECT, MF_GRAYED); GetMenu()->EnableMenuItem(ID_SESSION_DISCONNECT, MF_ENABLED); GetMenu()->EnableMenuItem(ID_SESSION_INFO, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_ECHO, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_STORE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_PATIENT_ROOT, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_STUDY_ROOT, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_PATIENT_STUDY_ONLY, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_MOVE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_CANCEL, MF_GRAYED); GetMenu()->EnableMenuItem(ID_SECURITY_NOSECUREMODE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_SECURITY_ISCLSECUREMODE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_SECURITY_TLSSECUREMODE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_SECURITY_SETTINGS, MF_GRAYED); DrawMenuBar(); } } else { if ((GetMenu()->GetMenuState(ID_SESSION_INFO, MF_BYCOMMAND) & MF_GRAYED) != 0) { GetMenu()->EnableMenuItem(ID_SESSION_CONNECT, MF_GRAYED); GetMenu()->EnableMenuItem(ID_SESSION_DISCONNECT, MF_ENABLED); GetMenu()->EnableMenuItem(ID_SESSION_INFO, MF_ENABLED); GetMenu()->EnableMenuItem(ID_SECURITY_NOSECUREMODE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_SECURITY_ISCLSECUREMODE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_SECURITY_TLSSECUREMODE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_SECURITY_SETTINGS, MF_GRAYED); DrawMenuBar(); } if ((nStatus == COMMAND_STATUS_PENDING) || (nStatus == COMMAND_STATUS_PENDING_WARNING)) { if ((pClient->IsAssociated()) && ((GetMenu()->GetMenuState(ID_COMMAND_C_CANCEL, MF_BYCOMMAND) & MF_GRAYED) != 0)) { GetMenu()->EnableMenuItem(ID_COMMAND_C_CANCEL, MF_ENABLED); DrawMenuBar(); } if ((pClient->IsAssociated()) && ((GetMenu()->GetMenuState(ID_COMMAND_C_ECHO, MF_BYCOMMAND) & MF_GRAYED) == 0)) { GetMenu()->EnableMenuItem(ID_COMMAND_C_ECHO, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_STORE, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_PATIENT_ROOT, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_STUDY_ROOT, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_PATIENT_STUDY_ONLY, MF_GRAYED); GetMenu()->EnableMenuItem(ID_COMMAND_C_MOVE, MF_GRAYED); DrawMenuBar(); } } else { if ((GetMenu()->GetMenuState(ID_COMMAND_C_CANCEL, MF_BYCOMMAND) & MF_GRAYED) == 0) { GetMenu()->EnableMenuItem(ID_COMMAND_C_CANCEL, MF_GRAYED); DrawMenuBar(); } if ((GetMenu()->GetMenuState(ID_COMMAND_C_STORE, MF_BYCOMMAND) & MF_GRAYED) != 0) { GetMenu()->EnableMenuItem(ID_COMMAND_C_STORE, MF_ENABLED); DrawMenuBar(); } nID = pClient->GetAssociate()->FindAbstract(UID_VERIFICATION_CLASS); if ((nID == 0) || (pClient->GetAssociate()->GetResult(nID) != PDU_ACCEPT_RESULT_SUCCESS)) { if ((GetMenu()->GetMenuState(ID_COMMAND_C_ECHO, MF_BYCOMMAND) & MF_GRAYED) == 0) { GetMenu()->EnableMenuItem(ID_COMMAND_C_ECHO, MF_GRAYED); DrawMenuBar(); } } else { if ((GetMenu()->GetMenuState(ID_COMMAND_C_ECHO, MF_BYCOMMAND) & MF_GRAYED) != 0) { GetMenu()->EnableMenuItem(ID_COMMAND_C_ECHO, MF_ENABLED); DrawMenuBar(); } } nID = pClient->GetAssociate()->FindAbstract(UID_PATIENT_ROOT_QUERY_FIND); if ((nID == 0) || (pClient->GetAssociate()->GetResult(nID) != PDU_ACCEPT_RESULT_SUCCESS)) { if ((GetMenu()->GetMenuState(ID_COMMAND_C_FIND_PATIENT_ROOT, MF_BYCOMMAND) & MF_GRAYED) == 0) { GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_PATIENT_ROOT, MF_GRAYED); DrawMenuBar(); } } else { if ((GetMenu()->GetMenuState(ID_COMMAND_C_FIND_PATIENT_ROOT, MF_BYCOMMAND) & MF_GRAYED) != 0) { GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_PATIENT_ROOT, MF_ENABLED); DrawMenuBar(); } } nID = pClient->GetAssociate()->FindAbstract(UID_STUDY_ROOT_QUERY_FIND); if ((nID == 0) || (pClient->GetAssociate()->GetResult(nID) != PDU_ACCEPT_RESULT_SUCCESS)) { if ((GetMenu()->GetMenuState(ID_COMMAND_C_FIND_STUDY_ROOT, MF_BYCOMMAND) & MF_GRAYED) == 0) { GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_STUDY_ROOT, MF_GRAYED); DrawMenuBar(); } } else { if ((GetMenu()->GetMenuState(ID_COMMAND_C_FIND_STUDY_ROOT, MF_BYCOMMAND) & MF_GRAYED) != 0) { GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_STUDY_ROOT, MF_ENABLED); DrawMenuBar(); } } nID = pClient->GetAssociate()->FindAbstract(UID_PATIENT_STUDY_QUERY_FIND); if ((nID == 0) || (pClient->GetAssociate()->GetResult(nID) != PDU_ACCEPT_RESULT_SUCCESS)) { if ((GetMenu()->GetMenuState(ID_COMMAND_C_FIND_PATIENT_STUDY_ONLY, MF_BYCOMMAND) & MF_GRAYED) == 0) { GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_PATIENT_STUDY_ONLY, MF_GRAYED); DrawMenuBar(); } } else { if ((GetMenu()->GetMenuState(ID_COMMAND_C_FIND_PATIENT_STUDY_ONLY, MF_BYCOMMAND) & MF_GRAYED) != 0) { GetMenu()->EnableMenuItem(ID_COMMAND_C_FIND_PATIENT_STUDY_ONLY, MF_ENABLED); DrawMenuBar(); } } L_BOOL bEnable = TRUE; HTREEITEM hDirItem = m_Dir.GetSelectedItem(); if (hDirItem) { L_CHAR* pszDRType = m_pDS->GetValueKey((pDICOMELEMENT) m_Dir.GetItemData(hDirItem)); if (lstrcmpi("IMAGE", pszDRType) == 0) { if ((m_Dir.GetItemState(hDirItem, TVIS_BOLD) & TVIS_BOLD) == 0) bEnable = FALSE; } } nID = 0; switch (m_nQueryMethod) { case QUERY_PATIENT_ROOT: nID = pClient->GetAssociate()->FindAbstract(UID_PATIENT_ROOT_QUERY_MOVE); break; case QUERY_STUDY_ROOT: nID = pClient->GetAssociate()->FindAbstract(UID_STUDY_ROOT_QUERY_MOVE); break; case QUERY_PATIENT_STUDY_ONLY: nID = pClient->GetAssociate()->FindAbstract(UID_PATIENT_STUDY_QUERY_MOVE); break; } if (hDirItem == NULL || bEnable == FALSE || nID == 0 || pClient->GetAssociate()->GetResult(nID) != PDU_ACCEPT_RESULT_SUCCESS) { if ((GetMenu()->GetMenuState(ID_COMMAND_C_MOVE, MF_BYCOMMAND) & MF_GRAYED) == 0) { GetMenu()->EnableMenuItem(ID_COMMAND_C_MOVE, MF_GRAYED); DrawMenuBar(); } } else { if ((GetMenu()->GetMenuState(ID_COMMAND_C_MOVE, MF_BYCOMMAND) & MF_GRAYED) != 0) { GetMenu()->EnableMenuItem(ID_COMMAND_C_MOVE, MF_ENABLED); DrawMenuBar(); } } } } if ((nTime > m_nTimeout) && (m_nTimeout != 0) && ((nStatus == COMMAND_STATUS_PENDING) || (nStatus == COMMAND_STATUS_PENDING_WARNING))) { pClient->StopProcess(); switch (nProcess) { case PROCESS_CONNECT: // ad this: pClient->CloseForced(TRUE); break; case PROCESS_ASSOCIATE: case PROCESS_RELEASE: case PROCESS_ABORT: case PROCESS_CLOSE: pClient->Close(); break; } } CDialog::OnTimer(nIDEvent); } void CNetDlg::OnDblclkSession(NMHDR* pNMHDR, LRESULT* pResult) { if (pNMHDR->idFrom == IDC_SESSION) { OnSessionConnect(); } *pResult = 0; } void CNetDlg::OnDeleteitemSession(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } if ((pNMListView != NULL) && (pNMListView->lParam != NULL)) { pClient->Close(); delete (CNetSession *)pNMListView->lParam; } *pResult = 0; } L_VOID CNetDlg::CopyTagKey(LDicomDS *pSrcDS, LDicomDS *pDstDS, pDICOMELEMENT pElement, CString strKey, L_UINT32 nTag) { L_CHAR *pszKey; L_CHAR *pszValue; L_UINT32 nLength; pDICOMELEMENT pChild; pDICOMELEMENT pNew; pNew = pDstDS->FindFirstElement(NULL, nTag, TRUE); if (pNew == NULL) { pNew = pDstDS->InsertElement(NULL, FALSE, nTag, 0, FALSE, 0); if (pNew == NULL) { return; } } while (pElement != NULL) { pszKey = pSrcDS->GetValueKey(pElement); if ((pszKey != NULL) && (strKey == pszKey)) { pChild = pSrcDS->GetChildElement(pElement, TRUE); if (pChild == NULL) { break; } pChild = pSrcDS->FindFirstElement(pChild, nTag, TRUE); if (pChild == NULL) { break; } nLength = pSrcDS->GetConvertValue(pChild, NULL); if (nLength > 0) { pszValue = (L_CHAR *)malloc(nLength); if (pszValue == NULL) { break; } pSrcDS->GetConvertValue(pChild, pszValue); pDstDS->SetConvertValue(pNew, pszValue, 1); free(pszValue); } break; } pElement = pSrcDS->GetParentKey(pElement); } } L_BOOL CNetDlg::CheckAvailability(pDICOMELEMENT pImageDR) { if (pImageDR) { pDICOMELEMENT pElement = m_pDS->GetChildElement(pImageDR, TRUE); if (pElement) { pElement = m_pDS->FindFirstElement(pElement, TAG_INSTANCE_AVAILABILITY, TRUE); if (pElement) { L_CHAR* pszInstanceAvailability = m_pDS->GetStringValue(pElement, 0, 1); if (pszInstanceAvailability) { if (lstrcmpi("OFFLINE", pszInstanceAvailability) == 0) { m_pDS->FreeValue(pElement); AfxMessageBox("The instance is OFFLINE."); return FALSE; } else if (lstrcmpi("NEARLINE", pszInstanceAvailability) == 0) { m_pDS->FreeValue(pElement); L_CHAR* pszMessage = "The instance needs to be retrieved from relatively " \ "slow media such as optical disk or tape. Do you " \ "want to proceed?"; if (AfxMessageBox(pszMessage, MB_YESNO) == IDYES) { return TRUE; } else { return FALSE; } } m_pDS->FreeValue(pElement); } } } } return TRUE; } L_BOOL CNetDlg::ChangeTransferSyntax(LDicomDS& DataSet, LDicomAssociate& Associate) { pDICOMELEMENT pElement; // Get the Transfer Syntax used to encode the Data Set CString strDataSetTS; pElement = DataSet.FindFirstElement(NULL, TAG_TRANSFER_SYNTAX_UID, FALSE); if (pElement) { strDataSetTS = DataSet.GetStringValue(pElement, 0, 1); DataSet.FreeValue(pElement); } if (strDataSetTS.IsEmpty()) { strDataSetTS = UID_IMPLICIT_VR_LITTLE_ENDIAN; } // Get the associated Transfer Syntax CString strAssociatedTS = Associate.GetTransfer(m_nPresentationID, 0); // No need to change the Transfer Syntax if they are the same. if (strDataSetTS == strAssociatedTS) { return TRUE; } // Also, no need to change the Transfer Syntax explicitly if both belong to this group // of Transfer Syntaxes. if (strAssociatedTS == UID_IMPLICIT_VR_LITTLE_ENDIAN || strAssociatedTS == UID_EXPLICIT_VR_LITTLE_ENDIAN || strAssociatedTS == UID_EXPLICIT_VR_BIG_ENDIAN) { if (strDataSetTS == UID_IMPLICIT_VR_LITTLE_ENDIAN || strDataSetTS == UID_EXPLICIT_VR_LITTLE_ENDIAN || strDataSetTS == UID_EXPLICIT_VR_BIG_ENDIAN) { return TRUE; } } /* We need to change the Transfer Syntax of the Data Set */ CString strMessage; strMessage.Format("Sorry, the Transfer Syntax (%s) used to encode the Data Set doesn't " \ "match the associated Transfer Syntax (%s) for the Abstract Syntax " \ "(%s) of the Presentation ID (%u).\n\nIn order to store the image " \ "using the current association, LEADTOOLS must change the Transfer " \ "Syntax of the Data Set. Press Yes if you would like to continue.", strDataSetTS, strAssociatedTS, Associate.GetAbstract(m_nPresentationID), m_nPresentationID); if (AfxMessageBox(strMessage, MB_YESNO) != IDYES) { return FALSE; } if (DataSet.ChangeTransferSyntax((L_CHAR*)(LPCTSTR) strAssociatedTS, 2, 0) != DICOM_SUCCESS) { AfxMessageBox("Failed to change the Transfer Syntax.", MB_OK | MB_ICONERROR); return FALSE; } // Has the image undergone a lossy compression? if (strDataSetTS == UID_JPEG_BASELINE_1 || strDataSetTS == UID_JPEG_EXTENDED_2_4 || strDataSetTS == UID_JPEG_EXTENDED_3_5 || strDataSetTS == UID_JPEG_SPECTRAL_NONHIER_6_8 || strDataSetTS == UID_JPEG_SPECTRAL_NONHIER_7_9 || strDataSetTS == UID_JPEG_FULL_NONHIER_10_12 || strDataSetTS == UID_JPEG_FULL_NONHIER_11_13 || strDataSetTS == UID_JPEG_EXTENDED_HIER_16_18 || strDataSetTS == UID_JPEG_EXTENDED_HIER_17_19 || strDataSetTS == UID_JPEG_SPECTRAL_HIER_20_22 || strDataSetTS == UID_JPEG_SPECTRAL_HIER_21_23 || strDataSetTS == UID_JPEG_FULL_HIER_24_26 || strDataSetTS == UID_JPEG_FULL_HIER_25_27) { pElement = DataSet.FindFirstElement(NULL, TAG_LOSSY_IMAGE_COMPRESSION, FALSE); if (pElement == NULL) { pElement = DataSet.InsertElement(NULL, FALSE, TAG_LOSSY_IMAGE_COMPRESSION, VR_CS, FALSE, 0); } if (pElement) { DataSet.SetStringValue(pElement, "01", 1); } } return TRUE; } L_VOID CNetDlg::InitializeOptions() { TCHAR szBuffer[MAX_PATH]; if (GetModuleFileName(NULL, szBuffer, MAX_PATH)) { m_strFolder = szBuffer; m_strFolder = m_strFolder.Left(m_strFolder.ReverseFind('\\') + 1); } m_strExtension = "dcm"; LPTSTR pszBuffer; DWORD dwLength = GetTempPath(0, NULL); if (dwLength) { pszBuffer = new TCHAR[dwLength]; if (pszBuffer) { if (GetTempPath(dwLength, pszBuffer)) { m_strTempFilesFolder = pszBuffer; } delete [] pszBuffer; } } if (m_strTempFilesFolder.IsEmpty()) { m_strTempFilesFolder = m_strFolder; } } void CNetDlg::OnDblclkDir(NMHDR* pNMHDR, LRESULT* pResult) { HTREEITEM hItem; pDICOMELEMENT pParent; pDICOMELEMENT pElement; L_INT nResult; CString strClass; L_BOOL bFind=TRUE; L_INT nProcess; L_UINT16 nStatus; L_UINT32 nTime; LDicomDS DS((L_CHAR*)(LPCTSTR) m_strTempFilesFolder); *pResult = 0; CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } hItem = m_Dir.GetSelectedItem(); if (hItem == NULL) { return; } pClient->InfoProcess(nProcess, nStatus, nTime); pParent = (pDICOMELEMENT) m_Dir.GetItemData(hItem); if (((m_Dir.GetItemState(hItem, TVIS_BOLD) & TVIS_BOLD) == 0) || (pParent == NULL) || (m_pDS->ExistsElement(pParent) == FALSE) || (pClient->IsAssociated() == FALSE) || (nStatus == COMMAND_STATUS_PENDING) || (nStatus == COMMAND_STATUS_PENDING_WARNING)) { return; } m_hItem = hItem; switch (m_nQueryMethod) { case QUERY_PATIENT_ROOT: if (m_pDS->GetParentKey(pParent) == NULL) { DS.InitDS(CLASS_PATIENT_ROOT_QUERY_STUDY, DS_METAHEADER_ABSENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR); pElement = DS.FindFirstElement(NULL, TAG_QUERY_RETRIEVE_LEVEL, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_QUERY_RETRIEVE_LEVEL, 0, FALSE, 0); } if (pElement != NULL) { DS.SetStringValue(pElement, "STUDY", 1); } CopyTagKey(m_pDS, &DS, pParent, "PATIENT", TAG_PATIENT_ID); } else if (m_pDS->GetParentKey(m_pDS->GetParentKey(pParent)) == NULL) { DS.InitDS(CLASS_PATIENT_ROOT_QUERY_SERIES, DS_METAHEADER_ABSENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR); pElement = DS.FindFirstElement(NULL, TAG_QUERY_RETRIEVE_LEVEL, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_QUERY_RETRIEVE_LEVEL, 0, FALSE, 0); } if (pElement != NULL) { DS.SetStringValue(pElement, "SERIES", 1); } CopyTagKey(m_pDS, &DS, pParent, "PATIENT", TAG_PATIENT_ID); CopyTagKey(m_pDS, &DS, pParent, "STUDY", TAG_STUDY_INSTANCE_UID); } else if (m_pDS->GetParentKey(m_pDS->GetParentKey(m_pDS->GetParentKey(pParent))) == NULL) { DS.InitDS(CLASS_PATIENT_ROOT_QUERY_IMAGE, DS_METAHEADER_ABSENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR); pElement = DS.FindFirstElement(NULL, TAG_QUERY_RETRIEVE_LEVEL, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_QUERY_RETRIEVE_LEVEL, 0, FALSE, 0); } if (pElement != NULL) { DS.SetStringValue(pElement, "IMAGE", 1); } CopyTagKey(m_pDS, &DS, pParent, "PATIENT", TAG_PATIENT_ID); CopyTagKey(m_pDS, &DS, pParent, "STUDY", TAG_STUDY_INSTANCE_UID); CopyTagKey(m_pDS, &DS, pParent, "SERIES", TAG_SERIES_INSTANCE_UID); } else if (m_pDS->GetParentKey(m_pDS->GetParentKey(m_pDS->GetParentKey(m_pDS->GetParentKey(pParent)))) == NULL) { if (CheckAvailability(pParent) == FALSE) { return; } bFind = FALSE; DS.InitDS(CLASS_UNKNOWN, DS_LITTLE_ENDIAN | DS_EXPLICIT_VR); pElement = DS.FindFirstElement(NULL, TAG_QUERY_RETRIEVE_LEVEL, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_QUERY_RETRIEVE_LEVEL, 0, FALSE, 0); } if (pElement != NULL) { DS.SetStringValue(pElement, "IMAGE", 1); } CopyTagKey(m_pDS, &DS, pParent, "PATIENT", TAG_PATIENT_ID); CopyTagKey(m_pDS, &DS, pParent, "STUDY", TAG_STUDY_INSTANCE_UID); CopyTagKey(m_pDS, &DS, pParent, "SERIES", TAG_SERIES_INSTANCE_UID); CopyTagKey(m_pDS, &DS, pParent, "IMAGE", TAG_SOP_INSTANCE_UID); } else { return; } break; case QUERY_STUDY_ROOT: if (m_pDS->GetParentKey(pParent) == NULL) { DS.InitDS(CLASS_STUDY_ROOT_QUERY_SERIES, DS_METAHEADER_ABSENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR); pElement = DS.FindFirstElement(NULL, TAG_QUERY_RETRIEVE_LEVEL, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_QUERY_RETRIEVE_LEVEL, 0, FALSE, 0); } if (pElement != NULL) { DS.SetStringValue(pElement, "SERIES", 1); } CopyTagKey(m_pDS, &DS, pParent, "STUDY", TAG_STUDY_INSTANCE_UID); } else if (m_pDS->GetParentKey(m_pDS->GetParentKey(pParent)) == NULL) { DS.InitDS(CLASS_STUDY_ROOT_QUERY_IMAGE, DS_METAHEADER_ABSENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR); pElement = DS.FindFirstElement(NULL, TAG_QUERY_RETRIEVE_LEVEL, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_QUERY_RETRIEVE_LEVEL, 0, FALSE, 0); } if (pElement != NULL) { DS.SetStringValue(pElement, "IMAGE", 1); } CopyTagKey(m_pDS, &DS, pParent, "STUDY", TAG_STUDY_INSTANCE_UID); CopyTagKey(m_pDS, &DS, pParent, "SERIES", TAG_SERIES_INSTANCE_UID); } else if (m_pDS->GetParentKey(m_pDS->GetParentKey(m_pDS->GetParentKey(pParent))) == NULL) { if (CheckAvailability(pParent) == FALSE) { return; } bFind = FALSE; DS.InitDS(CLASS_UNKNOWN, DS_LITTLE_ENDIAN | DS_EXPLICIT_VR); pElement = DS.FindFirstElement(NULL, TAG_QUERY_RETRIEVE_LEVEL, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_QUERY_RETRIEVE_LEVEL, 0, FALSE, 0); } if (pElement != NULL) { DS.SetStringValue(pElement, "IMAGE", 1); } CopyTagKey(m_pDS, &DS, pParent, "STUDY", TAG_STUDY_INSTANCE_UID); CopyTagKey(m_pDS, &DS, pParent, "SERIES", TAG_SERIES_INSTANCE_UID); CopyTagKey(m_pDS, &DS, pParent, "IMAGE", TAG_SOP_INSTANCE_UID); } else { return; } break; case QUERY_PATIENT_STUDY_ONLY: if (m_pDS->GetParentKey(pParent) == NULL) { DS.InitDS(CLASS_PATIENT_STUDY_QUERY_STUDY, DS_METAHEADER_ABSENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR); pElement = DS.FindFirstElement(NULL, TAG_QUERY_RETRIEVE_LEVEL, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_QUERY_RETRIEVE_LEVEL, 0, FALSE, 0); } if (pElement != NULL) { DS.SetStringValue(pElement, "STUDY", 1); } CopyTagKey(m_pDS, &DS, pParent, "PATIENT", TAG_PATIENT_ID); } else { return; } break; } LDicomAssociate* pAssociate = pClient->GetAssociate(); if (bFind) { switch (m_nQueryMethod) { case QUERY_PATIENT_ROOT: strClass = UID_PATIENT_ROOT_QUERY_FIND; break; case QUERY_STUDY_ROOT: strClass = UID_STUDY_ROOT_QUERY_FIND; break; case QUERY_PATIENT_STUDY_ONLY: strClass = UID_PATIENT_STUDY_QUERY_FIND; break; } m_nPresentationID = pAssociate->FindAbstract((L_CHAR *)(LPCTSTR)strClass); if ((m_nPresentationID == 0) || (pAssociate->GetResult(m_nPresentationID) != PDU_ACCEPT_RESULT_SUCCESS)) { pClient->DisplayMessage("Send C-Find Request: Presentation ID not found", -1, TVI_ROOT); return; } pClient->m_strRetrieveAEsMsg = ""; pClient->StartProcess(PROCESS_C_FIND); nResult = pClient->SendCFindRequest(m_nPresentationID, m_nMessageID++, (L_CHAR *)(LPCTSTR)strClass, COMMAND_PRIORITY_MEDIUM, &DS); pClient->DisplayMessage("Send C-Find Request", nResult, TVI_ROOT); } else { switch (m_nQueryMethod) { case QUERY_PATIENT_ROOT: strClass = UID_PATIENT_ROOT_QUERY_MOVE; break; case QUERY_STUDY_ROOT: strClass = UID_STUDY_ROOT_QUERY_MOVE; break; case QUERY_PATIENT_STUDY_ONLY: strClass = UID_PATIENT_STUDY_QUERY_MOVE; break; } m_nPresentationID = pAssociate->FindAbstract((L_CHAR *)(LPCTSTR)strClass); if ((m_nPresentationID == 0) || (pAssociate->GetResult(m_nPresentationID) != PDU_ACCEPT_RESULT_SUCCESS)) { pClient->DisplayMessage("Send C-Move Request: Presentation ID not found", -1, TVI_ROOT); return; } pClient->StartProcess(PROCESS_C_MOVE); nResult = pClient->SendCMoveRequest(m_nPresentationID, m_nMessageID++, (L_CHAR *)(LPCTSTR)strClass, COMMAND_PRIORITY_MEDIUM, m_Associate.GetCalling(), &DS); pClient->DisplayMessage("Send C-Move Request", nResult, TVI_ROOT); } if (nResult != DICOM_SUCCESS) { pClient->StopProcess(); } } void CNetDlg::OnSelchangedDir(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*) pNMHDR; pDICOMELEMENT pElement; CRect rcRect; LBitmap Bitmap; CNetClient* pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } pElement = (pDICOMELEMENT) pNMTreeView->itemNew.lParam; if (pElement == NULL) { *pResult = 0; m_Key.DeleteAllItems(); return; } if (m_pDS->ExistsElement(pElement) == FALSE) { *pResult = 0; return; } if (!DisplayImage(pElement)) { m_Key.LockWindowUpdate(); m_Key.DeleteAllItems(); m_Bitmap.SetHandle(NULL, TRUE); m_Bitmap.SetWndHandle(NULL); pClient->DisplayTree(&m_Key, m_pDS, TVI_ROOT, pElement, DISPLAY_TREE_VALUES | DISPLAY_TREE_EXPANDED); m_Key.UnlockWindowUpdate(); m_Key.SelectItem(m_Key.GetFirstVisibleItem()); } *pResult = 0; } void CNetDlg::OnSessionConnect() { L_INT i, j; L_INT nResult; CNetSession *pSession; CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } if(m_Session.GetItemCount() < 1) { MessageBox("You must add a connection first!", "Notice", MB_OK); return; } for (i = 0; i < m_Session.GetItemCount(); i++) { if (m_Session.GetItemState(i, LVIS_SELECTED)) { pSession = (CNetSession *)m_Session.GetItemData(i); if (pSession == NULL) { break; } m_nSessionIndex = i; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { break; } case DICOM_SECURE_ISCL: { m_ClientISCL->SetMutualAuthAlgISCL(m_ISCLAuthAlg); for (j = 0; j < 8; j++) { if (m_ISCLAuthKeys[j] != 0) { m_ClientISCL->SetMutualAuthKeyISCL(j+1, m_ISCLAuthKeys[j]); } } m_ClientISCL->SetIndexForMutualAuthISCL(m_ISCLAuthCurrentKey+1); m_ClientISCL->SetDefaultEncryptionISCL(m_ISCLEncAlg); m_ClientISCL->SetDefaultSigningISCL(m_ISCLEncSign); for (j = 0; j < 8; j++) { if (m_ISCLEncKeys[j] != 0) { m_ClientISCL->SetEncryptKeyISCL(j+1, m_ISCLEncKeys[j]); } } m_ClientISCL->SetIndexForEncryptISCL(m_ISCLEncCurrentKey+1); m_ClientISCL->SetMaxMessageLengthISCL(1024000); m_ClientISCL->SetMaxCommBlockLengthISCL(8129); m_ClientISCL->SetAuthDataISCL(CLIENT_AUTH_DATA, CLIENT_AUTH_DATA_LEN); break; } case DICOM_SECURE_TLS: { // initialisation of m_pClientTLS object in TLS mode L_UINT32 ret; ret = m_ClientTLS->SetCipherToIndexTLS(0, TLS_DHE_RSA_WITH_DES_CBC_SHA); char szpath[_MAX_PATH]; char szdrive[_MAX_PATH]; char szdir[_MAX_PATH]; CString csPath; GetModuleFileName(NULL, szpath, _MAX_PATH); _splitpath(szpath, szdrive, szdir, NULL, NULL ); csPath.Format("%s%s%s",szdrive,szdir,CLIENT_CERT_NAME); ret = m_ClientTLS->SetClientCertificateTLS((L_CHAR*)(LPCSTR)csPath, L_TLS_FILETYPE_PEM, NULL); if(ret!=DICOM_SUCCESS) { // reset the password so reprompted next secure connect theApp.bValidPrivateKeyPassword = FALSE; theApp.strPrivateKeyPassword = ""; MessageBox("Error Setting TLS Certificate - Non-Secure", "Error", MB_OK|MB_ICONERROR); //GetMenu()->EnableMenuItem(ID_SECURITY_TLSSECUREMODE, MF_GRAYED|MF_DISABLED); m_SecurityMode = DICOM_SECURE_NONE; OnSecurityNosecuremode(); } else { theApp.bValidPrivateKeyPassword = TRUE; } break; } } m_pDS->InitDS(CLASS_BASIC_DIRECTORY, DS_METAHEADER_PRESENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR|DS_GROUP_LENGTHS); m_Dir.DeleteAllItems(); m_Key.DeleteAllItems(); m_Message.DeleteAllItems(); m_Bitmap.SetHandle(NULL, TRUE); m_Bitmap.SetWndHandle(NULL); pClient->StartProcess(PROCESS_CONNECT); nResult = pClient->Connect(pSession->m_strServerTitle, pSession->m_strServerAddress, pSession->m_nServerPort, pSession->m_strClientTitle, pSession->m_nClientPort, &m_Associate); if (nResult != DICOM_SUCCESS) { pClient->StopProcess(); } break; } } } void CNetDlg::OnSessionDisconnect() { L_INT nResult; CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } pClient->StartProcess(PROCESS_RELEASE); nResult = pClient->SendReleaseRequest(); pClient->DisplayMessage("Send Release Request", nResult, TVI_ROOT); if (nResult != DICOM_SUCCESS) { pClient->StopProcess(); pClient->Close(); } } void CNetDlg::OnSessionInsert() { CNetSessionDlg dlg; L_INT nItem; CNetSession *pSession; pSession = new CNetSession; if (pSession == NULL) { return; } pSession->m_strNickname = ""; pSession->m_strServerTitle = ""; pSession->m_strServerAddress = ""; pSession->m_nServerPort = 0; pSession->m_strClientTitle = ""; pSession->m_nClientPort = 0; dlg.m_pSession = pSession; if (dlg.DoModal() != IDOK) { delete pSession; return; } nItem = m_Session.InsertItem(m_Session.GetItemCount(), pSession->m_strNickname, COMPUTER_DISCONNECTED); m_Session.SetItemState(nItem, LVIS_FOCUSED|LVIS_SELECTED, LVIS_FOCUSED|LVIS_SELECTED); m_Session.SetItemData(nItem, (DWORD)pSession); } void CNetDlg::OnSessionModify() { CNetSessionDlg dlg; CNetSession *pSession; L_INT i; CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } for (i = 0; i < m_Session.GetItemCount(); i++) { if (m_Session.GetItemState(i, LVIS_SELECTED)) { pSession = (CNetSession *)m_Session.GetItemData(i); if (pSession == 0) { return; } dlg.m_pSession = pSession; if (dlg.DoModal() != IDOK) { return; } m_Session.SetItemText(i, 0, pSession->m_strNickname); pClient->Close(); return; } } } void CNetDlg::OnSessionDelete() { L_INT i; CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } for (i = 0; i < m_Session.GetItemCount(); i++) { if (m_Session.GetItemState(i, LVIS_SELECTED)) { pClient->Close(); m_Session.DeleteItem(i); return; } } } void CNetDlg::OnSessionInfo() { CNetInfoDlg dlg; CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } if (pClient->IsAssociated() == FALSE) { return; } dlg.m_pAssociate = pClient->GetAssociate(); dlg.DoModal(); } void CNetDlg::OnSessionExit() { PostMessage(WM_CLOSE, 0, 0); } void CNetDlg::OnViewNormal() { m_bZoom = FALSE; GetMenu()->CheckMenuItem(ID_VIEW_NORMAL, (m_bZoom == FALSE) ? MF_CHECKED : MF_UNCHECKED); GetMenu()->CheckMenuItem(ID_VIEW_FIT, (m_bZoom != FALSE) ? MF_CHECKED : MF_UNCHECKED); DrawMenuBar(); m_Bitmap.SetZoomMode((m_bZoom == 0) ? ZOOM_NORMAL : ZOOM_FIT); } void CNetDlg::OnViewFit() { m_bZoom = TRUE; GetMenu()->CheckMenuItem(ID_VIEW_NORMAL, (m_bZoom == FALSE) ? MF_CHECKED : MF_UNCHECKED); GetMenu()->CheckMenuItem(ID_VIEW_FIT, (m_bZoom != FALSE) ? MF_CHECKED : MF_UNCHECKED); DrawMenuBar(); m_Bitmap.SetZoomMode((m_bZoom == FALSE) ? ZOOM_NORMAL : ZOOM_FIT); } void CNetDlg::OnCommandCEcho() { L_INT nResult; CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } m_nPresentationID = pClient->GetAssociate()->FindAbstract(UID_VERIFICATION_CLASS); if ((m_nPresentationID == 0) || (pClient->GetAssociate()->GetResult(m_nPresentationID) != PDU_ACCEPT_RESULT_SUCCESS)) { pClient->DisplayMessage("Send C-Echo Request: Presentation ID not found", -1, TVI_ROOT); return; } pClient->StartProcess(PROCESS_C_ECHO); nResult = pClient->SendCEchoRequest(m_nPresentationID, m_nMessageID++, UID_VERIFICATION_CLASS); pClient->DisplayMessage("Send C-Echo Request", nResult, TVI_ROOT); if (nResult != DICOM_SUCCESS) { pClient->StopProcess(); } } void CNetDlg::OnCommandCStore() { L_INT nResult; pDICOMELEMENT pElement; CString strClass, strInstance, strName; LDicomDS DS((L_CHAR*)(LPCTSTR) m_strTempFilesFolder); CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } if (OpenDlg("Load DICOM File", TRUE, strName, m_strLoadPath) == FALSE) { return; } nResult = DS.LoadDS((L_CHAR *)(LPCTSTR)strName, DS_LOAD_CLOSE); if (nResult != DICOM_SUCCESS) { pClient->DisplayMessage("Send C-Store Request", nResult, TVI_ROOT); return; } pElement = DS.FindFirstElement(NULL, TAG_MEDIA_STORAGE_SOP_CLASS_UID, TRUE); if (pElement != NULL) { strClass = DS.GetStringValue(pElement, 0, 1); } if (strClass.IsEmpty()) { pElement = DS.FindFirstElement(NULL, TAG_SOP_CLASS_UID, TRUE); if (pElement != NULL) { strClass = DS.GetStringValue(pElement, 0, 1); } } pElement = DS.FindFirstElement(NULL, TAG_SOP_INSTANCE_UID, TRUE); if (pElement != NULL) { strInstance = DS.GetStringValue(pElement, 0, 1); } LDicomAssociate* pAssociate = pClient->GetAssociate(); m_nPresentationID = pAssociate->FindAbstract((L_CHAR*)(LPCTSTR) strClass); if ((m_nPresentationID == 0) || (pAssociate->GetResult(m_nPresentationID) != PDU_ACCEPT_RESULT_SUCCESS)) { pClient->DisplayMessage("Send C-Store Request: Presentation ID not found", -1, TVI_ROOT); return; } if (!ChangeTransferSyntax(DS, *pAssociate)) { return; } pClient->StartProcess(PROCESS_C_STORE); nResult = pClient->SendCStoreRequest(m_nPresentationID, m_nMessageID++, (L_CHAR*)(LPCTSTR) strClass, strInstance.IsEmpty() ? "998.998.1.19950214.94000.1.102" : (L_CHAR*)(LPCTSTR) strInstance, COMMAND_PRIORITY_MEDIUM, m_Associate.GetCalled(), 0, &DS); pClient->DisplayMessage("Send C-Store Request", nResult, TVI_ROOT); if (nResult != DICOM_SUCCESS) { pClient->StopProcess(); } } void CNetDlg::OnCommandCFindPatientRoot() { L_INT nResult; pDICOMELEMENT pElement; CNetFindPatientDlg dlg; LDicomDS DS((L_CHAR*)(LPCTSTR) m_strTempFilesFolder); CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } if (dlg.DoModal() != IDOK) { return; } m_nQueryMethod = QUERY_PATIENT_ROOT; m_pDS->InitDS(CLASS_BASIC_DIRECTORY, DS_METAHEADER_PRESENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR|DS_GROUP_LENGTHS); m_Dir.DeleteAllItems(); m_Key.DeleteAllItems(); m_hItem = NULL; m_Bitmap.SetHandle(NULL, TRUE); m_Bitmap.SetWndHandle(NULL); m_nPresentationID = pClient->GetAssociate()->FindAbstract(UID_PATIENT_ROOT_QUERY_FIND); if ((m_nPresentationID == 0) || (pClient->GetAssociate()->GetResult(m_nPresentationID) != PDU_ACCEPT_RESULT_SUCCESS)) { pClient->DisplayMessage("Send C-Find Request: Presentation ID not found", -1, TVI_ROOT); return; } DS.InitDS(CLASS_PATIENT_ROOT_QUERY_PATIENT, DS_METAHEADER_ABSENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR); pElement = DS.FindFirstElement(NULL, TAG_QUERY_RETRIEVE_LEVEL, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_QUERY_RETRIEVE_LEVEL, 0, FALSE, 0); } DS.SetStringValue(pElement, "PATIENT", 1); pElement = DS.FindFirstElement(NULL, TAG_PATIENT_NAME, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_PATIENT_NAME, 0, FALSE, 0); } DS.SetStringValue(pElement, (L_CHAR *)(LPCTSTR)dlg.m_strPatientName, 1); pElement = DS.FindFirstElement(NULL, TAG_PATIENT_ID, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_PATIENT_ID, 0, FALSE, 0); } DS.SetStringValue(pElement, (L_CHAR *)(LPCTSTR)dlg.m_strPatientID, 1); pClient->m_strRetrieveAEsMsg = ""; pClient->StartProcess(PROCESS_C_FIND); nResult = pClient->SendCFindRequest(m_nPresentationID, m_nMessageID++, UID_PATIENT_ROOT_QUERY_FIND, COMMAND_PRIORITY_MEDIUM, &DS); pClient->DisplayMessage("Send C-Find Request", nResult, TVI_ROOT); if (nResult != DICOM_SUCCESS) { pClient->StopProcess(); } } void CNetDlg::OnCommandCFindStudyRoot() { L_INT nResult; pDICOMELEMENT pElement; CNetFindStudyDlg dlg; LDicomDS DS((L_CHAR*)(LPCTSTR) m_strTempFilesFolder); CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } if (dlg.DoModal() != IDOK) { return; } m_nQueryMethod = QUERY_STUDY_ROOT; m_pDS->InitDS(CLASS_BASIC_DIRECTORY, DS_METAHEADER_PRESENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR|DS_GROUP_LENGTHS); m_Dir.DeleteAllItems(); m_Key.DeleteAllItems(); m_hItem = NULL; m_Bitmap.SetHandle(NULL, TRUE); m_Bitmap.SetWndHandle(NULL); m_nPresentationID = pClient->GetAssociate()->FindAbstract(UID_STUDY_ROOT_QUERY_FIND); if ((m_nPresentationID == 0) || (pClient->GetAssociate()->GetResult(m_nPresentationID) != PDU_ACCEPT_RESULT_SUCCESS)) { pClient->DisplayMessage("Send C-Find Request: Presentation ID not found", -1, TVI_ROOT); return; } DS.InitDS(CLASS_STUDY_ROOT_QUERY_STUDY, DS_METAHEADER_ABSENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR); pElement = DS.FindFirstElement(NULL, TAG_QUERY_RETRIEVE_LEVEL, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_QUERY_RETRIEVE_LEVEL, 0, FALSE, 0); } DS.SetStringValue(pElement, "STUDY", 1); pElement = DS.FindFirstElement(NULL, TAG_STUDY_INSTANCE_UID, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_STUDY_INSTANCE_UID, 0, FALSE, 0); } DS.SetStringValue(pElement, (L_CHAR *)(LPCTSTR)dlg.m_strStudyInstanceUID, 1); pElement = DS.FindFirstElement(NULL, TAG_STUDY_ID, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_STUDY_ID, 0, FALSE, 0); } DS.SetStringValue(pElement, (L_CHAR *)(LPCTSTR)dlg.m_strStudyID, 1); pElement = DS.FindFirstElement(NULL, TAG_ACCESSION_NUMBER, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_ACCESSION_NUMBER, 0, FALSE, 0); } DS.SetStringValue(pElement, (L_CHAR *)(LPCTSTR)dlg.m_strAccessionNumber, 1); pElement = DS.FindFirstElement(NULL, TAG_PATIENT_NAME, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_PATIENT_NAME, 0, FALSE, 0); } DS.SetStringValue(pElement, (L_CHAR *)(LPCTSTR)dlg.m_strPatientName, 1); pElement = DS.FindFirstElement(NULL, TAG_PATIENT_ID, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_PATIENT_ID, 0, FALSE, 0); } DS.SetStringValue(pElement, (L_CHAR *)(LPCTSTR)dlg.m_strPatientID, 1); pClient->m_strRetrieveAEsMsg = ""; pClient->StartProcess(PROCESS_C_FIND); nResult = pClient->SendCFindRequest(m_nPresentationID, m_nMessageID++, UID_STUDY_ROOT_QUERY_FIND, COMMAND_PRIORITY_MEDIUM, &DS); pClient->DisplayMessage("Send C-Find Request", nResult, TVI_ROOT); if (nResult != DICOM_SUCCESS) { pClient->StopProcess(); } } void CNetDlg::OnCommandCFindPatientStudyOnly() { L_INT nResult; pDICOMELEMENT pElement; CNetFindPatientDlg dlg; LDicomDS DS((L_CHAR*)(LPCTSTR) m_strTempFilesFolder); CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } if (dlg.DoModal() != IDOK) { return; } m_nQueryMethod = QUERY_PATIENT_STUDY_ONLY; m_pDS->InitDS(CLASS_BASIC_DIRECTORY, DS_METAHEADER_PRESENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR|DS_GROUP_LENGTHS); m_Dir.DeleteAllItems(); m_Key.DeleteAllItems(); m_hItem = NULL; m_Bitmap.SetHandle(NULL, TRUE); m_Bitmap.SetWndHandle(NULL); m_nPresentationID = pClient->GetAssociate()->FindAbstract(UID_PATIENT_STUDY_QUERY_FIND); if ((m_nPresentationID == 0) || (pClient->GetAssociate()->GetResult(m_nPresentationID) != PDU_ACCEPT_RESULT_SUCCESS)) { pClient->DisplayMessage("Send C-Find Request: Presentation ID not found", -1, TVI_ROOT); return; } DS.InitDS(CLASS_PATIENT_STUDY_QUERY_PATIENT, DS_METAHEADER_ABSENT|DS_LITTLE_ENDIAN|DS_EXPLICIT_VR); pElement = DS.FindFirstElement(NULL, TAG_QUERY_RETRIEVE_LEVEL, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_QUERY_RETRIEVE_LEVEL, 0, FALSE, 0); } DS.SetStringValue(pElement, "PATIENT", 1); pElement = DS.FindFirstElement(NULL, TAG_PATIENT_NAME, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_PATIENT_NAME, 0, FALSE, 0); } DS.SetStringValue(pElement, (L_CHAR *)(LPCTSTR)dlg.m_strPatientName, 1); pElement = DS.FindFirstElement(NULL, TAG_PATIENT_ID, TRUE); if (pElement == NULL) { pElement = DS.InsertElement(NULL, FALSE, TAG_PATIENT_ID, 0, FALSE, 0); } DS.SetStringValue(pElement, (L_CHAR *)(LPCTSTR)dlg.m_strPatientID, 1); pClient->m_strRetrieveAEsMsg = ""; pClient->StartProcess(PROCESS_C_FIND); nResult = pClient->SendCFindRequest(m_nPresentationID, m_nMessageID++, UID_PATIENT_STUDY_QUERY_FIND, COMMAND_PRIORITY_MEDIUM, &DS); pClient->DisplayMessage("Send C-Find Request", nResult, TVI_ROOT); if (nResult != DICOM_SUCCESS) { pClient->StopProcess(); } } void CNetDlg::OnCommandCCancel() { L_INT nProcess; L_UINT16 nStatus; L_UINT32 nTime; L_INT nResult; CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } pClient->InfoProcess(nProcess, nStatus, nTime); if ((nStatus == COMMAND_STATUS_PENDING) || (nStatus == COMMAND_STATUS_PENDING_WARNING)) { nResult = pClient->SendCCancelRequest(m_nPresentationID, m_nMessageID - 1); pClient->DisplayMessage("Send C-Cancel Request", nResult, TVI_ROOT); pClient->StopProcess(); } } void CNetDlg::OnPreferencesAssociation() { CNetAssociationDlg dlg; dlg.m_pAssociate = &m_Associate; dlg.m_nTimeout = m_nTimeout; if (dlg.DoModal() != IDOK) { return; } m_nTimeout = dlg.m_nTimeout; } void CNetDlg::OnPreferencesUID() { CNetUIDDlg dlg; dlg.DoModal(); } ///////////////////////////////////////////////////////////////////////////// // CNetDlg utilities L_BOOL CNetDlg::OpenDlg(CString strTitle, BOOL bLoad, CString &strName, CString &strPath) { int i; POSITION pos; CFileDialog dlg(bLoad); dlg.m_ofn.hInstance = AfxGetInstanceHandle(); dlg.m_ofn.lpstrFilter = "All Files (*.*)\0*.*\0\0"; dlg.m_ofn.nFilterIndex = 0; dlg.m_ofn.lpstrTitle = (LPCTSTR)strTitle; dlg.m_ofn.lpstrInitialDir = (LPCTSTR)strPath; if (dlg.DoModal() != IDOK) { return FALSE; } pos = dlg.GetStartPosition(); if (pos == NULL) { return FALSE; } strName = dlg.GetNextPathName(pos); strPath = dlg.m_ofn.lpstrInitialDir; i = strPath.ReverseFind('\\'); if (i > 0) { strPath = strPath.Left(i-1); } return TRUE; } L_VOID CNetDlg::LoadConfig() { L_BOOL bResult; L_UINT32 i, j; L_UINT32 nCount1; L_UINT32 nCount2; CFile File; CString strCode; CString strName; L_UINT16 nVersion; L_UCHAR nID; L_BOOL bEnabled; L_UCHAR nUser; L_UCHAR nProvider; L_UCHAR *pData; L_UINT32 nLength; L_UINT16 nInvoked; L_UINT16 nPerformed; L_INT nConnect; L_INT nIndex; L_INT nType; CNetSession *pSession; m_nTimeout = 10; LDicomUID::Default(); m_Associate.Default(); m_Associate.SetImplementClass(TRUE, IMPLEMENTATION_CLASS_UID); m_Associate.SetImplementVersion(TRUE, IMPLEMENTATION_VERSION_NAME); InitializeOptions(); GetFileConfig(strName); bResult = File.Open(strName, CFile::modeRead | CFile::typeBinary | CFile::modeNoInherit | CFile::shareDenyWrite); if (bResult == FALSE) { return; } bResult = LoadNumber(&File, &m_nTimeout, sizeof(m_nTimeout)); if (bResult == FALSE) { m_nTimeout = 10; return; } bResult = LoadNumber(&File, &nConnect, sizeof(nConnect)); if (bResult == FALSE) { return; } for (i = 0; i < (L_UINT32)nConnect; i++) { pSession = new CNetSession; if (pSession == NULL) { return; } bResult = LoadString(&File, pSession->m_strNickname); if (bResult == FALSE) { delete pSession; return; } bResult = LoadString(&File, pSession->m_strServerTitle); if (bResult == FALSE) { delete pSession; return; } bResult = LoadString(&File, pSession->m_strServerAddress); if (bResult == FALSE) { delete pSession; return; } bResult = LoadNumber(&File, &pSession->m_nServerPort, sizeof(pSession->m_nServerPort)); if (bResult == FALSE) { delete pSession; return; } bResult = LoadString(&File, pSession->m_strClientTitle); if (bResult == FALSE) { delete pSession; return; } bResult = LoadNumber(&File, &pSession->m_nClientPort, sizeof(pSession->m_nClientPort)); if (bResult == FALSE) { delete pSession; return; } nIndex = m_Session.InsertItem(m_Session.GetItemCount(), pSession->m_strNickname, COMPUTER_DISCONNECTED); m_Session.SetItemData(nIndex, (DWORD)pSession); } bResult = LoadNumber(&File, &nCount1, sizeof(nCount1)); if (bResult == FALSE) { return; } if (nCount1 != 0) { LDicomUID::Reset(); for (i = 0; i < nCount1; i++) { bResult = LoadString(&File, strCode); if (bResult == FALSE) { LDicomUID::Default(); return; } bResult = LoadString(&File, strName); if (bResult == FALSE) { LDicomUID::Default(); return; } bResult = LoadNumber(&File, &nType, sizeof(nType)); if (bResult == FALSE) { LDicomUID::Default(); return; } LDicomUID::Insert((L_CHAR *)(LPCTSTR)strCode, (L_CHAR *)(LPCTSTR)strName, nType); } } m_Associate.Reset(TRUE); bResult = LoadNumber(&File, &nVersion, sizeof(nVersion)); if (bResult == FALSE) { m_Associate.Default(); return; } m_Associate.SetVersion(nVersion); bResult = LoadString(&File, strName); if (bResult == FALSE) { m_Associate.Default(); return; } m_Associate.SetApplication((L_CHAR *)(LPCTSTR)strName); bResult = LoadNumber(&File, &nCount1, sizeof(nCount1)); if (bResult == FALSE) { m_Associate.Default(); return; } for (i = 0; i < nCount1; i++) { bResult = LoadNumber(&File, &nID, sizeof(nID)); if (bResult == FALSE) { m_Associate.Default(); return; } bResult = LoadString(&File, strName); if (bResult == FALSE) { m_Associate.Default(); return; } m_Associate.AddPresentation(nID, 0, (L_CHAR *)(LPCTSTR)strName); bResult = LoadNumber(&File, &nCount2, sizeof(nCount2)); if (bResult == FALSE) { m_Associate.Default(); return; } for (j = 0; j < nCount2; j++) { bResult = LoadString(&File, strName); if (bResult == FALSE) { m_Associate.Default(); return; } m_Associate.AddTransfer(nID, (L_CHAR *)(LPCTSTR)strName); } bResult = LoadNumber(&File, &bEnabled, sizeof(bEnabled)); if (bResult == FALSE) { m_Associate.Default(); return; } bResult = LoadNumber(&File, &nUser, sizeof(nUser)); if (bResult == FALSE) { m_Associate.Default(); return; } bResult = LoadNumber(&File, &nProvider, sizeof(nProvider)); if (bResult == FALSE) { m_Associate.Default(); return; } m_Associate.SetRoleSelect(nID, bEnabled, nUser, nProvider); bResult = LoadNumber(&File, &nLength, sizeof(nLength)); if (bResult == FALSE) { m_Associate.Default(); return; } if (nLength > 0) { pData = (L_UCHAR *)malloc(nLength); if (pData == NULL) { m_Associate.Default(); return; } bResult = LoadNumber(&File, pData, nLength); if (bResult == FALSE) { free(pData); m_Associate.Default(); return; } m_Associate.SetExtended(nID, pData, nLength); free(pData); } } bResult = LoadNumber(&File, &bEnabled, sizeof(bEnabled)); if (bResult == FALSE) { m_Associate.Default(); return; } bResult = LoadNumber(&File, &nLength, sizeof(nLength)); if (bResult == FALSE) { m_Associate.Default(); return; } m_Associate.SetMaxLength(bEnabled, nLength); bResult = LoadNumber(&File, &bEnabled, sizeof(bEnabled)); if (bResult == FALSE) { m_Associate.Default(); return; } bResult = LoadString(&File, strName); if (bResult == FALSE) { m_Associate.Default(); return; } m_Associate.SetImplementClass(bEnabled, (L_CHAR *)(LPCTSTR)strName); bResult = LoadNumber(&File, &bEnabled, sizeof(bEnabled)); if (bResult == FALSE) { m_Associate.Default(); return; } bResult = LoadNumber(&File, &nInvoked, sizeof(nInvoked)); if (bResult == FALSE) { m_Associate.Default(); return; } bResult = LoadNumber(&File, &nPerformed, sizeof(nPerformed)); if (bResult == FALSE) { m_Associate.Default(); return; } m_Associate.SetAsyncOperations(bEnabled, nInvoked, nPerformed); bResult = LoadNumber(&File, &bEnabled, sizeof(bEnabled)); if (bResult == FALSE) { m_Associate.Default(); return; } bResult = LoadString(&File, strName); if (bResult == FALSE) { m_Associate.Default(); return; } m_Associate.SetImplementVersion(bEnabled, (L_CHAR *)(LPCTSTR)strName); LoadString(&File, m_strFolder); LoadString(&File, m_strExtension); LoadString(&File, m_strTempFilesFolder); } L_VOID CNetDlg::SaveConfig() { CStdioFile File; L_BOOL bResult; L_UINT32 i, j; pDICOMUID pUID; L_UINT32 nCount1, nCount2; L_UINT16 nVersion; L_UCHAR nID; L_BOOL bEnabled; L_UCHAR nUser; L_UCHAR nProvider; L_UINT32 nLength; L_UINT16 nInvoked; L_UINT16 nPerformed; CString strName; L_INT nSession; CNetSession *pSession; GetFileConfig(strName); bResult = File.Open(strName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary | CFile::modeNoInherit | CFile::shareExclusive); if (bResult == FALSE) { return; } SaveNumber(&File, &m_nTimeout, sizeof(m_nTimeout)); nSession = m_Session.GetItemCount(); SaveNumber(&File, &nSession, sizeof(nSession)); for (i = 0; i < (L_UINT32)m_Session.GetItemCount(); i++) { pSession = (CNetSession *)m_Session.GetItemData(i); if (pSession != NULL) { SaveString(&File, pSession->m_strNickname); SaveString(&File, pSession->m_strServerTitle); SaveString(&File, pSession->m_strServerAddress); SaveNumber(&File, &pSession->m_nServerPort, sizeof(pSession->m_nServerPort)); SaveString(&File, pSession->m_strClientTitle); SaveNumber(&File, &pSession->m_nClientPort, sizeof(pSession->m_nClientPort)); } } nCount1 = LDicomUID::GetCount(); SaveNumber(&File, &nCount1, sizeof(nCount1)); pUID = LDicomUID::GetFirst(); while (pUID != NULL) { SaveString(&File, pUID->pszCode); SaveString(&File, pUID->pszName); SaveNumber(&File, &pUID->nType, sizeof(pUID->nType)); pUID = LDicomUID::GetNext(pUID); } nVersion = m_Associate.GetVersion(); SaveNumber(&File, &nVersion, sizeof(nVersion)); SaveString(&File, m_Associate.GetApplication()); nCount1 = m_Associate.GetPresentationCount(); SaveNumber(&File, &nCount1, sizeof(nCount1)); for (i = 0; i < nCount1; i++) { nID = m_Associate.GetPresentation(i); SaveNumber(&File, &nID, sizeof(nID)); SaveString(&File, m_Associate.GetAbstract(nID)); nCount2 = m_Associate.GetTransferCount(nID); SaveNumber(&File, &nCount2, sizeof(nCount2)); for (j = 0; j < nCount2; j++) { SaveString(&File, m_Associate.GetTransfer(nID, j)); } bEnabled = m_Associate.IsRoleSelect(nID); SaveNumber(&File, &bEnabled, sizeof(bEnabled)); nUser = m_Associate.GetUserRole(nID); SaveNumber(&File, &nUser, sizeof(nUser)); nProvider = m_Associate.GetProviderRole(nID); SaveNumber(&File, &nProvider, sizeof(nProvider)); nLength = m_Associate.GetLengthExtended(nID); SaveNumber(&File, &nLength, sizeof(nLength)); if ((nLength > 0) && (m_Associate.GetExtended(nID) != NULL)) { SaveNumber(&File, m_Associate.GetExtended(nID), nLength); } } bEnabled = m_Associate.IsMaxLength(); SaveNumber(&File, &bEnabled, sizeof(bEnabled)); nLength = m_Associate.GetMaxLength(); SaveNumber(&File, &nLength, sizeof(nLength)); bEnabled = m_Associate.IsImplementClass(); SaveNumber(&File, &bEnabled, sizeof(bEnabled)); SaveString(&File, m_Associate.GetImplementClass()); bEnabled = m_Associate.IsAsyncOperations(); SaveNumber(&File, &bEnabled, sizeof(bEnabled)); nInvoked = m_Associate.GetInvokedOperations(); SaveNumber(&File, &nInvoked, sizeof(nInvoked)); nPerformed = m_Associate.GetPerformedOperations(); SaveNumber(&File, &nPerformed, sizeof(nPerformed)); bEnabled = m_Associate.IsImplementVersion(); SaveNumber(&File, &bEnabled, sizeof(bEnabled)); SaveString(&File, m_Associate.GetImplementVersion()); SaveString(&File, m_strFolder); SaveString(&File, m_strExtension); SaveString(&File, m_strTempFilesFolder); } L_BOOL CNetDlg::LoadString(CFile *File, CString &strText) { L_UINT32 nSize; L_UINT32 nLength; L_CHAR *pBuffer; nLength = File->Read(&nSize, sizeof(nSize)); if (nLength != sizeof(nSize)) { return FALSE; } pBuffer = (L_CHAR *)malloc(nSize); if (pBuffer == NULL) { return FALSE; } nLength = File->Read(pBuffer, nSize); if (nLength != nSize) { free(pBuffer); return FALSE; } strText = pBuffer; free(pBuffer); return TRUE; } L_BOOL CNetDlg::LoadNumber(CFile *File, L_VOID *pNumber, L_UINT32 nSize) { L_UINT32 nLength; nLength = File->Read(pNumber, nSize); return (nLength != nSize) ? FALSE : TRUE; } L_VOID CNetDlg::SaveString(CFile *File, CString strText) { L_UINT32 nSize; nSize = strText.GetLength() + 1; File->Write(&nSize, sizeof(nSize)); File->Write((L_CHAR *)(LPCTSTR)strText, nSize); } L_VOID CNetDlg::SaveString(CFile *File, L_CHAR *pszText) { L_UINT32 nSize; nSize = strlen(pszText) + 1; File->Write(&nSize, sizeof(nSize)); File->Write(pszText, nSize); } L_VOID CNetDlg::SaveNumber(CFile *File, L_VOID *pNumber, L_UINT32 nSize) { File->Write(pNumber, nSize); } L_VOID CNetDlg::GetFileConfig(CString &strName) { L_CHAR pszPath[_MAX_PATH]; if (GetModuleFileName(AfxGetInstanceHandle(), pszPath, _MAX_PATH) == 0) { strName = ""; return; } L_CHAR L_FAR *p = strrchr(pszPath, '.'); if (p != NULL) { *p = 0; } strName = pszPath; strName += ".ini"; } L_VOID CNetDlg::ConvertError(L_INT nError, CString &strError) { L_INT i; L_CHAR *p; strError = ""; for (i = 0, p = NULL; i < sizeof(m_Error) / sizeof(m_Error[0]); i++) { if (nError == m_Error[i].nCode) { p = m_Error[i].pszText; break; } } if (p == NULL) { strError.Format("%d", nError); } else { strError = p; } } L_BOOL CNetDlg::DisplayImage(pDICOMELEMENT pImageDR) { pDICOMELEMENT pElement; pElement = m_pDS->GetChildElement(pImageDR, TRUE); if (pElement != NULL) { pElement = m_pDS->FindFirstElement(pElement, TAG_ICON_IMAGE_SEQUENCE, TRUE); if (pElement != NULL) { pElement = m_pDS->GetChildElement(pElement, TRUE); if (pElement != NULL) { pElement = m_pDS->FindFirstElement(pElement, TAG_ITEM, TRUE); if (pElement != NULL) { pElement = m_pDS->GetChildElement(pElement, TRUE); if (pElement != NULL) { pElement = m_pDS->FindFirstElement(pElement, TAG_PIXEL_DATA, TRUE); } } } } } LBitmap Bitmap; if (pElement != NULL) { if (m_pDS->GetImage( pElement, Bitmap.GetHandle(), sizeof(BITMAPHANDLE), 0, 0, 0, DICOM_GETIMAGE_AUTO_APPLY_MODALITY_LUT| DICOM_GETIMAGE_AUTO_APPLY_VOI_LUT | DICOM_GETIMAGE_ALLOW_RANGE_EXPANSION, NULL, NULL) == DICOM_SUCCESS) { m_Key.DeleteAllItems(); m_Key.RedrawWindow(); m_Bitmap.SetWndHandle(m_Key.m_hWnd); m_Bitmap.SetPatternBackColor(0xFFFFFFFF); m_Bitmap.EnableAutoPaint(TRUE); m_Bitmap.SetHandle(Bitmap.GetHandle(), TRUE); m_Bitmap.SetZoomMode((m_bZoom == FALSE) ? ZOOM_NORMAL : ZOOM_FIT); } return TRUE; } return FALSE; } void CNetDlg::OnSecuritySettings() { CNetSecurityDlg dlgSecurity; L_INT j; dlgSecurity.m_ISCLAuthAlg = m_ISCLAuthAlg; for (j = 0; j < 8; j++) { dlgSecurity.m_ISCLAuthKeys[j] = m_ISCLAuthKeys[j]; } dlgSecurity.m_ISCLAuthCurrentKey = m_ISCLAuthCurrentKey; dlgSecurity.m_ISCLEncAlg = m_ISCLEncAlg; dlgSecurity.m_ISCLEncSign = m_ISCLEncSign; for (j = 0; j < 8; j++) { dlgSecurity.m_ISCLEncKeys[j] = m_ISCLEncKeys[j]; } dlgSecurity.m_ISCLEncCurrentKey = m_ISCLEncCurrentKey; if (dlgSecurity.DoModal() == IDOK) { m_ISCLAuthAlg = dlgSecurity.m_ISCLAuthAlg; for (j = 0; j < 8; j++) { m_ISCLAuthKeys[j] = dlgSecurity.m_ISCLAuthKeys[j]; } m_ISCLAuthCurrentKey = dlgSecurity.m_ISCLAuthCurrentKey; m_ISCLEncAlg = dlgSecurity.m_ISCLEncAlg; m_ISCLEncSign = dlgSecurity.m_ISCLEncSign; for (j = 0; j < 8; j++) { m_ISCLEncKeys[j] = dlgSecurity.m_ISCLEncKeys[j]; } m_ISCLEncCurrentKey = dlgSecurity.m_ISCLEncCurrentKey; if (SaveToFileSettings() == 0) { AfxMessageBox("Error saving security options"); } } } void CNetDlg::OnSecurityNosecuremode() { if (GetMenu()->GetMenuState(ID_SECURITY_NOSECUREMODE, MF_BYCOMMAND) == MF_UNCHECKED) { CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } pClient->Close(); GetMenu()->CheckMenuItem(ID_SECURITY_NOSECUREMODE, MF_CHECKED); GetMenu()->CheckMenuItem(ID_SECURITY_ISCLSECUREMODE, MF_UNCHECKED); GetMenu()->CheckMenuItem(ID_SECURITY_TLSSECUREMODE, MF_UNCHECKED); m_SecurityMode = DICOM_SECURE_NONE; } } void CNetDlg::OnSecurityIsclsecuremode() { if (GetMenu()->GetMenuState(ID_SECURITY_ISCLSECUREMODE, MF_BYCOMMAND) == MF_UNCHECKED) { CNetClient *pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: { pClient = m_Client; break; } case DICOM_SECURE_ISCL: { pClient = m_ClientISCL; break; } case DICOM_SECURE_TLS: { pClient = m_ClientTLS; break; } } pClient->Close(); GetMenu()->CheckMenuItem(ID_SECURITY_NOSECUREMODE, MF_UNCHECKED); GetMenu()->CheckMenuItem(ID_SECURITY_ISCLSECUREMODE, MF_CHECKED); GetMenu()->CheckMenuItem(ID_SECURITY_TLSSECUREMODE, MF_UNCHECKED); m_SecurityMode = DICOM_SECURE_ISCL; } } void CNetDlg::OnSecurityTlssecuremode() { if (GetMenu()->GetMenuState(ID_SECURITY_TLSSECUREMODE, MF_BYCOMMAND) == MF_UNCHECKED) { GetMenu()->CheckMenuItem(ID_SECURITY_NOSECUREMODE, MF_UNCHECKED); GetMenu()->CheckMenuItem(ID_SECURITY_ISCLSECUREMODE, MF_UNCHECKED); GetMenu()->CheckMenuItem(ID_SECURITY_TLSSECUREMODE, MF_CHECKED); m_Client->Close(); m_ClientISCL->Close(); m_ClientTLS->Close(); m_SecurityMode = DICOM_SECURE_TLS; } } void CNetDlg::LoadDefaultSettings() { // ISCL Auth m_ISCLAuthAlg = DICOM_ISCL_MUTUAL_AUTH_3P4W; m_ISCLAuthKeys[0] = 11619789628100321; m_ISCLAuthKeys[1] = 34217865672122111; m_ISCLAuthKeys[2] = 1605935625518899689; m_ISCLAuthKeys[3] = 138217077775855676; m_ISCLAuthKeys[4] = 9117318694593010212; m_ISCLAuthKeys[5] = 3485297985488245687; m_ISCLAuthKeys[6] = 1533287511573403981; m_ISCLAuthKeys[7] = 5604839976916070822; m_ISCLAuthCurrentKey = 1; //ISCL Encrypt m_ISCLEncAlg = DICOM_ISCL_ENCRYPT_DESCBC; m_ISCLEncSign = DICOM_ISCL_MAC_MD5; m_ISCLEncKeys[0] = 8079278526052745737; m_ISCLEncKeys[1] = 1312864321990916052; m_ISCLEncKeys[2] = 7190959962252002117; m_ISCLEncKeys[3] = 3619524191167482890; m_ISCLEncKeys[4] = 3466658849848898336; m_ISCLEncKeys[5] = 8474124475946342520; m_ISCLEncKeys[6] = 7725464453540259890; m_ISCLEncKeys[7] = 4320705344832296668; m_ISCLEncCurrentKey = 1; } L_INT CNetDlg::LoadFromFileSettings() { CStdioFile f; CString szData; L_INT i; if (f.Open("secur.ini", CFile::modeRead|CFile::typeText)) { // ISCL Auth if (f.ReadString(szData) == NULL) { return 0; } else { m_ISCLAuthAlg = (L_UINT32)_atoi64(szData); } for (i = 0; i < 8; i++) { if (f.ReadString(szData) == NULL) { return 0; } else { m_ISCLAuthKeys[i] = _atoi64(szData); } } if (f.ReadString(szData) == NULL) { return 0; } else { m_ISCLAuthCurrentKey = (L_UINT32)_atoi64(szData); } //ISCL Encrypt if (f.ReadString(szData) == NULL) { return 0; } else { m_ISCLEncAlg = (L_UINT32)_atoi64(szData); } if (f.ReadString(szData) == NULL) { return 0; } else { m_ISCLEncSign = (L_UINT32)_atoi64(szData); } for (i = 0; i < 8; i++) { if (f.ReadString(szData) == NULL) { return 0; } else { m_ISCLEncKeys[i] = _atoi64(szData); } } if (f.ReadString(szData) == NULL) { return 0; } else { m_ISCLEncCurrentKey = (L_UINT32)_atoi64(szData); } f.Close(); } else { return 0; } return 1; } L_INT CNetDlg::SaveToFileSettings() { CStdioFile f; CString szData; L_INT i; if (f.Open("secur.ini", CFile::modeCreate | CFile::modeWrite | CFile::typeText)) { // ISCL Auth _i64toa(m_ISCLAuthAlg, szData.GetBuffer(10), 10); szData.ReleaseBuffer(10); szData.Format("%s\n", szData); f.WriteString(szData); for (i = 0; i < 8; i++) { _i64toa(m_ISCLAuthKeys[i], szData.GetBuffer(25), 10); szData.ReleaseBuffer(25); szData.Format("%s\n", szData); f.WriteString(szData); } _i64toa(m_ISCLAuthCurrentKey, szData.GetBuffer(10), 10); szData.ReleaseBuffer(10); szData.Format("%s\n", szData); f.WriteString(szData); //ISCL Encrypt _i64toa(m_ISCLEncAlg, szData.GetBuffer(10), 10); szData.ReleaseBuffer(10); szData.Format("%s\n", szData); f.WriteString(szData); _i64toa(m_ISCLEncSign, szData.GetBuffer(10), 10); szData.ReleaseBuffer(10); szData.Format("%s\n", szData); f.WriteString(szData); for (i = 0; i < 8; i++) { _i64toa(m_ISCLEncKeys[i], szData.GetBuffer(25), 10); szData.ReleaseBuffer(25); szData.Format("%s\n", szData); f.WriteString(szData); } _i64toa(m_ISCLEncCurrentKey, szData.GetBuffer(10), 10); szData.ReleaseBuffer(10); szData.Format("%s\n", szData); f.WriteString(szData); f.Close(); } else { return 0; } return 1; } void CNetDlg::OnPreferencesOptions() { COptionsDlg OptionsDlg; OptionsDlg.m_strFolder = m_strFolder; OptionsDlg.m_strExtension = m_strExtension; OptionsDlg.m_strTempFilesFolder = m_strTempFilesFolder; if (OptionsDlg.DoModal() == IDOK) { m_strFolder = OptionsDlg.m_strFolder; m_strFolder.TrimLeft(); m_strFolder.TrimRight(); if (!m_strFolder.IsEmpty()) { int iLength = m_strFolder.GetLength(); if (m_strFolder[iLength - 1] != '\\' && m_strFolder[iLength - 1] != '/') { m_strFolder += '\\'; } } m_strExtension = OptionsDlg.m_strExtension; CString strTemp = ""; for(int i = 0; i < m_strExtension.GetLength(); i++) { if (m_strExtension[i] != '.') strTemp += m_strExtension[i]; } m_strExtension = strTemp; m_strExtension.TrimLeft(); m_strExtension.TrimRight(); int iIndex = m_strExtension.Find(' '); if (iIndex != -1) { m_strExtension = m_strExtension.Left(iIndex); } m_strTempFilesFolder = OptionsDlg.m_strTempFilesFolder; m_strTempFilesFolder.TrimLeft(); m_strTempFilesFolder.TrimRight(); } } void CNetDlg::OnCommandCMove() { CNetClient* pClient; switch (m_SecurityMode) { case DICOM_SECURE_NONE: pClient = m_Client; break; case DICOM_SECURE_ISCL: pClient = m_ClientISCL; break; case DICOM_SECURE_TLS: pClient = m_ClientTLS; break; } HTREEITEM hDirItem = m_Dir.GetSelectedItem(); if (hDirItem == NULL) { return; } pDICOMELEMENT pDR = (pDICOMELEMENT) m_Dir.GetItemData(hDirItem); L_INT nProcess; L_UINT16 uStatus; L_UINT32 uTime; pClient->InfoProcess(nProcess, uStatus, uTime); if (pDR == NULL || m_pDS->ExistsElement(pDR) == FALSE || pClient->IsAssociated() == FALSE || uStatus == COMMAND_STATUS_PENDING || uStatus == COMMAND_STATUS_PENDING_WARNING) { return; } LDicomDS Identifier((L_CHAR*)(LPCTSTR) m_strTempFilesFolder); Identifier.InitDS(CLASS_UNKNOWN, DS_LITTLE_ENDIAN | DS_EXPLICIT_VR); pDICOMELEMENT pQRLevelElement = Identifier.FindFirstElement(NULL, TAG_QUERY_RETRIEVE_LEVEL, FALSE); if (pQRLevelElement == NULL) { pQRLevelElement = Identifier.InsertElement(NULL, FALSE, TAG_QUERY_RETRIEVE_LEVEL, VR_CS, FALSE, 0); if (pQRLevelElement == NULL) { return; } } L_CHAR* pszDRType = m_pDS->GetValueKey(pDR); if (lstrcmpi("PATIENT", pszDRType) == 0) { if (Identifier.SetStringValue(pQRLevelElement, "PATIENT", 1) == FALSE) return; CopyTagKey(m_pDS, &Identifier, pDR, "PATIENT", TAG_PATIENT_ID); } else if (lstrcmpi("STUDY", pszDRType) == 0) { if (Identifier.SetStringValue(pQRLevelElement, "STUDY", 1) == FALSE) return; CopyTagKey(m_pDS, &Identifier, pDR, "STUDY", TAG_STUDY_INSTANCE_UID); if (m_nQueryMethod != QUERY_STUDY_ROOT) { hDirItem = m_Dir.GetParentItem(hDirItem); if (hDirItem) { CopyTagKey(m_pDS, &Identifier, (pDICOMELEMENT) m_Dir.GetItemData(hDirItem), "PATIENT", TAG_PATIENT_ID); } else { return; } } } else if (m_nQueryMethod != QUERY_PATIENT_STUDY_ONLY) { if (lstrcmpi("SERIES", pszDRType) == 0) { if (Identifier.SetStringValue(pQRLevelElement, "SERIES", 1) == FALSE) return; CopyTagKey(m_pDS, &Identifier, pDR, "SERIES", TAG_SERIES_INSTANCE_UID); hDirItem = m_Dir.GetParentItem(hDirItem); if (hDirItem) { CopyTagKey(m_pDS, &Identifier, (pDICOMELEMENT) m_Dir.GetItemData(hDirItem), "STUDY", TAG_STUDY_INSTANCE_UID); } else { return; } if (m_nQueryMethod != QUERY_STUDY_ROOT) { hDirItem = m_Dir.GetParentItem(hDirItem); if (hDirItem) { CopyTagKey(m_pDS, &Identifier, (pDICOMELEMENT) m_Dir.GetItemData(hDirItem), "PATIENT", TAG_PATIENT_ID); } else { return; } } } else if (lstrcmpi("IMAGE", pszDRType) == 0) { if (CheckAvailability(pDR) == FALSE) return; if (Identifier.SetStringValue(pQRLevelElement, "IMAGE", 1) == FALSE) return; CopyTagKey(m_pDS, &Identifier, pDR, "IMAGE", TAG_SOP_INSTANCE_UID); hDirItem = m_Dir.GetParentItem(hDirItem); if (hDirItem) { CopyTagKey(m_pDS, &Identifier, (pDICOMELEMENT) m_Dir.GetItemData(hDirItem), "SERIES", TAG_SERIES_INSTANCE_UID); } else { return; } hDirItem = m_Dir.GetParentItem(hDirItem); if (hDirItem) { CopyTagKey(m_pDS, &Identifier, (pDICOMELEMENT) m_Dir.GetItemData(hDirItem), "STUDY", TAG_STUDY_INSTANCE_UID); } else { return; } if (m_nQueryMethod != QUERY_STUDY_ROOT) { hDirItem = m_Dir.GetParentItem(hDirItem); if (hDirItem) { CopyTagKey(m_pDS, &Identifier, (pDICOMELEMENT) m_Dir.GetItemData(hDirItem), "PATIENT", TAG_PATIENT_ID); } else { return; } } } else { return; } } else { return; } L_CHAR* pszAbstractSyntax = NULL; switch (m_nQueryMethod) { case QUERY_PATIENT_ROOT: pszAbstractSyntax = UID_PATIENT_ROOT_QUERY_MOVE; break; case QUERY_STUDY_ROOT: pszAbstractSyntax = UID_STUDY_ROOT_QUERY_MOVE; break; case QUERY_PATIENT_STUDY_ONLY: pszAbstractSyntax = UID_PATIENT_STUDY_QUERY_MOVE; break; } m_nPresentationID = pClient->GetAssociate()->FindAbstract(pszAbstractSyntax); if (m_nPresentationID == 0 || pClient->GetAssociate()->GetResult(m_nPresentationID) != PDU_ACCEPT_RESULT_SUCCESS) { pClient->DisplayMessage("Send C-Move Request: Presentation ID not found", -1, TVI_ROOT); return; } pClient->StartProcess(PROCESS_C_MOVE); L_INT nResult = pClient->SendCMoveRequest(m_nPresentationID, m_nMessageID++, pszAbstractSyntax, COMMAND_PRIORITY_MEDIUM, m_Associate.GetCalling(), &Identifier); pClient->DisplayMessage("Send C-Move Request", nResult, TVI_ROOT); if (nResult != DICOM_SUCCESS) { pClient->StopProcess(); } }