001package org.apache.commons.ssl.org.bouncycastle.asn1.pkcs;
002
003import java.util.Enumeration;
004
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
011import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
012import org.apache.commons.ssl.org.bouncycastle.asn1.BERSequence;
013import org.apache.commons.ssl.org.bouncycastle.asn1.BERTaggedObject;
014import org.apache.commons.ssl.org.bouncycastle.asn1.DLSequence;
015
016public class ContentInfo
017    extends ASN1Object
018    implements PKCSObjectIdentifiers
019{
020    private ASN1ObjectIdentifier contentType;
021    private ASN1Encodable content;
022    private boolean       isBer = true;
023
024    public static ContentInfo getInstance(
025        Object  obj)
026    {
027        if (obj instanceof ContentInfo)
028        {
029            return (ContentInfo)obj;
030        }
031
032        if (obj != null)
033        {
034            return new ContentInfo(ASN1Sequence.getInstance(obj));
035        }
036
037        return null;
038    }
039
040    private ContentInfo(
041        ASN1Sequence  seq)
042    {
043        Enumeration   e = seq.getObjects();
044
045        contentType = (ASN1ObjectIdentifier)e.nextElement();
046
047        if (e.hasMoreElements())
048        {
049            content = ((ASN1TaggedObject)e.nextElement()).getObject();
050        }
051
052        isBer = seq instanceof BERSequence;
053    }
054
055    public ContentInfo(
056        ASN1ObjectIdentifier contentType,
057        ASN1Encodable content)
058    {
059        this.contentType = contentType;
060        this.content = content;
061    }
062
063    public ASN1ObjectIdentifier getContentType()
064    {
065        return contentType;
066    }
067
068    public ASN1Encodable getContent()
069    {
070        return content;
071    }
072
073    /**
074     * Produce an object suitable for an ASN1OutputStream.
075     * <pre>
076     * ContentInfo ::= SEQUENCE {
077     *          contentType ContentType,
078     *          content
079     *          [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }
080     * </pre>
081     */
082    public ASN1Primitive toASN1Primitive()
083    {
084        ASN1EncodableVector v = new ASN1EncodableVector();
085
086        v.add(contentType);
087
088        if (content != null)
089        {
090            v.add(new BERTaggedObject(true, 0, content));
091        }
092
093        if (isBer)
094        {
095            return new BERSequence(v);
096        }
097        else
098        {
099            return new DLSequence(v);
100        }
101    }
102}