src/java.smartcardio/share/native/libj2pcsc/pcsc.c
author jlaskey
Thu, 14 Nov 2019 12:50:08 -0400
branchJDK-8193209-branch
changeset 59088 da026c172c1e
parent 53930 df3d253aaf81
permissions -rw-r--r--
add missing files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
53930
df3d253aaf81 8218780: Update MUSCLE PCSC-Lite header files
valeriep
parents: 51120
diff changeset
     2
 * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
/* disable asserts in product mode */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
#ifndef DEBUG
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
  #ifndef NDEBUG
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
    #define NDEBUG
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
  #endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
#include <stdio.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
#include <stdlib.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
#include <string.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
#include <assert.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
#include <winscard.h>
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
// #define J2PCSC_DEBUG
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
#ifdef J2PCSC_DEBUG
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
#define dprintf(s) printf(s)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
#define dprintf1(s, p1) printf(s, p1)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
#define dprintf2(s, p1, p2) printf(s, p1, p2)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
#define dprintf3(s, p1, p2, p3) printf(s, p1, p2, p3)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
#else
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
#define dprintf(s)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
#define dprintf1(s, p1)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
#define dprintf2(s, p1, p2)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
#define dprintf3(s, p1, p2, p3)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
#include "sun_security_smartcardio_PCSC.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
#include "pcsc_md.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
33653
c1ee09fe3274 8136556: Add the ability to perform static builds of MacOSX x64 binaries
bobv
parents: 25859
diff changeset
    58
#include "jni_util.h"
c1ee09fe3274 8136556: Add the ability to perform static builds of MacOSX x64 binaries
bobv
parents: 25859
diff changeset
    59
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
#define MAX_STACK_BUFFER_SIZE 8192
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
// make the buffers larger than what should be necessary, just in case
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
#define ATR_BUFFER_SIZE 128
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
#define READERNAME_BUFFER_SIZE 128
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
#define RECEIVE_BUFFER_SIZE MAX_STACK_BUFFER_SIZE
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
#define J2PCSC_EXCEPTION_NAME "sun/security/smartcardio/PCSCException"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
23709
9f7652fb03b2 8039118: Windows build failure (j2pcsc.dll : fatal error unresolved external symbol throwByName)
chegar
parents: 23704
diff changeset
    69
