// PrnSheet.cpp : implementation file // #include "stdafx.h" #include "cldprn32.h" #include "PrnSheet.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // 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() ///////////////////////////////////////////////////////////////////////////// // CPrintSCU CString CPrintSCU::m_sSendingIndicator = TEXT(">> "); CString CPrintSCU::m_sReceivingIndicator = TEXT("<< "); CPrintSCU::StatusInfo CPrintSCU::Statuses[] = { // Sent Messages PRINTSCU_STATUS_SEND_CREATE_FILM_SESSION_RQ, TEXT("Basic Film Session SOP Class"), N_CREATE_RQ, PRINTSCU_STATUS_SEND_UPDATE_FILM_SESSION_RQ, TEXT("Basic Film Session SOP Class"), N_SET_RQ, PRINTSCU_STATUS_SEND_PRINT_FILM_SESSION_RQ, TEXT("Basic Film Session SOP Class"), N_ACTION_RQ, PRINTSCU_STATUS_SEND_DELETE_FILM_SESSION_RQ, TEXT("Basic Film Session SOP Class"), N_DELETE_RQ, PRINTSCU_STATUS_SEND_CREATE_FILM_BOX_RQ, TEXT("Basic Film Box SOP Class"), N_CREATE_RQ, PRINTSCU_STATUS_SEND_UPDATE_FILM_BOX_RQ, TEXT("Basic Film Box SOP Class"), N_SET_RQ, PRINTSCU_STATUS_SEND_PRINT_FILM_BOX_RQ, TEXT("Basic Film Box SOP Class"), N_ACTION_RQ, PRINTSCU_STATUS_SEND_DELETE_FILM_BOX_RQ, TEXT("Basic Film Box SOP Class"), N_DELETE_RQ, PRINTSCU_STATUS_SEND_UPDATE_IMAGE_BOX_RQ, TEXT(""), N_SET_RQ, PRINTSCU_STATUS_SEND_UPDATE_ANNOTATION_BOX_RQ, TEXT("Basic Annotation Box SOP Class"), N_SET_RQ, PRINTSCU_STATUS_SEND_GET_PRINTER_INFO_RQ, TEXT("Printer SOP Class"), N_GET_RQ, PRINTSCU_STATUS_SEND_GET_PRINT_JOB_INFO_RQ, TEXT("Print Job SOP Class"), N_GET_RQ, PRINTSCU_STATUS_SEND_GET_PRINTER_CONFIG_RQ, TEXT("Printer Configuration Retrieval SOP Class"), N_GET_RQ, PRINTSCU_STATUS_SEND_CREATE_PRESENTATION_LUT_RQ, TEXT("Presentation LUT SOP Class"), N_CREATE_RQ, PRINTSCU_STATUS_SEND_DELETE_PRESENTATION_LUT_RQ, TEXT("Presentation LUT SOP Class"), N_DELETE_RQ, PRINTSCU_STATUS_SEND_CREATE_OVERLAY_BOX_RQ, TEXT("Basic Print Image Overlay Box SOP Class"), N_CREATE_RQ, PRINTSCU_STATUS_SEND_UPDATE_OVERLAY_BOX_RQ, TEXT("Basic Print Image Overlay Box SOP Class"), N_SET_RQ, PRINTSCU_STATUS_SEND_DELETE_OVERLAY_BOX_RQ, TEXT("Basic Print Image Overlay Box SOP Class"), N_DELETE_RQ, PRINTSCU_STATUS_SEND_CREATE_PULL_PRINT_REQUEST_RQ, TEXT("Pull Print Request SOP Class"), N_CREATE_RQ, PRINTSCU_STATUS_SEND_PRINT_PULL_PRINT_REQUEST_RQ, TEXT("Pull Print Request SOP Class"), N_ACTION_RQ, PRINTSCU_STATUS_SEND_DELETE_PULL_PRINT_REQUEST_RQ, TEXT("Pull Print Request SOP Class"), N_DELETE_RQ, // Received Messages PRINTSCU_STATUS_RECEIVE_CREATE_FILM_SESSION_RSP, TEXT("Basic Film Session SOP Class"), N_CREATE_RSP, PRINTSCU_STATUS_RECEIVE_UPDATE_FILM_SESSION_RSP, TEXT("Basic Film Session SOP Class"), N_SET_RSP, PRINTSCU_STATUS_RECEIVE_PRINT_FILM_SESSION_RSP, TEXT("Basic Film Session SOP Class"), N_ACTION_RSP, PRINTSCU_STATUS_RECEIVE_DELETE_FILM_SESSION_RSP, TEXT("Basic Film Session SOP Class"), N_DELETE_RSP, PRINTSCU_STATUS_RECEIVE_CREATE_FILM_BOX_RSP, TEXT("Basic Film Box SOP Class"), N_CREATE_RSP, PRINTSCU_STATUS_RECEIVE_UPDATE_FILM_BOX_RSP, TEXT("Basic Film Box SOP Class"), N_SET_RSP, PRINTSCU_STATUS_RECEIVE_PRINT_FILM_BOX_RSP, TEXT("Basic Film Box SOP Class"), N_ACTION_RSP, PRINTSCU_STATUS_RECEIVE_DELETE_FILM_BOX_RSP, TEXT("Basic Film Box SOP Class"), N_DELETE_RSP, PRINTSCU_STATUS_RECEIVE_UPDATE_IMAGE_BOX_RSP, TEXT(""), N_SET_RSP, PRINTSCU_STATUS_RECEIVE_UPDATE_ANNOTATION_BOX_RSP, TEXT("Basic Annotation Box SOP Class"), N_SET_RSP, PRINTSCU_STATUS_RECEIVE_GET_PRINTER_INFO_RSP, TEXT("Printer SOP Class"), N_GET_RSP, PRINTSCU_STATUS_RECEIVE_GET_PRINT_JOB_INFO_RSP, TEXT("Print Job SOP Class"), N_GET_RSP, PRINTSCU_STATUS_RECEIVE_GET_PRINTER_CONFIG_RSP, TEXT("Printer Configuration Retrieval SOP Class"), N_GET_RSP, PRINTSCU_STATUS_RECEIVE_CREATE_PRESENTATION_LUT_RSP, TEXT("Presentation LUT SOP Class"), N_CREATE_RSP, PRINTSCU_STATUS_RECEIVE_DELETE_PRESENTATION_LUT_RSP, TEXT("Presentation LUT SOP Class"), N_DELETE_RSP, PRINTSCU_STATUS_RECEIVE_CREATE_OVERLAY_BOX_RSP, TEXT("Basic Print Image Overlay Box SOP Class"), N_CREATE_RSP, PRINTSCU_STATUS_RECEIVE_UPDATE_OVERLAY_BOX_RSP, TEXT("Basic Print Image Overlay Box SOP Class"), N_SET_RSP, PRINTSCU_STATUS_RECEIVE_DELETE_OVERLAY_BOX_RSP, TEXT("Basic Print Image Overlay Box SOP Class"), N_DELETE_RSP, PRINTSCU_STATUS_RECEIVE_CREATE_PULL_PRINT_REQUEST_RSP, TEXT("Pull Print Request SOP Class"), N_CREATE_RSP, PRINTSCU_STATUS_RECEIVE_PRINT_PULL_PRINT_REQUEST_RSP, TEXT("Pull Print Request SOP Class"), N_ACTION_RSP, PRINTSCU_STATUS_RECEIVE_DELETE_PULL_PRINT_REQUEST_RSP, TEXT("Pull Print Request SOP Class"), N_DELETE_RSP }; L_VOID CPrintSCU::OnStatus(L_UINT16 uStatus, L_UINT16 uOperationStatus) { if (!m_pPrintScuSheet) { return; } CString sStatus; switch (uStatus) { case PRINTSCU_STATUS_CONNECT: sStatus = TEXT("Connecting"); break; case PRINTSCU_STATUS_SEND_ASSOCIATE_RQ: sStatus = m_sSendingIndicator + TEXT("A-ASSOCIATE-RQ"); break; case PRINTSCU_STATUS_RECEIVE_ASSOCIATE_RJ: sStatus = m_sReceivingIndicator + TEXT("A-ASSOCIATE-RJ"); break; case PRINTSCU_STATUS_RECEIVE_ASSOCIATE_AC: sStatus = m_sReceivingIndicator + TEXT("A-ASSOCIATE-AC"); break; case PRINTSCU_STATUS_SEND_RELEASE_RQ: sStatus = m_sSendingIndicator + TEXT("A-RELEASE-RQ"); break; case PRINTSCU_STATUS_CLOSE: sStatus = TEXT("Closing"); break; case PRINTSCU_STATUS_RECEIVE_RELEASE_RP: sStatus = m_sReceivingIndicator + TEXT("A-RELEASE-RP"); break; case PRINTSCU_STATUS_RECEIVE_RELEASE_RQ: sStatus = m_sReceivingIndicator + TEXT("A-RELEASE-RQ"); break; case PRINTSCU_STATUS_SEND_RELEASE_RP: sStatus = m_sSendingIndicator + TEXT("A-RELEASE-RP"); break; case PRINTSCU_STATUS_RECEIVE_ABORT: sStatus = m_sReceivingIndicator + TEXT("A-ABORT"); break; } if (sStatus.GetLength()) { m_pPrintScuSheet->m_StatusEditBox.AddStatus(sStatus); if (uStatus == PRINTSCU_STATUS_SEND_RELEASE_RP || uStatus == PRINTSCU_STATUS_RECEIVE_ABORT) { m_pPrintScuSheet->m_AssociationPage.m_bReset = TRUE; switch (m_pPrintScuSheet->GetActiveIndex()) { case ASSOCIATION_PAGE_INDEX: m_pPrintScuSheet->m_AssociationPage.UpdateControlsState(); m_pPrintScuSheet->m_AssociationPage.Reset(); break; case BASIC_PRINT_PAGE_INDEX: m_pPrintScuSheet->m_BasicPrintPage.UpdateControlsState(); break; case PULL_STORED_PRINT_PAGE_INDEX: m_pPrintScuSheet->m_PullStoredPrintPage.UpdateControlsState(); break; case PRINTER_PAGE_INDEX: m_pPrintScuSheet->m_PrinterPage.UpdateControlsState(); break; case PRINT_JOBS_PAGE_INDEX: m_pPrintScuSheet->m_PrintJobsPage.UpdateControlsState(); break; } } return; } int iCount = sizeof(Statuses) / sizeof(Statuses[0]); for (int i = 0; i < iCount; i++) { if (Statuses[i].uStatus == uStatus) { break; } } if (i >= iCount) { return; } CString sSOPClass = Statuses[i].pszSOPClass; if (Statuses[i].uStatus == PRINTSCU_STATUS_SEND_UPDATE_IMAGE_BOX_RQ || Statuses[i].uStatus == PRINTSCU_STATUS_RECEIVE_UPDATE_IMAGE_BOX_RSP) { if (m_pPrintScuSheet->m_BasicPrintPage.m_bGrayscalePrintManagement) { sSOPClass = TEXT("Basic Grayscale Image Box SOP Class"); } else { sSOPClass = TEXT("Basic Color Image Box SOP Class"); } } // Sent Messages switch (Statuses[i].iType) { case N_CREATE_RQ: sStatus = m_sSendingIndicator + TEXT("N-CREATE-RQ"); break; case N_SET_RQ: sStatus = m_sSendingIndicator + TEXT("N-SET-RQ"); break; case N_ACTION_RQ: sStatus = m_sSendingIndicator + TEXT("N-ACTION-RQ"); break; case N_DELETE_RQ: sStatus = m_sSendingIndicator + TEXT("N-DELETE-RQ"); break; case N_GET_RQ: sStatus = m_sSendingIndicator + TEXT("N-GET-RQ"); break; } if (sStatus.GetLength()) { sStatus += TEXT(" (") + sSOPClass + TEXT(")"); m_pPrintScuSheet->m_StatusEditBox.AddStatus(sStatus); return; } // Received Messages switch (Statuses[i].iType) { case N_CREATE_RSP: sStatus = m_sReceivingIndicator + TEXT("N-CREATE-RSP"); break; case N_SET_RSP: sStatus = m_sReceivingIndicator + TEXT("N-SET-RSP"); break; case N_ACTION_RSP: sStatus = m_sReceivingIndicator + TEXT("N-ACTION-RSP"); break; case N_DELETE_RSP: sStatus = m_sReceivingIndicator + TEXT("N-DELETE-RSP"); break; case N_GET_RSP: sStatus = m_sReceivingIndicator + TEXT("N-GET-RSP"); break; } if (sStatus.GetLength()) { sStatus += TEXT(" (") + sSOPClass + TEXT("). Status: "); L_UINT16 uOpStatus = GetLastOperationStatus(); CString sOpStatus; sOpStatus.Format(TEXT("0x%04X"), uOpStatus); sStatus += sOpStatus; if (uOperationStatus == COMMAND_STATUS_SUCCESS) { if (uOpStatus == COMMAND_STATUS_SUCCESS) { sStatus += TEXT(" [Success]"); } else { sStatus += TEXT(" [Warning]"); } } else { sStatus += TEXT(" [Failure]"); } m_pPrintScuSheet->m_StatusEditBox.AddStatus(sStatus); return; } } L_VOID CPrintSCU::OnPrinterReport(L_UINT16 uEventTypeID, const pPRINTERREPORTINFO pReportInfo) { CString sStatus; sStatus = m_sReceivingIndicator + TEXT("N-EVENT-REPORT-RQ (Printer SOP Class)"); m_pPrintScuSheet->m_StatusEditBox.AddStatus(sStatus); sStatus = m_sSendingIndicator + TEXT("N-EVENT-REPORT-RSP (Printer SOP Class)"); m_pPrintScuSheet->m_StatusEditBox.AddStatus(sStatus); m_pPrintScuSheet->SetActivePage(&m_pPrintScuSheet->m_PrinterPage); m_pPrintScuSheet->m_PrinterPage.AddNotification(uEventTypeID, pReportInfo); } L_VOID CPrintSCU::OnPrintJobReport(L_PCSTR pszPrintJobInstanceUID, L_UINT16 uEventTypeID, const pPRINTJOBREPORTINFO pReportInfo) { CString sStatus; sStatus = m_sReceivingIndicator + TEXT("N-EVENT-REPORT-RQ (Print Job SOP Class)"); m_pPrintScuSheet->m_StatusEditBox.AddStatus(sStatus); sStatus = m_sSendingIndicator + TEXT("N-EVENT-REPORT-RSP (Print Job SOP Class)"); m_pPrintScuSheet->m_StatusEditBox.AddStatus(sStatus); } L_VOID CPrintSCU::Abort() { if (IsAssociated() && SendAbort(PDU_ABORT_SOURCE_USER, 0) == DICOM_SUCCESS) { m_pPrintScuSheet->m_StatusEditBox.AddStatus(m_sSendingIndicator + TEXT("A-ABORT")); } if (IsConnected()) { Close(); m_pPrintScuSheet->m_StatusEditBox.AddStatus(TEXT("Closing")); } } ///////////////////////////////////////////////////////////////////////////// // CPrintScuSheet IMPLEMENT_DYNAMIC(CPrintScuSheet, CPropertySheet) CPrintScuSheet::CPrintScuSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) : CPropertySheet(pszCaption, pParentWnd, iSelectPage) { m_PrintSCU.m_pPrintScuSheet = this; // We need an icon in the title bar of the sheet dialog box m_psh.hInstance = AfxGetApp()->m_hInstance; m_psh.dwFlags |= PSH_USEICONID; m_psh.pszIcon = MAKEINTRESOURCE(IDR_MAINFRAME); // Add the pages of the sheet AddPage(&m_WelcomePage); AddPage(&m_AssociationPage); AddPage(&m_BasicPrintPage); AddPage(&m_PullStoredPrintPage); AddPage(&m_PrinterPage); AddPage(&m_PrintJobsPage); } CPrintScuSheet::~CPrintScuSheet() { } BEGIN_MESSAGE_MAP(CPrintScuSheet, CPropertySheet) //{{AFX_MSG_MAP(CPrintScuSheet) ON_WM_SYSCOMMAND() ON_WM_CREATE() ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() void CPrintScuSheet::DisplayError(L_INT iErrorCode) { if (iErrorCode == DICOM_ERROR_PRINTSCU_FAILURE_STATUS) { return; } if (iErrorCode == DICOM_ERROR_PRINTSCU_TIME_OUT) { m_StatusEditBox.AddStatus(TEXT("An error occurred [Timeout]")); m_AssociationPage.Abort(); return; } CString sStatus; sStatus.Format(TEXT("An error occurred [Error code: %i]"), iErrorCode); m_StatusEditBox.AddStatus(sStatus); } void CPrintScuSheet::FlagPendingOperation(BOOL bPendingOperation) { m_AssociationPage.m_bPendingOperation = bPendingOperation; m_BasicPrintPage.m_bPendingOperation = bPendingOperation; m_PullStoredPrintPage.m_bPendingOperation = bPendingOperation; m_PrinterPage.m_bPendingOperation = bPendingOperation; m_PrintJobsPage.m_bPendingOperation = bPendingOperation; switch (GetActiveIndex()) { case ASSOCIATION_PAGE_INDEX: m_AssociationPage.UpdateControlsState(); break; case BASIC_PRINT_PAGE_INDEX: m_BasicPrintPage.UpdateControlsState(); break; case PULL_STORED_PRINT_PAGE_INDEX: m_PullStoredPrintPage.UpdateControlsState(); break; case PRINTER_PAGE_INDEX: m_PrinterPage.UpdateControlsState(); break; case PRINT_JOBS_PAGE_INDEX: m_PrintJobsPage.UpdateControlsState(); break; } } void CPrintScuSheet::ResetPages() { m_AssociationPage.m_bReset = TRUE; m_BasicPrintPage.m_bReset = TRUE; m_PullStoredPrintPage.m_bReset = TRUE; m_PrinterPage.m_bReset = TRUE; m_PrintJobsPage.m_bReset = TRUE; switch (GetActiveIndex()) { case ASSOCIATION_PAGE_INDEX: m_AssociationPage.Reset(); break; case BASIC_PRINT_PAGE_INDEX: m_BasicPrintPage.Reset(); break; case PULL_STORED_PRINT_PAGE_INDEX: m_PullStoredPrintPage.Reset(); break; case PRINTER_PAGE_INDEX: m_PrinterPage.Reset(); break; case PRINT_JOBS_PAGE_INDEX: m_PrintJobsPage.Reset(); break; } } ///////////////////////////////////////////////////////////////////////////// // CPrintScuSheet message handlers void CPrintScuSheet::OnSysCommand(UINT nID, LPARAM lParam) { switch (nID & 0xFFF0) { case SC_CLOSE: m_PrintSCU.Abort(); break; case IDM_ABOUTBOX: CAboutDlg dlgAbout; dlgAbout.DoModal(); return; } CPropertySheet::OnSysCommand(nID, lParam); } int CPrintScuSheet::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CPropertySheet::OnCreate(lpCreateStruct) == -1) return -1; // We need a minimize button // (WS_SYSMENU: Just to make sure this style is specified) ModifyStyle(0, WS_SYSMENU | WS_MINIMIZEBOX); // Also, we need an "About..." in the system menu CMenu* pSystemMenu = GetSystemMenu(FALSE); pSystemMenu->AppendMenu(MF_SEPARATOR); pSystemMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, TEXT("&About...")); return 0; } BOOL CPrintScuSheet::OnInitDialog() { BOOL bResult = CPropertySheet::OnInitDialog(); CWnd* pHelpBtnWnd = GetDlgItem(IDHELP); // Hide the "OK", "Cancel", "Apply", and "Help" buttons GetDlgItem(IDOK)->ShowWindow(FALSE); GetDlgItem(IDCANCEL)->ShowWindow(FALSE); GetDlgItem(ID_APPLY_NOW)->ShowWindow(FALSE); pHelpBtnWnd->ShowWindow(FALSE); // Now we need to create the the status edit box CRect ClientRect, HelpBtnRect; GetClientRect(&ClientRect); pHelpBtnWnd->GetWindowRect(&HelpBtnRect); ScreenToClient(&HelpBtnRect); // Calculate the position and size of the status edit box int iX = ClientRect.right - HelpBtnRect.right; int iY = HelpBtnRect.top; int iWidth = ClientRect.Width() - (2 * iX); int iHeightFactor = 4; int iHeight = iHeightFactor * HelpBtnRect.Height(); CRect WindowRect, DesktopRect; GetWindowRect(&WindowRect); GetDesktopWindow()->GetWindowRect(&DesktopRect); int iNewHeight = WindowRect.Height() + (iHeightFactor - 1) * HelpBtnRect.Height(); SetWindowPos(NULL, (DesktopRect.Width() - WindowRect.Width()) / 2, (DesktopRect.Height() - iNewHeight) / 2, WindowRect.Width(), iNewHeight, SWP_NOZORDER); // Create the status edit box m_StatusEditBox.CreateEx(WS_EX_CLIENTEDGE, TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | WS_VSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_WANTRETURN, iX, iY, iWidth, iHeight, m_hWnd, HMENU(IDC_EDIT_STATUS)); // Set the font and the font size used by the status edit box LOGFONT LogFont; GetFont()->GetLogFont(&LogFont); lstrcpy(LogFont.lfFaceName, TEXT("Arial")); LogFont.lfHeight = -12; m_StatusEditBoxFont.CreateFontIndirect(&LogFont); m_StatusEditBox.SetFont(&m_StatusEditBoxFont); return bResult; } void CPrintScuSheet::OnDestroy() { CPropertySheet::OnDestroy(); // Delete the font object m_StatusEditBoxFont.DeleteObject(); } BOOL CPrintScuSheet::OnCommand(WPARAM wParam, LPARAM lParam) { if (wParam == IDOK || wParam == IDCANCEL) { return TRUE; } return CPropertySheet::OnCommand(wParam, lParam); }