/* Copyright (c) 2007 Timothy Wall, All Rights Reserved * * The contents of this file is dual-licensed under 2 * alternative Open Source/Free licenses: LGPL 2.1 or later and * Apache License 2.0. (starting with JNA version 4.0.0). * * You can freely decide which license you want to apply to * the project. * * You may obtain a copy of the LGPL License at: * * http://www.gnu.org/licenses/licenses.html * * A copy is also included in the downloadable source code package * containing JNA, in file "LGPL2.1". * * You may obtain a copy of the Apache License at: * * http://www.apache.org/licenses/ * * A copy is also included in the downloadable source code package * containing JNA, in file "AL2.0". */ package com.sun.jna.win32; import com.sun.jna.DefaultTypeMapper; import com.sun.jna.FromNativeContext; import com.sun.jna.StringArray; import com.sun.jna.ToNativeContext; import com.sun.jna.TypeConverter; import com.sun.jna.TypeMapper; import com.sun.jna.WString; /** Provide standard conversion for W32 API types. This comprises the * following native types: * <ul> * <li>Unicode or ASCII/MBCS strings and arrays of string, as appropriate * <li>BOOL * </ul> * @author twall */ public class W32APITypeMapper extends DefaultTypeMapper { /** Standard TypeMapper to use the unicode version of a w32 API. */ public static final TypeMapper UNICODE = new W32APITypeMapper(true); /** Standard TypeMapper to use the ASCII/MBCS version of a w32 API. */ public static final TypeMapper ASCII = new W32APITypeMapper(false); /** Default TypeMapper to use - depends on the value of {@code w32.ascii} system property */ public static final TypeMapper DEFAULT = Boolean.getBoolean("w32.ascii") ? ASCII : UNICODE; protected W32APITypeMapper(boolean unicode) { if (unicode) { TypeConverter stringConverter = new TypeConverter() { @Override public Object toNative(Object value, ToNativeContext context) { if (value == null) return null; if (value instanceof String[]) { return new StringArray((String[])value, true); } return new WString(value.toString()); } @Override public Object fromNative(Object value, FromNativeContext context) { if (value == null) return null; return value.toString(); } @Override public Class<?> nativeType() { return WString.class; } }; addTypeConverter(String.class, stringConverter); addToNativeConverter(String[].class, stringConverter); } TypeConverter booleanConverter = new TypeConverter() { @Override public Object toNative(Object value, ToNativeContext context) { return Integer.valueOf(Boolean.TRUE.equals(value) ? 1 : 0); } @Override public Object fromNative(Object value, FromNativeContext context) { return ((Integer)value).intValue() != 0 ? Boolean.TRUE : Boolean.FALSE; } @Override public Class<?> nativeType() { // BOOL is 32-bit int return Integer.class; } }; addTypeConverter(Boolean.class, booleanConverter); } }