// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.asn1;

import java.io.IOException;

public class DERTaggedObject extends ASN1TaggedObject
{
    public DERTaggedObject(final int n, final ASN1Encodable asn1Encodable) {
        super(true, n, asn1Encodable);
    }
    
    public DERTaggedObject(final int n, final int n2, final ASN1Encodable asn1Encodable) {
        super(true, n, n2, asn1Encodable);
    }
    
    public DERTaggedObject(final boolean b, final int n, final ASN1Encodable asn1Encodable) {
        super(b, n, asn1Encodable);
    }
    
    public DERTaggedObject(final boolean b, final int n, final int n2, final ASN1Encodable asn1Encodable) {
        super(b, n, n2, asn1Encodable);
    }
    
    DERTaggedObject(final int n, final int n2, final int n3, final ASN1Encodable asn1Encodable) {
        super(n, n2, n3, asn1Encodable);
    }
    
    @Override
    boolean encodeConstructed() {
        return this.isExplicit() || this.obj.toASN1Primitive().toDERObject().encodeConstructed();
    }
    
    @Override
    int encodedLength(final boolean b) throws IOException {
        final ASN1Primitive derObject = this.obj.toASN1Primitive().toDERObject();
        final boolean explicit = this.isExplicit();
        int encodedLength = derObject.encodedLength(explicit);
        if (explicit) {
            encodedLength += ASN1OutputStream.getLengthOfDL(encodedLength);
        }
        return encodedLength + (b ? ASN1OutputStream.getLengthOfIdentifier(this.tagNo) : 0);
    }
    
    @Override
    void encode(final ASN1OutputStream asn1OutputStream, final boolean b) throws IOException {
        final ASN1Primitive derObject = this.obj.toASN1Primitive().toDERObject();
        final boolean explicit = this.isExplicit();
        if (b) {
            int tagClass = this.tagClass;
            if (explicit || derObject.encodeConstructed()) {
                tagClass |= 0x20;
            }
            asn1OutputStream.writeIdentifier(true, tagClass, this.tagNo);
        }
        if (explicit) {
            asn1OutputStream.writeDL(derObject.encodedLength(true));
        }
        derObject.encode(asn1OutputStream.getDERSubStream(), explicit);
    }
    
    @Override
    ASN1Sequence rebuildConstructed(final ASN1Primitive asn1Primitive) {
        return new DERSequence(asn1Primitive);
    }
    
    @Override
    ASN1TaggedObject replaceTag(final int n, final int n2) {
        return new DERTaggedObject(this.explicitness, n, n2, this.obj);
    }
    
    @Override
    ASN1Primitive toDERObject() {
        return this;
    }
    
    @Override
    ASN1Primitive toDLObject() {
        return this;
    }
}
