Hi, here is a patch for libOCFPCSC1 that works in 64-bit Linux, tested
on Debian-64.
Unforturnately the Java classes in com.ibm.opencard.terminal.pcsc10 must
also updated so that OCFPCSC1.java matches the new header file. Those
changes are pretty obvious, but I can provide a patch for that as well
if someone is willing to receive it :-)
Since the original code was wrong, using ints to represent longs, I
think this change is unevitable and it's best to bite the bullet.
The patch is against the latest svn code and made with 'svn diff'.
The patch includes the 64-bit API changes by me and also a lot of
changes by my collegue Lars Silvén. His changes brings the code up to
sync with modern systems, makes it compile and link cleanly on linux and
also on cygwin to produce a windows dll.
Have fun.
Cheers,
Tomas
Ludovic Rousseau wrote:
On 14/09/05, Tomas Gustavsson <[EMAIL PROTECTED]> wrote:
Hi,
Hello,
I cant help but notice that the OCF PC/CS shim in the download area of Muscle's
homwpage is very old. Is it only us using this anymore? Is there some other Java
API besides OpenCard that is recommended?
Anyhow, the current OCFPCSC does not work in a 64-bit linux environment, it uses
a lot of int->long and long->int casts that messes things up.
I fixed up the API using longs where there should be longs. This also requires
changes to the OpenCard Pcsc10CardTerminal java classes. Thanks to the open
source, this is luckily not a problem. With these small changes it seems to work
on 64-bit linux, and should work on 32-bit as well (haven't tested yet) since
it's really bugfixes.
What's the interest in libOCFPCSC1 these days? Is it time for an update?
You can get the latest version from subversion [1] or [2] and send me
a patch with your modifications.
I don't know if it is time for a new release but we should not lose
your patches.
Thanks,
[1] http://svn.debian.org/wsvn/pcsclite/trunk/Drivers/ocfBridge/?rev=0&sc=0
[2] http://svn.debian.org/ project pcsclite
Index: ocfBridge/OCFPCSC1.cpp
===================================================================
--- ocfBridge/OCFPCSC1.cpp (revision 1650)
+++ ocfBridge/OCFPCSC1.cpp (arbetskopia)
@@ -34,13 +34,15 @@
*/
/*
+ * Changes for 64-bit Linux by Tomas Gustavsson ([EMAIL PROTECTED]).
+ * Note that the 64-bit version of this library requires changes to the java
classes
+ * in com.ibm.opencard.terminal.pcsc10.
+ *
* Author: Stephan Breideneich ([EMAIL PROTECTED])
* Version: $Id$
*/
-#include <stdio.h>
-#include <stdlib.h>
-#include <memory.h>
+#include <memory>
//#include <windows.h>
#include "Tracer.h"
@@ -53,8 +55,6 @@
#include <winscard.h>
-#define LPCTSTR LPCSTR
-
/*
* Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
* Method: initTrace
@@ -62,8 +62,7 @@
*/
JNIEXPORT void JNICALL Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_initTrace
(JNIEnv *env, jobject obj) {
-
- //initTrace(env, obj);
+ initTrace(env, obj);
}
/*
@@ -71,7 +70,7 @@
* Method: SCardEstablishContext
* Signature: (I)I
*/
-JNIEXPORT jint JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardEstablishContext
+JNIEXPORT jlong JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardEstablishContext
(JNIEnv *env, jobject obj, jint scope) {
CONTEXT_INFO cInfo;
@@ -92,7 +91,7 @@
*/
addContext(cInfo);
- return (jint)cInfo.context;
+ return cInfo.context;
}
@@ -102,11 +101,11 @@
* Signature: (I)V
*/
JNIEXPORT void JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardReleaseContext
- (JNIEnv *env, jobject obj, jint context) {
+ (JNIEnv *env, jobject obj, jlong context) {
long returnCode;
- if (isContextAvailable((long)context) < 0) {
+ if (isContextAvailable(context) < 0) {
throwPcscException(env, obj, "SCardReleaseContext", "tried to release
a non-existing context",0);
return;
}
@@ -114,7 +113,7 @@
/* delete the context from the internal table */
removeContext(context);
- returnCode = SCardReleaseContext((SCARDCONTEXT)context);
+ returnCode = SCardReleaseContext(context);
if (returnCode != SCARD_S_SUCCESS) {
throwPcscException(env, obj, "SCardReleaseContext", "PC/SC Error
SCardReleaseContext", returnCode);
return;
@@ -128,25 +127,26 @@
* Method: SCardConnect
* Signature: (ILjava/lang/String;IILjava/lang/Integer;)I
*/
-JNIEXPORT jint JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardConnect
- (JNIEnv *env, jobject obj, jint context, jstring jReader,
+JNIEXPORT jlong JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardConnect
+ (JNIEnv *env, jobject obj, jlong context, jstring jReader,
jint jShareMode, jint jPreferredProtocol, jobject jActiveProtocol) {
const char *readerUTF;
- long cardHandle;
+ SCARDHANDLE cardHandle;
DWORD activeProtocol;
int cPos;
long returnCode;
CONTEXT_INFO cInfo;
/* check if context exists */
- if (cPos = isContextAvailable((long)context) < 0) {
+ cPos = isContextAvailable(context);
+ if (cPos < 0) {
throwPcscException(env, obj, "SCardConnect", "PC/SC Wrapper Error: context
not in table", 0);
return 0;
}
// get contextInformationRecord
- cInfo = getContextInfoViaContext((SCARDCONTEXT)context);
+ cInfo = getContextInfoViaContext(context);
if (cInfo.context == 0) {
throwPcscException(env, obj, "SCardConnect", "PC/SC Wrapper Error:
couldn't get context information record", 0);
return 0;
@@ -175,12 +175,46 @@
cInfo.cardHandle = cardHandle;
cInfo.protocol = activeProtocol;
+
// store the current context information
if (setContextInformation(cInfo) != 0) {
throwPcscException(env, obj, "SCardConnect", "PC/SC Wrapper Error:
couldn't store context information record", 0);
return 0;
}
+#ifdef __MINGW32__
+ {
+ char lpInBuffer[] = { '\x83', '\x01', '\x07', '\x00', '\x80', '\xA9',
'\x03', '\x00' };
+#define OUT_SIZE 0
+ DWORD nOutBufferSize(OUT_SIZE);
+ char lpOutBuffer[OUT_SIZE];
+ DWORD bytesReturned;
+ DWORD* pTime;
+ pTime = (DWORD*)(lpInBuffer+4);
+ *pTime = 240000;
+// {
+// char resultS[50];
+// sprintf( resultS, "in buffer: %#x %#x %#x %#x %#x %#x %#x %#x",
+// lpInBuffer[0], lpInBuffer[1], lpInBuffer[2],
lpInBuffer[3], lpInBuffer[4], lpInBuffer[5], lpInBuffer[6], lpInBuffer[7],
lpInBuffer[8] );
+// MessageBox(NULL, resultS, NULL, MB_OK);
+// }
+ LONG return_code( SCardControl(cardHandle,
+ SCARD_CTL_CODE(2050),
+ lpInBuffer,
+ sizeof lpInBuffer,
+ lpOutBuffer,
+ nOutBufferSize,
+ &bytesReturned) );
+// if ( bytesReturned==0 && return_code==SCARD_S_SUCCESS)
+// MessageBox(NULL, "OK!", NULL, MB_OK);
+// else {
+// char resultS[50];
+// sprintf( resultS,"return code is: %lx, string: %s, out length
%i", return_code,
+// lpOutBuffer, bytesReturned );
+// MessageBox(NULL, resultS, NULL, MB_OK);
+// }
+ }
+#endif
return cardHandle;
}
@@ -191,7 +225,7 @@
* Signature: (IIIILjava/lang/Integer;)V
*/
JNIEXPORT void JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardReconnect
- (JNIEnv *env, jobject obj, jint card, jint shareMode,
+ (JNIEnv *env, jobject obj, jlong card, jint shareMode,
jint preferredProtocols, jint initialization, jobject jActiveProtocoll) {
long returnCode;
@@ -199,19 +233,17 @@
CONTEXT_INFO cInfo;
// get the existing context informations
- cInfo = getContextInfoViaCardHandle((SCARDHANDLE)card);
+ cInfo = getContextInfoViaCardHandle(card);
if (cInfo.context == 0) {
throwPcscException(env, obj, "SCardReconnect", "PC/SC Wrapper Error:
couldn't get context information record", 0);
return;
}
- /*
returnCode = SCardReconnect((SCARDHANDLE)card,
(DWORD)shareMode,
(DWORD)preferredProtocols,
(DWORD)initialization,
(LPDWORD)&activeProtocol);
- */
if (returnCode != SCARD_S_SUCCESS) {
throwPcscException(env, obj, "SCardReconnect", "PC/SC Error
SCardReconnect", returnCode);
@@ -237,20 +269,20 @@
* Signature: (II)V
*/
JNIEXPORT void JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardDisconnect
- (JNIEnv *env, jobject obj, jint card, jint disposition) {
+ (JNIEnv *env, jobject obj, jlong card, jint disposition) {
long returnCode;
CONTEXT_INFO cInfo;
// get the contextInfo from the table
- cInfo = getContextInfoViaCardHandle((SCARDHANDLE)card);
+ cInfo = getContextInfoViaCardHandle(card);
if (cInfo.context == 0) {
throwPcscException(env, obj, "SCardDisconnect", "PC/SC Wrapper Error:
couldn't get context information record", 0);
return;
}
- returnCode = SCardDisconnect((SCARDHANDLE)card, (DWORD)disposition);
- if ((returnCode != SCARD_S_SUCCESS) && (returnCode != SCARD_W_REMOVED_CARD))
{
+ returnCode = SCardDisconnect(card, (DWORD)disposition);
+ if ((returnCode != SCARD_S_SUCCESS) && (returnCode !=
(signed)SCARD_W_REMOVED_CARD)) {
throwPcscException(env, obj, "SCardDisconnect", "PC/SC Error
SCardDisconnect", returnCode);
return;
}
@@ -274,9 +306,8 @@
* Signature: (II[Lcom/ibm/opencard/terminal/pcsc10/PcscReaderState;)V
*/
JNIEXPORT void JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardGetStatusChange
- (JNIEnv *env, jobject obj, jint context, jint timeout, jobjectArray
jReaderState) {
+ (JNIEnv *env, jobject obj, jlong context, jint timeout, jobjectArray
jReaderState) {
- SCARD_READERSTATE *readerState;
int numReaderState;
int ii;
long returnCode;
@@ -293,41 +324,37 @@
return;
}
- readerState = (SCARD_READERSTATE *)malloc(numReaderState *
sizeof(SCARD_READERSTATE));
+ SCARD_READERSTATE readerState[numReaderState];
if (readerState == NULL) {
throwPcscException(env, obj, "SCardGetStatusChange", "error allocating
memory for the readerState buffer", 0);
return;
}
/* clear the allocated memory */
- memset(readerState, 0x00, numReaderState * sizeof(SCARD_READERSTATE));
+ memset(readerState, 0x00, sizeof(readerState));
/* Now get each Java reader state structure and translate it into C++ */
for (ii=0; ii<numReaderState; ii++) {
objReaderState = env->GetObjectArrayElement(jReaderState, ii);
if (env->ExceptionOccurred() != NULL) {
- free(readerState);
throwPcscException(env, obj, "SCardGetStatusChange", "error getting
elements from the readerState array", 0);
return;
}
returnCode = getIntField(env, objReaderState, "CurrentState", (long
*)&readerState[ii].dwCurrentState);
if (returnCode) {
- free(readerState);
throwPcscException(env, obj, "SCardGetStatusChange", "error getting
CurrentState field from the readerState record", 0);
return;
}
returnCode = getIntField(env, objReaderState, "EventState",
(long*)&readerState[ii].dwEventState);
if (returnCode) {
- free(readerState);
throwPcscException(env, obj, "SCardGetStatusChange", "error getting
EventState field from the readerState record", 0);
return;
}
readerState[ii].szReader = (const char *)accessStringField(env,
objReaderState, "Reader");
if (readerState[ii].szReader == NULL) {
- free(readerState);
throwPcscException(env, obj, "SCardGetStatusChange", "error getting
Reader field from readerState record", 0);
return;
}
@@ -335,7 +362,6 @@
int maxSize;
returnCode = accessByteArray(env, objReaderState, "UserData", (unsigned
char **)&readerState[ii].pvUserData, &maxSize);
if (returnCode) {
- free(readerState);
throwPcscException(env, obj, "SCardGetStatusChange", "error getting
UserData field from readerState record", 0);
return;
}
@@ -343,47 +369,40 @@
/* set the response timeout to 1000ms */
- returnCode = SCardGetStatusChange((SCARDCONTEXT)context, 1000, readerState,
numReaderState);
+ returnCode = SCardGetStatusChange(context, 1000, readerState,
numReaderState);
if (returnCode != SCARD_S_SUCCESS) {
- free(readerState);
throwPcscException(env, obj, "SCardGetStatusChange", "error executing
SCardGetStatusChange", returnCode);
return;
}
- readerState[0].dwCurrentState = readerState[0].dwEventState;
-
/* write back the informations from the readerStatus to the java structures
*/
for (ii=0; ii<numReaderState; ii++) {
objReaderState = env->GetObjectArrayElement(jReaderState, ii);
if (env->ExceptionOccurred() != NULL) {
- free(readerState);
throwPcscException(env, obj, "SCardGetStatusChange", "error getting
array elements", returnCode);
return;
}
returnCode = setIntField(env, objReaderState, "EventState",
readerState[ii].dwEventState);
if (returnCode) {
- free(readerState);
throwPcscException(env, obj, "SCardGetStatusChange", "error setting the
EventState field", returnCode);
return;
}
returnCode = releaseStringField(env, objReaderState, "Reader", (const char
*)readerState[ii].szReader);
if (returnCode) {
- free(readerState);
throwPcscException(env, obj, "SCardGetStatusChange", "error setting the
Reader field", returnCode);
return;
}
returnCode = releaseByteArray(env, objReaderState, "UserData", (unsigned
char *)readerState[ii].pvUserData);
if (returnCode) {
- free(readerState);
throwPcscException(env, obj, "SCardGetStatusChange", "error setting the
UserData", returnCode);
return;
}
// buffer for length of ATR
- jsize lenATR = (jsize)readerState[0].cbAtr;
+ jsize lenATR = (jsize)readerState[ii].cbAtr;
// check the length of the ATR in the PCSC ReaderState
// if > 0 copy ATR to java ReaderState
@@ -407,8 +426,6 @@
}
}
- free(readerState);
-
return;
}
@@ -419,25 +436,22 @@
* Signature: (II)[B
*/
JNIEXPORT jbyteArray JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardGetAttrib
- (JNIEnv *env, jobject obj, jint card, jint attrId) {
-
+ (JNIEnv *env, jobject obj, jlong card, jint attrId) {
+#ifdef __MINGW32__
long returnCode;
DWORD lenAttr;
jbyte attrArray[36];
jbyteArray jAttrArray;
-
/* length of temp buffer */
lenAttr = 36;
/* get the attribute information from the reader */
- /*
- returnCode = SCardGetAttrib((SCARDHANDLE)card,
+ returnCode = SCardGetAttrib(card,
(DWORD)attrId,
(LPBYTE)attrArray,
(LPDWORD)&lenAttr);
- */
-
+
if (returnCode != SCARD_S_SUCCESS) {
throwPcscException(env, obj, "SCardGetAttrib", "error retrieving attribute
data from reader", returnCode);
return NULL;
@@ -456,6 +470,9 @@
return NULL;
return jAttrArray;
+#else
+ return NULL;
+#endif
}
@@ -465,8 +482,8 @@
* Signature: (II[B)[B
*/
JNIEXPORT jbyteArray JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardControl
- (JNIEnv *env, jobject obj, jint jCardHandle, jint jControlCode, jbyteArray
jInBuffer) {
-
+ (JNIEnv *env, jobject obj, jlong jCardHandle, jint jControlCode, jbyteArray
jInBuffer) {
+#ifdef __MINGW32__
LONG returnCode;
DWORD lenInBuffer;
DWORD lenOutBuffer;
@@ -485,15 +502,13 @@
else
tmpInBuffer = NULL;
- /*
- returnCode = SCardControl((SCARDHANDLE)jCardHandle,
+ returnCode = SCardControl(jCardHandle,
(DWORD)jControlCode,
(LPCVOID)tmpInBuffer,
(DWORD)lenInBuffer,
(LPVOID)tmpOutBuffer,
(DWORD)lenOutBuffer,
&bytesReturned);
- */
if (returnCode != SCARD_S_SUCCESS) {
throwPcscException(env, obj, "SCardControl", "error occured", returnCode);
@@ -527,50 +542,67 @@
/* return the data */
return jOutBuffer;
+#else
+ return NULL;
+#endif
}
/*
* Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
* Method: SCardListReaders
- * Signature: (Ljava/lang/String;)[Ljava/lang/String;
+ * Signature: (Ljava/lang/String;I)[Ljava/lang/String;
*/
JNIEXPORT jobjectArray JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardListReaders
- (JNIEnv *env, jobject obj, jstring groups) {
+ (JNIEnv *env, jobject obj, jstring groups, jlong context) {
- SCARDCONTEXT hContext;
long returnCode;
DWORD lenReaderList;
- char *readerList;
jobjectArray readerArray;
+ int cPos;
+ CONTEXT_INFO cInfo;
/* get a pointer to the converted 8bit-version of the groups string */
const char *groupsUTF;
groupsUTF = (groups != NULL) ? env->GetStringUTFChars(groups, NULL) : NULL;
- SCardEstablishContext(SCARD_SCOPE_SYSTEM, 0, 0, &hContext);
+ /* check if context exists */
+ cPos = isContextAvailable(context);
+ if (cPos < 0) {
+ throwPcscException(env, obj, "SCardListReaders", "PC/SC Wrapper Error:
context not in table", 0);
+ return 0;
+ }
+ // get contextInformationRecord
+ cInfo = getContextInfoViaContext(context);
+ if (cInfo.context == 0) {
+ throwPcscException(env, obj, "SCardListReaders", "PC/SC Wrapper Error:
couldn't get context information record", 0);
+ return 0;
+ }
+
/* first retrieve the length of the readerlist */
/* the first parameter <context> is not needed. query is not directed to a
specific context */
- returnCode = SCardListReaders(hContext, 0, NULL, &lenReaderList);
+ returnCode = SCardListReaders((SCARDCONTEXT)context, (LPCTSTR)groupsUTF,
NULL, &lenReaderList);
// got the right length of the ReaderStr?
if (returnCode != SCARD_S_SUCCESS) {
env->ReleaseStringUTFChars(groups, groupsUTF);
throwPcscException(env, obj, "SCardListReaders", "error getting length of
reader list",returnCode);
- SCardReleaseContext(hContext);
return NULL;
}
/* allocate space for the reader list */
- readerList = (char *)malloc((size_t)lenReaderList + 1);
+ char readerList[(size_t)lenReaderList + 1];
/* the first parameter <context> is not needed. query is not directed to a
specific context */
- returnCode = SCardListReaders(hContext, 0, readerList, &lenReaderList);
+ returnCode = SCardListReaders((SCARDCONTEXT)context, (LPCTSTR)groupsUTF,
readerList, &lenReaderList);
- SCardReleaseContext(hContext);
+ // store the current context information
+ if (setContextInformation(cInfo) != 0) {
+ throwPcscException(env, obj, "SCardListReaders", "PC/SC Wrapper Error:
couldn't store context information record", 0);
+ return 0;
+ }
if (returnCode != SCARD_S_SUCCESS) {
- free(readerList);
throwPcscException(env, obj, "SCardListReaders", "error getting length of
readerlist",returnCode);
return NULL;
}
@@ -584,7 +616,7 @@
int ii;
int jj;
int numNames;
- for (ii=0, numNames=0; ii<lenReaderList; ) {
+ for (ii=0, numNames=0; ii<(signed)lenReaderList; ) {
numNames++;
ii += strlen(&readerList[ii])+1;
if (strlen(&readerList[ii]) == 0)
@@ -595,9 +627,8 @@
// make object array of proper size .....
- readerArray =
env->NewObjectArray(numNames,env->FindClass("java/lang/String"),NULL);
+ readerArray =
(jobjectArray)env->NewObjectArray(numNames,env->FindClass("java/lang/String"),NULL);
if (readerArray==NULL) {
- free(readerList);
throwPcscException(env, obj, "SCardListReaders", "error converting reader
list to array", 0);
return NULL;
}
@@ -611,14 +642,12 @@
name = &readerList[ii];
jname = env->NewStringUTF(name);
if (jname==NULL) {
- free(readerList);
throwPcscException(env, obj, "SCardListReaders", "error converting
reader list to array", 0);
return NULL;
}
env->SetObjectArrayElement(readerArray, jj, jname);
if (env->ExceptionOccurred() != NULL) {
- free(readerList);
throwPcscException(env, obj, "SCardListReaders", "error writing to
reader array", 0);
return NULL;
}
@@ -626,8 +655,6 @@
ii += strlen(name)+1;
}
- free(readerList);
-
/* 8bit-string not longer needed */
env->ReleaseStringUTFChars(groups, groupsUTF);
@@ -641,7 +668,7 @@
* Signature: (I[B)[B
*/
JNIEXPORT jbyteArray JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardTransmit
- (JNIEnv *env, jobject obj, jint jCard, jbyteArray jSendBuf) {
+ (JNIEnv *env, jobject obj, jlong jCard, jbyteArray jSendBuf) {
SCARD_IO_REQUEST sendPci;
SCARD_IO_REQUEST recvPci;
@@ -658,7 +685,7 @@
CONTEXT_INFO cInfo;
// get the contextInfo from the table (checks the active protocol of the
card connection)
- cInfo = getContextInfoViaCardHandle((SCARDHANDLE)jCard);
+ cInfo = getContextInfoViaCardHandle(jCard);
if (cInfo.context == 0) {
throwPcscException(env, obj, "SCardTransmit", "PC/SC Wrapper Error:
couldn't get context information record", 0);
return NULL;
@@ -705,7 +732,7 @@
lenRecvBuf = sizeof(tmpRecvBuf);
/* transmit the data */
- returnCode = SCardTransmit((SCARDHANDLE)jCard,
+ returnCode = SCardTransmit(jCard,
(LPSCARD_IO_REQUEST)&sendPci,(LPCBYTE)ptrSendBuf, lenSendBuf,
(LPSCARD_IO_REQUEST)&recvPci,(LPBYTE)tmpRecvBuf,&lenRecvBuf);
@@ -722,14 +749,51 @@
return jRecvBuf;
}
+/*
+ * Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
+ * Method: reset
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_reset
+ (JNIEnv *env, jobject obj) {
+ removeAllContexts();
+#ifndef __MINGW32__
+ SCardUnload();
+#endif
+}
-
-
-// $Log$
-// Revision 1.1 2001/11/21 01:00:10 corcoran
-// Initial revision
+// $Log: OCFPCSC1.cc,v $
+// Revision 1.9 2005/02/23 13:05:48 lars
+// using c++ and stl to fix memory problems
//
+// Revision 1.8 2005/02/04 14:22:58 lars
+// CAToken fixes
+//
+// Revision 1.7 2005/02/02 08:07:18 lars
+// changed to compile with new PCSC on linux
+//
+// Revision 1.6 2004/12/05 22:31:15 lars
+// new pcsc api
+//
+// Revision 1.5 2004/05/10 14:28:56 lars
+// debug info to stdout removed
+//
+// Revision 1.4 2004/03/15 10:00:53 lars
+// timeout as integer
+//
+// Revision 1.3 2004/03/12 20:45:09 lars
+// fixed to compile on linux
+//
+// Revision 1.2 2004/03/12 20:33:40 lars
+// timeout 4min on gemplus readers
+//
+// Revision 1.1 2004/03/12 16:39:38 lars
+// native code for OCF added
+//
+// Revision 1.1 2004/03/12 13:04:24 lars
+// support for OCF added
+//
// Revision 1.7 1998/06/09 14:24:04 breid
// SCardGetStatusChange: ATR-field added
//
Index: ocfBridge/OCFPCSC1.h
===================================================================
--- ocfBridge/OCFPCSC1.h (revision 1650)
+++ ocfBridge/OCFPCSC1.h (arbetskopia)
@@ -18,17 +18,17 @@
/*
* Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
* Method: SCardListReaders
- * Signature: (Ljava/lang/String;)[Ljava/lang/String;
+ * Signature: (Ljava/lang/String;I)[Ljava/lang/String;
*/
JNIEXPORT jobjectArray JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardListReaders
- (JNIEnv *, jobject, jstring);
+ (JNIEnv *, jobject, jstring, jlong);
/*
* Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
* Method: SCardEstablishContext
* Signature: (I)I
*/
-JNIEXPORT jint JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardEstablishContext
+JNIEXPORT jlong JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardEstablishContext
(JNIEnv *, jobject, jint);
/*
@@ -37,15 +37,15 @@
* Signature: (I)V
*/
JNIEXPORT void JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardReleaseContext
- (JNIEnv *, jobject, jint);
+ (JNIEnv *, jobject, jlong);
/*
* Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
* Method: SCardConnect
* Signature: (ILjava/lang/String;IILjava/lang/Integer;)I
*/
-JNIEXPORT jint JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardConnect
- (JNIEnv *, jobject, jint, jstring, jint, jint, jobject);
+JNIEXPORT jlong JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardConnect
+ (JNIEnv *, jobject, jlong, jstring, jint, jint, jobject);
/*
* Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
@@ -53,7 +53,7 @@
* Signature: (IIIILjava/lang/Integer;)V
*/
JNIEXPORT void JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardReconnect
- (JNIEnv *, jobject, jint, jint, jint, jint, jobject);
+ (JNIEnv *, jobject, jlong, jint, jint, jint, jobject);
/*
* Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
@@ -61,7 +61,7 @@
* Signature: (II)V
*/
JNIEXPORT void JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardDisconnect
- (JNIEnv *, jobject, jint, jint);
+ (JNIEnv *, jobject, jlong, jint);
/*
* Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
@@ -69,7 +69,7 @@
* Signature: (II[Lcom/ibm/opencard/terminal/pcsc10/PcscReaderState;)V
*/
JNIEXPORT void JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardGetStatusChange
- (JNIEnv *, jobject, jint, jint, jobjectArray);
+ (JNIEnv *, jobject, jlong, jint, jobjectArray);
/*
* Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
@@ -77,7 +77,7 @@
* Signature: (II)[B
*/
JNIEXPORT jbyteArray JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardGetAttrib
- (JNIEnv *, jobject, jint, jint);
+ (JNIEnv *, jobject, jlong, jint);
/*
* Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
@@ -85,7 +85,7 @@
* Signature: (II[B)[B
*/
JNIEXPORT jbyteArray JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardControl
- (JNIEnv *, jobject, jint, jint, jbyteArray);
+ (JNIEnv *, jobject, jlong, jint, jbyteArray);
/*
* Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
@@ -93,8 +93,16 @@
* Signature: (I[B)[B
*/
JNIEXPORT jbyteArray JNICALL
Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_SCardTransmit
- (JNIEnv *, jobject, jint, jbyteArray);
+ (JNIEnv *, jobject, jlong, jbyteArray);
+/*
+ * Class: com_ibm_opencard_terminal_pcsc10_OCFPCSC1
+ * Method: reset
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_ibm_opencard_terminal_pcsc10_OCFPCSC1_reset
+ (JNIEnv *, jobject);
+
#ifdef __cplusplus
}
#endif
Index: ocfBridge/Makefile
===================================================================
--- ocfBridge/Makefile (revision 1650)
+++ ocfBridge/Makefile (arbetskopia)
@@ -1,23 +1,40 @@
-CC = c++
-LD = ld
-OBJS := $(patsubst %.cpp,%.o,$(wildcard *.cpp))
-JDK_HOME = /System/Library/Frameworks/JavaVM.framework
-PCSC_HDRS = -I/usr/local/pcsc/include
-PCSC_LIBS = -L/usr/local/pcsc/lib -lpcsclite
-INCLUDE = -I$(JDK_HOME)/Headers -I$(JDK_HOME)/include/genunix $(PCSC_HDRS)
-LIBNAME = libOCFPCSC1.jnilib
-PREFIX = /usr/local/pcsc
+baseDir = ..
+#ifeq ($(OS),Windows_NT)
+noansi = x
+#endif
+nopedantic = x
+include $(baseDir)/default.mk
-all: $(LIBNAME)
+libDir = dist/lib
-clean:
- rm -f *.so *.o $(LIBNAME)
+shared = $(libDir)/libOCFPCSC1.so
-install:
- cp -f *.so /usr/local/pcsc/lib
+COMPILEFLAGS += -I$(JAVA_HOME)/include
+ifeq ($(OS),Windows_NT)
+ COMPILEFLAGS += -I$(JAVA_HOME)/include/win32
+else
+ COMPILEFLAGS += -I$(JAVA_HOME)/include/linux
+endif
+LDFLAGS += -lpcsclite
-$(LIBNAME): $(OBJS)
- cc $(OBJS) $(PCSC_LIBS) -dynamiclib -install_name
$(PREFIX)/lib/$(LIBNAME) -o $@
+ifeq ($(OS),Windows_NT)
+ CPPFLAGS += -DCK_Win32 -DCK_WinLib -D_MT -D_JNI_IMPLEMENTATION_
+ LDFLAGS += -lgdi32 -lws2_32
+ LDFLAGS := -Wl,--kill-at $(LDFLAGS)
+else
+ CPPFLAGS += -DCK_GENERIC -DHAVE_PTHREAD_H
+ LDFLAGS += -lpthread
+endif
-$(patsubst %.cpp,%.o,$(wildcard *.cpp)) : %.o : %.cpp
- $(CC) $(CFLAGS) -c $< $(INCLUDE) $(DEFS)
+
+all: $(shared)
+
+
+$(shared): $(oFiles)
+ -mkdir -p $(libDir)
+ $(CXX) -shared -o $@ $? $(LDFLAGS)
+
+
+clean:
+ rm -f $(oFiles) $(shared)
+
_______________________________________________
Muscle mailing list
[email protected]
http://lists.drizzle.com/mailman/listinfo/muscle