|
|
//-----------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: A U N I D L G . C P P
//
// Contents: ATMUNI call manager dialogbox message handler implementation
//
// Notes:
//
// Author: tongl 21 Mar 1997
//
//-----------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "arpsobj.h"
#include "auniobj.h"
#include "atmutil.h"
#include "aunidlg.h"
#include "ncatlui.h"
#include "ncstl.h"
//#include "ncui.h"
#include "atmhelp.h"
const int c_nColumns =3; const int c_nMAX_PVC_ID_LEN =10; //
// CUniPage
//
CUniPage::CUniPage(CAtmUniCfg * pAtmUniCfg, const DWORD * adwHelpIDs) { Assert(pAtmUniCfg); m_patmunicfg = pAtmUniCfg; m_adwHelpIDs = adwHelpIDs;
m_pAdapterInfo = pAtmUniCfg->GetSecondMemoryAdapterInfo(); m_fModified = FALSE; }
CUniPage::~CUniPage() { }
LRESULT CUniPage::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { // initialize PVC name list view
int nIndex; m_hPVCList = GetDlgItem(IDC_LVW_PVC_LIST);
// Calculate column width
RECT rect;
::GetClientRect(m_hPVCList, &rect); int colWidth = (rect.right/(c_nColumns*2));
// set the column header
// The mask specifies that the fmt, width and pszText members
// of the structure are valid
LV_COLUMN lvCol = {0}; lvCol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT ; lvCol.fmt = LVCFMT_LEFT; // left-align column
// Add the two columns and header text.
for (nIndex = 0; nIndex < c_nColumns; nIndex++) { // column header text
if (0 == nIndex) // first column
{ lvCol.cx = colWidth*4; lvCol.pszText = (PWSTR) SzLoadIds(IDS_PVC_NAME); } else if (1 == nIndex) { lvCol.cx = colWidth; lvCol.pszText = (PWSTR) SzLoadIds(IDS_PVC_VPI); } else if (2 == nIndex) { lvCol.cx = colWidth; lvCol.pszText = (PWSTR) SzLoadIds(IDS_PVC_VCI); }
int iNewItem = ListView_InsertColumn(GetDlgItem(IDC_LVW_PVC_LIST), nIndex, &lvCol);
AssertSz((iNewItem == nIndex), "Invalid item inserted to list view !"); }
// insert existing PVCs into the list view
int idx =0;
for (PVC_INFO_LIST::iterator iterPvc = m_pAdapterInfo->m_listPVCs.begin(); iterPvc != m_pAdapterInfo->m_listPVCs.end(); iterPvc ++) { if ((*iterPvc)->m_fDeleted) continue;
InsertNewPvc(*iterPvc, idx); idx++; }
// select the first item
ListView_SetItemState(GetDlgItem(IDC_LVW_PVC_LIST), 0, LVIS_SELECTED, LVIS_SELECTED);
SetButtons(); return 0; }
LRESULT CUniPage::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs); return 0; }
LRESULT CUniPage::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled) { LPHELPINFO lphi = reinterpret_cast<LPHELPINFO>(lParam); Assert(lphi);
if (HELPINFO_WINDOW == lphi->iContextType) { ShowContextHelp(static_cast<HWND>(lphi->hItemHandle), HELP_WM_HELP, m_adwHelpIDs); }
return 0; }
LRESULT CUniPage::OnApply(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { BOOL nResult = PSNRET_NOERROR;
if (!IsModified()) { ::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, nResult); return nResult; }
m_patmunicfg->SetSecondMemoryModified(); SetModifiedTo(FALSE); // this page is no longer modified
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, nResult); return nResult; }
LRESULT CUniPage::OnKillActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { BOOL err = FALSE;
// Error checking: unique Vci\Vpi pair
int iDupPvcIdx = CheckDupPvcId();
if (iDupPvcIdx >=0) { NcMsgBox(m_hWnd, IDS_MSFT_UNI_TEXT, IDS_DUPLICATE_PVC, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
ListView_SetItemState(GetDlgItem(IDC_LVW_PVC_LIST), iDupPvcIdx, LVIS_SELECTED, LVIS_SELECTED); err = TRUE; }
return err; }
int CUniPage::CheckDupPvcId() { int ret = -1; int idx = 0;
for(PVC_INFO_LIST::iterator iterPvc = m_pAdapterInfo->m_listPVCs.begin(); iterPvc != m_pAdapterInfo->m_listPVCs.end(); iterPvc ++) { if ((*iterPvc)->m_fDeleted) continue;
PVC_INFO_LIST::iterator iterPvcComp = iterPvc;
iterPvcComp ++; while (iterPvcComp != m_pAdapterInfo->m_listPVCs.end()) { if (!(*iterPvcComp)->m_fDeleted) { if ( ((*iterPvc)->m_dwVpi == (*iterPvcComp)->m_dwVpi) && ((*iterPvc)->m_dwVci == (*iterPvcComp)->m_dwVci)) { // we find a duplicate address
ret = idx; break; } } iterPvcComp++; }
// duplicate address found
if (ret >=0 ) break;
// move next
idx ++; }
return ret; }
LRESULT CUniPage::OnActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { return 0; }
LRESULT CUniPage::OnCancel(int idCtrl, LPNMHDR pnmh, BOOL& fHandled) { return 0; }
LRESULT CUniPage::OnAddPVC(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { // make a new PVC Info structure and pass to the dialog
tstring strNewPvcId; GetNewPvcId(m_pAdapterInfo, &strNewPvcId);
CPvcInfo * pDlgPvcInfo = new CPvcInfo(strNewPvcId.c_str());
if (pDlgPvcInfo == NULL) { return(ERROR_NOT_ENOUGH_MEMORY); }
pDlgPvcInfo->m_dwPVCType = PVC_CUSTOM; pDlgPvcInfo->SetDefaults(PVC_CUSTOM);
CPVCMainDialog * pPvcMainDlg = new CPVCMainDialog(this, pDlgPvcInfo, g_aHelpIDs_IDD_PVC_Main); if (pPvcMainDlg == NULL) { return(ERROR_NOT_ENOUGH_MEMORY); }
if (pPvcMainDlg->DoModal() == IDOK) { // add the new PVC
m_pAdapterInfo->m_listPVCs.push_back(pDlgPvcInfo);
int nCount = ListView_GetItemCount(m_hPVCList);
// insert the new item at the end of list
InsertNewPvc(pDlgPvcInfo, nCount);
SetButtons(); PageModified(); } else { delete pDlgPvcInfo; }
delete pPvcMainDlg; return 0; }
LRESULT CUniPage::OnPVCProperties(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { // mark the PVC as deleted and from the list view
// get the current selected item and remove it
int iSelected = ListView_GetNextItem(m_hPVCList, -1, LVNI_SELECTED);
if (iSelected != -1) { LV_ITEM lvItem; lvItem.mask = LVIF_PARAM; lvItem.iItem = iSelected; lvItem.iSubItem = 0;
if (ListView_GetItem(m_hPVCList, &lvItem)) { CPvcInfo * pPvcInfo = NULL;
pPvcInfo = reinterpret_cast<CPvcInfo *>(lvItem.lParam);
if (pPvcInfo) { CPvcInfo * pDlgPvcInfo = new CPvcInfo(pPvcInfo->m_strPvcId.c_str());
if (pDlgPvcInfo) { *pDlgPvcInfo = *pPvcInfo;
CPVCMainDialog * pPvcMainDlg = new CPVCMainDialog(this, pDlgPvcInfo, g_aHelpIDs_IDD_PVC_Main);
if (pPvcMainDlg->DoModal() == IDOK) { // update PVC info
*pPvcInfo = *pDlgPvcInfo;
// update the list view
UpdatePvc(pDlgPvcInfo, iSelected);
// set the new state of the Add\Remove\Property buttons
SetButtons();
if (pPvcMainDlg->m_fDialogModified) PageModified(); }
delete pDlgPvcInfo;
delete pPvcMainDlg; } } } } else // no current selection
{ NcMsgBox(::GetActiveWindow(), IDS_MSFT_UNI_TEXT, IDS_NO_ITEM_SELECTED, MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK); } return 0; }
LRESULT CUniPage::OnRemovePVC(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { // get the selected PVC, make a copy and pass to the dialog
int iSelected = ListView_GetNextItem(m_hPVCList, -1, LVNI_SELECTED);
if (iSelected != -1) { LV_ITEM lvItem; lvItem.mask = LVIF_PARAM; lvItem.iItem = iSelected; lvItem.iSubItem = 0;
if (ListView_GetItem(m_hPVCList, &lvItem)) { CPvcInfo * pPvcInfo = NULL;
pPvcInfo = reinterpret_cast<CPvcInfo *>(lvItem.lParam); if (pPvcInfo) { // mark as deleted
pPvcInfo->m_fDeleted = TRUE;
// delete from list view
ListView_DeleteItem(m_hPVCList, iSelected); } }
SetButtons(); PageModified(); }
return 0; }
LRESULT CUniPage::OnPVCListChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { return 0; }
void CUniPage::InsertNewPvc(CPvcInfo * pPvcInfo, int idx) { LV_ITEM lvItem = {0}; lvItem.mask = LVIF_TEXT | LVIF_PARAM;
int ret;
// name
lvItem.iItem = idx; lvItem.iSubItem=0; lvItem.lParam = reinterpret_cast<LPARAM>(pPvcInfo); lvItem.pszText = (PWSTR)(pPvcInfo->m_strName.c_str());
ret = ListView_InsertItem(m_hPVCList, &lvItem);
// VPI
lvItem.iItem = idx; lvItem.iSubItem=1;
WCHAR szVpi[MAX_VPI_LENGTH]; wsprintfW(szVpi, c_szItoa, pPvcInfo->m_dwVpi); lvItem.pszText = szVpi;
SendDlgItemMessage(IDC_LVW_PVC_LIST, LVM_SETITEMTEXT, idx, (LPARAM)&lvItem);
// VCI
lvItem.iItem = idx; lvItem.iSubItem=2;
WCHAR szVci[MAX_VCI_LENGTH]; wsprintfW(szVci, c_szItoa, pPvcInfo->m_dwVci); lvItem.pszText = szVci;
SendDlgItemMessage(IDC_LVW_PVC_LIST, LVM_SETITEMTEXT, idx, (LPARAM)&lvItem); }
void CUniPage::UpdatePvc(CPvcInfo * pPvcInfo, int idx) { LV_ITEM lvItem = {0}; lvItem.mask = LVIF_TEXT;
int ret;
// name
lvItem.iItem = idx; lvItem.iSubItem=0; lvItem.pszText = (PWSTR)(pPvcInfo->m_strName.c_str());
ret = SendDlgItemMessage(IDC_LVW_PVC_LIST, LVM_SETITEMTEXT, idx, (LPARAM)&lvItem);
// VPI
lvItem.iItem = idx; lvItem.iSubItem=1;
WCHAR szVpi[MAX_VPI_LENGTH]; wsprintfW(szVpi, c_szItoa, pPvcInfo->m_dwVpi); lvItem.pszText = szVpi;
ret = SendDlgItemMessage(IDC_LVW_PVC_LIST, LVM_SETITEMTEXT, idx, (LPARAM)&lvItem);
// VCI
lvItem.iItem = idx; lvItem.iSubItem=2;
WCHAR szVci[MAX_VCI_LENGTH]; wsprintfW(szVci, c_szItoa, pPvcInfo->m_dwVci); lvItem.pszText = szVci;
ret = SendDlgItemMessage(IDC_LVW_PVC_LIST, LVM_SETITEMTEXT, idx, (LPARAM)&lvItem); }
void CUniPage::SetButtons() { int nCount = ListView_GetItemCount(m_hPVCList);
if (nCount == 0) ::SetFocus(m_hPVCList);
::EnableWindow(GetDlgItem(IDC_PBN_PVC_Remove), nCount); ::EnableWindow(GetDlgItem(IDC_PBN_PVC_Properties), nCount);
}
void CUniPage::GetNewPvcId(CUniAdapterInfo * pAdapterInfo, tstring * pstrNewPvcId) { Assert(pstrNewPvcId);
tstring strPvcId; WCHAR szPvcId[c_nMAX_PVC_ID_LEN];
int uiPvcNum = pAdapterInfo->m_listPVCs.size(); _itow(uiPvcNum, szPvcId, 10); strPvcId = c_szPVC; strPvcId += szPvcId;
while (!IsUniquePvcId(pAdapterInfo, strPvcId)) { uiPvcNum++; _itow(uiPvcNum, szPvcId, 10); strPvcId = c_szPVC; strPvcId += szPvcId; }
*pstrNewPvcId = strPvcId; }
BOOL CUniPage::IsUniquePvcId(CUniAdapterInfo * pAdapterInfo, tstring& strNewPvcId) { BOOL fUnique = TRUE;
for (PVC_INFO_LIST::iterator iterPvcInfo = pAdapterInfo->m_listPVCs.begin(); iterPvcInfo != pAdapterInfo->m_listPVCs.end(); iterPvcInfo++) { if (strNewPvcId == (*iterPvcInfo)->m_strName) { fUnique = FALSE; break; } } return fUnique; }
|