Packet Sniffer SDK DLL Edition

HNQueue wrapper for C#

 Previous Next

File: HNQueue.cs

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Runtime.InteropServices;

namespace microOLAP.PSSDK
{
    /// <summary>
    /// Summary description for HNQueue.
    /// </summary>
    public partial class HNQueue : Component
    {
        #region DLL exports

        /// <summary>
        /// Creates the HNQueue object.
        /// </summary>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueCreate")]
        private static extern IntPtr QueCreate();

        /// <summary>
        /// Destroys the HNQueue object.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueDestroy")]
        private static extern int QueDestroy(IntPtr hQue);

        /// <summary>
        /// Returns the queue packet maximum size.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueGetMaxPacketSize")]
        private static extern uint QueGetMaxPacketSize(IntPtr hQue);

        /// <summary>
        /// Sets the queue packet maximum size.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="MaxPacketSize"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueSetMaxPacketSize")]
        private static extern uint QueSetMaxPacketSize(IntPtr hQue, uint MaxPacketSize);

        /// <summary>
        /// Returns an overall quantity of queue elements.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueGetItemsCount")]
        private static extern uint QueGetItemsCount(IntPtr hQue);

        /// <summary>
        /// Sets an overall quantity of queue elements.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="ItemsCount"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueSetItemsCount")]
        private static extern uint QueSetItemsCount(IntPtr hQue, uint ItemsCount);

        /// <summary>
        /// Returns total size of the memory pool used by queue.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueGetAllocatedSize")]
        private static extern UIntPtr QueGetAllocatedSize(IntPtr hQue);

        /// <summary>
        /// Returns total amount of the queue items with Free status.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueGetFreeCount")]
        private static extern uint QueGetFreeCount(IntPtr hQue);

        /// <summary>
        /// Returns total amount of the queue items with Full status.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueGetFullCount")]
        private static extern uint QueGetFullCount(IntPtr hQue);

        /// <summary>
        /// Allocates memory for queue items and creates queue synchronization objects.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueAllocItems")]
        private static extern int QueAllocItems(IntPtr hQue);

        /// <summary>
        /// Releases queue resources.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueFreeItems")]
        private static extern int QueFreeItems(IntPtr hQue);

        /// <summary>
        /// Returns an element with Free status from the queue.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="Milliseconds"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueGetFreeItem")]
        private static extern IntPtr QueGetFreeItem(IntPtr hQue, int Milliseconds);

        /// <summary>
        /// Returns an element with Free status back to the queue.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="hPkt"></param>
        [DllImport("pssdk.dll", EntryPoint = "QueReturnFreeItem")]
        private static extern void QueReturnFreeItem(IntPtr hQue, IntPtr hPkt);

        /// <summary>
        /// Returns an element with Full status from the queue.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="Milliseconds"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueGetFullItem")]
        private static extern IntPtr QueGetFullItem(IntPtr hQue, int Milliseconds);

        /// <summary>
        /// Returns an element with Full status back to the queue.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="hPkt"></param>
        [DllImport("pssdk.dll", EntryPoint = "QueReturnFullItem")]
        private static extern void QueReturnFullItem(IntPtr hQue, IntPtr hPkt);

        /// <summary>
        /// Turns out all application threads awaiting for Free elements from awaiting status.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueUnblockWaitFree")]
        private static extern bool QueUnblockWaitFree(IntPtr hQue);

        /// <summary>
        /// Turns out all application threads awaiting for Full elements from awaiting status.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueUnblockWaitFull")]
        private static extern bool QueUnblockWaitFull(IntPtr hQue);

        /// <summary>
        /// Creates and starts internal queue thread.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueStart")]
        private static extern int QueStart(IntPtr hQue);

        /// <summary>
        /// Stops internal queue thread.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueStop")]
        private static extern int QueStop(IntPtr hQue);

        /// <summary>
        /// Shows the status of the internal thread.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueIsStarted")]
        private static extern bool QueIsStarted(IntPtr hQue);

        /// <summary>
        /// Sets the OnThreadBegin event.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="pfOnThreadBegin"></param>
        /// <param name="Param"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueSetOnThreadBegin")]
        private static extern IntPtr QueSetOnThreadBegin(IntPtr hQue, CallBackOnThreadBegin pfOnThreadBegin, IntPtr Param);

