/**********************************************************************/ /** 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 HRowArray; typedef CList 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 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 m_taFilteredIp; LPSTR m_pchFilteredName; BOOL m_bMatchCase; }; #endif //_HARRAY_H