|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Microsoft WMIOLE DB Provider
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
// URLPARSER.cpp: implementation of the CURLParser class.
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "headers.h"
/////////////////////////////////////////////////////////////////////////////////
// Some markers used
/////////////////////////////////////////////////////////////////////////////////
WCHAR DBInitDelimBegin[] = L"::["; WCHAR DBInitDelimEnd[] = L"]"; WCHAR StrKeyEnd[] = L"\""; WCHAR EmbededPropDelim[] = L"#"; WCHAR EmbededInstNumDelim[] = L":="; WCHAR BACKSLASH[] = L"\\"; WCHAR DOT[] = L".";
#define MAXCHILDINDEX_SIZE 10
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CURLParser::CURLParser() {
m_strURL = Wmioledb_SysAllocString(NULL); m_strNameSpace = Wmioledb_SysAllocString(NULL); m_strClassName = Wmioledb_SysAllocString(NULL); m_strPath = Wmioledb_SysAllocString(NULL); m_strEmbededPropName = Wmioledb_SysAllocString(NULL); m_lURLType = -1; m_nEmbededChildIndex = -1;
m_bAllPropsInSync = FALSE; m_bURLInitialized = FALSE; m_strInitProps = Wmioledb_SysAllocString(NULL); m_pIPathParser = NULL;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CURLParser::~CURLParser() { // Free all the strings
SAFE_FREE_SYSSTRING(m_strURL); SAFE_FREE_SYSSTRING(m_strNameSpace); SAFE_FREE_SYSSTRING(m_strClassName); SAFE_FREE_SYSSTRING(m_strEmbededPropName); SAFE_FREE_SYSSTRING(m_strInitProps);
SAFE_DELETE_PTR(m_pIPathParser); }
//////////////////////////////////////////////////////////////////////
// Function to the get the Name space
//////////////////////////////////////////////////////////////////////
HRESULT CURLParser::GetNameSpace(BSTR & strNameSpace) { HRESULT hr = E_FAIL; // if initialized
if(m_bURLInitialized) { hr = m_pIPathParser->GetNameSpace(strNameSpace); } return hr; }
//////////////////////////////////////////////////////////////////////
// Function to the Get the classname
// The string will be freed by the calling application
//////////////////////////////////////////////////////////////////////
HRESULT CURLParser::GetClassName(BSTR &strClassName) {
HRESULT hr = E_FAIL; // if parser initialized
if(m_bURLInitialized) { // NTRaid : 134967
// 07/12/00
if(!(m_strURL != NULL && IsValidURL(m_strURL) == RELATIVEURL)) { hr = m_pIPathParser->GetClassName(strClassName); } } return hr; }
//////////////////////////////////////////////////////////////////////
// Function to the set the Path // corresponds to PATH
//////////////////////////////////////////////////////////////////////
HRESULT CURLParser::SetPath(BSTR strPath) { HRESULT hr = E_FAIL; WCHAR * pstrPath = NULL; int nMemToAlloc = 0; // if parser initialized
if(!m_bURLInitialized) { hr = S_OK; nMemToAlloc = SysStringLen(strPath); nMemToAlloc = (nMemToAlloc + 1) * sizeof(WCHAR);
pstrPath = new WCHAR[ nMemToAlloc];
if(pstrPath) {
memset(pstrPath,0,nMemToAlloc); memcpy(pstrPath,strPath,SysStringLen(strPath) * sizeof(WCHAR)); // Seperate the embededInstances parameters if any
GetEmbededInstanceParameters(pstrPath);
// if the underlying parser object is not instantiated
// then instantiate the appropriate object
if(!m_pIPathParser) { hr = Initialize(pstrPath); }
if(SUCCEEDED(hr)) { m_bAllPropsInSync = TRUE; hr = m_pIPathParser->SetPath(pstrPath); m_bURLInitialized = TRUE; }
} else { hr = E_OUTOFMEMORY; } }
SAFE_DELETE_ARRAY(pstrPath); return hr; }
//////////////////////////////////////////////////////////////////////
// Function to the get the Path // corresponds to PATH
//////////////////////////////////////////////////////////////////////
HRESULT CURLParser::GetPath(BSTR &strPath) {
HRESULT hr = E_FAIL; // NTRaid : 134967
// 07/12/00
if(m_strURL != NULL && IsValidURL(m_strURL) == RELATIVEURL) { strPath = Wmioledb_SysAllocString(m_strURL); hr = S_OK; } else // if initialized
if(m_bURLInitialized) { hr = m_pIPathParser->GetPath(strPath); } return hr; }
//////////////////////////////////////////////////////////////////////
// Function to the get the Path with the embeded inst info
//////////////////////////////////////////////////////////////////////
HRESULT CURLParser::GetPathWithEmbededInstInfo(BSTR &strPath) { WCHAR * pstrTemp = NULL; WCHAR strIndex[MAXCHILDINDEX_SIZE]; LONG cLen = 0; BSTR strTemp = NULL; HRESULT hr = E_FAIL;
// if parser initialized
if(m_bURLInitialized) { hr = S_OK; memset(strIndex,0,sizeof(WCHAR) * MAXCHILDINDEX_SIZE);
if(SUCCEEDED(hr = GetPath(strTemp))) { // Frame the the string
// Initially get the length of the string to be allocated
cLen = wcslen(strTemp); _itow(m_nEmbededChildIndex,strIndex,10);
if( m_lURLType == URL_EMBEDEDCLASS) { cLen += wcslen(EmbededPropDelim) + wcslen(m_strEmbededPropName);
if(m_nEmbededChildIndex >= 0) { cLen += wcslen(EmbededInstNumDelim) + wcslen(strIndex); } } cLen++;
pstrTemp = new WCHAR[cLen]; if(pstrTemp != NULL) { memset(pstrTemp,0,sizeof(WCHAR) * cLen);
// Copy the string
wcscpy(pstrTemp,strTemp);
if( m_lURLType == URL_EMBEDEDCLASS) { wcscat(pstrTemp,EmbededPropDelim); wcscat(pstrTemp,m_strEmbededPropName);
// If the property is array of embeded instance
if( m_nEmbededChildIndex >=0) { wcscat(pstrTemp,EmbededInstNumDelim); wcscat(pstrTemp,strIndex); } }
strPath = Wmioledb_SysAllocString(pstrTemp); SAFE_DELETE_ARRAY(pstrTemp); } else { hr = E_OUTOFMEMORY; } SAFE_FREE_SYSSTRING(strTemp); } } return hr;
}
//////////////////////////////////////////////////////////////////////
// Function to the set the URL string
//////////////////////////////////////////////////////////////////////
HRESULT CURLParser::SetURL(BSTR strURL) { HRESULT hr = S_OK;
// if already not initialized
if(!m_bURLInitialized) {
hr = InitializeParserForURL(strURL);
if(SUCCEEDED(hr)) { m_bURLInitialized = TRUE; } } return hr; }
//////////////////////////////////////////////////////////////////////
// Function to the get the URL string
//////////////////////////////////////////////////////////////////////
HRESULT CURLParser::GetURL(BSTR &strURL) { HRESULT hr = E_FAIL; // NTRaid : 134967
// 07/12/00
if(m_strURL != NULL && IsValidURL(m_strURL) == RELATIVEURL) { strURL = Wmioledb_SysAllocString(m_strURL); hr = S_OK; } else // if already initialized
if(m_bURLInitialized) { hr = GetURLString(strURL); } return hr; }
//////////////////////////////////////////////////////////////////////
// Function to the set embeded instance information for the URL
//////////////////////////////////////////////////////////////////////
void CURLParser::SetEmbededInstInfo(BSTR strProperty,int nIndex) { BOOL bRet = FALSE; WCHAR *pstrPropName = NULL;
pstrPropName = new WCHAR [SysStringLen(strProperty) + 1];
if(pstrPropName != NULL) { wcscpy(pstrPropName,strProperty);
_wcsupr(pstrPropName);
m_nEmbededChildIndex = nIndex; if(m_strEmbededPropName != NULL) { SysFreeString(m_strEmbededPropName); }
m_strEmbededPropName = Wmioledb_SysAllocString(pstrPropName);
SAFE_DELETE_ARRAY(pstrPropName);
m_lURLType = URL_EMBEDEDCLASS; } }
//////////////////////////////////////////////////////////////////////
// Function to the get embeded instance information from the URL
//////////////////////////////////////////////////////////////////////
void CURLParser::GetEmbededInstInfo(BSTR &strProperty,int &nIndex) { nIndex = -1; strProperty = Wmioledb_SysAllocString(NULL); m_bAllPropsInSync = TRUE; if( m_lURLType == URL_EMBEDEDCLASS) { strProperty = Wmioledb_SysAllocString(m_strEmbededPropName); nIndex = m_nEmbededChildIndex; } }
//////////////////////////////////////////////////////////////////////
// Function which extracts the Initialiazation properties from URL
//////////////////////////////////////////////////////////////////////
void CURLParser::GetInitializationProps(WCHAR *pStrIn) { WCHAR * pStrTemp = NULL; WCHAR * pStrTemp1 = NULL; WCHAR * pStrInitProps = NULL; ULONG_PTR cStrLenToCpy = 0;
_wcsrev(pStrIn);
pStrTemp = wcsstr(pStrIn ,_wcsrev(DBInitDelimBegin)); pStrTemp1 = wcsstr(pStrIn ,StrKeyEnd );
if(!( pStrTemp == NULL || pStrTemp1 == NULL)) { // reversing back again
_wcsrev(DBInitDelimBegin);
if(pStrTemp1 > pStrTemp && pStrTemp != NULL) { cStrLenToCpy = pStrTemp - pStrIn + 1 - wcslen(DBInitDelimEnd); pStrInitProps = new WCHAR[ cStrLenToCpy];
if(pStrInitProps != NULL) {
memset(pStrInitProps , 0 , cStrLenToCpy * sizeof(WCHAR)); memcpy( pStrInitProps , pStrIn + wcslen(DBInitDelimEnd) , (cStrLenToCpy -1) * sizeof(WCHAR)); _wcsrev(pStrInitProps);
m_strInitProps = Wmioledb_SysAllocString(pStrInitProps);
pStrInitProps = NULL;
pStrTemp += wcslen(DBInitDelimBegin); _wcsrev(pStrTemp); wcscpy(pStrIn,pStrTemp); } } } else { _wcsrev(pStrIn); } SAFE_DELETE_ARRAY(pStrInitProps);
}
//////////////////////////////////////////////////////////////////////
// Function which frames the URL string from the other properties
//////////////////////////////////////////////////////////////////////
HRESULT CURLParser::GetURLString(BSTR &strURL) { WCHAR * pStrURL = NULL; WCHAR * pStrTemp = NULL; LONG lSizeToAlloc = 0; BOOL bDefaultServer = FALSE; WCHAR * strIndex = NULL; LONG lUrlFormat = 0; HRESULT hr = S_OK;
if(m_bURLInitialized) { if(m_strURL != NULL) { SysFreeString(m_strURL); }
CBSTR strPath; HRESULT hr = S_OK; if(SUCCEEDED(hr = GetPath((BSTR &)strPath))) { lUrlFormat = IsValidURL(strPath); lSizeToAlloc += (SysStringLen(strPath) * sizeof(WCHAR));
if(lUrlFormat != UMIURL) { // Get the size of the URL
lSizeToAlloc += wcslen(WMIURLPREFIX) ; }
if( m_lURLType == URL_EMBEDEDCLASS) { strIndex = new WCHAR[MAXCHILDINDEX_SIZE];
if( strIndex == NULL) { hr = E_OUTOFMEMORY; } else { _itow(m_nEmbededChildIndex,strIndex,10); lSizeToAlloc += wcslen(EmbededPropDelim) + wcslen(m_strEmbededPropName); // If the property is array of embeded instance
if( m_nEmbededChildIndex >= 0) { lSizeToAlloc += wcslen(EmbededInstNumDelim) + wcslen(strIndex); } } }
if(SUCCEEDED(hr)) {
// Adding for the NULL termination
lSizeToAlloc += sizeof(WCHAR);
pStrURL = new WCHAR [lSizeToAlloc];
if( pStrURL != NULL) { if(lUrlFormat != UMIURL) { // frame the URL
wcscpy(pStrURL,WMIURLPREFIX); wcscat(pStrURL,strPath); } else { wcscpy(pStrURL,strPath); }
if( m_lURLType == URL_EMBEDEDCLASS) { wcscat(pStrURL,EmbededPropDelim); wcscat(pStrURL,m_strEmbededPropName);
// If the property is array of embeded instance
if( m_nEmbededChildIndex >=0) { wcscat(pStrURL,EmbededInstNumDelim); wcscat(pStrURL,strIndex); }
} strURL = Wmioledb_SysAllocString(pStrURL); } else { hr = E_OUTOFMEMORY; }
} } // NTRaid: 136439
// 07/05/00
SAFE_DELETE_ARRAY(pStrURL) SAFE_DELETE_ARRAY(strIndex) }
return hr; }
//////////////////////////////////////////////////////////////////////
// Get the type of object which is represented by URL
//////////////////////////////////////////////////////////////////////
LONG CURLParser::GetURLType() { // NTRaid : 134967
// 07/12/00
if(!(m_strURL != NULL && IsValidURL(m_strURL) == RELATIVEURL) && m_lURLType != URL_EMBEDEDCLASS) { m_lURLType = -1; // if already initialized
if(m_bURLInitialized) { m_lURLType = m_pIPathParser->GetURLType(); } } return m_lURLType; }
/*
//////////////////////////////////////////////////////////////////////
// Get the path of the object from URL
//////////////////////////////////////////////////////////////////////
void CURLParser::GetPathFromURLString(WCHAR * & pStrIn) { WCHAR *pStrTemp = NULL;
if( m_strPath != NULL) { SysFreeString(m_strPath); m_strPath = Wmioledb_SysAllocString(NULL); }
// If there is default server then there will be no server name in the URL
if(NULL != wcsstr(pStrIn , DefaultServer)) { pStrTemp = pStrIn + wcslen(DefaultServer); m_strPath = Wmioledb_SysAllocString(pStrTemp); pStrIn = pStrTemp; } else { // put the path in the member variable
m_strPath = Wmioledb_SysAllocString(pStrIn); }
HRESULT hr = m_pIPathParser->SetPath(m_strPath); }
*/
//////////////////////////////////////////////////////////////////////
// Seperate the embededInstances parameters if any
//////////////////////////////////////////////////////////////////////
void CURLParser::GetEmbededInstanceParameters(WCHAR * & pStrIn) { WCHAR *pStrTemp = NULL; WCHAR *pStrPropName = NULL; WCHAR *pStrIndex = NULL; LONG lPropNameLen = 0;
pStrTemp = wcsstr(pStrIn,EmbededPropDelim);
if(pStrTemp != NULL) { lPropNameLen = wcslen(pStrTemp) - wcslen(EmbededPropDelim); pStrIndex = wcsstr(pStrTemp,EmbededInstNumDelim); if(pStrIndex != NULL) { lPropNameLen -= wcslen(pStrIndex); m_nEmbededChildIndex = _wtoi(pStrIndex + wcslen(EmbededInstNumDelim)); // Terminate the string
*pStrIndex = '\0'; } lPropNameLen++; pStrPropName = new WCHAR[lPropNameLen];
if(pStrPropName != NULL) { wcscpy(pStrPropName,pStrTemp + wcslen(EmbededPropDelim));
// Terminate the string
*pStrTemp = '\0'; m_lURLType = URL_EMBEDEDCLASS; if(m_strEmbededPropName) { SysFreeString(m_strEmbededPropName); } m_strEmbededPropName = Wmioledb_SysAllocString(pStrPropName); } } else { m_lURLType = -1; } SAFE_DELETE_ARRAY(pStrPropName); }
//////////////////////////////////////////////////////////////////////
// Initialize the URL of the parser
//////////////////////////////////////////////////////////////////////
HRESULT CURLParser::InitializeParserForURL(BSTR strURL) { WCHAR * pstrPath = NULL; WCHAR * pTempStr = NULL; HRESULT hr = E_FAIL; LONG lUrlFormat = 0;
// check if the URL is valid and get the format ( umi or wmi url) of the url
lUrlFormat = IsValidURL(strURL); // NTRaid : 134967
// 07/12/00
if(lUrlFormat == RELATIVEURL) { m_strURL = Wmioledb_SysAllocString(strURL); m_lURLType = URL_ROW; hr = S_OK; } else if(lUrlFormat > 0) { hr = S_OK; // Get the length of the prefix of the URL
// before the path
pstrPath = new WCHAR[wcslen((WCHAR *)strURL) + 1];
if(pstrPath != NULL) { pTempStr = (WCHAR *)strURL; // if URL is of WMI format then remove the prefix "Winmgmts:"
if(lUrlFormat == WMIURL) { pTempStr += wcslen(WMIURLPREFIX); }
wcscpy(pstrPath,pTempStr);
pTempStr = pstrPath;
// Seperate the initialization properties if any
GetInitializationProps(pstrPath);
// Seperate the embededInstances parameters if any
GetEmbededInstanceParameters(pstrPath);
// if the underlying parser object is not instantiated
// then instantiate the appropriate object
if(!m_pIPathParser) { hr = Initialize(pstrPath); }
if(SUCCEEDED(hr)) { // Separate the path string
// GetPathFromURLString(pstrPath);
hr = m_pIPathParser->SetPath(pstrPath); }
SAFE_DELETE_ARRAY(pTempStr); } else { hr = E_OUTOFMEMORY; } } return hr; }
////////////////////////////////////////////////////////////////////////////////////////////////////
// Get key value for a particular key in the path
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CURLParser::GetKeyValue(BSTR strKey,VARIANT &varValue) { HRESULT hr = E_FAIL; // if already initialized
if(m_bURLInitialized) { hr = m_pIPathParser->GetKeyValue(strKey,varValue); }
return hr; }
////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to instantiate a appropriate parser object
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CURLParser::Initialize(WCHAR *pStrPath) { HRESULT hr = S_OK;
if(wbem_wcsincmp(pStrPath,UMIURLPREFIX,wcslen(UMIURLPREFIX))) { m_pIPathParser = new CWBEMPathParser; } else { m_pIPathParser = new CUMIPathParser; }
if(m_pIPathParser == NULL) { hr = E_OUTOFMEMORY; } else { hr = m_pIPathParser->Initialize(); }
return hr; }
////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to clear all the member variables
////////////////////////////////////////////////////////////////////////////////////////////////////
void CURLParser::ClearParser() { SAFE_FREE_SYSSTRING(m_strURL); SAFE_FREE_SYSSTRING(m_strNameSpace); SAFE_FREE_SYSSTRING(m_strClassName); SAFE_FREE_SYSSTRING(m_strEmbededPropName); SAFE_FREE_SYSSTRING(m_strInitProps);
m_lURLType = -1; m_nEmbededChildIndex = -1;
m_bAllPropsInSync = FALSE; m_bURLInitialized = FALSE;
if(m_pIPathParser) { m_pIPathParser->SetPath(L""); }
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// function which gets the parent namespace and the namespace
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CURLParser::ParseNameSpace(BSTR & strParentNameSpace,BSTR &strNameSpace) { return m_pIPathParser->ParseNameSpace(strParentNameSpace,strNameSpace); }
////////////////////////////////////////////////////////////////////////////////////////////////////
// Function which checks if the URL is valid and also returns the format of the URL ( UMI or WMI)
////////////////////////////////////////////////////////////////////////////////////////////////////
LONG CURLParser::IsValidURL(WCHAR *pStrUrl) { long lRet = RELATIVEURL;
if(wbem_wcsincmp(pStrUrl,UMIURLPREFIX,wcslen(UMIURLPREFIX)) == 0) { lRet = UMIURL; } else if(wbem_wcsincmp(pStrUrl,WMIURLPREFIX,wcslen(WMIURLPREFIX)) == 0) { lRet = WMIURL; }
return lRet; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CWBEMPathParser class implementation
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Constructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CWBEMPathParser::CWBEMPathParser() { m_pIWbemPath = NULL; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Destructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CWBEMPathParser::~CWBEMPathParser() { SAFE_RELEASE_PTR(m_pIWbemPath); }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Initialization function
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWBEMPathParser::Initialize() { HRESULT hr = S_OK;
if(!g_pIWbemPathParser) { hr = CoGetClassObject(CLSID_WbemDefPath,CLSCTX_INPROC_SERVER,NULL,IID_IClassFactory,(LPVOID *)&g_pIWbemPathParser); }
if(SUCCEEDED(hr)) { if(SUCCEEDED(hr = g_pIWbemPathParser->CreateInstance(NULL,IID_IWbemPath,(LPVOID *)&m_pIWbemPath))) { hr = g_pIWbemPathParser->LockServer(TRUE); } } return hr;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the namespace of from the parser
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWBEMPathParser::GetNameSpace(BSTR &strNameSpace) { HRESULT hr = S_OK; WCHAR wstrNameSpace[PATH_MAXLENGTH]; ULONG lBuffLen = PATH_MAXLENGTH;
memset(wstrNameSpace,0,PATH_MAXLENGTH *sizeof(WCHAR));
if(SUCCEEDED(hr = m_pIWbemPath->GetText(WBEMPATH_GET_SERVER_AND_NAMESPACE_ONLY,&lBuffLen,wstrNameSpace))) { strNameSpace = Wmioledb_SysAllocString(wstrNameSpace); } return hr; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the class name
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWBEMPathParser::GetClassName(BSTR &strClassName) { WCHAR wstrClassName[CLASSNAME_MAXLENGTH]; HRESULT hr = S_OK; ULONG lBuffLen = CLASSNAME_MAXLENGTH;
memset(wstrClassName,0,CLASSNAME_MAXLENGTH * sizeof(WCHAR));
if(SUCCEEDED(hr = m_pIWbemPath->GetClassName(&lBuffLen,wstrClassName))) { strClassName = Wmioledb_SysAllocString(wstrClassName); }
return hr; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Set the path
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWBEMPathParser::SetPath(WCHAR * pwcsPath) { return m_pIWbemPath->SetText(WBEMPATH_CREATE_ACCEPT_ALL,pwcsPath); }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to get the path
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWBEMPathParser::GetPath(BSTR &strPath) { HRESULT hr = S_OK; WCHAR wstrPath[PATH_MAXLENGTH]; ULONG lBuffLen = PATH_MAXLENGTH;
memset(wstrPath,0,PATH_MAXLENGTH *sizeof(WCHAR));
if(SUCCEEDED(hr = m_pIWbemPath->GetText(WBEMPATH_GET_SERVER_TOO,&lBuffLen,wstrPath))) { strPath = Wmioledb_SysAllocString(wstrPath); }
return hr; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the type of the URL
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
LONG CWBEMPathParser::GetURLType() { LONG lRet = -1; ULONGLONG lType = 0;
if( lRet != URL_EMBEDEDCLASS) { HRESULT hr = m_pIWbemPath->GetInfo(0,&lType);
if(lType & WBEMPATH_INFO_IS_CLASS_REF) { lRet = URL_ROWSET; } else if(lRet & WBEMPATH_INFO_IS_INST_REF) { lRet = URL_ROW; } else { lRet = URL_DATASOURCE; } }
return lRet; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the key value of a particular key in the path
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWBEMPathParser::GetKeyValue(BSTR strKey, VARIANT &varValue) { IWbemPathKeyList * pKeyList = NULL; BOOL bFound = FALSE; ULONG lKeyCount = 0; ULONG lNameBufSize = KEYNAME_MAXLENGTH * sizeof(WCHAR); ULONG lValBuffSize = 0; ULONG lCimType = 0; HRESULT hr = S_OK;
if(SUCCEEDED(hr = m_pIWbemPath->GetKeyList(&pKeyList))) { if(SUCCEEDED(hr = pKeyList->GetCount(&lKeyCount))) { WCHAR strKeyName[KEYNAME_MAXLENGTH]; memset(strKeyName,0,KEYNAME_MAXLENGTH * sizeof(WCHAR)); for(ULONG lIndex=0 ; lIndex < lKeyCount ; lIndex++) { lValBuffSize = 0; if(FAILED(hr = pKeyList->GetKey(lIndex, 0, &lNameBufSize, strKeyName, &lValBuffSize, NULL, NULL))) { break; }
// if the required key is found then
// get the value
if(!wbem_wcsicmp(strKeyName,strKey)) { lNameBufSize = 0; lValBuffSize = sizeof(VARIANT); if(SUCCEEDED(hr = pKeyList->GetKey2(lIndex, 0, &lNameBufSize, NULL, &varValue, &lCimType))) {
bFound = TRUE; break; } } else { wcscpy(strKeyName,L""); } } if(SUCCEEDED(hr) && bFound == FALSE) { hr = E_FAIL; } } }
return hr; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// function which gets the parent namespace and the namespace
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWBEMPathParser::ParseNameSpace(BSTR & strParentNameSpace,BSTR &strNameSpace) { HRESULT hr = S_OK; WCHAR wstrNameSpace[PATH_MAXLENGTH]; ULONG lTemp = PATH_MAXLENGTH; ULONG lLocal = 0; WCHAR * pTempStr = &wstrNameSpace[0]; ULONG ulCount = 0;
memset(wstrNameSpace,0,PATH_MAXLENGTH *sizeof(WCHAR));
if(SUCCEEDED(hr =m_pIWbemPath->GetNamespaceCount(&ulCount))) { if(ulCount >= 2) { if(SUCCEEDED(hr = m_pIWbemPath->GetServer(&lTemp,wstrNameSpace))) { if(wcscmp(wstrNameSpace , DOT) == 0) { wcscpy(wstrNameSpace , L"\\\\."); } pTempStr += wcslen(wstrNameSpace) ; pTempStr = &wstrNameSpace[0] + wcslen(wstrNameSpace);
for(ULONG lIndex = 0 ; lIndex < ulCount -1 ; lIndex++) { wcscat(pTempStr , BACKSLASH); lLocal = PATH_MAXLENGTH - wcslen(wstrNameSpace); pTempStr = &wstrNameSpace[0] + wcslen(wstrNameSpace);
if(FAILED(hr = m_pIWbemPath->GetNamespaceAt(lIndex, &lLocal,pTempStr))) { break; }
} } } else { hr = E_FAIL; } }
if(SUCCEEDED(hr)) { strParentNameSpace = Wmioledb_SysAllocString(wstrNameSpace);
wcscpy(wstrNameSpace , L""); lLocal = PATH_MAXLENGTH; pTempStr = &wstrNameSpace[0]; if(FAILED(hr = m_pIWbemPath->GetNamespaceAt(ulCount-1, &lLocal,pTempStr))) { SysFreeString(strParentNameSpace); } else { strNameSpace = Wmioledb_SysAllocString(wstrNameSpace); } }
return hr; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CUMIPathParser class implementation
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// COnsturctor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CUMIPathParser::CUMIPathParser() { m_pIUmiPath = NULL; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Destructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CUMIPathParser::~CUMIPathParser() { SAFE_RELEASE_PTR(m_pIUmiPath); }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Initialization function
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CUMIPathParser::Initialize() { HRESULT hr = S_OK;
if(!g_pIWbemPathParser) { hr = CoGetClassObject(CLSID_WbemDefPath,CLSCTX_INPROC_SERVER,NULL,IID_IClassFactory,(LPVOID *)&g_pIWbemPathParser); }
if(SUCCEEDED(hr)) { if(SUCCEEDED(hr = g_pIWbemPathParser->CreateInstance(NULL,IID_IUmiURL,(LPVOID *)&m_pIUmiPath))) { hr = g_pIWbemPathParser->LockServer(TRUE); } } return hr; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the namespace to connect
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CUMIPathParser::GetNameSpace(BSTR &strNameSpace) { WCHAR wstrNamespace[PATH_MAXLENGTH]; HRESULT hr = S_OK; ULONG lBuffLen = PATH_MAXLENGTH * sizeof(WCHAR); memset(wstrNamespace,0,lBuffLen);
hr = m_pIUmiPath->Get(UMIPATH_CREATE_AS_EITHER,&lBuffLen,wstrNamespace); strNameSpace = Wmioledb_SysAllocString(wstrNamespace);
/*
WCHAR wstrLocator[PATH_MAXLENGTH]; WCHAR wstrName[PATH_MAXLENGTH]; WCHAR wstrRoot[PATH_MAXLENGTH]; ULONG lBuffLen = PATH_MAXLENGTH; IUmiURLKeyList *pKeyList = NULL; ULONG lCnt = 0; lBuffLen = PATH_MAXLENGTH * sizeof(WCHAR);
lBuffLen = PATH_MAXLENGTH; memset(wstrLocator,0,PATH_MAXLENGTH *sizeof(WCHAR)); memset(wstrName,0,PATH_MAXLENGTH *sizeof(WCHAR)); memset(wstrRoot,0,PATH_MAXLENGTH *sizeof(WCHAR)); hr = m_pIUmiPath->GetComponentCount(&lCnt);
if(SUCCEEDED(hr = m_pIUmiPath->GetLocator(&lBuffLen,wstrLocator))) { lBuffLen = PATH_MAXLENGTH; if(SUCCEEDED(hr = m_pIUmiPath->GetRootNamespace(&lBuffLen,wstrRoot))) { // If there is no component then the the namespace can
// be obtained from GetLeafName method
lBuffLen = PATH_MAXLENGTH; if(lCnt >0) { hr = m_pIUmiPath->GetComponent(0,&lBuffLen,wstrName,&pKeyList); } else { hr = m_pIUmiPath->GetLeafName(&lBuffLen,wstrName); } if(SUCCEEDED(hr)) { WCHAR *pTemp = NULL; lBuffLen = wcslen(UMIATORPREFIX) + wcslen(wstrLocator) + wcslen(UMISEPARATOR) + wcslen(wstrRoot) + wcslen(UMISEPARATOR) + wcslen(wstrName) + + wcslen (UMIPREFIX) + 1; SAFE_RELEASE_PTR(pKeyList) try { pTemp = new WCHAR[lBuffLen]; } catch(...) { SAFE_DELETE_ARRAY(pTemp); throw; } if(pTemp) { wcscpy(pTemp,UMIPREFIX); wcscat(pTemp,UMIATORPREFIX); wcscat(pTemp,wstrLocator); wcscat(pTemp,UMISEPARATOR); wcscat(pTemp,wstrRoot); if(wcslen(wstrName) != 0) { wcscat(pTemp,UMISEPARATOR); wcscat(pTemp,wstrName); } strNameSpace = Wmioledb_SysAllocString(pTemp);
SAFE_DELETE_ARRAY(pTemp); } else { hr = E_OUTOFMEMORY; } } } }
*/ return hr; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Get the class name
// if the URL is pointing to a instance then this function fails as
// class name cannot be obtained from the URL
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CUMIPathParser::GetClassName(BSTR &strClassName) { HRESULT hr = S_OK;
if(GetURLType() == URL_ROWSET) { WCHAR wstrClassName[CLASSNAME_MAXLENGTH]; ULONG lBuffLen = CLASSNAME_MAXLENGTH; LONG lUrlType = -1;
memset(wstrClassName,0,CLASSNAME_MAXLENGTH * sizeof(WCHAR)); lUrlType = GetURLType();
if(lUrlType == URL_ROW || lUrlType == URL_ROWSET) if(SUCCEEDED(hr = m_pIUmiPath->GetLeafName(&lBuffLen,wstrClassName))) { strClassName = Wmioledb_SysAllocString(wstrClassName); } } else { hr = E_FAIL; } return hr; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to set the path
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CUMIPathParser::SetPath(WCHAR * pwcsPath) { return m_pIUmiPath->Set(UMIPATH_CREATE_AS_EITHER,pwcsPath); }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to get the path
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CUMIPathParser::GetPath(BSTR &strPath) { HRESULT hr = S_OK; WCHAR wstrPath[PATH_MAXLENGTH]; ULONG lBuffLen = PATH_MAXLENGTH;
memset(wstrPath,0,PATH_MAXLENGTH *sizeof(WCHAR));
if(SUCCEEDED(hr = m_pIUmiPath->Get(UMIPATH_CREATE_AS_EITHER,&lBuffLen,wstrPath))) { strPath = Wmioledb_SysAllocString(wstrPath); }
return hr; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to get type of the object the URL is representing
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
LONG CUMIPathParser::GetURLType() { LONG lRet = URL_DATASOURCE; ULONGLONG lType = 0; HRESULT hr = S_OK;
if(SUCCEEDED(hr = m_pIUmiPath->GetPathInfo(0,&lType))) { if(UMIPATH_INFO_CLASS_PATH == lType) { lRet = URL_ROWSET; } else { lRet = URL_ROW; } } return lRet;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to get a key value of a particular key in the path
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CUMIPathParser::GetKeyValue(BSTR strKey, VARIANT &varValue) { HRESULT hr = S_OK; IUmiURLKeyList * pKeyList = NULL; BOOL bFound = FALSE; ULONG lKeyCount = 0; ULONG lNameBufSize = KEYNAME_MAXLENGTH * sizeof(WCHAR); ULONG lValBuffSize = 0; ULONG lCimType = 0;
if(SUCCEEDED(hr = m_pIUmiPath->GetKeyList(&pKeyList))) { if(SUCCEEDED(hr = pKeyList->GetCount(&lKeyCount)) && lKeyCount > 0) { WCHAR strKeyName[KEYNAME_MAXLENGTH]; WCHAR pChar[2048]; memset(strKeyName,0,KEYNAME_MAXLENGTH * sizeof(WCHAR)); for(ULONG lIndex=0 ; lIndex < lKeyCount ; lIndex++) { lValBuffSize = 0; if(FAILED(hr = pKeyList->GetKey(lIndex, 0, &lNameBufSize, strKeyName, &lValBuffSize, NULL))) { break; }
// if the required key is found then
// get the value
if(!wbem_wcsicmp(strKeyName,strKey)) { lNameBufSize = 0; lValBuffSize = sizeof(VARIANT); lValBuffSize = 2048; if(SUCCEEDED(hr = pKeyList->GetKey(lIndex, 0, &lNameBufSize, NULL, &lValBuffSize, pChar))) { bFound = TRUE; break; } } else { wcscpy(strKeyName,L""); } } if(SUCCEEDED(hr) && bFound == FALSE) { hr = E_FAIL; } if(SUCCEEDED(hr)) { varValue.vt = VT_BSTR; varValue.bstrVal = SysAllocString(pChar); }
} if(SUCCEEDED(hr) && lKeyCount == 0) { hr = E_FAIL; } SAFE_RELEASE_PTR(pKeyList); }
return hr; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// function which gets the parent namespace and the namespace
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CUMIPathParser::ParseNameSpace(BSTR & strParentNameSpace,BSTR &strNameSpace) { return E_FAIL; }
|