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.

113 lines
2.6 KiB

  1. //////////////////////////////////////////
  2. // filters.h : header for CFilters IEnumFilters implementation on
  3. // top of stl vector of filters
  4. // copyright (c) 1999 Microsoft Corp.
  5. #pragma once
  6. #ifndef FILTERS_H_
  7. #define FILTERS_H_
  8. #include <vector>
  9. #include <dsextend.h>
  10. #include <objectwithsiteimplsec.h>
  11. class ATL_NO_VTABLE CFilterEnumOnDSFilterListBase : public CComObjectRootEx<CComSingleThreadModel>,
  12. public IEnumFilters,
  13. public IObjectWithSiteImplSec<CFilterEnumOnDSFilterListBase>
  14. {
  15. BEGIN_COM_MAP(CFilterEnumOnDSFilterListBase)
  16. COM_INTERFACE_ENTRY(IEnumFilters)
  17. COM_INTERFACE_ENTRY(IObjectWithSite)
  18. END_COM_MAP()
  19. DECLARE_PROTECT_FINAL_CONSTRUCT()
  20. virtual ~CFilterEnumOnDSFilterListBase() {}
  21. };
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CFilters
  24. class CFilterEnumOnDSFilterList : public CComObject<CFilterEnumOnDSFilterListBase>
  25. {
  26. public:
  27. CFilterEnumOnDSFilterList(DSFilterList &Fi) : m_Filters(Fi) {
  28. i = m_Filters.begin();
  29. }
  30. CFilterEnumOnDSFilterList(CFilterEnumOnDSFilterList &orig) : m_Filters(orig.m_Filters) {
  31. i = m_Filters.begin();
  32. DSFilterList::iterator i2 = orig.m_Filters.begin();
  33. for (; i2 != orig.i && i2 != orig.m_Filters.end(); ++i, ++i2);
  34. }
  35. virtual ~CFilterEnumOnDSFilterList() {
  36. m_Filters.clear();
  37. }
  38. // IDevEnum
  39. public:
  40. DSFilterList m_Filters;
  41. DSFilterList::iterator i;
  42. // IEnumVARIANT
  43. STDMETHOD(Next)(ULONG celt, IBaseFilter **pOutF, ULONG * pceltFetched)
  44. {
  45. // pceltFetched can legally == 0
  46. //
  47. if (pceltFetched != NULL) {
  48. try {
  49. *pceltFetched = 0;
  50. } catch(...) {
  51. return E_POINTER;
  52. }
  53. }
  54. HRESULT hr = NOERROR ;
  55. try {
  56. // Retrieve the next celt elements.
  57. for (;i != m_Filters.end() && celt != 0; ++i, --celt, ++pOutF) {
  58. hr = (*i).CopyTo(pOutF);
  59. if (FAILED(hr)){
  60. return hr;
  61. }
  62. if (pceltFetched != NULL) {
  63. (*pceltFetched)++ ;
  64. }
  65. }
  66. } catch(...) {
  67. return E_POINTER;
  68. }
  69. if (celt != 0) {
  70. hr = ResultFromScode( S_FALSE ) ;
  71. }
  72. return hr;
  73. }
  74. STDMETHOD(Skip)(ULONG celt)
  75. {
  76. for (;i != m_Filters.end() && celt--; ++i);
  77. return (celt == 0 ? NOERROR : ResultFromScode( S_FALSE )) ;
  78. }
  79. STDMETHOD(Reset)()
  80. {
  81. i = m_Filters.begin();
  82. return NOERROR;
  83. }
  84. STDMETHOD(Clone)(IEnumFilters **ppenum)
  85. {
  86. if (ppenum == NULL)
  87. return E_POINTER;
  88. PQEnumFilters temp;
  89. try {
  90. temp = new CFilterEnumOnDSFilterList(*this);
  91. } catch(...) {
  92. return E_OUTOFMEMORY;
  93. }
  94. try {
  95. *ppenum = temp.Detach();
  96. } catch(...) {
  97. return E_POINTER;
  98. }
  99. return NOERROR;
  100. }
  101. };
  102. #endif
  103. //end of file filters.h