// SelectSystemsDlg.cpp : implementation file // #include "stdafx.h" #include "snapin.h" #include "SelectSystemsDlg.h" #include #include #include #include #include #include #include #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CSelectSystemsDlg dialog CSelectSystemsDlg::CSelectSystemsDlg(CWnd* pParent /*=NULL*/) : CResizeableDialog(CSelectSystemsDlg::IDD, pParent) { //{{AFX_DATA_INIT(CSelectSystemsDlg) m_sDomain = _T(""); m_sSystems = _T(""); //}}AFX_DATA_INIT } void CSelectSystemsDlg::DoDataExchange(CDataExchange* pDX) { CResizeableDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSelectSystemsDlg) DDX_Control(pDX, IDC_EDIT_SYSTEMS, m_SystemsEditBox); DDX_Control(pDX, IDC_LIST_SYSTEMS, m_SystemsList); DDX_Control(pDX, IDC_COMBO_DOMAIN, m_Domains); DDX_CBString(pDX, IDC_COMBO_DOMAIN, m_sDomain); DDX_Text(pDX, IDC_EDIT_SYSTEMS, m_sSystems); //}}AFX_DATA_MAP CWnd* pCheckNamesBtn = NULL; if( (pCheckNamesBtn = GetDlgItem(IDC_BUTTON_CHECK_NAMES)) != NULL ) { pCheckNamesBtn->EnableWindow( ! m_sSystems.IsEmpty() ); } } UINT CSelectSystemsDlg::AddDomains(LPVOID pParam) { CWaitCursor wait; HWND* pHwnd = (HWND*)pParam; if( ! pHwnd ) { return 1L; } if( ! ::IsWindow(*pHwnd) ) { return 1L; } HWND hDomainCombobox = ::GetDlgItem(*pHwnd,IDC_COMBO_DOMAIN); ::EnableWindow(hDomainCombobox,FALSE); CString sWindowTitle; sWindowTitle.LoadString(IDS_STRING_WORKING); ::SetWindowText(hDomainCombobox,sWindowTitle); // enumerate all domains NET_API_STATUS status = NERR_Success; LPSERVER_INFO_100 lpserverinfo = NULL; DWORD dwTotalEntries = 0L; DWORD dwEntriesRead = 0L; DWORD dwResumeHandle = 0L; DWORD dwSize = MAX_PREFERRED_LENGTH; status = NetServerEnum(NULL,100,(LPBYTE*)&lpserverinfo,dwSize,&dwEntriesRead,&dwTotalEntries, SV_TYPE_DOMAIN_ENUM,NULL,&dwResumeHandle); if( status != NERR_Success && status == ERROR_MORE_DATA ) { lpserverinfo = NULL; dwSize = sizeof(SERVER_INFO_100)*dwTotalEntries*_MAX_PATH; dwTotalEntries = 0L; dwEntriesRead = 0L; dwResumeHandle = 0L; status = NetServerEnum(NULL,100,(LPBYTE*)&lpserverinfo,dwSize,&dwEntriesRead,&dwTotalEntries, SV_TYPE_DOMAIN_ENUM,NULL,&dwResumeHandle); } ::SendDlgItemMessage(*pHwnd,IDC_COMBO_DOMAIN,CB_RESETCONTENT,0,0); for( DWORD dw = 0L; dw < dwTotalEntries; dw++ ) { CString sDomainName = lpserverinfo[dw].sv100_name; // add domains to the combobox ::SendMessage(hDomainCombobox,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)sDomainName); } NetApiBufferFree(lpserverinfo); ::SetWindowText(hDomainCombobox,_T("")); ::EnableWindow(hDomainCombobox,TRUE); delete pHwnd; return 0L; } UINT CSelectSystemsDlg::AddSystems(LPVOID pParam) { CWaitCursor wait; HWND* pHwnd = (HWND*)pParam; if( ! pHwnd ) { return 1L; } if( ! ::IsWindow(*pHwnd) ) { return 1L; } HWND hSystemListCtrl = ::GetDlgItem(*pHwnd,IDC_LIST_SYSTEMS); HWND hDomainCombobox = ::GetDlgItem(*pHwnd,IDC_COMBO_DOMAIN); ::EnableWindow(hSystemListCtrl,FALSE); ::EnableWindow(hDomainCombobox,FALSE); ListView_DeleteAllItems(hSystemListCtrl); // add the "Working..." item CString sText; sText.LoadString(IDS_STRING_WORKING); LVITEM lvi; ZeroMemory(&lvi,sizeof(LVITEM)); lvi.mask = LVIF_TEXT; lvi.pszText = (LPTSTR)(LPCTSTR)sText; ListView_InsertItem(hSystemListCtrl,&lvi); ListView_SetColumnWidth(hSystemListCtrl,0,LVSCW_AUTOSIZE_USEHEADER); ListView_SetColumnWidth(hSystemListCtrl,1,LVSCW_AUTOSIZE_USEHEADER); // get the domain name from the combobox CString sDomainName; int iCurSel = (int)::SendDlgItemMessage(*pHwnd,IDC_COMBO_DOMAIN,CB_GETCURSEL,0,0); if( iCurSel != -1 ) { int iTextLen = (int)::SendDlgItemMessage(*pHwnd,IDC_COMBO_DOMAIN,CB_GETLBTEXTLEN,iCurSel,0); ::SendDlgItemMessage(*pHwnd,IDC_COMBO_DOMAIN,CB_GETLBTEXT,iCurSel,(LPARAM)sDomainName.GetBuffer(iTextLen + 1)); sDomainName.ReleaseBuffer(); } else { int iTextLen = ::GetWindowTextLength(hDomainCombobox); ::GetWindowText(hDomainCombobox,sDomainName.GetBuffer(iTextLen+1),iTextLen+1); sDomainName.ReleaseBuffer(); } // enumerate for all the systems in the domain NET_API_STATUS status = NERR_Success; LPSERVER_INFO_101 lpserverinfo = NULL; DWORD dwTotalEntries = 0L; DWORD dwEntriesRead = 0L; DWORD dwResumeHandle = 0L; DWORD dwSize = MAX_PREFERRED_LENGTH; status = NetServerEnum(NULL,101,(LPBYTE*)&lpserverinfo,dwSize,&dwEntriesRead,&dwTotalEntries, SV_TYPE_NT,sDomainName,&dwResumeHandle); if( status != NERR_Success && status == ERROR_MORE_DATA ) { lpserverinfo = NULL; dwSize = sizeof(SERVER_INFO_101)*dwTotalEntries*_MAX_PATH; dwTotalEntries = 0L; dwEntriesRead = 0L; dwResumeHandle = 0L; status = NetServerEnum(NULL,101,(LPBYTE*)&lpserverinfo,dwSize,&dwEntriesRead,&dwTotalEntries, SV_TYPE_NT,sDomainName,&dwResumeHandle); } ListView_DeleteAllItems(hSystemListCtrl); bool bCommentFound = false; for( DWORD dw = 0L; dw < dwTotalEntries; dw++ ) { CString sSystemName = lpserverinfo[dw].sv101_name; // add system to the list control LVITEM lvi; ZeroMemory(&lvi,sizeof(LVITEM)); lvi.mask = LVIF_TEXT; lvi.pszText = (LPTSTR)(LPCTSTR)sSystemName; int iItemIndex = ListView_InsertItem(hSystemListCtrl,&lvi); lvi.iItem = iItemIndex; lvi.iSubItem = 1; lvi.pszText = lpserverinfo[dw].sv101_comment; if( _tcslen(lvi.pszText) > 0 ) { bCommentFound = true; ListView_SetItem(hSystemListCtrl,&lvi); } } if( dwTotalEntries <= 0L ) { ListView_SetColumnWidth(hSystemListCtrl,0,LVSCW_AUTOSIZE_USEHEADER); } else { ListView_SetColumnWidth(hSystemListCtrl,0,LVSCW_AUTOSIZE); } if( bCommentFound ) { ListView_SetColumnWidth(hSystemListCtrl,1,LVSCW_AUTOSIZE); } else { ListView_SetColumnWidth(hSystemListCtrl,1,LVSCW_AUTOSIZE_USEHEADER); } NetApiBufferFree(lpserverinfo); ::EnableWindow(hSystemListCtrl,TRUE); ::EnableWindow(hDomainCombobox,TRUE); delete pHwnd; return 0L; } void CSelectSystemsDlg::CompileArrayOfSystems() { m_saSystems.RemoveAll(); LPTSTR lpszSystems = new TCHAR[m_sSystems.GetLength()+1]; _tcscpy(lpszSystems,m_sSystems); LPTSTR lpszToken = _tcstok(lpszSystems,_T(";")); while( lpszToken ) { CString sSystem = lpszToken; sSystem.TrimLeft(_T(" ")); sSystem.TrimRight(_T(" ")); m_saSystems.Add(sSystem); lpszToken = _tcstok(NULL,_T(";")); } delete[] lpszSystems; } bool CSelectSystemsDlg::IsInSystemArray(const CString& sSystem) { for( int i = 0; i < m_saSystems.GetSize(); i++ ) { if( m_saSystems[i] == sSystem ) { return true; } } return false; } bool CSelectSystemsDlg::CheckSystemNames() { CWaitCursor wait; for( int i = (int)m_saSystems.GetSize()-1; i >= 0; i-- ) { IWbemServices* pServices = NULL; BOOL bAvail = FALSE; if( ! m_saSystems[i].IsEmpty() ) { HRESULT hr = CnxGetConnection(m_saSystems[i],pServices,bAvail); if( hr == E_FAIL ) { MessageBeep(MB_ICONEXCLAMATION); int iIndex = m_sSystems.Find(m_saSystems[i]); m_SystemsEditBox.SetFocus(); m_SystemsEditBox.SetSel(iIndex,iIndex+m_saSystems[i].GetLength(),TRUE); CnxDisplayErrorMsgBox(hr,m_saSystems[i]); return false; } if( pServices ) { pServices->Release(); } } else { m_saSystems.RemoveAt(i); } } return true; } BEGIN_MESSAGE_MAP(CSelectSystemsDlg, CResizeableDialog) //{{AFX_MSG_MAP(CSelectSystemsDlg) ON_NOTIFY(NM_DBLCLK, IDC_LIST_SYSTEMS, OnDblclkListSystems) ON_BN_CLICKED(IDC_BUTTON_HELP, OnButtonHelp) ON_CBN_DROPDOWN(IDC_COMBO_DOMAIN, OnDropdownComboDomain) ON_CBN_CLOSEUP(IDC_COMBO_DOMAIN, OnCloseupComboDomain) ON_CBN_SELENDOK(IDC_COMBO_DOMAIN, OnSelendokComboDomain) ON_EN_CHANGE(IDC_EDIT_SYSTEMS, OnChangeEditSystems) ON_BN_CLICKED(IDC_BUTTON_CHECK_NAMES, OnButtonCheckNames) ON_NOTIFY(NM_SETFOCUS, IDC_LIST_SYSTEMS, OnSetfocusListSystems) ON_NOTIFY(NM_KILLFOCUS, IDC_LIST_SYSTEMS, OnKillfocusListSystems) ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd) ON_NOTIFY(NM_CLICK, IDC_LIST_SYSTEMS, OnClickListSystems) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSelectSystemsDlg message handlers BOOL CSelectSystemsDlg::OnInitDialog() { CResizeableDialog::OnInitDialog(); SetControlInfo(IDC_STATIC_TITLE, ANCHOR_LEFT | ANCHOR_TOP ); SetControlInfo(IDC_STATIC_BAR, ANCHOR_LEFT | ANCHOR_TOP | RESIZE_HOR); SetControlInfo(IDC_STATIC_LOOK_IN, ANCHOR_LEFT | ANCHOR_TOP ); SetControlInfo(IDC_LIST_SYSTEMS, ANCHOR_LEFT | ANCHOR_TOP | RESIZE_HOR | RESIZE_VER); SetControlInfo(IDC_COMBO_DOMAIN, ANCHOR_LEFT | ANCHOR_TOP | RESIZE_HOR); SetControlInfo(IDC_BUTTON_ADD, ANCHOR_BOTTOM | ANCHOR_LEFT ); SetControlInfo(IDC_BUTTON_CHECK_NAMES, ANCHOR_BOTTOM | ANCHOR_LEFT ); SetControlInfo(IDC_EDIT_SYSTEMS, ANCHOR_BOTTOM | ANCHOR_LEFT | RESIZE_HOR ); SetControlInfo(IDOK, ANCHOR_BOTTOM | ANCHOR_LEFT ); SetControlInfo(IDCANCEL, ANCHOR_BOTTOM | ANCHOR_LEFT ); SetControlInfo(IDC_BUTTON_HELP, ANCHOR_BOTTOM | ANCHOR_LEFT ); NET_API_STATUS status = NERR_Success; LPWKSTA_INFO_100 pinfo = NULL; status = NetWkstaGetInfo(NULL,100,(LPBYTE*)&pinfo); if( status == NERR_Success ) { m_Domains.AddString(pinfo->wki100_langroup); m_Domains.SetCurSel(0); OnSelendokComboDomain(); } NetApiBufferFree(pinfo); CString sTitle; sTitle.LoadString(IDS_STRING_NAME); m_SystemsList.InsertColumn(0,sTitle,LVCFMT_LEFT,LVSCW_AUTOSIZE_USEHEADER); sTitle.LoadString(IDS_STRING_COMMENT); m_SystemsList.InsertColumn(1,sTitle,LVCFMT_LEFT,LVSCW_AUTOSIZE_USEHEADER); m_SystemsList.SetColumnWidth(0,LVSCW_AUTOSIZE_USEHEADER); m_SystemsList.SetColumnWidth(1,LVSCW_AUTOSIZE_USEHEADER); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CSelectSystemsDlg::OnButtonAdd() { CompileArrayOfSystems(); if( ! m_sSystems.IsEmpty() ) { m_sSystems += _T(" ; "); } POSITION pos = m_SystemsList.GetFirstSelectedItemPosition(); int iIndex = 0; while( pos && iIndex >= 0 ) { iIndex = m_SystemsList.GetNextSelectedItem(pos); CString sSystem = m_SystemsList.GetItemText(iIndex,0); if( ! IsInSystemArray(sSystem) ) { m_sSystems += sSystem + _T(" ; "); } } m_sSystems.TrimRight(_T(" ; ")); UpdateData(FALSE); GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(FALSE); } void CSelectSystemsDlg::OnButtonCheckNames() { GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(FALSE); CompileArrayOfSystems(); CheckSystemNames(); } void CSelectSystemsDlg::OnClickListSystems(NMHDR* pNMHDR, LRESULT* pResult) { if( m_SystemsList.GetItemCount() ) { GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(TRUE); } *pResult = 0; } void CSelectSystemsDlg::OnDblclkListSystems(NMHDR* pNMHDR, LRESULT* pResult) { OnButtonAdd(); *pResult = 0; } void CSelectSystemsDlg::OnOK() { CWaitCursor wait; CompileArrayOfSystems(); if( m_saSystems.GetSize() == 0 ) { return; } if( ! CheckSystemNames() ) { return; } CResizeableDialog::OnOK(); } void CSelectSystemsDlg::OnCancel() { m_saSystems.RemoveAll(); CResizeableDialog::OnCancel(); } void CSelectSystemsDlg::OnButtonHelp() { MMCPropertyHelp(_T("HMon21.chm::/dnewsys.htm")); // 62212 } void CSelectSystemsDlg::OnDropdownComboDomain() { if( m_Domains.GetCount() <= 1 ) { AfxBeginThread((AFX_THREADPROC)AddDomains,new HWND(GetSafeHwnd())); } GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(FALSE); } void CSelectSystemsDlg::OnCloseupComboDomain() { // TODO: Add your control notification handler code here } void CSelectSystemsDlg::OnSelendokComboDomain() { if( m_SystemsList.IsWindowEnabled() ) { AfxBeginThread((AFX_THREADPROC)AddSystems,new HWND(GetSafeHwnd())); GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(FALSE); } } void CSelectSystemsDlg::OnChangeEditSystems() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CResizeableDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(FALSE); UpdateData(); } void CSelectSystemsDlg::OnSetfocusListSystems(NMHDR* pNMHDR, LRESULT* pResult) { if( m_SystemsList.GetItemCount() ) { GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(TRUE); } *pResult = 0; } void CSelectSystemsDlg::OnKillfocusListSystems(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; }