/*
* Created by SharpDevelop.
* User: lextm
* Date: 2008/7/25
* Time: 20:41
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Collections.Generic;
namespace Lextm.SharpSnmpLib.Mib.Elements.Types
{
///
/// The INTEGER type represents a list of alternatives, or a range of numbers..
/// Includes Integer32 as it's indistinguishable from INTEGER.
///
/**
* As this type is used for Integer32 as well as INTEGER it incorrectly
* allows enumeration sub-typing of Integer32. This is ok as currently we
* do not care about detecting incorrect MIBs and this doesn't block the
* decoding of correct MIBs.
*/
public sealed class IntegerType : BaseType
{
public enum Types
{
Integer,
Integer32
}
private Types _type;
private bool _isEnumeration;
private ValueMap _map;
private ValueRanges _ranges;
///
/// Creates an instance.
///
///
///
///
public IntegerType(IModule module, string name, Symbol type, ISymbolEnumerator symbols)
: base (module, name)
{
Types? t = GetExactType(type);
type.Assert(t.HasValue, "Unknown symbol for unsigned type!");
_type = t.Value;
_isEnumeration = false;
Symbol current = symbols.NextNonEOLSymbol();
if (current == Symbol.OpenBracket)
{
_isEnumeration = true;
symbols.PutBack(current);
_map = Lexer.DecodeEnumerations(symbols);
}
else if (current == Symbol.OpenParentheses)
{
symbols.PutBack(current);
_ranges = Lexer.DecodeRanges(symbols);
current.Assert(!_ranges.IsSizeDeclaration, "SIZE keyword is not allowed for ranges of integer types!");
}
else
{
symbols.PutBack(current);
}
}
public Types Type
{
get { return _type; }
}
public ValueRanges Ranges
{
get { return _ranges; }
}
public bool IsEnumeration
{
get
{
return _isEnumeration;
}
}
public ValueMap Enumeration
{
get { return _isEnumeration ? _map : null; }
}
internal static Types? GetExactType(Symbol symbol)
{
if (symbol == Symbol.Integer)
{
// represents the ASN.1 builtin INTEGER type:
// may be represent any arbitrary (signed/unsigned) integer (in theory may have any size)
return Types.Integer;
}
else if (symbol == Symbol.Integer32)
{
// Integer32 ::= INTEGER (-2147483648..2147483647) // from SNMPv2-SMI
return Types.Integer32;
}
return null;
}
internal static bool IsIntegerType(Symbol symbol)
{
return GetExactType(symbol).HasValue;
}
}
}