# PDEmbeddedFile.java

    /*
     * Licensed to the Apache Software Foundation (ASF) under one or more
     * contributor license agreements.  See the NOTICE file distributed with
     * this work for additional information regarding copyright ownership.
     * The ASF licenses this file to You under the Apache License, Version 2.0
     * (the "License"); you may not use this file except in compliance with
     * the License.  You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    package org.apache.pdfbox.pdmodel.common.filespecification;

    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Calendar;

    import org.apache.pdfbox.cos.COSDictionary;
    import org.apache.pdfbox.cos.COSName;
    import org.apache.pdfbox.cos.COSStream;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.pdmodel.common.PDStream;

    /**
     * This represents an embedded file in a file specification.
     *
     * @author Ben Litchfield
     */
    public class PDEmbeddedFile extends PDStream
    {

        /**
         * {@inheritDoc}
         */
        public PDEmbeddedFile( PDDocument document )
        {
            super( document );
            getCOSObject().setItem(COSName.TYPE, COSName.EMBEDDED_FILE);
        }

        /**
         * {@inheritDoc}
         */
        public PDEmbeddedFile( COSStream str )
        {
            super(str);
        }

        /**
         * {@inheritDoc}
         */
        public PDEmbeddedFile( PDDocument doc, InputStream str  ) throws IOException
        {
            super(doc, str);
            getCOSObject().setItem(COSName.TYPE, COSName.EMBEDDED_FILE);
        }

        /**
         * {@inheritDoc}
         * @param filter Filter to apply to the stream.
         *
         * @throws IOException {@inheritDoc}
         */
        public PDEmbeddedFile(PDDocument doc, InputStream input, COSName filter) throws IOException
        {
            super(doc, input, filter);
            getCOSObject().setItem(COSName.TYPE, COSName.EMBEDDED_FILE);
        }

        /**
         * Set the subtype for this embedded file.  This should be a mime type value.  Optional.
         *
         * @param mimeType The mimeType for the file.
         */
        public void setSubtype( String mimeType )
        {
            getCOSObject().setName(COSName.SUBTYPE, mimeType);
        }

        /**
         * Get the subtype(mimetype) for the embedded file.
         *
         * @return The type of embedded file.
         */
        public String getSubtype()
        {
            return getCOSObject().getNameAsString(COSName.SUBTYPE );
        }

        /**
         * Get the size of the embedded file.
         *
         * @return The size of the embedded file.
         */
        public int getSize()
        {
            return getCOSObject().getEmbeddedInt(COSName.PARAMS, COSName.SIZE);
        }

        /**
         * Set the size of the embedded file.
         *
         * @param size The size of the embedded file.
         */
        public void setSize( int size )
        {
            getCOSObject().setEmbeddedInt(COSName.PARAMS, COSName.SIZE, size);
        }

        /**
         * Get the creation date of the embedded file.
         *
         * @return The Creation date.
         * @throws IOException If there is an error while constructing the date.
         */
        public Calendar getCreationDate() throws IOException
        {
            return getCOSObject().getEmbeddedDate(COSName.PARAMS, COSName.CREATION_DATE);
        }

        /**
         * Set the creation date.
         *
         * @param creation The new creation date.
         */
        public void setCreationDate( Calendar creation )
        {
            getCOSObject().setEmbeddedDate(COSName.PARAMS, COSName.CREATION_DATE, creation);
        }

        /**
         * Get the mod date of the embedded file.
         *
         * @return The mod date.
         * @throws IOException If there is an error while constructing the date.
         */
        public Calendar getModDate() throws IOException
        {
            return getCOSObject().getEmbeddedDate(COSName.PARAMS, COSName.MOD_DATE);
        }

        /**
         * Set the mod date.
         *
         * @param mod The new creation mod.
         */
        public void setModDate( Calendar mod )
        {
            getCOSObject().setEmbeddedDate(COSName.PARAMS, COSName.MOD_DATE, mod);
        }

        /**
         * Get the check sum of the embedded file.
         *
         * @return The check sum of the file.
         */
        public String getCheckSum()
        {
            return getCOSObject().getEmbeddedString(COSName.PARAMS, COSName.CHECK_SUM);
        }

        /**
         * Set the check sum.
         *
         * @param checksum The checksum of the file.
         */
        public void setCheckSum( String checksum )
        {
            getCOSObject().setEmbeddedString(COSName.PARAMS, COSName.CHECK_SUM, checksum);
        }

        /**
         * Get the mac subtype.
         *
         * @return The mac subtype.
         */
        public String getMacSubtype()
        {
            COSDictionary params = getCOSObject().getCOSDictionary(COSName.PARAMS);
            return params != null ? params.getEmbeddedString(COSName.MAC, COSName.SUBTYPE) : null;
        }

        /**
         * Set the mac subtype.
         *
         * @param macSubtype The mac subtype.
         */
        public void setMacSubtype( String macSubtype )
        {
            COSDictionary params = getCOSObject().getCOSDictionary(COSName.PARAMS);
            if( params == null && macSubtype != null )
            {
                params = new COSDictionary();
                getCOSObject().setItem( COSName.PARAMS, params );
            }
            if( params != null )
            {
                params.setEmbeddedString(COSName.MAC, COSName.SUBTYPE, macSubtype);
            }
        }

        /**
         * Get the mac Creator.
         *
         * @return The mac Creator.
         */
        public String getMacCreator()
        {
            COSDictionary params = getCOSObject().getCOSDictionary(COSName.PARAMS);
            return params != null ? params.getEmbeddedString(COSName.MAC, COSName.CREATOR) : null;
        }

        /**
         * Set the mac Creator.
         *
         * @param macCreator The mac Creator.
         */
        public void setMacCreator( String macCreator )
        {
            COSDictionary params = getCOSObject().getCOSDictionary(COSName.PARAMS);
            if( params == null && macCreator != null )
            {
                params = new COSDictionary();
                getCOSObject().setItem( COSName.PARAMS, params );
            }
            if( params != null )
            {
                params.setEmbeddedString(COSName.MAC, COSName.CREATOR, macCreator);
            }
        }

        /**
         * Get the mac ResFork.
         *
         * @return The mac ResFork.
         */
        public String getMacResFork()
        {
            COSDictionary params = getCOSObject().getCOSDictionary(COSName.PARAMS);
            return params != null ? params.getEmbeddedString(COSName.MAC, COSName.RES_FORK) : null;
        }

        /**
         * Set the mac ResFork.
         *
         * @param macResFork The mac ResFork.
         */
        public void setMacResFork( String macResFork )
        {
            COSDictionary params = getCOSObject().getCOSDictionary(COSName.PARAMS);
            if( params == null && macResFork != null )
            {
                params = new COSDictionary();
                getCOSObject().setItem( COSName.PARAMS, params );
            }
            if( params != null )
            {
                params.setEmbeddedString(COSName.MAC, COSName.RES_FORK, macResFork);
            }
        }

    }