/* * Decompiled with CFR 0.152. */ package com.ice.tar; import com.ice.tar.InvalidHeaderException; import com.ice.tar.TarHeader; import java.io.File; import java.util.Date; public class TarEntry implements Cloneable { protected File file; protected TarHeader header; protected boolean unixFormat; protected boolean ustarFormat; protected boolean gnuFormat; private final void initialize() { this.file = null; this.header = new TarHeader(); this.gnuFormat = false; this.ustarFormat = true; this.unixFormat = false; } public Object clone() { TarEntry tarEntry = null; try { tarEntry = (TarEntry)super.clone(); if (this.header != null) { tarEntry.header = (TarHeader)this.header.clone(); } if (this.file != null) { tarEntry.file = new File(this.file.getAbsolutePath()); } } catch (CloneNotSupportedException cloneNotSupportedException) { cloneNotSupportedException.printStackTrace(System.err); } return tarEntry; } public boolean isUSTarFormat() { return this.ustarFormat; } public void setUSTarFormat() { this.ustarFormat = true; this.gnuFormat = false; this.unixFormat = false; } public boolean isGNUTarFormat() { return this.gnuFormat; } public void setGNUTarFormat() { this.gnuFormat = true; this.ustarFormat = false; this.unixFormat = false; } public boolean isUnixTarFormat() { return this.unixFormat; } public void setUnixTarFormat() { this.unixFormat = true; this.ustarFormat = false; this.gnuFormat = false; } public boolean equals(TarEntry tarEntry) { return this.header.name.toString().equals(tarEntry.header.name.toString()); } public boolean isDescendent(TarEntry tarEntry) { return tarEntry.header.name.toString().startsWith(this.header.name.toString()); } public TarHeader getHeader() { return this.header; } public String getName() { return this.header.name.toString(); } public void setName(String string) { this.header.name = new StringBuffer(string); } public int getUserId() { return this.header.userId; } public void setUserId(int n) { this.header.userId = n; } public int getGroupId() { return this.header.groupId; } public void setGroupId(int n) { this.header.groupId = n; } public String getUserName() { return this.header.userName.toString(); } public void setUserName(String string) { this.header.userName = new StringBuffer(string); } public String getGroupName() { return this.header.groupName.toString(); } public void setGroupName(String string) { this.header.groupName = new StringBuffer(string); } public void setIds(int n, int n2) { this.setUserId(n); this.setGroupId(n2); } public void setNames(String string, String string2) { this.setUserName(string); this.setGroupName(string2); } public void setModTime(long l) { this.header.modTime = l / 1000L; } public void setModTime(Date date) { this.header.modTime = date.getTime() / 1000L; } public Date getModTime() { return new Date(this.header.modTime * 1000L); } public File getFile() { return this.file; } public long getSize() { return this.header.size; } public void setSize(long l) { this.header.size = l; } public boolean isDirectory() { if (this.file != null) { return this.file.isDirectory(); } if (this.header != null) { if (this.header.linkFlag == 53) { return true; } if (this.header.name.toString().endsWith("/")) { return true; } } return false; } public void getFileTarHeader(TarHeader tarHeader, File file) throws InvalidHeaderException { this.file = file; String string = file.getPath(); String string2 = System.getProperty("os.name"); if (string2 != null) { String string3 = "windows"; if (string2.toLowerCase().startsWith(string3) && string.length() > 2) { char c = string.charAt(0); char c2 = string.charAt(1); if (c2 == ':' && (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')) { string = string.substring(2); } } } string = string.replace(File.separatorChar, '/'); while (string.startsWith("/")) { string = string.substring(1); } tarHeader.linkName = new StringBuffer(""); tarHeader.name = new StringBuffer(string); if (file.isDirectory()) { tarHeader.size = 0L; tarHeader.mode = 16877; tarHeader.linkFlag = (byte)53; if (tarHeader.name.charAt(tarHeader.name.length() - 1) != '/') { tarHeader.name.append("/"); } } else { tarHeader.size = file.length(); tarHeader.mode = 33188; tarHeader.linkFlag = (byte)48; } tarHeader.modTime = file.lastModified() / 1000L; tarHeader.checkSum = 0; tarHeader.devMajor = 0; tarHeader.devMinor = 0; } public TarEntry[] getDirectoryEntries() throws InvalidHeaderException { if (this.file == null || !this.file.isDirectory()) { return new TarEntry[0]; } String[] stringArray = this.file.list(); TarEntry[] tarEntryArray = new TarEntry[stringArray.length]; int n = 0; while (n < stringArray.length) { tarEntryArray[n] = new TarEntry(new File(this.file, stringArray[n])); ++n; } return tarEntryArray; } public long computeCheckSum(byte[] byArray) { long l = 0L; int n = 0; while (n < byArray.length) { l += (long)(0xFF & byArray[n]); ++n; } return l; } public void writeEntryHeader(byte[] byArray) throws InvalidHeaderException { int n = 0; if (this.isUnixTarFormat() && this.header.name.length() > 100) { throw new InvalidHeaderException("file path is greater than 100 characters, " + this.header.name); } n = TarHeader.getFileNameBytes(this.header.name.toString(), byArray); n = TarHeader.getOctalBytes(this.header.mode, byArray, n, 8); n = TarHeader.getOctalBytes(this.header.userId, byArray, n, 8); n = TarHeader.getOctalBytes(this.header.groupId, byArray, n, 8); long l = this.header.size; n = TarHeader.getLongOctalBytes(l, byArray, n, 12); int n2 = n = TarHeader.getLongOctalBytes(this.header.modTime, byArray, n, 12); int n3 = 0; while (n3 < 8) { byArray[n++] = 32; ++n3; } byArray[n++] = this.header.linkFlag; n = TarHeader.getNameBytes(this.header.linkName, byArray, n, 100); if (this.unixFormat) { n3 = 0; while (n3 < 8) { byArray[n++] = 0; ++n3; } } else { n = TarHeader.getNameBytes(this.header.magic, byArray, n, 8); } n = TarHeader.getNameBytes(this.header.userName, byArray, n, 32); n = TarHeader.getNameBytes(this.header.groupName, byArray, n, 32); n = TarHeader.getOctalBytes(this.header.devMajor, byArray, n, 8); n = TarHeader.getOctalBytes(this.header.devMinor, byArray, n, 8); while (n < byArray.length) { byArray[n++] = 0; } long l2 = this.computeCheckSum(byArray); TarHeader.getCheckSumOctalBytes(l2, byArray, n2, 8); } public void parseTarHeader(TarHeader tarHeader, byte[] byArray) throws InvalidHeaderException { int n = 0; if (byArray[257] == 0 && byArray[258] == 0 && byArray[259] == 0 && byArray[260] == 0 && byArray[261] == 0) { this.unixFormat = true; this.ustarFormat = false; this.gnuFormat = false; } else if (byArray[257] == 117 && byArray[258] == 115 && byArray[259] == 116 && byArray[260] == 97 && byArray[261] == 114 && byArray[262] == 0) { this.ustarFormat = true; this.gnuFormat = false; this.unixFormat = false; } else if (byArray[257] == 117 && byArray[258] == 115 && byArray[259] == 116 && byArray[260] == 97 && byArray[261] == 114 && byArray[262] != 0 && byArray[263] != 0) { this.gnuFormat = true; this.unixFormat = false; this.ustarFormat = false; } else { StringBuffer stringBuffer = new StringBuffer(128); stringBuffer.append("header magic is not 'ustar' or unix-style zeros, it is '"); stringBuffer.append(byArray[257]); stringBuffer.append(byArray[258]); stringBuffer.append(byArray[259]); stringBuffer.append(byArray[260]); stringBuffer.append(byArray[261]); stringBuffer.append(byArray[262]); stringBuffer.append(byArray[263]); stringBuffer.append("', or (dec) "); stringBuffer.append(byArray[257]); stringBuffer.append(", "); stringBuffer.append(byArray[258]); stringBuffer.append(", "); stringBuffer.append(byArray[259]); stringBuffer.append(", "); stringBuffer.append(byArray[260]); stringBuffer.append(", "); stringBuffer.append(byArray[261]); stringBuffer.append(", "); stringBuffer.append(byArray[262]); stringBuffer.append(", "); stringBuffer.append(byArray[263]); throw new InvalidHeaderException(stringBuffer.toString()); } tarHeader.name = TarHeader.parseFileName(byArray); n = 100; tarHeader.mode = (int)TarHeader.parseOctal(byArray, n, 8); tarHeader.userId = (int)TarHeader.parseOctal(byArray, n += 8, 8); tarHeader.groupId = (int)TarHeader.parseOctal(byArray, n += 8, 8); tarHeader.size = TarHeader.parseOctal(byArray, n += 8, 12); tarHeader.modTime = TarHeader.parseOctal(byArray, n += 12, 12); tarHeader.checkSum = (int)TarHeader.parseOctal(byArray, n += 12, 8); n += 8; tarHeader.linkFlag = byArray[n++]; tarHeader.linkName = TarHeader.parseName(byArray, n, 100); n += 100; if (this.ustarFormat) { tarHeader.magic = TarHeader.parseName(byArray, n, 8); tarHeader.userName = TarHeader.parseName(byArray, n += 8, 32); tarHeader.groupName = TarHeader.parseName(byArray, n += 32, 32); tarHeader.devMajor = (int)TarHeader.parseOctal(byArray, n += 32, 8); tarHeader.devMinor = (int)TarHeader.parseOctal(byArray, n += 8, 8); } else { tarHeader.devMajor = 0; tarHeader.devMinor = 0; tarHeader.magic = new StringBuffer(""); tarHeader.userName = new StringBuffer(""); tarHeader.groupName = new StringBuffer(""); } } public void nameTarHeader(TarHeader tarHeader, String string) { boolean bl = string.endsWith("/"); this.gnuFormat = false; this.ustarFormat = true; this.unixFormat = false; tarHeader.checkSum = 0; tarHeader.devMajor = 0; tarHeader.devMinor = 0; tarHeader.name = new StringBuffer(string); tarHeader.mode = bl ? 16877 : 33188; tarHeader.userId = 0; tarHeader.groupId = 0; tarHeader.size = 0L; tarHeader.checkSum = 0; tarHeader.modTime = new Date().getTime() / 1000L; tarHeader.linkFlag = (byte)(bl ? 53 : 48); tarHeader.linkName = new StringBuffer(""); tarHeader.userName = new StringBuffer(""); tarHeader.groupName = new StringBuffer(""); tarHeader.devMajor = 0; tarHeader.devMinor = 0; } public String toString() { StringBuffer stringBuffer = new StringBuffer(128); return stringBuffer.append("[TarEntry name=").append(this.getName()).append(", isDir=").append(this.isDirectory()).append(", size=").append(this.getSize()).append(", userId=").append(this.getUserId()).append(", user=").append(this.getUserName()).append(", groupId=").append(this.getGroupId()).append(", group=").append(this.getGroupName()).append("]").toString(); } protected TarEntry() { } public TarEntry(String string) { this.initialize(); this.nameTarHeader(this.header, string); } public TarEntry(File file) throws InvalidHeaderException { this.initialize(); this.getFileTarHeader(this.header, file); } public TarEntry(byte[] byArray) throws InvalidHeaderException { this.initialize(); this.parseTarHeader(this.header, byArray); } }