#region Copyright (c) 2011-2023 Technosoftware GmbH. All rights reserved //----------------------------------------------------------------------------- // Copyright (c) 2011-2023 Technosoftware GmbH. All rights reserved // Web: https://www.technosoftware.com // // The source code in this file is covered under a dual-license scenario: // - Owner of a purchased license: SCLA 1.0 // - GPL V3: everybody else // // SCLA license terms accompanied with this source code. // See SCLA 1.0: https://technosoftware.com/license/Source_Code_License_Agreement.pdf // // GNU General Public License as published by the Free Software Foundation; // version 3 of the License are accompanied with this source code. // See https://technosoftware.com/license/GPLv3License.txt // // This source code is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. //----------------------------------------------------------------------------- #endregion Copyright (c) 2011-2023 Technosoftware GmbH. All rights reserved #region Using Directives using System; using System.Runtime.InteropServices; using Technosoftware.OpcRcw.Comn; #endregion namespace Technosoftware.DaAeHdaClient.Com { /// /// A wrapper for the COM IEnumString interface. /// internal class EnumString : IDisposable { /// /// A reference to the remote COM object. /// private IEnumString m_enumerator = null; /// /// Initializes the object with an enumerator. /// public EnumString(object enumerator) { m_enumerator = (IEnumString)enumerator; } /// /// Releases the remote COM object. /// public void Dispose() { Utilities.Interop.ReleaseServer(m_enumerator); m_enumerator = null; } //===================================================================== // IEnumString /// /// Fetches the next subscription of strings. /// public string[] Next(int count) { try { // create buffer. var buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(IntPtr)) * count); try { // fetch next subscription of strings. var fetched = 0; m_enumerator.RemoteNext( count, buffer, out fetched); // return empty array if at end of list. if (fetched == 0) { return new string[0]; } return Interop.GetUnicodeStrings(ref buffer, fetched, true); } finally { Marshal.FreeCoTaskMem(buffer); } } // return null on any error. catch (Exception) { return null; } } /// /// Skips a number of strings. /// public void Skip(int count) { m_enumerator.Skip(count); } /// /// Sets pointer to the start of the list. /// public void Reset() { m_enumerator.Reset(); } /// /// Clones the enumerator. /// public EnumString Clone() { IEnumString enumerator; m_enumerator.Clone(out enumerator); return new EnumString(enumerator); } } }