/* * List all groups known by the system. */ JNIEXPORT jobjectArray JNICALL GEN_FUNCNAME(Context_NativeListReaderGroups) (JNIEnv *env, jobject _this) { jobjectArray result; SCARDCONTEXT ctx; char *mszGroups; LONG rv; DWORD sz; ctx = (SCARDCONTEXT) (*env)->GetLongField(env, _this, CtxField); rv = SCardListReaderGroups(ctx, NULL, &sz); if (rv != SCARD_S_SUCCESS) { pcscex_throw(env, "SCardListGroups", rv); return NULL; } mszGroups = (char *)malloc(sz); assert(mszGroups); rv = SCardListReaderGroups(ctx, mszGroups, &sz); if (rv != SCARD_S_SUCCESS) { free(mszGroups); pcscex_throw(env, "SCardListGroups()", rv); return NULL; } result = pcsc_multi2jstring(env, mszGroups, "SCardListReaderGroups(): too many reader groups"); free(mszGroups); return result; }
JNIEXPORT jobjectArray JNICALL Java_sun_security_smartcardio_PCSC_SCardListReaders (JNIEnv *env, jclass thisClass, jlong jContext) { SCARDCONTEXT context = (SCARDCONTEXT)jContext; LONG rv; LPTSTR mszReaders = NULL; DWORD size = 0; jobjectArray result; dprintf1("-context: %x\n", context); rv = CALL_SCardListReaders(context, NULL, NULL, &size); if (handleRV(env, rv)) { return NULL; } dprintf1("-size: %d\n", size); if (size) { mszReaders = malloc(size); if (mszReaders == NULL) { throwOutOfMemoryError(env, NULL); return NULL; } rv = CALL_SCardListReaders(context, NULL, mszReaders, &size); if (handleRV(env, rv)) { free(mszReaders); return NULL; } dprintf1("-String: %s\n", mszReaders); } result = pcsc_multi2jstring(env, mszReaders); free(mszReaders); return result; }
/** * Return reader list. Given group spec may be null. */ jobjectArray pcsc_list_readers(JNIEnv *env, jobject _this, const char *groupSpec) { jobjectArray result; SCARDCONTEXT ctx; char *mszReaders; LONG rv; DWORD sz; ctx = (SCARDCONTEXT) (*env)->GetLongField(env, _this, CtxField); rv = SCardListReaders(ctx, groupSpec, NULL, &sz); if (rv != SCARD_S_SUCCESS) { pcscex_throw(env, "SCardListReaders", rv); return NULL; } mszReaders = (char *)malloc(sz); assert(mszReaders); rv = SCardListReaders(ctx, groupSpec, mszReaders, &sz); if (rv != SCARD_S_SUCCESS) { free(mszReaders); pcscex_throw(env, "SCardListReaders()", rv); return NULL; } result = pcsc_multi2jstring(env, mszReaders, "SCardListReaders(): too many physical readers"); free(mszReaders); return result; }