Back

// PSLTable.cpp : Implementation of CPSLTable

#include "stdafx.h"
#include "PSLTable.h"

CPSLTable::CPSLTable()
{
   m_nCols = 0;
   m_nRows = 0;
}

HRESULT CPSLTable::FinalConstruct()
{
   return S_OK;
}

void CPSLTable::FinalRelease()
{
}

bool CPSLTable::Initialize(IWbemClassObject * pClassObject, long & lErrorCode, vector<tstring> * pColFilter, bool bSpecial)
{
   m_nCols = 0;
   SAFEARRAY * pArray = NULL;
   long lFlags = WBEM_FLAG_ALWAYS|WBEM_FLAG_NONSYSTEM_ONLY;
   if(bSpecial)
      lFlags = WBEM_FLAG_ALWAYS;
   lErrorCode = pClassObject->GetNames(NULL, lFlags, NULL, &pArray);
   bool bResult = false;
   vector<tstring> names;
   if(lErrorCode == WBEM_S_NO_ERROR)
   {
      long nElements;   // Number of elements in the array;
      lErrorCode = ::SafeArrayGetUBound(pArray, 1, &nElements);
      if(lErrorCode == S_OK)
      {
         bResult = true;
         long nCols = nElements + 1;
         BSTR sName = NULL;
         long Idx = 0;
         for(long i = 0;i < nCols;i ++)
         {
            lErrorCode = ::SafeArrayGetElement(pArray, &i, &sName);
            if(lErrorCode == S_OK)
            {
               if(pColFilter)
                  names.push_back(sName);
               else
               {
                  m_ColumnNames.insert(pair<long, _bstr_t>(Idx ++, sName));
                  m_nCols ++;
               }

               ::SysFreeString(sName);
               bResult = true;
            }
            else
            {
               bResult = false;
               break;
            }
         }
      }
      ::SafeArrayDestroy(pArray);
   }

   if(bResult && pColFilter)
   {
      long Idx = 0;
      for(vector<tstring>::iterator i = pColFilter->begin();i != pColFilter->end(); i++)
         for(vector<tstring>::iterator k = names.begin();k != names.end(); k++)
            if(!_tcsicmp(i->c_str(), k->c_str()))
            {
               m_ColumnNames.insert(pair<long, _bstr_t>(Idx ++, k->c_str()));
               m_nCols ++;
               break;
            }
   }

   return bResult;
}

bool CPSLTable::AddRow(IWbemClassObject * pClassObject, long & lErrorCode)
{
   long Idx = 0;
   for(CColumnNames::const_iterator i = m_ColumnNames.begin();i != m_ColumnNames.end();i ++)
   {
      _variant_t v;
      lErrorCode = pClassObject->Get(i->second, 0, &v, 0, 0);
      if(lErrorCode != S_OK)
         return false;

      m_ColumnValues.insert(pair<long, _variant_t>(m_nRows * m_nCols + Idx, v));
      Idx ++;
   }
   m_nRows ++;
   return true;
}

////////////////////////////////////////////////////////////////////////
// Interface Implementation;
////////////////////////////////////////////////////////////////////////

STDMETHODIMP CPSLTable::get_nCols(long * pValue)
{
   PSL_BEGIN

   *pValue = m_nCols;

   PSL_END
}

STDMETHODIMP CPSLTable::get_nRows(long * pValue)
{
   PSL_BEGIN

   *pValue = m_nRows;

   PSL_END
}

STDMETHODIMP CPSLTable::GetValue(long RowIdx, long ColIdx, VARIANT * pValue)
{
   PSL_BEGIN

   if(RowIdx > m_nRows || ColIdx > m_nCols)
      SetException(EX_INDEXOUTOFRANGE);
   else
   {
      CColumnValues::const_iterator i = m_ColumnValues.find(RowIdx * m_nCols + ColIdx);
      if(i == m_ColumnValues.end())
         SetException(EX_GENERALFAILURE);
      else
         ::VariantCopy(pValue, &i->second);
   }

   PSL_END
}

STDMETHODIMP CPSLTable::GetColName(long ColIdx, BSTR * pValue)
{
   PSL_BEGIN

   if(ColIdx > m_nCols)
      SetException(EX_INDEXOUTOFRANGE);
   else
   {
      CColumnNames::const_iterator i = m_ColumnNames.find(ColIdx);
      if(i == m_ColumnNames.end())
         SetException(EX_GENERALFAILURE);
      else
         *pValue = i->second.copy();
   }

   PSL_END
}

Top