174 lines
3.4 KiB
C++
174 lines
3.4 KiB
C++
/*++
|
|
|
|
Copyright (C) 1997-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
hwprof.cpp
|
|
|
|
Abstract:
|
|
|
|
This module implements CHwProfileList and CHwProfile classes.
|
|
|
|
Author:
|
|
|
|
William Hsieh (williamh) created
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#include "devmgr.h"
|
|
#include "hwprof.h"
|
|
|
|
|
|
BOOL
|
|
CHwProfileList::Create(
|
|
CDevice* pDevice,
|
|
DWORD ConfigFlags
|
|
)
|
|
{
|
|
// first get the current profile index.
|
|
HWPROFILEINFO HwProfileInfo;
|
|
ASSERT(pDevice);
|
|
m_pDevice = pDevice;
|
|
// get the current profile index.
|
|
if (!m_pDevice->m_pMachine->CmGetCurrentHwProfile(&m_CurHwProfile))
|
|
return FALSE;
|
|
// go through each profile and create a CHwProfile for it
|
|
int Index = 0;
|
|
CHwProfile* phwpf;
|
|
while (m_pDevice->m_pMachine->CmGetHwProfileInfo(Index, &HwProfileInfo))
|
|
{
|
|
DWORD hwpfFlags;
|
|
// get the hwprofile flags for this device
|
|
// if failed, use the given ConfigFlags
|
|
if (m_pDevice->m_pMachine->CmGetHwProfileFlags((
|
|
LPTSTR)m_pDevice->GetDeviceID(),
|
|
HwProfileInfo.HWPI_ulHWProfile,
|
|
&hwpfFlags))
|
|
{
|
|
if (hwpfFlags & CSCONFIGFLAG_DO_NOT_CREATE)
|
|
{
|
|
// skip this profile
|
|
Index++;
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// flags have not been set for this profile yet.
|
|
hwpfFlags = ConfigFlags;
|
|
}
|
|
|
|
ASSERT(CONFIGFLAG_DISABLED == CSCONFIGFLAG_DISABLED);
|
|
|
|
hwpfFlags |= ConfigFlags;
|
|
// rememeber current hw profile index
|
|
if (m_CurHwProfile == HwProfileInfo.HWPI_ulHWProfile)
|
|
m_CurHwProfileIndex = Index;
|
|
phwpf = new CHwProfile(Index, &HwProfileInfo, pDevice, hwpfFlags);
|
|
m_listProfile.AddTail(phwpf);
|
|
Index++;
|
|
}
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
CHwProfileList::~CHwProfileList()
|
|
{
|
|
if (!m_listProfile.IsEmpty())
|
|
{
|
|
POSITION pos = m_listProfile.GetHeadPosition();
|
|
while (NULL != pos)
|
|
{
|
|
CHwProfile* pProfile = m_listProfile.GetNext(pos);
|
|
delete pProfile;
|
|
}
|
|
m_listProfile.RemoveAll();
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
CHwProfileList::GetFirst(
|
|
CHwProfile** pphwpf,
|
|
PVOID& Context
|
|
)
|
|
{
|
|
ASSERT(pphwpf);
|
|
|
|
if (!m_listProfile.IsEmpty())
|
|
{
|
|
POSITION pos = m_listProfile.GetHeadPosition();
|
|
*pphwpf = m_listProfile.GetNext(pos);
|
|
Context = pos;
|
|
return TRUE;
|
|
}
|
|
|
|
Context = NULL;
|
|
*pphwpf = NULL;
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL
|
|
CHwProfileList::GetNext(
|
|
CHwProfile** pphwpf,
|
|
PVOID& Context
|
|
)
|
|
{
|
|
ASSERT(pphwpf);
|
|
POSITION pos = (POSITION)Context;
|
|
|
|
if (NULL != pos)
|
|
{
|
|
*pphwpf = m_listProfile.GetNext(pos);
|
|
Context = pos;
|
|
return TRUE;
|
|
}
|
|
|
|
*pphwpf = NULL;
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL
|
|
CHwProfileList::GetCurrentHwProfile(
|
|
CHwProfile** pphwpf
|
|
)
|
|
{
|
|
ASSERT(pphwpf);
|
|
|
|
POSITION pos = m_listProfile.FindIndex(m_CurHwProfileIndex);
|
|
*pphwpf = m_listProfile.GetAt(pos);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
ULONG
|
|
CHwProfileList::IndexToHwProfile(
|
|
int HwProfileIndex
|
|
)
|
|
{
|
|
if (HwProfileIndex >= m_listProfile.GetCount())
|
|
return 0XFFFFFFFF;
|
|
POSITION pos = m_listProfile.FindIndex(HwProfileIndex);
|
|
CHwProfile* pHwProfile = m_listProfile.GetAt(pos);
|
|
return pHwProfile->GetHwProfile();
|
|
}
|
|
|
|
CHwProfile::CHwProfile(
|
|
int Index,
|
|
PHWPROFILEINFO phwpfInfo,
|
|
CDevice* pDevice,
|
|
DWORD Flags
|
|
)
|
|
{
|
|
m_Index = Index;
|
|
m_hwpfInfo = *phwpfInfo;
|
|
m_pDevice = pDevice;
|
|
m_EnablePending = FALSE;
|
|
m_DisablePending = FALSE;
|
|
m_Flags = Flags;
|
|
|
|
}
|