001 /* 002 Copyright (c) 2009 Olivier Chafik, All Rights Reserved 003 004 This file is part of JNAerator (http://jnaerator.googlecode.com/). 005 006 JNAerator is free software: you can redistribute it and/or modify 007 it under the terms of the GNU Lesser General Public License as published by 008 the Free Software Foundation, either version 3 of the License, or 009 (at your option) any later version. 010 011 JNAerator is distributed in the hope that it will be useful, 012 but WITHOUT ANY WARRANTY; without even the implied warranty of 013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 GNU Lesser General Public License for more details. 015 016 You should have received a copy of the GNU Lesser General Public License 017 along with JNAerator. If not, see <http://www.gnu.org/licenses/>. 018 */ 019 package com.ochafik.lang.jnaerator.runtime.globals; 020 021 import com.sun.jna.Callback; 022 import com.sun.jna.CallbackReferenceHack; 023 import com.sun.jna.NativeLibrary; 024 025 public class GlobalCallback<T extends Callback> extends Global { 026 protected final Class<T> type; 027 public GlobalCallback(NativeLibrary library, Class<T> type, String... symbols) { 028 super(library, symbols); 029 this.type = type; 030 } 031 protected T value; 032 @SuppressWarnings("unchecked") 033 public T get() { 034 if (value == null) { 035 value = (T)CallbackReferenceHack.getCallback(type, getPointer()); 036 } 037 return value; 038 } 039 public void set(T value) { 040 getPointer().setPointer(0, CallbackReferenceHack.getFunctionPointer(this.value = value)); 041 } 042 043 @Override 044 public String toString() { 045 try { 046 return String.valueOf(getClass().getMethod("get").invoke(this)); 047 } catch (Throwable t) { 048 return super.toString(); 049 } 050 } 051 }