void throwOutOfMemoryError(JNIEnv *env, const char *msg) {
9f7652fb03b2 8039118: Windows build failure (j2pcsc.dll : fatal error unresolved external symbol throwByName)
chegar
parents: 23704
diff changeset
    70
    jclass cls = (*env)->FindClass(env, "java/lang/OutOfMemoryError");
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    71
23709
9f7652fb03b2 8039118: Windows build failure (j2pcsc.dll : fatal error unresolved external symbol throwByName)
chegar
parents: 23704
diff changeset
    72
    if (cls != NULL) /* Otherwise an exception has already been thrown */
9f7652fb03b2 8039118: Windows build failure (j2pcsc.dll : fatal error unresolved external symbol throwByName)
chegar
parents: 23704
diff changeset
    73
        (*env)->ThrowNew(env, cls, msg);
9f7652fb03b2 8039118: Windows build failure (j2pcsc.dll : fatal error unresolved external symbol throwByName)
chegar
parents: 23704
diff changeset
    74
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    75
}
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    76
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
void throwPCSCException(JNIEnv* env, LONG code) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
    jclass pcscClass;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
    jmethodID constructor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
    jthrowable pcscException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
    pcscClass = (*env)->FindClass(env, J2PCSC_EXCEPTION_NAME);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    83
    if (pcscClass == NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    84
        return;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    85
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
    constructor = (*env)->GetMethodID(env, pcscClass, "<init>", "(I)V");
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    87
    if (constructor == NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    88
        return;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    89
    }
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    90
    pcscException = (jthrowable) (*env)->NewObject(env, pcscClass,
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    91
        constructor, (jint)code);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    92
    if (pcscException != NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    93
        (*env)->Throw(env, pcscException);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
    94
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
jboolean handleRV(JNIEnv* env, LONG code) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
    if (code == SCARD_S_SUCCESS) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
        return JNI_FALSE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
        throwPCSCException(env, code);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
        return JNI_TRUE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
33653
c1ee09fe3274 8136556: Add the ability to perform static builds of MacOSX x64 binaries
bobv
parents: 25859
diff changeset
   106
JNIEXPORT jint JNICALL DEF_JNI_OnLoad(JavaVM *vm, void *reserved) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
    return JNI_VERSION_1_4;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
JNIEXPORT jlong JNICALL Java_sun_security_smartcardio_PCSC_SCardEstablishContext
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
    (JNIEnv *env, jclass thisClass, jint dwScope)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
{
24516
9e5ba0f3ce68 8043507: javax.smartcardio.CardTerminals.list() fails on MacOSX
igerasim
parents: 23709
diff changeset
   113
    SCARDCONTEXT context = 0;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
    LONG rv;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
    dprintf("-establishContext\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
    rv = CALL_SCardEstablishContext(dwScope, NULL, NULL, &context);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
    if (handleRV(env, rv)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
    // note: SCARDCONTEXT is typedef'd as long, so this works
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
    return (jlong)context;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
/**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
 * Convert a multi string to a java string array,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
 */
24630
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   127
jobjectArray pcsc_multi2jstring(JNIEnv *env, char *spec) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
    jobjectArray result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
    jclass stringClass;
24630
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   130
    char *cp, **tab = NULL;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
    jstring js;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
    int cnt = 0;
24630
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   133
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   134
    cp = spec;
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   135
    while (*cp != 0) {
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   136
        cp += (strlen(cp) + 1);
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   137
        ++cnt;
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   138
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
24630
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   140
    tab = (char **)malloc(cnt * sizeof(char *));
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   141
    if (tab == NULL) {
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   142
        throwOutOfMemoryError(env, NULL);
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   143
        return NULL;
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   144
    }
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   145
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   146
    cnt = 0;
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   147
    cp = spec;
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   148
    while (*cp != 0) {
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   149
        tab[cnt++] = cp;
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   150
        cp += (strlen(cp) + 1);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
    stringClass = (*env)->FindClass(env, "java/lang/String");
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   154
    if (stringClass == NULL) {
24630
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   155
        free(tab);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   156
        return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   157
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
    result = (*env)->NewObjectArray(env, cnt, stringClass, NULL);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   160
    if (result != NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   161
        while (cnt-- > 0) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   162
            js = (*env)->NewStringUTF(env, tab[cnt]);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   163
            if ((*env)->ExceptionCheck(env)) {
24630
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   164
                free(tab);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   165
                return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   166
            }
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   167
            (*env)->SetObjectArrayElement(env, result, cnt, js);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   168
            if ((*env)->ExceptionCheck(env)) {
24630
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   169
                free(tab);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   170
                return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   171
            }
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   172
            (*env)->DeleteLocalRef(env, js);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   173
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
    }
24630
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   175
    free(tab);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
    return result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
JNIEXPORT jobjectArray JNICALL Java_sun_security_smartcardio_PCSC_SCardListReaders
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
    (JNIEnv *env, jclass thisClass, jlong jContext)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
    SCARDCONTEXT context = (SCARDCONTEXT)jContext;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
    LONG rv;
53930
df3d253aaf81 8218780: Update MUSCLE PCSC-Lite header files
valeriep
parents: 51120
diff changeset
   184
    LPSTR mszReaders = NULL;
24516
9e5ba0f3ce68 8043507: javax.smartcardio.CardTerminals.list() fails on MacOSX
igerasim
parents: 23709
diff changeset
   185
    DWORD size = 0;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
    jobjectArray result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
    dprintf1("-context: %x\n", context);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
    rv = CALL_SCardListReaders(context, NULL, NULL, &size);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
    if (handleRV(env, rv)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
    dprintf1("-size: %d\n", size);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
51120
dccdf51b10dd 8207233: Minor improvements of jdk C-coding
goetz
parents: 47216
diff changeset
   195
    if (size != 0) {
24627
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   196
        mszReaders = malloc(size);
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   197
        if (mszReaders == NULL) {
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   198
            throwOutOfMemoryError(env, NULL);
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   199
            return NULL;
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   200
        }
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   201
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   202
        rv = CALL_SCardListReaders(context, NULL, mszReaders, &size);
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   203
        if (handleRV(env, rv)) {
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   204
            free(mszReaders);
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   205
            return NULL;
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   206
        }
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   207
        dprintf1("-String: %s\n", mszReaders);
51120
dccdf51b10dd 8207233: Minor improvements of jdk C-coding
goetz
parents: 47216
diff changeset
   208
    } else {
dccdf51b10dd 8207233: Minor improvements of jdk C-coding
goetz
parents: 47216
diff changeset
   209
      return NULL;
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   210
    }
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   211
24630
256eb760e01f 8044342: build failure on Windows noticed with recent smartcardio fix
igerasim
parents: 24627
diff changeset
   212
    result = pcsc_multi2jstring(env, mszReaders);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
    free(mszReaders);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
    return result;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
JNIEXPORT jlong JNICALL Java_sun_security_smartcardio_PCSC_SCardConnect
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
    (JNIEnv *env, jclass thisClass, jlong jContext, jstring jReaderName,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
    jint jShareMode, jint jPreferredProtocols)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
    SCARDCONTEXT context = (SCARDCONTEXT)jContext;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
    LONG rv;
53930
df3d253aaf81 8218780: Update MUSCLE PCSC-Lite header files
valeriep
parents: 51120
diff changeset
   223
    LPCSTR readerName;
24516
9e5ba0f3ce68 8043507: javax.smartcardio.CardTerminals.list() fails on MacOSX
igerasim
parents: 23709
diff changeset
   224
    SCARDHANDLE card = 0;
9e5ba0f3ce68 8043507: javax.smartcardio.CardTerminals.list() fails on MacOSX
igerasim
parents: 23709
diff changeset
   225
    DWORD proto = 0;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
    readerName = (*env)->GetStringUTFChars(env, jReaderName, NULL);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   228
    if (readerName == NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   229
        return 0;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   230
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
    rv = CALL_SCardConnect(context, readerName, jShareMode, jPreferredProtocols, &card, &proto);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
    (*env)->ReleaseStringUTFChars(env, jReaderName, readerName);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
    dprintf1("-cardhandle: %x\n", card);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
    dprintf1("-protocol: %d\n", proto);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
    if (handleRV(env, rv)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
    return (jlong)card;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
JNIEXPORT jbyteArray JNICALL Java_sun_security_smartcardio_PCSC_SCardTransmit
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
    (JNIEnv *env, jclass thisClass, jlong jCard, jint protocol,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
    jbyteArray jBuf, jint jOfs, jint jLen)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
    SCARDHANDLE card = (SCARDHANDLE)jCard;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
    LONG rv;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
    SCARD_IO_REQUEST sendPci;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
    unsigned char *sbuf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
    unsigned char rbuf[RECEIVE_BUFFER_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
    DWORD rlen = RECEIVE_BUFFER_SIZE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
    int ofs = (int)jOfs;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
    int len = (int)jLen;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
    jbyteArray jOut;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
    sendPci.dwProtocol = protocol;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
    sendPci.cbPciLength = sizeof(SCARD_IO_REQUEST);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
    sbuf = (unsigned char *) ((*env)->GetByteArrayElements(env, jBuf, NULL));
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   260
    if (sbuf == NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   261
        return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   262
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
    rv = CALL_SCardTransmit(card, &sendPci, sbuf + ofs, len, NULL, rbuf, &rlen);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
    (*env)->ReleaseByteArrayElements(env, jBuf, (jbyte *)sbuf, JNI_ABORT);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
    if (handleRV(env, rv)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
    jOut = (*env)->NewByteArray(env, rlen);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   271
    if (jOut != NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   272
        (*env)->SetByteArrayRegion(env, jOut, 0, rlen, (jbyte *)rbuf);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   273
        if ((*env)->ExceptionCheck(env)) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   274
            return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   275
        }
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   276
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
    return jOut;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
JNIEXPORT jbyteArray JNICALL Java_sun_security_smartcardio_PCSC_SCardStatus
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
    (JNIEnv *env, jclass thisClass, jlong jCard, jbyteArray jStatus)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
    SCARDHANDLE card = (SCARDHANDLE)jCard;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
    LONG rv;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
    char readerName[READERNAME_BUFFER_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
    DWORD readerLen = READERNAME_BUFFER_SIZE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
    unsigned char atr[ATR_BUFFER_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
    DWORD atrLen = ATR_BUFFER_SIZE;
24516
9e5ba0f3ce68 8043507: javax.smartcardio.CardTerminals.list() fails on MacOSX
igerasim
parents: 23709
diff changeset
   289
    DWORD state = 0;
9e5ba0f3ce68 8043507: javax.smartcardio.CardTerminals.list() fails on MacOSX
igerasim
parents: 23709
diff changeset
   290
    DWORD protocol = 0;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
    jbyteArray jArray;
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   292
    jbyte status[2];
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
    rv = CALL_SCardStatus(card, readerName, &readerLen, &state, &protocol, atr, &atrLen);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
    if (handleRV(env, rv)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
    dprintf1("-reader: %s\n", readerName);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
    dprintf1("-status: %d\n", state);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
    dprintf1("-protocol: %d\n", protocol);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
    jArray = (*env)->NewByteArray(env, atrLen);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   303
    if (jArray == NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   304
        return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   305
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
    (*env)->SetByteArrayRegion(env, jArray, 0, atrLen, (jbyte *)atr);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   307
    if ((*env)->ExceptionCheck(env)) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   308
        return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   309
    }
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   310
    status[0] = (jbyte) state;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   311
    status[1] = (jbyte) protocol;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   312
    (*env)->SetByteArrayRegion(env, jStatus, 0, 2, status);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   313
    if ((*env)->ExceptionCheck(env)) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   314
        return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   315
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
    return jArray;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
JNIEXPORT void JNICALL Java_sun_security_smartcardio_PCSC_SCardDisconnect
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
    (JNIEnv *env, jclass thisClass, jlong jCard, jint jDisposition)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
    SCARDHANDLE card = (SCARDHANDLE)jCard;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
    LONG rv;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   324
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
    rv = CALL_SCardDisconnect(card, jDisposition);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
    dprintf1("-disconnect: 0x%X\n", rv);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
    handleRV(env, rv);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   328
    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
90ce3da70b43 Initial load
duke
parents:
diff changeset
   331
JNIEXPORT jintArray JNICALL Java_sun_security_smartcardio_PCSC_SCardGetStatusChange
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
    (JNIEnv *env, jclass thisClass, jlong jContext, jlong jTimeout,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   333
    jintArray jCurrentState, jobjectArray jReaderNames)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
    SCARDCONTEXT context = (SCARDCONTEXT)jContext;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
    LONG rv;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   337
    int readers = (*env)->GetArrayLength(env, jReaderNames);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   338
    SCARD_READERSTATE *readerState;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   339
    int i;
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   340
    jintArray jEventState = NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   341
    int *currentState = NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   342
    const char *readerName;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   343
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   344
    readerState = calloc(readers, sizeof(SCARD_READERSTATE));
24627
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   345
    if (readerState == NULL && readers > 0) {
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   346
        throwOutOfMemoryError(env, NULL);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   347
        return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   348
    }
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   349
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   350
    currentState = (*env)->GetIntArrayElements(env, jCurrentState, NULL);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   351
    if (currentState == NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   352
        free(readerState);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   353
        return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   354
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
    for (i = 0; i < readers; i++) {
24627
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   357
        readerState[i].szReader = NULL;
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   358
    }
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   359
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   360
    for (i = 0; i < readers; i++) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   361
        jobject jReaderName = (*env)->GetObjectArrayElement(env, jReaderNames, i);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   362
        if ((*env)->ExceptionCheck(env)) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   363
            goto cleanup;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   364
        }
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   365
        readerName = (*env)->GetStringUTFChars(env, jReaderName, NULL);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   366
        if (readerName == NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   367
            goto cleanup;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   368
        }
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   369
        readerState[i].szReader = strdup(readerName);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   370
        (*env)->ReleaseStringUTFChars(env, jReaderName, readerName);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   371
        if (readerState[i].szReader == NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   372
            throwOutOfMemoryError(env, NULL);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   373
            goto cleanup;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   374
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
        readerState[i].pvUserData = NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   376
        readerState[i].dwCurrentState = currentState[i];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
        readerState[i].dwEventState = SCARD_STATE_UNAWARE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   378
        readerState[i].cbAtr = 0;
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   379
        (*env)->DeleteLocalRef(env, jReaderName);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   381
24627
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   382
    if (readers > 0) {
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   383
        rv = CALL_SCardGetStatusChange(context, (DWORD)jTimeout, readerState, readers);
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   384
        if (handleRV(env, rv)) {
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   385
            goto cleanup;
c2e7947c579e 8043720: (smartcardio) Native memory should be handled more accurately
igerasim
parents: 24516
diff changeset
   386
        }
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   387
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
    jEventState = (*env)->NewIntArray(env, readers);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   390
    if (jEventState == NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   391
        goto cleanup;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   392
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   393
    for (i = 0; i < readers; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   394
        jint eventStateTmp;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   395
        dprintf3("-reader status %s: 0x%X, 0x%X\n", readerState[i].szReader,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   396
            readerState[i].dwCurrentState, readerState[i].dwEventState);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
        eventStateTmp = (jint)readerState[i].dwEventState;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   398
        (*env)->SetIntArrayRegion(env, jEventState, i, 1, &eventStateTmp);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   399
        if ((*env)->ExceptionCheck(env)) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   400
            jEventState = NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   401
            goto cleanup;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   402
        }
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   403
    }
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   404
cleanup:
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   405
    (*env)->ReleaseIntArrayElements(env, jCurrentState, currentState, JNI_ABORT);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   406
    for (i = 0; i < readers; i++) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   407
        free((char *)readerState[i].szReader);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   408
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
    free(readerState);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   410
    return jEventState;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
JNIEXPORT void JNICALL Java_sun_security_smartcardio_PCSC_SCardBeginTransaction
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
    (JNIEnv *env, jclass thisClass, jlong jCard)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
    SCARDHANDLE card = (SCARDHANDLE)jCard;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
    LONG rv;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   418
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
    rv = CALL_SCardBeginTransaction(card);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
    dprintf1("-beginTransaction: 0x%X\n", rv);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   421
    handleRV(env, rv);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
JNIEXPORT void JNICALL Java_sun_security_smartcardio_PCSC_SCardEndTransaction
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
    (JNIEnv *env, jclass thisClass, jlong jCard, jint jDisposition)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
    SCARDHANDLE card = (SCARDHANDLE)jCard;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
    LONG rv;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
    rv = CALL_SCardEndTransaction(card, jDisposition);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
    dprintf1("-endTransaction: 0x%X\n", rv);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
    handleRV(env, rv);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
    return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
JNIEXPORT jbyteArray JNICALL Java_sun_security_smartcardio_PCSC_SCardControl
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
    (JNIEnv *env, jclass thisClass, jlong jCard, jint jControlCode, jbyteArray jSendBuffer)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
    SCARDHANDLE card = (SCARDHANDLE)jCard;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
    LONG rv;
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   442
    jbyte* sendBuffer;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
    jint sendBufferLength = (*env)->GetArrayLength(env, jSendBuffer);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
    jbyte receiveBuffer[MAX_STACK_BUFFER_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
    jint receiveBufferLength = MAX_STACK_BUFFER_SIZE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
    ULONG returnedLength = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
    jbyteArray jReceiveBuffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   449
    sendBuffer = (*env)->GetByteArrayElements(env, jSendBuffer, NULL);
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   450
    if (sendBuffer == NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   451
        return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   452
    }
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   453
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
#ifdef J2PCSC_DEBUG
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
    int k;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
    printf("-control: 0x%X\n", jControlCode);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
    printf("-send: ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
    for (k = 0; k < sendBufferLength; k++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
        printf("%02x ", sendBuffer[k]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
    printf("\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
    rv = CALL_SCardControl(card, jControlCode, sendBuffer, sendBufferLength,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
        receiveBuffer, receiveBufferLength, &returnedLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
90ce3da70b43 Initial load
duke
parents:
diff changeset
   469
    (*env)->ReleaseByteArrayElements(env, jSendBuffer, sendBuffer, JNI_ABORT);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   470
    if (handleRV(env, rv)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   471
        return NULL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   472
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
#ifdef J2PCSC_DEBUG
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
    int k;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
    printf("-recv:  ");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   478
    for (k = 0; k < returnedLength; k++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   479
        printf("%02x ", receiveBuffer[k]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   480
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   481
    printf("\n");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   482
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   483
#endif
90ce3da70b43 Initial load
duke
parents:
diff changeset
   484
90ce3da70b43 Initial load
duke
parents:
diff changeset
   485
    jReceiveBuffer = (*env)->NewByteArray(env, returnedLength);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   486
    if (jReceiveBuffer == NULL) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   487
        return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   488
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   489
    (*env)->SetByteArrayRegion(env, jReceiveBuffer, 0, returnedLength, receiveBuffer);
23704
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   490
    if ((*env)->ExceptionCheck(env)) {
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   491
        return NULL;
c174349fcd4b 8030114: [parfait] warnings from b119 for jdk.src.share.native.sun.security.smartcardio: JNI exception pending
valeriep
parents: 5506
diff changeset
   492
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   493
    return jReceiveBuffer;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
}