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.ochafik.util.string.StringUtils;
22  import com.sun.jna.NativeLibrary;
23  import com.sun.jna.Pointer;
24  import com.sun.jna.PointerType;
25  
26  public abstract class GlobalPrimitive<T extends PointerType> extends Global {
27  	protected final Class<T> type;
28  	protected boolean indirected = false;
29  	public GlobalPrimitive(NativeLibrary library, Class<T> type, String... symbols) {
30  		super(library, symbols);
31  		this.type = type;
32  	}
33  	protected T value;
34  	protected T getValue() {
35  		if (value == null) {
36  			try {
37  				value = type.newInstance();
38  			} catch (Exception e) {
39  				throw new RuntimeException("Failed to instantiate pointer to " + StringUtils.implode(symbols, "/"), e);
40  			}
41  			Pointer pointer = getPointer();
42  			if (indirected) {
43  				pointer = pointer.getPointer(0);
44  			}
45  			value.setPointer(pointer);
46  		}
47  		return value;
48  	}
49  	@Override
50  	public String toString() {
51  		try {
52  			return String.valueOf(getClass().getMethod("get").invoke(this));
53  		} catch (Throwable t) {
54  			return super.toString();
55  		}
56  	}
57  }