001: /*
002: * $Id: COIOSHelper.java 2036 2008-02-09 11:14:05Z jponge $
003: * IzPack - Copyright 2001-2008 Julien Ponge, All Rights Reserved.
004: *
005: * http://izpack.org/
006: * http://izpack.codehaus.org/
007: *
008: * Copyright 2005 Klaus Bartz
009: *
010: * Licensed under the Apache License, Version 2.0 (the "License");
011: * you may not use this file except in compliance with the License.
012: * You may obtain a copy of the License at
013: *
014: * http://www.apache.org/licenses/LICENSE-2.0
015: *
016: * Unless required by applicable law or agreed to in writing, software
017: * distributed under the License is distributed on an "AS IS" BASIS,
018: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
019: * See the License for the specific language governing permissions and
020: * limitations under the License.
021: */
022:
023: package com.coi.tools.os.izpack;
024:
025: import com.izforge.izpack.util.Librarian;
026: import com.izforge.izpack.util.NativeLibraryClient;
027:
028: /**
029: *
030: * Base class to handle multiple native methods of multiple classes in one shared library. This is a
031: * singelton class.
032: *
033: * @author Klaus Bartz
034: *
035: */
036: public class COIOSHelper {
037:
038: private static COIOSHelper self = null;
039:
040: private static int used = 0;
041:
042: private static boolean destroyed = false;
043:
044: private boolean failed = false;
045:
046: /**
047: * This method is used to free the library at the end of progam execution. After this call, any
048: * instance of this class will not be usable any more!
049: *
050: * @param name the name of the library to free. Use only the name and extension but not the
051: * path.
052: */
053: private native void FreeLibrary(String name);
054:
055: /**
056: * Default constructor, do not use
057: */
058: private COIOSHelper() {
059: super ();
060: }
061:
062: /**
063: * Returns the one existent object of this class.
064: *
065: * @return the one existent object of this class
066: */
067: public static synchronized COIOSHelper getInstance() {
068: if (self == null)
069: self = new COIOSHelper();
070: return (self);
071:
072: }
073:
074: /*--------------------------------------------------------------------------*/
075: /**
076: * This method is used to free the library at the end of progam execution. This is the method of
077: * the helper class which will be called from other objects. After this call, any instance of
078: * this class will not be usable any more! <b><i><u>Note that this method does NOT return </u>
079: * at the first call, but at any other </i> </b> <br>
080: * <br>
081: * <b>DO NOT CALL THIS METHOD DIRECTLY! </b> <br>
082: * It is used by the librarian to free the native library before physically deleting it from its
083: * temporary loaction. A call to this method will freeze the application irrecoverably!
084: *
085: * @param name the name of the library to free. Use only the name and extension but not the
086: * path.
087: *
088: * @see com.izforge.izpack.util.NativeLibraryClient#freeLibrary
089: */
090: /*--------------------------------------------------------------------------*/
091: /**
092: * @param name
093: */
094: public void freeLibrary(String name) {
095: used--;
096: if (!destroyed) {
097: FreeLibrary(name);
098: destroyed = true;
099: }
100: }
101:
102: /**
103: * Add a NativeLibraryClient as dependant to this object. The method tries to load the shared
104: * library COIOSHelper which should contain native methods for the dependant.
105: *
106: * @param dependant to be added
107: * @throws Exception if loadLibrary for the needed lib fails
108: */
109: public void addDependant(NativeLibraryClient dependant)
110: throws Exception {
111: used++;
112: if (failed)
113: throw (new Exception("load native library failed"));
114: try {
115: Librarian.getInstance().loadLibrary("COIOSHelper",
116: dependant);
117: } catch (UnsatisfiedLinkError exception) {
118: failed = true;
119: throw (new Exception("could not locate native library"));
120: } catch (Throwable t) {
121: failed = true;
122: throw (new Exception(t));
123: }
124:
125: }
126:
127: }
|