--- a/trunk/php-java-bridge/proxyenv.c +++ b/trunk/php-java-bridge/proxyenv.c @@ -1,304 +0,0 @@ -/*-*- mode: C; tab-width:4 -*-*/ - -#include <stdarg.h> -#include <assert.h> -#include <errno.h> -#include <string.h> -#include <stdlib.h> - -#include "protocol.h" -#include "php_wrapper.h" -#include "sio.c" - -#define swrite java_swrite -void java_swrite(const void *ptr, size_t size, size_t nmemb, SFILE *stream) { - int n = SFWRITE(ptr, size, nmemb, stream); - //printf("write char:::%d\n", (unsigned int) ((char*)ptr)[0]); - assert(n==nmemb); - if(n!=nmemb) exit(7); -} - -#define sread java_sread -void java_sread(void *ptr, size_t size, size_t nmemb, SFILE *stream) { - int n = SFREAD(ptr, size, nmemb, stream); - //printf("read char:::%d\n", (unsigned int) ((char*)ptr)[0]); - assert(n==nmemb); - if(n!=nmemb) exit(7); -} - -#define id java_id -void java_id(proxyenv *env, char id) { - swrite(&id, sizeof id, 1, (*env)->peer); -} - -/* - * The following Invoke, CreateObject, GetSetProp and LastException methods start everything - */ -static void do_invoke(proxyenv *env, jobject php_reflect, jmethodID invoke, jobject obj, jstring method, jobjectArray array, jlong result) { - swrite(&php_reflect, sizeof php_reflect, 1, (*env)->peer); - swrite(&invoke, sizeof invoke, 1, (*env)->peer); - swrite(&obj, sizeof obj, 1, (*env)->peer); - swrite(&method, sizeof method, 1, (*env)->peer); - swrite(&array, sizeof array, 1, (*env)->peer); - swrite(&result, sizeof result, 1, (*env)->peer); - (*env)->handle_request(env); -} -static void Invoke(proxyenv *env, jobject php_reflect, jmethodID invoke, jobject obj, jstring method, jobjectArray array, jlong result) { - id(env, INVOKE); - do_invoke(env, php_reflect, invoke, obj, method, array, result); -} - -static void LastException(proxyenv *env, jobject php_reflect, jmethodID lastEx, jlong result) { - id(env, LASTEXCEPTION); - swrite(&php_reflect, sizeof php_reflect, 1, (*env)->peer); - swrite(&lastEx, sizeof lastEx, 1, (*env)->peer); - swrite(&result, sizeof result, 1, (*env)->peer); - (*env)->handle_request(env); -} -static void CreateObject(proxyenv *env, jobject php_reflect, jmethodID invoke, jstring method, jboolean createInstance, jobjectArray array, jlong result) { - id(env, CREATEOBJECT); - swrite(&php_reflect, sizeof php_reflect, 1, (*env)->peer); - swrite(&invoke, sizeof invoke, 1, (*env)->peer); - swrite(&method, sizeof method, 1, (*env)->peer); - swrite(&createInstance, sizeof createInstance, 1, (*env)->peer); - swrite(&array, sizeof array, 1, (*env)->peer); - swrite(&result, sizeof result, 1, (*env)->peer); - (*env)->handle_request(env); -} - -static void GetSetProp(proxyenv *env, jobject php_reflect, jmethodID gsp, jobject obj, jstring propName, jobjectArray value, jlong result) { - id(env, GETSETPROP); - do_invoke(env, php_reflect, gsp, obj, propName, value, result); -} - - - -static jobject AllocObject (proxyenv *env, jclass clazz) { - jobject result; - id(env, ALLOCOBJECT); - swrite(&clazz, sizeof clazz, 1, (*env)->peer); - sread(&result, sizeof result, 1, (*env)->peer); - return result; -} -static jobject CallObjectMethodA (short count, proxyenv *env, jobject obj, jmethodID methodID, const jvalue *args) { - jobject result; - id(env, CALLOBJECTMETHOD); - swrite(&count, sizeof count, 1, (*env)->peer); - swrite(&obj, sizeof obj, 1, (*env)->peer); - swrite(&methodID, sizeof methodID, 1, (*env)->peer); - swrite(args, sizeof*args, count, (*env)->peer); - sread(&result, sizeof result, 1, (*env)->peer); - return result; -} -static void CallVoidMethodA (short count, proxyenv *env, jobject obj, jmethodID methodID, const jvalue *args) { - id(env, CALLVOIDMETHOD); - swrite(&count, sizeof count, 1, (*env)->peer); - swrite(&obj, sizeof obj, 1, (*env)->peer); - swrite(&methodID, sizeof methodID, 1, (*env)->peer); - swrite(args, sizeof*args, count, (*env)->peer); -} -static void DeleteGlobalRef (proxyenv *env, jobject gref) { - id(env, DELETEGLOBALREF); - swrite(&gref, sizeof gref, 1, (*env)->peer); -} -static void ExceptionClear (proxyenv *env) { - id(env, EXCEPTIONCLEAR); -} -static jthrowable ExceptionOccurred (proxyenv *env) { - jthrowable result; - id(env, EXCEPTIONOCCURRED); - sread(&result, sizeof result, 1, (*env)->peer); - return result; -} -static jclass FindClass (proxyenv *env, const char *name) { - size_t len=strlen(name); - jclass clazz; - id(env, FINDCLASS); - swrite(&len, sizeof len, 1, (*env)->peer); - swrite(name, sizeof*name, len, (*env)->peer); - sread(&clazz, sizeof clazz, 1, (*env)->peer); - return clazz; -} -static jsize GetArrayLength (proxyenv *env, jarray array) { - jsize result; - id(env, GETARRAYLENGTH); - swrite(&array, sizeof array, 1, (*env)->peer); - sread(&result, sizeof result, 1, (*env)->peer); - return result; -} -static jbyte *GetByteArrayElements (proxyenv *env, jbyteArray array, jboolean *isCopy) { - size_t count; - jboolean dummy; - jbyte *result; - id(env, GETBYTEARRAYELEMENTS); - swrite(&array, sizeof array, 1, (*env)->peer); - sread(&dummy, sizeof dummy, 1, (*env)->peer); - sread(&count, sizeof count, 1, (*env)->peer); - result=(jbyte*)calloc(count, sizeof*result); - assert(result); if(!result) exit(6); - sread(result, sizeof*result, count, (*env)->peer); - assert(isCopy); - if(isCopy) *isCopy=dummy; - swrite(&result, sizeof result, 1, (*env)->peer); - return result; -} -static jmethodID GetMethodID (proxyenv *env, jclass clazz, const char *name, const char *sig) { - jmethodID mid; - size_t len; - id(env, GETMETHODID); - swrite(&clazz, sizeof clazz, 1, (*env)->peer); - len=strlen(name); - swrite(&len, sizeof len, 1, (*env)->peer); - swrite(name, sizeof*name, len, (*env)->peer); - len=strlen(sig); - swrite(&len, sizeof len, 1, (*env)->peer); - swrite(sig, sizeof*sig, len, (*env)->peer); - sread(&mid, sizeof mid, 1, (*env)->peer); - return mid; -} -static jclass GetObjectClass (proxyenv *env, jobject obj) { - jclass result; - id(env, GETOBJECTCLASS); - swrite(&obj, sizeof obj, 1, (*env)->peer); - sread(&result, sizeof result, 1, (*env)->peer); - return result; -} -static const char* GetStringUTFChars (proxyenv *env, jstring str, jboolean *isCopy) { - size_t count; - char *result; - jboolean dummy; - id(env, GETSTRINGUTFCHARS); - swrite(&str, sizeof str, 1, (*env)->peer); - sread(&dummy, sizeof dummy, 1, (*env)->peer); - sread(&count, sizeof count, 1, (*env)->peer); - result=(char*)malloc(count+1); - assert(result); - sread(result, sizeof*result, count, (*env)->peer); - result[count]=0; - assert(isCopy); - if(isCopy) *isCopy=dummy; - swrite(&result, sizeof result, 1, (*env)->peer); - return result; -} -static jbyteArray NewByteArray (proxyenv *env, jsize len) { - jbyteArray result; - id(env, NEWBYTEARRAY); - swrite(&len, sizeof len, 1, (*env)->peer); - sread(&result, sizeof result, 1, (*env)->peer); - return result; -} -static jobject NewGlobalRef (proxyenv *env, jobject lobj) { - jobject result; - id(env, NEWGLOBALREF); - swrite(&lobj, sizeof lobj, 1, (*env)->peer); - sread(&result, sizeof result, 1, (*env)->peer); - return result; -} -static jobject NewObjectA (short count, proxyenv *env, jclass clazz, jmethodID methodID, const jvalue *args) { - jobject result; - id(env, NEWOBJECT); - swrite(&count, sizeof count, 1, (*env)->peer); - swrite(&clazz, sizeof clazz, 1, (*env)->peer); - swrite(&methodID, sizeof methodID, 1, (*env)->peer); - swrite(args, sizeof*args, count, (*env)->peer); - sread(&result, sizeof result, 1, (*env)->peer); - return result; -} -static jobjectArray NewObjectArray (proxyenv *env, jsize len, jclass clazz, jobject init) { - jobjectArray result; - id(env, NEWOBJECTARRAY); - swrite(&len, sizeof len, 1, (*env)->peer); - swrite(&clazz, sizeof clazz, 1, (*env)->peer); - swrite(&init, sizeof init, 1, (*env)->peer); - sread(&result, sizeof result, 1, (*env)->peer); - return result; -} -static jstring NewStringUTF (proxyenv *env, const char *utf) { - jstring result; - size_t length=strlen(utf); - id(env, NEWSTRINGUTF); - swrite(&length, sizeof length, 1, (*env)->peer); - swrite(utf, sizeof*utf, length, (*env)->peer); - sread(&result, sizeof result, 1, (*env)->peer); - return result; -} -static void ReleaseByteArrayElements (proxyenv *env, jbyteArray array, jbyte *elems, jint mode) { - id(env, RELEASEBYTEARRAYELEMENTS); - swrite(&array, sizeof array, 1, (*env)->peer); - swrite(&elems, sizeof elems, 1, (*env)->peer); - swrite(&mode, sizeof mode, 1, (*env)->peer); - assert(!mode); - free(elems); -} -static void ReleaseStringUTFChars (proxyenv *env, jstring array, const char*elems) { - id(env, RELEASESTRINGUTFCHARS); - swrite(&array, sizeof array, 1, (*env)->peer); - swrite(&elems, sizeof elems, 1, (*env)->peer); - free((char*)elems); -} -static void SetByteArrayRegion (proxyenv *env, jbyteArray array, jsize start, jsize len, jbyte *buf) { - id(env, SETBYTEARRAYREGION); - swrite(&array, sizeof array, 1, (*env)->peer); - swrite(&start, sizeof start, 1, (*env)->peer); - swrite(&len, sizeof len, 1, (*env)->peer); - swrite(buf, sizeof*buf, len, (*env)->peer); -} -static void SetObjectArrayElement (proxyenv *env, jobjectArray array, jsize index, jobject val) { - id(env, SETOBJECTARRAYELEMENT); - swrite(&array, sizeof array, 1, (*env)->peer); - swrite(&index, sizeof index, 1, (*env)->peer); - swrite(&val, sizeof val, 1, (*env)->peer); -} - -static jboolean IsInstanceOf(proxyenv *env, jobject obj, jobject clazz) { - jboolean result; - id(env, ISINSTANCEOF); - swrite(&obj, sizeof obj, 1, (*env)->peer); - swrite(&clazz, sizeof clazz, 1, (*env)->peer); - sread(&result, sizeof result, 1, (*env)->peer); - return result; -} - -proxyenv *java_createSecureEnvironment(SFILE *peer, int (*handle_request)(proxyenv *env)) { - proxyenv *env; - env=(proxyenv*)malloc(sizeof *env); - if(!env) return 0; - *env=(proxyenv)calloc(1, sizeof **env); - if(!*env) {free(env); return 0;} - - (*env)->peer = peer; - (*env)->handle_request = handle_request; - - (*env)->LastException=LastException; - (*env)->GetSetProp=GetSetProp; - (*env)->Invoke=Invoke; - (*env)->CreateObject=CreateObject; - (*env)->AllocObject=AllocObject; - (*env)->CallObjectMethodA=CallObjectMethodA; - (*env)->CallVoidMethodA=CallVoidMethodA; - (*env)->DeleteGlobalRef=DeleteGlobalRef; - (*env)->ExceptionClear=ExceptionClear; - (*env)->ExceptionOccurred=ExceptionOccurred; - (*env)->FindClass=FindClass; - (*env)->GetArrayLength=GetArrayLength; - (*env)->GetByteArrayElements=GetByteArrayElements; - (*env)->GetMethodID=GetMethodID; - (*env)->GetObjectClass=GetObjectClass; - (*env)->GetStringUTFChars=GetStringUTFChars; - (*env)->NewByteArray=NewByteArray; - (*env)->NewGlobalRef=NewGlobalRef; - (*env)->NewObjectA=NewObjectA; - (*env)->NewObjectArray=NewObjectArray; - (*env)->NewStringUTF=NewStringUTF; - (*env)->ReleaseByteArrayElements=ReleaseByteArrayElements; - (*env)->ReleaseStringUTFChars=ReleaseStringUTFChars; - (*env)->SetByteArrayRegion=SetByteArrayRegion; - (*env)->SetObjectArrayElement=SetObjectArrayElement; - (*env)->IsInstanceOf=IsInstanceOf; - - return env; -} - -#ifndef PHP_WRAPPER_H -#error must include php_wrapper.h -#endif