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.

502 lines
10 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000-2001 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // StandardInfo.cpp
  7. //
  8. // Description:
  9. // CStandardInfo implementation.
  10. //
  11. // Maintained By:
  12. // Galen Barbee (GalenB) 02-FEB-2000
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "pch.h"
  16. #include "StandardInfo.h"
  17. DEFINE_THISCLASS("CStandardInfo")
  18. // ************************************************************************
  19. //
  20. // Constructor / Destructor
  21. //
  22. // ************************************************************************
  23. //////////////////////////////////////////////////////////////////////////////
  24. //++
  25. //
  26. // HRESULT
  27. // CStandardInfo::S_HrCreateInstance(
  28. // IUnknown ** ppunkOut
  29. // )
  30. //
  31. //--
  32. //////////////////////////////////////////////////////////////////////////////
  33. HRESULT
  34. CStandardInfo::S_HrCreateInstance(
  35. IUnknown ** ppunkOut
  36. )
  37. {
  38. TraceFunc( "" );
  39. Assert( ppunkOut != NULL );
  40. HRESULT hr;
  41. CStandardInfo * psi = new CStandardInfo;
  42. if ( psi != NULL )
  43. {
  44. hr = THR( psi->Init( ) );
  45. if ( SUCCEEDED( hr ) )
  46. {
  47. hr = THR( psi->TypeSafeQI( IUnknown, ppunkOut ) );
  48. }
  49. psi->Release( );
  50. }
  51. else
  52. {
  53. hr = E_OUTOFMEMORY;
  54. }
  55. HRETURN( hr );
  56. } //*** CStandardInfo::S_HrCreateInstance( )
  57. //////////////////////////////////////////////////////////////////////////////
  58. //++
  59. //
  60. // CStandardInfo::CStandardInfo( void )
  61. //
  62. //--
  63. //////////////////////////////////////////////////////////////////////////////
  64. CStandardInfo::CStandardInfo( void )
  65. {
  66. TraceFunc( "" );
  67. InterlockedIncrement( &g_cObjects );
  68. TraceFuncExit();
  69. } //*** CStandardInfo::CStandardInfo( )
  70. //////////////////////////////////////////////////////////////////////////////
  71. //++
  72. //
  73. // CStandardInfo::CStandardInfo(
  74. // CLSID * pclsidTypeIn,
  75. // OBJECTCOOKIE cookieParentIn,
  76. // BSTR bstrNameIn
  77. // )
  78. //
  79. //--
  80. //////////////////////////////////////////////////////////////////////////////
  81. CStandardInfo::CStandardInfo(
  82. CLSID * pclsidTypeIn,
  83. OBJECTCOOKIE cookieParentIn,
  84. BSTR bstrNameIn
  85. )
  86. {
  87. TraceFunc( "" );
  88. InterlockedIncrement( &g_cObjects );
  89. THR( Init( ) );
  90. m_clsidType = *pclsidTypeIn;
  91. m_cookieParent = cookieParentIn;
  92. m_bstrName = bstrNameIn;
  93. TraceFuncExit( );
  94. } //*** CStandardInfo::CStandardInfo( ... )
  95. //////////////////////////////////////////////////////////////////////////////
  96. //++
  97. //
  98. // STDMETHODIMP
  99. // CStandardInfo::Init( void )
  100. //
  101. //--
  102. //////////////////////////////////////////////////////////////////////////////
  103. STDMETHODIMP
  104. CStandardInfo::Init( void )
  105. {
  106. TraceFunc( "" );
  107. HRESULT hr = S_OK;
  108. // IUnknown stuff
  109. Assert( m_cRef == 0 );
  110. AddRef( ); // Add one count
  111. // IStandardInfo
  112. Assert( m_clsidType == IID_NULL );
  113. Assert( m_cookieParent == 0 );
  114. Assert( m_bstrName == NULL );
  115. Assert( m_hrStatus == 0 );
  116. Assert( m_pci == NULL );
  117. Assert( m_pExtObjList == NULL );
  118. HRETURN( hr );
  119. } //*** CStandardInfo::Init( )
  120. //////////////////////////////////////////////////////////////////////////////
  121. //++
  122. //
  123. // CStandardInfo::~CStandardInfo( void )
  124. //
  125. //--
  126. //////////////////////////////////////////////////////////////////////////////
  127. CStandardInfo::~CStandardInfo( void )
  128. {
  129. TraceFunc( "" );
  130. if ( m_bstrName != NULL )
  131. {
  132. TraceSysFreeString( m_bstrName );
  133. }
  134. if ( m_pci != NULL )
  135. {
  136. m_pci->Release( );
  137. }
  138. while ( m_pExtObjList != NULL )
  139. {
  140. ExtObjectEntry * pnext = m_pExtObjList->pNext;
  141. m_pExtObjList->punk->Release( );
  142. TraceFree( m_pExtObjList );
  143. m_pExtObjList = pnext;
  144. }
  145. InterlockedDecrement( &g_cObjects );
  146. TraceFuncExit();
  147. } //*** CStandardInfo::~CStandardInfo( )
  148. // ************************************************************************
  149. //
  150. // IUnknown
  151. //
  152. // ************************************************************************
  153. //////////////////////////////////////////////////////////////////////////////
  154. //++
  155. //
  156. // STDMETHODIMP
  157. // CStandardInfo::QueryInterface(
  158. // REFIID riidIn,
  159. // LPVOID * ppvOut
  160. // )
  161. //
  162. //--
  163. //////////////////////////////////////////////////////////////////////////////
  164. STDMETHODIMP
  165. CStandardInfo::QueryInterface(
  166. REFIID riidIn,
  167. LPVOID * ppvOut
  168. )
  169. {
  170. TraceQIFunc( riidIn, ppvOut );
  171. HRESULT hr = E_NOINTERFACE;
  172. if ( IsEqualIID( riidIn, IID_IUnknown ) )
  173. {
  174. *ppvOut = static_cast< IStandardInfo * >( this );
  175. hr = S_OK;
  176. } // if: IUnknown
  177. else if ( IsEqualIID( riidIn, IID_IStandardInfo ) )
  178. {
  179. *ppvOut = TraceInterface( __THISCLASS__, IStandardInfo, this, 0 );
  180. hr = S_OK;
  181. } // else if: IStandardInfo
  182. if ( SUCCEEDED( hr ) )
  183. {
  184. ((IUnknown*) *ppvOut)->AddRef( );
  185. } // if: success
  186. QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
  187. } //*** CStandardInfo::QueryInterface( )
  188. //////////////////////////////////////////////////////////////////////////////
  189. //++
  190. //
  191. // STDMETHODIMP_( ULONG )
  192. // CStandardInfo::AddRef( void )
  193. //
  194. //--
  195. //////////////////////////////////////////////////////////////////////////////
  196. STDMETHODIMP_( ULONG )
  197. CStandardInfo::AddRef( void )
  198. {
  199. TraceFunc( "[IUnknown]" );
  200. InterlockedIncrement( &m_cRef );
  201. RETURN( m_cRef );
  202. } //*** CStandardInfo::AddRef( )
  203. //////////////////////////////////////////////////////////////////////////////
  204. //++
  205. //
  206. // STDMETHODIMP_( ULONG )
  207. // CStandardInfo::Release( void )
  208. //
  209. //--
  210. //////////////////////////////////////////////////////////////////////////////
  211. STDMETHODIMP_( ULONG )
  212. CStandardInfo::Release( void )
  213. {
  214. TraceFunc( "[IUnknown]" );
  215. InterlockedDecrement( &m_cRef );
  216. if ( m_cRef )
  217. RETURN( m_cRef );
  218. TraceDo( delete this );
  219. RETURN(0);
  220. } //*** CStandardInfo::Release( )
  221. //****************************************************************************
  222. //
  223. // IStandardInfo
  224. //
  225. //****************************************************************************
  226. //////////////////////////////////////////////////////////////////////////////
  227. //++
  228. //
  229. // STDMETHODIMP
  230. // CStandardInfo::GetType(
  231. // CLSID * pclsidTypeOut
  232. // )
  233. //
  234. //--
  235. //////////////////////////////////////////////////////////////////////////////
  236. STDMETHODIMP
  237. CStandardInfo::GetType(
  238. CLSID * pclsidTypeOut
  239. )
  240. {
  241. TraceFunc( "[IStandardInfo]" );
  242. HRESULT hr = S_OK;
  243. if ( pclsidTypeOut == NULL )
  244. goto InvalidPointer;
  245. CopyMemory( pclsidTypeOut, &m_clsidType, sizeof( *pclsidTypeOut ) );
  246. Cleanup:
  247. HRETURN( hr );
  248. InvalidPointer:
  249. hr = THR( E_POINTER );
  250. goto Cleanup;
  251. } //*** CStandardInfo::GetType( )
  252. //////////////////////////////////////////////////////////////////////////////
  253. //++
  254. //
  255. // STDMETHODIMP
  256. // CStandardInfo::GetName(
  257. // BSTR * pbstrNameOut
  258. // )
  259. //
  260. //--
  261. //////////////////////////////////////////////////////////////////////////////
  262. STDMETHODIMP
  263. CStandardInfo::GetName(
  264. BSTR * pbstrNameOut
  265. )
  266. {
  267. TraceFunc( "[IStandardInfo]" );
  268. HRESULT hr = S_OK;
  269. if ( pbstrNameOut == NULL )
  270. goto InvalidPointer;
  271. *pbstrNameOut = SysAllocString( m_bstrName );
  272. if ( *pbstrNameOut == NULL )
  273. goto OutOfMemory;
  274. Cleanup:
  275. HRETURN( hr );
  276. InvalidPointer:
  277. hr = THR( E_POINTER );
  278. goto Cleanup;
  279. OutOfMemory:
  280. hr = E_OUTOFMEMORY;
  281. goto Cleanup;
  282. } // GetName( )
  283. //////////////////////////////////////////////////////////////////////////////
  284. //++
  285. //
  286. // STDMETHODIMP
  287. // CStandardInfo::SetName(
  288. // LPCWSTR pcszNameIn
  289. // )
  290. //
  291. //--
  292. //////////////////////////////////////////////////////////////////////////////
  293. STDMETHODIMP
  294. CStandardInfo::SetName(
  295. LPCWSTR pcszNameIn
  296. )
  297. {
  298. TraceFunc1( "[IStandardInfo] pcszNameIn = '%ws'", pcszNameIn == NULL ? L"<null>" : pcszNameIn );
  299. HRESULT hr = S_OK;
  300. BSTR bstrNew;
  301. if ( pcszNameIn == NULL )
  302. goto InvalidArg;
  303. bstrNew = TraceSysAllocString( pcszNameIn );
  304. if ( bstrNew == NULL )
  305. goto OutOfMemory;
  306. if ( m_bstrName != NULL )
  307. {
  308. TraceSysFreeString( m_bstrName );
  309. }
  310. m_bstrName = bstrNew;
  311. Cleanup:
  312. HRETURN( hr );
  313. InvalidArg:
  314. hr = THR( E_INVALIDARG );
  315. goto Cleanup;
  316. OutOfMemory:
  317. hr = E_OUTOFMEMORY;
  318. goto Cleanup;
  319. } //*** CStandardInfo::SetName( )
  320. //////////////////////////////////////////////////////////////////////////////
  321. //++
  322. //
  323. // STDMETHODIMP
  324. // CStandardInfo::GetParent(
  325. // OBJECTCOOKIE * pcookieOut
  326. // )
  327. //
  328. //--
  329. //////////////////////////////////////////////////////////////////////////////
  330. STDMETHODIMP
  331. CStandardInfo::GetParent(
  332. OBJECTCOOKIE * pcookieOut
  333. )
  334. {
  335. TraceFunc( "[IStandardInfo]" );
  336. HRESULT hr = S_OK;
  337. if ( pcookieOut == NULL )
  338. goto InvalidPointer;
  339. *pcookieOut = m_cookieParent;
  340. if ( m_cookieParent == NULL )
  341. {
  342. hr = S_FALSE;
  343. }
  344. Cleanup:
  345. HRETURN( hr );
  346. InvalidPointer:
  347. hr = THR( E_POINTER );
  348. goto Cleanup;
  349. } //*** CStandardInfo::GetParent( )
  350. //////////////////////////////////////////////////////////////////////////////
  351. //++
  352. //
  353. // STDMETHODIMP
  354. // CStandardInfo::GetStatus(
  355. // HRESULT * phrOut
  356. // )
  357. //
  358. //--
  359. //////////////////////////////////////////////////////////////////////////////
  360. STDMETHODIMP
  361. CStandardInfo::GetStatus(
  362. HRESULT * phrStatusOut
  363. )
  364. {
  365. TraceFunc( "[IStandardInfo]" );
  366. HRESULT hr = S_OK;
  367. if ( phrStatusOut == NULL )
  368. goto InvalidPointer;
  369. *phrStatusOut = m_hrStatus;
  370. Cleanup:
  371. HRETURN( hr );
  372. InvalidPointer:
  373. hr = THR( E_POINTER );
  374. goto Cleanup;
  375. } //*** CStandardInfo::GetStatus( )
  376. //////////////////////////////////////////////////////////////////////////////
  377. //++
  378. //
  379. // STDMETHODIMP
  380. // CStandardInfo::SetStatus(
  381. // HRESULT hrIn
  382. // )
  383. //
  384. //--
  385. //////////////////////////////////////////////////////////////////////////////
  386. STDMETHODIMP
  387. CStandardInfo::SetStatus(
  388. HRESULT hrIn
  389. )
  390. {
  391. TraceFunc1( "[IStandardInfo] hrIn = %#08x", hrIn );
  392. HRESULT hr = S_OK;
  393. m_hrStatus = hrIn;
  394. HRETURN( hr );
  395. } //*** CStandardInfo::SetStatus( )