// AssoPage.cpp : implementation file // #include "stdafx.h" #include #include "CLDPrn32.h" #include "AssoPage.h" #include "PrnSheet.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define REG_SUBKEY TEXT("Software\\LEAD Technologies, Inc.\\DicomPrintSCU") #define REG_IP TEXT("IPAddress") #define REG_PORT TEXT("PortNumber") #define REG_CALLED TEXT("CalledTitle") #define REG_CALLING TEXT("CallingTitle") #define REG_GRAYSCALE TEXT("GrayscalePM") #define REG_COLOR TEXT("ColorPM") #define REG_PULLSTORED TEXT("PullStoredPM") #define REG_ANNOTATION TEXT("AnnotationBox") #define REG_OVERLAY TEXT("OverlayBox") #define REG_LUT TEXT("PresentationLUT") #define REG_PRINTJOB TEXT("PrintJob") #define REG_PRINTERCONFIG TEXT("PrinterConfig") #define REG_TIMEOUT TEXT("Timeout") #define REG_LOAD_SVALUE(Name, ControlID) \ dwSize = sizeof(szValue); \ if (RegKey.QueryValue(szValue, Name, &dwSize) == ERROR_SUCCESS) \ { \ SetDlgItemText(ControlID, szValue); \ } #define REG_LOAD_DVALUE(Name, ControlID) \ if (RegKey.QueryValue(dwValue, Name) == ERROR_SUCCESS) \ { \ SetDlgItemInt(ControlID, UINT(dwValue), FALSE); \ } #define REG_LOAD_CHKBOX(Name, ControlID) \ if (RegKey.QueryValue(dwValue, Name) == ERROR_SUCCESS) \ { \ CheckDlgButton(ControlID, dwValue ? BST_CHECKED : BST_UNCHECKED); \ } #define REG_SAVE_SVALUE(Name, ControlID) \ RegKey.SetValue(GetDlgItemText(ControlID, sValue) ? sValue : TEXT(""), Name) #define REG_SAVE_DVALUE(Name, ControlID, Alt) \ uValue = GetDlgItemInt(ControlID, &bTranslated, FALSE); \ RegKey.SetValue(bTranslated ? uValue : Alt, Name) #define REG_SAVE_CHKBOX(Name, ControlID) \ RegKey.SetValue((IsDlgButtonChecked(ControlID) == BST_CHECKED) ? 1 : 0, Name) #define ENABLE_CONTROL(ControlID, Enable) \ GetDlgItem(ControlID)->EnableWindow(Enable) UINT ControlsIDs[] = { IDC_EDIT_IP, IDC_EDIT_PORT, IDC_EDIT_CALLED, IDC_EDIT_CALLING, IDC_CHECK_GRAYSCALE, IDC_CHECK_COLOR, IDC_CHECK_PULLSTORED, IDC_CHECK_ANNOTATION, IDC_CHECK_OVERLAY, IDC_CHECK_LUT, IDC_CHECK_PRINTJOB, IDC_CHECK_PRINTERCONFIG, IDC_EDIT_TIMEOUT }; struct { L_UINT16 uClass; LPCTSTR pszClassName; UINT uCheckBoxID; } Classes[] = { PRINTSCU_BASIC_GRAYSCALE_PM_META_SOP_CLASS, TEXT("Basic Grayscale PM Meta SOP Class"), IDC_CHECK_GRAYSCALE, PRINTSCU_BASIC_COLOR_PM_META_SOP_CLASS, TEXT("Basic Color PM Meta SOP Class"), IDC_CHECK_COLOR, PRINTSCU_PULL_STORED_PM_META_SOP_CLASS, TEXT("Pull Stored PM Meta SOP Class"), IDC_CHECK_PULLSTORED, PRINTSCU_BASIC_ANNOTATION_BOX_SOP_CLASS, TEXT("Basic Annotation Box SOP Class"), IDC_CHECK_ANNOTATION, PRINTSCU_BASIC_PRINT_IMAGE_OVERLAY_BOX_SOP_CLASS, TEXT("Basic Print Image Overlay Box SOP Class"), IDC_CHECK_OVERLAY, PRINTSCU_PRESENTATION_LUT_SOP_CLASS, TEXT("Presentation LUT SOP Class"), IDC_CHECK_LUT, PRINTSCU_PRINT_JOB_SOP_CLASS, TEXT("Print Job SOP Class"), IDC_CHECK_PRINTJOB, PRINTSCU_PRINTER_CONFIGURATION_RETRIEVAL_SOP_CLASS, TEXT("Printer Configuration Retrieval SOP Class"), IDC_CHECK_PRINTERCONFIG }; ///////////////////////////////////////////////////////////////////////////// // CAssociationPage property page IMPLEMENT_DYNCREATE(CAssociationPage, CPropertyPage) CAssociationPage::CAssociationPage() : CPropertyPage(CAssociationPage::IDD), m_bReset(FALSE), m_bPendingOperation(FALSE) { //{{AFX_DATA_INIT(CAssociationPage) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } CAssociationPage::~CAssociationPage() { } void CAssociationPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAssociationPage) DDX_Control(pDX, IDC_LIST_SUPPORTEDCLASSES, m_SupportedClassesList); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAssociationPage, CPropertyPage) //{{AFX_MSG_MAP(CAssociationPage) ON_BN_CLICKED(IDC_BUTTON_ASSOCIATE, OnButtonAssociate) ON_EN_CHANGE(IDC_EDIT_IP, OnChangeEditIP) ON_EN_CHANGE(IDC_EDIT_PORT, OnChangeEditPort) ON_EN_CHANGE(IDC_EDIT_TIMEOUT, OnChangeEditTimeout) ON_BN_CLICKED(IDC_CHECK_GRAYSCALE, OnCheckGrayscale) ON_BN_CLICKED(IDC_CHECK_COLOR, OnCheckColor) ON_BN_CLICKED(IDC_CHECK_PULLSTORED, OnCheckPullStored) ON_BN_CLICKED(IDC_BUTTON_RELEASE, OnButtonRelease) ON_BN_CLICKED(IDC_BUTTON_ABORT, OnButtonAbort) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CAssociationPage::Abort() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; PrintSCU.Abort(); // Clean the list of supported SOP/Meta SOP Classes while (m_SupportedClassesList.DeleteString(0) != LB_ERR); PrintScuSheet.FlagPendingOperation(FALSE); } void CAssociationPage::Reset() { // Clean the list of supported SOP/Meta SOP Classes while (m_SupportedClassesList.DeleteString(0) != LB_ERR); m_bReset = FALSE; } void CAssociationPage::UpdateControlsState() { CPrintSCU& PrintSCU = ((CPrintScuSheet*) GetParent())->m_PrintSCU; if (PrintSCU.IsAssociated()) { ENABLE_CONTROL(IDC_BUTTON_ASSOCIATE, FALSE); ENABLE_CONTROL(IDC_BUTTON_RELEASE, !m_bPendingOperation); ENABLE_CONTROL(IDC_BUTTON_ABORT, TRUE); EnableControls(FALSE); } else { if (m_bPendingOperation) { ENABLE_CONTROL(IDC_BUTTON_ASSOCIATE, FALSE); } else { UpdateAssociateButtonState(); } ENABLE_CONTROL(IDC_BUTTON_RELEASE, FALSE); ENABLE_CONTROL(IDC_BUTTON_ABORT, FALSE); EnableControls(TRUE); UpdateOptionalSOPClassesCheckBoxesState(); } } void CAssociationPage::InitializeControls() { // Set some defaults SetDlgItemInt(IDC_EDIT_PORT, 104, FALSE); CheckDlgButton(IDC_CHECK_GRAYSCALE, BST_CHECKED); CheckDlgButton(IDC_CHECK_ANNOTATION, BST_CHECKED); CheckDlgButton(IDC_CHECK_OVERLAY, BST_CHECKED); CheckDlgButton(IDC_CHECK_LUT, BST_CHECKED); CheckDlgButton(IDC_CHECK_PRINTJOB, BST_CHECKED); CheckDlgButton(IDC_CHECK_PRINTERCONFIG, BST_CHECKED); SetDlgItemInt(IDC_EDIT_TIMEOUT, 60, FALSE); CRegKey RegKey; TCHAR szValue[1024]; DWORD dwValue, dwSize; if (RegKey.Open(HKEY_CURRENT_USER, REG_SUBKEY) != ERROR_SUCCESS) { return; } REG_LOAD_SVALUE(REG_IP, IDC_EDIT_IP) REG_LOAD_DVALUE(REG_PORT, IDC_EDIT_PORT) REG_LOAD_SVALUE(REG_CALLED, IDC_EDIT_CALLED) REG_LOAD_SVALUE(REG_CALLING, IDC_EDIT_CALLING) REG_LOAD_CHKBOX(REG_GRAYSCALE, IDC_CHECK_GRAYSCALE) REG_LOAD_CHKBOX(REG_COLOR, IDC_CHECK_COLOR) REG_LOAD_CHKBOX(REG_PULLSTORED, IDC_CHECK_PULLSTORED) REG_LOAD_CHKBOX(REG_ANNOTATION, IDC_CHECK_ANNOTATION) REG_LOAD_CHKBOX(REG_OVERLAY, IDC_CHECK_OVERLAY) REG_LOAD_CHKBOX(REG_LUT, IDC_CHECK_LUT) REG_LOAD_CHKBOX(REG_PRINTJOB, IDC_CHECK_PRINTJOB) REG_LOAD_CHKBOX(REG_PRINTERCONFIG, IDC_CHECK_PRINTERCONFIG) REG_LOAD_DVALUE(REG_TIMEOUT, IDC_EDIT_TIMEOUT) RegKey.Close(); } void CAssociationPage::StoreValues() { CRegKey RegKey; CString sValue; UINT uValue; BOOL bTranslated; if (RegKey.Create(HKEY_CURRENT_USER, REG_SUBKEY) != ERROR_SUCCESS) { return; } REG_SAVE_SVALUE(REG_IP, IDC_EDIT_IP); REG_SAVE_DVALUE(REG_PORT, IDC_EDIT_PORT, 104); REG_SAVE_SVALUE(REG_CALLED, IDC_EDIT_CALLED); REG_SAVE_SVALUE(REG_CALLING, IDC_EDIT_CALLING); REG_SAVE_CHKBOX(REG_GRAYSCALE, IDC_CHECK_GRAYSCALE); REG_SAVE_CHKBOX(REG_COLOR, IDC_CHECK_COLOR); REG_SAVE_CHKBOX(REG_PULLSTORED, IDC_CHECK_PULLSTORED); REG_SAVE_CHKBOX(REG_ANNOTATION,IDC_CHECK_ANNOTATION); REG_SAVE_CHKBOX(REG_OVERLAY, IDC_CHECK_OVERLAY); REG_SAVE_CHKBOX(REG_LUT, IDC_CHECK_LUT); REG_SAVE_CHKBOX(REG_PRINTJOB, IDC_CHECK_PRINTJOB); REG_SAVE_CHKBOX(REG_PRINTERCONFIG, IDC_CHECK_PRINTERCONFIG); REG_SAVE_DVALUE(REG_TIMEOUT, IDC_EDIT_TIMEOUT, 60); RegKey.Close(); } void CAssociationPage::UpdateAssociateButtonState() { CString sFieldValue; // The IP address or the DNS name of the Print SCP, in addition to the port must be // supplied. Also, a timeout value must be provided. UINT uIDs[] = { IDC_EDIT_IP, IDC_EDIT_PORT, IDC_EDIT_TIMEOUT }; for (int i = 0; i < sizeof(uIDs) / sizeof(uIDs[0]); i++) { GetDlgItemText(uIDs[i], sFieldValue); sFieldValue.TrimLeft(); if (sFieldValue.IsEmpty()) { ENABLE_CONTROL(IDC_BUTTON_ASSOCIATE, FALSE); return; } } // At lease one of the Meta SOP Classes should be specified if (!IsDlgButtonChecked(IDC_CHECK_GRAYSCALE) && !IsDlgButtonChecked(IDC_CHECK_COLOR) && !IsDlgButtonChecked(IDC_CHECK_PULLSTORED)) { ENABLE_CONTROL(IDC_BUTTON_ASSOCIATE, FALSE); return; } GetDlgItem(IDC_BUTTON_ASSOCIATE)->EnableWindow(TRUE); } void CAssociationPage::UpdateOptionalSOPClassesCheckBoxesState() { // The Basic Annotation Box SOP Class, the Basic Print Image Overlay Box SOP Class, and // the Presentation LUT SOP Class can be used in conjunction with only the Basic PM Meta // SOP Classes. BOOL bEnable = IsDlgButtonChecked(IDC_CHECK_GRAYSCALE) || IsDlgButtonChecked(IDC_CHECK_COLOR); ENABLE_CONTROL(IDC_CHECK_ANNOTATION, bEnable); ENABLE_CONTROL(IDC_CHECK_OVERLAY, bEnable); ENABLE_CONTROL(IDC_CHECK_LUT, bEnable); } void CAssociationPage::EnableControls(BOOL bEnable) { int iCount = sizeof(ControlsIDs) / sizeof(ControlsIDs[0]); for (int i = 0; i < iCount; i++) { ENABLE_CONTROL(ControlsIDs[i], bEnable); } } ///////////////////////////////////////////////////////////////////////////// // CAssociationPage message handlers BOOL CAssociationPage::OnInitDialog() { CPropertyPage::OnInitDialog(); InitializeControls(); return TRUE; } BOOL CAssociationPage::OnSetActive() { if (m_bReset) { Reset(); } UpdateControlsState(); return CPropertyPage::OnSetActive(); } void CAssociationPage::OnButtonAssociate() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; StoreValues(); CString sPrintScpIP, sCalledTitle, sCallingTitle; L_UINT uPrintScpPort; L_UINT16 uSupportedClasses; // The IP address (or DNS name), port number, and AE Title of the Print SCP GetDlgItemText(IDC_EDIT_IP, sPrintScpIP); uPrintScpPort = GetDlgItemInt(IDC_EDIT_PORT, NULL, FALSE); GetDlgItemText(IDC_EDIT_CALLED, sCalledTitle); // The AE Title of the Print SCU GetDlgItemText(IDC_EDIT_CALLING, sCallingTitle); // SOP/Meta SOP Classes to be supported by the Print SCU uSupportedClasses = 0; int iCount = sizeof(Classes) / sizeof(Classes[0]); for (int i = 0; i < iCount; i++) { if (GetDlgItem(Classes[i].uCheckBoxID)->IsWindowEnabled() && IsDlgButtonChecked(Classes[i].uCheckBoxID) == BST_CHECKED) { uSupportedClasses = uSupportedClasses | Classes[i].uClass; } } // Timeout PrintSCU.SetTimeout(L_UINT16(GetDlgItemInt(IDC_EDIT_TIMEOUT, NULL, FALSE))); PrintScuSheet.ResetPages(); PrintScuSheet.FlagPendingOperation(); EnableControls(FALSE); // Now establish the Association with the Print SCP L_INT iRet = PrintSCU.Associate(sPrintScpIP, uPrintScpPort, sCalledTitle, sCallingTitle, uSupportedClasses); if (iRet != DICOM_SUCCESS && iRet != DICOM_ERROR_PRINTSCU_ASSOCIATE_RQ_REJECTED) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } // Display the SOP/Meta SOP Classes supported on the Association established if (iRet != DICOM_ERROR_PRINTSCU_ASSOCIATE_RQ_REJECTED) { iCount = sizeof(Classes) / sizeof(Classes[0]); for (i = 0; i < iCount; i++) { if (PrintSCU.IsClassSupported(Classes[i].uClass)) { m_SupportedClassesList.AddString(Classes[i].pszClassName); } } } PrintScuSheet.FlagPendingOperation(FALSE); } void CAssociationPage::OnButtonRelease() { CPrintScuSheet& PrintScuSheet = *((CPrintScuSheet*) GetParent()); CPrintSCU& PrintSCU = PrintScuSheet.m_PrintSCU; PrintScuSheet.FlagPendingOperation(); L_INT iRet = PrintSCU.Release(); if (iRet != DICOM_SUCCESS) { PrintScuSheet.DisplayError(iRet); PrintScuSheet.FlagPendingOperation(FALSE); return; } // Clean the list of supported SOP/Meta SOP Classes while (m_SupportedClassesList.DeleteString(0) != LB_ERR); PrintScuSheet.FlagPendingOperation(FALSE); } void CAssociationPage::OnButtonAbort() { Abort(); } void CAssociationPage::OnChangeEditIP() { UpdateAssociateButtonState(); } void CAssociationPage::OnChangeEditPort() { UpdateAssociateButtonState(); } void CAssociationPage::OnChangeEditTimeout() { UpdateAssociateButtonState(); } void CAssociationPage::OnCheckGrayscale() { UpdateAssociateButtonState(); UpdateOptionalSOPClassesCheckBoxesState(); } void CAssociationPage::OnCheckColor() { UpdateAssociateButtonState(); UpdateOptionalSOPClassesCheckBoxesState(); } void CAssociationPage::OnCheckPullStored() { UpdateAssociateButtonState(); }