diff --git a/NTwain/CapabilityReader.cs b/NTwain/CapabilityReader.cs index 411f3ac..7fa6275 100644 --- a/NTwain/CapabilityReader.cs +++ b/NTwain/CapabilityReader.cs @@ -158,14 +158,14 @@ namespace NTwain /// /// The range minimum value. /// - public uint RangeMinValue { get; private set; } + public object RangeMinValue { get; private set; } /// /// The most positive/least negative value of the range. /// /// /// The range maximum value. /// - public uint RangeMaxValue { get; private set; } + public object RangeMaxValue { get; private set; } /// /// The delta between two adjacent values of the range. /// e.g. Item2 - Item1 = StepSize; @@ -173,7 +173,7 @@ namespace NTwain /// /// The size of the range step. /// - public uint RangeStepSize { get; private set; } + public object RangeStepSize { get; private set; } #endregion @@ -207,9 +207,103 @@ namespace NTwain } break; 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; } @@ -271,15 +365,22 @@ namespace NTwain int offset = 0; ItemType = (ItemType)(ushort)Marshal.ReadInt16(baseAddr, offset); offset += 2; - RangeMinValue = (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); + + RangeMinValue = baseAddr.ReadValue(ref offset, ItemType); + RangeMaxValue = baseAddr.ReadValue(ref offset, ItemType); + RangeStepSize = baseAddr.ReadValue(ref offset, ItemType); + RangeDefaultValue = baseAddr.ReadValue(ref offset, ItemType); + RangeCurrentValue = baseAddr.ReadValue(ref offset, ItemType); + + //RangeMinValue = (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; } diff --git a/NTwain/Properties/VersionInfo.cs b/NTwain/Properties/VersionInfo.cs index ee88a57..9c94307 100644 --- a/NTwain/Properties/VersionInfo.cs +++ b/NTwain/Properties/VersionInfo.cs @@ -23,7 +23,7 @@ namespace NTwain /// /// The build release version number. /// - 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 }