int wpdu::restore_vbs(Pdu& pdu, const snmp_pdu *raw_pdu) const { Vb tempvb; Oid tempoid; struct variable_list *vp; for(vp = raw_pdu->variables; vp; vp = vp->next_variable) { // extract the oid portion tempoid.set_data( (unsigned long *)vp->name, ( unsigned int) vp->name_length); tempvb.set_oid( tempoid); // extract the value portion switch(vp->type) { // octet string case sNMP_SYNTAX_OCTETS: case sNMP_SYNTAX_OPAQUE: { OctetStr octets( (char *) vp->val.string, (long) vp->val_len); tempvb.set_value( octets); } break; // object id case sNMP_SYNTAX_OID: { Oid oid( (unsigned long*) vp->val.objid, (int) vp->val_len); tempvb.set_value( oid); } break; // timeticks case sNMP_SYNTAX_TIMETICKS: { TimeTicks timeticks( (unsigned long) *(vp->val.integer)); tempvb.set_value( timeticks); } break; // Gauge32 case sNMP_SYNTAX_GAUGE32: { Gauge32 gauge32( (unsigned long) *(vp->val.integer)); tempvb.set_value( gauge32); } break; // 32 bit counter case sNMP_SYNTAX_CNTR32: { Counter32 counter32( (unsigned long) *(vp->val.integer)); tempvb.set_value( counter32); } break; // ip address case sNMP_SYNTAX_IPADDR: { char buffer[20]; ACE_OS::sprintf( buffer,"%d.%d.%d.%d", vp->val.string[0], vp->val.string[1], vp->val.string[2], vp->val.string[3]); IpAddress ipaddress( buffer); tempvb.set_value( ipaddress); } break; // 32 bit integer case sNMP_SYNTAX_INT: { SnmpInt32 int32( (long) *(vp->val.integer)); tempvb.set_value( int32); } break; // 32 bit unsigned integer case sNMP_SYNTAX_UINT32: { SnmpUInt32 uint32( (unsigned long) *(vp->val.integer)); tempvb.set_value( uint32); } break; // v2 counter 64's case sNMP_SYNTAX_CNTR64: break; case sNMP_SYNTAX_NULL: tempvb.set_null(); break; // v2 vb exceptions case sNMP_SYNTAX_NOSUCHOBJECT: case sNMP_SYNTAX_NOSUCHINSTANCE: case sNMP_SYNTAX_ENDOFMIBVIEW: set_exception_status( &tempvb, vp->type); break; default: tempvb.set_null(); } // end switch // append the vb to the pdu pdu += tempvb; } return 0; }
static void VbTest() { #if !defined (ACE_WIN32) Vb v1; ACE_ASSERT(v1.valid() == 0); ACE_DEBUG ((LM_DEBUG, "(%P|%t) VarBinad:v1(\"/\") [%s]\n", v1.to_string())); // purpose of this routine?? set_exception_status( &v1, 10); Vb v2(v1); ACE_ASSERT(v2.valid() == 0); Oid o1("1.2.3"), o2; v2.set_oid(o1); ACE_DEBUG ((LM_DEBUG, "(%P|%t) VarBinad:v2(\"1.2.3/\") [%s]\n", v2.to_string())); v2.get_oid(o2); ACE_ASSERT(o2 == o1); ACE_ASSERT(v2.valid() == 0); v2.set_null(); ACE_ASSERT(v2.valid() == 0); v2.get_oid(o2); Vb v3; TimeTicks t(0), t1; v3.set_oid(o1); v3.set_value(t); ACE_ASSERT(v3.valid() == 1); v3.get_value(t1); ACE_ASSERT(t == t1); Vb v4; v4.set_oid(o1); v4.set_value(o1); ACE_ASSERT(v4.valid() == 1); v4.get_value(o2); ACE_ASSERT(o1 == o2); Vb v5; Counter32 c1(12), c2; v5.set_oid(o1); v5.set_value(c1); ACE_ASSERT(v5.valid() == 1); v5.get_value(c2); ACE_ASSERT(c1 == c2); Vb v6; Counter64 c3(12345678901234ULL), c4; v6.set_oid(o1); v6.set_value(c3); ACE_ASSERT(v6.valid() == 1); v6.get_value(c4); ACE_ASSERT(c3 == c4); Vb v7; Gauge32 g1(0123456), g2; v7.set_oid(o1); v7.set_value(g1); ACE_ASSERT(v7.valid() == 1); v7.get_value(g2); ACE_ASSERT(g1 == g2); Vb v8; SnmpInt32 i1(0123456), i2; v8.set_oid(o1); v8.set_value(i1); ACE_ASSERT(v8.valid() == 1); v8.get_value(i2); ACE_ASSERT(i1 == i2); Vb v9; SnmpUInt32 u1(0123456), u2; v9.set_oid(o1); v9.set_value(u1); ACE_ASSERT(v9.valid() == 1); v9.get_value(u2); ACE_ASSERT(u1 == u2); Vb v10; OctetStr s1(" abcdefghighlmnopqrstuvwxyz!@#$%^&*()"), s2; v10.set_oid(o1); v10.set_value(s1); ACE_ASSERT(v10.valid() == 1); v10.get_value(s2); ACE_ASSERT(s1 == s2); ACE_ASSERT(s1.length() == s2.length()); // test assignment over all datatypes v10 = v5; ACE_ASSERT(v10 == v5); Vb v11(o1, s1, SNMP_CLASS_SUCCESS); ACE_ASSERT(v11.valid() == 1); v11.get_oid(o2); ACE_ASSERT(o1 == o2); v11.get_value(s2); ACE_ASSERT(s1 == s2); #endif /*if ACE_WIN32*/ }