/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1998 **/ /**********************************************************************/ /* harray.h Index mgr for TAPI devices db FILE HISTORY: Dec 16 1997 EricDav Created */ #ifndef _HARRAY_H__ #define _HARRAY_H__ #ifndef TAPI_H #include "tapi.h" #endif #ifndef _TAPIMMC_H #define _TAPIMMC_H #include "tapimmc.h" #endif #include "afxmt.h" typedef LPDEVICEINFO HDEVICE; typedef HDEVICE FAR * LPHDEVICE; typedef enum _INDEX_TYPE { INDEX_TYPE_NAME, INDEX_TYPE_USERS, INDEX_TYPE_STATUS } INDEX_TYPE; typedef enum _SORT_OPTIONS { SORT_DESCENDING = 0x00, SORT_ASCENDING = 0x01 } SORT_OPTIONS; class CHDeviceIndex; typedef CArray HDeviceArray; typedef CList HDeviceArrayList; class CProviderIndexInfo { public: DWORD m_dwProviderID; HDeviceArrayList m_listIndicies; POSITION m_posCurrentIndex; }; typedef CList ProviderIndexList; // base class for a sorted index class CHDeviceIndex { public: CHDeviceIndex(INDEX_TYPE IndexType); virtual ~CHDeviceIndex(); public: // used for insertion into the list virtual int BCompare(const void *, const void *) = 0; virtual HRESULT Sort(LPBYTE pStart) = 0; virtual HRESULT Add(HDEVICE hDevice, BOOL bEnd); virtual HRESULT Remove(HDEVICE hDevice); virtual HRESULT GetType(INDEX_TYPE * pIndexType); virtual HDEVICE GetHDevice(int nIndex); virtual int GetIndex(HDEVICE hDevice); BOOL IsAscending() { return m_bAscending; } void SetAscending(BOOL bAscending) { m_bAscending = bAscending; } HRESULT SetArray(HDeviceArray & hdeviceArray); HDeviceArray & GetArray() { return m_hdeviceArray; } 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; HDeviceArray m_hdeviceArray; BOOL m_bAscending; }; // the Index manager class CIndexMgr : public HDeviceArrayList { public: CIndexMgr(); virtual ~CIndexMgr(); public: HRESULT Initialize(); HRESULT Reset(); UINT GetTotalCount(); UINT GetCurrentCount(); HRESULT AddHDevice(DWORD dwProviderID, HDEVICE hDevice, BOOL bLoading = FALSE); HRESULT RemoveHDevice(DWORD dwProviderID, HDEVICE hDevice); HRESULT Sort(DWORD dwProviderID, INDEX_TYPE SortType, DWORD dwSortOptions, LPBYTE pStart); HRESULT GetHDevice(DWORD dwProviderID, int nIndex, LPHDEVICE phdevice); HRESULT GetIndex(DWORD dwProviderID, HDEVICE hrow, int * pIndex); void CleanupIndicies(); HRESULT SetCurrentProvider(DWORD dwProviderID); protected: ProviderIndexList m_listProviderIndex; POSITION m_posCurrentProvider; CCriticalSection m_cs; }; // Index for name sorted class CIndexName : public CHDeviceIndex { public: CIndexName() : CHDeviceIndex(INDEX_TYPE_NAME) { }; public: // used for insertion into the list int BCompare(const void *, const void *); // used for sorting the list virtual HRESULT Sort(LPBYTE pStart); static int __cdecl QCompareA(const void *, const void *); static int __cdecl QCompareD(const void *, const void *); }; // Index for Users sorted class CIndexUsers : public CHDeviceIndex { public: CIndexUsers() : CHDeviceIndex(INDEX_TYPE_USERS) { }; public: // used for insertion into the list int BCompare(const void *, const void *); // used for sorting the list virtual HRESULT Sort(LPBYTE pStart); static int __cdecl QCompareA(const void *, const void *); static int __cdecl QCompareD(const void *, const void *); }; // Index for status sorted class CIndexStatus : public CHDeviceIndex { public: CIndexStatus() : CHDeviceIndex(INDEX_TYPE_STATUS) { }; public: // used for insertion into the list int BCompare(const void *, const void *); // used for sorting the list virtual HRESULT Sort(LPBYTE pStart); static int __cdecl QCompareA(const void *, const void *); static int __cdecl QCompareD(const void *, const void *); }; #endif //_HARRAY_H__