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

package org.bouncycastle.asn1;

import java.io.IOException;

public class DLTaggedObject extends ASN1TaggedObject
{
    public DLTaggedObject(final int n, final ASN1Encodable asn1Encodable) {
        super(true, n, asn1Encodable);
    }
    
    public DLTaggedObject(final int n, final int n2, final ASN1Encodable asn1Encodable) {
        super(true, n, n2, asn1Encodable);
    }
    
    public DLTaggedObject(final boolean b, final int n, final ASN1Encodable asn1Encodable) {
        super(b, n, asn1Encodable);
    }
    
    public DLTaggedObject(final boolean b, final int n, final int n2, final ASN1Encodable asn1Encodable) {
        super(b, n, n2, asn1Encodable);
    }
    
    DLTaggedObject(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().toDLObject().encodeConstructed();
    }
    
    @Override
    int encodedLength(final boolean b) throws IOException {
        final ASN1Primitive dlObject = this.obj.toASN1Primitive().toDLObject();
        final boolean explicit = this.isExplicit();
        int encodedLength = dlObject.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 dlObject = this.obj.toASN1Primitive().toDLObject();
        final boolean explicit = this.isExplicit();
        if (b) {
            int tagClass = this.tagClass;
            if (explicit || dlObject.encodeConstructed()) {
                tagClass |= 0x20;
            }
            asn1OutputStream.writeIdentifier(true, tagClass, this.tagNo);
        }
        if (explicit) {
            asn1OutputStream.writeDL(dlObject.encodedLength(true));
        }
        dlObject.encode(asn1OutputStream.getDLSubStream(), explicit);
    }
    
    @Override
    ASN1Sequence rebuildConstructed(final ASN1Primitive asn1Primitive) {
        return new DLSequence(asn1Primitive);
    }
    
    @Override
    ASN1TaggedObject replaceTag(final int n, final int n2) {
        return new DLTaggedObject(this.explicitness, n, n2, this.obj);
    }
    
    @Override
    ASN1Primitive toDLObject() {
        return this;
    }
}
