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.

172 lines
4.2 KiB

  1. //
  2. // epval.cpp
  3. //
  4. // CEnumPropertyValue
  5. //
  6. #include "private.h"
  7. #include "epval.h"
  8. DBG_ID_INSTANCE(CEnumPropertyValue);
  9. //////////////////////////////////////////////////////////////////////////////
  10. //////////////////////////////////////////////////////////////////////////////
  11. //
  12. // SHARED_TFPROPERTYVAL_ARRAY
  13. //
  14. //////////////////////////////////////////////////////////////////////////////
  15. //////////////////////////////////////////////////////////////////////////////
  16. //+---------------------------------------------------------------------------
  17. //
  18. // SAA_New
  19. //
  20. //----------------------------------------------------------------------------
  21. SHARED_TFPROPERTYVAL_ARRAY *SAA_New(ULONG cAttrVals)
  22. {
  23. SHARED_TFPROPERTYVAL_ARRAY *paa;
  24. paa = (SHARED_TFPROPERTYVAL_ARRAY *)cicMemAlloc(sizeof(SHARED_TFPROPERTYVAL_ARRAY)+sizeof(TF_PROPERTYVAL)*cAttrVals-sizeof(TF_PROPERTYVAL));
  25. if (paa != NULL)
  26. {
  27. paa->cRef = 1;
  28. paa->cAttrVals = cAttrVals;
  29. // clear out the attrs so VariantClear is safe
  30. memset(paa->rgAttrVals, 0, cAttrVals*sizeof(TF_PROPERTYVAL));
  31. }
  32. return paa;
  33. }
  34. //+---------------------------------------------------------------------------
  35. //
  36. // SAA_Release
  37. //
  38. //----------------------------------------------------------------------------
  39. void SAA_Release(SHARED_TFPROPERTYVAL_ARRAY *paa)
  40. {
  41. ULONG i;
  42. Assert(paa->cRef > 0);
  43. if (--paa->cRef == 0)
  44. {
  45. for (i=0; i<paa->cAttrVals; i++)
  46. {
  47. VariantClear(&paa->rgAttrVals[i].varValue);
  48. }
  49. cicMemFree(paa);
  50. }
  51. }
  52. //////////////////////////////////////////////////////////////////////////////
  53. //////////////////////////////////////////////////////////////////////////////
  54. //
  55. // CEnumPropertyValue
  56. //
  57. //////////////////////////////////////////////////////////////////////////////
  58. //////////////////////////////////////////////////////////////////////////////
  59. //+---------------------------------------------------------------------------
  60. //
  61. // Clone
  62. //
  63. //----------------------------------------------------------------------------
  64. STDAPI CEnumPropertyValue::Clone(IEnumTfPropertyValue **ppEnum)
  65. {
  66. CEnumPropertyValue *pClone;
  67. if (ppEnum == NULL)
  68. return E_INVALIDARG;
  69. *ppEnum = NULL;
  70. if ((pClone = new CEnumPropertyValue) == NULL)
  71. return E_OUTOFMEMORY;
  72. pClone->_ulCur = _ulCur;
  73. pClone->_paa = _paa;
  74. SAA_AddRef(pClone->_paa);
  75. *ppEnum = pClone;
  76. return S_OK;
  77. }
  78. //+---------------------------------------------------------------------------
  79. //
  80. // Next
  81. //
  82. //----------------------------------------------------------------------------
  83. STDAPI CEnumPropertyValue::Next(ULONG ulCount, TF_PROPERTYVAL *prgValues, ULONG *pcFetched)
  84. {
  85. ULONG cFetched;
  86. ULONG ulCurOld;
  87. ULONG ulSize;
  88. if (pcFetched == NULL)
  89. {
  90. pcFetched = &cFetched;
  91. }
  92. *pcFetched = 0;
  93. ulCurOld = _ulCur;
  94. if (ulCount > 0 && prgValues == NULL)
  95. return E_INVALIDARG;
  96. ulSize = _paa->cAttrVals;
  97. while (_ulCur < ulSize && *pcFetched < ulCount)
  98. {
  99. QuickVariantInit(&prgValues->varValue);
  100. prgValues->guidId = _paa->rgAttrVals[_ulCur].guidId;
  101. if (VariantCopy(&prgValues->varValue, &_paa->rgAttrVals[_ulCur].varValue) != S_OK)
  102. goto ErrorExit;
  103. prgValues++;
  104. *pcFetched = *pcFetched + 1;
  105. _ulCur++;
  106. }
  107. return *pcFetched == ulCount ? S_OK : S_FALSE;
  108. ErrorExit:
  109. while (--_ulCur > ulCurOld)
  110. {
  111. prgValues--;
  112. VariantClear(&prgValues->varValue);
  113. }
  114. return E_OUTOFMEMORY;
  115. }
  116. //+---------------------------------------------------------------------------
  117. //
  118. // Reset
  119. //
  120. //----------------------------------------------------------------------------
  121. STDAPI CEnumPropertyValue::Reset()
  122. {
  123. _ulCur = 0;
  124. return S_OK;
  125. }
  126. //+---------------------------------------------------------------------------
  127. //
  128. // Skip
  129. //
  130. //----------------------------------------------------------------------------
  131. STDAPI CEnumPropertyValue::Skip(ULONG ulCount)
  132. {
  133. _ulCur += ulCount;
  134. return (_ulCur < _paa->cAttrVals) ? S_OK : S_FALSE;
  135. }