Leaked source code of windows server 2003
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.

1580 lines
37 KiB

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