/** get contents of the object array in the form of int* */ SEXP jri_getStringArray(JNIEnv *env, jarray o) { SEXP ar; int l, i; const char *c; profStart(); _dbg(rjprintf(" jarray %d\n",o)); if (!o) return R_NilValue; l = (int)(*env)->GetArrayLength(env, o); _dbg(rjprintf("convert string array of length %d\n",l)); PROTECT(ar = allocVector(STRSXP,l)); for (i = 0; i < l; i++) { jobject sobj = (*env)->GetObjectArrayElement(env, o, i); c = 0; if (sobj) { /* we could (should?) check the type here ... if (!(*env)->IsInstanceOf(env, sobj, javaStringClass)) { printf(" not a String\n"); } else */ c = (*env)->GetStringUTFChars(env, sobj, 0); } if (!c) SET_STRING_ELT(ar, i, R_NaString); /* this is probably redundant since the vector is pre-filled with NAs, but just in case ... */ else { SET_STRING_ELT(ar, i, mkCharUTF8(c)); (*env)->ReleaseStringUTFChars(env, sobj, c); } } UNPROTECT(1); _prof(profReport("RgetStringArrayCont[%d]:",o)); return ar; }
/** jobjRefInt object : string */ SEXP jri_getString(JNIEnv *env, jstring s) { SEXP r; const char *c; if (!s) return ScalarString(R_NaString); profStart(); c = (*env)->GetStringUTFChars(env, s, 0); if (!c) { jri_error("jri_getString: can't retrieve string content"); return R_NilValue; } PROTECT(r = allocVector(STRSXP,1)); SET_STRING_ELT(r, 0, mkCharUTF8(c)); UNPROTECT(1); (*env)->ReleaseStringUTFChars(env, s, c); _prof(profReport("jri_getString:")); return r; }
/** * get contents of the String array in the form of STRSXP vector * * @param e a pointer to a String[] object * * @return a STRSXP vector mirroring the java array */ HIDE SEXP getStringArrayCont(jarray o) { SEXP ar; int l,i; const char *c; JNIEnv *env=getJNIEnv(); profStart(); _dbg(rjprintf("RgetStringArrayCont: jarray %x\n",o)); if (!o) return R_NilValue; l=(int)(*env)->GetArrayLength(env, o); _dbg(rjprintf(" convert string array of length %d\n",l)); if (l<0) return R_NilValue; PROTECT(ar=allocVector(STRSXP,l)); i=0; while (i<l) { jobject sobj=(*env)->GetObjectArrayElement(env, o, i); _mp(MEM_PROF_OUT(" %08x LNEW object array element [%d]\n", (int) sobj, i)) c=0; if (sobj) { /* we could (should?) check the type here ... if (!(*env)->IsInstanceOf(env, sobj, javaStringClass)) { printf(" not a String\n"); } else */ c=(*env)->GetStringUTFChars(env, sobj, 0); } if (!c) SET_STRING_ELT(ar, i, R_NaString); else { SET_STRING_ELT(ar, i, mkCharUTF8(c)); (*env)->ReleaseStringUTFChars(env, sobj, c); } if (sobj) releaseObject(env, sobj); i++; } UNPROTECT(1); _prof(profReport("RgetStringArrayCont[%d]:",o)) return ar; }
SEXP chooseFiles(SEXP def, SEXP caption, SEXP smulti, SEXP filters, SEXP sindex) { wchar_t *temp, *res, *cfilters; const wchar_t *p; wchar_t path[32768], filename[32768]; int multi, filterindex, i, count, lfilters, pathlen; multi = asLogical(smulti); filterindex = asInteger(sindex); if(length(def) != 1 ) error(_("'default' must be a character string")); p = filenameToWchar(STRING_ELT(def, 0), 1); if(wcslen(p) >= 32768) error(_("'default' is overlong")); wcscpy(path, p); for(temp = path; *temp; temp++) if(*temp == L'/') *temp = L'\\'; if(length(caption) != 1 ) error(_("'caption' must be a character string")); if(multi == NA_LOGICAL) error(_("'multi' must be a logical value")); if(filterindex == NA_INTEGER) error(_("'filterindex' must be an integer value")); lfilters = 1 + length(filters); for (i = 0; i < length(filters); i++) lfilters += wcslen(filenameToWchar(STRING_ELT(filters, i), 0)); cfilters = (wchar_t *) R_alloc(lfilters, sizeof(wchar_t)); temp = cfilters; for (i = 0; i < length(filters)/2; i++) { wcscpy(temp, filenameToWchar(STRING_ELT(filters, i), 0)); temp += wcslen(temp)+1; wcscpy(temp, filenameToWchar(STRING_ELT(filters, i+length(filters)/2), 0)); temp += wcslen(temp)+1; } *temp = 0; res = askfilenamesW(filenameToWchar(STRING_ELT(caption, 0), 0), path, multi, cfilters, filterindex, NULL); count = countFilenamesW(res); SEXP ans; if (count < 2) PROTECT(ans = allocVector(STRSXP, count)); else PROTECT(ans = allocVector(STRSXP, count-1)); switch (count) { case 0: break; case 1: SET_STRING_ELT(ans, 0, mkCharUTF8(res)); break; default: wcsncpy(path, res, 32768); pathlen = wcslen(path); if (path[pathlen-1] == L'\\') path[--pathlen] = L'\0'; temp = res; for (i = 0; i < count-1; i++) { temp += wcslen(temp) + 1; if (wcschr(temp,L':') || *temp == L'\\' || *temp == L'/') SET_STRING_ELT(ans, i, mkCharUTF8(temp)); else { wcsncpy(filename, path, 32768); filename[pathlen] = L'\\'; wcsncpy(filename+pathlen+1, temp, 32768-pathlen-1); SET_STRING_ELT(ans, i, mkCharUTF8(filename)); } } } UNPROTECT(1); return ans; }