pjs/java/plugins/jni/org_mozilla_pluglet_mozilla...

147 строки
4.2 KiB
C++

/*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Sun Microsystems,
* Inc. Portions created by Sun are
* Copyright (C) 1999 Sun Microsystems, Inc. All
* Rights Reserved.
*
* Contributor(s):
*/
#include <stdlib.h>
#include "nsIInputStream.h"
#include "org_mozilla_pluglet_mozilla_PlugletInputStream.h"
#include "PlugletLog.h"
static jfieldID peerFID = NULL;
/*
* Class: org_mozilla_pluglet_mozilla_PlugletInputStream
* Method: available
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_org_mozilla_pluglet_mozilla_PlugletInputStream_available
(JNIEnv *env, jobject jthis) {
nsIInputStream * input = (nsIInputStream*)env->GetLongField(jthis, peerFID);
PRUint32 res = 0;
if(input) {
PR_LOG(PlugletLog::log, PR_LOG_DEBUG,
("PlugletInputStream.available: stream = %p\n", input));
input->Available(&res);
}
return (jint)res;
}
/*
* Class: org_mozilla_pluglet_mozilla_PlugletInputStream
* Method: close
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_mozilla_pluglet_mozilla_PlugletInputStream_close
(JNIEnv *env, jobject jthis) {
nsIInputStream * input = (nsIInputStream*)env->GetLongField(jthis, peerFID);
if (input) {
PR_LOG(PlugletLog::log, PR_LOG_DEBUG,
("PlugletInputStream.close: stream = %p\n", input));
NS_RELEASE(input);
env->SetLongField(jthis, peerFID,0);
}
}
/*
* Class: org_mozilla_pluglet_mozilla_PlugletInputStream
* Method: nativeRead
* Signature: ([BII)I
*/
JNIEXPORT jint JNICALL Java_org_mozilla_pluglet_mozilla_PlugletInputStream_nativeRead
(JNIEnv *env, jobject jthis, jbyteArray b, jint off, jint len) {
jint retval = -1;
nsIInputStream * input = (nsIInputStream*)env->GetLongField(jthis, peerFID);
if (input) {
PR_LOG(PlugletLog::log, PR_LOG_DEBUG,
("PlugletInputStream.nativeRead: stream = %p, off = %i, len = %i\n", input, off, len));
}
if (env->ExceptionOccurred()) {
return retval;
}
if (!input) {
jclass ex = env->FindClass("java/io/IOException");
if (!ex) {
return retval;
}
env->ThrowNew(ex,"Stream was closed");
return retval;
}
jbyte * bufElems = (jbyte*) malloc(sizeof(jbyte)*len);
if (!bufElems) {
return retval;
//nb throw OutOfMemory
}
nsresult res;
PRUint32 actualLen;
res = input->Read((char*)bufElems,(PRUint32)len,&actualLen);
if (NS_FAILED(res)) {
free(bufElems);
return retval;
}
retval = actualLen;
PR_LOG(PlugletLog::log, PR_LOG_DEBUG,
("PlugletInputStream.nativeRead: %i bytes read\n", retval));
env->SetByteArrayRegion(b,off,retval,bufElems);
free(bufElems);
return (len > 0 && actualLen <= 0) ? -1 : retval;
}
/*
* Class: org_mozilla_pluglet_mozilla_PlugletInputStream
* Method: nativeFinalize
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_mozilla_pluglet_mozilla_PlugletInputStream_nativeFinalize
(JNIEnv *env, jobject jthis) {
/* nb do as in java-dom stuff */
nsIInputStream * input = (nsIInputStream*)env->GetLongField(jthis, peerFID);
if(input) {
PR_LOG(PlugletLog::log, PR_LOG_DEBUG,
("PlugletInputStream.nativeFinalize: stream = %p\n", input));
NS_RELEASE(input);
}
}
/*
* Class: org_mozilla_pluglet_mozilla_PlugletInputStream
* Method: nativeInitialize
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_mozilla_pluglet_mozilla_PlugletInputStream_nativeInitialize
(JNIEnv *env, jobject jthis) {
if(!peerFID) {
peerFID = env->GetFieldID(env->GetObjectClass(jthis),"peer","J");
if (!peerFID) {
return;
}
}
nsIInputStream * input = (nsIInputStream*)env->GetLongField(jthis, peerFID);
if (input) {
PR_LOG(PlugletLog::log, PR_LOG_DEBUG,
("PlugletInputStream.nativeInitialize: stream = %p\n", input));
input->AddRef();
}
}