001    /*
002            Copyright (c) 2009 Olivier Chafik, All Rights Reserved
003            
004            This file is part of JNAerator (http://jnaerator.googlecode.com/).
005            
006            JNAerator is free software: you can redistribute it and/or modify
007            it under the terms of the GNU Lesser General Public License as published by
008            the Free Software Foundation, either version 3 of the License, or
009            (at your option) any later version.
010            
011            JNAerator is distributed in the hope that it will be useful,
012            but WITHOUT ANY WARRANTY; without even the implied warranty of
013            MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014            GNU Lesser General Public License for more details.
015            
016            You should have received a copy of the GNU Lesser General Public License
017            along with JNAerator.  If not, see <http://www.gnu.org/licenses/>.
018    */
019    package com.ochafik.lang.jnaerator.runtime.globals;
020    
021    import com.ochafik.lang.jnaerator.runtime.Structure;
022    import com.sun.jna.NativeLibrary;
023    import com.sun.jna.Pointer;
024    
025    public class GlobalStruct<S extends Structure<?, ?, ?>> extends Global {
026            S value;
027            Class<S> valueClass;
028            public GlobalStruct(NativeLibrary library, Class<S> valueClass, String... symbols) {
029                    super(library, symbols);
030                    this.valueClass = valueClass;
031            }
032            public S get() {
033                    if (value == null) {
034                            value = newInstance();
035                            Pointer p = getPointer();
036                            if (!isByValue())
037                                    p = p.getPointer(0);
038                            value.use(p);
039                    }
040                    value.read();
041                    return value;
042            }
043            protected S newInstance() {
044                    try {
045                            return valueClass.newInstance();
046                    } catch (Exception e) {
047                            throw new RuntimeException(e);
048                    }
049            }
050            public void set(S value) {
051                    if (isByValue()) {
052                            Pointer p = getPointer();
053                            int s = value.size();
054                            p.write(0, value.getPointer().getByteArray(0, s), 0, s);
055                            get();
056                    } else {
057                            this.value = value;
058                            getPointer().setPointer(0, value.getPointer());
059                    }
060            }
061            protected boolean isByValue() {
062                    return com.sun.jna.Structure.ByValue.class.isAssignableFrom(valueClass);
063            }
064    }