11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/*
21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * ProGuard -- shrinking, optimization, obfuscation, and preverification
31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *             of Java bytecode.
41176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *
51176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
61176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *
71176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * This program is free software; you can redistribute it and/or modify it
81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * under the terms of the GNU General Public License as published by the Free
91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Software Foundation; either version 2 of the License, or (at your option)
101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * any later version.
111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *
121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * This program is distributed in the hope that it will be useful, but WITHOUT
131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * more details.
161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *
171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * You should have received a copy of the GNU General Public License along
181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * with this program; if not, write to the Free Software Foundation, Inc.,
191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */
211176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpackage proguard.io;
221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
231176bdada62cabc6ec4b0308a930e83b679d5d36John Reckimport java.io.IOException;
241176bdada62cabc6ec4b0308a930e83b679d5d36John Reckimport java.util.zip.*;
251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/**
271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * This DataEntryReader lets a given DataEntryReader read all data entries of
281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * the read jar/war/zip data entries.
291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *
301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * @author Eric Lafortune
311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */
321176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpublic class JarReader implements DataEntryReader
331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    private final DataEntryReader dataEntryReader;
351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    /**
381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     * Creates a new JarReader.
391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck     */
401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    public JarReader(DataEntryReader dataEntryReader)
411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        this.dataEntryReader = dataEntryReader;
431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    // Implementation for DataEntryReader.
471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    public void read(DataEntry dataEntry) throws IOException
491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        ZipInputStream zipInputStream = new ZipInputStream(dataEntry.getInputStream());
511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        try
531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        {
541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            // Get all entries from the input jar.
551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            while (true)
561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            {
571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                // Can we get another entry?
581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                ZipEntry zipEntry = zipInputStream.getNextEntry();
591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                if (zipEntry == null)
601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                {
611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    break;
621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                }
631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                // Delegate the actual reading to the data entry reader.
651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                dataEntryReader.read(new ZipDataEntry(dataEntry,
661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                                                      zipEntry,
671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                                                      zipInputStream));
681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            }
691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        }
701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        finally
711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        {
721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            dataEntry.closeInputStream();
731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        }
741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck