📄 snmpobject.cpp
字号:
case SNMP_SYNTAX_OID: case SNMP_SYNTAX_NSAPADDR:
case SNMP_SYNTAX_IPADDR:
case SNMP_SYNTAX_NULL:
case SNMP_SYNTAX_NOSUCHOBJECT:
case SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMP_SYNTAX_ENDOFMIBVIEW:
break;
}
}
__int64 SNMPObject::getValueAsInteger() const {
switch(_syntax) {
case SNMP_SYNTAX_INT:
return (__int64)getInt();
case SNMP_SYNTAX_OCTETS:
case SNMP_SYNTAX_OPAQUE:
case SNMP_SYNTAX_BITS:
if(_binary) {
int sz = 0;
char * pChar = getValueAsOctets(&sz);
if(pChar && sz) {
switch(sz) {
case 1: return (__int64)(char)*((char*)pChar);
case 2:
case 3: return (__int64)(short)ntohs(*((short*)pChar));
default: return (__int64)(long)ntohl(*((long*)pChar));
}
}
} else {
return (__int64)_atoi64(_string.c_str());
}
break;
case SNMP_SYNTAX_CNTR64:
case SNMP_SYNTAX_CNTR32:
case SNMP_SYNTAX_GAUGE32:
case SNMP_SYNTAX_UINT32:
case SNMP_SYNTAX_TIMETICKS:
return (__int64)getUInt();
case SNMP_SYNTAX_OID: case SNMP_SYNTAX_NSAPADDR:
case SNMP_SYNTAX_IPADDR:
case SNMP_SYNTAX_NULL:
case SNMP_SYNTAX_NOSUCHOBJECT:
case SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMP_SYNTAX_ENDOFMIBVIEW:
break;
}
return 0;
}
int SNMPObject::compareValue(SNMPObject * pOther) const
{
switch(_syntax) {
case SNMP_SYNTAX_OCTETS:
case SNMP_SYNTAX_OPAQUE:
case SNMP_SYNTAX_BITS:
case SNMP_SYNTAX_OID: case SNMP_SYNTAX_NSAPADDR:
case SNMP_SYNTAX_IPADDR:
return getValueAsString().compare(pOther->getValueAsString());
case SNMP_SYNTAX_INT:
if(getInt() < pOther->getInt()) {
return -1;
} else if(getInt() == pOther->getInt()) {
return 0;
} else {
return 1;
}
case SNMP_SYNTAX_CNTR64:
case SNMP_SYNTAX_CNTR32:
case SNMP_SYNTAX_GAUGE32:
case SNMP_SYNTAX_UINT32:
case SNMP_SYNTAX_TIMETICKS:
if(getUInt() < pOther->getUInt()) {
return -1;
} else if(getUInt() == pOther->getUInt()) {
return 0;
} else {
return 1;
}
case SNMP_SYNTAX_NULL:
case SNMP_SYNTAX_NOSUCHOBJECT:
case SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMP_SYNTAX_ENDOFMIBVIEW:
return 0;
}
return 0;
}
std::string SNMPObject::getDisplayInformation() const {
std::stringstream ss;
ss << getOID() << " = " << getValueAsString() << " [" << getSyntaxAsString() + "]";
return ss.str();
}
smiOID * SNMPObject::getBinaryOID() {
if(!_bInit) {
return NULL;
}
return &_oid;
}
std::string SNMPObject::getOID() const {
if(!_bInit) {
return "";
}
char szName[MAXOBJIDSTRSIZE+1];
szName[0] = szName[MAXOBJIDSTRSIZE] = '\0';
if(SnmpOidToStr (&_oid, sizeof(szName), szName) == SNMPAPI_FAILURE) {
SNMP_THROW_ERROR("Failed to convert OID to string", SnmpGetLastError(NULL), SNMP_ERROR);
}
return std::string(szName);
}
void SNMPObject::setSyntax(int syntax) {
switch(syntax) {
case SNMP_INT:
_syntax = SNMP_SYNTAX_INT; break;
case SNMP_OCTETS:
_syntax = SNMP_SYNTAX_OCTETS; break;
case SNMP_OPAQUE:
_syntax = SNMP_SYNTAX_OPAQUE; break;
case SNMP_BITS:
_syntax = SNMP_SYNTAX_BITS; break;
case SNMP_CNTR64:
_syntax = SNMP_SYNTAX_CNTR64; break;
case SNMP_CNTR32:
_syntax = SNMP_SYNTAX_CNTR32; break;
case SNMP_GAUGE32:
_syntax = SNMP_SYNTAX_GAUGE32; break;
case SNMP_TIMETICKS:
_syntax = SNMP_SYNTAX_TIMETICKS; break;
case SNMP_UINT32:
_syntax = SNMP_SYNTAX_UINT32; break;
case SNMP_OID:
_syntax = SNMP_SYNTAX_OID; break;
case SNMP_IPADDR:
_syntax = SNMP_SYNTAX_IPADDR; break;
default:
_syntax = SNMP_NULL; break;
}
}
int SNMPObject::getSyntax() const {
switch(_syntax) {
case SNMP_SYNTAX_INT:
return SNMP_INT;
case SNMP_SYNTAX_OCTETS:
return SNMP_OCTETS;
case SNMP_SYNTAX_OPAQUE:
return SNMP_OPAQUE;
case SNMP_SYNTAX_BITS:
return SNMP_BITS;
case SNMP_SYNTAX_CNTR64:
return SNMP_CNTR64;
case SNMP_SYNTAX_CNTR32:
return SNMP_CNTR32;
case SNMP_SYNTAX_GAUGE32:
return SNMP_GAUGE32;
case SNMP_SYNTAX_TIMETICKS:
return SNMP_TIMETICKS;
case SNMP_SYNTAX_UINT32:
return SNMP_UINT32;
case SNMP_SYNTAX_OID:
return SNMP_OID; case SNMP_SYNTAX_NSAPADDR:
case SNMP_SYNTAX_IPADDR:
return SNMP_IPADDR;
}
return SNMP_NULL;
}
std::string SNMPObject::getSyntaxAsString() const {
static char * _syntaxStrMap[12] = {
"Integer",
"Octets",
"Opaque",
"Bits",
"Counter64",
"Counter32",
"Gauge32",
"UnsignedInteger32",
"TimeTicks", "ObjectIdentifier",
"IPAddr",
"Null" };
return _syntaxStrMap[getSyntax()];
}
void SNMPObject::setValue(smiVALUE * smiVal)
{
_syntax = (DWORD)smiVal->syntax;
switch(smiVal->syntax) {
case SNMP_SYNTAX_INT:
setInt((__int64)smiVal->value.sNumber);
break;
case SNMP_SYNTAX_OCTETS:
case SNMP_SYNTAX_OPAQUE:
case SNMP_SYNTAX_BITS:
{
unsigned int i;
unsigned char cB;
bool binary = false;
for (i=0; i<smiVal->value.string.len; i++) {
cB = (unsigned char)smiVal->value.string.ptr[i]; if((cB < 0x20 && (cB != 0x0A && cB != 0x0D)) || cB > 0x7E) {
binary = true;
break;
}
}
_binary = binary;
if(binary) {
setOctets(smiVal->value.string.ptr, smiVal->value.string.len);
} else {
std::stringstream ss;
for (i=0; i<smiVal->value.string.len; i++) {
ss << (unsigned char)smiVal->value.string.ptr[i];
}
setString(ss.str());
}
}
break;
case SNMP_SYNTAX_CNTR64:
setUInt( (((unsigned __int64)(smiVal->value.hNumber.hipart)) << 32) | ((unsigned __int64)(smiVal->value.hNumber.lopart)) );
break;
case SNMP_SYNTAX_CNTR32:
case SNMP_SYNTAX_GAUGE32:
case SNMP_SYNTAX_TIMETICKS:
case SNMP_SYNTAX_UINT32:
setUInt((unsigned __int64)smiVal->value.uNumber);
break;
case SNMP_SYNTAX_OID:
{
char szName[MAXOBJIDSTRSIZE+1];
szName[0] = szName[MAXOBJIDSTRSIZE] = '\0';
if(SnmpOidToStr (&smiVal->value.oid, sizeof(szName), szName) == SNMPAPI_FAILURE) {
szName[0] = '\0';
}
setString(szName);
}
break;
case SNMP_SYNTAX_NSAPADDR:
case SNMP_SYNTAX_IPADDR:
{
unsigned int i;
std::stringstream ss;
for (i=0; i<smiVal->value.string.len; i++) {
ss << ((unsigned int)smiVal->value.string.ptr[i]);
if(i+1 < smiVal->value.string.len) {
ss << ".";
}
}
setString(ss.str());
}
break;
case SNMP_SYNTAX_NULL:
case SNMP_SYNTAX_NOSUCHOBJECT:
case SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMP_SYNTAX_ENDOFMIBVIEW:
default:
break;
}
}
void SNMPObject::getValue(smiVALUE * smiVal)
{
smiVal->syntax = (smiUINT32)_syntax;
switch(smiVal->syntax) {
case SNMP_SYNTAX_INT:
smiVal->value.sNumber = (smiINT)getInt();
break;
case SNMP_SYNTAX_OCTETS:
case SNMP_SYNTAX_OPAQUE:
case SNMP_SYNTAX_BITS:
{
int sz = 0;
char * pChar = getValueAsOctets(&sz);
smiVal->value.string.len = sz;
if(sz) {
smiVal->value.string.ptr = (smiLPBYTE)malloc(sz);
memcpy(smiVal->value.string.ptr, pChar, sz);
} else {
smiVal->value.string.ptr = NULL;
}
}
break;
case SNMP_SYNTAX_CNTR64:
smiVal->value.hNumber.hipart = (smiUINT32)((getUInt() >> 32) & 0x00000000FFFFFFFF);
smiVal->value.hNumber.lopart = (smiUINT32)(getUInt() & 0x00000000FFFFFFFF);
break;
case SNMP_SYNTAX_CNTR32:
case SNMP_SYNTAX_GAUGE32:
case SNMP_SYNTAX_TIMETICKS:
case SNMP_SYNTAX_UINT32:
smiVal->value.uNumber = (smiUINT32)getUInt();
break;
case SNMP_SYNTAX_OID:
SnmpStrToOid(_string.c_str(), &smiVal->value.oid);
break;
case SNMP_SYNTAX_NSAPADDR:
case SNMP_SYNTAX_IPADDR:
{
int i;
int sz = 0;
for (i=0; i<(int)_string.size(); i++) {
if(_string[i] == '.') {
sz++;
}
}
smiVal->value.string.ptr = (smiLPBYTE)malloc(sz);
smiVal->value.string.len = sz;
std::string aux;
int istore = 0;
for (i=0; i<(int)_string.size(); i++) {
if(_string[i] == '.') {
if(istore < sz) {
smiVal->value.string.ptr[istore] = (smiBYTE)atoi(aux.c_str());
}
aux = "";
istore++;
} else {
aux += _string[i];
}
}
if(istore < sz) {
smiVal->value.string.ptr[istore] = (smiBYTE)atoi(aux.c_str());
}
}
break;
case SNMP_SYNTAX_NULL:
case SNMP_SYNTAX_NOSUCHOBJECT:
case SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMP_SYNTAX_ENDOFMIBVIEW:
default:
smiVal->value.uNumber = 0;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -