--- a/trunk/php-java-bridge/java.c +++ b/trunk/php-java-bridge/java.c @@ -226,14 +226,15 @@ EXT_GLOBAL(get_jobject_from_object)(*pobj, &obj TSRMLS_CC); if(!obj) { zend_error(E_ERROR, "Argument for %s() must be a "/**/EXT_NAME()/**/" object", get_active_function_name(TSRMLS_C)); - return; + RETURN_NULL(); } (*jenv)->writeInvokeBegin(jenv, 0, "getValues", 0, 'I', return_value); (*jenv)->writeObject(jenv, obj); (*jenv)->writeInvokeEnd(jenv); #else - COPY_PZVAL_TO_ZVAL(*return_value, *pobj); + ZVAL_NULL(return_value); + REPLACE_ZVAL_VALUE(&return_value, *pobj, 1); #endif } @@ -248,7 +249,6 @@ int argc = ZEND_NUM_ARGS(); HashTable *function_mappings = 0; - TSRMLS_FETCH(); if (argc>3 || zend_get_parameters_ex(argc, &pobj, &pfkt, &pclass) == FAILURE) WRONG_PARAM_COUNT; @@ -271,9 +271,11 @@ zend_hash_init(function_mappings, 0, NULL, ZVAL_PTR_DTOR, 0); zend_hash_add(function_mappings, str, length, str, length, 0); } else { - WRONG_PARAM_COUNT; /* FIXME: check array */ - } - } else if (Z_TYPE_PP(pobj) == IS_OBJECT) { + if(!ZVAL_IS_NULL(*pfkt)) WRONG_PARAM_COUNT; /* FIXME: check array */ + } + } + + if (Z_TYPE_PP(pobj) == IS_OBJECT) { zval_add_ref(pobj); } @@ -297,6 +299,28 @@ (*jenv)->writeCompositeEnd(jenv); (*jenv)->writeInvokeEnd(jenv); } + +EXT_FUNCTION(EXT_GLOBAL(inspect)) { + zval **pobj; + long obj; + proxyenv *jenv = EXT_GLOBAL(connect_to_server)(TSRMLS_C); + if(!jenv) {RETURN_NULL();} + + if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &pobj) == FAILURE) + WRONG_PARAM_COUNT; + + convert_to_object_ex(pobj); + obj = 0; + EXT_GLOBAL(get_jobject_from_object)(*pobj, &obj TSRMLS_CC); + if(!obj) { + zend_error(E_ERROR, "Argument for %s() must be a "/**/EXT_NAME()/**/" object", get_active_function_name(TSRMLS_C)); + return; + } + (*jenv)->writeInvokeBegin(jenv, 0, "inspect", 0, 'I', return_value); + (*jenv)->writeObject(jenv, obj); + (*jenv)->writeInvokeEnd(jenv); +} + function_entry EXT_GLOBAL(functions)[] = { EXT_FE(EXT_GLOBAL(last_exception_get), NULL) @@ -310,6 +334,7 @@ EXT_FE(EXT_GLOBAL(reset), NULL) EXT_FE(EXT_GLOBAL(get_values), NULL) EXT_FE(EXT_GLOBAL(closure), NULL) + EXT_FE(EXT_GLOBAL(inspect), NULL) {NULL, NULL, NULL} }; @@ -330,7 +355,7 @@ EXT_GET_MODULE(EXT) #endif -int EXT_GLOBAL(ini_updated), EXT_GLOBAL(ini_last_updated); +int EXT_GLOBAL(ini_updated), EXT_GLOBAL(ini_user), EXT_GLOBAL(ini_set); zend_class_entry *EXT_GLOBAL(class_entry); zend_class_entry *EXT_GLOBAL(class_class_entry); zend_class_entry *EXT_GLOBAL(exception_class_entry); @@ -342,7 +367,9 @@ static PHP_INI_MH(OnIniHosts) { if (new_value) { - EXT_GLOBAL(cfg)->hosts=new_value; + if((EXT_GLOBAL (ini_set) &U_HOSTS)) free(EXT_GLOBAL(cfg)->hosts); + EXT_GLOBAL(cfg)->hosts=strdup(new_value); + assert(EXT_GLOBAL(cfg)->hosts); if(!EXT_GLOBAL(cfg)->hosts) exit(6); EXT_GLOBAL(ini_updated)|=U_HOSTS; } return SUCCESS; @@ -350,7 +377,9 @@ static PHP_INI_MH(OnIniServlet) { if (new_value) { - EXT_GLOBAL(cfg)->servlet=new_value; + if((EXT_GLOBAL (ini_set) &U_SERVLET)) free(EXT_GLOBAL(cfg)->servlet); + EXT_GLOBAL(cfg)->servlet=strdup(new_value); + assert(EXT_GLOBAL(cfg)->servlet); if(!EXT_GLOBAL(cfg)->servlet) exit(6); EXT_GLOBAL(ini_updated)|=U_SERVLET; } return SUCCESS; @@ -358,7 +387,9 @@ static PHP_INI_MH(OnIniSockname) { if (new_value) { - EXT_GLOBAL(cfg)->sockname=new_value; + if((EXT_GLOBAL (ini_set) &U_SOCKNAME)) free(EXT_GLOBAL(cfg)->sockname); + EXT_GLOBAL(cfg)->sockname=strdup(new_value); + assert(EXT_GLOBAL(cfg)->sockname); if(!EXT_GLOBAL(cfg)->sockname) exit(6); EXT_GLOBAL(ini_updated)|=U_SOCKNAME; } return SUCCESS; @@ -366,7 +397,9 @@ static PHP_INI_MH(OnIniClassPath) { if (new_value) { - EXT_GLOBAL(cfg)->classpath =new_value; + if((EXT_GLOBAL (ini_set) &U_CLASSPATH)) free(EXT_GLOBAL(cfg)->classpath); + EXT_GLOBAL(cfg)->classpath =strdup(new_value); + assert(EXT_GLOBAL(cfg)->classpath); if(!EXT_GLOBAL(cfg)->classpath) exit(6); EXT_GLOBAL(ini_updated)|=U_CLASSPATH; } return SUCCESS; @@ -374,7 +407,9 @@ static PHP_INI_MH(OnIniLibPath) { if (new_value) { - EXT_GLOBAL(cfg)->ld_library_path = new_value; + if((EXT_GLOBAL (ini_set) &U_LIBRARY_PATH)) free(EXT_GLOBAL(cfg)->ld_library_path); + EXT_GLOBAL(cfg)->ld_library_path = strdup(new_value); + assert(EXT_GLOBAL(cfg)->ld_library_path); if(!EXT_GLOBAL(cfg)->ld_library_path) exit(6); EXT_GLOBAL(ini_updated)|=U_LIBRARY_PATH; } return SUCCESS; @@ -382,7 +417,9 @@ static PHP_INI_MH(OnIniJava) { if (new_value) { - EXT_GLOBAL(cfg)->vm = new_value; + if((EXT_GLOBAL (ini_set) &U_JAVA)) free(EXT_GLOBAL(cfg)->vm); + EXT_GLOBAL(cfg)->vm = strdup(new_value); + assert(EXT_GLOBAL(cfg)->vm); if(!EXT_GLOBAL(cfg)->vm) exit(6); EXT_GLOBAL(ini_updated)|=U_JAVA; } return SUCCESS; @@ -390,7 +427,9 @@ static PHP_INI_MH(OnIniJavaHome) { if (new_value) { - EXT_GLOBAL(cfg)->vm_home = new_value; + if((EXT_GLOBAL (ini_set) &U_JAVA_HOME)) free(EXT_GLOBAL(cfg)->vm_home); + EXT_GLOBAL(cfg)->vm_home = strdup(new_value); + assert(EXT_GLOBAL(cfg)->vm_home); if(!EXT_GLOBAL(cfg)->vm_home) exit(6); EXT_GLOBAL(ini_updated)|=U_JAVA_HOME; } return SUCCESS; @@ -398,7 +437,9 @@ static PHP_INI_MH(OnIniLogLevel) { if (new_value) { - EXT_GLOBAL(cfg)->logLevel = new_value; + if((EXT_GLOBAL (ini_set) &U_LOGLEVEL)) free(EXT_GLOBAL(cfg)->logLevel); + EXT_GLOBAL(cfg)->logLevel = strdup(new_value); + assert(EXT_GLOBAL(cfg)->logLevel); if(!EXT_GLOBAL(cfg)->logLevel) exit(6); EXT_GLOBAL(cfg)->logLevel_val=atoi(EXT_GLOBAL(cfg)->logLevel); EXT_GLOBAL(ini_updated)|=U_LOGLEVEL; } @@ -407,17 +448,19 @@ static PHP_INI_MH(OnIniLogFile) { if (new_value) { - EXT_GLOBAL(cfg)->logFile = new_value; + if((EXT_GLOBAL (ini_set) &U_LOGFILE)) free(EXT_GLOBAL(cfg)->logFile); + EXT_GLOBAL(cfg)->logFile = strdup(new_value); + assert(EXT_GLOBAL(cfg)->logFile); if(!EXT_GLOBAL(cfg)->logFile) exit(6); EXT_GLOBAL(ini_updated)|=U_LOGFILE; } return SUCCESS; } PHP_INI_BEGIN() - PHP_INI_ENTRY(EXT_NAME()/**/".servlet", NULL, PHP_INI_SYSTEM, OnIniServlet) - PHP_INI_ENTRY(EXT_NAME()/**/".socketname", NULL, PHP_INI_SYSTEM, OnIniSockname) - PHP_INI_ENTRY(EXT_NAME()/**/".hosts", NULL, PHP_INI_SYSTEM, OnIniHosts) - PHP_INI_ENTRY(EXT_NAME()/**/".classpath", NULL, PHP_INI_SYSTEM, OnIniClassPath) - PHP_INI_ENTRY(EXT_NAME()/**/".libpath", NULL, PHP_INI_SYSTEM, OnIniLibPath) + PHP_INI_ENTRY(EXT_NAME()/**/".servlet", NULL, PHP_INI_ALL, OnIniServlet) + PHP_INI_ENTRY(EXT_NAME()/**/".socketname", NULL, PHP_INI_ALL, OnIniSockname) + PHP_INI_ENTRY(EXT_NAME()/**/".hosts", NULL, PHP_INI_ALL, OnIniHosts) + PHP_INI_ENTRY(EXT_NAME()/**/".classpath", NULL, PHP_INI_ALL, OnIniClassPath) + PHP_INI_ENTRY(EXT_NAME()/**/".libpath", NULL, PHP_INI_ALL, OnIniLibPath) PHP_INI_ENTRY(EXT_NAME()/**/"."/**/EXT_NAME()/**/"", NULL, PHP_INI_ALL, OnIniJava) PHP_INI_ENTRY(EXT_NAME()/**/"."/**/EXT_NAME()/**/"_home", NULL, PHP_INI_ALL, OnIniJavaHome) @@ -1028,6 +1071,30 @@ } #endif +/* + * check for CGI environment and set hosts so that we can connect back + * to the sever from which we were called. + */ +static void override_from_cgi() { + char *hosts; + if (getenv("SERVER_SOFTWARE") + || getenv("SERVER_NAME") + || getenv("GATEWAY_INTERFACE") + || getenv("REQUEST_METHOD")) { + if (hosts=getenv("X_JAVABRIDGE_OVERRIDE_HOSTS")) { + if((EXT_GLOBAL (ini_set) &U_HOSTS)) free(EXT_GLOBAL(cfg)->hosts); + EXT_GLOBAL(cfg)->hosts=strdup(hosts); + assert(EXT_GLOBAL(cfg)->hosts); if(!EXT_GLOBAL(cfg)->hosts) exit(6); + EXT_GLOBAL (ini_updated)|=U_HOSTS; + + if((EXT_GLOBAL (ini_set) &U_SERVLET)) free(EXT_GLOBAL(cfg)->servlet); + EXT_GLOBAL(cfg)->servlet=strdup("On"); + assert(EXT_GLOBAL(cfg)->servlet); if(!EXT_GLOBAL(cfg)->servlet) exit(6); + EXT_GLOBAL (ini_updated)|=U_SERVLET; + } + } +} + PHP_MINIT_FUNCTION(EXT) { zend_class_entry *parent; @@ -1105,6 +1172,7 @@ assert(!EXT_GLOBAL (cfg) ); if(!EXT_GLOBAL (cfg) ) EXT_GLOBAL (cfg) = malloc(sizeof *EXT_GLOBAL (cfg) ); if(!EXT_GLOBAL (cfg) ) exit(9); + if(REGISTER_INI_ENTRIES()==SUCCESS) { /* set the default values for all undefined */ extern void EXT_GLOBAL(init_cfg) (); @@ -1124,8 +1192,8 @@ EXT_GLOBAL(cfg)->saddr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); #endif } - assert(!EXT_GLOBAL(ini_last_updated)); - EXT_GLOBAL(ini_last_updated)=EXT_GLOBAL(ini_updated); + override_from_cgi(); + EXT_GLOBAL(ini_user)|=EXT_GLOBAL(ini_updated); EXT_GLOBAL(ini_updated)=0; EXT_GLOBAL(start_server) (); @@ -1136,7 +1204,7 @@ short is_local; char*s=EXT_GLOBAL(get_server_string) (); char*server = EXT_GLOBAL(test_server) (0, &is_local); - short is_level = ((EXT_GLOBAL (ini_last_updated)&U_LOGLEVEL)!=0); + short is_level = ((EXT_GLOBAL (ini_user)&U_LOGLEVEL)!=0); php_info_print_table_start(); php_info_print_table_row(2, EXT_NAME()/**/" support", "Enabled"); @@ -1156,7 +1224,7 @@ #endif php_info_print_table_row(2, EXT_NAME()/**/".hosts", EXT_GLOBAL(cfg)->hosts); #if EXTENSION == JAVA - php_info_print_table_row(2, EXT_NAME()/**/".servlet", EXT_GLOBAL(get_servlet_context) ()?EXT_GLOBAL(get_servlet_context) ():"Off"); + php_info_print_table_row(2, EXT_NAME()/**/".servlet", EXT_GLOBAL(get_servlet_context) ()?"On":"Off"); #endif #ifndef __MINGW32__ php_info_print_table_row(2, EXT_NAME()/**/" command", s); @@ -1174,8 +1242,8 @@ extern void EXT_GLOBAL(shutdown_library) (); extern void EXT_GLOBAL(destroy_cfg) (int); - EXT_GLOBAL(destroy_cfg) (EXT_GLOBAL(ini_last_updated)); - EXT_GLOBAL(ini_last_updated)=0; + EXT_GLOBAL(destroy_cfg) (EXT_GLOBAL(ini_set)); + EXT_GLOBAL(ini_user) = EXT_GLOBAL(ini_set) = 0; UNREGISTER_INI_ENTRIES(); EXT_GLOBAL(shutdown_library) ();