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

Reply via email to