|
|
///////////////////////////////////////////////////////////////////////////////////
//
// Microsoft WMIOLE DB Provider
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
// CChapter, CChapterMgr and CWMIInstanceMgr class implementation
// - Implements utility classes to maintain rowset
//
//
///////////////////////////////////////////////////////////////////////////////////
#include "headers.h"
////////////////////////////////////////////////////////////////////////////////////////
//// CChapter class Implementation
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// Constructor
////////////////////////////////////////////////////////////////////////////////////////
CChapter::CChapter() { m_pNext = NULL; m_hChapter = 0; m_pFirstRow = NULL; m_pInstance = NULL; m_cRefChapter = 0; m_lCount = 0; m_strKey = NULL; m_dwStatus = 0;
}
////////////////////////////////////////////////////////////////////////////////////////
// Destructor
////////////////////////////////////////////////////////////////////////////////////////
CChapter::~CChapter() { CHRowsForChapter *pRowToDel = NULL; CHRowsForChapter *pRowTemp = NULL;
pRowToDel = m_pFirstRow; while(pRowToDel) { pRowTemp = pRowToDel->m_pNext; delete pRowToDel; pRowToDel = pRowTemp; } if(m_strKey) { SysFreeString(m_strKey); } }
////////////////////////////////////////////////////////////////////////////////////////
// Add a HROW to the chapter
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapter::AddHRow(HROW hRow ,CWbemClassWrapper *pInstance, HSLOT hSlot) { HRESULT hr = S_OK; CHRowsForChapter *pRowNew = NULL; CHRowsForChapter *pRowTemp = NULL;
try { pRowNew = new CHRowsForChapter; } catch(...) { SAFE_DELETE_PTR(pRowNew); throw; } if(pRowNew) { pRowNew->m_hRow = hRow; pRowNew->m_hSlot = hSlot; pRowNew->m_pInstance = pInstance; if(pRowNew == NULL) { hr = E_OUTOFMEMORY; } else { if(m_pFirstRow == NULL) { m_pFirstRow = pRowNew; } else { for(pRowTemp = m_pFirstRow ; pRowTemp->m_pNext != NULL ; pRowTemp = pRowTemp->m_pNext);
pRowTemp->m_pNext = pRowNew; } m_lCount++; } } else { hr = E_OUTOFMEMORY; } return hr; }
////////////////////////////////////////////////////////////////////////////////////////
// Delete a HROW for the chapter
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapter::DeleteHRow(HROW hRow) { HRESULT hr = E_FAIL; CHRowsForChapter *pRowToDel = NULL; CHRowsForChapter *pRowTemp = NULL;
if(m_pFirstRow != NULL) { if(m_pFirstRow->m_hRow == hRow) { pRowToDel = m_pFirstRow; m_pFirstRow = m_pFirstRow->m_pNext; delete pRowToDel; hr = S_OK; } else { for(pRowTemp = m_pFirstRow ; pRowTemp->m_pNext != NULL ; pRowTemp = pRowTemp->m_pNext) { //==================================================
// if the row searching is found then delete
// the element from the list
//==================================================
if(pRowTemp->m_pNext->m_hRow == hRow) { pRowToDel = pRowTemp->m_pNext; pRowTemp->m_pNext = pRowToDel->m_pNext; delete pRowToDel; hr = S_OK; break; } }
} m_lCount--; } return hr; }
////////////////////////////////////////////////////////////////////////////////////////
// Check if the HROW passed belongs to the chapter
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapter::IsHRowOfThisChapter(HROW hRow) { HRESULT hr = E_FAIL; CHRowsForChapter *pRowToDel = NULL; CHRowsForChapter *pRowTemp = NULL;
if(m_pFirstRow != NULL) { for(pRowTemp = m_pFirstRow ; pRowTemp != NULL ; pRowTemp = pRowTemp->m_pNext) { //==================================================
// if the row searching is found then delete
// the element from the list
//==================================================
if(pRowTemp->m_hRow == hRow) { hr = S_OK; break; } }
} return hr; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to get all the open rows in the list
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapter::GetAllHRowsInList(HROW *pHRows) { HRESULT hr = S_OK; CHRowsForChapter *pRowTemp = NULL; int nIndex = 0;
if(m_pFirstRow != NULL) {
for(pRowTemp = m_pFirstRow ; pRowTemp != NULL ; pRowTemp = pRowTemp->m_pNext) { pHRows[nIndex++] = pRowTemp->m_hRow; } }
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to set the slot number for the row
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapter::SetSlot(HROW hRow , HSLOT hSolt) { HRESULT hr = E_FAIL; CHRowsForChapter *pRow = NULL;
if(m_pFirstRow != NULL) { for(pRow = m_pFirstRow ; pRow != NULL ; pRow = pRow->m_pNext) { //==================================================
// if the row searching is found then delete
// the element from the list
//==================================================
if(pRow->m_hRow == hRow) { pRow->m_hSlot = hSolt; hr = S_OK; break; } }
} return hr; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to get the slot number for a row
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HSLOT CChapter::GetSlot(HROW hRow) { HSLOT hSlot = -1; CHRowsForChapter *pRow = NULL;
if(m_pFirstRow != NULL) { for(pRow = m_pFirstRow ; pRow != NULL ; pRow = pRow->m_pNext) { //==================================================
// if the row searching is found then delete
// the element from the list
//==================================================
if(pRow->m_hRow == hRow) { hSlot = pRow->m_hSlot; break; } }
} return hSlot; }
//////////////////////////////////////////////////////////////////////////////////
// This method is for chapter representing child rows of type Embeded classes
//////////////////////////////////////////////////////////////////////////////////
HRESULT CChapter::SetInstance(HROW hRow , BSTR strInstKey , CWbemClassWrapper *pInstance) { CHRowsForChapter *pRow = NULL; HRESULT hr = E_FAIL;
if(m_pFirstRow != NULL) { for(pRow = m_pFirstRow ; pRow != NULL ; pRow = pRow->m_pNext) { //==================================================
// if the row searching is found then delete
// the element from the list
//==================================================
if(pRow->m_hRow == hRow) { pRow->m_pInstance = pInstance; SAFE_FREE_SYSSTRING(pRow->m_strKey); pRow->m_strKey = Wmioledb_SysAllocString(strInstKey); hr = S_OK; break; } }
} return hr; }
//////////////////////////////////////////////////////////////////////////////////
// This method is for chapter representing child rows of type Embeded classes
//////////////////////////////////////////////////////////////////////////////////
CWbemClassWrapper * CChapter::GetInstance(HROW hRow) { CHRowsForChapter * pRow = NULL; CWbemClassWrapper * pRetInst = NULL;
if(m_pFirstRow != NULL) { for(pRow = m_pFirstRow ; pRow != NULL ; pRow = pRow->m_pNext) { //==================================================
// if the row searching is found then delete
// the element from the list
//==================================================
if(pRow->m_hRow == hRow) { pRetInst = pRow->m_pInstance; break; } }
} return pRetInst; }
//////////////////////////////////////////////////////////////////////////////////
// This method is for chapter representing child rows of type Embeded classes
//////////////////////////////////////////////////////////////////////////////////
HRESULT CChapter::GetInstanceKey(HROW hRow , BSTR *pstrKey) { CHRowsForChapter *pRow = NULL; HRESULT hr = E_FAIL;
if(m_pFirstRow != NULL) { for(pRow = m_pFirstRow ; pRow != NULL ; pRow = pRow->m_pNext) { //==================================================
// if the row searching is found then delete
// the element from the list
//==================================================
if(pRow->m_hRow == hRow) { *pstrKey = Wmioledb_SysAllocString(pRow->m_strKey); hr = S_OK; break; } }
} return hr; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Set the status of a particular row
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CChapter::SetRowStatus(HROW hRow , DBSTATUS dwStatus) {
CHRowsForChapter *pRow = NULL;
if(m_pFirstRow != NULL) { for(pRow = m_pFirstRow ; pRow != NULL ; pRow = pRow->m_pNext) { //==================================================
// if the row searching is found then delete
// the element from the list
//==================================================
if(pRow->m_hRow == hRow) { pRow->SetRowStatus(dwStatus); break; } }
} }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the status of a particular row
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
DBSTATUS CChapter::GetRowStatus(HROW hRow) { DBSTATUS dwStatus = DBROWSTATUS_E_FAIL;
CHRowsForChapter *pRow = NULL;
if(m_pFirstRow != NULL) { for(pRow = m_pFirstRow ; pRow != NULL ; pRow = pRow->m_pNext) { //==================================================
// if the row searching is found then delete
// the element from the list
//==================================================
if(pRow->m_hRow == hRow) { dwStatus = pRow->GetRowStatus(); break; } }
} return dwStatus; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get HROW of the row identified by the key
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HROW CChapter::GetHRow(BSTR strInstKey) { CHRowsForChapter * pRow = m_pFirstRow; HROW hRow = 0;
while(pRow != NULL) { //==================================================
// if the row searching is found then
//==================================================
if(pRow->m_strKey != NULL && strInstKey != NULL) if(0 == _wcsicmp((WCHAR *)strInstKey,pRow->m_strKey)) { hRow = pRow->m_hRow; break; } pRow = pRow->m_pNext; }
return hRow;
}
///////////////////////////////////////////////////////////////////////////////////////
// CChapterMgr class Implementation
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
// Constructor
///////////////////////////////////////////////////////////////////////////////////////
CChapterMgr::CChapterMgr() { m_pHead = NULL; m_lCount = 0; }
///////////////////////////////////////////////////////////////////////////////////////
// Destructor
///////////////////////////////////////////////////////////////////////////////////////
CChapterMgr::~CChapterMgr() { CChapter *pTempChap, *pTempChapToDel = NULL; pTempChapToDel = m_pHead;
// Navigate thru the list and delete all the elements
while(pTempChapToDel) { pTempChap = pTempChapToDel->m_pNext; delete pTempChapToDel; pTempChapToDel = pTempChap; } }
///////////////////////////////////////////////////////////////////////////////////////
// Add a Chapter to the list
///////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapterMgr::AddChapter(HCHAPTER hChapter) { CChapter *pNewChap = NULL; CChapter *pTempChap = NULL; HRESULT hr = S_OK;
try {
pNewChap = new CChapter; } // try
catch(...) { SAFE_DELETE_PTR(pNewChap); throw; } if(pNewChap == NULL) { hr = E_OUTOFMEMORY; } else { pNewChap->m_cRefChapter = 1; // The moment HCHAPPTER is retrieved is ref count is 1
pNewChap->m_hChapter = hChapter; if(m_pHead == NULL) { m_pHead = pNewChap; } else { for(pTempChap = m_pHead; pTempChap->m_pNext != NULL ; pTempChap = pTempChap->m_pNext); pTempChap->m_pNext = pNewChap; } m_lCount++; }
return hr; }
///////////////////////////////////////////////////////////////////////////////////////
// Delete a chapter from the list
///////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapterMgr::DeleteChapter(HCHAPTER hChapter) { CChapter *pTempChap = NULL; CChapter *pTempChapToDel = NULL;
if( m_pHead) { if(m_pHead->m_hChapter == hChapter) { pTempChapToDel = m_pHead; m_pHead = m_pHead->m_pNext; delete pTempChapToDel; } else { //============================================================
// Get to the previous node which is being searched
//============================================================
for( pTempChap = m_pHead ; pTempChap->m_pNext != NULL ; pTempChap = pTempChap->m_pNext) { if(pTempChap->m_pNext->m_hChapter == hChapter) { pTempChapToDel = pTempChap->m_pNext; pTempChap->m_pNext = pTempChapToDel->m_pNext; delete pTempChapToDel; break; } // if
} // for
} // else
m_lCount--;
} // if the head pointer is valid
return S_OK; }
///////////////////////////////////////////////////////////////////////////////////////
// Set the Instance pointer for the HCHAPTER
///////////////////////////////////////////////////////////////////////////////////////
void CChapterMgr::SetInstance(HCHAPTER hChapter , CWbemClassWrapper *pInstance,BSTR strKey,HROW hRow) { CChapter *pTempChap = m_pHead;
while(pTempChap != NULL) { if(pTempChap->m_hChapter == hChapter) { //============================================================
// hRow will be zero if the chapter is representing qualifier
//============================================================
if( hRow == 0) { pTempChap->m_pInstance = pInstance; pTempChap->m_strKey = Wmioledb_SysAllocString(strKey); } //============================================================
// else the chapter will be refering to a embeded class
//============================================================
else { pTempChap->SetInstance(hRow,strKey,pInstance); } break;
} pTempChap = pTempChap->m_pNext; }
}
///////////////////////////////////////////////////////////////////////////////////////
// Get the Instance pointer for the chapter
///////////////////////////////////////////////////////////////////////////////////////
CWbemClassWrapper *CChapterMgr::GetInstance(HCHAPTER hChapter, HROW hRow) { CChapter * pTempChap = m_pHead; CWbemClassWrapper * pRetInst = NULL;
while(pTempChap != NULL) { if(pTempChap->m_hChapter == hChapter) { //============================================================
// hRow will be zero if the chapter is representing qualifier
//============================================================
if( hRow == 0) { pRetInst = pTempChap->m_pInstance; } //============================================================
// else the chapter will be refering to a embeded class
//============================================================
else { pRetInst = pTempChap->GetInstance(hRow); } } pTempChap = pTempChap->m_pNext; } return pRetInst; }
///////////////////////////////////////////////////////////////////////////////////////
// Add a HROW to the list of HROWS for the chapter
///////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapterMgr::AddHRowForChapter(HCHAPTER hChapter , HROW hRow, CWbemClassWrapper *pInstance , HSLOT hSlot) { HRESULT hr = E_FAIL;
CChapter *pTempChap = m_pHead;
while(pTempChap != NULL) { if(pTempChap->m_hChapter == hChapter) { hr = pTempChap->AddHRow(hRow,pInstance, hSlot); break; } pTempChap = pTempChap->m_pNext; }
return hr; }
///////////////////////////////////////////////////////////////////////////////////////
// Delete a HROW from the list of HROWS for the chapter
///////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapterMgr::DeleteHRow(HROW hRow) { HRESULT hr = S_OK; CChapter *pTempChap = NULL;
//======================================================
// Get to the node which is being searched
//======================================================
for( pTempChap = m_pHead ; pTempChap != NULL ; pTempChap = pTempChap->m_pNext) {
if(S_OK == pTempChap->IsHRowOfThisChapter(hRow)) { hr = pTempChap->DeleteHRow(hRow); break; } // if row is of this chapter
}// for
return hr; }
///////////////////////////////////////////////////////////////////////////////////////
// Get the HCHAPTER for the given HROW
///////////////////////////////////////////////////////////////////////////////////////
HCHAPTER CChapterMgr::GetChapterForHRow(HROW hRow) { HCHAPTER hChapter = -1;
CChapter *pTempChap = NULL; //========================================================
// Get to the previous node which is being searched
//========================================================
for( pTempChap = m_pHead ; pTempChap != NULL ; pTempChap = pTempChap->m_pNext) { if(S_OK == pTempChap->IsHRowOfThisChapter(hRow)) { hChapter = pTempChap->m_hChapter; break; } }
return hChapter;
}
///////////////////////////////////////////////////////////////////////////////////////
// Check if the given HCHAPTER exists in the list
///////////////////////////////////////////////////////////////////////////////////////
BOOL CChapterMgr::IsExists(HCHAPTER hChapter) { BOOL bRet = FALSE; CChapter *pTempChap = m_pHead;
while(pTempChap != NULL) { if(pTempChap->m_hChapter == hChapter) { bRet = TRUE; break; } pTempChap = pTempChap->m_pNext; }
return bRet;
}
///////////////////////////////////////////////////////////////////////////////////////
// Add a reference to HCHAPTER
///////////////////////////////////////////////////////////////////////////////////////
ULONG CChapterMgr::AddRefChapter(HCHAPTER hChapter) { ULONG ulRet = 0; CChapter *pTempChap = m_pHead;
while(pTempChap != NULL) { if(pTempChap->m_hChapter == hChapter) { ulRet = ++(pTempChap->m_cRefChapter); break; } pTempChap = pTempChap->m_pNext; }
return ulRet;
}
///////////////////////////////////////////////////////////////////////////////////////
// Release a reference to the chapter
///////////////////////////////////////////////////////////////////////////////////////
ULONG CChapterMgr::ReleaseRefChapter(HCHAPTER hChapter) { ULONG ulRet = 0; CChapter *pTempChap = m_pHead;
while(pTempChap != NULL) { if(pTempChap->m_hChapter == hChapter) { ulRet = --(pTempChap->m_cRefChapter); break; } pTempChap = pTempChap->m_pNext; }
return ulRet; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to get all the open rows
// caller releases the memory allocated
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapterMgr::GetAllHROWs(HROW *&prghRows , DBCOUNTITEM &cRows) { HRESULT hr = S_OK; DBCOUNTITEM ulRowCount = 0;
CChapter *pTempChap = NULL;
HROW *pHRowTemp = NULL; prghRows = NULL; //========================================================
// Get to the previous node which is being searched
//========================================================
for( pTempChap = m_pHead ; pTempChap != NULL ; pTempChap = pTempChap->m_pNext) { ulRowCount += pTempChap->m_lCount; }
if( ulRowCount > 0) { pHRowTemp = new HROW[ulRowCount]; //NTRaid:111769
// 06/07/00
if(pHRowTemp) { prghRows = pHRowTemp; cRows = ulRowCount; //========================================================
// Get to the previous node which is being searched
//========================================================
for( pTempChap = m_pHead ; pTempChap != NULL ; pTempChap = pTempChap->m_pNext) { if(S_OK == (hr = pTempChap->GetAllHRowsInList(pHRowTemp))) { pHRowTemp += pTempChap->m_lCount; } else { SAFE_DELETE_ARRAY(pHRowTemp); prghRows = NULL; cRows = 0; break; } } } else { hr = E_OUTOFMEMORY; } } return hr;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to find if any rows are opened for the chapter
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapterMgr::IsRowExistsForChapter(HCHAPTER hChapter) { HRESULT hr = E_FAIL; CChapter * pTempChap = NULL; //========================================================
// Get to the previous node which is being searched
//========================================================
for( pTempChap = m_pHead ; pTempChap != NULL ; pTempChap = pTempChap->m_pNext) { if(pTempChap->m_hChapter == hChapter) { if(pTempChap->m_lCount >0) { hr = S_OK; } break; } }
return hr;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to set the slot number for the row
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapterMgr::SetSlot(HROW hRow , HSLOT hSlot) { HRESULT hr = E_FAIL; CChapter * pTempChap = NULL; //========================================================
// Get to the previous node which is being searched
//========================================================
for( pTempChap = m_pHead ; pTempChap != NULL ; pTempChap = pTempChap->m_pNext) { if(S_OK == pTempChap->IsHRowOfThisChapter(hRow)) { pTempChap->SetSlot(hRow,hSlot); hr = S_OK; break; } }
return hr;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to get slot number for the row
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HSLOT CChapterMgr::GetSlot(HROW hRow) { HSLOT hSlot = -1; CChapter * pTempChap = NULL; //========================================================
// Get to the previous node which is being searched
//========================================================
for( pTempChap = m_pHead ; pTempChap != NULL ; pTempChap = pTempChap->m_pNext) { if(S_OK == pTempChap->IsHRowOfThisChapter(hRow)) { hSlot = pTempChap->GetSlot(hRow); break; } }
return hSlot;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to check if the particular row is opened
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CChapterMgr::IsRowExists(HROW hRow) { BOOL bRet = FALSE; if( hRow > 0) if(0 < GetChapterForHRow(hRow)) { bRet = TRUE; }
return bRet; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to get the key for the chapter
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CChapterMgr::GetInstanceKey(HCHAPTER hChapter, BSTR *pstrKey, HROW hRow) { CChapter *pTempChap = m_pHead; HRESULT hr = E_FAIL;
while(pTempChap != NULL) { if(pTempChap->m_hChapter == hChapter) { //==================================================================
// hRow will be zero if the chapter is representing qualifier
//==================================================================
if( hRow == 0) { hr = S_OK; *pstrKey = Wmioledb_SysAllocString(pTempChap->m_strKey); } //==================================================================
// else the chapter will be refering to a embeded class
//==================================================================
else { hr = pTempChap->GetInstanceKey(hRow,pstrKey); } break; } pTempChap = pTempChap->m_pNext; } return hr;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to check if the instance identified by the key exists
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CChapterMgr::IsInstanceExist(BSTR strKey) { BOOL bRet = FALSE; CChapter * pTempChap = m_pHead;
while(pTempChap != NULL) { if(pTempChap->m_strKey != NULL && strKey != NULL) if(0 == wbem_wcsicmp(strKey,pTempChap->m_strKey)) { bRet = TRUE; break; } pTempChap = pTempChap->m_pNext; } return bRet; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to check if a instance exists
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CChapterMgr::IsInstanceExist(CWbemClassWrapper *pInstance) { BOOL bRet = FALSE; CChapter * pTempChap = m_pHead;
while(pTempChap != NULL) { if(pTempChap->m_pInstance == pInstance) { bRet = TRUE; break; } pTempChap = pTempChap->m_pNext; } return bRet; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Set the status of a particular row
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CChapterMgr::SetRowStatus(HROW hRow , DWORD dwStatus) { CChapter *pTempChap = NULL; //======================================================
// Get to the node which is being searched
//======================================================
for( pTempChap = m_pHead ; pTempChap != NULL ; pTempChap = pTempChap->m_pNext) {
if(S_OK == pTempChap->IsHRowOfThisChapter(hRow)) { pTempChap->SetRowStatus(hRow , dwStatus); break; } // if row is of this chapter
}// for
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the status of a particular row
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
DBSTATUS CChapterMgr::GetRowStatus(HROW hRow) { DBSTATUS dwStatus = DBROWSTATUS_S_OK; CChapter * pTempChap = NULL;
//======================================================
// Get to the node which is being searched
//======================================================
for( pTempChap = m_pHead ; pTempChap != NULL ; pTempChap = pTempChap->m_pNext) {
if(S_OK == pTempChap->IsHRowOfThisChapter(hRow)) { dwStatus = pTempChap->GetRowStatus(hRow); break; } // if row is of this chapter
}// for
return dwStatus; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Set the status of a particular chapter
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CChapterMgr::SetChapterStatus(HCHAPTER hChapter , DBSTATUS dwStatus) { CChapter *pTempChap = m_pHead;
while(pTempChap != NULL) { if(pTempChap->m_hChapter == hChapter) { pTempChap->m_dwStatus &= dwStatus; break; } pTempChap = pTempChap->m_pNext; } }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the status of the chapter
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
DBSTATUS CChapterMgr::GetChapterStatus(HCHAPTER hChapter) { DBSTATUS dwStatus = 0; CChapter * pTempChap = m_pHead;
while(pTempChap != NULL) { if(pTempChap->m_hChapter == hChapter) { dwStatus = pTempChap->m_dwStatus; break; } pTempChap = pTempChap->m_pNext; }
return dwStatus; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get a HROW of the row identified by the key
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HROW CChapterMgr::GetHRow(HCHAPTER hChapter, BSTR strInstKey) { HROW hRow = 0;
CChapter *pTempChap = m_pHead; while(pTempChap != NULL) { if(pTempChap->m_hChapter == hChapter) { break; } pTempChap = pTempChap->m_pNext; } if(pTempChap != NULL ) { if( pTempChap->m_lCount != 0) { if( strInstKey == NULL ) { hRow = pTempChap->m_pFirstRow->m_hRow;
} else { hRow = pTempChap->GetHRow(strInstKey); } } } return hRow; }
///////////////////////////////////////////////////////////////////////////////
// CWMIInstanceMgr class Implementation
//////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Constructor
//////////////////////////////////////////////////////////////////////////////
CWMIInstanceMgr::CWMIInstanceMgr() { m_pFirst = NULL; m_lCount = 0; }
///////////////////////////////////////////////////////////////////////////////
// Destructor
//////////////////////////////////////////////////////////////////////////////
CWMIInstanceMgr::~CWMIInstanceMgr() { CWMIInstance *pTempInst = NULL , *pTempInstToDel = NULL; pTempInstToDel = m_pFirst;
while(pTempInstToDel != NULL) { pTempInst = pTempInstToDel->m_pNext; delete pTempInstToDel; pTempInstToDel = pTempInst; }
}
///////////////////////////////////////////////////////////////////////////////////////
// Add an instance to the list
///////////////////////////////////////////////////////////////////////////////////////
HRESULT CWMIInstanceMgr::AddInstanceToList(HROW hRow,CWbemClassWrapper *pInstance, BSTR strKey ,HSLOT hSlot) { HRESULT hr = S_OK; CWMIInstance * pNewInstance = NULL; CWMIInstance * pTempInstance = NULL;
try {
pNewInstance = new CWMIInstance; } catch(...) { SAFE_DELETE_PTR(pNewInstance); throw; }
if(pNewInstance == NULL) { hr = E_OUTOFMEMORY; } else { pNewInstance->m_pInstance = pInstance; pNewInstance->m_hRow = hRow; pNewInstance->m_hSlot = hSlot; pNewInstance->m_strKey = Wmioledb_SysAllocString(strKey); if(m_pFirst == NULL) { m_pFirst = pNewInstance; } else { //========================================================================
// Navigate to the last instance in the list and link the new instance
//========================================================================
for(pTempInstance = m_pFirst ; pTempInstance->m_pNext != NULL ; pTempInstance = pTempInstance->m_pNext);
pTempInstance->m_pNext = pNewInstance;
} m_lCount++; }
return hr;
}
///////////////////////////////////////////////////////////////////////////////////////
// Delete the instance identified from the given HROW from the list
///////////////////////////////////////////////////////////////////////////////////////
HRESULT CWMIInstanceMgr::DeleteInstanceFromList(HROW hRow) { HRESULT hr = S_OK; CWMIInstance * pTempInstance = NULL; CWMIInstance * pTempInstToDel = NULL;
if(m_pFirst != NULL) { pTempInstance = m_pFirst;
//====================================================
// if the first one in the list is to be deleted
//====================================================
if(pTempInstance->m_hRow == hRow) { m_pFirst = pTempInstance->m_pNext; delete pTempInstance; } else { while(pTempInstance->m_pNext != NULL) { if(pTempInstance->m_pNext->m_hRow == hRow) { pTempInstToDel = pTempInstance->m_pNext; pTempInstance->m_pNext = pTempInstToDel->m_pNext; delete pTempInstToDel; break; } pTempInstance = pTempInstance->m_pNext; } // while
} // else
m_lCount--; } // if m_pFirst)
return hr; }
///////////////////////////////////////////////////////////////////////////////////////
// Get the pointer to the instance for the given HROW
///////////////////////////////////////////////////////////////////////////////////////
CWbemClassWrapper * CWMIInstanceMgr::GetInstance(HROW hRow) { CWMIInstance * pTempInstance = NULL; CWbemClassWrapper* pRetInst = NULL;
pTempInstance = m_pFirst;
while(pTempInstance != NULL) { if(pTempInstance->m_hRow == hRow) { pRetInst = pTempInstance->m_pInstance; break; } pTempInstance = pTempInstance->m_pNext; } // while
return pRetInst; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to get instance key identified by HROW
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWMIInstanceMgr::GetInstanceKey(HROW hRow,BSTR *strKey) { HRESULT hr = E_FAIL; CWMIInstance * pTempInstance = NULL;
pTempInstance = m_pFirst;
while(pTempInstance != NULL) { if(pTempInstance->m_hRow == hRow) { hr = S_OK; *strKey = Wmioledb_SysAllocString(pTempInstance->m_strKey); break; } pTempInstance = pTempInstance->m_pNext; } // while
return hr; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get all the HROWS in the list
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWMIInstanceMgr::GetAllHROWs(HROW * &prghRows , DBCOUNTITEM &cRows) { CWMIInstance * pTempInstance = NULL; int nIndex = 0; HRESULT hr = E_OUTOFMEMORY;
pTempInstance = m_pFirst;
//==============================
// If there are any open rows
//==============================
if(m_lCount >0) { try { prghRows = new HROW[m_lCount]; } catch(...) { SAFE_DELETE_PTR(prghRows); throw; } if(prghRows != NULL) { cRows = m_lCount; //=================================================
// Navigate through the list and get all HROWS
//=================================================
while(pTempInstance != NULL) { prghRows[nIndex++] = pTempInstance->m_hRow; pTempInstance = pTempInstance->m_pNext; } hr = S_OK;
} } return hr; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Check if the row identified by HROW exists
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CWMIInstanceMgr::IsRowExists(HROW hRow) { BOOL bRet = FALSE; if( hRow > 0) if(NULL != GetInstance(hRow)) { bRet = TRUE; }
return bRet; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Set the slot number for the row
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWMIInstanceMgr::SetSlot(HROW hRow,HSLOT hSlot) { CWMIInstance * pTempInstance = NULL; HRESULT hr = E_FAIL;
pTempInstance = m_pFirst;
while(pTempInstance != NULL) { if(pTempInstance->m_hRow == hRow) { pTempInstance->m_hSlot = hSlot; hr = S_OK; break; } pTempInstance = pTempInstance->m_pNext; } // while
return hr; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the slot number for the row
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HSLOT CWMIInstanceMgr::GetSlot(HROW hRow) { HSLOT hSlot = -1; CWMIInstance * pTempInstance = NULL;
pTempInstance = m_pFirst;
while(pTempInstance != NULL) { if(pTempInstance->m_hRow == hRow) { hSlot = pTempInstance->m_hSlot; break; } pTempInstance = pTempInstance->m_pNext; } // while
return hSlot; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Check if the instance identified by the key exists in the list
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CWMIInstanceMgr::IsInstanceExist(BSTR strKey) { BOOL bRet = FALSE; CWMIInstance * pTempInstance = NULL;
pTempInstance = m_pFirst;
while(pTempInstance != NULL) { if(pTempInstance->m_strKey != NULL && strKey != NULL) if(wbem_wcsicmp(pTempInstance->m_strKey,strKey) == 0) { bRet = TRUE; break; } pTempInstance = pTempInstance->m_pNext; } // while
return bRet; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// check if the instance identified from the pointer exists
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
BOOL CWMIInstanceMgr::IsInstanceExist(CWbemClassWrapper * pInstance) { BOOL bRet = FALSE; CWMIInstance * pTempInstance = NULL;
pTempInstance = m_pFirst;
while(pTempInstance != NULL) { if(pTempInstance->m_pInstance == pInstance) { bRet = TRUE; break; } pTempInstance = pTempInstance->m_pNext; } // while
return bRet; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the HROW identified by the key
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
HROW CWMIInstanceMgr::GetHRow(BSTR strKey) { HROW hRow = -1; CWMIInstance * pTempInstance = NULL;
pTempInstance = m_pFirst;
while(pTempInstance != NULL) { if(pTempInstance->m_strKey != NULL && strKey != NULL) if(wbem_wcsicmp(pTempInstance->m_strKey,strKey) == 0) { hRow = pTempInstance->m_hRow; break; } pTempInstance = pTempInstance->m_pNext; } // while
return hRow;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Set the status of a particular row
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CWMIInstanceMgr::SetRowStatus(HROW hRow , DBSTATUS dwStatus) { CWMIInstance * pTempInstance = NULL;
pTempInstance = m_pFirst;
while(pTempInstance != NULL) { if(pTempInstance->m_hRow == hRow) { pTempInstance->SetRowStatus(dwStatus); break; } pTempInstance = pTempInstance->m_pNext; } // while
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the status of a particular row
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
DBSTATUS CWMIInstanceMgr::GetRowStatus(HROW hRow) { DBSTATUS dwStatus = DBROWSTATUS_E_FAIL; CWMIInstance * pTempInstance = NULL;
pTempInstance = m_pFirst;
while(pTempInstance != NULL) { if(pTempInstance->m_hRow == hRow) { dwStatus = pTempInstance->GetRowStatus(); break; } pTempInstance = pTempInstance->m_pNext; } // while
return dwStatus; }
|