1 17 18 package net.sourceforge.groboutils.codecoverage.v2.ant.zip; 19 20 import java.util.zip.CRC32 ; 21 import java.util.zip.ZipException ; 22 23 50 public class AsiExtraField implements ZipExtraField, UnixStat, Cloneable { 51 52 private static final ZipShort HEADER_ID = new ZipShort(0x756E); 53 54 59 private int mode = 0; 60 65 private int uid = 0; 66 71 private int gid = 0; 72 79 private String link = ""; 80 85 private boolean dirFlag = false; 86 87 92 private CRC32 crc = new CRC32 (); 93 94 public AsiExtraField() { 95 } 96 97 102 public ZipShort getHeaderId() { 103 return HEADER_ID; 104 } 105 106 112 public ZipShort getLocalFileDataLength() { 113 return new ZipShort(4 + 2 + 4 + 2 + 2 + getLinkedFile().getBytes().length); 119 } 120 121 126 public ZipShort getCentralDirectoryLength() { 127 return getLocalFileDataLength(); 128 } 129 130 136 public byte[] getLocalFileDataData() { 137 byte[] data = new byte[getLocalFileDataLength().getValue() - 4]; 139 System.arraycopy((new ZipShort(getMode())).getBytes(), 0, data, 0, 2); 140 141 byte[] linkArray = getLinkedFile().getBytes(); 142 System.arraycopy((new ZipLong(linkArray.length)).getBytes(), 143 0, data, 2, 4); 144 145 System.arraycopy((new ZipShort(getUserId())).getBytes(), 146 0, data, 6, 2); 147 System.arraycopy((new ZipShort(getGroupId())).getBytes(), 148 0, data, 8, 2); 149 150 System.arraycopy(linkArray, 0, data, 10, linkArray.length); 151 152 crc.reset(); 153 crc.update(data); 154 long checksum = crc.getValue(); 155 156 byte[] result = new byte[data.length + 4]; 157 System.arraycopy((new ZipLong(checksum)).getBytes(), 0, result, 0, 4); 158 System.arraycopy(data, 0, result, 4, data.length); 159 return result; 160 } 161 162 167 public byte[] getCentralDirectoryData() { 168 return getLocalFileDataData(); 169 } 170 171 176 public void setUserId(int uid) { 177 this.uid = uid; 178 } 179 180 185 public int getUserId() { 186 return uid; 187 } 188 189 194 public void setGroupId(int gid) { 195 this.gid = gid; 196 } 197 198 203 public int getGroupId() { 204 return gid; 205 } 206 207 215 public void setLinkedFile(String name) { 216 link = name; 217 mode = getMode(mode); 218 } 219 220 228 public String getLinkedFile() { 229 return link; 230 } 231 232 237 public boolean isLink() { 238 return getLinkedFile().length() != 0; 239 } 240 241 246 public void setMode(int mode) { 247 this.mode = getMode(mode); 248 } 249 250 255 public int getMode() { 256 return mode; 257 } 258 259 264 public void setDirectory(boolean dirFlag) { 265 this.dirFlag = dirFlag; 266 mode = getMode(mode); 267 } 268 269 274 public boolean isDirectory() { 275 return dirFlag && !isLink(); 276 } 277 278 283 public void parseFromLocalFileData(byte[] data, int offset, int length) 284 throws ZipException { 285 286 long givenChecksum = (new ZipLong(data, offset)).getValue(); 287 byte[] tmp = new byte[length - 4]; 288 System.arraycopy(data, offset + 4, tmp, 0, length - 4); 289 crc.reset(); 290 crc.update(tmp); 291 long realChecksum = crc.getValue(); 292 if (givenChecksum != realChecksum) { 293 throw new ZipException ("bad CRC checksum " 294 + Long.toHexString(givenChecksum) 295 + " instead of " 296 + Long.toHexString(realChecksum)); 297 } 298 299 int newMode = (new ZipShort(tmp, 0)).getValue(); 300 byte[] linkArray = new byte[(int) (new ZipLong(tmp, 2)).getValue()]; 301 uid = (new ZipShort(tmp, 6)).getValue(); 302 gid = (new ZipShort(tmp, 8)).getValue(); 303 304 if (linkArray.length == 0) { 305 link = ""; 306 } else { 307 System.arraycopy(tmp, 10, linkArray, 0, linkArray.length); 308 link = new String (linkArray); 309 } 310 setDirectory((newMode & DIR_FLAG) != 0); 311 setMode(newMode); 312 } 313 314 319 protected int getMode(int mode) { 320 int type = FILE_FLAG; 321 if (isLink()) { 322 type = LINK_FLAG; 323 } else if (isDirectory()) { 324 type = DIR_FLAG; 325 } 326 return type | (mode & PERM_MASK); 327 } 328 329 } 330 | Popular Tags |