package net.fusejna; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.HashSet; import java.util.Set; public final class XattrListFiller { private final ByteBuffer buffer; private final long maxSize; private long currentSize = 0; private final Set<String> addedXattrs = new HashSet<String>(); XattrListFiller(final ByteBuffer buffer, final long size) { this.buffer = buffer; maxSize = size; } public final boolean add(final Iterable<String> xattrs) { byte[] bytes; int size; boolean hasNullByte; for (final String xattr : xattrs) { if (addedXattrs.contains(xattr)) { continue; } if (currentSize >= maxSize) { return false; } bytes = xattr.getBytes(); hasNullByte = bytes[bytes.length - 1] == 0; size = bytes.length + (hasNullByte ? 0 : 1); if (currentSize + size > maxSize) { return false; } addedXattrs.add(xattr); buffer.put(bytes); if (!hasNullByte) { buffer.put((byte) 0); } currentSize += size; } return true; } public final boolean add(final String... xattrs) { return add(Arrays.asList(xattrs)); } @Override public String toString() { final StringBuilder output = new StringBuilder(); int count = 0; for (final String xattr : addedXattrs) { output.append(xattr); if (count < addedXattrs.size() - 1) { output.append(", "); } count++; } return output.toString(); } }