package org.couverjure.core; import com.sun.jna.*; import java.util.HashMap; import java.util.Map; public class FoundationTypeMapper extends DefaultTypeMapper { private static FoundationTypeMapper singleton = new FoundationTypeMapper(); private Core.Architecture architecture = Core.Architecture.X86_64; private FromNativeConverter idFromNativeConverter; private ToNativeConverter idToNativeConverter; private Map<Class, FromNativeConverter> fromConverters; private Map<Class, ToNativeConverter> toConverters; public static FoundationTypeMapper getTypeMapper() { return singleton; } public FoundationTypeMapper(Core.Architecture arch) { this.architecture = arch; this.toConverters = new HashMap<Class, ToNativeConverter>(); this.fromConverters = new HashMap<Class, FromNativeConverter>(); switch (this.architecture) { case PPC: case I386: throw new UnsupportedOperationException("32-bit architectures not yet supported."); case X86_64: toConverters.put(ID.class, new IDToConverter64()); fromConverters.put(ID.class, new IDFromConverter64()); break; } } public FoundationTypeMapper() { this(Core.Architecture.X86_64); } class IDToConverter64 implements ToNativeConverter { public Object toNative(Object o, ToNativeContext toNativeContext) { if (o != null) { return ((ID) o).getAddress(); } else { return new Long(0); } } public Class nativeType() { return Long.TYPE; } } class IDFromConverter64 implements FromNativeConverter { public Object fromNative(Object o, FromNativeContext fromNativeContext) { return new ID((Long) o); } public Class nativeType() { return Long.TYPE; } } @Override public FromNativeConverter getFromNativeConverter(Class javaType) { FromNativeConverter fc = fromConverters.get(javaType); if (fc == null) { return super.getFromNativeConverter(javaType); } else { return fc; } } @Override public ToNativeConverter getToNativeConverter(Class javaType) { ToNativeConverter tc = toConverters.get(javaType); if (tc == null) { return super.getToNativeConverter(javaType); } else { return tc; } } }