/*
* Overchan Android (Meta Imageboard Client)
* Copyright (C) 2014-2016 miku-nyan <https://github.com/miku-nyan>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package nya.miku.wishmaster.containers;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Locale;
import nya.miku.wishmaster.api.interfaces.CancellableTask;
/**
* Абстрактный класс инкапсулирует работу с архивом (ZIP/MHTML) для создания/модификации.<br>
* Если файл существует, все файлы, кроме отдельного списка, будут скопированы в новый архив
* @author miku-nyan
*
*/
public abstract class WriteableContainer implements Closeable {
/**
* Скопировать все файлы из исходного архива (в случае, если на месте сохраняемого файла уже был старый архив)
* @param doNotCopy список (массив) файлов, которые не будут скопированы из исходного архива
* @param task отменяемая задача
*/
public abstract void transfer(String[] doNotCopy, CancellableTask task) throws IOException;
/**
* Открыть поток для записи файла в архив
* @param filename имя файла внутри архива
* @return поток
* @throws IOException в случае, если файл в архиве уже существует или поток уже открыт для другого файла
*/
public abstract OutputStream openStream(String filename) throws IOException;
/**
* Проверить наличие файла в архиве
* @param filename имя файла
*/
public abstract boolean hasFile(String filename);
/**
* Завершить работу с архивом
*/
public abstract void close() throws IOException;
/**
* Отменить действия с архивом, закрыть поток и удалить временный файл
*/
public abstract void cancel();
/**
* Получить экземпляр класса в зависимости от расширения файла (поддерживаются zip, mht, mhtml)
* @param file создаваемый/модифицируемый файл-архив
* @return созданный объект
*/
public static WriteableContainer obtain(File file) throws IOException {
String filename = file.getName().toLowerCase(Locale.US);
if (filename.endsWith(".zip")) {
return new WriteableZip(file);
} else if (filename.endsWith(".mht") || filename.endsWith(".mhtml") ) {
return new WriteableMHTML(file);
} else {
return new WriteableDirContainer(!file.isDirectory() && file.exists() ? file.getParentFile() : file);
}
}
}