File: System\Messaging\Interop\Columns.cs
Project: ndp\cdf\src\NetFx20\System.Messaging\System.Messaging.csproj (System.Messaging)
//------------------------------------------------------------------------------
// <copyright file="Columns.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
namespace System.Messaging.Interop
{
    using System.Runtime.InteropServices;
 
    using System.Diagnostics;
 
    using System;
    using System.ComponentModel;
    using System.Globalization; //for CultureInfo
    using Microsoft.Win32;
 
    internal class Columns
    {
        private int maxCount;
        private MQCOLUMNSET columnSet = new MQCOLUMNSET();
 
        public Columns(int maxCount)
        {
            this.maxCount = maxCount;
            this.columnSet.columnIdentifiers = Marshal.AllocHGlobal(maxCount * 4);
            this.columnSet.columnCount = 0;
        }
 
        public virtual void AddColumnId(int columnId)
        {
            lock (this)
            {
                if (this.columnSet.columnCount >= this.maxCount)
                    throw new InvalidOperationException(Res.GetString(Res.TooManyColumns, this.maxCount.ToString(CultureInfo.CurrentCulture)));
 
                ++this.columnSet.columnCount;
                this.columnSet.SetId(columnId, this.columnSet.columnCount - 1);
            }
        }
 
        public virtual MQCOLUMNSET GetColumnsRef()
        {
            return this.columnSet;
        }
 
        [StructLayout(LayoutKind.Sequential)]
        public class MQCOLUMNSET
        {
            public int columnCount;
 
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources")]
            public IntPtr columnIdentifiers;
 
            ~MQCOLUMNSET()
            {
                if (this.columnIdentifiers != (IntPtr)0)
                {
                    Marshal.FreeHGlobal(this.columnIdentifiers);
                    this.columnIdentifiers = (IntPtr)0;
                }
            }
 
            public virtual void SetId(int columnId, int index)
            {
                Marshal.WriteInt32((IntPtr)((long)this.columnIdentifiers + (index * 4)), columnId);
            }
        }
    }
}