Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1360 lines
35 KiB

  1. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Microsoft WMIOLE DB Provider
  4. // (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
  5. //
  6. // URLPARSER.cpp: implementation of the CURLParser class.
  7. //
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. #include "headers.h"
  10. /////////////////////////////////////////////////////////////////////////////////
  11. // Some markers used
  12. /////////////////////////////////////////////////////////////////////////////////
  13. WCHAR DBInitDelimBegin[] = L"::[";
  14. WCHAR DBInitDelimEnd[] = L"]";
  15. WCHAR StrKeyEnd[] = L"\"";
  16. WCHAR EmbededPropDelim[] = L"#";
  17. WCHAR EmbededInstNumDelim[] = L":=";
  18. WCHAR BACKSLASH[] = L"\\";
  19. WCHAR DOT[] = L".";
  20. #define MAXCHILDINDEX_SIZE 10
  21. //////////////////////////////////////////////////////////////////////
  22. // Construction/Destruction
  23. //////////////////////////////////////////////////////////////////////
  24. CURLParser::CURLParser()
  25. {
  26. m_strURL = Wmioledb_SysAllocString(NULL);
  27. m_strNameSpace = Wmioledb_SysAllocString(NULL);
  28. m_strClassName = Wmioledb_SysAllocString(NULL);
  29. m_strPath = Wmioledb_SysAllocString(NULL);
  30. m_strEmbededPropName = Wmioledb_SysAllocString(NULL);
  31. m_lURLType = -1;
  32. m_nEmbededChildIndex = -1;
  33. m_bAllPropsInSync = FALSE;
  34. m_bURLInitialized = FALSE;
  35. m_strInitProps = Wmioledb_SysAllocString(NULL);
  36. m_pIPathParser = NULL;
  37. }
  38. //////////////////////////////////////////////////////////////////////
  39. // Construction/Destruction
  40. //////////////////////////////////////////////////////////////////////
  41. CURLParser::~CURLParser()
  42. {
  43. // Free all the strings
  44. SAFE_FREE_SYSSTRING(m_strURL);
  45. SAFE_FREE_SYSSTRING(m_strNameSpace);
  46. SAFE_FREE_SYSSTRING(m_strClassName);
  47. SAFE_FREE_SYSSTRING(m_strEmbededPropName);
  48. SAFE_FREE_SYSSTRING(m_strInitProps);
  49. SAFE_DELETE_PTR(m_pIPathParser);
  50. }
  51. //////////////////////////////////////////////////////////////////////
  52. // Function to the get the Name space
  53. //////////////////////////////////////////////////////////////////////
  54. HRESULT CURLParser::GetNameSpace(BSTR & strNameSpace)
  55. {
  56. HRESULT hr = E_FAIL;
  57. // if initialized
  58. if(m_bURLInitialized)
  59. {
  60. hr = m_pIPathParser->GetNameSpace(strNameSpace);
  61. }
  62. return hr;
  63. }
  64. //////////////////////////////////////////////////////////////////////
  65. // Function to the Get the classname
  66. // The string will be freed by the calling application
  67. //////////////////////////////////////////////////////////////////////
  68. HRESULT CURLParser::GetClassName(BSTR &strClassName)
  69. {
  70. HRESULT hr = E_FAIL;
  71. // if parser initialized
  72. if(m_bURLInitialized)
  73. {
  74. // NTRaid : 134967
  75. // 07/12/00
  76. if(!(m_strURL != NULL && IsValidURL(m_strURL) == RELATIVEURL))
  77. {
  78. hr = m_pIPathParser->GetClassName(strClassName);
  79. }
  80. }
  81. return hr;
  82. }
  83. //////////////////////////////////////////////////////////////////////
  84. // Function to the set the Path // corresponds to PATH
  85. //////////////////////////////////////////////////////////////////////
  86. HRESULT CURLParser::SetPath(BSTR strPath)
  87. {
  88. HRESULT hr = E_FAIL;
  89. WCHAR * pstrPath = NULL;
  90. int nMemToAlloc = 0;
  91. // if parser initialized
  92. if(!m_bURLInitialized)
  93. {
  94. hr = S_OK;
  95. nMemToAlloc = SysStringLen(strPath);
  96. nMemToAlloc = (nMemToAlloc + 1) * sizeof(WCHAR);
  97. pstrPath = new WCHAR[ nMemToAlloc];
  98. if(pstrPath)
  99. {
  100. memset(pstrPath,0,nMemToAlloc);
  101. memcpy(pstrPath,strPath,SysStringLen(strPath) * sizeof(WCHAR));
  102. // Seperate the embededInstances parameters if any
  103. GetEmbededInstanceParameters(pstrPath);
  104. // if the underlying parser object is not instantiated
  105. // then instantiate the appropriate object
  106. if(!m_pIPathParser)
  107. {
  108. hr = Initialize(pstrPath);
  109. }
  110. if(SUCCEEDED(hr))
  111. {
  112. m_bAllPropsInSync = TRUE;
  113. hr = m_pIPathParser->SetPath(pstrPath);
  114. m_bURLInitialized = TRUE;
  115. }
  116. }
  117. else
  118. {
  119. hr = E_OUTOFMEMORY;
  120. }
  121. }
  122. SAFE_DELETE_ARRAY(pstrPath);
  123. return hr;
  124. }
  125. //////////////////////////////////////////////////////////////////////
  126. // Function to the get the Path // corresponds to PATH
  127. //////////////////////////////////////////////////////////////////////
  128. HRESULT CURLParser::GetPath(BSTR &strPath)
  129. {
  130. HRESULT hr = E_FAIL;
  131. // NTRaid : 134967
  132. // 07/12/00
  133. if(m_strURL != NULL && IsValidURL(m_strURL) == RELATIVEURL)
  134. {
  135. strPath = Wmioledb_SysAllocString(m_strURL);
  136. hr = S_OK;
  137. }
  138. else
  139. // if initialized
  140. if(m_bURLInitialized)
  141. {
  142. hr = m_pIPathParser->GetPath(strPath);
  143. }
  144. return hr;
  145. }
  146. //////////////////////////////////////////////////////////////////////
  147. // Function to the get the Path with the embeded inst info
  148. //////////////////////////////////////////////////////////////////////
  149. HRESULT CURLParser::GetPathWithEmbededInstInfo(BSTR &strPath)
  150. {
  151. WCHAR * pstrTemp = NULL;
  152. WCHAR strIndex[MAXCHILDINDEX_SIZE];
  153. LONG cLen = 0;
  154. BSTR strTemp = NULL;
  155. HRESULT hr = E_FAIL;
  156. // if parser initialized
  157. if(m_bURLInitialized)
  158. {
  159. hr = S_OK;
  160. memset(strIndex,0,sizeof(WCHAR) * MAXCHILDINDEX_SIZE);
  161. if(SUCCEEDED(hr = GetPath(strTemp)))
  162. {
  163. // Frame the the string
  164. // Initially get the length of the string to be allocated
  165. cLen = wcslen(strTemp);
  166. _itow(m_nEmbededChildIndex,strIndex,10);
  167. if( m_lURLType == URL_EMBEDEDCLASS)
  168. {
  169. cLen += wcslen(EmbededPropDelim) + wcslen(m_strEmbededPropName);
  170. if(m_nEmbededChildIndex >= 0)
  171. {
  172. cLen += wcslen(EmbededInstNumDelim) + wcslen(strIndex);
  173. }
  174. }
  175. cLen++;
  176. pstrTemp = new WCHAR[cLen];
  177. if(pstrTemp != NULL)
  178. {
  179. memset(pstrTemp,0,sizeof(WCHAR) * cLen);
  180. // Copy the string
  181. wcscpy(pstrTemp,strTemp);
  182. if( m_lURLType == URL_EMBEDEDCLASS)
  183. {
  184. wcscat(pstrTemp,EmbededPropDelim);
  185. wcscat(pstrTemp,m_strEmbededPropName);
  186. // If the property is array of embeded instance
  187. if( m_nEmbededChildIndex >=0)
  188. {
  189. wcscat(pstrTemp,EmbededInstNumDelim);
  190. wcscat(pstrTemp,strIndex);
  191. }
  192. }
  193. strPath = Wmioledb_SysAllocString(pstrTemp);
  194. SAFE_DELETE_ARRAY(pstrTemp);
  195. }
  196. else
  197. {
  198. hr = E_OUTOFMEMORY;
  199. }
  200. SAFE_FREE_SYSSTRING(strTemp);
  201. }
  202. }
  203. return hr;
  204. }
  205. //////////////////////////////////////////////////////////////////////
  206. // Function to the set the URL string
  207. //////////////////////////////////////////////////////////////////////
  208. HRESULT CURLParser::SetURL(BSTR strURL)
  209. {
  210. HRESULT hr = S_OK;
  211. // if already not initialized
  212. if(!m_bURLInitialized)
  213. {
  214. hr = InitializeParserForURL(strURL);
  215. if(SUCCEEDED(hr))
  216. {
  217. m_bURLInitialized = TRUE;
  218. }
  219. }
  220. return hr;
  221. }
  222. //////////////////////////////////////////////////////////////////////
  223. // Function to the get the URL string
  224. //////////////////////////////////////////////////////////////////////
  225. HRESULT CURLParser::GetURL(BSTR &strURL)
  226. {
  227. HRESULT hr = E_FAIL;
  228. // NTRaid : 134967
  229. // 07/12/00
  230. if(m_strURL != NULL && IsValidURL(m_strURL) == RELATIVEURL)
  231. {
  232. strURL = Wmioledb_SysAllocString(m_strURL);
  233. hr = S_OK;
  234. }
  235. else
  236. // if already initialized
  237. if(m_bURLInitialized)
  238. {
  239. hr = GetURLString(strURL);
  240. }
  241. return hr;
  242. }
  243. //////////////////////////////////////////////////////////////////////
  244. // Function to the set embeded instance information for the URL
  245. //////////////////////////////////////////////////////////////////////
  246. void CURLParser::SetEmbededInstInfo(BSTR strProperty,int nIndex)
  247. {
  248. BOOL bRet = FALSE;
  249. WCHAR *pstrPropName = NULL;
  250. pstrPropName = new WCHAR [SysStringLen(strProperty) + 1];
  251. if(pstrPropName != NULL)
  252. {
  253. wcscpy(pstrPropName,strProperty);
  254. _wcsupr(pstrPropName);
  255. m_nEmbededChildIndex = nIndex;
  256. if(m_strEmbededPropName != NULL)
  257. {
  258. SysFreeString(m_strEmbededPropName);
  259. }
  260. m_strEmbededPropName = Wmioledb_SysAllocString(pstrPropName);
  261. SAFE_DELETE_ARRAY(pstrPropName);
  262. m_lURLType = URL_EMBEDEDCLASS;
  263. }
  264. }
  265. //////////////////////////////////////////////////////////////////////
  266. // Function to the get embeded instance information from the URL
  267. //////////////////////////////////////////////////////////////////////
  268. void CURLParser::GetEmbededInstInfo(BSTR &strProperty,int &nIndex)
  269. {
  270. nIndex = -1;
  271. strProperty = Wmioledb_SysAllocString(NULL);
  272. m_bAllPropsInSync = TRUE;
  273. if( m_lURLType == URL_EMBEDEDCLASS)
  274. {
  275. strProperty = Wmioledb_SysAllocString(m_strEmbededPropName);
  276. nIndex = m_nEmbededChildIndex;
  277. }
  278. }
  279. //////////////////////////////////////////////////////////////////////
  280. // Function which extracts the Initialiazation properties from URL
  281. //////////////////////////////////////////////////////////////////////
  282. void CURLParser::GetInitializationProps(WCHAR *pStrIn)
  283. {
  284. WCHAR * pStrTemp = NULL;
  285. WCHAR * pStrTemp1 = NULL;
  286. WCHAR * pStrInitProps = NULL;
  287. ULONG_PTR cStrLenToCpy = 0;
  288. _wcsrev(pStrIn);
  289. pStrTemp = wcsstr(pStrIn ,_wcsrev(DBInitDelimBegin));
  290. pStrTemp1 = wcsstr(pStrIn ,StrKeyEnd );
  291. if(!( pStrTemp == NULL || pStrTemp1 == NULL))
  292. {
  293. // reversing back again
  294. _wcsrev(DBInitDelimBegin);
  295. if(pStrTemp1 > pStrTemp && pStrTemp != NULL)
  296. {
  297. cStrLenToCpy = pStrTemp - pStrIn + 1 - wcslen(DBInitDelimEnd);
  298. pStrInitProps = new WCHAR[ cStrLenToCpy];
  299. if(pStrInitProps != NULL)
  300. {
  301. memset(pStrInitProps , 0 , cStrLenToCpy * sizeof(WCHAR));
  302. memcpy( pStrInitProps , pStrIn + wcslen(DBInitDelimEnd) , (cStrLenToCpy -1) * sizeof(WCHAR));
  303. _wcsrev(pStrInitProps);
  304. m_strInitProps = Wmioledb_SysAllocString(pStrInitProps);
  305. pStrInitProps = NULL;
  306. pStrTemp += wcslen(DBInitDelimBegin);
  307. _wcsrev(pStrTemp);
  308. wcscpy(pStrIn,pStrTemp);
  309. }
  310. }
  311. }
  312. else
  313. {
  314. _wcsrev(pStrIn);
  315. }
  316. SAFE_DELETE_ARRAY(pStrInitProps);
  317. }
  318. //////////////////////////////////////////////////////////////////////
  319. // Function which frames the URL string from the other properties
  320. //////////////////////////////////////////////////////////////////////
  321. HRESULT CURLParser::GetURLString(BSTR &strURL)
  322. {
  323. WCHAR * pStrURL = NULL;
  324. WCHAR * pStrTemp = NULL;
  325. LONG lSizeToAlloc = 0;
  326. BOOL bDefaultServer = FALSE;
  327. WCHAR * strIndex = NULL;
  328. LONG lUrlFormat = 0;
  329. HRESULT hr = S_OK;
  330. if(m_bURLInitialized)
  331. {
  332. if(m_strURL != NULL)
  333. {
  334. SysFreeString(m_strURL);
  335. }
  336. CBSTR strPath;
  337. HRESULT hr = S_OK;
  338. if(SUCCEEDED(hr = GetPath((BSTR &)strPath)))
  339. {
  340. lUrlFormat = IsValidURL(strPath);
  341. lSizeToAlloc += (SysStringLen(strPath) * sizeof(WCHAR));
  342. if(lUrlFormat != UMIURL)
  343. {
  344. // Get the size of the URL
  345. lSizeToAlloc += wcslen(WMIURLPREFIX) ;
  346. }
  347. if( m_lURLType == URL_EMBEDEDCLASS)
  348. {
  349. strIndex = new WCHAR[MAXCHILDINDEX_SIZE];
  350. if( strIndex == NULL)
  351. {
  352. hr = E_OUTOFMEMORY;
  353. }
  354. else
  355. {
  356. _itow(m_nEmbededChildIndex,strIndex,10);
  357. lSizeToAlloc += wcslen(EmbededPropDelim) + wcslen(m_strEmbededPropName);
  358. // If the property is array of embeded instance
  359. if( m_nEmbededChildIndex >= 0)
  360. {
  361. lSizeToAlloc += wcslen(EmbededInstNumDelim) + wcslen(strIndex);
  362. }
  363. }
  364. }
  365. if(SUCCEEDED(hr))
  366. {
  367. // Adding for the NULL termination
  368. lSizeToAlloc += sizeof(WCHAR);
  369. pStrURL = new WCHAR [lSizeToAlloc];
  370. if( pStrURL != NULL)
  371. {
  372. if(lUrlFormat != UMIURL)
  373. {
  374. // frame the URL
  375. wcscpy(pStrURL,WMIURLPREFIX);
  376. wcscat(pStrURL,strPath);
  377. }
  378. else
  379. {
  380. wcscpy(pStrURL,strPath);
  381. }
  382. if( m_lURLType == URL_EMBEDEDCLASS)
  383. {
  384. wcscat(pStrURL,EmbededPropDelim);
  385. wcscat(pStrURL,m_strEmbededPropName);
  386. // If the property is array of embeded instance
  387. if( m_nEmbededChildIndex >=0)
  388. {
  389. wcscat(pStrURL,EmbededInstNumDelim);
  390. wcscat(pStrURL,strIndex);
  391. }
  392. }
  393. strURL = Wmioledb_SysAllocString(pStrURL);
  394. }
  395. else
  396. {
  397. hr = E_OUTOFMEMORY;
  398. }
  399. }
  400. }
  401. // NTRaid: 136439
  402. // 07/05/00
  403. SAFE_DELETE_ARRAY(pStrURL)
  404. SAFE_DELETE_ARRAY(strIndex)
  405. }
  406. return hr;
  407. }
  408. //////////////////////////////////////////////////////////////////////
  409. // Get the type of object which is represented by URL
  410. //////////////////////////////////////////////////////////////////////
  411. LONG CURLParser::GetURLType()
  412. {
  413. // NTRaid : 134967
  414. // 07/12/00
  415. if(!(m_strURL != NULL && IsValidURL(m_strURL) == RELATIVEURL)
  416. && m_lURLType != URL_EMBEDEDCLASS)
  417. {
  418. m_lURLType = -1;
  419. // if already initialized
  420. if(m_bURLInitialized)
  421. {
  422. m_lURLType = m_pIPathParser->GetURLType();
  423. }
  424. }
  425. return m_lURLType;
  426. }
  427. /*
  428. //////////////////////////////////////////////////////////////////////
  429. // Get the path of the object from URL
  430. //////////////////////////////////////////////////////////////////////
  431. void CURLParser::GetPathFromURLString(WCHAR * & pStrIn)
  432. {
  433. WCHAR *pStrTemp = NULL;
  434. if( m_strPath != NULL)
  435. {
  436. SysFreeString(m_strPath);
  437. m_strPath = Wmioledb_SysAllocString(NULL);
  438. }
  439. // If there is default server then there will be no server name in the URL
  440. if(NULL != wcsstr(pStrIn , DefaultServer))
  441. {
  442. pStrTemp = pStrIn + wcslen(DefaultServer);
  443. m_strPath = Wmioledb_SysAllocString(pStrTemp);
  444. pStrIn = pStrTemp;
  445. }
  446. else
  447. {
  448. // put the path in the member variable
  449. m_strPath = Wmioledb_SysAllocString(pStrIn);
  450. }
  451. HRESULT hr = m_pIPathParser->SetPath(m_strPath);
  452. }
  453. */
  454. //////////////////////////////////////////////////////////////////////
  455. // Seperate the embededInstances parameters if any
  456. //////////////////////////////////////////////////////////////////////
  457. void CURLParser::GetEmbededInstanceParameters(WCHAR * & pStrIn)
  458. {
  459. WCHAR *pStrTemp = NULL;
  460. WCHAR *pStrPropName = NULL;
  461. WCHAR *pStrIndex = NULL;
  462. LONG lPropNameLen = 0;
  463. pStrTemp = wcsstr(pStrIn,EmbededPropDelim);
  464. if(pStrTemp != NULL)
  465. {
  466. lPropNameLen = wcslen(pStrTemp) - wcslen(EmbededPropDelim);
  467. pStrIndex = wcsstr(pStrTemp,EmbededInstNumDelim);
  468. if(pStrIndex != NULL)
  469. {
  470. lPropNameLen -= wcslen(pStrIndex);
  471. m_nEmbededChildIndex = _wtoi(pStrIndex + wcslen(EmbededInstNumDelim));
  472. // Terminate the string
  473. *pStrIndex = '\0';
  474. }
  475. lPropNameLen++;
  476. pStrPropName = new WCHAR[lPropNameLen];
  477. if(pStrPropName != NULL)
  478. {
  479. wcscpy(pStrPropName,pStrTemp + wcslen(EmbededPropDelim));
  480. // Terminate the string
  481. *pStrTemp = '\0';
  482. m_lURLType = URL_EMBEDEDCLASS;
  483. if(m_strEmbededPropName)
  484. {
  485. SysFreeString(m_strEmbededPropName);
  486. }
  487. m_strEmbededPropName = Wmioledb_SysAllocString(pStrPropName);
  488. }
  489. }
  490. else
  491. {
  492. m_lURLType = -1;
  493. }
  494. SAFE_DELETE_ARRAY(pStrPropName);
  495. }
  496. //////////////////////////////////////////////////////////////////////
  497. // Initialize the URL of the parser
  498. //////////////////////////////////////////////////////////////////////
  499. HRESULT CURLParser::InitializeParserForURL(BSTR strURL)
  500. {
  501. WCHAR * pstrPath = NULL;
  502. WCHAR * pTempStr = NULL;
  503. HRESULT hr = E_FAIL;
  504. LONG lUrlFormat = 0;
  505. // check if the URL is valid and get the format ( umi or wmi url) of the url
  506. lUrlFormat = IsValidURL(strURL);
  507. // NTRaid : 134967
  508. // 07/12/00
  509. if(lUrlFormat == RELATIVEURL)
  510. {
  511. m_strURL = Wmioledb_SysAllocString(strURL);
  512. m_lURLType = URL_ROW;
  513. hr = S_OK;
  514. }
  515. else
  516. if(lUrlFormat > 0)
  517. {
  518. hr = S_OK;
  519. // Get the length of the prefix of the URL
  520. // before the path
  521. pstrPath = new WCHAR[wcslen((WCHAR *)strURL) + 1];
  522. if(pstrPath != NULL)
  523. {
  524. pTempStr = (WCHAR *)strURL;
  525. // if URL is of WMI format then remove the prefix "Winmgmts:"
  526. if(lUrlFormat == WMIURL)
  527. {
  528. pTempStr += wcslen(WMIURLPREFIX);
  529. }
  530. wcscpy(pstrPath,pTempStr);
  531. pTempStr = pstrPath;
  532. // Seperate the initialization properties if any
  533. GetInitializationProps(pstrPath);
  534. // Seperate the embededInstances parameters if any
  535. GetEmbededInstanceParameters(pstrPath);
  536. // if the underlying parser object is not instantiated
  537. // then instantiate the appropriate object
  538. if(!m_pIPathParser)
  539. {
  540. hr = Initialize(pstrPath);
  541. }
  542. if(SUCCEEDED(hr))
  543. {
  544. // Separate the path string
  545. // GetPathFromURLString(pstrPath);
  546. hr = m_pIPathParser->SetPath(pstrPath);
  547. }
  548. SAFE_DELETE_ARRAY(pTempStr);
  549. }
  550. else
  551. {
  552. hr = E_OUTOFMEMORY;
  553. }
  554. }
  555. return hr;
  556. }
  557. ////////////////////////////////////////////////////////////////////////////////////////////////////
  558. // Get key value for a particular key in the path
  559. ////////////////////////////////////////////////////////////////////////////////////////////////////
  560. HRESULT CURLParser::GetKeyValue(BSTR strKey,VARIANT &varValue)
  561. {
  562. HRESULT hr = E_FAIL;
  563. // if already initialized
  564. if(m_bURLInitialized)
  565. {
  566. hr = m_pIPathParser->GetKeyValue(strKey,varValue);
  567. }
  568. return hr;
  569. }
  570. ////////////////////////////////////////////////////////////////////////////////////////////////////
  571. // Function to instantiate a appropriate parser object
  572. ////////////////////////////////////////////////////////////////////////////////////////////////////
  573. HRESULT CURLParser::Initialize(WCHAR *pStrPath)
  574. {
  575. HRESULT hr = S_OK;
  576. if(wbem_wcsincmp(pStrPath,UMIURLPREFIX,wcslen(UMIURLPREFIX)))
  577. {
  578. m_pIPathParser = new CWBEMPathParser;
  579. }
  580. else
  581. {
  582. m_pIPathParser = new CUMIPathParser;
  583. }
  584. if(m_pIPathParser == NULL)
  585. {
  586. hr = E_OUTOFMEMORY;
  587. }
  588. else
  589. {
  590. hr = m_pIPathParser->Initialize();
  591. }
  592. return hr;
  593. }
  594. ////////////////////////////////////////////////////////////////////////////////////////////////////
  595. // Function to clear all the member variables
  596. ////////////////////////////////////////////////////////////////////////////////////////////////////
  597. void CURLParser::ClearParser()
  598. {
  599. SAFE_FREE_SYSSTRING(m_strURL);
  600. SAFE_FREE_SYSSTRING(m_strNameSpace);
  601. SAFE_FREE_SYSSTRING(m_strClassName);
  602. SAFE_FREE_SYSSTRING(m_strEmbededPropName);
  603. SAFE_FREE_SYSSTRING(m_strInitProps);
  604. m_lURLType = -1;
  605. m_nEmbededChildIndex = -1;
  606. m_bAllPropsInSync = FALSE;
  607. m_bURLInitialized = FALSE;
  608. if(m_pIPathParser)
  609. {
  610. m_pIPathParser->SetPath(L"");
  611. }
  612. }
  613. ////////////////////////////////////////////////////////////////////////////////////////////////////
  614. // function which gets the parent namespace and the namespace
  615. ////////////////////////////////////////////////////////////////////////////////////////////////////
  616. HRESULT CURLParser::ParseNameSpace(BSTR & strParentNameSpace,BSTR &strNameSpace)
  617. {
  618. return m_pIPathParser->ParseNameSpace(strParentNameSpace,strNameSpace);
  619. }
  620. ////////////////////////////////////////////////////////////////////////////////////////////////////
  621. // Function which checks if the URL is valid and also returns the format of the URL ( UMI or WMI)
  622. ////////////////////////////////////////////////////////////////////////////////////////////////////
  623. LONG CURLParser::IsValidURL(WCHAR *pStrUrl)
  624. {
  625. long lRet = RELATIVEURL;
  626. if(wbem_wcsincmp(pStrUrl,UMIURLPREFIX,wcslen(UMIURLPREFIX)) == 0)
  627. {
  628. lRet = UMIURL;
  629. }
  630. else
  631. if(wbem_wcsincmp(pStrUrl,WMIURLPREFIX,wcslen(WMIURLPREFIX)) == 0)
  632. {
  633. lRet = WMIURL;
  634. }
  635. return lRet;
  636. }
  637. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  638. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  639. // CWBEMPathParser class implementation
  640. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  641. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  642. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  643. // Constructor
  644. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  645. CWBEMPathParser::CWBEMPathParser()
  646. {
  647. m_pIWbemPath = NULL;
  648. }
  649. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  650. // Destructor
  651. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  652. CWBEMPathParser::~CWBEMPathParser()
  653. {
  654. SAFE_RELEASE_PTR(m_pIWbemPath);
  655. }
  656. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  657. // Initialization function
  658. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  659. HRESULT CWBEMPathParser::Initialize()
  660. {
  661. HRESULT hr = S_OK;
  662. if(!g_pIWbemPathParser)
  663. {
  664. hr = CoGetClassObject(CLSID_WbemDefPath,CLSCTX_INPROC_SERVER,NULL,IID_IClassFactory,(LPVOID *)&g_pIWbemPathParser);
  665. }
  666. if(SUCCEEDED(hr))
  667. {
  668. if(SUCCEEDED(hr = g_pIWbemPathParser->CreateInstance(NULL,IID_IWbemPath,(LPVOID *)&m_pIWbemPath)))
  669. {
  670. hr = g_pIWbemPathParser->LockServer(TRUE);
  671. }
  672. }
  673. return hr;
  674. }
  675. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  676. // Get the namespace of from the parser
  677. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  678. HRESULT CWBEMPathParser::GetNameSpace(BSTR &strNameSpace)
  679. {
  680. HRESULT hr = S_OK;
  681. WCHAR wstrNameSpace[PATH_MAXLENGTH];
  682. ULONG lBuffLen = PATH_MAXLENGTH;
  683. memset(wstrNameSpace,0,PATH_MAXLENGTH *sizeof(WCHAR));
  684. if(SUCCEEDED(hr = m_pIWbemPath->GetText(WBEMPATH_GET_SERVER_AND_NAMESPACE_ONLY,&lBuffLen,wstrNameSpace)))
  685. {
  686. strNameSpace = Wmioledb_SysAllocString(wstrNameSpace);
  687. }
  688. return hr;
  689. }
  690. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  691. // Get the class name
  692. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  693. HRESULT CWBEMPathParser::GetClassName(BSTR &strClassName)
  694. {
  695. WCHAR wstrClassName[CLASSNAME_MAXLENGTH];
  696. HRESULT hr = S_OK;
  697. ULONG lBuffLen = CLASSNAME_MAXLENGTH;
  698. memset(wstrClassName,0,CLASSNAME_MAXLENGTH * sizeof(WCHAR));
  699. if(SUCCEEDED(hr = m_pIWbemPath->GetClassName(&lBuffLen,wstrClassName)))
  700. {
  701. strClassName = Wmioledb_SysAllocString(wstrClassName);
  702. }
  703. return hr;
  704. }
  705. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  706. // Set the path
  707. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  708. HRESULT CWBEMPathParser::SetPath(WCHAR * pwcsPath)
  709. {
  710. return m_pIWbemPath->SetText(WBEMPATH_CREATE_ACCEPT_ALL,pwcsPath);
  711. }
  712. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  713. // Function to get the path
  714. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  715. HRESULT CWBEMPathParser::GetPath(BSTR &strPath)
  716. {
  717. HRESULT hr = S_OK;
  718. WCHAR wstrPath[PATH_MAXLENGTH];
  719. ULONG lBuffLen = PATH_MAXLENGTH;
  720. memset(wstrPath,0,PATH_MAXLENGTH *sizeof(WCHAR));
  721. if(SUCCEEDED(hr = m_pIWbemPath->GetText(WBEMPATH_GET_SERVER_TOO,&lBuffLen,wstrPath)))
  722. {
  723. strPath = Wmioledb_SysAllocString(wstrPath);
  724. }
  725. return hr;
  726. }
  727. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  728. // Get the type of the URL
  729. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  730. LONG CWBEMPathParser::GetURLType()
  731. {
  732. LONG lRet = -1;
  733. ULONGLONG lType = 0;
  734. if( lRet != URL_EMBEDEDCLASS)
  735. {
  736. HRESULT hr = m_pIWbemPath->GetInfo(0,&lType);
  737. if(lType & WBEMPATH_INFO_IS_CLASS_REF)
  738. {
  739. lRet = URL_ROWSET;
  740. }
  741. else
  742. if(lRet & WBEMPATH_INFO_IS_INST_REF)
  743. {
  744. lRet = URL_ROW;
  745. }
  746. else
  747. {
  748. lRet = URL_DATASOURCE;
  749. }
  750. }
  751. return lRet;
  752. }
  753. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  754. // Get the key value of a particular key in the path
  755. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  756. HRESULT CWBEMPathParser::GetKeyValue(BSTR strKey, VARIANT &varValue)
  757. {
  758. IWbemPathKeyList * pKeyList = NULL;
  759. BOOL bFound = FALSE;
  760. ULONG lKeyCount = 0;
  761. ULONG lNameBufSize = KEYNAME_MAXLENGTH * sizeof(WCHAR);
  762. ULONG lValBuffSize = 0;
  763. ULONG lCimType = 0;
  764. HRESULT hr = S_OK;
  765. if(SUCCEEDED(hr = m_pIWbemPath->GetKeyList(&pKeyList)))
  766. {
  767. if(SUCCEEDED(hr = pKeyList->GetCount(&lKeyCount)))
  768. {
  769. WCHAR strKeyName[KEYNAME_MAXLENGTH];
  770. memset(strKeyName,0,KEYNAME_MAXLENGTH * sizeof(WCHAR));
  771. for(ULONG lIndex=0 ; lIndex < lKeyCount ; lIndex++)
  772. {
  773. lValBuffSize = 0;
  774. if(FAILED(hr = pKeyList->GetKey(lIndex,
  775. 0,
  776. &lNameBufSize,
  777. strKeyName,
  778. &lValBuffSize,
  779. NULL,
  780. NULL)))
  781. {
  782. break;
  783. }
  784. // if the required key is found then
  785. // get the value
  786. if(!wbem_wcsicmp(strKeyName,strKey))
  787. {
  788. lNameBufSize = 0;
  789. lValBuffSize = sizeof(VARIANT);
  790. if(SUCCEEDED(hr = pKeyList->GetKey2(lIndex,
  791. 0,
  792. &lNameBufSize,
  793. NULL,
  794. &varValue,
  795. &lCimType)))
  796. {
  797. bFound = TRUE;
  798. break;
  799. }
  800. }
  801. else
  802. {
  803. wcscpy(strKeyName,L"");
  804. }
  805. }
  806. if(SUCCEEDED(hr) && bFound == FALSE)
  807. {
  808. hr = E_FAIL;
  809. }
  810. }
  811. }
  812. return hr;
  813. }
  814. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  815. // function which gets the parent namespace and the namespace
  816. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  817. HRESULT CWBEMPathParser::ParseNameSpace(BSTR & strParentNameSpace,BSTR &strNameSpace)
  818. {
  819. HRESULT hr = S_OK;
  820. WCHAR wstrNameSpace[PATH_MAXLENGTH];
  821. ULONG lTemp = PATH_MAXLENGTH;
  822. ULONG lLocal = 0;
  823. WCHAR * pTempStr = &wstrNameSpace[0];
  824. ULONG ulCount = 0;
  825. memset(wstrNameSpace,0,PATH_MAXLENGTH *sizeof(WCHAR));
  826. if(SUCCEEDED(hr =m_pIWbemPath->GetNamespaceCount(&ulCount)))
  827. {
  828. if(ulCount >= 2)
  829. {
  830. if(SUCCEEDED(hr = m_pIWbemPath->GetServer(&lTemp,wstrNameSpace)))
  831. {
  832. if(wcscmp(wstrNameSpace , DOT) == 0)
  833. {
  834. wcscpy(wstrNameSpace , L"\\\\.");
  835. }
  836. pTempStr += wcslen(wstrNameSpace) ;
  837. pTempStr = &wstrNameSpace[0] + wcslen(wstrNameSpace);
  838. for(ULONG lIndex = 0 ; lIndex < ulCount -1 ; lIndex++)
  839. {
  840. wcscat(pTempStr , BACKSLASH);
  841. lLocal = PATH_MAXLENGTH - wcslen(wstrNameSpace);
  842. pTempStr = &wstrNameSpace[0] + wcslen(wstrNameSpace);
  843. if(FAILED(hr = m_pIWbemPath->GetNamespaceAt(lIndex, &lLocal,pTempStr)))
  844. {
  845. break;
  846. }
  847. }
  848. }
  849. }
  850. else
  851. {
  852. hr = E_FAIL;
  853. }
  854. }
  855. if(SUCCEEDED(hr))
  856. {
  857. strParentNameSpace = Wmioledb_SysAllocString(wstrNameSpace);
  858. wcscpy(wstrNameSpace , L"");
  859. lLocal = PATH_MAXLENGTH;
  860. pTempStr = &wstrNameSpace[0];
  861. if(FAILED(hr = m_pIWbemPath->GetNamespaceAt(ulCount-1, &lLocal,pTempStr)))
  862. {
  863. SysFreeString(strParentNameSpace);
  864. }
  865. else
  866. {
  867. strNameSpace = Wmioledb_SysAllocString(wstrNameSpace);
  868. }
  869. }
  870. return hr;
  871. }
  872. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  873. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  874. // CUMIPathParser class implementation
  875. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  876. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  877. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  878. // COnsturctor
  879. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  880. CUMIPathParser::CUMIPathParser()
  881. {
  882. m_pIUmiPath = NULL;
  883. }
  884. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  885. // Destructor
  886. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  887. CUMIPathParser::~CUMIPathParser()
  888. {
  889. SAFE_RELEASE_PTR(m_pIUmiPath);
  890. }
  891. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  892. // Initialization function
  893. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  894. HRESULT CUMIPathParser::Initialize()
  895. {
  896. HRESULT hr = S_OK;
  897. if(!g_pIWbemPathParser)
  898. {
  899. hr = CoGetClassObject(CLSID_WbemDefPath,CLSCTX_INPROC_SERVER,NULL,IID_IClassFactory,(LPVOID *)&g_pIWbemPathParser);
  900. }
  901. if(SUCCEEDED(hr))
  902. {
  903. if(SUCCEEDED(hr = g_pIWbemPathParser->CreateInstance(NULL,IID_IUmiURL,(LPVOID *)&m_pIUmiPath)))
  904. {
  905. hr = g_pIWbemPathParser->LockServer(TRUE);
  906. }
  907. }
  908. return hr;
  909. }
  910. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  911. // Get the namespace to connect
  912. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  913. HRESULT CUMIPathParser::GetNameSpace(BSTR &strNameSpace)
  914. {
  915. WCHAR wstrNamespace[PATH_MAXLENGTH];
  916. HRESULT hr = S_OK;
  917. ULONG lBuffLen = PATH_MAXLENGTH * sizeof(WCHAR);
  918. memset(wstrNamespace,0,lBuffLen);
  919. hr = m_pIUmiPath->Get(UMIPATH_CREATE_AS_EITHER,&lBuffLen,wstrNamespace);
  920. strNameSpace = Wmioledb_SysAllocString(wstrNamespace);
  921. /*
  922. WCHAR wstrLocator[PATH_MAXLENGTH];
  923. WCHAR wstrName[PATH_MAXLENGTH];
  924. WCHAR wstrRoot[PATH_MAXLENGTH];
  925. ULONG lBuffLen = PATH_MAXLENGTH;
  926. IUmiURLKeyList *pKeyList = NULL;
  927. ULONG lCnt = 0;
  928. lBuffLen = PATH_MAXLENGTH * sizeof(WCHAR);
  929. lBuffLen = PATH_MAXLENGTH;
  930. memset(wstrLocator,0,PATH_MAXLENGTH *sizeof(WCHAR));
  931. memset(wstrName,0,PATH_MAXLENGTH *sizeof(WCHAR));
  932. memset(wstrRoot,0,PATH_MAXLENGTH *sizeof(WCHAR));
  933. hr = m_pIUmiPath->GetComponentCount(&lCnt);
  934. if(SUCCEEDED(hr = m_pIUmiPath->GetLocator(&lBuffLen,wstrLocator)))
  935. {
  936. lBuffLen = PATH_MAXLENGTH;
  937. if(SUCCEEDED(hr = m_pIUmiPath->GetRootNamespace(&lBuffLen,wstrRoot)))
  938. {
  939. // If there is no component then the the namespace can
  940. // be obtained from GetLeafName method
  941. lBuffLen = PATH_MAXLENGTH;
  942. if(lCnt >0)
  943. {
  944. hr = m_pIUmiPath->GetComponent(0,&lBuffLen,wstrName,&pKeyList);
  945. }
  946. else
  947. {
  948. hr = m_pIUmiPath->GetLeafName(&lBuffLen,wstrName);
  949. }
  950. if(SUCCEEDED(hr))
  951. {
  952. WCHAR *pTemp = NULL;
  953. lBuffLen = wcslen(UMIATORPREFIX) +
  954. wcslen(wstrLocator) + wcslen(UMISEPARATOR) +
  955. wcslen(wstrRoot) + wcslen(UMISEPARATOR) +
  956. wcslen(wstrName) + + wcslen (UMIPREFIX) + 1;
  957. SAFE_RELEASE_PTR(pKeyList)
  958. try
  959. {
  960. pTemp = new WCHAR[lBuffLen];
  961. }
  962. catch(...)
  963. {
  964. SAFE_DELETE_ARRAY(pTemp);
  965. throw;
  966. }
  967. if(pTemp)
  968. {
  969. wcscpy(pTemp,UMIPREFIX);
  970. wcscat(pTemp,UMIATORPREFIX);
  971. wcscat(pTemp,wstrLocator);
  972. wcscat(pTemp,UMISEPARATOR);
  973. wcscat(pTemp,wstrRoot);
  974. if(wcslen(wstrName) != 0)
  975. {
  976. wcscat(pTemp,UMISEPARATOR);
  977. wcscat(pTemp,wstrName);
  978. }
  979. strNameSpace = Wmioledb_SysAllocString(pTemp);
  980. SAFE_DELETE_ARRAY(pTemp);
  981. }
  982. else
  983. {
  984. hr = E_OUTOFMEMORY;
  985. }
  986. }
  987. }
  988. }
  989. */
  990. return hr;
  991. }
  992. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  993. // Get the class name
  994. // if the URL is pointing to a instance then this function fails as
  995. // class name cannot be obtained from the URL
  996. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  997. HRESULT CUMIPathParser::GetClassName(BSTR &strClassName)
  998. {
  999. HRESULT hr = S_OK;
  1000. if(GetURLType() == URL_ROWSET)
  1001. {
  1002. WCHAR wstrClassName[CLASSNAME_MAXLENGTH];
  1003. ULONG lBuffLen = CLASSNAME_MAXLENGTH;
  1004. LONG lUrlType = -1;
  1005. memset(wstrClassName,0,CLASSNAME_MAXLENGTH * sizeof(WCHAR));
  1006. lUrlType = GetURLType();
  1007. if(lUrlType == URL_ROW || lUrlType == URL_ROWSET)
  1008. if(SUCCEEDED(hr = m_pIUmiPath->GetLeafName(&lBuffLen,wstrClassName)))
  1009. {
  1010. strClassName = Wmioledb_SysAllocString(wstrClassName);
  1011. }
  1012. }
  1013. else
  1014. {
  1015. hr = E_FAIL;
  1016. }
  1017. return hr;
  1018. }
  1019. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1020. // Function to set the path
  1021. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1022. HRESULT CUMIPathParser::SetPath(WCHAR * pwcsPath)
  1023. {
  1024. return m_pIUmiPath->Set(UMIPATH_CREATE_AS_EITHER,pwcsPath);
  1025. }
  1026. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1027. // Function to get the path
  1028. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1029. HRESULT CUMIPathParser::GetPath(BSTR &strPath)
  1030. {
  1031. HRESULT hr = S_OK;
  1032. WCHAR wstrPath[PATH_MAXLENGTH];
  1033. ULONG lBuffLen = PATH_MAXLENGTH;
  1034. memset(wstrPath,0,PATH_MAXLENGTH *sizeof(WCHAR));
  1035. if(SUCCEEDED(hr = m_pIUmiPath->Get(UMIPATH_CREATE_AS_EITHER,&lBuffLen,wstrPath)))
  1036. {
  1037. strPath = Wmioledb_SysAllocString(wstrPath);
  1038. }
  1039. return hr;
  1040. }
  1041. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1042. // Function to get type of the object the URL is representing
  1043. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1044. LONG CUMIPathParser::GetURLType()
  1045. {
  1046. LONG lRet = URL_DATASOURCE;
  1047. ULONGLONG lType = 0;
  1048. HRESULT hr = S_OK;
  1049. if(SUCCEEDED(hr = m_pIUmiPath->GetPathInfo(0,&lType)))
  1050. {
  1051. if(UMIPATH_INFO_CLASS_PATH == lType)
  1052. {
  1053. lRet = URL_ROWSET;
  1054. }
  1055. else
  1056. {
  1057. lRet = URL_ROW;
  1058. }
  1059. }
  1060. return lRet;
  1061. }
  1062. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1063. // Function to get a key value of a particular key in the path
  1064. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1065. HRESULT CUMIPathParser::GetKeyValue(BSTR strKey, VARIANT &varValue)
  1066. {
  1067. HRESULT hr = S_OK;
  1068. IUmiURLKeyList * pKeyList = NULL;
  1069. BOOL bFound = FALSE;
  1070. ULONG lKeyCount = 0;
  1071. ULONG lNameBufSize = KEYNAME_MAXLENGTH * sizeof(WCHAR);
  1072. ULONG lValBuffSize = 0;
  1073. ULONG lCimType = 0;
  1074. if(SUCCEEDED(hr = m_pIUmiPath->GetKeyList(&pKeyList)))
  1075. {
  1076. if(SUCCEEDED(hr = pKeyList->GetCount(&lKeyCount)) && lKeyCount > 0)
  1077. {
  1078. WCHAR strKeyName[KEYNAME_MAXLENGTH];
  1079. WCHAR pChar[2048];
  1080. memset(strKeyName,0,KEYNAME_MAXLENGTH * sizeof(WCHAR));
  1081. for(ULONG lIndex=0 ; lIndex < lKeyCount ; lIndex++)
  1082. {
  1083. lValBuffSize = 0;
  1084. if(FAILED(hr = pKeyList->GetKey(lIndex,
  1085. 0,
  1086. &lNameBufSize,
  1087. strKeyName,
  1088. &lValBuffSize,
  1089. NULL)))
  1090. {
  1091. break;
  1092. }
  1093. // if the required key is found then
  1094. // get the value
  1095. if(!wbem_wcsicmp(strKeyName,strKey))
  1096. {
  1097. lNameBufSize = 0;
  1098. lValBuffSize = sizeof(VARIANT);
  1099. lValBuffSize = 2048;
  1100. if(SUCCEEDED(hr = pKeyList->GetKey(lIndex,
  1101. 0,
  1102. &lNameBufSize,
  1103. NULL,
  1104. &lValBuffSize,
  1105. pChar)))
  1106. {
  1107. bFound = TRUE;
  1108. break;
  1109. }
  1110. }
  1111. else
  1112. {
  1113. wcscpy(strKeyName,L"");
  1114. }
  1115. }
  1116. if(SUCCEEDED(hr) && bFound == FALSE)
  1117. {
  1118. hr = E_FAIL;
  1119. }
  1120. if(SUCCEEDED(hr))
  1121. {
  1122. varValue.vt = VT_BSTR;
  1123. varValue.bstrVal = SysAllocString(pChar);
  1124. }
  1125. }
  1126. if(SUCCEEDED(hr) && lKeyCount == 0)
  1127. {
  1128. hr = E_FAIL;
  1129. }
  1130. SAFE_RELEASE_PTR(pKeyList);
  1131. }
  1132. return hr;
  1133. }
  1134. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1135. // function which gets the parent namespace and the namespace
  1136. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1137. HRESULT CUMIPathParser::ParseNameSpace(BSTR & strParentNameSpace,BSTR &strNameSpace)
  1138. {
  1139. return E_FAIL;
  1140. }