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 }