/*
 * Copyright 1996-1998 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Sun designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Sun in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */


package sun.tools.jar;

import sun.awt.image.URLImageSource;
import sun.awt.image.ImageDecoder;
import java.net.URL;
import java.net.JarURLConnection;
import java.util.jar.JarFile;
import java.util.jar.JarEntry;
import java.io.InputStream;
import java.io.IOException;


public class JarImageSource extends URLImageSource {
    String mimeType;
    String entryName = null;
    URL url;

    /**
     * Create an image source from a Jar entry URL with the specified
     * mime type.
     */
    public JarImageSource(URL u, String type) {
        super(u);
        url = u;
        mimeType = type;
    }

    /**
     * Create an image source from a Jar file/entry URL
     * with the specified entry name and mime type.
     */
    public JarImageSource(URL u, String name, String type) {
        this(u, type);
        this.entryName = name;
    }

    protected ImageDecoder getDecoder() {
        InputStream is = null;
        try {
            JarURLConnection c = (JarURLConnection)url.openConnection();
            JarFile f = c.getJarFile();
            JarEntry e = c.getJarEntry();

            if (entryName != null && e == null) {
                e = f.getJarEntry(entryName);
            }
            if (e == null || (e != null && entryName != null
                              && (!(entryName.equals(e.getName()))))) {
                return null;
            }
            is = f.getInputStream(e);
        } catch (IOException e) {
            return null;
        }

        ImageDecoder id = decoderForType(is, mimeType);
        if (id == null) {
            id = getDecoder(is);
        }
        return id;
    }
}
