Skip to content

Commit

Permalink
Add WString for wide win32 strings
Browse files Browse the repository at this point in the history
  • Loading branch information
vp-of-awesome committed Nov 23, 2012
1 parent b256606 commit c3b08f5
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 19 deletions.
3 changes: 3 additions & 0 deletions src/main/java/jnr/posix/POSIXTypeMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ public ToNativeConverter getToNativeConverter(Class klazz) {

} else if (Constant.class.isAssignableFrom(klazz)) {
return BaseNativePOSIX.ConstantConverter;

} else if (WString.class.isAssignableFrom(klazz)) {
return WString.Converter;
}

return null;
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/jnr/posix/WString.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
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(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;
}
};
}
12 changes: 6 additions & 6 deletions src/main/java/jnr/posix/WindowsLibC.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ public interface WindowsLibC extends LibC {

public int _open_osfhandle(@intptr_t long handle, int flags);

public int _wmkdir(@In byte[] path);
public int _wrmdir(@In byte[] path);
public int _wchmod(@In byte[] path, int pmode);
public int _wmkdir(@In WString path);
public int _wrmdir(@In WString path);
public int _wchmod(@In WString path, int pmode);

@StdCall
public boolean CreateProcessW(byte[] applicationName,
Expand Down Expand Up @@ -54,7 +54,7 @@ public boolean CreateProcessW(byte[] applicationName,
public Pointer GetStdHandle(int stdHandle);

@StdCall
public boolean CreateHardLinkW(byte[] oldname, byte[] newName, @In byte[] reserved);
public boolean CreateHardLinkW(@In WString oldname, @In WString newName, @In WString reserved);

@StdCall
int CreateFileW(
Expand All @@ -69,8 +69,8 @@ int CreateFileW(

@StdCall
boolean SetEnvironmentVariableW(
byte[] envName,
byte[] envValue);
@In WString envName,
@In WString envValue);

@StdCall
boolean SetFileTime(
Expand Down
19 changes: 6 additions & 13 deletions src/main/java/jnr/posix/WindowsPOSIX.java
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,7 @@ public int kill(int pid, int signal) {

@Override
public int chmod(String filename, int mode) {
byte[] wpath = WindowsHelpers.toWPath(filename);
return ((WindowsLibC) libc())._wchmod(wpath, mode);
return ((WindowsLibC) libc())._wchmod(WString.path(filename), mode);
}

@Override
Expand Down Expand Up @@ -301,9 +300,7 @@ public int setenv(String envName, String envValue, int overwrite) {
// POSIX specified. Existence is success if overwrite is 0.
// if (overwrite == 0 && getenv(envName) != null) return 0;

byte[] wideName = WindowsHelpers.toWString(envName);
byte[] wideValue = WindowsHelpers.toWString(envValue);
if (!((WindowsLibC) libc()).SetEnvironmentVariableW(wideName, wideValue)) {
if (!((WindowsLibC) libc()).SetEnvironmentVariableW(new WString(envName), new WString(envValue))) {
handler.error(EINVAL, envName);
return -1;
}
Expand All @@ -313,7 +310,7 @@ public int setenv(String envName, String envValue, int overwrite) {

@Override
public int unsetenv(String envName) {
if (!((WindowsLibC) libc()).SetEnvironmentVariableW(WindowsHelpers.toWString(envName), null)) {
if (!((WindowsLibC) libc()).SetEnvironmentVariableW(new WString(envName), null)) {
handler.error(EINVAL, envName);
return -1;
}
Expand Down Expand Up @@ -458,7 +455,7 @@ public boolean isatty(FileDescriptor fd) {

@Override
public int mkdir(String path, int mode) {
byte[] widePath = WindowsHelpers.toWPath(path);
WString widePath = WString.path(path);
int res = -1;

if (((WindowsLibC)libc())._wmkdir(widePath) == 0) {
Expand All @@ -474,8 +471,7 @@ public int mkdir(String path, int mode) {

@Override
public int rmdir(String path) {
byte[] widePath = WindowsHelpers.toWPath(path);
int res = ((WindowsLibC)libc())._wrmdir(widePath);
int res = ((WindowsLibC)libc())._wrmdir(WString.path(path));

if (res < 0) {
int errno = errno();
Expand All @@ -487,10 +483,7 @@ public int rmdir(String path) {

@Override
public int link(String oldpath, String newpath) {
byte[] oldWPath = WindowsHelpers.toWPath(oldpath);
byte[] newWPath = WindowsHelpers.toWPath(newpath);

boolean linkCreated = ((WindowsLibC)libc()).CreateHardLinkW(newWPath, oldWPath, null);
boolean linkCreated = ((WindowsLibC)libc()).CreateHardLinkW(WString.path(newpath), WString.path(oldpath), null);

if (!linkCreated) {
int error = errno();
Expand Down

0 comments on commit c3b08f5

Please sign in to comment.