// AssDlg.cpp : implementation file // #include "stdafx.h" #include "dclient.h" #include "AssDlg.h" #include "PresDlg.h" #include "dclientDlg.h" const WCHAR BASED_CODE _szLicString[] = LEAD_LICENSE_STRING; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif static UINT BITMAPLIST[] = { IDB_UNSELECT, IDB_SELECT, }; #define BMP_UNSELECTED 0 #define BMP_SELECTED 1 ///////////////////////////////////////////////////////////////////////////// // CAssociateDlg dialog CAssociateDlg::CAssociateDlg(CWnd* pParent /*=NULL*/) : CDialog(CAssociateDlg::IDD, pParent) { //{{AFX_DATA_INIT(CAssociateDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_hPDU=0; m_pAbstractList=NULL; m_pLEADDicomNet=NULL; m_pLEADDicomDS=NULL; } void CAssociateDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAssociateDlg) DDX_Control(pDX, IDC_ABSTRACT, m_Abstract); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAssociateDlg, CDialog) //{{AFX_MSG_MAP(CAssociateDlg) ON_NOTIFY(NM_CLICK, IDC_ABSTRACT, OnClickAbstract) ON_NOTIFY(TVN_SELCHANGED, IDC_ABSTRACT, OnSelchangedAbstract) ON_NOTIFY(NM_DBLCLK, IDC_ABSTRACT, OnDblclkAbstract) ON_BN_CLICKED(IDC_SELECT_ALL, OnSelectAll) ON_BN_CLICKED(IDC_DESELECT_ALL, OnDeselectAll) ON_BN_CLICKED(IDC_DEFAULT, OnDefault) ON_BN_CLICKED(IDC_MODIFY, OnModify) ON_WM_CLOSE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAssociateDlg message handlers BOOL CAssociateDlg::OnInitDialog() { CDialog::OnInitDialog(); int i; CBitmap Bitmap; m_bMouse = FALSE; m_Image.Create(12, 12, ILC_MASK, 0, sizeof(BITMAPLIST) / sizeof(BITMAPLIST[0])); for (i = 0; i < sizeof(BITMAPLIST) / sizeof(BITMAPLIST[0]); i++) { Bitmap.LoadBitmap(BITMAPLIST[i]); m_Image.Add(&Bitmap, (COLORREF)0xFFFFFF); Bitmap.DeleteObject(); } m_Abstract.SetImageList(&m_Image, TVSIL_NORMAL); BSTR lpLic = SysAllocString(_szLicString); ILEADDicomFactory *pFactory=NULL; CoCreateInstance(CLSID_LEADDicomFactory, NULL, CLSCTX_ALL, IID_ILEADDicomFactory, (void**)&pFactory); #if _MSC_VER < 1200 m_pLEADDicomNet = (ILEADDicomDS*)pFactory->CreateObject("LEADDicomNet.LEADDicomNet", lpLic); #else ILEADDicomNetPtr spLEADDicomNet=NULL; spLEADDicomNet = pFactory->CreateObject("LEADDicomNet.LEADDicomNet", lpLic); m_pLEADDicomNet = spLEADDicomNet; m_pLEADDicomNet->AddRef();//because when spLEADDicomNet goes out of scope, it will auto Release()! #endif #if _MSC_VER < 1200 m_pLEADDicomDS = (ILEADDicomDS*)pFactory->CreateObject("LEADDicomDS.LEADDicomDS", lpLic); #else ILEADDicomDSPtr spLEADDicomDS=NULL; spLEADDicomDS = pFactory->CreateObject("LEADDicomDS.LEADDicomDS", lpLic); m_pLEADDicomDS = spLEADDicomDS; m_pLEADDicomDS->AddRef();//because when spLEADDicomDS goes out of scope, it will auto Release()! #endif SysFreeString(lpLic); pFactory->Release();//we are done with this now m_pLEADDicomDS->EnableMethodErrors = FALSE; m_pLEADDicomNet->EnableMethodErrors = FALSE; Display(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CAssociateDlg::Display() { long x; short nID; short nRet; CString szOut; m_Abstract.DeleteAllItems(); if(!m_hPDU) { EndDialog(IDCANCEL); return; } else { szOut.Format("%d", m_pLEADDicomNet->GetVersion(m_hPDU)); SetDlgItemText(IDC_VERSION, szOut); SetDlgItemText(IDC_APPLICATION, m_pLEADDicomNet->GetApplication(m_hPDU)); szOut.Format("%ld", m_pLEADDicomNet->GetMaxLength(m_hPDU)); SetDlgItemText(IDC_MAX_LENGTH, szOut); if(m_pLEADDicomNet->IsMaxLengthEnabled(m_hPDU)) CheckDlgButton(IDC_B_MAX_LENGTH, 1); else CheckDlgButton(IDC_B_MAX_LENGTH, 0); SetDlgItemText(IDC_IMPLEMENT_CLASS, m_pLEADDicomNet->GetImplementClass(m_hPDU)); if(m_pLEADDicomNet->IsImplementClass(m_hPDU)) CheckDlgButton(IDC_B_IMPLEMENT_CLASS, 1); else CheckDlgButton(IDC_B_IMPLEMENT_CLASS, 0); SetDlgItemText(IDC_IMPLEMENT_VERSION, m_pLEADDicomNet->GetImplementVersion(m_hPDU)); if(m_pLEADDicomNet->IsImplementVersion(m_hPDU)) CheckDlgButton(IDC_B_IMPLEMENT_VERSION, 1); else CheckDlgButton(IDC_B_IMPLEMENT_VERSION, 0); szOut.Format("%ld", m_pLEADDicomNet->GetInvokedOperationsCount(m_hPDU)); SetDlgItemText(IDC_INVOKED, szOut); szOut.Format("%ld", m_pLEADDicomNet->GetPerformedOperationsCount(m_hPDU)); SetDlgItemText(IDC_PERFORMED, szOut); if(m_pLEADDicomNet->IsAsyncOperations(m_hPDU)) CheckDlgButton(IDC_B_ASYNC_OPERATIONS, 1); else CheckDlgButton(IDC_B_ASYNC_OPERATIONS, 0); //create an empty Associate Request if(m_pLEADDicomNet->GethPDU()) m_pLEADDicomNet->FreeAssociate(m_pLEADDicomNet->GethPDU()); if(!m_pAbstractList) { EndDialog(IDCANCEL); return; } else { m_pLEADDicomNet->CreateAssociate(TRUE); //now, add all presentation contexts to the temporary associate CString szAbstract; HTREEITEM hItem=NULL; for(x=0; xGetCount(); x++) { m_pAbstractList->GetText(x, szAbstract); BSTR bstr = szAbstract.AllocSysString(); nRet = m_pLEADDicomDS->FindUID(bstr); if(nRet == 0) { nID = (x + 1) * 2 - 1; nRet = m_pLEADDicomNet->AddPresentation(m_pLEADDicomNet->GethPDU(), nID, 0/* 0 */, bstr); //add to list IDicomUIDItemPtr pCurrentUID=m_pLEADDicomDS->GetCurrentUID(); BSTR bstr2 = pCurrentUID->GetName(); CString cs = bstr2; SysFreeString(bstr2); hItem = m_Abstract.InsertItem(cs, BMP_SELECTED, BMP_SELECTED, TVI_ROOT, TVI_LAST); m_Abstract.SetItemData(hItem, nID); //by default, add 3 transfer syntaxes nRet = m_pLEADDicomNet->AddTransferSyntax(m_pLEADDicomNet->GethPDU(), nID, UID_IMPLICIT_VR_LITTLE_ENDIAN); nRet = m_pLEADDicomNet->AddTransferSyntax(m_pLEADDicomNet->GethPDU(), nID, UID_EXPLICIT_VR_LITTLE_ENDIAN); nRet = m_pLEADDicomNet->AddTransferSyntax(m_pLEADDicomNet->GethPDU(), nID, UID_EXPLICIT_VR_BIG_ENDIAN); //enable role select nRet = m_pLEADDicomNet->SetRoleSelect(m_pLEADDicomNet->GethPDU(), nID, TRUE, PDU_ROLE_SUPPORT, PDU_ROLE_SUPPORT); } SysFreeString(bstr); } } } return; } void CAssociateDlg::OnClickAbstract(NMHDR* pNMHDR, LRESULT* pResult) { HTREEITEM hItem; int nImage1; int nImage2; if(pNMHDR->idFrom == IDC_ABSTRACT) { hItem = m_Abstract.GetSelectedItem(); if(hItem) { m_Abstract.GetItemImage(hItem, nImage1, nImage2); if(nImage1 == BMP_SELECTED) m_Abstract.SetItemImage(hItem, BMP_UNSELECTED, BMP_UNSELECTED); else m_Abstract.SetItemImage(hItem, BMP_SELECTED, BMP_SELECTED); m_bMouse = TRUE; } } *pResult = 0; } void CAssociateDlg::OnSelchangedAbstract(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; int nImage1; int nImage2; if(m_bMouse) { m_Abstract.GetItemImage(pNMTreeView->itemOld.hItem, nImage1, nImage2); if(nImage1 == BMP_SELECTED) m_Abstract.SetItemImage(pNMTreeView->itemOld.hItem, BMP_UNSELECTED, BMP_UNSELECTED); else m_Abstract.SetItemImage(pNMTreeView->itemOld.hItem, BMP_SELECTED, BMP_SELECTED); m_bMouse = FALSE; } *pResult = 0; } void CAssociateDlg::OnDblclkAbstract(NMHDR* pNMHDR, LRESULT* pResult) { HTREEITEM hItem; int nImage1; int nImage2; if(pNMHDR->idFrom == IDC_ABSTRACT) { hItem = m_Abstract.GetSelectedItem(); if(hItem) { m_Abstract.GetItemImage(hItem, nImage1, nImage2); if(nImage1 == BMP_SELECTED) m_Abstract.SetItemImage(hItem, BMP_UNSELECTED, BMP_UNSELECTED); else m_Abstract.SetItemImage(hItem, BMP_SELECTED, BMP_SELECTED); } } *pResult = 0; } void CAssociateDlg::OnSelectAll() { HTREEITEM hItem; hItem = m_Abstract.GetFirstVisibleItem(); if(!hItem) return; while(m_Abstract.GetPrevSiblingItem(hItem) != NULL) { hItem = m_Abstract.GetPrevSiblingItem(hItem); } while(hItem != NULL) { m_Abstract.SetItemImage(hItem, BMP_SELECTED, BMP_SELECTED); hItem = m_Abstract.GetNextSiblingItem(hItem); } } void CAssociateDlg::OnDeselectAll() { HTREEITEM hItem; hItem = m_Abstract.GetFirstVisibleItem(); if(!hItem) return; while (m_Abstract.GetPrevSiblingItem(hItem) != NULL) { hItem = m_Abstract.GetPrevSiblingItem(hItem); } while (hItem != NULL) { m_Abstract.SetItemImage(hItem, BMP_UNSELECTED, BMP_UNSELECTED); hItem = m_Abstract.GetNextSiblingItem(hItem); } } void CAssociateDlg::OnDefault() { short nRet; long nType; //reset the UID list m_pLEADDicomDS->ResetUID(); m_pLEADDicomDS->DefaultUID(); //reset the abstract list nRet = m_pLEADDicomDS->MoveFirstUID(); while(nRet == 0) { IDicomUIDItemPtr pCurrentUID = m_pLEADDicomDS->GetCurrentUID(); nType = pCurrentUID->GetType(); if((nType == DICOM_UID_TYPE_CLASS)||(nType == DICOM_UID_TYPE_META_CLASS))// Is it an Abstract Syntax? { BSTR bstr = pCurrentUID->GetCode(); CString cs=bstr; m_pAbstractList->AddString(cs); SysFreeString(bstr); } nRet = m_pLEADDicomDS->MoveNextUID(); } Display(); } void CAssociateDlg::OnModify() { CPresentationContextDlg dlg; HTREEITEM hItem=NULL; hItem = m_Abstract.GetSelectedItem(); if(!hItem) return; dlg.m_hPDU = m_pLEADDicomNet->GethPDU(); dlg.m_nID = (short)m_Abstract.GetItemData(hItem); BSTR bstr = m_pLEADDicomNet->GetPresentationAbstract(dlg.m_hPDU, dlg.m_nID); dlg.m_szAbstract = bstr; SysFreeString(bstr); dlg.DoModal(); } void CAssociateDlg::OnOK() { long x, y; CString szAbstract; CString szTransfer; short nID; short nUser; short nProvider; long lBytes; short nVersion; long nMaxLen; short nInvoked; short nPerformed; if(m_pLEADDicomNet->GetPresentationCount(m_pLEADDicomNet->GethPDU()) < 1) { MessageBox("At least one Abstract Syntax must be selected!", "Error", MB_OK); return; } //set the associate parameters ((CDclientDlg*)AfxGetMainWnd())->m_pLEADDicomNet1->ResetAssociate(m_hPDU, TRUE); nVersion = 1; //default nVersion = GetDlgItemInt(IDC_VERSION, NULL, FALSE); m_pLEADDicomNet->SetVersion(m_hPDU, nVersion); CString szApp; GetDlgItemText(IDC_APPLICATION, szApp); BSTR bstr = szApp.AllocSysString(); m_pLEADDicomNet->SetApplication(m_hPDU, bstr); SysFreeString(bstr); if(IsDlgButtonChecked(IDC_B_MAX_LENGTH) == 1) { nMaxLen = 16384; //default nMaxLen = GetDlgItemInt(IDC_MAX_LENGTH, NULL, FALSE); m_pLEADDicomNet->SetMaxLength(m_hPDU, TRUE, nMaxLen); } else m_pLEADDicomNet->SetMaxLength(m_hPDU, FALSE, 16384); if(IsDlgButtonChecked(IDC_B_IMPLEMENT_CLASS) == 1) { CString szClass; GetDlgItemText(IDC_IMPLEMENT_CLASS, szClass); BSTR bstr = szClass.AllocSysString(); m_pLEADDicomNet->SetImplementClass(m_hPDU, TRUE, bstr); SysFreeString(bstr); } else m_pLEADDicomNet->SetImplementClass(m_hPDU, FALSE, " "); if(IsDlgButtonChecked(IDC_B_IMPLEMENT_VERSION) == 1) { CString szVersion; GetDlgItemText(IDC_IMPLEMENT_CLASS, szVersion); BSTR bstr = szVersion.AllocSysString(); m_pLEADDicomNet->SetImplementVersion(m_hPDU, TRUE, bstr); SysFreeString(bstr); } else m_pLEADDicomNet->SetImplementVersion(m_hPDU, FALSE, " "); if(IsDlgButtonChecked(IDC_B_ASYNC_OPERATIONS) == 1) { nInvoked = 1; //default nPerformed = 1; //default nInvoked = GetDlgItemInt(IDC_INVOKED, NULL, FALSE); nPerformed = GetDlgItemInt(IDC_PERFORMED, NULL, FALSE); m_pLEADDicomNet->SetAsyncOperations(m_hPDU, TRUE, nInvoked, nPerformed); } else m_pLEADDicomNet->SetAsyncOperations(m_hPDU, FALSE, 0, 0); int nImage1; int nImage2; HTREEITEM hItem=NULL; //copy the presentation contexts from the temporary associate for(x=0; xGetPresentationCount(m_pLEADDicomNet->GethPDU()); x++) { if(!hItem) hItem = m_Abstract.GetRootItem(); else hItem = m_Abstract.GetNextItem(hItem, TVGN_NEXT); m_Abstract.GetItemImage(hItem, nImage1, nImage2); if(nImage1 == BMP_SELECTED) { nID = m_pLEADDicomNet->GetPresentationID(m_pLEADDicomNet->GethPDU(), x); BSTR bstr = m_pLEADDicomNet->GetPresentationAbstract(m_pLEADDicomNet->GethPDU(), nID); szAbstract = bstr; m_pLEADDicomNet->AddPresentation(m_hPDU, nID, 0/* 0 */, bstr); SysFreeString(bstr); //add the transfer syntax(es) for(y=0; yGetTransferCount(m_pLEADDicomNet->GethPDU(), nID); y++) { BSTR bstr=m_pLEADDicomNet->GetTransferSyntax(m_pLEADDicomNet->GethPDU(), nID, y); szTransfer = bstr; m_pLEADDicomNet->AddTransferSyntax(m_hPDU, nID, bstr); SysFreeString(bstr); } //user and provider role if(m_pLEADDicomNet->IsRoleSelect(m_pLEADDicomNet->GethPDU(), nID)) { nUser = m_pLEADDicomNet->GetUserRole(m_pLEADDicomNet->GethPDU(), nID); nProvider = m_pLEADDicomNet->GetProviderRole(m_pLEADDicomNet->GethPDU(), nID); m_pLEADDicomNet->SetRoleSelect(m_hPDU, nID, TRUE, nUser, nProvider); } //extended association VARIANT ExtData; VariantInit(&ExtData); lBytes = m_pLEADDicomNet->GetExtendedDataLength(m_pLEADDicomNet->GethPDU(), nID); if(lBytes > 0) { ExtData = m_pLEADDicomNet->GetExtendedData(m_pLEADDicomNet->GethPDU(), nID); m_pLEADDicomNet->SetExtendedData(m_hPDU, nID, &ExtData, lBytes); } VariantClear(&ExtData); } } CDialog::OnOK(); } void CAssociateDlg::OnClose() { if(m_pLEADDicomNet) m_pLEADDicomNet->Release(); if(m_pLEADDicomDS) m_pLEADDicomDS->Release(); m_pLEADDicomNet=NULL; m_pLEADDicomDS=NULL; CDialog::OnClose(); }