diff --git a/source/net/filebot/MetaAttributeView.java b/source/net/filebot/MetaAttributeView.java index 26c0a741..fa72d120 100644 --- a/source/net/filebot/MetaAttributeView.java +++ b/source/net/filebot/MetaAttributeView.java @@ -17,7 +17,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; -import net.filebot.mac.xattr.XattrUtil; +import net.filebot.mac.xattr.XAttrUtil; import com.sun.jna.Platform; @@ -178,19 +178,19 @@ public class MetaAttributeView extends AbstractMap { } public List list() { - return XattrUtil.listXAttr(path); + return XAttrUtil.listXAttr(path); } public String read(String key) { - return XattrUtil.getXAttr(path, key); + return XAttrUtil.getXAttr(path, key); } public void write(String key, String value) { - XattrUtil.setXAttr(path, key, value); + XAttrUtil.setXAttr(path, key, value); } public void delete(String key) { - XattrUtil.removeXAttr(path, key); + XAttrUtil.removeXAttr(path, key); } } diff --git a/source/net/filebot/mac/xattr/XAttrUtil.java b/source/net/filebot/mac/xattr/XAttrUtil.java new file mode 100644 index 00000000..49236541 --- /dev/null +++ b/source/net/filebot/mac/xattr/XAttrUtil.java @@ -0,0 +1,100 @@ +/* Copyright (c) 2014 Reinhard Pointner, All Rights Reserved + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ +package net.filebot.mac.xattr; + +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.sun.jna.Memory; +import com.sun.jna.Pointer; + +public class XAttrUtil { + + public static List listXAttr(String path) { + // get required buffer size + long bufferLength = XAttr.INSTANCE.listxattr(path, Pointer.NULL, 0, 0); + + if (bufferLength < 0) + return null; + + if (bufferLength == 0) + return new ArrayList(0); + + Memory valueBuffer = new Memory(bufferLength); + long valueLength = XAttr.INSTANCE.listxattr(path, valueBuffer, bufferLength, 0); + + if (valueLength < 0) + return null; + + return decodeStringSequence(valueBuffer.getByteBuffer(0, valueLength)); + } + + public static String getXAttr(String path, String name) { + // get required buffer size + long bufferLength = XAttr.INSTANCE.getxattr(path, name, Pointer.NULL, 0, 0, 0); + + if (bufferLength < 0) + return null; + + Memory valueBuffer = new Memory(bufferLength); + long valueLength = XAttr.INSTANCE.getxattr(path, name, valueBuffer, bufferLength, 0, 0); + + if (valueLength < 0) + return null; + + return decodeString(valueBuffer.getByteBuffer(0, valueLength - 1)); + } + + public static int setXAttr(String path, String name, String value) { + Memory valueBuffer = encodeString(value); + return XAttr.INSTANCE.setxattr(path, name, valueBuffer, valueBuffer.size(), 0, 0); + } + + public static int removeXAttr(String path, String name) { + return XAttr.INSTANCE.removexattr(path, name, 0); + } + + protected static Memory encodeString(String s) { + // create NULL-terminated UTF-8 String + byte[] bb = s.getBytes(Charset.forName("UTF-8")); + Memory valueBuffer = new Memory(bb.length + 1); + valueBuffer.write(0, bb, 0, bb.length); + valueBuffer.setByte(valueBuffer.size() - 1, (byte) 0); + return valueBuffer; + } + + protected static String decodeString(ByteBuffer bb) { + return Charset.forName("UTF-8").decode(bb).toString(); + } + + protected static List decodeStringSequence(ByteBuffer bb) { + List names = new ArrayList(); + + bb.mark(); // first key starts from here + while (bb.hasRemaining()) { + if (bb.get() == 0) { + ByteBuffer nameBuffer = (ByteBuffer) bb.duplicate().limit(bb.position() - 1).reset(); + if (nameBuffer.hasRemaining()) { + names.add(decodeString(nameBuffer)); + } + bb.mark(); // next key starts from here + } + } + + return names; + } + +} diff --git a/source/net/filebot/mac/xattr/XattrUtil.java b/source/net/filebot/mac/xattr/XattrUtil.java index cbfa8f00..49236541 100644 --- a/source/net/filebot/mac/xattr/XattrUtil.java +++ b/source/net/filebot/mac/xattr/XattrUtil.java @@ -21,7 +21,7 @@ import java.util.List; import com.sun.jna.Memory; import com.sun.jna.Pointer; -public class XattrUtil { +public class XAttrUtil { public static List listXAttr(String path) { // get required buffer size