| 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; |
| } |
| }; |
| } |