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.

389 lines
7.7 KiB

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (c) 2000 Microsoft Corporation
  4. //
  5. // Module Name:
  6. // EnumCookies.cpp
  7. //
  8. // Description:
  9. // CEnumCookies implementation.
  10. //
  11. // Maintained By:
  12. // Geoffrey Pease (GPease) 08-MAY-2000
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. #include "pch.h"
  16. #include "EnumCookies.h"
  17. #include "ObjectManager.h"
  18. DEFINE_THISCLASS("CEnumCookies")
  19. // ************************************************************************
  20. //
  21. // Constructor / Destructor
  22. //
  23. // ************************************************************************
  24. //////////////////////////////////////////////////////////////////////////////
  25. //
  26. // HRESULT
  27. // CEnumCookies::S_HrCreateInstance(
  28. // IUnknown ** ppunkOut
  29. // )
  30. //
  31. //////////////////////////////////////////////////////////////////////////////
  32. HRESULT
  33. CEnumCookies::S_HrCreateInstance(
  34. IUnknown ** ppunkOut
  35. )
  36. {
  37. TraceFunc( "" );
  38. Assert( ppunkOut != NULL );
  39. HRESULT hr;
  40. CEnumCookies * pemn = new CEnumCookies;
  41. if ( pemn != NULL )
  42. {
  43. hr = THR( pemn->Init( ) );
  44. if ( SUCCEEDED( hr ) )
  45. {
  46. hr = THR( pemn->TypeSafeQI( IUnknown, ppunkOut ) );
  47. }
  48. pemn->Release( );
  49. }
  50. else
  51. {
  52. hr = E_OUTOFMEMORY;
  53. }
  54. HRETURN( hr );
  55. } // S_HrCreateInstance( )
  56. //////////////////////////////////////////////////////////////////////////////
  57. //
  58. // CEnumCookies::CEnumCookies( void )
  59. //
  60. //////////////////////////////////////////////////////////////////////////////
  61. CEnumCookies::CEnumCookies( void )
  62. {
  63. TraceFunc( "" );
  64. InterlockedIncrement( &g_cObjects );
  65. TraceFuncExit();
  66. } // CEnumCookies( )
  67. //////////////////////////////////////////////////////////////////////////////
  68. //
  69. // STDMETHODIMP
  70. // CEnumCookies::Init( void )
  71. //
  72. //////////////////////////////////////////////////////////////////////////////
  73. STDMETHODIMP
  74. CEnumCookies::Init( void )
  75. {
  76. TraceFunc( "" );
  77. HRESULT hr = S_OK;
  78. // IUnknown stuff
  79. Assert( m_cRef == 0 );
  80. AddRef( ); // Add one count
  81. // IEnumCookies
  82. Assert( m_cIter == 0 );
  83. Assert( m_pList == NULL );
  84. Assert( m_cCookies == 0 );
  85. HRETURN( hr );
  86. } // Init( )
  87. //////////////////////////////////////////////////////////////////////////////
  88. //
  89. // CEnumCookies::~CEnumCookies( )
  90. //
  91. //////////////////////////////////////////////////////////////////////////////
  92. CEnumCookies::~CEnumCookies( )
  93. {
  94. TraceFunc( "" );
  95. if ( m_pList != NULL )
  96. {
  97. TraceFree( m_pList );
  98. } // if: m_pList
  99. InterlockedDecrement( &g_cObjects );
  100. TraceFuncExit();
  101. } // ~CEnumCookies( )
  102. // ************************************************************************
  103. //
  104. // IUnknown
  105. //
  106. // ************************************************************************
  107. //////////////////////////////////////////////////////////////////////////////
  108. //
  109. // STDMETHODIMP
  110. // CEnumCookies::QueryInterface(
  111. // REFIID riid,
  112. // LPVOID *ppv
  113. // )
  114. //
  115. //////////////////////////////////////////////////////////////////////////////
  116. STDMETHODIMP
  117. CEnumCookies::QueryInterface(
  118. REFIID riid,
  119. LPVOID *ppv
  120. )
  121. {
  122. TraceQIFunc( riid, ppv );
  123. HRESULT hr = E_NOINTERFACE;
  124. if ( IsEqualIID( riid, IID_IUnknown ) )
  125. {
  126. *ppv = static_cast< IEnumCookies * >( this );
  127. hr = S_OK;
  128. } // if: IUnknown
  129. else if ( IsEqualIID( riid, IID_IEnumCookies ) )
  130. {
  131. *ppv = TraceInterface( __THISCLASS__, IEnumCookies, this, 0 );
  132. hr = S_OK;
  133. } // else if: IEnumCookies
  134. if ( SUCCEEDED( hr ) )
  135. {
  136. ((IUnknown*) *ppv)->AddRef( );
  137. } // if: success
  138. QIRETURN_IGNORESTDMARSHALLING( hr, riid );
  139. } // QueryInterface( )
  140. //////////////////////////////////////////////////////////////////////////////
  141. //
  142. // STDMETHODIMP_(ULONG)
  143. // CEnumCookies::AddRef( void )
  144. //
  145. //////////////////////////////////////////////////////////////////////////////
  146. STDMETHODIMP_(ULONG)
  147. CEnumCookies::AddRef( void )
  148. {
  149. TraceFunc( "[IUnknown]" );
  150. InterlockedIncrement( &m_cRef );
  151. RETURN( m_cRef );
  152. } // AddRef( )
  153. //////////////////////////////////////////////////////////////////////////////
  154. //
  155. // STDMETHODIMP_(ULONG)
  156. // CEnumCookies::Release( void )
  157. //
  158. //////////////////////////////////////////////////////////////////////////////
  159. STDMETHODIMP_(ULONG)
  160. CEnumCookies::Release( void )
  161. {
  162. TraceFunc( "[IUnknown]" );
  163. InterlockedDecrement( &m_cRef );
  164. if ( m_cRef )
  165. RETURN( m_cRef );
  166. TraceDo( delete this );
  167. RETURN(0);
  168. } // Release( )
  169. //****************************************************************************
  170. //
  171. // IEnumCookies
  172. //
  173. //****************************************************************************
  174. //////////////////////////////////////////////////////////////////////////////
  175. //
  176. // STDMETHODIMP
  177. // CEnumCookies::Next(
  178. // ULONG celt,
  179. // IClusCfgNetworkInfo * rgNetworksOut[],
  180. // ULONG * pceltFetchedOut
  181. // )
  182. //
  183. //////////////////////////////////////////////////////////////////////////////
  184. STDMETHODIMP
  185. CEnumCookies::Next(
  186. ULONG celt,
  187. OBJECTCOOKIE rgcookieOut[],
  188. ULONG * pceltFetchedOut
  189. )
  190. {
  191. TraceFunc( "[IEnumCookies]" );
  192. HRESULT hr = S_OK;
  193. ULONG cIter;
  194. //
  195. // Check parameters
  196. //
  197. if ( rgcookieOut == NULL )
  198. goto InvalidPointer;
  199. //
  200. // Loop and coping/addreffing the pccni.
  201. //
  202. for( cIter = 0 ; m_cIter < m_cAlloced && cIter < celt ; cIter ++ )
  203. {
  204. rgcookieOut[ cIter ] = m_pList[ m_cIter ];
  205. // Increment the class iter.
  206. m_cIter++;
  207. } // for: m_cIter && cIter
  208. Assert( hr == S_OK );
  209. if ( cIter != celt )
  210. {
  211. hr = S_FALSE;
  212. }
  213. if ( pceltFetchedOut != NULL )
  214. {
  215. *pceltFetchedOut = cIter;
  216. }
  217. Cleanup:
  218. HRETURN( hr );
  219. InvalidPointer:
  220. hr = THR( E_POINTER );
  221. goto Cleanup;
  222. } // Next( )
  223. //////////////////////////////////////////////////////////////////////////////
  224. //
  225. // STDMETHODIMP
  226. // CEnumCookies::Skip(
  227. // ULONG celt
  228. // )
  229. //
  230. //////////////////////////////////////////////////////////////////////////////
  231. STDMETHODIMP
  232. CEnumCookies::Skip(
  233. ULONG celt
  234. )
  235. {
  236. TraceFunc( "[IEnumCookies]" );
  237. HRESULT hr = S_OK;
  238. m_cIter += celt;
  239. if ( m_cIter >= m_cAlloced )
  240. {
  241. m_cIter = m_cAlloced;
  242. hr = S_FALSE;
  243. }
  244. HRETURN( hr );
  245. } // Skip( )
  246. //////////////////////////////////////////////////////////////////////////////
  247. //
  248. // STDMETHODIMP
  249. // CEnumCookies::Reset( void )
  250. //
  251. //////////////////////////////////////////////////////////////////////////////
  252. STDMETHODIMP
  253. CEnumCookies::Reset( void )
  254. {
  255. TraceFunc( "[IEnumCookies]" );
  256. HRESULT hr = S_OK;
  257. m_cIter = 0;
  258. HRETURN( hr );
  259. } // Reset( )
  260. //////////////////////////////////////////////////////////////////////////////
  261. //
  262. // STDMETHODIMP
  263. // CEnumCookies::Clone(
  264. // IEnumCookies ** ppenumOut
  265. // )
  266. //
  267. //////////////////////////////////////////////////////////////////////////////
  268. STDMETHODIMP
  269. CEnumCookies::Clone(
  270. IEnumCookies ** ppenumOut
  271. )
  272. {
  273. TraceFunc( "[IEnumCookies]" );
  274. //
  275. // KB: not going to implement this method.
  276. //
  277. HRESULT hr = THR( E_NOTIMPL );
  278. HRETURN( hr );
  279. } // Clone( )
  280. //////////////////////////////////////////////////////////////////////////////
  281. //
  282. // STDMETHODIMP
  283. // CEnumCookies::Count(
  284. // DWORD * pnCountOut
  285. // )
  286. //
  287. //////////////////////////////////////////////////////////////////////////////
  288. STDMETHODIMP
  289. CEnumCookies::Count(
  290. DWORD * pnCountOut
  291. )
  292. {
  293. TraceFunc( "[IEnumCookies]" );
  294. HRESULT hr = S_OK;
  295. if ( pnCountOut == NULL )
  296. {
  297. hr = THR( E_POINTER );
  298. goto Cleanup;
  299. }
  300. *pnCountOut = m_cCookies;
  301. Cleanup:
  302. HRETURN( hr );
  303. }// Count( )