blob: 590a858e89e90c7b874b5827a44fdbba718ce336 [file] [log] [blame] [edit]
package jnr.posix;
import jnr.ffi.Memory;
import jnr.ffi.Pointer;
import jnr.ffi.mapper.ToNativeContext;
import jnr.ffi.mapper.ToNativeConverter;
import jnr.posix.util.WindowsHelpers;
public final class WString {
static final jnr.ffi.Runtime runtime = jnr.ffi.Runtime.getSystemRuntime();
private final byte[] bytes;
WString(String string) {
bytes = WindowsHelpers.toWString(string);
}
private WString(byte[] bytes) {
this.bytes = bytes;
}
public static WString path(String path) {
return new WString(path(path, false));
}
public static byte[] path(String path, boolean longPathExtensionNeeded) {
if (longPathExtensionNeeded && path.length() > 240) { // FIXME: This is not right value. Needs tests around actual char boundary.
if (path.startsWith("//")) { // UNC Path
path = "//?/UNC/" + path.substring(2);
} else if (path.startsWith("\\\\")) {
path = "\\\\?\\UNC\\" + path.substring(2);
} else if (WindowsHelpers.isDriveLetterPath(path)) {
if (path.contains("/")) {
path = "//?/" + path;
} else {
path = "\\\\?\\" + path;
}
}
}
return WindowsHelpers.toWPath(path);
}
public static final ToNativeConverter<WString, Pointer> Converter = new ToNativeConverter<WString, Pointer>() {
public Pointer toNative(WString value, ToNativeContext context) {
if (value == null) {
return null;
}
Pointer memory = Memory.allocateDirect(runtime, value.bytes.length + 1, true);
memory.put(0, value.bytes, 0, value.bytes.length);
return memory;
}
public Class<Pointer> nativeType() {
return Pointer.class;
}
};
}