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.

1569 lines
35 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 1999-2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // ObjectPath.cpp
  7. //
  8. // Description:
  9. // Implementation of class CObjpath, CProvException, CProvExceptionHr,
  10. // and CProvExceptionWin32.
  11. //
  12. // Author:
  13. // Henry Wang (HenryWa) 24-AUG-1999
  14. //
  15. //////////////////////////////////////////////////////////////////////////////
  16. #include "Pch.h"
  17. #include "ObjectPath.h"
  18. //****************************************************************************
  19. //
  20. // CObjPath
  21. //
  22. //****************************************************************************
  23. //////////////////////////////////////////////////////////////////////////////
  24. //++
  25. //
  26. // CObjPath::CObjPath( void )
  27. //
  28. // Description:
  29. // Constructor.
  30. //
  31. // Arguments:
  32. // None.
  33. //
  34. // Return Values:
  35. // None.
  36. //
  37. //--
  38. //////////////////////////////////////////////////////////////////////////////
  39. CObjPath::CObjPath( void )
  40. : m_parsedObj( NULL )
  41. {
  42. } //*** CObjPath::CObjPath()
  43. //////////////////////////////////////////////////////////////////////////////
  44. //++
  45. //
  46. // CObjPath::~CObjPath( void )
  47. //
  48. // Description:
  49. // Destructor.
  50. //
  51. // Arguments:
  52. // None.
  53. //
  54. // Return Values:
  55. // None.
  56. //
  57. //--
  58. //////////////////////////////////////////////////////////////////////////////
  59. CObjPath::~CObjPath( void )
  60. {
  61. delete m_parsedObj;
  62. } //*** CObjPath::~CObjPath()
  63. //////////////////////////////////////////////////////////////////////////////
  64. //++
  65. //
  66. // _bstr_t
  67. // CObjPath::GetStringValueForProperty(
  68. // LPCWSTR pwszIn
  69. // )
  70. //
  71. // Description:
  72. // Retrieve the string value for the given property.
  73. //
  74. // Arguments:
  75. // pwszIn -- Name of the property
  76. //
  77. // Return Values:
  78. // The property's value.
  79. //
  80. //--
  81. //////////////////////////////////////////////////////////////////////////////
  82. _bstr_t
  83. CObjPath::GetStringValueForProperty(
  84. LPCWSTR pwszIn
  85. )
  86. {
  87. int idx;
  88. KeyRef * pKey;
  89. for( idx = 0 ; idx < m_parsedObj->m_dwNumKeys ; idx++ )
  90. {
  91. pKey = m_parsedObj->m_paKeys[ idx ];
  92. if( _wcsicmp( pKey->m_pName, pwszIn ) == 0 )
  93. {
  94. if( pKey->m_vValue.vt == VT_BSTR )
  95. {
  96. return pKey->m_vValue.bstrVal;
  97. }
  98. }
  99. }
  100. return L"";
  101. } //*** CObjPath::GetStringValueForProperty()
  102. //////////////////////////////////////////////////////////////////////////////
  103. //++
  104. //
  105. // _bstr_t
  106. // CObjPath::GetClassName( void )
  107. //
  108. // Description:
  109. // Get the class name.
  110. //
  111. // Arguments:
  112. // None.
  113. //
  114. // Return Values:
  115. // Class name string.
  116. //
  117. //--
  118. //////////////////////////////////////////////////////////////////////////////
  119. _bstr_t
  120. CObjPath::GetClassName( void )
  121. {
  122. return m_parsedObj->m_pClass;
  123. } //*** CObjPath::GetClassName()
  124. //////////////////////////////////////////////////////////////////////////////
  125. //++
  126. //
  127. // BOOL
  128. // CObjPath::Init(
  129. // LPCWSTR pwszPathIn
  130. // )
  131. //
  132. // Description:
  133. // Initialize the object.
  134. //
  135. // Arguments:
  136. // pwszPathIn -- Object path string
  137. //
  138. // Return Values:
  139. // TRUE
  140. // FALSE
  141. //
  142. //--
  143. //////////////////////////////////////////////////////////////////////////////
  144. BOOL
  145. CObjPath::Init(
  146. LPCWSTR pwszPathIn
  147. )
  148. {
  149. if ( pwszPathIn == NULL )
  150. {
  151. m_parsedObj = new ParsedObjectPath;
  152. }
  153. else
  154. {
  155. CObjectPathParser objParser( e_ParserAcceptRelativeNamespace );
  156. objParser.Parse(
  157. const_cast< WCHAR * >( pwszPathIn ),
  158. &m_parsedObj
  159. );
  160. }
  161. if ( m_parsedObj == NULL )
  162. {
  163. return FALSE;
  164. } // if:
  165. return TRUE;
  166. } //*** CObjPath::Init()
  167. //////////////////////////////////////////////////////////////////////////////
  168. //++
  169. //
  170. // BOOL
  171. // CObjPath::SetClass(
  172. // LPCWSTR pwszValueIn
  173. // )
  174. //
  175. // Description:
  176. // Set the name of the class for the object path.
  177. //
  178. // Arguments:
  179. // pwszValueIn -- Class name string.
  180. //
  181. // Return Values:
  182. // TRUE
  183. // FALSE
  184. //
  185. //--
  186. //////////////////////////////////////////////////////////////////////////////
  187. BOOL
  188. CObjPath::SetClass(
  189. LPCWSTR pwszValueIn
  190. )
  191. {
  192. return m_parsedObj->SetClassName( pwszValueIn );
  193. } //*** CObjPath::SetClass()
  194. //////////////////////////////////////////////////////////////////////////////
  195. //++
  196. //
  197. // BOOL
  198. // CObjPath::AddProperty(
  199. // IN LPCWSTR pwszNameIn,
  200. // IN LPCWSTR pwszValueIn
  201. // )
  202. //
  203. // Description:
  204. // Add property to object path.
  205. //
  206. // Arguments:
  207. // pwszNameIn -- Name of the property.
  208. // pwszValueIn -- Value of the property in WCHAR* format.
  209. //
  210. // Return Values:
  211. // TRUE
  212. // FALSE
  213. //
  214. //--
  215. //////////////////////////////////////////////////////////////////////////////
  216. BOOL
  217. CObjPath::AddProperty(
  218. IN LPCWSTR pwszNameIn,
  219. IN LPCWSTR pwszValueIn
  220. )
  221. {
  222. VARIANT v;
  223. BOOL bRt = FALSE;
  224. VariantInit( & v );
  225. v.vt = VT_BSTR;
  226. v.bstrVal = _bstr_t( pwszValueIn ).copy( );
  227. bRt = m_parsedObj->AddKeyRef(
  228. pwszNameIn,
  229. & v
  230. );
  231. VariantClear( & v );
  232. return bRt;
  233. } //*** CObjPath::AddProperty()
  234. //////////////////////////////////////////////////////////////////////////////
  235. //++
  236. //
  237. // _bstr_t
  238. // CObjPath::GetObjectPathString( void )
  239. //
  240. // Description:
  241. // Retrieve object path string.
  242. //
  243. // Arguments:
  244. // None.
  245. //
  246. // Return Values:
  247. // Object path string in _bstr_t.
  248. //
  249. //--
  250. //////////////////////////////////////////////////////////////////////////////
  251. _bstr_t
  252. CObjPath::GetObjectPathString( void )
  253. {
  254. LPWSTR pwszPath = NULL;
  255. _bstr_t bstrResult;
  256. try
  257. {
  258. CObjectPathParser::Unparse( m_parsedObj, & pwszPath );
  259. bstrResult = pwszPath;
  260. }
  261. catch( ... ) //catch _com_error
  262. {
  263. delete [] pwszPath;
  264. throw;
  265. }
  266. delete [] pwszPath;
  267. return bstrResult;
  268. } //*** CObjPath::GetObjectPathString()
  269. //////////////////////////////////////////////////////////////////////////////
  270. //++
  271. //
  272. // BOOL
  273. // CObjPath::AddProperty(
  274. // LPCWSTR pwszNameIn,
  275. // VARIANT * pvValueIn
  276. // )
  277. //
  278. // Description:
  279. // Add a property to this instance.
  280. //
  281. // Arguments:
  282. // pwszNameIn -- Name of the property.
  283. // pvValueIn -- Value of the property in VARIANT format
  284. //
  285. // Return Values:
  286. // TRUE
  287. // FALSE
  288. //
  289. //--
  290. //////////////////////////////////////////////////////////////////////////////
  291. BOOL
  292. CObjPath::AddProperty(
  293. LPCWSTR pwszNameIn,
  294. VARIANT * pvValueIn
  295. )
  296. {
  297. return m_parsedObj->AddKeyRef( pwszNameIn, pvValueIn );
  298. } //*** CObjPath::AddProperty
  299. //****************************************************************************
  300. //
  301. // CProvException
  302. //
  303. //****************************************************************************
  304. //////////////////////////////////////////////////////////////////////////////
  305. //++
  306. //
  307. // LPCWSTR
  308. // CProvException::PwszErrorMessage( void ) const
  309. //
  310. // Description:
  311. // retrieve Error message
  312. //
  313. // Arguments:
  314. // None.
  315. //
  316. // Return Values:
  317. // Null-terminated Unicode error message from the exception.
  318. //
  319. //--
  320. //////////////////////////////////////////////////////////////////////////////
  321. LPCWSTR
  322. CProvException::PwszErrorMessage( void ) const
  323. {
  324. if ( m_bstrError.length( ) == 0 )
  325. {
  326. LPWSTR pError = NULL;
  327. DWORD rt = FormatMessage(
  328. FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  329. NULL,
  330. HRESULT_CODE( m_hr ),
  331. MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
  332. (LPWSTR) &pError,
  333. 0,
  334. NULL
  335. );
  336. m_bstrError = pError;
  337. LocalFree( pError );
  338. } // if: string is empty
  339. return m_bstrError;
  340. } //*** CProvException::PwszErrorMessage()
  341. //****************************************************************************
  342. //
  343. // CWbemClassObject
  344. //
  345. //****************************************************************************
  346. //////////////////////////////////////////////////////////////////////////////
  347. //++
  348. //
  349. // CWbemClassObject::CWbemClassObject( void )
  350. //
  351. // Description:
  352. // Constructor.
  353. //
  354. // Arguments:
  355. // None.
  356. //
  357. // Return Values:
  358. // None.
  359. //
  360. //--
  361. //////////////////////////////////////////////////////////////////////////////
  362. CWbemClassObject::CWbemClassObject( void )
  363. : m_pClassObject( NULL )
  364. {
  365. VariantInit( &m_v );
  366. } //*** CWbemClassObject::CWbemClassObject()
  367. //////////////////////////////////////////////////////////////////////////////
  368. //++
  369. //
  370. // CWbemClassObject::CWbemClassObject(
  371. // IWbemClassObject * pInstIn
  372. // )
  373. //
  374. // Description:
  375. // Constructor.
  376. //
  377. // Arguments:
  378. // pInstIn -- WMI class object interface.
  379. //
  380. // Return Values:
  381. // None.
  382. //
  383. //--
  384. //////////////////////////////////////////////////////////////////////////////
  385. CWbemClassObject::CWbemClassObject(
  386. IWbemClassObject * pInstIn
  387. )
  388. : m_pClassObject( NULL )
  389. {
  390. m_pClassObject = pInstIn;
  391. if ( m_pClassObject )
  392. {
  393. m_pClassObject->AddRef();
  394. }
  395. VariantInit( &m_v );
  396. } //*** CWbemClassObject::CWbemClassObject( pInstIn )
  397. //////////////////////////////////////////////////////////////////////////////
  398. //++
  399. //
  400. // CWbemClassObject::~CWbemClassObject( void )
  401. //
  402. // Description:
  403. // Destructor.
  404. //
  405. // Arguments:
  406. // None.
  407. //
  408. // Return Values:
  409. // None.
  410. //
  411. //--
  412. //////////////////////////////////////////////////////////////////////////////
  413. CWbemClassObject::~CWbemClassObject( void )
  414. {
  415. if ( m_pClassObject )
  416. {
  417. m_pClassObject->Release();
  418. }
  419. VariantClear( &m_v );
  420. } //*** CWbemClassObject::~CWbemClassObject()
  421. //////////////////////////////////////////////////////////////////////////////
  422. //++
  423. //
  424. // SCODE
  425. // CWbemClassObject::SetProperty(
  426. // DWORD dwValueIn,
  427. // LPCWSTR pwszPropNameIn
  428. // )
  429. //
  430. // Description:
  431. // Set dword value of a property.
  432. //
  433. // Arguments:
  434. // dwValueIn -- Property dword value
  435. // pwszPropNameIn -- Property Name
  436. //
  437. // Return Values:
  438. // WBEM_S_NO_ERROR
  439. //
  440. //--
  441. //////////////////////////////////////////////////////////////////////////////
  442. SCODE
  443. CWbemClassObject::SetProperty(
  444. DWORD dwValueIn,
  445. LPCWSTR pwszPropNameIn
  446. )
  447. {
  448. SCODE sc;
  449. VariantClear( &m_v );
  450. m_v.vt = VT_I4;
  451. m_v.lVal = dwValueIn;
  452. sc = m_pClassObject->Put(
  453. _bstr_t( pwszPropNameIn ),
  454. 0,
  455. &m_v,
  456. 0
  457. );
  458. if ( FAILED( sc ) )
  459. {
  460. throw CProvException( sc );
  461. }
  462. return sc;
  463. } //*** CWbemClassObject::SetProperty( dwValueIn )
  464. //////////////////////////////////////////////////////////////////////////////
  465. //++
  466. //
  467. // SCODE
  468. // CWbemClassObject::SetProperty(
  469. // LPCWSTR pwszValueIn,
  470. // LPCWSTR pwszPropNameIn
  471. // )
  472. //
  473. // Description:
  474. // Set wstring value of a property.
  475. //
  476. // Arguments:
  477. // pwszValueIn -- Property string value.
  478. // pwszPropNameIn -- Property Name.
  479. //
  480. // Return Values:
  481. // WBEM_S_NO_ERROR
  482. //
  483. //--
  484. //////////////////////////////////////////////////////////////////////////////
  485. SCODE
  486. CWbemClassObject::SetProperty(
  487. LPCWSTR pwszValueIn,
  488. LPCWSTR pwszPropNameIn
  489. )
  490. {
  491. SCODE sc;
  492. if ( pwszValueIn == NULL )
  493. {
  494. return WBEM_S_NO_ERROR;
  495. }
  496. VariantClear( &m_v );
  497. // _bstr_t bstrValue( pwszValueIn );
  498. m_v.vt = VT_BSTR;
  499. m_v.bstrVal = _bstr_t( pwszValueIn ).copy();
  500. sc = m_pClassObject->Put(
  501. _bstr_t( pwszPropNameIn ),
  502. 0,
  503. &m_v,
  504. 0
  505. );
  506. VariantClear( &m_v );
  507. if( FAILED( sc ) )
  508. {
  509. throw CProvException( sc );
  510. }
  511. return sc;
  512. } //*** CWbemClassObject::SetProperty( pwszValueIn )
  513. //////////////////////////////////////////////////////////////////////////////
  514. //++
  515. //
  516. // SCODE
  517. // CWbemClassObject::SetProperty(
  518. // DWORD dwSizeIn,
  519. // PBYTE pByteIn,
  520. // LPCWSTR pwszPropNameIn
  521. // )
  522. //
  523. // Description:
  524. // Set binary value of a property.
  525. //
  526. // Arguments:
  527. // dwSizeIn -- Size of block pointed by pByteIn.
  528. // pByteIn -- Pointer to byte.
  529. // pwszPropNameIn -- Property Name.
  530. //
  531. // Return Values:
  532. // WBEM_S_NO_ERROR
  533. //
  534. //--
  535. //////////////////////////////////////////////////////////////////////////////
  536. SCODE
  537. CWbemClassObject::SetProperty(
  538. DWORD dwSizeIn,
  539. PBYTE pByteIn,
  540. LPCWSTR pwszPropNameIn
  541. )
  542. {
  543. SCODE sc = WBEM_S_NO_ERROR;
  544. SAFEARRAY * psa;
  545. SAFEARRAYBOUND rgsabound[ 1 ];
  546. LONG idx;
  547. LONG ix;
  548. rgsabound[ 0 ].lLbound = 0;
  549. rgsabound[ 0 ].cElements = dwSizeIn;
  550. if( pByteIn == NULL )
  551. {
  552. return sc;
  553. }
  554. VariantClear( &m_v );
  555. psa = SafeArrayCreate( VT_UI1, 1, rgsabound );
  556. if(psa == NULL)
  557. {
  558. throw WBEM_E_OUT_OF_MEMORY;
  559. }
  560. for( idx = 0 ; idx < dwSizeIn ; idx++ )
  561. {
  562. ix = idx;
  563. sc = SafeArrayPutElement(
  564. psa,
  565. &ix,
  566. static_cast< void * >( pByteIn+idx )
  567. );
  568. if ( sc != S_OK )
  569. {
  570. throw CProvException( sc );
  571. }
  572. }
  573. m_v.vt = ( VT_ARRAY | VT_UI1 );
  574. //
  575. // no need to clear psa, managed by destructor
  576. //
  577. m_v.parray = psa;
  578. sc = m_pClassObject->Put(
  579. _bstr_t( pwszPropNameIn ),
  580. 0,
  581. &m_v,
  582. 0
  583. );
  584. if ( sc != S_OK )
  585. {
  586. throw CProvException( sc );
  587. }
  588. return sc;
  589. } //*** CWbemClassObject::SetProperty( pByteIn )
  590. //////////////////////////////////////////////////////////////////////////////
  591. //++
  592. //
  593. // SCODE
  594. // CWbemClassObject::SetProperty(
  595. // DWORD dwSizeIn,
  596. // BSTR * pbstrIn,
  597. // LPCWSTR pwszPropNameIn
  598. // )
  599. //
  600. // Description:
  601. // Set wstring array value of a property.
  602. //
  603. // Arguments:
  604. // dwSizeIn -- Size of block pointed by pByteIn.
  605. // pbstrIn -- Pointer to BSTR array.
  606. // pwszPropNameIn -- Property Name.
  607. //
  608. // Return Values:
  609. // WBEM_S_NO_ERROR
  610. //
  611. //--
  612. //////////////////////////////////////////////////////////////////////////////
  613. SCODE
  614. CWbemClassObject::SetProperty(
  615. DWORD dwSizeIn,
  616. BSTR * pbstrIn,
  617. LPCWSTR pwszPropNameIn
  618. )
  619. {
  620. SCODE sc = WBEM_S_NO_ERROR;
  621. SAFEARRAY * psa;
  622. SAFEARRAYBOUND rgsabound[ 1 ];
  623. LONG idx;
  624. LONG ix;
  625. rgsabound[0].lLbound = 0;
  626. rgsabound[0].cElements = dwSizeIn;
  627. if ( pbstrIn == NULL )
  628. {
  629. return sc;
  630. }
  631. VariantClear( &m_v );
  632. psa = SafeArrayCreate( VT_BSTR, 1, rgsabound );
  633. if ( psa == NULL )
  634. {
  635. throw WBEM_E_OUT_OF_MEMORY;
  636. }
  637. for( idx = 0 ; idx < dwSizeIn ; idx++)
  638. {
  639. ix = idx;
  640. sc = SafeArrayPutElement(
  641. psa,
  642. &ix,
  643. pbstrIn[ idx ]
  644. );
  645. if ( sc != S_OK)
  646. {
  647. throw CProvException( sc );
  648. }
  649. }
  650. m_v.vt = (VT_ARRAY | VT_BSTR );
  651. //
  652. // no need to clear psa, managed by destructor
  653. //
  654. m_v.parray = psa;
  655. sc = m_pClassObject->Put(
  656. _bstr_t( pwszPropNameIn ),
  657. 0,
  658. &m_v,
  659. 0
  660. );
  661. if ( sc != S_OK)
  662. {
  663. throw CProvException( sc );
  664. }
  665. return sc;
  666. } //*** CWbemClassObject::SetProperty( pbstrIn )
  667. //////////////////////////////////////////////////////////////////////////////
  668. //++
  669. //
  670. // SCODE
  671. // CWbemClassObject::SetProperty(
  672. //
  673. // Description:
  674. // Set MultiSz value of a property.
  675. //
  676. // Arguments:
  677. // dwSizeIn -- Size of block pointed by pwszMultiSzIn.
  678. // pwszMultiSzIn -- Pointer to MultiSz.
  679. // pwszPropNameIn -- Property Name.
  680. //
  681. // Return Values:
  682. // WBEM_S_NO_ERROR
  683. //
  684. //--
  685. //////////////////////////////////////////////////////////////////////////////
  686. SCODE
  687. CWbemClassObject::SetProperty(
  688. DWORD dwSizeIn,
  689. LPCWSTR pwszMultiSzIn,
  690. LPCWSTR pwszPropNameIn
  691. )
  692. {
  693. SCODE sc = WBEM_S_NO_ERROR;
  694. SAFEARRAY * psa;
  695. SAFEARRAYBOUND rgsabound[ 1 ];
  696. LPCWSTR pwsz = NULL;
  697. LONG idx;
  698. LONG ix;
  699. if( pwszMultiSzIn == NULL )
  700. {
  701. return sc;
  702. }
  703. VariantClear( &m_v );
  704. //
  705. // find out the number of string
  706. //
  707. DWORD cMultiSz = 1;
  708. for ( pwsz = pwszMultiSzIn; *pwsz || *pwsz ++ ; pwsz ++ )
  709. {
  710. if ( ! ( *pwsz ) )
  711. {
  712. cMultiSz ++ ;
  713. }
  714. }
  715. rgsabound[ 0 ].lLbound = 0;
  716. rgsabound[ 0 ].cElements = cMultiSz;
  717. psa = SafeArrayCreate( VT_BSTR, 1, rgsabound);
  718. if ( psa == NULL )
  719. {
  720. throw WBEM_E_OUT_OF_MEMORY;
  721. }
  722. pwsz = pwszMultiSzIn;
  723. for( idx = 0 ; idx < cMultiSz ; idx++ )
  724. {
  725. ix = idx;
  726. sc = SafeArrayPutElement(
  727. psa,
  728. &ix,
  729. (BSTR) _bstr_t( pwsz )
  730. );
  731. if ( sc != S_OK )
  732. {
  733. throw CProvException( sc );
  734. }
  735. pwsz = wcschr( pwsz, L'\0' );
  736. pwsz ++;
  737. }
  738. m_v.vt = (VT_ARRAY | VT_BSTR );
  739. //
  740. // no need to clear psa, managed by destructor
  741. //
  742. m_v.parray = psa;
  743. sc = m_pClassObject->Put(
  744. _bstr_t( pwszPropNameIn ),
  745. 0,
  746. &m_v,
  747. 0
  748. );
  749. if ( sc != S_OK )
  750. {
  751. throw CProvException( sc );
  752. }
  753. return sc;
  754. } //*** CWbemClassObject::SetProperty( pwszMultiSzIn )
  755. //////////////////////////////////////////////////////////////////////////////
  756. //++
  757. //
  758. // SCODE
  759. // CWbemClassObject::SetProperty(
  760. // LPCSTR pszValueIn,
  761. // LPCWSTR pwszPropNameIn
  762. // )
  763. //
  764. // Description:
  765. // Set ansi string value of a property.
  766. //
  767. // Arguments:
  768. // pszValueIn -- Property string value.
  769. // pwszPropNameIn -- Property Name.
  770. //
  771. // Return Values:
  772. // WBEM_S_NO_ERROR
  773. //
  774. //--
  775. //////////////////////////////////////////////////////////////////////////////
  776. SCODE
  777. CWbemClassObject::SetProperty(
  778. LPCSTR pszValueIn,
  779. LPCWSTR pwszPropNameIn
  780. )
  781. {
  782. if ( pszValueIn == NULL )
  783. {
  784. return S_OK;
  785. }
  786. return SetProperty(
  787. static_cast< WCHAR * >( _bstr_t( pszValueIn ) ),
  788. pwszPropNameIn
  789. );
  790. } //*** CWbemClassObject::SetProperty( pszValueIn )
  791. //////////////////////////////////////////////////////////////////////////////
  792. //++
  793. //
  794. // SCODE
  795. // CWbemClassObject::SetProperty(
  796. // IWbemClassObject * pWbemClassObject,
  797. // LPCWSTR pwszPropNameIn
  798. // )
  799. //
  800. // Description:
  801. // Set wbem class object of a property.
  802. //
  803. // Arguments:
  804. // pWbemClassObject -- Property wbem class object
  805. // pwszPropNameIn -- Property Name.
  806. //
  807. // Return Values:
  808. // WBEM_S_NO_ERROR
  809. //
  810. //--
  811. //////////////////////////////////////////////////////////////////////////////
  812. SCODE
  813. CWbemClassObject::SetProperty(
  814. IWbemClassObject * pWbemClassObjectIn,
  815. LPCWSTR pwszPropNameIn
  816. )
  817. {
  818. SCODE sc = S_OK;
  819. if ( pWbemClassObjectIn == NULL )
  820. {
  821. return sc;
  822. }
  823. VariantClear( & m_v );
  824. m_v.vt = VT_UNKNOWN ;
  825. m_v.punkVal = pWbemClassObjectIn;
  826. pWbemClassObjectIn->AddRef();
  827. sc = m_pClassObject->Put(
  828. _bstr_t( pwszPropNameIn ),
  829. 0,
  830. &m_v,
  831. 0
  832. );
  833. VariantClear( &m_v );
  834. if( FAILED( sc ) )
  835. {
  836. throw CProvException( sc );
  837. }
  838. return sc;
  839. } //*** CWbemClassObject::SetProperty( pszValueIn )
  840. //////////////////////////////////////////////////////////////////////////////
  841. //++
  842. //
  843. // SCODE
  844. // CWbemClassObject::SpawnInstance(
  845. // LONG lFlagIn,
  846. // IWbemClassObject ** ppNewOut
  847. // )
  848. //
  849. // Description:
  850. // Spawn a instance of IWbemClassObject.
  851. //
  852. // Arguments:
  853. // lFlagIn -- WMI flag, reserved, must be 0.
  854. // ppNewOut -- Created new instance.
  855. //
  856. // Return Values:
  857. // WBEM_S_NO_ERROR
  858. //
  859. //--
  860. //////////////////////////////////////////////////////////////////////////////
  861. SCODE
  862. CWbemClassObject::SpawnInstance(
  863. LONG lFlagIn,
  864. IWbemClassObject ** ppNewOut
  865. )
  866. {
  867. return m_pClassObject->SpawnInstance( lFlagIn, ppNewOut );
  868. } //*** CWbemClassObject::SpawnInstance()
  869. //////////////////////////////////////////////////////////////////////////////
  870. //++
  871. //
  872. // SCODE
  873. // CWbemClassObject::SpawnDerivedClass(
  874. // LONG lFlagIn,
  875. // IWbemClassObject ** ppNewOut
  876. // )
  877. //
  878. // Description:
  879. // Spawn a derived class.
  880. //
  881. // Arguments:
  882. // lFlagIn -- WMI flag, reserved, must be 0.
  883. // ppNewOut -- Created new instance.
  884. //
  885. // Return Values:
  886. // WBEM_S_NO_ERROR
  887. //
  888. //--
  889. //////////////////////////////////////////////////////////////////////////////
  890. SCODE
  891. CWbemClassObject::SpawnDerivedClass(
  892. LONG lFlagIn,
  893. IWbemClassObject ** ppNewOut
  894. )
  895. {
  896. return m_pClassObject->SpawnDerivedClass( lFlagIn, ppNewOut );
  897. } //*** CWbemClassObject::SpawnInstance()
  898. //////////////////////////////////////////////////////////////////////////////
  899. //++
  900. //
  901. // SCODE
  902. // CWbemClassObject::GetMethod(
  903. // BSTR bstrMethodNameIn,
  904. // LONG lFlagIn,
  905. // IWbemClassObject ** ppINOut,
  906. // IWbemClassObject ** ppOUTOut
  907. // )
  908. //
  909. // Description:
  910. // Retrieve the method for an WMI object.
  911. //
  912. // Arguments:
  913. // bstrMethodNameIn
  914. // Method Name.
  915. //
  916. // lFlagIn
  917. // WMI flag, Reserved. It must be zero.
  918. //
  919. // ppINOut
  920. // IWbemClassObject pointer which describes the in-parameters
  921. // to the method.
  922. //
  923. // ppOUTOut
  924. // an IWbemClassObject pointer which describes the
  925. // out-parameters to the method
  926. //
  927. // Return Values:
  928. // WBEM stand error
  929. //
  930. //--
  931. //////////////////////////////////////////////////////////////////////////////
  932. SCODE
  933. CWbemClassObject::GetMethod(
  934. BSTR bstrMethodNameIn,
  935. LONG lFlagIn,
  936. IWbemClassObject ** ppINOut,
  937. IWbemClassObject ** ppOUTOut
  938. )
  939. {
  940. return m_pClassObject->GetMethod(
  941. bstrMethodNameIn,
  942. lFlagIn,
  943. ppINOut,
  944. ppOUTOut
  945. );
  946. } //*** CWbemClassObject::GetMethod()
  947. //////////////////////////////////////////////////////////////////////////////
  948. //++
  949. //
  950. // SCODE
  951. // CWbemClassObject::GetProperty(
  952. // DWORD * pdwValueOut,
  953. // LPCWSTR pwszPropNameIn
  954. // )
  955. //
  956. // Description:
  957. // Retrieve the DWORD property for this WMI object.
  958. //
  959. // Arguments:
  960. // pdwValueOut -- DWORD variable to receive property value.
  961. // pwszPropNameIn -- Property Name.
  962. //
  963. // Return Values:
  964. // WBEM_S_NO_ERROR
  965. // WBEM_E_FAILED
  966. //
  967. //--
  968. //////////////////////////////////////////////////////////////////////////////
  969. SCODE
  970. CWbemClassObject::GetProperty(
  971. DWORD * pdwValueOut,
  972. LPCWSTR pwszPropNameIn
  973. )
  974. {
  975. SCODE sc;
  976. VariantClear( &m_v );
  977. sc = m_pClassObject->Get(
  978. _bstr_t( pwszPropNameIn ),
  979. 0,
  980. &m_v,
  981. NULL,
  982. NULL
  983. );
  984. if ( SUCCEEDED( sc ) )
  985. {
  986. if( m_v.vt == VT_I4 )
  987. {
  988. *pdwValueOut = m_v.lVal;
  989. return sc;
  990. }
  991. else if ( m_v.vt == VT_BOOL)
  992. {
  993. if ( m_v.boolVal == VARIANT_TRUE )
  994. {
  995. *pdwValueOut = 1;
  996. }
  997. else
  998. {
  999. *pdwValueOut = 0;
  1000. }
  1001. return sc;
  1002. }
  1003. else if ( m_v.vt == VT_UI1 )
  1004. {
  1005. *pdwValueOut = ( DWORD ) m_v.bVal;
  1006. }
  1007. else if ( m_v.vt == VT_NULL )
  1008. {
  1009. return WBEM_E_FAILED;
  1010. }
  1011. }
  1012. // raise exception if sc is not S_OK or vt is not expected
  1013. CProvException e( sc );
  1014. throw e;
  1015. return WBEM_E_FAILED;
  1016. } //*** CWbemClassObject::GetProperty( pdwValueOut )
  1017. //////////////////////////////////////////////////////////////////////////////
  1018. //++
  1019. //
  1020. // SCODE
  1021. // CWbemClassObject::GetProperty(
  1022. // _bstr_t & rBstrOut,
  1023. // LPCWSTR pwszPropNameIn
  1024. // )
  1025. //
  1026. // Description:
  1027. // Retrieve the BSTR property for this WMI object.
  1028. //
  1029. // Arguments:
  1030. // rBstrOut -- bstr_t variable to receive property value.
  1031. // pwszPropNameIn -- Property Name.
  1032. //
  1033. // Return Values:
  1034. // WBEM_S_NO_ERROR
  1035. // WBEM_E_FAILED
  1036. //
  1037. //--
  1038. //////////////////////////////////////////////////////////////////////////////
  1039. SCODE
  1040. CWbemClassObject::GetProperty(
  1041. _bstr_t & rBstrOut,
  1042. LPCWSTR pwszPropNameIn
  1043. )
  1044. {
  1045. SCODE sc;
  1046. VariantClear( &m_v );
  1047. sc = m_pClassObject->Get(
  1048. _bstr_t( pwszPropNameIn ),
  1049. 0,
  1050. &m_v,
  1051. NULL,
  1052. NULL
  1053. );
  1054. if ( SUCCEEDED( sc ) )
  1055. {
  1056. if( m_v.vt == VT_BSTR )
  1057. {
  1058. rBstrOut = m_v.bstrVal;
  1059. return sc;
  1060. }
  1061. else if( m_v.vt == VT_NULL )
  1062. {
  1063. return WBEM_E_FAILED;
  1064. }
  1065. }
  1066. CProvException e( sc );
  1067. throw e;
  1068. return WBEM_E_FAILED;
  1069. } //*** CWbemClassObject::GetProperty( rBstrOut )
  1070. //////////////////////////////////////////////////////////////////////////////
  1071. //++
  1072. //
  1073. // SCODE
  1074. // CWbemClassObject::GetProperty(
  1075. // BOOL * pfValueOut,
  1076. // LPCWSTR pwszPropNameIn
  1077. // )
  1078. //
  1079. // Description:
  1080. // Retrieve the BOOL property for this WMI object.
  1081. //
  1082. // Arguments:
  1083. // pfValueOut -- BOOL variable to receive property value.
  1084. // pwszPropNameIn -- Property Name.
  1085. //
  1086. // Return Values:
  1087. // WBEM_S_NO_ERROR
  1088. // WBEM_E_FAILED
  1089. //
  1090. //--
  1091. //////////////////////////////////////////////////////////////////////////////
  1092. SCODE
  1093. CWbemClassObject::GetProperty(
  1094. BOOL * pfValueOut,
  1095. LPCWSTR pwszPropNameIn
  1096. )
  1097. {
  1098. SCODE sc;
  1099. VariantClear( &m_v );
  1100. sc = m_pClassObject->Get(
  1101. _bstr_t( pwszPropNameIn ),
  1102. 0,
  1103. &m_v,
  1104. NULL,
  1105. NULL
  1106. );
  1107. if ( m_v.vt == VT_BOOL )
  1108. {
  1109. *pfValueOut = m_v.boolVal;
  1110. return sc;
  1111. }
  1112. return WBEM_E_FAILED;
  1113. } //*** CWbemClassObject::GetProperty
  1114. //////////////////////////////////////////////////////////////////////////////
  1115. //++
  1116. //
  1117. // SCODE
  1118. // CWbemClassObject::GetProperty(
  1119. // DWORD * pdwSizeOut,
  1120. // PBYTE * ppByteOut,
  1121. // LPCWSTR pwszPropNameIn
  1122. // )
  1123. //
  1124. // Description:
  1125. // Retrieve the binary property for this WMI object.
  1126. //
  1127. // Arguments:
  1128. // pdwSizeOut -- Size of the output buffer.
  1129. // ppByteOut -- Output buffer.
  1130. // pwszPropNameIn -- Property Name.
  1131. //
  1132. // Return Values:
  1133. // WBEM_S_NO_ERROR
  1134. //
  1135. //--
  1136. //////////////////////////////////////////////////////////////////////////////
  1137. SCODE
  1138. CWbemClassObject::GetProperty(
  1139. DWORD * pdwSizeOut,
  1140. PBYTE * ppByteOut,
  1141. LPCWSTR pwszPropNameIn
  1142. )
  1143. {
  1144. SCODE sc;
  1145. VariantClear(&m_v);
  1146. *pdwSizeOut = 0;
  1147. sc = m_pClassObject->Get(
  1148. _bstr_t( pwszPropNameIn ),
  1149. 0,
  1150. & m_v,
  1151. NULL,
  1152. NULL
  1153. );
  1154. if ( SUCCEEDED ( sc ) )
  1155. {
  1156. if ( m_v.vt == ( VT_ARRAY | VT_UI1 ) )
  1157. {
  1158. PBYTE pByte;
  1159. * pdwSizeOut = m_v.parray->rgsabound[ 0 ].cElements;
  1160. * ppByteOut = new BYTE[ *pdwSizeOut ];
  1161. sc = SafeArrayAccessData( m_v.parray, ( void ** ) &pByte );
  1162. if ( SUCCEEDED ( sc ) )
  1163. {
  1164. UINT idx;
  1165. for ( idx = 0; idx < *pdwSizeOut; idx ++ )
  1166. {
  1167. *( (* ppByteOut ) + idx ) = *( pByte + idx );
  1168. }
  1169. SafeArrayUnaccessData( m_v.parray );
  1170. }
  1171. }
  1172. else
  1173. {
  1174. throw CProvException( static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER) );
  1175. }
  1176. }
  1177. else
  1178. {
  1179. throw CProvException( sc );
  1180. }
  1181. return WBEM_S_NO_ERROR;
  1182. } //*** CWbemClassObject::GetProperty( ppByteOut )
  1183. //////////////////////////////////////////////////////////////////////////////
  1184. //++
  1185. //
  1186. // SCODE
  1187. // CWbemClassObject::GetProperty(
  1188. // DWORD * pdwSizeOut,
  1189. // _bstr_t ** ppbstrOut,
  1190. // LPCWSTR pwszPropNameIn
  1191. // )
  1192. //
  1193. // Description:
  1194. // Retrieve the BSTR array property for this WMI object.
  1195. //
  1196. // Arguments:
  1197. // pdwSizeOut -- Size of the output buffer.
  1198. // ppbstrOut -- BSTR variable to receive property value.
  1199. // pwszPropNameIn -- Property Name.
  1200. //
  1201. // Return Values:
  1202. // WBEM_S_NO_ERROR
  1203. //
  1204. //--
  1205. //////////////////////////////////////////////////////////////////////////////
  1206. SCODE
  1207. CWbemClassObject::GetProperty(
  1208. DWORD * pdwSizeOut,
  1209. _bstr_t ** ppbstrOut,
  1210. LPCWSTR pwszPropNameIn
  1211. )
  1212. {
  1213. SCODE sc;
  1214. VariantClear( &m_v );
  1215. *pdwSizeOut = 0;
  1216. sc = m_pClassObject->Get(
  1217. _bstr_t( pwszPropNameIn ),
  1218. 0,
  1219. & m_v,
  1220. NULL,
  1221. NULL
  1222. );
  1223. if ( SUCCEEDED ( sc ) )
  1224. {
  1225. if ( m_v.vt == ( VT_ARRAY | VT_BSTR ) )
  1226. {
  1227. BSTR * pBstr;
  1228. *pdwSizeOut = m_v.parray->rgsabound[0].cElements;
  1229. *ppbstrOut = new _bstr_t[ *pdwSizeOut ];
  1230. sc = SafeArrayAccessData( m_v.parray, (void **) & pBstr );
  1231. if ( SUCCEEDED ( sc ) )
  1232. {
  1233. UINT idx;
  1234. for( idx = 0; idx < *pdwSizeOut; idx ++)
  1235. {
  1236. *( (*ppbstrOut) + idx ) = *( pBstr + idx );
  1237. }
  1238. SafeArrayUnaccessData( m_v.parray );
  1239. }
  1240. }
  1241. else
  1242. {
  1243. throw CProvException( static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER) );
  1244. }
  1245. }
  1246. else
  1247. {
  1248. throw CProvException( sc );
  1249. }
  1250. return WBEM_S_NO_ERROR;
  1251. } //*** CWbemClassObject::GetProperty( ppbstrOut )
  1252. //////////////////////////////////////////////////////////////////////////////
  1253. //++
  1254. //
  1255. // SCODE
  1256. // CWbemClassObject::GetProperty(
  1257. // DWORD * pdwSizeOut,
  1258. // LPWSTR * ppwszMultiSzOut,
  1259. // LPCWSTR pwszPropNameIn
  1260. // )
  1261. //
  1262. // Description:
  1263. // Retrieve the MultiSz property for this WMI object.
  1264. //
  1265. // Arguments:
  1266. // pdwSizeOut -- Size of the output buffer.
  1267. // ppwszMultiSzOut -- MultiSz output buffer.
  1268. // pwszPropNameIn -- Property Name.
  1269. //
  1270. // Return Values:
  1271. // WBEM_S_NO_ERROR
  1272. //
  1273. //--
  1274. //////////////////////////////////////////////////////////////////////////////
  1275. SCODE
  1276. CWbemClassObject::GetPropertyMultiSz(
  1277. DWORD * pdwSizeOut,
  1278. LPWSTR * ppwszMultiSzOut,
  1279. LPCWSTR pwszPropNameIn
  1280. )
  1281. {
  1282. SCODE sc;
  1283. DWORD cElements;
  1284. DWORD cMultiSz = 0;
  1285. VariantClear(&m_v);
  1286. *pdwSizeOut = 0;
  1287. // *ppOut = NULL;
  1288. sc = m_pClassObject->Get(
  1289. _bstr_t( pwszPropNameIn ),
  1290. 0,
  1291. & m_v,
  1292. NULL,
  1293. NULL
  1294. );
  1295. if ( SUCCEEDED ( sc ) )
  1296. {
  1297. if ( m_v.vt == ( VT_ARRAY | VT_BSTR ) )
  1298. {
  1299. LPWSTR * ppwsz = NULL;
  1300. cElements = m_v.parray->rgsabound[ 0 ].cElements;
  1301. sc = SafeArrayAccessData( m_v.parray, ( void ** ) & ppwsz );
  1302. if ( SUCCEEDED ( sc ) )
  1303. {
  1304. UINT idx;
  1305. for( idx = 0; idx < cElements; idx ++)
  1306. {
  1307. cMultiSz = cMultiSz + wcslen( *(ppwsz + idx) ) + sizeof (WCHAR);
  1308. }
  1309. cMultiSz += sizeof( WCHAR ) * 2;
  1310. *ppwszMultiSzOut = new WCHAR[ cMultiSz ];
  1311. if ( *ppwszMultiSzOut == NULL )
  1312. {
  1313. throw CProvException( static_cast< HRESULT > ( WBEM_E_OUT_OF_MEMORY) );
  1314. }
  1315. LPWSTR pwszDst = *ppwszMultiSzOut;
  1316. LPWSTR pwszSrc;
  1317. for ( idx = 0; idx < cElements ; idx ++)
  1318. {
  1319. for( pwszSrc = *( ppwsz + idx); *pwszSrc ; pwszDst++, pwszSrc ++ )
  1320. {
  1321. *pwszDst = *pwszSrc;
  1322. }
  1323. *(pwszDst++) = L'\0';
  1324. }
  1325. *pwszDst = L'\0';
  1326. *pdwSizeOut = cMultiSz;
  1327. SafeArrayUnaccessData( m_v.parray );
  1328. }
  1329. }
  1330. else
  1331. {
  1332. throw CProvException( static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER) );
  1333. }
  1334. }
  1335. else
  1336. {
  1337. throw CProvException( sc );
  1338. }
  1339. return WBEM_S_NO_ERROR;
  1340. } //*** CWbemClassObject::GetProperty( ppwszMultiSzOut )
  1341. //////////////////////////////////////////////////////////////////////////////
  1342. //++
  1343. //
  1344. // SCODE
  1345. // CWbemClassObject::GetProperty(
  1346. // VARIANT * pVariantOut,
  1347. // LPCWSTR pwszPropNameIn
  1348. // )
  1349. //
  1350. // Description:
  1351. // Retrieve the variant property for this WMI object.
  1352. //
  1353. // Arguments:
  1354. // pVariantOut -- Variant variable to receive property value
  1355. // pwszPropNameIn -- Property Name.
  1356. //
  1357. // Return Values:
  1358. // WBEM_S_NO_ERROR
  1359. //
  1360. //--
  1361. //////////////////////////////////////////////////////////////////////////////
  1362. SCODE
  1363. CWbemClassObject::GetProperty(
  1364. VARIANT * pVariantOut,
  1365. LPCWSTR pwszPropNameIn
  1366. )
  1367. {
  1368. SCODE sc;
  1369. sc = m_pClassObject->Get(
  1370. _bstr_t( pwszPropNameIn ),
  1371. 0,
  1372. pVariantOut,
  1373. NULL,
  1374. NULL
  1375. );
  1376. if ( FAILED( sc ) )
  1377. {
  1378. CProvException e( sc );
  1379. throw e;
  1380. }
  1381. return WBEM_S_NO_ERROR;
  1382. } //*** CWbemClassObject::GetProperty( pVariantOut )
  1383. //////////////////////////////////////////////////////////////////////////////
  1384. //++
  1385. //
  1386. // SCODE
  1387. // CWbemClassObject::GetProperty(
  1388. // CWbemClassObject & rWcoInout,
  1389. // LPCWSTR pwszPropNameIn
  1390. // )
  1391. //
  1392. // Description:
  1393. // Retrieve the embeded object property for this WMI object.
  1394. //
  1395. // Arguments:
  1396. // rWcoInout -- class object variable to receive property value
  1397. // pwszPropNameIn -- Property Name.
  1398. //
  1399. // Return Values:
  1400. // WBEM_S_NO_ERROR
  1401. //
  1402. //--
  1403. //////////////////////////////////////////////////////////////////////////////
  1404. SCODE
  1405. CWbemClassObject::GetProperty(
  1406. CWbemClassObject & rWcoInout,
  1407. LPCWSTR pwszPropNameIn
  1408. )
  1409. {
  1410. CError er;
  1411. VariantClear( &m_v );
  1412. er = m_pClassObject->Get(
  1413. _bstr_t( pwszPropNameIn ),
  1414. 0,
  1415. &m_v,
  1416. NULL,
  1417. NULL
  1418. );
  1419. if ( m_v.vt != VT_UNKNOWN )
  1420. {
  1421. er = static_cast< HRESULT > ( WBEM_E_INVALID_PARAMETER );
  1422. }
  1423. IWbemClassObject * pwco = NULL;
  1424. er = m_v.punkVal->QueryInterface( & pwco );
  1425. rWcoInout = pwco;
  1426. VariantClear( & m_v );
  1427. return WBEM_S_NO_ERROR;
  1428. } //*** CWbemClassObject::GetProperty( rWcoInout )