From 890c3c0d321c3b59ec1224d4630b3f2401ef94e7 Mon Sep 17 00:00:00 2001 From: tkellner Date: Tue, 7 Jan 2014 17:28:54 +0000 Subject: Add custom PC/SC library for MacOS X from OpeneCard project git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@1276 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4 --- .../java/org/openecard/scio/osx/PlatformPCSC.java | 125 +++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 smcc/src/main/java/org/openecard/scio/osx/PlatformPCSC.java (limited to 'smcc/src/main/java/org/openecard/scio/osx/PlatformPCSC.java') diff --git a/smcc/src/main/java/org/openecard/scio/osx/PlatformPCSC.java b/smcc/src/main/java/org/openecard/scio/osx/PlatformPCSC.java new file mode 100644 index 00000000..bbc48bc0 --- /dev/null +++ b/smcc/src/main/java/org/openecard/scio/osx/PlatformPCSC.java @@ -0,0 +1,125 @@ +/**************************************************************************** + * Copyright (C) 2012-2013 ecsec GmbH. + * All rights reserved. + * Contact: ecsec GmbH (info@ecsec.de) + * + * This file is part of the Open eCard App. + * + * GNU General Public License Usage + * This file may be used under the terms of the GNU General Public + * License version 3.0 as published by the Free Software Foundation + * and appearing in the file LICENSE.GPL included in the packaging of + * this file. Please review the following information to ensure the + * GNU General Public License version 3.0 requirements will be met: + * http://www.gnu.org/copyleft/gpl.html. + * + * Other Usage + * Alternatively, this file may be used in accordance with the terms + * and conditions contained in a signed written agreement between + * you and ecsec GmbH. + * + ***************************************************************************/ + +package org.openecard.scio.osx; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.AccessController; +import java.security.PrivilegedAction; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * OS X specific PlatformPCSC. For more information see {@link package-info}. + * + * @author Benedikt Biallowons + */ +public class PlatformPCSC { + + private static final String PCSC_JNI_LIBRARY_PATH = "/at/gv/egiz/smcc/osx-pcsc-jni/"; + private static final String PCSC_JNI_LIBRARY_NAME = "libosxj2pcsc.dylib"; + private static final String PCSC_FRAMEWORK = "/System/Library/Frameworks/PCSC.framework/Versions/Current/PCSC"; + + private final static Logger log = LoggerFactory.getLogger(PlatformPCSC.class); + + public static final int SCARD_PROTOCOL_T0 = 0x0001; + public static final int SCARD_PROTOCOL_T1 = 0x0002; + public static final int SCARD_PROTOCOL_RAW = 0x0004; + public static final int SCARD_UNKNOWN = 0x0001; + public static final int SCARD_ABSENT = 0x0002; + public static final int SCARD_PRESENT = 0x0004; + public static final int SCARD_SWALLOWED = 0x0008; + public static final int SCARD_POWERED = 0x0010; + public static final int SCARD_NEGOTIABLE = 0x0020; + public static final int SCARD_SPECIFIC = 0x0040; + + public static final Exception INIT_EXCEPTION; + + static { + INIT_EXCEPTION = AccessController + .doPrivileged(new PrivilegedAction() { + public Exception run() { + try { + String[] parts = PCSC_JNI_LIBRARY_NAME.split("\\."); + + File tempFile = File.createTempFile(parts[0], parts[1]); + tempFile.deleteOnExit(); + + log.debug("Copying " + PCSC_JNI_LIBRARY_PATH + getLibrary() + " to " + tempFile); + InputStream is = PlatformPCSC.class + .getResourceAsStream(PCSC_JNI_LIBRARY_PATH + getLibrary()); + + if (is == null) { + return new FileNotFoundException(getLibrary() + " not found."); + } + + OutputStream os = new FileOutputStream(tempFile); + + try { + byte[] buffer = new byte[1024]; + int readBytes; + + while ((readBytes = is.read(buffer)) != -1) { + os.write(buffer, 0, readBytes); + } + + log.debug("loading " + tempFile.getAbsolutePath()); + System.load(tempFile.getAbsolutePath()); + initialize(PCSC_FRAMEWORK); + } finally { + os.close(); + is.close(); + } + + return null; + } catch (Exception e) { + return e; + } + } + }); + } + + /** + * Chooses a suitable JNI library depending the current JRE. + * + * @return library filename + */ + private static String getLibrary() { + String javaVersion = System.getProperty("java.version"); + + if (javaVersion.startsWith("1.6")) { + return "jre6." + PCSC_JNI_LIBRARY_NAME; + } else if (javaVersion.startsWith("1.7")) { + return "jre7." + PCSC_JNI_LIBRARY_NAME; + } + + return null; + } + + private static native void initialize(String libraryName); + +} -- cgit v1.2.3