package dmg.protocols.snmp ; import java.util.StringTokenizer; /** * * * @author Patrick Fuhrmann * @version 0.1, 15 Feb 1998 */ public class SnmpOID extends SnmpObject { private int [] _array; private int _arrayLength; SnmpOID( SnmpObjectHeader head , byte [] b , int offIn , int maxLen ){ int off = offIn + head.getCodedLength() ; int len = head.getLength() ; _array = new int[len+1] ; int x = b[off++] ; int resPos = 0 ; x = ( x < 0 ) ? ( x + 256 ) : x ; _array[resPos++] = (x / 40) ; _array[resPos++] = (x % 40) ; int res = 0 ; for( int i = 1 ; i < len ; i++ ){ x = b[off++] ; x = ( x < 0 ) ? ( x + 256 ) : x ; if( ( x & 0x80 ) > 0 ){ res |= ( x & 0x7f ) ; res <<= 7 ; }else{ res |= ( x & 0x7f ) ; _array[resPos++] = (res) ; res = 0 ; } } _arrayLength = resPos ; setCodedLength( head.getCodedLength() + len ) ; } public SnmpOID( int [] vector ){ _arrayLength = vector.length ; _array = new int[_arrayLength] ; System.arraycopy( vector , 0 , _array , 0 , _arrayLength ) ; } public SnmpOID( String str ) throws NumberFormatException { StringTokenizer st = new StringTokenizer( str , "." ) ; int len = st.countTokens() ; if( len < 3 ) { throw new NumberFormatException(); } _arrayLength = len ; _array = new int[_arrayLength] ; for( int i = 0 ; i < _arrayLength ; i++ ){ _array[i] = Integer.parseInt(st.nextToken()); } } public int [] getVector(){ int [] v = new int[_arrayLength] ; System.arraycopy( _array , 0 , v , 0 , _arrayLength ) ; return v ; } @Override public byte [] getSnmpBytes(){ byte [] b = new byte[2*_arrayLength] ; int x = _array[0] * 40 + _array[1] ; int off = 0 ; b[off++] = (byte)(( x > 127 ) ? ( x - 256 ) : x ) ; int y; boolean begin; for( int i = 2 ; i < _arrayLength ; i++ ){ x = _array[i] ; begin = false ; for( int j = 3 ; j >= 0 ; j-- ){ y = ( x >> ( j * 7 ) ) & 0x7f ; if( ( ! begin ) && ( y == 0 ) ) { continue; } begin = true ; if( j != 0 ) { y |= 0x80; } b[off++] = (byte)(( y > 127 ) ? ( y - 256 ) : y ) ; } if( ! begin ) { b[off++] = (byte) 0; } } // System.out.println( SnmpObjectHeader._print(b,0,off)); SnmpObjectHeader head = new SnmpObjectHeader( SnmpObjectHeader.OBJECT_IDENTIFIER , off ) ; int headLen = head.getCodedLength() ; byte [] out = new byte[headLen+off] ; System.arraycopy( head.getSnmpBytes() , 0 , out , 0 , headLen ) ; System.arraycopy( b , 0 , out , headLen , off ) ; return out ; } public String toString(){ if( ( _array == null ) || ( _arrayLength == 0 ) ) { return "Null"; } StringBuilder sb = new StringBuilder(); for( int i = 0 ; i < _arrayLength ; i++ ){ sb.append("").append(_array[i]); if( i < (_arrayLength-1) ) { sb.append('.'); } } return sb.toString() ; } }