Listing 1
protected string VbToString(ref SMIVALUE sval)
{
string val = "";
//
// Convert all types to a string value
//
switch (sval.type) {
//
// Standard 32 bit integer conversion
//
case SNMPAPI_SYNTAX.SNMP_SYNTAX_INT:
val = sval.val.sNumber.ToString();
break;
//
// Standard 32 bit unsigned integer conversion
//
case SNMPAPI_SYNTAX.SNMP_SYNTAX_UINT32:
case SNMPAPI_SYNTAX.SNMP_SYNTAX_CNTR32:
case SNMPAPI_SYNTAX.SNMP_SYNTAX_GAUGE32:
val = sval.val.uNumber.ToString();
break;
//
// Timeticks are in hundredths of a second (.01). We need to mul-
// tiply by ten to send ms (.001) to TimeSpan.
//
case SNMPAPI_SYNTAX.SNMP_SYNTAX_TIMETICKS:
val = TimeSpan.FromMilliseconds((long)sval.val.uNumber*10)
.ToString();
val = val.Substring(0, val.Length-4);
break;
//
// Standard 64 bit integer conversion
//
case SNMPAPI_SYNTAX.SNMP_SYNTAX_CNTR64:
val = sval.val.hNumber.ToString();
break;
//
// Byte array conversion. SNMP doesn't differentiate between
// ASCII and binary data, so we perform a check ourselves and
// convert binary data to ASCII (using ToBase64String, which is
// uuencode).
//
case SNMPAPI_SYNTAX.SNMP_SYNTAX_BITS:
case SNMPAPI_SYNTAX.SNMP_SYNTAX_OPAQUE:
case SNMPAPI_SYNTAX.SNMP_SYNTAX_OCTETS:
if (sval.val.str.size > 0) {
int i = 0;
byte[] bits = new byte[sval.val.str.size];
Marshal.Copy(sval.val.str.octets, bits, 0,
(int)sval.val.str.size);
for (i = 0; i < bits.Length; i++) {
if (char.IsControl((char)bits[i]) &&
(i < bits.Length-1 || bits[i] != 0)) {
val = Convert.ToBase64String(bits, 0, bits.Length);
break;
}
}
if (i == bits.Length)
val = Marshal.PtrToStringAnsi(sval.val.str.octets,
(int)sval.val.str.size);
SnmpAPI.SnmpFreeDescriptor
((int)sval.type, ref sval.val.str);
}
break;
//
// Ip Address conversion
//
case SNMPAPI_SYNTAX.SNMP_SYNTAX_NSAPADDR:
case SNMPAPI_SYNTAX.SNMP_SYNTAX_IPADDR:
IPAddress addr = new IPAddress((long)(UInt32)Marshal
.ReadIntPtr(sval.val.str.octets));
val = addr.ToString();
SnmpAPI.SnmpFreeDescriptor((int)sval.type, ref sval.val.str);
break;
//
// SNMP OID conversion
//
case SNMPAPI_SYNTAX.SNMP_SYNTAX_OID:
val = OidToString(ref sval.val.oid);
break;
//
// Catch the rest
//
case SNMPAPI_SYNTAX.SNMP_SYNTAX_NULL:
case SNMPAPI_SYNTAX.SNMP_SYNTAX_NOSUCHOBJECT:
case SNMPAPI_SYNTAX.SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMPAPI_SYNTAX.SNMP_SYNTAX_ENDOFMIBVIEW:
val = "(null)";
break;
}
return(val);
}