windows-nt/Source/XPSP1/NT/admin/wmi/wbem/adapters/oledb/igetrow.cpp
2020-09-26 16:20:57 +08:00

227 lines
5 KiB
C++

///////////////////////////////////////////////////////////////////////////
//
// Microsoft WMIOLE DB Provider
//
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
// IChapteredRowset.CPP IChapteredRowset interface implementation
//
///////////////////////////////////////////////////////////////////////////
#include "headers.h"
/////////////////////////////////////////////////////////////////////////////////////////////////
//
// Adds a reference to a chapter
//
// Returns one of the following values:
// S_OK Method Succeeded
// E_FAIL General Error
//
/////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIGetRow::GetRowFromHROW(IUnknown * pUnkOuter,HROW hRow,REFIID riid,IUnknown ** ppUnk)
{
HRESULT hr = DB_E_BADROWHANDLE;
CRow *pRow = NULL;
CSetStructuredExceptionHandler seh;
TRY_BLOCK;
// Serialize the object
CAutoBlock cab(ROWSET->GetCriticalSection());
// Clear ErrorInfo
g_pCError->ClearErrorInfo();
if(m_pObj->IsZoombie())
{
hr = E_UNEXPECTED;
}
else
if( pUnkOuter != NULL && riid != IID_IUnknown)
{
hr = DB_E_NOAGGREGATION;
}
else
if(ppUnk == NULL)
{
hr = E_INVALIDARG;
}
else
if( m_pObj->m_uRsType == PROPERTYQUALIFIER ||
m_pObj->m_uRsType == CLASSQUALIFIER ||
m_pObj->m_uRsType == METHOD_ROWSET ||
m_pObj->m_uRsType == SCHEMA_ROWSET)
{
hr = E_FAIL;
LogMessage("URL for Qualifier or Schema rows not supported",hr);
}
// else was missing
// modified on 06/07/00
else
if(hRow > 0)
{
if(TRUE == m_pObj->IsRowExists(hRow))
{
DWORD dwStatus = m_pObj->GetRowStatus(hRow);
if(dwStatus != DBSTATUS_S_OK)
{
LogMessage("Status of the row is not DBSTATUS_S_OK",hr);
hr = dwStatus == DBROWSTATUS_E_DELETED ? DB_E_DELETEDROW : E_FAIL;
}
else
{
CBSTR strKey;
if(SUCCEEDED(hr = ((CWbemClassInstanceWrapper *)m_pObj->GetInstancePtr(hRow))->GetKey(strKey)))
{
try
{
pRow = new CRow(pUnkOuter,m_pObj,m_pObj->m_pCreator,m_pObj->m_pCon);
}
catch(...)
{
SAFE_DELETE_PTR(pRow);
throw;
}
if(pRow != NULL)
{
if(S_OK == (hr = pRow->InitRow(hRow,m_pObj->GetInstancePtr(hRow))))
{
hr = pRow->QueryInterface(riid,(void **)ppUnk);
}
}
else
{
hr = E_OUTOFMEMORY;
}
}
else
{
hr = E_FAIL;
*ppUnk = NULL;
}
}
}
}
if(FAILED(hr))
{
SAFE_DELETE_PTR(pRow);
}
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IGetRow);
CATCH_BLOCK_HRESULT(hr,L"IGetRow::GetRowFromHROW");
return hr;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//
// Adds a reference to a chapter
//
// Returns one of the following values:
// S_OK Method Succeeded
// E_FAIL General Error
//
/////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIGetRow::GetURLFromHROW(HROW hRow,LPOLESTR * ppwszURL)
{
HRESULT hr = DB_E_BADROWHANDLE;
CSetStructuredExceptionHandler seh;
TRY_BLOCK;
//========================
// Serialize the object
//========================
CAutoBlock cab(ROWSET->GetCriticalSection());
//========================
// Clear ErrorInfo
//========================
g_pCError->ClearErrorInfo();
if(m_pObj->IsZoombie())
{
hr = E_UNEXPECTED;
}
else
if( m_pObj->m_uRsType == PROPERTYQUALIFIER ||
m_pObj->m_uRsType == CLASSQUALIFIER ||
m_pObj->m_uRsType == METHOD_ROWSET||
m_pObj->m_uRsType == SCHEMA_ROWSET)
{
hr = E_FAIL;
LogMessage("URL for Qualifier or Schema rows not supported",hr);
}
else
if(hRow > 0)
{
//========================
// If row exists
//========================
if(TRUE == m_pObj->IsRowExists(hRow))
{
DWORD dwStatus = m_pObj->GetRowStatus(hRow);
if(dwStatus != DBSTATUS_S_OK)
{
LogMessage("Status of the row is not DBSTATUS_S_OK",hr);
hr = dwStatus == DBROWSTATUS_E_DELETED ? DB_E_DELETEDROW : E_FAIL;
}
else
{
CBSTR strKey;
if(SUCCEEDED(hr = ((CWbemClassInstanceWrapper *)m_pObj->GetInstancePtr(hRow))->GetKey(strKey)))
{
BSTR strPath = NULL;
BSTR strURL = NULL;
hr = S_OK;
CURLParser urlParser;
urlParser.SetPath(strKey);
urlParser.GetURL(strURL);
try
{
*ppwszURL = (LPOLESTR)g_pIMalloc->Alloc((SysStringLen(strURL) + 1) *sizeof(WCHAR));
}
catch(...)
{
if(*ppwszURL)
{
g_pIMalloc->Free(*ppwszURL);
}
throw;
}
if(*ppwszURL == NULL)
{
hr = E_OUTOFMEMORY;
}
else
{
wcscpy(*ppwszURL,strURL);
}
SysFreeString(strURL);
SysFreeString(strPath);
}
else
{
LogMessage("Getting a URL on command executed row is not supported except" \
"except if query is not REFERENCES OF or ASSOCIATERS OF",hr);
hr = E_FAIL;
}
}
}
}
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IGetRow);
CATCH_BLOCK_HRESULT(hr,L"IGetRow::GetURLFromHROW");
return hr;
}