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

package org.bouncycastle.mime.smime;

import java.io.IOException;
import org.bouncycastle.util.io.TeeInputStream;
import org.bouncycastle.mime.CanonicalOutputStream;
import java.io.InputStream;
import org.bouncycastle.mime.MimeContext;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.util.io.TeeOutputStream;
import java.io.OutputStream;
import org.bouncycastle.mime.Headers;
import org.bouncycastle.mime.MimeParserContext;
import org.bouncycastle.operator.DigestCalculator;
import org.bouncycastle.mime.MimeMultipartContext;

public class SMimeMultipartContext implements MimeMultipartContext
{
    private final SMimeParserContext parserContext;
    private DigestCalculator[] calculators;
    
    public SMimeMultipartContext(final MimeParserContext mimeParserContext, final Headers headers) {
        this.parserContext = (SMimeParserContext)mimeParserContext;
        this.calculators = this.createDigestCalculators(headers);
    }
    
    DigestCalculator[] getDigestCalculators() {
        return this.calculators;
    }
    
    OutputStream getDigestOutputStream() {
        if (this.calculators.length == 1) {
            return this.calculators[0].getOutputStream();
        }
        OutputStream outputStream = this.calculators[0].getOutputStream();
        for (int i = 1; i < this.calculators.length; ++i) {
            outputStream = new TeeOutputStream(this.calculators[i].getOutputStream(), outputStream);
        }
        return outputStream;
    }
    
    private DigestCalculator[] createDigestCalculators(final Headers headers) {
        try {
            final String s = headers.getContentTypeAttributes().get("micalg");
            if (s == null) {
                throw new IllegalStateException("No micalg field on content-type header");
            }
            final String[] split = s.substring(s.indexOf(61) + 1).split(",");
            final DigestCalculator[] array = new DigestCalculator[split.length];
            for (int i = 0; i < split.length; ++i) {
                array[i] = this.parserContext.getDigestCalculatorProvider().get(new AlgorithmIdentifier(SMimeUtils.getDigestOID(SMimeUtils.lessQuotes(split[i]).trim())));
            }
            return array;
        }
        catch (final OperatorCreationException ex) {
            return null;
        }
    }
    
    @Override
    public MimeContext createContext(final int n) throws IOException {
        return new MimeContext() {
            @Override
            public InputStream applyContext(final Headers headers, final InputStream inputStream) throws IOException {
                if (n == 0) {
                    final OutputStream digestOutputStream = SMimeMultipartContext.this.getDigestOutputStream();
                    headers.dumpHeaders(digestOutputStream);
                    digestOutputStream.write(13);
                    digestOutputStream.write(10);
                    return new TeeInputStream(inputStream, new CanonicalOutputStream(SMimeMultipartContext.this.parserContext, headers, digestOutputStream));
                }
                return inputStream;
            }
        };
    }
    
    @Override
    public InputStream applyContext(final Headers headers, final InputStream inputStream) throws IOException {
        return inputStream;
    }
}
