/** {@inheritDoc} */ @Override public void putArchiveEntry(final ArchiveEntry pEntry) throws IOException { if (finished) { throw new IOException("Stream has already been finished"); } ArArchiveEntry pArEntry = (ArArchiveEntry) pEntry; if (prevEntry == null) { writeArchiveHeader(); } else { if (prevEntry.getLength() != entryOffset) { throw new IOException( "length does not match entry (" + prevEntry.getLength() + " != " + entryOffset); } if (haveUnclosedEntry) { closeArchiveEntry(); } } prevEntry = pArEntry; writeEntryHeader(pArEntry); entryOffset = 0; haveUnclosedEntry = true; }
private long writeEntryHeader(final ArArchiveEntry pEntry) throws IOException { long offset = 0; boolean mustAppendName = false; final String n = pEntry.getName(); if (LONGFILE_ERROR == longFileMode && n.length() > 16) { throw new IOException("filename too long, > 16 chars: " + n); } if (LONGFILE_BSD == longFileMode && (n.length() > 16 || n.indexOf(" ") > -1)) { mustAppendName = true; offset += write(ArArchiveInputStream.BSD_LONGNAME_PREFIX + String.valueOf(n.length())); } else { offset += write(n); } offset = fill(offset, 16, ' '); final String m = "" + (pEntry.getLastModified()); if (m.length() > 12) { throw new IOException("modified too long"); } offset += write(m); offset = fill(offset, 28, ' '); final String u = "" + pEntry.getUserId(); if (u.length() > 6) { throw new IOException("userid too long"); } offset += write(u); offset = fill(offset, 34, ' '); final String g = "" + pEntry.getGroupId(); if (g.length() > 6) { throw new IOException("groupid too long"); } offset += write(g); offset = fill(offset, 40, ' '); final String fm = "" + Integer.toString(pEntry.getMode(), 8); if (fm.length() > 8) { throw new IOException("filemode too long"); } offset += write(fm); offset = fill(offset, 48, ' '); final String s = String.valueOf(pEntry.getLength() + (mustAppendName ? n.length() : 0)); if (s.length() > 10) { throw new IOException("size too long"); } offset += write(s); offset = fill(offset, 58, ' '); offset += write(ArArchiveEntry.TRAILER); if (mustAppendName) { offset += write(n); } return offset; }