View Javadoc

1   /*
2   	Copyright (c) 2009 Olivier Chafik, All Rights Reserved
3   	
4   	This file is part of JNAerator (http://jnaerator.googlecode.com/).
5   	
6   	JNAerator is free software: you can redistribute it and/or modify
7   	it under the terms of the GNU Lesser General Public License as published by
8   	the Free Software Foundation, either version 3 of the License, or
9   	(at your option) any later version.
10  	
11  	JNAerator is distributed in the hope that it will be useful,
12  	but WITHOUT ANY WARRANTY; without even the implied warranty of
13  	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  	GNU Lesser General Public License for more details.
15  	
16  	You should have received a copy of the GNU Lesser General Public License
17  	along with JNAerator.  If not, see <http://www.gnu.org/licenses/>.
18  */
19  package com.ochafik.lang.jnaerator.runtime.globals;
20  
21  import com.sun.jna.Callback;
22  import com.sun.jna.CallbackReferenceHack;
23  import com.sun.jna.NativeLibrary;
24  
25  public class GlobalCallback<T extends Callback> extends Global {
26  	protected final Class<T> type;
27  	public GlobalCallback(NativeLibrary library, Class<T> type, String... symbols) {
28  		super(library, symbols);
29  		this.type = type;
30  	}
31  	protected T value;
32  	@SuppressWarnings("unchecked")
33  	public T get() {
34  		if (value == null) {
35  			value = (T)CallbackReferenceHack.getCallback(type, getPointer());
36  		}
37  		return value;
38  	}
39  	public void set(T value) {
40  		getPointer().setPointer(0, CallbackReferenceHack.getFunctionPointer(this.value = value));
41  	}
42  	
43  	@Override
44  	public String toString() {
45  		try {
46  			return String.valueOf(getClass().getMethod("get").invoke(this));
47  		} catch (Throwable t) {
48  			return super.toString();
49  		}
50  	}
51  }