enum.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 3k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. //*******************************************************************************************
  2. //
  3. // Filename : Enum.cpp
  4. //
  5. // Implementation for CEnumCabObjs
  6. //
  7. // Copyright (c) 1994 - 1996 Microsoft Corporation. All rights reserved
  8. //
  9. //*******************************************************************************************
  10. #include "pch.h"
  11. #include "thisdll.h"
  12. #include "enum.h"
  13. // *** IUnknown methods ***
  14. STDMETHODIMP CEnumCabObjs::QueryInterface(
  15.    REFIID riid, 
  16.    LPVOID FAR* ppvObj)
  17. {
  18. *ppvObj = NULL;
  19. LPUNKNOWN pObj;
  20.  
  21. if (riid == IID_IUnknown)
  22. {
  23. pObj = (IUnknown*)((IEnumIDList*)this); 
  24. }
  25. else if (riid == IID_IEnumIDList)
  26. {
  27. pObj = (IUnknown*)((IEnumIDList*)this); 
  28. }
  29. else
  30. {
  31.     return(E_NOINTERFACE);
  32. }
  33. pObj->AddRef();
  34. *ppvObj = pObj;
  35. return(NOERROR);
  36. }
  37. STDMETHODIMP_(ULONG) CEnumCabObjs::AddRef(void)
  38. {
  39. return(m_cRef.AddRef());
  40. }
  41. STDMETHODIMP_(ULONG) CEnumCabObjs::Release(void)
  42. {
  43. if (!m_cRef.Release())
  44. {
  45.     delete this;
  46. return(0);
  47. }
  48. return(m_cRef.GetRef());
  49. }
  50. // *** IEnumIDList methods ***
  51. STDMETHODIMP CEnumCabObjs::Next(ULONG celt,
  52.       LPITEMIDLIST *rgelt,
  53.       ULONG *pceltFetched)
  54. {
  55. *rgelt = NULL;
  56. if (pceltFetched)
  57. {
  58. *pceltFetched = 0;
  59. }
  60. HRESULT hRes = m_pcfThis->InitItems();
  61. if (FAILED(hRes))
  62. {
  63. return(hRes);
  64. }
  65. for ( ; ; ++m_iCount)
  66. {
  67. if (m_iCount >= m_pcfThis->m_lItems.GetCount())
  68. {
  69. return(S_FALSE);
  70. }
  71. LPCABITEM pit = m_pcfThis->m_lItems[m_iCount];
  72. if ((m_uFlags&(SHCONTF_FOLDERS|SHCONTF_NONFOLDERS))
  73. != (SHCONTF_FOLDERS|SHCONTF_NONFOLDERS))
  74. {
  75. DWORD gfInOut = SFGAO_FOLDER;
  76. if (FAILED(m_pcfThis->GetAttributesOf(1, (LPCITEMIDLIST *)&pit, &gfInOut)))
  77. {
  78. continue;
  79. }
  80. if (!(m_uFlags&SHCONTF_FOLDERS) && (gfInOut&SFGAO_FOLDER))
  81. {
  82. continue;
  83. }
  84. if ((m_uFlags&SHCONTF_FOLDERS) && !(gfInOut&SFGAO_FOLDER))
  85. {
  86. continue;
  87. }
  88. }
  89. if (!(m_uFlags&SHCONTF_INCLUDEHIDDEN)
  90. && (pit->uFileAttribs&(FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM)))
  91. {
  92. continue;
  93. }
  94. break;
  95. }
  96. *rgelt = ILClone((LPCITEMIDLIST)m_pcfThis->m_lItems[m_iCount]);
  97. ++m_iCount;
  98. if (*rgelt)
  99. {
  100. if (pceltFetched)
  101. {
  102. *pceltFetched = 1;
  103. }
  104. return(S_OK);
  105. }
  106. return(E_OUTOFMEMORY);
  107. }
  108. STDMETHODIMP CEnumCabObjs::Skip(ULONG celt)
  109. {
  110. return(E_NOTIMPL);
  111. }
  112. STDMETHODIMP CEnumCabObjs::Reset()
  113. {
  114. m_iCount = 0;
  115. return(NOERROR);
  116. }
  117. STDMETHODIMP CEnumCabObjs::Clone(IEnumIDList **ppenum)
  118. {
  119. return(E_NOTIMPL);
  120. }