1 /*
2  * @(#) $Id: ASN1Any.java,v 1.3 2003/07/08 08:13:52 pankaj Exp $
3  *
4  * Copyright (c) 2002-03 by Pankaj Kumar (http://www.pankaj-k.net). 
5  * All rights reserved.
6  *
7  * The license governing the use of this file can be found in the 
8  * root directory of the containing software.
9  */
10package org.jstk.asn1;
11
12import java.io.IOException;
13public class ASN1Any extends ASN1Type {
14    private ASN1Type instance = null;
15    public ASN1Any(){
16        super(UNIVERSAL, NONE, ANY, ANY);
17    }
18    public ASN1Any(byte tagClass, int taggingMethod, int tagNumber){
19        super(tagClass, taggingMethod, tagNumber, ANY);
20    }
21    public void decode(ASN1PullParser parser) throws ASN1PullParserException, IOException {
22        logger.entering(getClass().getName(), "decode");
23        int event = parser.next();
24        logger.fine("[ASN1Any.decode()] event = " + event + ", off = " + parser.getOffset() +
25            ", len = " + parser.getLength());
26        instance = createASN1Type(event, parser.getTagClass());
27        if (instance instanceof ASN1Any){
28            logger.fine("unknown type");
29            instance.setTagClass(parser.getTagClass());
30            instance.setTagNumber(parser.getTagNumber());
31            instance.setConsMask(parser.getConsMask());
32            instance.setValue(parser.getContent());
33            instance.setLength(parser.getLength());
34        } else {
35            logger.fine("known type");
36            parser.prev();  // backup
37            instance.decode(parser);
38        }
39        logger.exiting(getClass().getName(), "decode");
40    }
41
42    public byte[] encode(){
43        logger.entering(getClass().getName(), "encode");
44        byte[] bytes;
45        if (instance == null)
46            bytes = encode1();
47        else
48            bytes = instance.encode();
49        logger.exiting(getClass().getName(), "encode");
50        return bytes;
51    }
52
53    public void setInstance(ASN1Type instance){
54        this.instance = instance;
55    }
56
57    public static ASN1Type createASN1Type(int event, byte tagClass){
58        if (tagClass != UNIVERSAL)
59            return new ASN1Any();
60
61        switch (event){
62            case ASN1PullParser.BOOLEAN:
63                return new ASN1Boolean();
64            case ASN1PullParser.INTEGER:
65                return new ASN1Integer();
66            case ASN1PullParser.BIT_STRING:
67                return new ASN1BitString();
68            case ASN1PullParser.OCTET_STRING:
69                return new ASN1OctetString();
70            case ASN1PullParser.NULL:
71                return new ASN1Null();
72            case ASN1PullParser.OID:
73                return new ASN1Oid();
74            case ASN1PullParser.START_SEQ:
75                return new ASN1Seq();
76            case ASN1PullParser.START_SET:
77                return new ASN1Set();
78            case ASN1PullParser.PrintableString:
79                return new ASN1PrintableString();
80            case ASN1PullParser.IA5String:
81                return new ASN1IA5String();
82            case ASN1PullParser.UTCTime:
83                return new ASN1UTCTime();
84            default:
85                return new ASN1Any();
86        }
87    }
88
89    public String toString(){
90        if (instance == null)
91            return null;
92        return instance.toString();
93    }
94}