package com.technofovea.hllib;
import com.sun.jna.FromNativeContext;
import com.sun.jna.Pointer;
import com.sun.jna.ToNativeContext;
import com.sun.jna.TypeConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Darien Hager
*/
class DirItemConverter implements TypeConverter {
private static final Logger logger = LoggerFactory.getLogger(DirItemConverter.class);
public Object fromNative(Object input, FromNativeContext context) {
assert (context.getTargetType().equals(DirectoryItem.class));
Pointer ptr = (Pointer) input;
if (ptr == null || ptr.equals(Pointer.NULL)) {
return null;
}
return new DirectoryItem(HlLib.getLibrary().getCurrentlyBoundPackage(), ptr);
}
public Object toNative(Object input, ToNativeContext context) {
DirectoryItem di = (DirectoryItem) input;
// Check closed
if (di.isClosed()) {
throw new IllegalStateException("DirectoryItem cannot be used, it's owning package ("+di.getParentPackage().getID()+") was closed.");
}
// Auto-rebind package to prevent an error
HlPackage curPackage = HlLib.getLibrary().getCurrentlyBoundPackage();
HlPackage targetPackage = di.getParentPackage();
if (!curPackage.equals(targetPackage)) {
logger.debug("Automatically rebinding library's current package (from {} to {}) to handle DirectoryItem {}",new Object[]{curPackage,targetPackage,di});
HlLib.getLibrary().bindPackage(di.getParentPackage());
}
return di.getPointer();
}
public Class nativeType() {
return Pointer.class;
}
}