        /// <summary>
        /// Sets the OnThreadEnd event.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="pfOnThreadEnd"></param>
        /// <param name="Param"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueSetOnThreadEnd")]
        private static extern IntPtr QueSetOnThreadEnd(IntPtr hQue, CallBackOnThreadEnd pfOnThreadEnd, IntPtr Param);

        /// <summary>
        /// Sets the OnDelete event.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="pfOnDeleteItems"></param>
        /// <param name="Param"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueSetOnDeleteItems")]
        private static extern IntPtr QueSetOnDeleteItems(IntPtr hQue, CallBackOnDeleteItems pfOnDeleteItems, IntPtr Param);

        /// <summary>
        /// Sets the OnPacketReceive event.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="pfOnPacketReceive"></param>
        /// <param name="Param"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueSetOnPacketRecv")]
        private static extern IntPtr QueSetOnPacketRecv(IntPtr hQue, CallBackOnPacketReceive pfOnPacketReceive, IntPtr Param);

        /// <summary>
        /// Return sort packets by ID flag.
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueGetOrderingById")]
        private static extern bool QueGetOrderingById(IntPtr hQue);

        /// <summary>
        /// Set sort packets by ID flag.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="OrderingById"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueSetOrderingById")]
        private static extern bool QueSetOrderingById(IntPtr hQue, bool OrderingById);

        /// <summary>
        /// Returns an elements with Free status from the queue.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="Milliseconds"></param>
        /// <param name="pPackets"></param>
        /// <param name="Count"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueGetFreeItems")]
        private static extern uint QueGetFreeItems(IntPtr hQue, uint Milliseconds, IntPtr[] pPackets, uint Count);

        /// <summary>
        /// Returns an elements with Free status back to the queue.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="pPackets"></param>
        /// <param name="Count"></param>
        [DllImport("pssdk.dll", EntryPoint = "QueReturnFreeItems")]
        private static extern void QueReturnFreeItems(IntPtr hQue, IntPtr[] pPackets, uint Count);

        /// <summary>
        /// Returns an elements with Full status from the queue.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="Milliseconds"></param>
        /// <param name="pPackets"></param>
        /// <param name="Count"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueGetFullItems")]
        private static extern uint QueGetFullItems(IntPtr hQue, uint Milliseconds, IntPtr[] pPackets, uint Count);

        /// <summary>
        /// Returns an element with Full status back to the queue.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="pPackets"></param>
        /// <param name="Count"></param>
        [DllImport("pssdk.dll", EntryPoint = "QueReturnFullItems")]
        private static extern void QueReturnFullItems(IntPtr hQue, IntPtr[] pPackets, uint Count);

        /// <summary>
        /// Return ReceiveManyAtOnce flag (see OnPacket(s)Receive event).
        /// </summary>
        /// <param name="hQue"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueGetReceiveManyAtOnce")]
        private static extern bool QueGetReceiveManyAtOnce(IntPtr hQue);

        /// <summary>
        /// Set ReceiveManyAtOnce flag (see OnPacket(s)Receive event).
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="bReceiveManyAtOnce"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueSetReceiveManyAtOnce")]
        private static extern bool QueSetReceiveManyAtOnce(IntPtr hQue, bool bReceiveManyAtOnce);

        /// <summary>
        /// Sets the OnPacketsReceive event.
        /// </summary>
        /// <param name="hQue"></param>
        /// <param name="pfOnPacketsReceive"></param>
        /// <param name="Param"></param>
        /// <returns></returns>
        [DllImport("pssdk.dll", EntryPoint = "QueSetOnPacketsRecv")]
        private static extern IntPtr QueSetOnPacketsRecv(IntPtr hQue, CallBackOnPacketsReceive pfOnPacketsReceive, IntPtr Param);

        #endregion

        #region HNQueue events

        /// <summary>
        /// CallBack OnThreadBegin.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        private delegate void CallBackOnThreadBegin(IntPtr Param, ref IntPtr ThParam);

        /// <summary>
        /// CallBack OnThreadEnd.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        private delegate void CallBackOnThreadEnd(IntPtr Param, IntPtr ThParam);

