/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Nam Nguyen */ package com.caucho.server.snmp.types; /* * SNMP type */ abstract public class SnmpValue { public static final int EOC = 0x00; public static final int INTEGER = 0x02; public static final int OCTET_STRING = 0x04; public static final int NULL = 0x05; public static final int OBJECT_IDENTIFIER = 0x06; public static final int SEQUENCE = 0x30; public static final int IP_ADDRESS = 0x40; public static final int COUNTER = 0x41; public static final int GAUGE = 0x42; public static final int TIME_TICKS = 0x43; public static final int OPAQUE = 0x44; public static final int GET_REQUEST_PDU = 0xA0; public static final int GET_NEXT_REQUEST_PDU = 0xA1; public static final int GET_RESPONSE_PDU = 0xA2; public static final int SET_REQUEST_PDU = 0xA3; public static final int TRAP_PDU = 0xA4; abstract public void toAsn1(StringBuilder sb); abstract public int getType(); public static SnmpValue create(Object obj) { if (obj instanceof Number) return new IntegerValue(((Number) obj).intValue()); else if (obj instanceof Boolean) return new IntegerValue(((Boolean) obj).booleanValue() ? 1 : 0); else return new OctetStringValue(obj.toString()); } public static SnmpValue create(Object obj, String typeStr) { if (typeStr == null) return create(obj); int type = SnmpValue.OCTET_STRING; if (typeStr.equalsIgnoreCase("INTEGER")) type = INTEGER; else if (typeStr.equalsIgnoreCase("TIME_TICKS")) type = TIME_TICKS; else if (typeStr.equalsIgnoreCase("GAUGE")) type = GAUGE; else if (typeStr.equalsIgnoreCase("COUNTER")) type = COUNTER; else if (typeStr.equalsIgnoreCase("OBJECT_IDENTIFIER")) type = OBJECT_IDENTIFIER; return create(obj, type); } public static SnmpValue create(Object obj, int type) { if (obj == null) { return new NullValue(); } else if (obj instanceof Number) { switch (type) { case INTEGER: return new IntegerValue(((Number) obj).intValue()); case COUNTER: return new CounterValue(((Number) obj).longValue()); case GAUGE: return new GaugeValue(((Number) obj).longValue()); case TIME_TICKS: // time ticks are in hundredths of a second return new TimeTicksValue(((Number) obj).longValue() / 10); } } switch (type) { case OBJECT_IDENTIFIER: return new ObjectIdentifierValue(obj.toString()); case IP_ADDRESS: return new IpAddressValue(obj.toString()); } return new OctetStringValue(obj.toString()); } public final String toAsn1() { StringBuilder sb = new StringBuilder(); toAsn1(sb); return sb.toString(); } final protected void header(StringBuilder sb, int len) { sb.append((char) getType()); if (len < 0x7F) { sb.append((char) len); return; } int bytes = 1; if ((len >> 24) > 0) bytes = 4; else if ((len >> 16) > 0) bytes = 3; else if ((len >> 8) > 0) bytes = 2; // size of length field sb.append((char) (0x80 | bytes)); while (bytes > 0) { switch (bytes) { case 1: sb.append((char) (len & 0xFF)); break; case 2: sb.append((char) ((len >> 8) & 0xFF)); break; case 3: sb.append((char) ((len >> 16) & 0xFF)); break; case 4: sb.append((char) ((len >> 24) & 0xFF)); break; } bytes--; } } public long getLong() { throw new UnsupportedOperationException(); } public String getString() { throw new UnsupportedOperationException(); } public static String typeName(int identifier) { switch(identifier) { case EOC: return "EOC"; case INTEGER: return "INTEGER"; case OCTET_STRING: return "OCTET_STRING"; case NULL: return "NULL"; case OBJECT_IDENTIFIER: return "OBJECT_IDENTIFIER"; case SEQUENCE: return "SEQUENCE"; case IP_ADDRESS: return "IP_ADDRESS"; case COUNTER: return "COUNTER"; case GAUGE: return "GAUGE"; case TIME_TICKS: return "TIME_TICKS"; case OPAQUE: return "OPAQUE"; case GET_REQUEST_PDU: return "GET_REQUEST_PDU"; case GET_NEXT_REQUEST_PDU: return "GET_NEXT_REQUEST_PDU"; case GET_RESPONSE_PDU: return "GET_RESPONSE_PDU"; case SET_REQUEST_PDU: return "SET_REQUEST_PDU"; case TRAP_PDU: return "TRAP_PDU"; default: return "UNKNOWN"; } } }