package net.fusejna; import java.io.File; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import net.fusejna.types.TypeOff; import com.sun.jna.Function; import com.sun.jna.Pointer; /** * A class which provides functionality to pass filenames back to FUSE as part of a readdir() call. */ public final class DirectoryFillerImpl implements DirectoryFiller { private static final String currentDirectory = "."; private static final String parentDirectory = ".."; private final Pointer buf; private final Function nativeFunction; private final Set<String> addedFiles = new HashSet<String>(); DirectoryFillerImpl(final Pointer buf, final Function nativeFunction) { this.buf = buf; this.nativeFunction = nativeFunction; add(currentDirectory, parentDirectory); } /** * {@inheritDoc} */ @Override public final boolean add(final Iterable<String> files) { int result; for (String file : files) { if (file == null) { continue; } if (file.contains(File.separator)) { file = new File(file).getName(); // Keep only the name component } if (addedFiles.add(file)) { final Object[] args = { buf, file, null, new TypeOff(0L) }; result = nativeFunction.invokeInt(args); if (result != 0) { return false; } } } return true; } /** * {@inheritDoc} */ @Override public final boolean add(final String... files) { return add(Arrays.asList(files)); } /** * {@inheritDoc} */ @Override public String toString() { final StringBuilder output = new StringBuilder(); int count = 0; for (final String file : addedFiles) { output.append(file); if (count < addedFiles.size() - 1) { output.append(", "); } count++; } return output.toString(); } }