        /// <summary>
        /// CallBack OnPacketReceive.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hPacket"></param>
        /// <param name="pPacketData"></param>
        /// <param name="IncPacketSize"></param>
        private delegate void CallBackOnPacketReceive(IntPtr Param, IntPtr ThParam, IntPtr hPacket, IntPtr pPacketData, uint IncPacketSize);

        /// <summary>
        /// CallBack OnPacketsReceive.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hPacket"></param>
        /// <param name="pPacketData"></param>
        /// <param name="IncPacketSize"></param>
        private delegate void CallBackOnPacketsReceive(IntPtr Param, IntPtr ThParam, IntPtr[] hPackets, uint Count);

        /// <summary>
        /// CallBack OnDeleteItems.
        /// </summary>
        /// <param name="Param"></param>
        private delegate void CallBackOnDeleteItems(IntPtr Param);

        /// <summary>
        /// CallBack variable OnThreadBegin.
        /// </summary>
        private CallBackOnThreadBegin pfOnThreadBegin;

        /// <summary>
        /// CallBack variable OnThreadEnd.
        /// </summary>
        private CallBackOnThreadEnd pfOnThreadEnd;

        /// <summary>
        /// CallBack variable OnPacketReceive.
        /// </summary>
        private CallBackOnPacketReceive pfOnPacketReceive;

        /// <summary>
        /// CallBack variable OnPacketsReceive.
        /// </summary>
        private CallBackOnPacketsReceive pfOnPacketsReceive;

        /// <summary>
        /// CallBack variable OnDeleteItems.
        /// </summary>
        private CallBackOnDeleteItems pfOnDeleteItems;

        /// <summary>
        /// OnThreadBegin event handler.
        /// </summary>
        public event OnThreadBeginEventHandler OnThreadBegin;

        /// <summary>
        /// OnThreadEnd event handler.
        /// </summary>
        public event OnThreadEndEventHandler OnThreadEnd;

        /// <summary>
        /// OnPacketReceive event handler.
        /// </summary>
        public event OnPacketReceiveEventHandler OnPacketReceive;

        /// <summary>
        /// OnPacketsReceive event handler.
        /// </summary>
        public event OnPacketsReceiveEventHandler OnPacketsReceive;

        /// <summary>
        /// OnDeleteItems event handler.
        /// </summary>
        public event OnDeleteItemsEventHandler OnDeleteItems;

        #endregion

        /// <summary>
        /// Handle of the HNQueue object.
        /// </summary>
        private IntPtr hQue = IntPtr.Zero;

        /// <summary>
        /// Creates the HNQueue object.
        /// </summary>
        public HNQueue()
        {
            InitializeComponent();

            hQue = QueCreate();
            if (hQue != IntPtr.Zero)
            {
                pfOnThreadBegin = new CallBackOnThreadBegin(this.DoOnThreadBegin);
                QueSetOnThreadBegin(hQue, pfOnThreadBegin, IntPtr.Zero);

                pfOnThreadEnd = new CallBackOnThreadEnd(this.DoOnThreadEnd);
                QueSetOnThreadEnd(hQue, pfOnThreadEnd, IntPtr.Zero);

                pfOnPacketReceive = new CallBackOnPacketReceive(this.DoOnPacketReceive);
                QueSetOnPacketRecv(hQue, pfOnPacketReceive, IntPtr.Zero);

                pfOnPacketsReceive = new CallBackOnPacketsReceive(this.DoOnPacketsReceive);
                QueSetOnPacketsRecv(hQue, pfOnPacketsReceive, IntPtr.Zero);

                pfOnDeleteItems = new CallBackOnDeleteItems(this.DoOnDeleteItems);
                QueSetOnDeleteItems(hQue, pfOnDeleteItems, IntPtr.Zero);
            }
        }

        /// <summary>
        /// Destroys the HNQueue object.
        /// </summary>
        ~HNQueue()
        {
            if (hQue != IntPtr.Zero) QueDestroy(hQue);
        }

        #region HNQueque properties

        /// <summary>
        /// Checks if the HNQueue object has been created correctly.
        /// </summary>
        [Browsable(false)]
        public bool IsValid
        {
            get
            {
                return (hQue != IntPtr.Zero);
            }
        }

