ASN1Type.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @author Vladimir N. Molotkov, Stepan M. Mishura 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$ 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/ 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.security.asn1; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.internal.nls.Messages; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This abstract class is the super class for all ASN.1 types 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see <a href="http://asn1.elibel.tm.fr/en/standards/index.htm">ASN.1</a> 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class ASN1Type implements ASN1Constants { 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Integer representation of primitive identifier. 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int id; 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Integer representation of constructed identifier. 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int constrId; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a primitive, universal ASN.1 type. 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param tagNumber - ASN.1 tag number 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException - if tagNumber is invalid 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ASN1Type(int tagNumber) { 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(CLASS_UNIVERSAL, tagNumber); 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs an ASN.1 type. 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param tagClass - tag class. MUST be 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * CLASS_UNIVERSAL, CLASS_APPLICATION, CLASS_CONTEXTSPECIFIC, CLASS_PRIVATE 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param isConstructed - is ASN.1 type is a constructed type. 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param tagNumber - ASN.1 tag number. 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException - if tagClass or tagNumber is invalid 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ASN1Type(int tagClass, int tagNumber) { 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (tagNumber < 0) { 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Messages.getString("security.102")); //$NON-NLS-1$ 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (tagClass != CLASS_UNIVERSAL && tagClass != CLASS_APPLICATION 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && tagClass != CLASS_CONTEXTSPECIFIC 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && tagClass != CLASS_PRIVATE) { 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Messages.getString("security.103")); //$NON-NLS-1$ 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (tagNumber < 31) { 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // short form 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.id = tagClass + tagNumber; 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // long form 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException( 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Messages.getString("security.104")); //$NON-NLS-1$ 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.constrId = this.id + PC_CONSTRUCTED; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Stubs for DER 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Object decode(byte[] encoded) throws IOException { 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return decode(new DerInputStream(encoded)); 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Object decode(byte[] encoded, int offset, int encodingLen) 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return decode(new DerInputStream(encoded, offset, encodingLen)); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Object decode(InputStream in) throws IOException { 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return decode(new DerInputStream(in)); 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void verify(byte[] encoded) throws IOException { 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DerInputStream decoder = new DerInputStream(encoded); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project decoder.setVerify(); 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project decode(decoder); 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void verify(InputStream in) throws IOException { 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DerInputStream decoder = new DerInputStream(in); 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project decoder.setVerify(); 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project decode(decoder); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final byte[] encode(Object object) { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DerOutputStream out = new DerOutputStream(this, object); 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return out.encoded; 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Decode 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Decodes ASN.1 type. 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param in - 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * BER input stream 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException - 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an I/O error occurs or the end of the stream is reached 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract Object decode(BerInputStream in) throws IOException; 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Tests provided identifier. 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param identifier - 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * identifier to be verified 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return - true if identifier is associated with this ASN.1 type, 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise false 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean checkTag(int identifier); 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates decoded object. 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Derived classes should override this method to provide creation for a 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * selected class of objects during decoding. 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The default implementation returns an object created by decoding stream. 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param - 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * input stream 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return - created object 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //FIXME make me public 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Object getDecodedObject(BerInputStream in) throws IOException { 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return in.content; 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Encode 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Encodes ASN.1 type. 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param out - BER output stream 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void encodeASN(BerOutputStream out); 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void encodeContent(BerOutputStream out); 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setEncodingContent(BerOutputStream out); 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getEncodedLength(BerOutputStream out) { //FIXME name 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //tag length 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int len = 1; //FIXME tag length = 1. what about long form? 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //for (; tag > 0; tag = tag >> 8, len++); 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // length length :-) 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project len++; 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (out.length > 127) { 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project len++; 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int cur = out.length >> 8; cur > 0; len++) { 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cur = cur >> 8; 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project len += out.length; 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return len; 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // TODO decide whether this method is necessary 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //FIXME fix performance 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this.getClass().getName() + "(tag: 0x" //$NON-NLS-1$ 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + Integer.toHexString(0xff & this.id) + ")"; //$NON-NLS-1$ 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 215