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.lang.jnaerator.runtime.Structure;
22  import com.sun.jna.NativeLibrary;
23  import com.sun.jna.Pointer;
24  
25  public class GlobalStruct<S extends Structure<?, ?, ?>> extends Global {
26  	S value;
27  	Class<S> valueClass;
28  	public GlobalStruct(NativeLibrary library, Class<S> valueClass, String... symbols) {
29  		super(library, symbols);
30  		this.valueClass = valueClass;
31  	}
32  	public S get() {
33  		if (value == null) {
34  			value = newInstance();
35  			Pointer p = getPointer();
36  			if (!isByValue())
37  				p = p.getPointer(0);
38  			value.use(p);
39  		}
40  		value.read();
41  		return value;
42  	}
43  	protected S newInstance() {
44  		try {
45  			return valueClass.newInstance();
46  		} catch (Exception e) {
47  			throw new RuntimeException(e);
48  		}
49  	}
50  	public void set(S value) {
51  		if (isByValue()) {
52  			Pointer p = getPointer();
53  			int s = value.size();
54  			p.write(0, value.getPointer().getByteArray(0, s), 0, s);
55  			get();
56  		} else {
57  			this.value = value;
58  			getPointer().setPointer(0, value.getPointer());
59  		}
60  	}
61  	protected boolean isByValue() {
62  		return com.sun.jna.Structure.ByValue.class.isAssignableFrom(valueClass);
63  	}
64  }