|
|
/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1998 **/ /**********************************************************************/
/*
delowner.cpp Delete owner dialog FILE HISTORY: */
#include "stdafx.h"
#include "DelOwner.h"
#include "server.h"
#include "actreg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CDeleteOwner dialog
int CALLBACK DelOwnerCompareFunc ( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort ) { return ((CDeleteOwner *) lParamSort)->HandleSort(lParam1, lParam2); }
CDeleteOwner::CDeleteOwner(ITFSNode * pNode, CWnd* pParent /*=NULL*/) : CBaseDialog(CDeleteOwner::IDD, pParent) { m_spActRegNode.Set(pNode); m_nSortColumn = -1;
for (int i = 0; i < COLUMN_MAX; i++) { m_aSortOrder[i] = TRUE; // ascending
}
//{{AFX_DATA_INIT(CDeleteOwner)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CDeleteOwner::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDeleteOwner)
DDX_Control(pDX, IDC_RADIO_DELETE_RECORDS, m_radioDelete); DDX_Control(pDX, IDC_LIST_OWNER, m_listOwner); //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDeleteOwner, CBaseDialog) //{{AFX_MSG_MAP(CDeleteOwner)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_OWNER, OnItemchangedListOwner) ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_OWNER, OnColumnclickListOwner) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDeleteOwner message handlers
BOOL CDeleteOwner::OnInitDialog() { CBaseDialog::OnInitDialog(); CString strOwner; strOwner.LoadString(IDS_OWNER); m_listOwner.InsertColumn(COLUMN_IP, strOwner, LVCFMT_LEFT, 100, 1);
CString strID; strID.LoadString(IDS_HIGHESTID); m_listOwner.InsertColumn(COLUMN_VERSION, strID, LVCFMT_LEFT, 125, -1);
CString strName; strName.LoadString(IDS_NAME); m_listOwner.InsertColumn(COLUMN_NAME, strName, LVCFMT_LEFT, 100, -1);
m_listOwner.SetFullRowSel(TRUE);
// grab the owner info array
SPITFSNode spActRegNode; CActiveRegistrationsHandler * pActReg;
spActRegNode = GetTFSNode(); pActReg = GETHANDLER(CActiveRegistrationsHandler, spActRegNode);
pActReg->GetOwnerInfo(m_ServerInfoArray);
// set default radio selection
m_radioDelete.SetCheck(TRUE);
FillOwnerInfo(); GetDlgItem(IDOK)->EnableWindow(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDeleteOwner::OnOK() { m_dwSelectedOwner = GetSelectedOwner(); m_fDeleteRecords = m_radioDelete.GetState();
// warn the user
if (m_fDeleteRecords) { if (AfxMessageBox(IDS_WARN_DELETE_OWNER, MB_YESNO) == IDNO) { return; } } else { if (AfxMessageBox(IDS_WARN_TOMBSTONE, MB_YESNO) == IDNO) { return; } }
CBaseDialog::OnOK(); }
void CDeleteOwner::OnItemchangedListOwner(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
BOOL fEnable = (GetSelectedOwner() != -1) ? TRUE : FALSE;
GetDlgItem(IDOK)->EnableWindow(fEnable);
*pResult = 0; }
void CDeleteOwner::FillOwnerInfo() { for (int i = 0; i < m_ServerInfoArray.GetSize(); i++) { if (m_ServerInfoArray[i].m_liVersion.QuadPart == OWNER_DELETED) { // this owner has been deleted...
continue; }
CString strIPAdd; ::MakeIPAddress(m_ServerInfoArray[i].m_dwIp, strIPAdd);
CString strVers = GetVersionInfo(m_ServerInfoArray[i].m_liVersion.LowPart, m_ServerInfoArray[i].m_liVersion.HighPart);
int nItem = m_listOwner.InsertItem(i, strIPAdd, 0);
m_listOwner.SetItemText(nItem, 1, m_ServerInfoArray[i].m_strName); m_listOwner.SetItemText(nItem, 2, strVers);
m_listOwner.SetItemData(nItem, i); }
Sort(COLUMN_IP); }
void CDeleteOwner::Sort(int nCol) { if (m_nSortColumn == nCol) { // if the user is clicking the same column again, reverse the sort order
m_aSortOrder[nCol] = m_aSortOrder[nCol] ? FALSE : TRUE; } else { m_nSortColumn = nCol; }
m_listOwner.SortItems(DelOwnerCompareFunc, (LPARAM) this); }
int CDeleteOwner::HandleSort(LPARAM lParam1, LPARAM lParam2) { int nCompare = 0;
switch (m_nSortColumn) { case COLUMN_IP: { DWORD dwIp1 = m_ServerInfoArray.GetAt((int) lParam1).m_dwIp; DWORD dwIp2 = m_ServerInfoArray.GetAt((int) lParam2).m_dwIp; if (dwIp1 > dwIp2) nCompare = 1; else if (dwIp1 < dwIp2) nCompare = -1; } break;
case COLUMN_NAME: { CString strName1, strName2; if (!m_ServerInfoArray.GetAt((int) lParam1).m_strName.IsEmpty()) strName1 = m_ServerInfoArray.GetAt((int) lParam1).m_strName;
if (!m_ServerInfoArray.GetAt((int) lParam2).m_strName.IsEmpty()) strName2 = m_ServerInfoArray.GetAt((int) lParam2).m_strName;
nCompare = strName1.CompareNoCase(strName2); } break;
case COLUMN_VERSION: { LARGE_INTEGER li1, li2; li1.QuadPart = m_ServerInfoArray.GetAt((int) lParam1).m_liVersion.QuadPart; li2.QuadPart = m_ServerInfoArray.GetAt((int) lParam2).m_liVersion.QuadPart; if (li1.QuadPart > li2.QuadPart) nCompare = 1; else if (li1.QuadPart < li2.QuadPart) nCompare = -1; } break; }
if (m_aSortOrder[m_nSortColumn] == FALSE) { // descending
return -nCompare; } else { // ascending
return nCompare; } }
DWORD CDeleteOwner::GetSelectedOwner() { int nCount = m_listOwner.GetItemCount(); int nSelected = -1;
for (int i = 0; i < nCount; i++) { UINT uState = m_listOwner.GetItemState(i, LVIS_SELECTED);
if (uState) { DWORD_PTR nData = m_listOwner.GetItemData(i);
DWORD dwSelOwner = m_ServerInfoArray.GetAt((int) nData).m_dwIp; return dwSelOwner; } }
return 0; }
CString CDeleteOwner::GetVersionInfo(LONG lLowWord, LONG lHighWord) { CString strVersionCount;
TCHAR sz[20]; TCHAR *pch = sz; ::wsprintf(sz, _T("%08lX%08lX"), lHighWord, lLowWord); // Kill leading zero's
while (*pch == '0') { ++pch; } // At least one digit...
if (*pch == '\0') { --pch; }
strVersionCount = pch;
return strVersionCount; }
void CDeleteOwner::OnColumnclickListOwner(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// sort depending on what column was clicked;
Sort(pNMListView->iSubItem);
*pResult = 0; }
|