Fixed enum cap values not read correctly (#33).

This commit is contained in:
soukoku
2015-02-03 18:31:40 -05:00
parent 38baf125a0
commit c3cd46e543
2 changed files with 116 additions and 15 deletions

View File

@@ -158,14 +158,14 @@ namespace NTwain
/// <value> /// <value>
/// The range minimum value. /// The range minimum value.
/// </value> /// </value>
public uint RangeMinValue { get; private set; } public object RangeMinValue { get; private set; }
/// <summary> /// <summary>
/// The most positive/least negative value of the range. /// The most positive/least negative value of the range.
/// </summary> /// </summary>
/// <value> /// <value>
/// The range maximum value. /// The range maximum value.
/// </value> /// </value>
public uint RangeMaxValue { get; private set; } public object RangeMaxValue { get; private set; }
/// <summary> /// <summary>
/// The delta between two adjacent values of the range. /// The delta between two adjacent values of the range.
/// e.g. Item2 - Item1 = StepSize; /// e.g. Item2 - Item1 = StepSize;
@@ -173,7 +173,7 @@ namespace NTwain
/// <value> /// <value>
/// The size of the range step. /// The size of the range step.
/// </value> /// </value>
public uint RangeStepSize { get; private set; } public object RangeStepSize { get; private set; }
#endregion #endregion
@@ -207,9 +207,103 @@ namespace NTwain
} }
break; break;
case ContainerType.Range: case ContainerType.Range:
for (var i = RangeMinValue; i >= RangeMinValue && i <= RangeMaxValue; i += RangeStepSize) // horrible cast but should work.
// in the for loop we also compare against min in case the step
// is parsed as negative number and causes infinite loop.
switch (ItemType)
{ {
toPopulate.Add(i); case Data.ItemType.Fix32:
{
var min = (TWFix32)RangeMinValue;
var counter = min;
var max = (TWFix32)RangeMaxValue;
var step = (TWFix32)RangeStepSize;
for (var i = min; i >= min && i <= max; i += step)
{
toPopulate.Add(i);
}
}
break;
case Data.ItemType.UInt32:
{
var min = (uint)RangeMinValue;
var counter = min;
var max = (uint)RangeMaxValue;
var step = (uint)RangeStepSize;
for (var i = min; i >= min && i <= max; i += step)
{
toPopulate.Add(i);
}
}
break;
case Data.ItemType.Int32:
{
var min = (int)RangeMinValue;
var counter = min;
var max = (int)RangeMaxValue;
var step = (int)RangeStepSize;
for (var i = min; i >= min && i <= max; i += step)
{
toPopulate.Add(i);
}
}
break;
// these should never happen since TW_ENUM fields are 4 bytes but you never know
case Data.ItemType.UInt16:
{
var min = (ushort)RangeMinValue;
var counter = min;
var max = (ushort)RangeMaxValue;
var step = (ushort)RangeStepSize;
for (var i = min; i >= min && i <= max; i += step)
{
toPopulate.Add(i);
}
}
break;
case Data.ItemType.Int16:
{
var min = (short)RangeMinValue;
var counter = min;
var max = (short)RangeMaxValue;
var step = (short)RangeStepSize;
for (var i = min; i >= min && i <= max; i += step)
{
toPopulate.Add(i);
}
}
break;
case Data.ItemType.UInt8:
{
var min = (byte)RangeMinValue;
var counter = min;
var max = (byte)RangeMaxValue;
var step = (byte)RangeStepSize;
for (var i = min; i >= min && i <= max; i += step)
{
toPopulate.Add(i);
}
}
break;
case Data.ItemType.Int8:
{
var min = (sbyte)RangeMinValue;
var counter = min;
var max = (sbyte)RangeMaxValue;
var step = (sbyte)RangeStepSize;
for (var i = min; i >= min && i <= max; i += step)
{
toPopulate.Add(i);
}
}
break;
} }
break; break;
} }
@@ -271,15 +365,22 @@ namespace NTwain
int offset = 0; int offset = 0;
ItemType = (ItemType)(ushort)Marshal.ReadInt16(baseAddr, offset); ItemType = (ItemType)(ushort)Marshal.ReadInt16(baseAddr, offset);
offset += 2; offset += 2;
RangeMinValue = (uint)Marshal.ReadInt32(baseAddr, offset);
offset += 4; RangeMinValue = baseAddr.ReadValue(ref offset, ItemType);
RangeMaxValue = (uint)Marshal.ReadInt32(baseAddr, offset); RangeMaxValue = baseAddr.ReadValue(ref offset, ItemType);
offset += 4; RangeStepSize = baseAddr.ReadValue(ref offset, ItemType);
RangeStepSize = (uint)Marshal.ReadInt32(baseAddr, offset); RangeDefaultValue = baseAddr.ReadValue(ref offset, ItemType);
offset += 4; RangeCurrentValue = baseAddr.ReadValue(ref offset, ItemType);
RangeDefaultValue = (uint)Marshal.ReadInt32(baseAddr, offset);
offset += 4; //RangeMinValue = (uint)Marshal.ReadInt32(baseAddr, offset);
RangeCurrentValue = (uint)Marshal.ReadInt32(baseAddr, offset); //offset += 4;
//RangeMaxValue = (uint)Marshal.ReadInt32(baseAddr, offset);
//offset += 4;
//RangeStepSize = (uint)Marshal.ReadInt32(baseAddr, offset);
//offset += 4;
//RangeDefaultValue = (uint)Marshal.ReadInt32(baseAddr, offset);
//offset += 4;
//RangeCurrentValue = (uint)Marshal.ReadInt32(baseAddr, offset);
return this; return this;
} }

View File

@@ -23,7 +23,7 @@ namespace NTwain
/// <summary> /// <summary>
/// The build release version number. /// The build release version number.
/// </summary> /// </summary>
public const string Build = "3.2.5"; // change this for each nuget release public const string Build = "3.2.6"; // change this for each nuget release
} }