1ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpackage com.android.hotspot2.asn1;
2ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
3ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.nio.ByteBuffer;
4ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistimport java.util.*;
5ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
6ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvistpublic class Asn1Constructed extends Asn1Object {
7ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private final int mTagPosition;
8ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private final List<Asn1Object> mChildren;
9ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
10ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public Asn1Constructed(int tag, Asn1Class asn1Class, int length,
11ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                           ByteBuffer payload, int tagPosition) {
12ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        super(tag, asn1Class, true, length, payload);
13ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mTagPosition = tagPosition;
14ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mChildren = new ArrayList<>();
15ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
16ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
17ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public void addChild(Asn1Object object) {
18ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        mChildren.add(object);
19ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
20ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
21ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    @Override
22ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public Collection<Asn1Object> getChildren() {
23ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return Collections.unmodifiableCollection(mChildren);
24ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
25ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
26ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public ByteBuffer getEncoding() {
27ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return getPayload(mTagPosition);
28ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
29ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
30ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    private void toString(int level, StringBuilder sb) {
31ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        sb.append(indent(level)).append(super.toString()).append(":\n");
32ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        for (Asn1Object child : mChildren) {
33ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            if (child.isConstructed()) {
34ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                ((Asn1Constructed) child).toString(level + 1, sb);
35ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            } else {
36ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist                sb.append(indent(level + 1)).append(child.toString()).append('\n');
37ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist            }
38ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        }
39ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
40ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
41ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public static String indent(int level) {
42ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        char[] indent = new char[level * 2];
43ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        Arrays.fill(indent, ' ');
44ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return new String(indent);
45ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
46ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist
47ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    @Override
48ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    public String toString() {
49ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        StringBuilder sb = new StringBuilder();
50ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        toString(0, sb);
51ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist        return sb.toString();
52ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist    }
53ee699a61a5687d7c8518b639a940c8e9d1b384ddJan Nordqvist}
54