edburns%acm.org 888ec1ad17 bug=80906
ra=edburns
author=Nikolay Igotti
Minor update to prevent some crashes.


git-svn-id: svn://10.0.0.236/trunk@99137 18797224-902f-48f8-a5cc-f745e15eee43
2001-07-12 20:32:09 +00:00

1187 lines
33 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* 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 The Waterfall Java Plugin Module
*
* The Initial Developer of the Original Code is Sun Microsystems Inc
* Portions created by Sun Microsystems Inc are Copyright (C) 2001
* All Rights Reserved.
*
* $Id: nsWFSecureEnv.cpp,v 1.2 2001-07-12 20:32:09 edburns%acm.org Exp $
*
*
* Contributor(s):
*
* Nikolay N. Igotti <inn@sparc.spb.su>
*/
#include "nsDebug.h"
#include "nsWFSecureEnv.h"
#include "nsCRT.h"
// Caching of those two gives significant performance gain and is safe.
// Instead of time consuming reflection and call to Waterfall extension,
// we'll use plain JNI call.
static jclass g_javaLangSystem = NULL;
static jmethodID g_identityHashCodeMID = NULL;
NS_IMPL_ISUPPORTS1(nsWFSecureEnv, nsISupports)
NS_METHOD
nsWFSecureEnv::Create(nsPluggableJVM* jvm,
const nsIID& aIID,
void* *aInstancePtr)
{
nsWFSecureEnv* env = new nsWFSecureEnv(jvm);
if (env == NULL) return NS_ERROR_OUT_OF_MEMORY;
return env->QueryInterface(aIID, aInstancePtr);
}
nsWFSecureEnv::nsWFSecureEnv(nsPluggableJVM* jvm)
{
NS_INIT_ISUPPORTS();
m_jvm = jvm;
NS_ADDREF(m_jvm);
m_jvm->GetWFCtx(&m_rtctx, &m_ctx);
m_env = m_ctx->env;
NS_ASSERTION(m_env != nsnull,
"Error: env field not initialized by this Waterfall implementation.");
if (!g_javaLangSystem)
g_javaLangSystem = (jclass)m_env->NewGlobalRef(m_env->FindClass("java/lang/System"));
if (!g_identityHashCodeMID)
g_identityHashCodeMID = m_env->GetStaticMethodID(g_javaLangSystem,
"identityHashCode",
"(Ljava/lang/Object;)I");
}
nsWFSecureEnv::~nsWFSecureEnv(void)
{
OJI_LOG("nsWFSecureEnv::~nsWFSecureEnv");
NS_RELEASE(m_jvm);
}
static int Implies(void* handle, const char* target,
const char* action, int *bAllowedAccess)
{
nsISecurityContext* ctx = (nsISecurityContext*)handle;
if (ctx) return NS_SUCCEEDED(ctx->Implies(target, action, bAllowedAccess));
return 0;
}
static int GetOrigin(void* handle, char *buffer, int len)
{
nsISecurityContext* ctx = (nsISecurityContext*)handle;
if (ctx) return NS_SUCCEEDED(ctx->GetOrigin(buffer, len));
return 0;
}
static int GetCertificateID(void* handle, char *buffer, int len)
{
nsISecurityContext* ctx = (nsISecurityContext*)handle;
if (ctx) return NS_SUCCEEDED(ctx->GetCertificateID(buffer, len));
return 0;
}
NS_METHOD
nsWFSecureEnv::CreateJavaCallInfo(Java_CallInfo* *pCall,
nsISecurityContext* ctx)
{
Java_CallInfo* call = (Java_CallInfo*)malloc(sizeof(Java_CallInfo));
nsCRT::memset(call, 0, sizeof(Java_CallInfo));
if (ctx) {
NS_ADDREF(ctx);
SecurityContextWrapper* sec =
(SecurityContextWrapper*)malloc(sizeof(SecurityContextWrapper));
sec->info = (void*)ctx;
sec->Implies = &Implies;
sec->GetOrigin = &GetOrigin;
sec->GetCertificateID = &GetCertificateID;
sec->dead = 0;
call->security = sec;
}
*pCall = call;
return NS_OK;
}
NS_METHOD
nsWFSecureEnv::CleanupJavaCallInfo(Java_CallInfo* pCall,
nsISecurityContext* ctx)
{
if (!pCall) return NS_OK;
if (ctx)
{
free(pCall->security);
NS_RELEASE(ctx);
}
free(pCall);
return NS_OK;
}
//nsISecureEnv
NS_IMETHODIMP
nsWFSecureEnv::NewObject(/*[in]*/ jclass clazz,
/*[in]*/ jmethodID methodID,
/*[in]*/ jvalue *args,
/*[out]*/ jobject* result,
/*[in]*/ nsISecurityContext* ctx)
{
//OJI_LOG("nsWFSecureEnv::NewObject");
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
struct Java_CallInfo* call = NULL;
nsWFSecureEnv::CreateJavaCallInfo(&call, ctx);
call->type = Java_CreateObject;
call->data.__createObject.clazz = clazz;
call->data.__createObject.methodID = methodID;
call->data.__createObject.args = args;
nsresult rv = m_jvm->ExtensionCall(1, PTR_TO_JLONG(call));
if (!NS_FAILED(rv))
{
// XXX: do smth meaningful with possible Java exception
if (call->jException) {
m_jvm->DeleteLocalRef(call->jException);
rv = NS_ERROR_FAILURE;
} else {
*result = call->data.__createObject.result;
rv = NS_OK;
}
}
nsWFSecureEnv::CleanupJavaCallInfo(call, ctx);
return rv;
}
NS_IMETHODIMP
nsWFSecureEnv::CallMethod(/*[in]*/ jni_type ret_type,
/*[in]*/ jobject obj,
/*[in]*/ jmethodID methodID,
/*[in]*/ jvalue *args,
/*[out]*/ jvalue* result,
/*[in]*/ nsISecurityContext* ctx)
{
if (result == NULL || obj == NULL || methodID == NULL)
return NS_ERROR_NULL_POINTER;
struct Java_CallInfo* call = NULL;
nsWFSecureEnv::CreateJavaCallInfo(&call, ctx);
//OJI_LOG5("CallMethod: %x %x %x %x", obj, methodID, args, result);
call->type = Java_CallMethod;
call->data.__callMethod.type = (enum jvmp_jni_type)ret_type; // the same structure, really
call->data.__callMethod.obj = obj;
call->data.__callMethod.methodID = methodID;
call->data.__callMethod.args = args;
nsresult rv = m_jvm->ExtensionCall(1, PTR_TO_JLONG(call));
if (!NS_FAILED(rv))
{
// XXX: do smth meaningful with possible Java exception
if (call->jException) {
m_jvm->DeleteGlobalRef(call->jException);
rv = NS_ERROR_FAILURE;
} else {
*result = call->data.__callMethod.result;
rv = NS_OK;
}
}
nsWFSecureEnv::CleanupJavaCallInfo(call, ctx);
return rv;
}
NS_IMETHODIMP
nsWFSecureEnv::CallNonvirtualMethod(/*[in]*/ jni_type ret_type,
/*[in]*/ jobject obj,
/*[in]*/ jclass clazz,
/*[in]*/ jmethodID methodID,
/*[in]*/ jvalue *args,
/*[out]*/ jvalue* result,
/*[in]*/ nsISecurityContext* ctx)
{
if (result == NULL || obj == NULL || methodID == NULL)
return NS_ERROR_NULL_POINTER;
struct Java_CallInfo* call = NULL;
nsWFSecureEnv::CreateJavaCallInfo(&call, ctx);
//OJI_LOG5("CallMethod: %x %x %x %x", obj, methodID, args, result);
call->type = Java_CallNonvirtualMethod;
call->data.__callNonvirtualMethod.type = (enum jvmp_jni_type)ret_type; // the same structure, really
call->data.__callNonvirtualMethod.obj = obj;
call->data.__callNonvirtualMethod.clazz = clazz;
call->data.__callNonvirtualMethod.methodID = methodID;
call->data.__callNonvirtualMethod.args = args;
nsresult rv = m_jvm->ExtensionCall(1, PTR_TO_JLONG(call));
if (!NS_FAILED(rv))
{
// XXX: do smth meaningful with possible Java exception
if (call->jException) {
m_jvm->DeleteLocalRef(call->jException);
rv = NS_ERROR_FAILURE;
} else {
*result = call->data.__callNonvirtualMethod.result;
rv = NS_OK;
}
}
nsWFSecureEnv::CleanupJavaCallInfo(call, ctx);
return rv;
}
NS_IMETHODIMP
nsWFSecureEnv::GetField(/*[in]*/ jni_type field_type,
/*[in]*/ jobject obj,
/*[in]*/ jfieldID fieldID,
/*[out]*/ jvalue* result,
/*[in]*/ nsISecurityContext* ctx)
{
//OJI_LOG("nsWFSecureEnv::GetField");
if (m_env == NULL || obj == NULL || fieldID == NULL)
return NS_ERROR_NULL_POINTER;
struct Java_CallInfo* call = NULL;
nsWFSecureEnv::CreateJavaCallInfo(&call, ctx);
call->type = Java_GetField;
call->data.__getField.type = (enum jvmp_jni_type)field_type; // the same structure, really
call->data.__getField.obj = obj;
call->data.__getField.fieldID = fieldID;
nsresult rv = m_jvm->ExtensionCall(1, PTR_TO_JLONG(call));
if (!NS_FAILED(rv))
{
// XXX: do smth meaningful with possible Java exception
if (call->jException) {
m_jvm->DeleteLocalRef(call->jException);
rv = NS_ERROR_FAILURE;
} else {
*result = call->data.__getField.result;
rv = NS_OK;
}
}
nsWFSecureEnv::CleanupJavaCallInfo(call, ctx);
return rv;
}
NS_IMETHODIMP
nsWFSecureEnv::SetField(/*[in]*/ jni_type field_type,
/*[in]*/ jobject obj,
/*[in]*/ jfieldID fieldID,
/*[in]*/ jvalue val,
/*[in]*/ nsISecurityContext* ctx)
{
//OJI_LOG("nsWFSecureEnv::SetField");
if (m_env == NULL || obj == NULL || fieldID == NULL)
return NS_ERROR_NULL_POINTER;
struct Java_CallInfo* call = NULL;
nsWFSecureEnv::CreateJavaCallInfo(&call, ctx);
call->type = Java_SetField;
call->data.__setField.type = (enum jvmp_jni_type)field_type; // the same structure, really
call->data.__setField.obj = obj;
call->data.__setField.fieldID = fieldID;
call->data.__setField.value = val;
nsresult rv = m_jvm->ExtensionCall(1, PTR_TO_JLONG(call));
if (!NS_FAILED(rv))
{
// XXX: do smth meaningful with possible Java exception
if (call->jException) {
m_jvm->DeleteLocalRef(call->jException);
rv = NS_ERROR_FAILURE;
} else
rv = NS_OK;
}
nsWFSecureEnv::CleanupJavaCallInfo(call, ctx);
return rv;
}
NS_IMETHODIMP
nsWFSecureEnv::CallStaticMethod(/*[in]*/ jni_type ret_type,
/*[in]*/ jclass clazz,
/*[in]*/ jmethodID methodID,
/*[in]*/ jvalue *args,
/*[out]*/ jvalue* result,
/*[in]*/ nsISecurityContext* ctx)
{
if (result == NULL || clazz == NULL || methodID == NULL)
return NS_ERROR_NULL_POINTER;
if (methodID == g_identityHashCodeMID)
{
//OJI_LOG("using cached identityHashCode");
result->i = m_env->CallStaticIntMethodA(g_javaLangSystem,
g_identityHashCodeMID,
args);
return NS_OK;
}
struct Java_CallInfo* call = NULL;
nsWFSecureEnv::CreateJavaCallInfo(&call, ctx);
call->type = Java_CallStaticMethod;
call->data.__callStaticMethod.type = (enum jvmp_jni_type)ret_type; // the same structure, really
call->data.__callStaticMethod.clazz = clazz;
call->data.__callStaticMethod.methodID = methodID;
call->data.__callStaticMethod.args = args;
nsresult rv = m_jvm->ExtensionCall(1, PTR_TO_JLONG(call));
if (!NS_FAILED(rv))
{
// XXX: do smth meaningful with possible Java exception
if (call->jException) {
m_jvm->DeleteLocalRef(call->jException);
rv = NS_ERROR_FAILURE;
} else
*result = call->data.__callStaticMethod.result;
}
nsWFSecureEnv::CleanupJavaCallInfo(call, ctx);
return rv;
}
NS_IMETHODIMP
nsWFSecureEnv::GetStaticField(/*[in]*/ jni_type field_type,
/*[in]*/ jclass clazz,
/*[in]*/ jfieldID fieldID,
/*[out]*/ jvalue* result,
/*[in]*/ nsISecurityContext* ctx)
{
//OJI_LOG4("nsWFSecureEnv::GetStaticField: type=%d class=%x fid=%x",
// field_type, clazz, fieldID);
if (m_env == NULL || clazz == NULL || fieldID == NULL)
return NS_ERROR_NULL_POINTER;
struct Java_CallInfo* call = NULL;
nsWFSecureEnv::CreateJavaCallInfo(&call, ctx);
call->type = Java_GetStaticField;
call->data.__getStaticField.type = (enum jvmp_jni_type)field_type; // the same structure, really
call->data.__getStaticField.clazz = clazz;
call->data.__getStaticField.fieldID = fieldID;
nsresult rv = m_jvm->ExtensionCall(1, PTR_TO_JLONG(call));
if (!NS_FAILED(rv))
{
// XXX: do smth meaningful with possible Java exception
if (call->jException) {
m_jvm->DeleteLocalRef(call->jException);
rv = NS_ERROR_FAILURE;
} else {
*result = call->data.__getStaticField.result;
rv = NS_OK;
}
}
nsWFSecureEnv::CleanupJavaCallInfo(call, ctx);
return rv;
}
NS_IMETHODIMP
nsWFSecureEnv::SetStaticField(/*[in]*/ jni_type field_type,
/*[in]*/ jclass clazz,
/*[in]*/ jfieldID fieldID,
/*[in]*/ jvalue val,
/*[in]*/ nsISecurityContext* ctx)
{
//OJI_LOG("nsWFSecureEnv::SetStaticField");
if (m_env == NULL || clazz == NULL || fieldID == NULL)
return NS_ERROR_NULL_POINTER;
struct Java_CallInfo* call = NULL;
nsWFSecureEnv::CreateJavaCallInfo(&call, ctx);
call->type = Java_SetStaticField;
call->data.__setStaticField.type = (enum jvmp_jni_type)field_type; // the same structure, really
call->data.__setStaticField.clazz = clazz;
call->data.__setStaticField.fieldID = fieldID;
call->data.__setStaticField.value = val;
nsresult rv = m_jvm->ExtensionCall(1, PTR_TO_JLONG(call));
if (!NS_FAILED(rv))
{
// XXX: do smth meaningful with possible Java exception
if (call->jException) {
m_jvm->DeleteLocalRef(call->jException);
rv = NS_ERROR_FAILURE;
} else
rv = NS_OK;
}
nsWFSecureEnv::CleanupJavaCallInfo(call, ctx);
return rv;
}
NS_IMETHODIMP nsWFSecureEnv::GetVersion(/*[out]*/ jint* version)
{
if (m_env == NULL || version == NULL)
return NS_ERROR_NULL_POINTER;
*version = m_env->GetVersion();
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::DefineClass(/*[in]*/ const char* name,
/*[in]*/ jobject loader,
/*[in]*/ const jbyte *buf,
/*[in]*/ jsize len,
/*[out]*/ jclass* clazz)
{
//OJI_LOG("nsWFSecureEnv::DefineClass");
if (m_env == NULL || clazz == NULL)
return NS_ERROR_NULL_POINTER;
*clazz = m_env->DefineClass(name, loader, buf, len);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::FindClass(/*[in]*/ const char* name,
/*[out]*/ jclass* clazz)
{
if (m_env == NULL || clazz == NULL)
return NS_ERROR_NULL_POINTER;
*clazz = m_env->FindClass(name);
//OJI_LOG3("nsWFSecureEnv::FindClass for %s is %x", name, *clazz);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetSuperclass(/*[in]*/ jclass sub,
/*[out]*/ jclass* super)
{
if (m_env == NULL || super == NULL)
return NS_ERROR_NULL_POINTER;
*super = m_env->GetSuperclass(sub);
//OJI_LOG3("nsWFSecureEnv::GetSuperclass: %x->%x", sub, *super);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::IsAssignableFrom(/*[in]*/ jclass sub,
/*[in]*/ jclass super,
/*[out]*/ jboolean* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->IsAssignableFrom(sub, super);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::Throw(/*[in]*/ jthrowable obj,
/*[out]*/ jint* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
//OJI_LOG("nsWFSecureEnv::Throw");
*result = m_env->Throw(obj);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::ThrowNew(/*[in]*/ jclass clazz,
/*[in]*/ const char *msg,
/*[out]*/ jint* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->ThrowNew(clazz, msg);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::ExceptionOccurred(/*[out]*/ jthrowable* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->ExceptionOccurred();
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::ExceptionDescribe(void)
{
if (m_env == NULL)
return NS_ERROR_NULL_POINTER;
m_env->ExceptionDescribe();
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::ExceptionClear(void)
{
if (m_env == NULL)
return NS_ERROR_NULL_POINTER;
m_env->ExceptionClear();
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::FatalError(/*[in]*/ const char* msg)
{
if (m_env == NULL)
return NS_ERROR_NULL_POINTER;
OJI_LOG2("Fatal error: %s", msg);
m_env->FatalError(msg);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::NewGlobalRef(/*[in]*/ jobject lobj,
/*[out]*/ jobject* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->NewGlobalRef(lobj);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::DeleteGlobalRef(/*[in]*/ jobject gref)
{
if (m_env == NULL)
return NS_ERROR_NULL_POINTER;
m_env->DeleteGlobalRef(gref);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::DeleteLocalRef(/*[in]*/ jobject obj)
{
if (m_env == NULL)
return NS_ERROR_NULL_POINTER;
m_env->DeleteLocalRef(obj);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::IsSameObject(/*[in]*/ jobject obj1,
/*[in]*/ jobject obj2,
/*[out]*/ jboolean* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->IsSameObject(obj1, obj2);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::AllocObject(/*[in]*/ jclass clazz,
/*[out]*/ jobject* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->AllocObject(clazz);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetObjectClass(/*[in]*/ jobject obj,
/*[out]*/ jclass* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->GetObjectClass(obj);
//OJI_LOG("nsWFSecureEnv::GetObjectClass");
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::IsInstanceOf(/*[in]*/ jobject obj,
/*[in]*/ jclass clazz,
/*[out]*/ jboolean* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->IsInstanceOf(obj, clazz);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetMethodID(/*[in]*/ jclass clazz,
/*[in]*/ const char* name,
/*[in]*/ const char* sig,
/*[out]*/ jmethodID* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->GetMethodID(clazz, name, sig);
//OJI_LOG5("nsWFSecureEnv::GetMethodID: class=%x method=%s sig=%s r=%x", clazz, name, sig, *result);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetFieldID(/*[in]*/ jclass clazz,
/*[in]*/ const char* name,
/*[in]*/ const char* sig,
/*[out]*/ jfieldID* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->GetFieldID(clazz, name, sig);
//OJI_LOG5("nsWFSecureEnv::GetFieldID: class=%x method=%s sig=%s r=%x",
//clazz, name, sig, *result);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetStaticMethodID(/*[in]*/ jclass clazz,
/*[in]*/ const char* name,
/*[in]*/ const char* sig,
/*[out]*/ jmethodID* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->GetStaticMethodID(clazz, name, sig);
//OJI_LOG5("nsWFSecureEnv::GetStaticMethodID: class=%x method=%s sig=%s r=%x",
//clazz, name, sig, *result);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetStaticFieldID(/*[in]*/ jclass clazz,
/*[in]*/ const char* name,
/*[in]*/ const char* sig,
/*[out]*/ jfieldID* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->GetStaticFieldID(clazz, name, sig);
//OJI_LOG5("nsWFSecureEnv::GetStaticFieldID: clazz=%x name=%s sig=%s r=%x",
//clazz, name, sig, *result);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::NewString(/*[in]*/ const jchar* unicode,
/*[in]*/ jsize len,
/*[out]*/ jstring* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->NewString(unicode, len);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetStringLength(/*[in]*/ jstring str,
/*[out]*/ jsize* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->GetStringLength(str);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetStringChars(/*[in]*/ jstring str,
/*[in]*/ jboolean *isCopy,
/*[out]*/ const jchar** result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->GetStringChars(str, isCopy);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::ReleaseStringChars(/*[in]*/ jstring str,
/*[in]*/ const jchar *chars)
{
if (m_env == NULL)
return NS_ERROR_NULL_POINTER;
m_env->ReleaseStringChars(str, chars);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::NewStringUTF(/*[in]*/ const char *utf,
/*[out]*/ jstring* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->NewStringUTF(utf);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetStringUTFLength(/*[in]*/ jstring str,
/*[out]*/ jsize* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->GetStringUTFLength(str);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetStringUTFChars(/*[in]*/ jstring str,
/*[in]*/ jboolean *isCopy,
/*[out]*/ const char** result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->GetStringUTFChars(str, isCopy);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::ReleaseStringUTFChars(/*[in]*/ jstring str,
/*[in]*/ const char *chars)
{
if (m_env == NULL)
return NS_ERROR_NULL_POINTER;
m_env->ReleaseStringUTFChars(str, chars);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetArrayLength(/*[in]*/ jarray array,
/*[out]*/ jsize* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->GetArrayLength(array);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetObjectArrayElement(/*[in]*/ jobjectArray array,
/*[in]*/ jsize index,
/*[out]*/ jobject* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->GetObjectArrayElement(array, index);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::SetObjectArrayElement(/*[in]*/ jobjectArray array,
/*[in]*/ jsize index,
/*[in]*/ jobject val)
{
if (m_env == NULL)
return NS_ERROR_NULL_POINTER;
m_env->SetObjectArrayElement(array, index, val);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::NewObjectArray(/*[in]*/ jsize len,
/*[in]*/ jclass clazz,
/*[in]*/ jobject init,
/*[out]*/ jobjectArray* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->NewObjectArray(len, clazz, init);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::NewArray(/*[in]*/ jni_type element_type,
/*[in]*/ jsize len,
/*[out]*/ jarray* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
switch (element_type)
{
case jboolean_type: {
*result = m_env->NewBooleanArray(len);
break;
}
case jbyte_type: {
*result = m_env->NewByteArray(len);
break;
}
case jchar_type: {
*result = m_env->NewCharArray(len);
break;
}
case jshort_type: {
*result = m_env->NewShortArray(len);
break;
}
case jint_type: {
*result = m_env->NewIntArray(len);
break;
}
case jlong_type:{
*result = m_env->NewLongArray(len);
break;
}
case jfloat_type:{
*result = m_env->NewFloatArray(len);
break;
}
case jdouble_type:{
*result = m_env->NewDoubleArray(len);
break;
}
default:
return NS_ERROR_FAILURE;
}
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetArrayElements(/*[in]*/ jni_type element_type,
/*[in]*/ jarray array,
/*[in]*/ jboolean *isCopy,
/*[out]*/ void* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
switch (element_type)
{
case jboolean_type: {
jboolean** ret = (jboolean**) result;
*ret = m_env->GetBooleanArrayElements((jbooleanArray)array, isCopy);
break;
}
case jbyte_type: {
jbyte** ret = (jbyte**) result;
*ret = m_env->GetByteArrayElements((jbyteArray)array, isCopy);
break;
}
case jchar_type: {
jchar** ret = (jchar**) result;
*ret = m_env->GetCharArrayElements((jcharArray)array, isCopy);
break;
}
case jshort_type: {
jshort** ret = (jshort**) result;
*ret = m_env->GetShortArrayElements((jshortArray)array, isCopy);
break;
}
case jint_type: {
jint** ret = (jint**) result;
*ret = m_env->GetIntArrayElements((jintArray)array, isCopy);
break;
}
case jlong_type:{
jlong** ret = (jlong**) result;
*ret = m_env->GetLongArrayElements((jlongArray)array, isCopy);
break;
}
case jfloat_type:{
jfloat** ret = (jfloat**) result;
*ret = m_env->GetFloatArrayElements((jfloatArray)array, isCopy);
break;
}
case jdouble_type:{
jdouble** ret = (jdouble**) result;
*ret = m_env->GetDoubleArrayElements((jdoubleArray)array, isCopy);
break;
}
default:
return NS_ERROR_FAILURE;
}
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::ReleaseArrayElements(/*[in]*/ jni_type element_type,
/*[in]*/ jarray array,
/*[in]*/ void *elems,
/*[in]*/ jint mode)
{
if (m_env == NULL)
return NS_ERROR_NULL_POINTER;
switch (element_type)
{
case jboolean_type: {
m_env->ReleaseBooleanArrayElements((jbooleanArray)array, (jboolean*)elems, mode);
break;
}
case jbyte_type: {
m_env->ReleaseByteArrayElements((jbyteArray)array, (jbyte*)elems, mode);
break;
}
case jchar_type: {
m_env->ReleaseCharArrayElements((jcharArray)array, (jchar*)elems, mode);
break;
}
case jshort_type: {
m_env->ReleaseShortArrayElements((jshortArray)array, (jshort*)elems, mode);
break;
}
case jint_type: {
m_env->ReleaseIntArrayElements((jintArray)array, (jint*)elems, mode);
break;
}
case jlong_type:{
m_env->ReleaseLongArrayElements((jlongArray)array, (jlong*)elems, mode);
break;
}
case jfloat_type:{
m_env->ReleaseFloatArrayElements((jfloatArray)array, (jfloat*)elems, mode);
break;
}
case jdouble_type:{
m_env->ReleaseDoubleArrayElements((jdoubleArray)array, (jdouble*)elems, mode);
break;
}
default:
return NS_ERROR_FAILURE;
}
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetArrayRegion(/*[in]*/ jni_type element_type,
/*[in]*/ jarray array,
/*[in]*/ jsize start,
/*[in]*/ jsize len,
/*[out]*/ void* buf)
{
if (m_env == NULL || buf == NULL)
return NS_ERROR_NULL_POINTER;
switch (element_type)
{
case jboolean_type: {
m_env->GetBooleanArrayRegion((jbooleanArray)array, start, len, (jboolean*)buf);
break;
}
case jbyte_type: {
m_env->GetByteArrayRegion((jbyteArray)array, start, len, (jbyte*)buf);
break;
}
case jchar_type: {
m_env->GetCharArrayRegion((jcharArray)array, start, len, (jchar*)buf);
break;
}
case jshort_type: {
m_env->GetShortArrayRegion((jshortArray)array, start, len, (jshort*)buf);
break;
}
case jint_type: {
m_env->GetIntArrayRegion((jintArray)array, start, len, (jint*)buf);
break;
}
case jlong_type:{
m_env->GetLongArrayRegion((jlongArray)array, start, len, (jlong*)buf);
break;
}
case jfloat_type:{
m_env->GetFloatArrayRegion((jfloatArray)array, start, len, (jfloat*)buf);
break;
}
case jdouble_type:{
m_env->GetDoubleArrayRegion((jdoubleArray)array, start, len, (jdouble*)buf);
break;
}
default:
return NS_ERROR_FAILURE;
}
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::SetArrayRegion(/*[in]*/ jni_type element_type,
/*[in]*/ jarray array,
/*[in]*/ jsize start,
/*[in]*/ jsize len,
/*[in]*/ void* buf)
{
if (m_env == NULL || buf == NULL)
return NS_ERROR_NULL_POINTER;
switch (element_type)
{
case jboolean_type: {
m_env->SetBooleanArrayRegion((jbooleanArray)array, start, len, (jboolean*)buf);
break;
}
case jbyte_type: {
m_env->SetByteArrayRegion((jbyteArray)array, start, len, (jbyte*)buf);
break;
}
case jchar_type: {
m_env->SetCharArrayRegion((jcharArray)array, start, len, (jchar*)buf);
break;
}
case jshort_type: {
m_env->SetShortArrayRegion((jshortArray)array, start, len, (jshort*)buf);
break;
}
case jint_type: {
m_env->SetIntArrayRegion((jintArray)array, start, len, (jint*)buf);
break;
}
case jlong_type:{
m_env->SetLongArrayRegion((jlongArray)array, start, len, (jlong*)buf);
break;
}
case jfloat_type:{
m_env->SetFloatArrayRegion((jfloatArray)array, start, len, (jfloat*)buf);
break;
}
case jdouble_type:{
m_env->SetDoubleArrayRegion((jdoubleArray)array, start, len, (jdouble*)buf);
break;
}
default:
return NS_ERROR_FAILURE;
}
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::RegisterNatives(/*[in]*/ jclass clazz,
/*[in]*/ const JNINativeMethod *methods,
/*[in]*/ jint nMethods,
/*[out]*/ jint* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->RegisterNatives(clazz, methods, nMethods);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::UnregisterNatives(/*[in]*/ jclass clazz,
/*[out]*/ jint* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->UnregisterNatives(clazz);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::MonitorEnter(/*[in]*/ jobject obj,
/*[out]*/ jint* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->MonitorEnter(obj);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::MonitorExit(/*[in]*/ jobject obj,
/*[out]*/ jint* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->MonitorExit(obj);
return NS_OK;
}
NS_IMETHODIMP nsWFSecureEnv::GetJavaVM(/*[in]*/ JavaVM **vm,
/*[out]*/ jint* result)
{
if (m_env == NULL || result == NULL)
return NS_ERROR_NULL_POINTER;
*result = m_env->GetJavaVM(vm);
return NS_OK;
}