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

package org.bouncycastle.asn1;

import java.io.IOException;

public class BEROctetString extends ASN1OctetString
{
    private static final int DEFAULT_SEGMENT_LIMIT = 1000;
    private final int segmentLimit;
    private final ASN1OctetString[] elements;
    
    static byte[] flattenOctetStrings(final ASN1OctetString[] array) {
        final int length = array.length;
        switch (length) {
            case 0: {
                return BEROctetString.EMPTY_OCTETS;
            }
            case 1: {
                return array[0].string;
            }
            default: {
                int n = 0;
                for (int i = 0; i < length; ++i) {
                    n += array[i].string.length;
                }
                final byte[] array2 = new byte[n];
                int j = 0;
                int n2 = 0;
                while (j < length) {
                    final byte[] string = array[j].string;
                    System.arraycopy(string, 0, array2, n2, string.length);
                    n2 += string.length;
                    ++j;
                }
                return array2;
            }
        }
    }
    
    public BEROctetString(final byte[] array) {
        this(array, 1000);
    }
    
    public BEROctetString(final ASN1OctetString[] array) {
        this(array, 1000);
    }
    
    public BEROctetString(final byte[] array, final int n) {
        this(array, null, n);
    }
    
    public BEROctetString(final ASN1OctetString[] array, final int n) {
        this(flattenOctetStrings(array), array, n);
    }
    
    private BEROctetString(final byte[] array, final ASN1OctetString[] elements, final int segmentLimit) {
        super(array);
        this.elements = elements;
        this.segmentLimit = segmentLimit;
    }
    
    @Override
    boolean encodeConstructed() {
        return true;
    }
    
    @Override
    int encodedLength(final boolean b) throws IOException {
        int n = b ? 4 : 3;
        if (null != this.elements) {
            for (int i = 0; i < this.elements.length; ++i) {
                n += this.elements[i].encodedLength(true);
            }
        }
        else {
            final int n2 = this.string.length / this.segmentLimit;
            n += n2 * DEROctetString.encodedLength(true, this.segmentLimit);
            final int n3 = this.string.length - n2 * this.segmentLimit;
            if (n3 > 0) {
                n += DEROctetString.encodedLength(true, n3);
            }
        }
        return n;
    }
    
    @Override
    void encode(final ASN1OutputStream asn1OutputStream, final boolean b) throws IOException {
        asn1OutputStream.writeIdentifier(b, 36);
        asn1OutputStream.write(128);
        if (null != this.elements) {
            asn1OutputStream.writePrimitives(this.elements);
        }
        else {
            int min;
            for (int i = 0; i < this.string.length; i += min) {
                min = Math.min(this.string.length - i, this.segmentLimit);
                DEROctetString.encode(asn1OutputStream, true, this.string, i, min);
            }
        }
        asn1OutputStream.write(0);
        asn1OutputStream.write(0);
    }
}
