windows-nt/Source/XPSP1/NT/net/mmc/tapi/harray.h
2020-09-26 16:20:57 +08:00

181 lines
4.4 KiB
C++

/**********************************************************************/
/** 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<HDEVICE, HDEVICE> HDeviceArray;
typedef CList<CHDeviceIndex *, CHDeviceIndex *> HDeviceArrayList;
class CProviderIndexInfo
{
public:
DWORD m_dwProviderID;
HDeviceArrayList m_listIndicies;
POSITION m_posCurrentIndex;
};
typedef CList<CProviderIndexInfo *, CProviderIndexInfo *> 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__