| File: System\Windows\Forms\ActiveX\AxHost.EnumUnknown.cs | Web Access |
| Project: src\winforms\src\System.Windows.Forms\System.Windows.Forms.csproj (System.Windows.Forms) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using Windows.Win32.System.Com; namespace System.Windows.Forms; public abstract partial class AxHost { internal class EnumUnknown : IEnumUnknown.Interface, IManagedWrapper<IEnumUnknown> { private readonly object[]? _array; private int _location; private readonly int _size; internal EnumUnknown(object[]? array) { _array = array; _location = 0; _size = (array is null) ? 0 : array.Length; } private EnumUnknown(object[]? array, int location) : this(array) { _location = location; } unsafe HRESULT IEnumUnknown.Interface.Next(uint celt, IUnknown** rgelt, uint* pceltFetched) { if (rgelt is null) { return HRESULT.E_POINTER; } if (pceltFetched is not null) { *pceltFetched = 0; } if (celt < 0) { return HRESULT.E_INVALIDARG; } uint fetched = 0; if (_location >= _size) { fetched = 0; } else { for (; _location < _size && fetched < celt; ++_location) { if (_array![_location] is not null) { *rgelt = ComHelpers.GetComPointer<IUnknown>(_array[_location]); ++fetched; } } } if (pceltFetched is not null) { *pceltFetched = fetched; } return fetched != celt ? HRESULT.S_FALSE : HRESULT.S_OK; } HRESULT IEnumUnknown.Interface.Skip(uint celt) { _location += (int)celt; return _location >= _size ? HRESULT.S_FALSE : HRESULT.S_OK; } HRESULT IEnumUnknown.Interface.Reset() { _location = 0; return HRESULT.S_OK; } unsafe HRESULT IEnumUnknown.Interface.Clone(IEnumUnknown** ppenum) { if (ppenum is null) { return HRESULT.E_POINTER; } *ppenum = ComHelpers.GetComPointer<IEnumUnknown>(new EnumUnknown(_array, _location)); return HRESULT.S_OK; } } }