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 }