        /// <summary>
        /// Returns the queue handle.
        /// </summary>
        [Browsable(false)]
        public IntPtr Handle
        {
            get
            {
                return hQue;
            }
        }

        /// <summary>
        /// Sets/Returns an overall quantity of queue elements.
        /// </summary>
        public uint ItemsCount
        {
            get
            {
                return QueGetItemsCount(hQue);
            }
            set
            {
                QueSetItemsCount(hQue, value);
            }
        }

        /// <summary>
        /// Sets/Returns the queue packet maximum size.
        /// </summary>
        public uint MaxPacketSize
        {
            get
            {
                return QueGetMaxPacketSize(hQue);
            }
            set
            {
                QueSetMaxPacketSize(hQue, value);
            }
        }

        /// <summary>
        /// Returns total size of the memory pool used by queue.
        /// </summary>
        [Browsable(false)]
        public ulong AllocatedSize
        {
            get
            {
                return QueGetAllocatedSize(hQue).ToUInt64();
            }
        }

        /// <summary>
        /// Returns total amount of the queue items with Free status.
        /// </summary>
        [Browsable(false)]
        public uint FreeCount
        {
            get
            {
                return QueGetFreeCount(hQue);
            }
        }

        /// <summary>
        /// Returns total amount of the queue items with Full status.
        /// </summary>
        [Browsable(false)]
        public uint FullCount
        {
            get
            {
                return QueGetFullCount(hQue);
            }
        }

        /// <summary>
        /// Set/Return sort packets by ID flag.
        /// </summary>
        public bool OrderingById
        {
            get
            {
                return QueGetOrderingById(hQue);
            }
            set
            {
                QueSetOrderingById(hQue, value);
            }
        }

        /// <summary>
        /// Set/Return ReceiveManyAtOnce flag (see OnPacket(s)Receive event).
        /// </summary>
        public bool ReceiveManyAtOnce
        {
            get
            {
                return QueGetReceiveManyAtOnce(hQue);
            }
            set
            {
                QueSetReceiveManyAtOnce(hQue, value);
            }
        }

        #endregion

        #region HNQueque methods

        /// <summary>
        /// Allocates memory for queue items and creates queue synchronization objects.
        /// </summary>
        /// <returns></returns>
        public PSSDKRES AllocItems()
        {
            return (PSSDKRES)QueAllocItems(hQue);
        }

        /// <summary>
        /// Releases queue resources.
        /// </summary>
        /// <returns></returns>
        public PSSDKRES FreeItems()
        {
            return (PSSDKRES)QueFreeItems(hQue);
        }

        /// <summary>
        /// Creates and starts internal queue thread.
        /// </summary>
        /// <returns></returns>
        public PSSDKRES Start()
        {
            return (PSSDKRES)QueStart(hQue);
        }

        /// <summary>
        /// Stops internal queue thread.
        /// </summary>
        /// <returns></returns>
        public PSSDKRES Stop()
        {
            return (PSSDKRES)QueStop(hQue);
        }

        /// <summary>
        /// Shows the status of the internal thread.
        /// </summary>
        /// <returns></returns>
        public bool IsStarted()
        {
            return QueIsStarted(hQue);
        }

        /// <summary>
        /// Returns an element with Free status from the queue.
        /// </summary>
        /// <param name="Milliseconds"></param>
        /// <returns></returns>
        public IntPtr Get_FreeItem(int Milliseconds)
        {
            return QueGetFreeItem(hQue, Milliseconds);
        }

        /// <summary>
        /// Returns an element with Free status back to the queue.
        /// </summary>
        /// <param name="hPacket"></param>
        public void Return_FreeItem(IntPtr hPacket)
        {
            QueReturnFreeItem(hQue, hPacket);
        }

        /// <summary>
        /// Returns an element with Full status from the queue.
        /// </summary>
        /// <param name="Milliseconds"></param>
        /// <returns></returns>
        public IntPtr Get_FullItem(int Milliseconds)
        {
            return QueGetFullItem(hQue, Milliseconds);
        }

