1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 08:08:50 -05:00

now it works

This commit is contained in:
Daniel Stenberg 2001-04-11 13:45:55 +00:00
parent 5eafb69bdb
commit d7b54eb835

View File

@ -11,6 +11,7 @@ struct javacurl {
struct writecallback { struct writecallback {
jmethodID mid; jmethodID mid;
JNIEnv *java; JNIEnv *java;
jclass cls; /* global reference */
jobject object; jobject object;
} write; } write;
}; };
@ -43,11 +44,18 @@ JNIEXPORT void JNICALL Java_CurlGlue_jni_1cleanup(JNIEnv *java,
jobject myself, jobject myself,
jint jcurl) jint jcurl)
{ {
void *handle=(void *)((struct javacurl*)jcurl)->libcurl;
curl_easy_cleanup(handle); /* cleanup libcurl stuff */ struct javacurl *curl = (struct javacurl*)jcurl;
free((void *)jcurl); /* free the struct too */ if(curl->write.cls) {
/* a global reference we must delete */
(*java)->DeleteGlobalRef(java, curl->write.cls);
(*java)->DeleteGlobalRef(java, curl->write.object);
}
curl_easy_cleanup(curl->libcurl); /* cleanup libcurl stuff */
free((void *)curl); /* free the struct too */
} }
/* /*
@ -91,8 +99,9 @@ static int javacurl_write_callback(void *ptr,
jbyteArray jb=NULL; jbyteArray jb=NULL;
int ret=0; int ret=0;
fprintf(stderr, "%d bytes data received in callback, ptr %p, java =%p\n", fprintf(stderr, "%d bytes data received in callback:\n"
realsize, curl, java); "ptr=%p, java=%p cls=%p\n",
realsize, curl, java, curl->write.cls);
jb=(*java)->NewByteArray(java, realsize); jb=(*java)->NewByteArray(java, realsize);
(*java)->SetByteArrayRegion(java, jb, 0, (*java)->SetByteArrayRegion(java, jb, 0,
@ -117,25 +126,38 @@ static int javacurl_write_callback(void *ptr,
JNIEXPORT jint JNICALL Java_CurlGlue_jni_1setopt__IILCurlWrite_2 JNIEXPORT jint JNICALL Java_CurlGlue_jni_1setopt__IILCurlWrite_2
(JNIEnv *java, jobject myself, jint jcurl, jint option, jobject object) (JNIEnv *java, jobject myself, jint jcurl, jint option, jobject object)
{ {
jclass cls = (*java)->GetObjectClass(java, object); jclass cls_local = (*java)->GetObjectClass(java, object);
jmethodID mid; jmethodID mid;
struct javacurl *curl = (struct javacurl *)jcurl; struct javacurl *curl = (struct javacurl *)jcurl;
jclass cls;
printf("setopt int + object, option = %d cls= %p\n", option, cls); jobject obj_global;
switch(option) { switch(option) {
case CURLOPT_WRITEFUNCTION: case CURLOPT_WRITEFUNCTION:
/* this makes a reference that'll be alive until we kill it! */
cls = (*java)->NewGlobalRef(java, cls_local);
printf("setopt int + object, option = %d cls= %p\n",
option, cls);
if(!cls) {
puts("couldn't make local reference global");
return 0;
}
/* this is the write callback */ /* this is the write callback */
mid = (*java)->GetMethodID(java, cls, "handleString", mid = (*java)->GetMethodID(java, cls, "handleString", "([B)I");
"([B)I");
if(!mid) { if(!mid) {
/* no callback method found */
puts("no callback method found"); puts("no callback method found");
return 0; return 0;
} }
obj_global = (*java)->NewGlobalRef(java, object);
curl->write.mid = mid; curl->write.mid = mid;
curl->write.java = java; curl->write.cls = cls;
curl->write.object = object; curl->write.object = obj_global;
/*curl->write.java = java; stored on perform */
fprintf(stderr, "setopt write callback and write file pointer %p, java = %p\n", fprintf(stderr, "setopt write callback and write file pointer %p, java = %p\n",
curl, java); curl, java);
@ -144,6 +166,7 @@ JNIEXPORT jint JNICALL Java_CurlGlue_jni_1setopt__IILCurlWrite_2
javacurl_write_callback); javacurl_write_callback);
curl_easy_setopt(curl->libcurl, CURLOPT_FILE, curl_easy_setopt(curl->libcurl, CURLOPT_FILE,
curl); curl);
break; break;
} }
return 0; return 0;
@ -158,6 +181,7 @@ JNIEXPORT jint JNICALL Java_CurlGlue_getinfo
JNIEXPORT jint JNICALL Java_CurlGlue_jni_1perform JNIEXPORT jint JNICALL Java_CurlGlue_jni_1perform
(JNIEnv *java, jobject myself, jint jcurl) (JNIEnv *java, jobject myself, jint jcurl)
{ {
void *handle=(void *)((struct javacurl*)jcurl)->libcurl; struct javacurl *curl=(struct javacurl*)jcurl;
return (jint)curl_easy_perform(handle); curl->write.java = java;
return (jint)curl_easy_perform(curl->libcurl);
} }