/** * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * muCommander 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mucommander.commons.file.archive.tar; import com.mucommander.commons.file.PermissionBits; import com.mucommander.commons.file.SimpleFilePermissions; import com.mucommander.commons.file.archive.ArchiveEntry; import com.mucommander.commons.file.archive.ArchiveEntryIterator; import com.mucommander.commons.file.archive.tar.provider.TarEntry; import com.mucommander.commons.file.archive.tar.provider.TarInputStream; import java.io.IOException; /** * An <code>ArchiveEntryIterator</code> that iterates through a {@link TarInputStream}. * * @author Maxence Bernard */ class TarEntryIterator implements ArchiveEntryIterator { /** InputStream to the archive file */ private TarInputStream tin; /** The current entry, where the TarInputStream is currently positionned */ private ArchiveEntry currentEntry; /** * Creates a new TarEntryIterator that iterates through the entries of the given {@link TarInputStream}. * * @param tin the TarInputStream to iterate through * @throws IOException if an error occurred while fetching the first entry */ TarEntryIterator(TarInputStream tin) throws IOException { this.tin = tin; } /** * Returns the {@link TarInputStream} instance that was used to create this object. * * @return the {@link TarInputStream} instance that was used to create this object. */ TarInputStream getTarInputStream() { return tin; } /** * Returns the current entry where the {@link #getTarInputStream()} TarInputStream} is currently positionned. * The returned value is <code>null</code> until {@link #nextEntry()} is called for the first time. * * @return the current entry where the {@link #getTarInputStream()} TarInputStream} is currently positionned. */ ArchiveEntry getCurrentEntry() { return currentEntry; } /** * Creates and return an {@link ArchiveEntry()} whose attributes are fetched from the given * <code>org.apache.tools.tar.TarEntry</code>. * * @param tarEntry the object that serves to initialize the attributes of the returned ArchiveEntry * @return an ArchiveEntry whose attributes are fetched from the given org.apache.tools.tar.TarEntry */ private ArchiveEntry createArchiveEntry(TarEntry tarEntry) { ArchiveEntry entry = new ArchiveEntry(tarEntry.getName(), tarEntry.isDirectory(), tarEntry.getModTime().getTime(), tarEntry.getSize(), true); entry.setPermissions(new SimpleFilePermissions(tarEntry.getMode() & PermissionBits.FULL_PERMISSION_INT)); entry.setOwner(tarEntry.getUserName()); entry.setGroup(tarEntry.getGroupName()); entry.setEntryObject(tarEntry); return entry; } /** * Advances the {@link TarInputStream} to the next entry and returns the corresponding {@link ArchiveEntry}. * * @return the next ArchiveEntry * @throws IOException if an I/O error occurred */ private ArchiveEntry getNextEntry() throws IOException { TarEntry entry = tin.getNextEntry(); if(entry==null) return null; return createArchiveEntry(entry); } ///////////////////////////////////////// // ArchiveEntryIterator implementation // ///////////////////////////////////////// public ArchiveEntry nextEntry() throws IOException { // Get the next entry, if any this.currentEntry = getNextEntry(); return currentEntry; } public void close() throws IOException { tin.close(); } }