package net.lingala.zip4j.unzip;
import java.io.File;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.UnzipParameters;
import net.lingala.zip4j.util.InternalZipConstants;
import net.lingala.zip4j.util.Zip4jUtil;
public class UnzipUtil {
public static void applyFileAttributes(FileHeader fileHeader, File file) throws ZipException {
applyFileAttributes(fileHeader, file, null);
}
public static void applyFileAttributes(FileHeader fileHeader, File file,
UnzipParameters unzipParameters) throws ZipException{
if (fileHeader == null) {
throw new ZipException("cannot set file properties: file header is null");
}
if (file == null) {
throw new ZipException("cannot set file properties: output file is null");
}
if (!Zip4jUtil.checkFileExists(file)) {
throw new ZipException("cannot set file properties: file doesnot exist");
}
if (unzipParameters == null || !unzipParameters.isIgnoreDateTimeAttributes()) {
setFileLastModifiedTime(fileHeader, file);
}
if (unzipParameters == null) {
setFileAttributes(fileHeader, file, true, true, true, true);
} else {
if (unzipParameters.isIgnoreAllFileAttributes()) {
setFileAttributes(fileHeader, file, false, false, false, false);
} else {
setFileAttributes(fileHeader, file, !unzipParameters.isIgnoreReadOnlyFileAttribute(),
!unzipParameters.isIgnoreHiddenFileAttribute(),
!unzipParameters.isIgnoreArchiveFileAttribute(),
!unzipParameters.isIgnoreSystemFileAttribute());
}
}
}
private static void setFileAttributes(FileHeader fileHeader, File file, boolean setReadOnly,
boolean setHidden, boolean setArchive, boolean setSystem) throws ZipException {
if (fileHeader == null) {
throw new ZipException("invalid file header. cannot set file attributes");
}
byte[] externalAttrbs = fileHeader.getExternalFileAttr();
if (externalAttrbs == null) {
return;
}
int atrrib = externalAttrbs[0];
switch (atrrib) {
case InternalZipConstants.FILE_MODE_READ_ONLY:
if (setReadOnly) Zip4jUtil.setFileReadOnly(file);
break;
case InternalZipConstants.FILE_MODE_HIDDEN:
case InternalZipConstants.FOLDER_MODE_HIDDEN:
if (setHidden) Zip4jUtil.setFileHidden(file);
break;
case InternalZipConstants.FILE_MODE_ARCHIVE:
case InternalZipConstants.FOLDER_MODE_ARCHIVE:
if (setArchive) Zip4jUtil.setFileArchive(file);
break;
case InternalZipConstants.FILE_MODE_READ_ONLY_HIDDEN:
if (setReadOnly) Zip4jUtil.setFileReadOnly(file);
if (setHidden) Zip4jUtil.setFileHidden(file);
break;
case InternalZipConstants.FILE_MODE_READ_ONLY_ARCHIVE:
if (setArchive) Zip4jUtil.setFileArchive(file);
if (setReadOnly) Zip4jUtil.setFileReadOnly(file);
break;
case InternalZipConstants.FILE_MODE_HIDDEN_ARCHIVE:
case InternalZipConstants.FOLDER_MODE_HIDDEN_ARCHIVE:
if (setArchive) Zip4jUtil.setFileArchive(file);
if (setHidden) Zip4jUtil.setFileHidden(file);
break;
case InternalZipConstants.FILE_MODE_READ_ONLY_HIDDEN_ARCHIVE:
if (setArchive) Zip4jUtil.setFileArchive(file);
if (setReadOnly) Zip4jUtil.setFileReadOnly(file);
if (setHidden) Zip4jUtil.setFileHidden(file);
break;
case InternalZipConstants.FILE_MODE_SYSTEM:
if (setReadOnly) Zip4jUtil.setFileReadOnly(file);
if (setHidden) Zip4jUtil.setFileHidden(file);
if (setSystem) Zip4jUtil.setFileSystemMode(file);
break;
default:
//do nothing
break;
}
}
private static void setFileLastModifiedTime(FileHeader fileHeader, File file) throws ZipException {
if (fileHeader.getLastModFileTime() <= 0) {
return;
}
if (file.exists()) {
file.setLastModified(Zip4jUtil.dosToJavaTme(fileHeader.getLastModFileTime()));
}
}
}