1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
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  }