        /// <summary>
        /// Returns an element with Full status back to the queue.
        /// </summary>
        /// <param name="hPacket"></param>
        public void Return_FullItem(IntPtr hPacket)
        {
            QueReturnFullItem(hQue, hPacket);
        }

        /// <summary>
        /// Turns out all application threads awaiting for Free elements from awaiting status.
        /// </summary>
        /// <returns></returns>
        public bool UnblockWaitFree()
        {
            return QueUnblockWaitFree(hQue);
        }

        /// <summary>
        /// Turns out all application threads awaiting for Full elements from awaiting status.
        /// </summary>
        /// <returns></returns>
        public bool UnblockWaitFull()
        {
            return QueUnblockWaitFull(hQue);
        }

        /// <summary>
        /// Returns an elements with Free status from the queue.
        /// </summary>
        /// <param name="Milliseconds"></param>
        /// <param name="pPackets"></param>
        /// <param name="Count"></param>
        /// <returns></returns>
        public PSSDKRES GetFreeItems(uint Milliseconds, IntPtr[] pPackets, uint Count)
        { 
            return (PSSDKRES)QueGetFreeItems(hQue, Milliseconds, pPackets, Count);
        }

        /// <summary>
        /// Returns an elements with Free status back to the queue.
        /// </summary>
        /// <param name="pPackets"></param>
        /// <param name="Count"></param>
        public void ReturnFreeItems(IntPtr[] pPackets, uint Count)
        {
            QueReturnFreeItems(hQue, pPackets, Count);
        }

        /// <summary>
        /// Returns an elements with Full status from the queue.
        /// </summary>
        /// <param name="Milliseconds"></param>
        /// <param name="pPackets"></param>
        /// <param name="Count"></param>
        /// <returns></returns>
        public PSSDKRES GetFullItems(uint Milliseconds, IntPtr[] pPackets, uint Count)
        { 
            return (PSSDKRES)QueGetFullItems(hQue, Milliseconds, pPackets, Count);
        }

        /// <summary>
        /// Returns an element with Full status back to the queue.
        /// </summary>
        /// <param name="pPackets"></param>
        /// <param name="Count"></param>
        public void ReturnFullItems(IntPtr[] pPackets, uint Count)
        { 
            QueReturnFullItems(hQue, pPackets, Count);
        }

        #endregion

        #region HNQueque callbacks

        /// <summary>
        /// Tracks the creating of the internal queue thread
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        private void DoOnThreadBegin(IntPtr Param, ref IntPtr ThParam)
        {
            if (OnThreadBegin != null)
                OnThreadBegin(this, ref ThParam);
        }

        /// <summary>
        /// Tracks the closing of the internal component thread.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        private void DoOnThreadEnd(IntPtr Param, IntPtr ThParam)
        {
            if (OnThreadEnd != null)
                OnThreadEnd(this, ThParam);
        }

        /// <summary>
        /// Occurs in the queue thread context immediately after a packet has been received 
        /// by the network adapter and was enqueued for further processing.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hPacket"></param>
        /// <param name="pPacketData"></param>
        /// <param name="IncPacketSize"></param>
        private void DoOnPacketReceive(IntPtr Param, IntPtr ThParam, IntPtr hPacket, IntPtr pPacketData, uint IncPacketSize)
        {
            if (OnPacketReceive != null)
                OnPacketReceive(this, ThParam, hPacket, pPacketData, IncPacketSize);
        }

        /// <summary>
        /// Occurs in the queue thread context immediately after a packet has been received 
        /// by the network adapter and was enqueued for further processing.
        /// </summary>
        /// <param name="Param"></param>
        /// <param name="ThParam"></param>
        /// <param name="hPackets"></param>
        /// <param name="Count"></param>
        private void DoOnPacketsReceive(IntPtr Param, IntPtr ThParam, IntPtr[] hPackets, uint Count)
        {
            if (OnPacketsReceive != null)
                OnPacketsReceive(this, ThParam, hPackets, Count);
        }

        /// <summary>
        /// Tracks the releasing of the queue resources.
        /// </summary>
        /// <param name="Param"></param>
        private void DoOnDeleteItems(IntPtr Param)
        {
            if (OnDeleteItems != null)
                OnDeleteItems(this);
        }

        #endregion
    }
}
See also:HNQueue, All wrappers in one ZIP archive