package dmg.protocols.snmp ; /** * The SnmpObject is the basice snmp datatype which offers * a static method to create all Snmp Version 1 data types * out of the byte stream represeting an snmp request or * response. In addition it enforces all extending SnmpXXX * classes to implement 'getSnmpBytes' which decodes the * internal representation into the network representation. * See <a href=guide/Guide-dmg.snmp.html>Guide to dmg.snmp</a> * for more informations. * * * * @author Patrick Fuhrmann * @version 0.1, 15 Feb 1998 * */ abstract class SnmpObject { private int _codedLength; abstract byte [] getSnmpBytes() ; public static SnmpObject generate( byte [] b , int offIn , int len ) throws NumberFormatException { SnmpObjectHeader header = new SnmpObjectHeader( b , offIn , len ) ; SnmpObject snmp; switch( header.getType() ){ case SnmpObjectHeader.OBJECT_IDENTIFIER : snmp = new SnmpOID( header , b , offIn , len ) ; break ; case SnmpObjectHeader.NULL : snmp = new SnmpNull( header , b , offIn , len ) ; break ; case SnmpObjectHeader.IpAddress : snmp = new SnmpIpNumber( header , b , offIn , len ) ; break ; case SnmpObjectHeader.TimeTicks : snmp = new SnmpTimeTicks( header , b , offIn , len ) ; break ; case SnmpObjectHeader.INTEGER : case SnmpObjectHeader.Counter : case SnmpObjectHeader.Gauge : case SnmpObjectHeader.Opaque : snmp = new SnmpInteger( header , b , offIn , len ) ; break ; case SnmpObjectHeader.OCTET_STRING : snmp = new SnmpOctetString( header , b , offIn , len ) ; break ; case SnmpObjectHeader.SEQUENCE : snmp = new SnmpSequence( header , b , offIn , len ) ; break ; case SnmpObjectHeader.GetRequest : snmp = new SnmpGetRequest( header , b , offIn , len ) ; break ; case SnmpObjectHeader.GetNextRequest : snmp = new SnmpGetNextRequest( header , b , offIn , len ) ; break ; case SnmpObjectHeader.SetRequest : snmp = new SnmpSetRequest( header , b , offIn , len ) ; break ; case SnmpObjectHeader.GetResponse : snmp = new SnmpGetResponse( header , b , offIn , len ) ; break ; case SnmpObjectHeader.Trap : snmp = new SnmpTrap( header , b , offIn , len ) ; break ; default : throw new NumberFormatException() ; } return snmp ; } public int getCodedLength(){ return _codedLength ; } public void setCodedLength( int len ){ _codedLength = len ; } public static void main( String [] args ){ if( args.length == 0 ) { System.exit(4); } byte [] b = new byte[args.length] ; int x ; for( int i = 0 ; i < args.length ; i++ ){ x = Integer.valueOf(args[i], 16); x &= 0xff ; x = x > 127 ? ( x - 256 ) : x ; b[i] = (byte)(x > 127 ? ( x - 256 ) : x ) ; } String output = SnmpObjectHeader._print( b , 0 , b.length ) ; System.out.println( output ) ; SnmpObject snmp = SnmpObject.generate( b , 0 , b.length ) ; System.out.println( " Got class : "+snmp.getClass().getName() ) ; System.out.println( " CodeLength : "+snmp.getCodedLength() ) ; System.out.println(" Value : \n" + snmp) ; b = snmp.getSnmpBytes() ; output = SnmpObjectHeader._print( b , 0 , b.length ) ; System.out.println( output ) ; // snmp = new SnmpOID( snmp.toString() ) ; // b = snmp.getSnmpBytes() ; // output = SnmpObjectHeader._print( b , 0 , b.length ) ; // System.out.println( output ) ; } }