Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

305 lines
8.0 KiB

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1998 **/
/**********************************************************************/
/*
harray.h
Index mgr for wins db
FILE HISTORY:
Oct 13 1997 EricDav Created
*/
#ifndef _HARRAY_H
#define _HARRAY_H
#include "afxmt.h"
class CVerifyWins ;
typedef enum _INDEX_TYPE
{
INDEX_TYPE_NAME,
INDEX_TYPE_IP,
INDEX_TYPE_VERSION,
INDEX_TYPE_TYPE,
INDEX_TYPE_EXPIRATION,
INDEX_TYPE_STATE,
INDEX_TYPE_STATIC,
INDEX_TYPE_OWNER,
INDEX_TYPE_FILTER
} INDEX_TYPE;
class CHRowIndex;
typedef CArray<HROW, HROW> HRowArray;
typedef CList<CHRowIndex *, CHRowIndex *> HRowArrayList;
// base class for a sorted index
class CHRowIndex
{
public:
CHRowIndex(INDEX_TYPE IndexType);
virtual ~CHRowIndex();
public:
// used for insertion into the list
virtual int BCompare(const void *, const void *) = 0;
virtual int BCompareD(const void *, const void *) = 0;
virtual HRESULT Sort() = 0;
virtual HRESULT Add(HROW hrow, BOOL bEnd);
virtual HRESULT Remove(HROW hrow);
virtual HRESULT GetType(INDEX_TYPE * pIndexType);
virtual HROW GetHRow(int nIndex);
virtual int GetIndex(HROW hrow);
BOOL IsAscending() { return m_bAscending; }
void SetAscending(BOOL bAscending) { m_bAscending = bAscending; }
HRESULT SetArray(HRowArray & hrowArray);
HRowArray & GetArray() { return m_hrowArray; }
void SetType(INDEX_TYPE indexType)
{
m_dbType = indexType;
}
void * BSearch(const void * key, const void * base, size_t num, size_t width);
protected:
INDEX_TYPE m_dbType;
HRowArray m_hrowArray;
BOOL m_bAscending;
};
// the Index manager
class CIndexMgr : public HRowArrayList
{
public:
CIndexMgr();
virtual ~CIndexMgr();
public:
HRESULT Initialize();
HRESULT Reset();
UINT GetTotalCount();
UINT GetCurrentCount();
BOOL AcceptWinsRecord(WinsRecord *pWinsRecord);
HRESULT AddHRow(HROW hrow, BOOL bLoading = FALSE, BOOL bFilterChecked = FALSE);
HRESULT RemoveHRow(HROW hrow);
HRESULT Sort(WINSDB_SORT_TYPE SortType, DWORD dwSortOptions);
HRESULT Filter(WINSDB_FILTER_TYPE FilterType, DWORD dwParam1, DWORD dwParam2);
HRESULT AddFilter(WINSDB_FILTER_TYPE FilterType, DWORD dwParam1, DWORD dwParam2, LPCOLESTR strParam3);
HRESULT ClearFilter(WINSDB_FILTER_TYPE FilterType);
HRESULT SetActiveView(WINSDB_VIEW_TYPE ViewType);
HRESULT GetHRow(int nIndex, LPHROW phrow);
HRESULT GetIndex(HROW hrow, int * pIndex);
CHRowIndex * GetNameIndex();
CHRowIndex * GetFilteredNameIndex();
void CleanupIndicies();
protected:
HRowArrayList m_listIndicies;
POSITION m_posCurrentIndex;
POSITION m_posFilteredIndex;
POSITION m_posLastIndex;
// points to either Filtered index or the index depending on whether the
// view is filtered or not
POSITION m_posUpdatedIndex;
CCriticalSection m_cs;
HRowArrayList m_listFilteredIndices;
BOOL m_bFiltered;
};
// Index for name sorted
class CIndexName : public CHRowIndex
{
public:
CIndexName() : CHRowIndex(INDEX_TYPE_NAME) { };
public:
// used for insertion into the list
int BCompare(const void *, const void *);
int BCompareD(const void *, const void *);
// used for sorting the list
virtual HRESULT Sort();
static int __cdecl QCompareA(const void *, const void *);
static int __cdecl QCompareD(const void *, const void *);
};
// Index for type sorted
class CIndexType : public CHRowIndex
{
public:
CIndexType() : CHRowIndex(INDEX_TYPE_TYPE) { };
public:
// used for insertion into the list
int BCompare(const void *, const void *);
int BCompareD(const void *, const void *);
// used for sorting the list
virtual HRESULT Sort();
static int __cdecl QCompareA(const void *, const void *);
static int __cdecl QCompareD(const void *, const void *);
};
// Index for IP address sorted
class CIndexIpAddr : public CHRowIndex
{
public:
CIndexIpAddr() : CHRowIndex(INDEX_TYPE_IP) { };
public:
// used for insertion into the list
int BCompare(const void *, const void *);
int BCompareD(const void *, const void *);
// used for sorting the list
virtual HRESULT Sort();
static int __cdecl QCompareA(const void *, const void *);
static int __cdecl QCompareD(const void *, const void *);
};
// Index for Expiration sorted
class CIndexExpiration : public CHRowIndex
{
public:
CIndexExpiration() : CHRowIndex(INDEX_TYPE_EXPIRATION) { };
public:
// used for insertion into the list
int BCompare(const void *, const void *);
int BCompareD(const void *, const void *);
// used for sorting the list
virtual HRESULT Sort();
static int __cdecl QCompareA(const void *, const void *);
static int __cdecl QCompareD(const void *, const void *);
};
// Index for version sorted
class CIndexVersion : public CHRowIndex
{
public:
CIndexVersion() : CHRowIndex(INDEX_TYPE_VERSION) { };
public:
// used for insertion into the list
int BCompare(const void *, const void *);
int BCompareD(const void *, const void *);
// used for sorting the list
virtual HRESULT Sort();
static int __cdecl QCompareA(const void *, const void *);
static int __cdecl QCompareD(const void *, const void *);
};
// Index for version sorted
class CIndexState : public CHRowIndex
{
public:
CIndexState() : CHRowIndex(INDEX_TYPE_STATE) { };
public:
// used for insertion into the list
int BCompare(const void *, const void *);
int BCompareD(const void *, const void *);
// used for sorting the list
virtual HRESULT Sort();
static int __cdecl QCompareA(const void *, const void *);
static int __cdecl QCompareD(const void *, const void *);
};
// Index for version sorted
class CIndexStatic : public CHRowIndex
{
public:
CIndexStatic() : CHRowIndex(INDEX_TYPE_STATIC) { };
public:
// used for insertion into the list
int BCompare(const void *, const void *);
int BCompareD(const void *, const void *);
// used for sorting the list
virtual HRESULT Sort();
static int __cdecl QCompareA(const void *, const void *);
static int __cdecl QCompareD(const void *, const void *);
};
// Index for Owner sorted
class CIndexOwner : public CHRowIndex
{
public:
CIndexOwner() : CHRowIndex(INDEX_TYPE_OWNER) { };
public:
// used for insertion into the list
int BCompare(const void *, const void *);
int BCompareD(const void *, const void *);
// used for sorting the list
virtual HRESULT Sort();
static int __cdecl QCompareA(const void *, const void *);
static int __cdecl QCompareD(const void *, const void *);
};
typedef CMap<DWORD, DWORD&, BOOL, BOOL&> CFilterTypeMap;
typedef struct
{
DWORD Mask;
DWORD Address;
} tIpReference;
// Filtered Index for name sorted
class CFilteredIndexName : public CIndexName
{
// returns the pointer to the pName where the matching failed
// or NULL if the matching succeeded.
LPCSTR PatternMatching(LPCSTR pName, LPCSTR pPattern, INT nNameLen);
BOOL SubnetMatching(tIpReference &IpRefPattern, DWORD dwIPAddress);
public:
CFilteredIndexName()
{
SetType(INDEX_TYPE_FILTER);
m_pchFilteredName = NULL;
};
~CFilteredIndexName()
{
if (m_pchFilteredName != NULL)
delete m_pchFilteredName;
}
public:
HRESULT AddFilter(WINSDB_FILTER_TYPE FilterType, DWORD dwData1, DWORD dwData2, LPCOLESTR strData3);
HRESULT ClearFilter(WINSDB_FILTER_TYPE FilterType);
BOOL CheckForFilter(LPHROW hrowCheck);
BOOL CheckWinsRecordForFilter(WinsRecord *pWinsRecord);
CFilterTypeMap m_mapFilterTypes;
CDWordArray m_dwaFilteredOwners;
CArray <tIpReference, tIpReference> m_taFilteredIp;
LPSTR m_pchFilteredName;
BOOL m_bMatchCase;
};
#endif //_HARRAY_H