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.

206 lines
4.1 KiB

  1. /*
  2. * EnumConns.cxx
  3. *
  4. * CEnumConnections - class to implement IEnumConnections
  5. *
  6. * Copyright (C) 2001 Microsoft Corporation. All rights reserved.
  7. *
  8. */
  9. #include <wininetp.h>
  10. #include "EnumConns.hxx"
  11. CEnumConnections::CEnumConnections()
  12. : m_ulRefCount(1), m_dwTotal(0), m_dwCurrentIndex(0), m_arrCD(NULL)
  13. {
  14. }
  15. CEnumConnections::~CEnumConnections()
  16. {
  17. ReleaseCDs();
  18. }
  19. STDMETHODIMP CEnumConnections::Init(CONNECTDATA* parrCP, DWORD cCount, DWORD cCurPos)
  20. {
  21. if (parrCP == NULL && cCount != 0)
  22. return E_POINTER;
  23. ReleaseCDs();
  24. m_dwTotal = cCount;
  25. m_dwCurrentIndex = cCurPos;
  26. if (cCount)
  27. {
  28. m_arrCD = new CONNECTDATA[m_dwTotal];
  29. if (m_arrCD)
  30. {
  31. for (DWORD i = 0; i < m_dwTotal; ++i)
  32. {
  33. m_arrCD[i] = parrCP[i];
  34. m_arrCD[i].pUnk->AddRef();
  35. }
  36. return S_OK;
  37. }
  38. else
  39. return E_OUTOFMEMORY;
  40. }
  41. else
  42. return S_OK;
  43. }
  44. void CEnumConnections::ReleaseCDs()
  45. {
  46. if (m_arrCD)
  47. {
  48. for (DWORD i = 0; i < m_dwTotal; ++i)
  49. m_arrCD[i].pUnk->Release();
  50. delete[] m_arrCD;
  51. m_arrCD = NULL;
  52. }
  53. }
  54. //
  55. // IUnknown QueryInterface
  56. //
  57. STDMETHODIMP CEnumConnections::QueryInterface(REFIID riid, void ** ppvObject)
  58. {
  59. HRESULT hr = NOERROR;
  60. if (ppvObject == NULL)
  61. {
  62. hr = E_INVALIDARG;
  63. }
  64. else if (riid == IID_IUnknown)
  65. {
  66. *ppvObject = static_cast<IUnknown*>(this);
  67. AddRef();
  68. }
  69. else if (riid == IID_IEnumConnections)
  70. {
  71. *ppvObject = static_cast<IEnumConnections*>(this);
  72. AddRef();
  73. }
  74. else
  75. hr = E_NOINTERFACE;
  76. return hr;
  77. }
  78. //
  79. // IUnknown AddRef
  80. //
  81. ULONG CEnumConnections::AddRef()
  82. {
  83. return ++m_ulRefCount;
  84. }
  85. //
  86. // IUnknown Release
  87. //
  88. ULONG CEnumConnections::Release()
  89. {
  90. if (--m_ulRefCount == 0)
  91. {
  92. delete this;
  93. return 0;
  94. }
  95. else
  96. return m_ulRefCount;
  97. }
  98. //
  99. // IEnumConnectionPoints Next
  100. //
  101. STDMETHODIMP CEnumConnections::Next(
  102. ULONG cConnections, //[in]Number of IConnectionPoint values
  103. // returned in rgpcn array
  104. CONNECTDATA* rgpcd, //[out]Array to receive enumerated connection
  105. // points
  106. ULONG *pcFetched //[out]Pointer to the actual number of
  107. // connection points returned in rgpcn array
  108. )
  109. {
  110. if (m_arrCD == NULL && m_dwTotal != 0)
  111. return E_UNEXPECTED;
  112. if (pcFetched == NULL && cConnections > 1)
  113. return E_POINTER;
  114. DWORD dwFetched = 0;
  115. if (pcFetched)
  116. *pcFetched = 0;
  117. else
  118. pcFetched = &dwFetched;
  119. if (cConnections == 0)
  120. return S_OK;
  121. if (rgpcd == 0)
  122. return E_POINTER;
  123. for (DWORD i = m_dwCurrentIndex; i < m_dwTotal; ++i)
  124. {
  125. *rgpcd = m_arrCD[i];
  126. m_arrCD[i].pUnk->AddRef();
  127. ++rgpcd;
  128. ++(*pcFetched);
  129. if (*pcFetched == cConnections)
  130. return S_OK;
  131. }
  132. return S_FALSE;
  133. }
  134. //
  135. // IEnumConnectionPoints Skip
  136. //
  137. STDMETHODIMP CEnumConnections::Skip(ULONG cConnections)
  138. {
  139. m_dwCurrentIndex += cConnections;
  140. if (m_dwCurrentIndex <= m_dwTotal)
  141. return S_OK;
  142. else
  143. return S_FALSE;
  144. }
  145. //
  146. // IEnumConnectionPoints Reset
  147. //
  148. STDMETHODIMP CEnumConnections::Reset()
  149. {
  150. m_dwCurrentIndex = 0;
  151. return S_OK;
  152. }
  153. //
  154. // IEnumConnectionPoints Clone
  155. //
  156. STDMETHODIMP CEnumConnections::Clone(IEnumConnections** ppEnum)
  157. {
  158. if (m_arrCD == NULL && m_dwTotal != 0)
  159. return E_UNEXPECTED;
  160. if (ppEnum == NULL)
  161. return E_POINTER;
  162. *ppEnum = NULL;
  163. CEnumConnections* pNew = new CEnumConnections();
  164. if (pNew)
  165. {
  166. HRESULT hr = pNew->Init(m_arrCD, m_dwTotal, m_dwCurrentIndex);
  167. if ( SUCCEEDED(hr) )
  168. *ppEnum = static_cast<IEnumConnections*>(pNew);
  169. else
  170. delete pNew;
  171. return hr;
  172. }
  173. else
  174. return E_OUTOFMEMORY;
  175. }