package com.sun.jna.examples.win32;
import java.util.HashMap;
import java.util.Map;
import com.sun.jna.FromNativeContext;
import com.sun.jna.IntegerType;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.PointerType;
import com.sun.jna.ptr.ByReference;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIFunctionMapper;
import com.sun.jna.win32.W32APITypeMapper;
/** Base type for most W32 API libraries. Provides standard options
* for unicode/ASCII mappings. Set the system property <code>w32.ascii</code>
* to <code>true</code> to default to the ASCII mappings.
*/
@SuppressWarnings("serial")
public interface W32API extends StdCallLibrary, W32Errors {
/** Standard options to use the unicode version of a w32 API. */
Map<String, Object> UNICODE_OPTIONS = new HashMap<String, Object>() {
{
put(OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE);
put(OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.UNICODE);
}
};
/** Standard options to use the ASCII/MBCS version of a w32 API. */
Map<String, Object> ASCII_OPTIONS = new HashMap<String, Object>() {
{
put(OPTION_TYPE_MAPPER, W32APITypeMapper.ASCII);
put(OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.ASCII);
}
};
Map<String, Object> DEFAULT_OPTIONS = Boolean.getBoolean("w32.ascii") ? ASCII_OPTIONS : UNICODE_OPTIONS; //$NON-NLS-1$
class HANDLE extends PointerType {
private boolean immutable;
public HANDLE() {
}
public HANDLE(final Pointer p) {
setPointer(p);
immutable = true;
}
/** Override to the appropriate object for INVALID_HANDLE_VALUE. */
@Override
public Object fromNative(final Object nativeValue, final FromNativeContext context) {
final Object o = super.fromNative(nativeValue, context);
if (INVALID_HANDLE_VALUE.equals(o)) {
return INVALID_HANDLE_VALUE;
}
return o;
}
@Override
public void setPointer(final Pointer p) {
if (immutable) {
throw new UnsupportedOperationException("immutable reference"); //$NON-NLS-1$
}
super.setPointer(p);
}
}
class WORD extends IntegerType {
public WORD() {
this(0);
}
public WORD(final long value) {
super(2, value);
}
}
class DWORD extends IntegerType {
public DWORD() {
this(0);
}
public DWORD(final long value) {
super(4, value);
}
}
class LONG extends IntegerType {
public LONG() {
this(0);
}
public LONG(final long value) {
super(Native.LONG_SIZE, value);
}
}
class HDC extends HANDLE {
}
class HICON extends HANDLE {
}
class HBITMAP extends HANDLE {
}
class HRGN extends HANDLE {
}
class HWND extends HANDLE {
public HWND() {
}
public HWND(final Pointer p) {
super(p);
}
}
class HINSTANCE extends HANDLE {
}
class HMODULE extends HINSTANCE {
}
class HRESULT extends NativeLong {
public boolean succeeded() {
return intValue() >= 0;
}
public boolean failed() {
return intValue() < 0;
}
}
/** Constant value representing an invalid HANDLE. */
HANDLE INVALID_HANDLE_VALUE = new HANDLE(Pointer.createConstant(0xffffffff));
/** Special HWND value. */
HWND HWND_BROADCAST = new HWND(Pointer.createConstant(0xFFFF));
/** LPHANDLE */
class HANDLEByReference extends ByReference {
public HANDLEByReference() {
this(null);
}
public HANDLEByReference(final HANDLE h) {
super(Pointer.SIZE);
setValue(h);
}
public void setValue(final HANDLE h) {
getPointer().setPointer(0, h != null ? h.getPointer() : null);
}
public HANDLE getValue() {
final Pointer p = getPointer().getPointer(0);
if (p == null) {
return null;
}
if (INVALID_HANDLE_VALUE.getPointer().equals(p)) {
return INVALID_HANDLE_VALUE;
}
final HANDLE h = new HANDLE();
h.setPointer(p);
return h;
}
}
class LONG_PTR extends IntegerType {
public LONG_PTR() {
this(0);
}
public LONG_PTR(final long value) {
super(Pointer.SIZE, value);
}
}
class SSIZE_T extends LONG_PTR {
public SSIZE_T() {
this(0);
}
public SSIZE_T(final long value) {
super(value);
}
}
class ULONG_PTR extends IntegerType {
public ULONG_PTR() {
this(0);
}
public ULONG_PTR(final long value) {
super(Pointer.SIZE, value);
}
}
class SIZE_T extends ULONG_PTR {
public SIZE_T() {
this(0);
}
public SIZE_T(final long value) {
super(value);
}
}
class LPARAM extends LONG_PTR {
public LPARAM() {
this(0);
}
public LPARAM(final long value) {
super(value);
}
}
class LRESULT extends LONG_PTR {
public LRESULT() {
this(0);
}
public LRESULT(final long value) {
super(value);
}
}
class UINT_PTR extends IntegerType {
public UINT_PTR() {
super(Pointer.SIZE);
}
public UINT_PTR(final long value) {
super(Pointer.SIZE, value);
}
public Pointer toPointer() {
return Pointer.createConstant(longValue());
}
}
class WPARAM extends UINT_PTR {
public WPARAM() {
this(0);
}
public WPARAM(final long value) {
super(value);
}
}
}