 |
|
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
}
}
|