1package com.android.hotspot2.asn1;
2
3import java.nio.ByteBuffer;
4import java.util.Collection;
5
6public abstract class Asn1Object {
7    private final int mTag;
8    private final Asn1Class mClass;
9    private final boolean mConstructed;
10    private final int mLength;
11    private final ByteBuffer mPayload;
12
13    protected Asn1Object(int tag, Asn1Class asn1Class, boolean constructed, int length) {
14        this(tag, asn1Class, constructed, length, null);
15    }
16
17    protected Asn1Object(int tag, Asn1Class asn1Class, boolean constructed,
18                         int length, ByteBuffer payload) {
19        mTag = tag;
20        mClass = asn1Class;
21        mConstructed = constructed;
22        mLength = length;
23        mPayload = payload != null ? payload.duplicate() : null;
24    }
25
26    public int getTag() {
27        return mTag;
28    }
29
30    public Asn1Class getAsn1Class() {
31        return mClass;
32    }
33
34    public boolean isConstructed() {
35        return mConstructed;
36    }
37
38    public boolean isIndefiniteLength() {
39        return mLength == Asn1Decoder.IndefiniteLength;
40    }
41
42    public int getLength() {
43        return mLength;
44    }
45
46    public ByteBuffer getPayload() {
47        return mPayload != null ? mPayload.duplicate() : null;
48    }
49
50    protected ByteBuffer getPayload(int position) {
51        if (mPayload == null) {
52            return null;
53        }
54        ByteBuffer encoding = mPayload.duplicate();
55        encoding.position(position);
56        return encoding;
57    }
58
59    protected void setEndOfData(int position) {
60        mPayload.limit(position);
61    }
62
63    protected int getEndOfData() {
64        return mPayload.limit();
65    }
66
67    public boolean matches(Asn1ID id) {
68        return mTag == id.getTag() && mClass == id.getAsn1Class();
69    }
70
71    public String toSimpleString() {
72        Asn1Tag tag = mClass == Asn1Class.Universal ? Asn1Decoder.mapTag(mTag) : null;
73        if (tag != null) {
74            return tag.name();
75        } else if (mClass == Asn1Class.Universal) {
76            return String.format("[%d]", mTag);
77        } else {
78            return String.format("[%s %d]", mClass, mTag);
79        }
80    }
81
82    public abstract Collection<Asn1Object> getChildren();
83
84    @Override
85    public String toString() {
86        return toSimpleString();
87    }
88}
89