mirror of
https://github.com/php/php-src.git
synced 2024-11-25 19:05:31 +08:00
- Moving java and dotnet extensions to ext/rpc
This commit is contained in:
parent
c8d19858ac
commit
6b7eaaa2c4
@ -1,2 +0,0 @@
|
||||
dotnet
|
||||
Sam Ruby
|
@ -1,5 +0,0 @@
|
||||
this extension is experimental,
|
||||
its functions may change their names
|
||||
or move to extension all together
|
||||
so do not rely to much on them
|
||||
you have been warned!
|
@ -1,32 +0,0 @@
|
||||
Warning
|
||||
=======
|
||||
|
||||
This support is EXPERIMENTAL. In fact, it integrates code that
|
||||
Microsoft labels as pre-beta. Use at your own risk.
|
||||
|
||||
Build instructions
|
||||
==================
|
||||
|
||||
Download and install the .NET Framework SDK Technology Preview from
|
||||
http://msdn.microsoft.com/net/#sdk. Once installed, copy Mscoree.h
|
||||
(typically found in C:\Program Files\NGWSSDK\Include to ext\dotnet).
|
||||
Do not simply add the NGWSSDK\Include directory to the include path
|
||||
as this will cause compilation failures.
|
||||
|
||||
Download and unzip the source to the dm.net COM Moniker from
|
||||
http://staff.develop.com/jasonw/clr/readme.htm. Copy mscorlib.h
|
||||
to ext\dotnet. There is no need to register the clrmonsrv.dll as
|
||||
it is not used.
|
||||
|
||||
At this point, the dotnet project can be built like any other
|
||||
project, from either VisualStudio 6's GUI or from the command line.
|
||||
Example command line invocation:
|
||||
|
||||
msdev dotnet.dsp /MAKE "dotnet - Win32 Debug_TS"
|
||||
|
||||
Execution instructions:
|
||||
=======================
|
||||
|
||||
Add "extension=php_dotnet.dll" into php.ini.
|
||||
|
||||
Sample program can be found at dotnet.php
|
@ -1,237 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 4 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2002 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.02 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available at through the world-wide-web at |
|
||||
| http://www.php.net/license/2_02.txt. |
|
||||
| If you did not receive a copy of the PHP license and are unable to |
|
||||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Author: Sam Ruby <rubys@us.ibm.com> |
|
||||
| Harald Radi <h.radi@nme.at> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
/*
|
||||
* This module implements support for Microsoft .Net components.
|
||||
*/
|
||||
|
||||
/*
|
||||
* 28.1.2001
|
||||
* use external unicode conversion functions
|
||||
*
|
||||
* harald radi <h.radi@nme.at>
|
||||
*/
|
||||
|
||||
#ifdef PHP_WIN32
|
||||
|
||||
#include <iostream>
|
||||
#include <math.h>
|
||||
#include <comdef.h>
|
||||
|
||||
extern "C"
|
||||
{
|
||||
#include "php.h"
|
||||
#include "ext/standard/info.h"
|
||||
}
|
||||
|
||||
#include "ext/com/conversion.h"
|
||||
#include "ext/com/php_COM.h"
|
||||
|
||||
#include "Mscoree.h"
|
||||
#include "mscorlib.h"
|
||||
|
||||
using namespace mscorlib;
|
||||
|
||||
static ICorRuntimeHost *pHost;
|
||||
static mscorlib::_AppDomain *pDomain;
|
||||
|
||||
static zend_class_entry dotnet_class_entry;
|
||||
static int codepage;
|
||||
|
||||
HRESULT dotnet_init() {
|
||||
HRESULT hr;
|
||||
|
||||
hr = CoCreateInstance(CLSID_CorRuntimeHost, NULL, CLSCTX_ALL,
|
||||
IID_ICorRuntimeHost, (void **)&pHost);
|
||||
if (FAILED(hr)) return hr;
|
||||
|
||||
hr = pHost->Start();
|
||||
if (FAILED(hr)) return hr;
|
||||
|
||||
IUnknown *uDomain;
|
||||
hr = pHost->GetDefaultDomain(&uDomain);
|
||||
if (FAILED(hr)) return hr;
|
||||
|
||||
hr = uDomain->QueryInterface(__uuidof(_AppDomain), (void**) &pDomain);
|
||||
if (FAILED(hr)) return -1;
|
||||
|
||||
uDomain->Release();
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
HRESULT dotnet_create(OLECHAR *assembly, OLECHAR *datatype, comval *obj TSRMLS_DC) {
|
||||
HRESULT hr;
|
||||
|
||||
_ObjectHandle *pHandle;
|
||||
hr = pDomain->CreateInstance(_bstr_t(assembly), _bstr_t(datatype), &pHandle);
|
||||
if (FAILED(hr)) return hr;
|
||||
if (!pHandle) return hr;
|
||||
|
||||
_variant_t unwrapped;
|
||||
hr = pHandle->Unwrap(&unwrapped);
|
||||
pHandle->Release();
|
||||
if (FAILED(hr)) return hr;
|
||||
|
||||
php_COM_set(obj, &unwrapped.pdispVal, TRUE TSRMLS_CC);
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
void dotnet_term() {
|
||||
if (pHost) pHost->Stop();
|
||||
if (pHost) pHost->Release();
|
||||
if (pDomain) pDomain->Release();
|
||||
|
||||
pHost = 0;
|
||||
pDomain = 0;
|
||||
}
|
||||
|
||||
/* {{{ proto int dotnet_load(string assembly_name [, string datatype_name, int codepage])
|
||||
Loads a DOTNET module */
|
||||
PHP_FUNCTION(dotnet_load)
|
||||
{
|
||||
HRESULT hr;
|
||||
pval *assembly_name, *datatype_name, *code_page;
|
||||
OLECHAR *assembly, *datatype;
|
||||
comval *obj;
|
||||
|
||||
switch(ZEND_NUM_ARGS())
|
||||
{
|
||||
case 2:
|
||||
getParameters(ht, 2, &assembly_name, &datatype_name);
|
||||
codepage = CP_ACP;
|
||||
break;
|
||||
case 3:
|
||||
getParameters(ht, 3, &assembly_name, &datatype_name, &code_page);
|
||||
|
||||
convert_to_long(code_page);
|
||||
codepage = Z_LVAL_P(code_page);
|
||||
break;
|
||||
default:
|
||||
WRONG_PARAM_COUNT;
|
||||
break;
|
||||
}
|
||||
|
||||
convert_to_string(assembly_name);
|
||||
assembly = php_char_to_OLECHAR(Z_STRVAL_P(assembly_name), Z_STRLEN_P(assembly_name), codepage TSRMLS_CC);
|
||||
|
||||
convert_to_string(datatype_name);
|
||||
datatype = php_char_to_OLECHAR(Z_STRVAL_P(datatype_name), Z_STRLEN_P(datatype_name), codepage TSRMLS_CC);
|
||||
|
||||
ALLOC_COM(obj);
|
||||
|
||||
/* obtain IDispatch */
|
||||
hr = dotnet_create(assembly, datatype, obj TSRMLS_CC);
|
||||
efree(assembly);
|
||||
efree(datatype);
|
||||
if (FAILED(hr)) {
|
||||
char *error_message;
|
||||
error_message = php_COM_error_message(hr TSRMLS_CC);
|
||||
php_error(E_WARNING, "Error obtaining .Net class for %s in assembly %s: %s", datatype_name->value.str.val, assembly_name->value.str.val, error_message);
|
||||
LocalFree(error_message);
|
||||
efree(obj);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
if (C_DISPATCH(obj) == NULL) {
|
||||
php_error(E_WARNING, "Unable to locate %s in assembly %s", datatype_name->value.str.val, assembly_name->value.str.val);
|
||||
efree(obj);
|
||||
RETURN_FALSE;
|
||||
}
|
||||
|
||||
RETURN_LONG(zend_list_insert(obj, IS_COM));
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
void php_DOTNET_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference)
|
||||
{
|
||||
pval *object = property_reference->object;
|
||||
zend_overloaded_element *function_name = (zend_overloaded_element *) property_reference->elements_list->tail->data;
|
||||
|
||||
if (zend_llist_count(property_reference->elements_list)==1
|
||||
&& !strcmp(Z_STRVAL(function_name->element), "dotnet")) { /* constructor */
|
||||
pval *object_handle;
|
||||
|
||||
PHP_FN(dotnet_load)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
||||
if (!Z_LVAL_P(return_value)) {
|
||||
ZVAL_FALSE(object);
|
||||
return;
|
||||
}
|
||||
ALLOC_ZVAL(object_handle);
|
||||
*object_handle = *return_value;
|
||||
pval_copy_constructor(object_handle);
|
||||
INIT_PZVAL(object_handle);
|
||||
zend_hash_index_update(Z_OBJPROP_P(object), 0, &object_handle, sizeof(pval *), NULL);
|
||||
pval_destructor(&function_name->element);
|
||||
} else {
|
||||
php_COM_call_function_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, property_reference);
|
||||
}
|
||||
}
|
||||
|
||||
void php_register_DOTNET_class(TSRMLS_D)
|
||||
{
|
||||
INIT_OVERLOADED_CLASS_ENTRY(dotnet_class_entry, "DOTNET", NULL,
|
||||
php_DOTNET_call_function_handler,
|
||||
php_COM_get_property_handler,
|
||||
php_COM_set_property_handler);
|
||||
|
||||
zend_register_internal_class(&dotnet_class_entry TSRMLS_CC);
|
||||
}
|
||||
|
||||
function_entry DOTNET_functions[] = {
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
static PHP_MINFO_FUNCTION(DOTNET)
|
||||
{
|
||||
php_info_print_table_start();
|
||||
php_info_print_table_row(2, ".NET support", "enabled");
|
||||
php_info_print_table_end();
|
||||
}
|
||||
|
||||
PHP_MINIT_FUNCTION(DOTNET)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
if (FAILED(hr = dotnet_init())) {
|
||||
return hr;
|
||||
}
|
||||
|
||||
php_register_DOTNET_class(TSRMLS_C);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
PHP_MSHUTDOWN_FUNCTION(DOTNET)
|
||||
{
|
||||
dotnet_term();
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
zend_module_entry dotnet_module_entry = {
|
||||
STANDARD_MODULE_HEADER,
|
||||
"dotnet", DOTNET_functions, PHP_MINIT(DOTNET), PHP_MSHUTDOWN(DOTNET), NULL, NULL, PHP_MINFO(DOTNET), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES
|
||||
};
|
||||
|
||||
BEGIN_EXTERN_C()
|
||||
ZEND_GET_MODULE(dotnet)
|
||||
END_EXTERN_C()
|
||||
|
||||
#endif
|
@ -1,167 +0,0 @@
|
||||
# Microsoft Developer Studio Project File - Name="dotnet" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=dotnet - Win32 Debug_TS
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "dotnet.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "dotnet.mak" CFG="dotnet - Win32 Debug_TS"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "dotnet - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "dotnet - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "dotnet - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "dotnet - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "dotnet - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "..\..\Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "NDEBUG" /D ZEND_DEBUG=0 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x40d /d "NDEBUG"
|
||||
# ADD RSC /l 0x40d /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\Release/php_dotnet.dll" /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "dotnet - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "..\..\Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "_DEBUG" /D ZEND_DEBUG=1 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /FR /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x40d /d "_DEBUG"
|
||||
# ADD RSC /l 0x40d /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug/php_dotnet.dll" /pdbtype:sept /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Debug"
|
||||
|
||||
!ELSEIF "$(CFG)" == "dotnet - Win32 Debug_TS"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "..\..\Debug_TS"
|
||||
# PROP BASE Intermediate_Dir "Debug_TS"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug_TS"
|
||||
# PROP Intermediate_Dir "Debug_TS"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "_DEBUG" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /FR /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\\" /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "_DEBUG" /D ZEND_DEBUG=1 /D "ZTS" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FR /YX /FD /D /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x40d /d "_DEBUG"
|
||||
# ADD RSC /l 0x40d /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts_debug.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS/php_dotnet.dll" /pdbtype:sept /libpath:"..\..\Debug_TS"
|
||||
|
||||
!ELSEIF "$(CFG)" == "dotnet - Win32 Release_TS"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "..\..\Release_TS"
|
||||
# PROP BASE Intermediate_Dir "Release_TS"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release_TS"
|
||||
# PROP Intermediate_Dir "Release_TS"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "NDEBUG" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\\" /I "..\..\main" /I "..\..\Zend" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /D "NDEBUG" /D ZEND_DEBUG=0 /D "ZTS" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x40d /d "NDEBUG"
|
||||
# ADD RSC /l 0x40d /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_dotnet.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "dotnet - Win32 Release"
|
||||
# Name "dotnet - Win32 Debug"
|
||||
# Name "dotnet - Win32 Debug_TS"
|
||||
# Name "dotnet - Win32 Release_TS"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\dotnet.cpp
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\php_dotnet.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\README
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
@ -1,8 +0,0 @@
|
||||
<?
|
||||
$stack = new DOTNET("mscorlib","System.Collections.Stack");
|
||||
|
||||
$stack->Push(".Net");
|
||||
$stack->Push("Hello ");
|
||||
|
||||
echo $stack->Pop() . $stack->Pop();
|
||||
?>
|
@ -1,21 +0,0 @@
|
||||
#ifndef PHP_DOTNET_H
|
||||
#define PHP_DOTNET_H
|
||||
|
||||
#ifdef PHP_WIN32
|
||||
|
||||
PHP_MINIT_FUNCTION(DOTNET);
|
||||
PHP_MSHUTDOWN_FUNCTION(DOTNET);
|
||||
PHP_FUNCTION(DOTNET_load);
|
||||
|
||||
extern zend_module_entry DOTNET_module_entry;
|
||||
#define DOTNET_module_ptr &DOTNET_module_entry
|
||||
|
||||
#else
|
||||
|
||||
#define DOTNET_module_ptr NULL
|
||||
|
||||
#endif /* PHP_WIN32 */
|
||||
|
||||
#define phpext_DOTNET_ptr DOTNET_module_ptr
|
||||
|
||||
#endif /* PHP_DOTNET_H */
|
@ -1,2 +0,0 @@
|
||||
Java
|
||||
Sam Ruby
|
@ -1,5 +0,0 @@
|
||||
this extension is experimental,
|
||||
its functions may change their names
|
||||
or move to extension all together
|
||||
so do not rely to much on them
|
||||
you have been warned!
|
@ -1,13 +0,0 @@
|
||||
|
||||
$(srcdir)/java.c : $(srcdir)/php_java.jar
|
||||
|
||||
$(srcdir)/php_java.jar : $(srcdir)/reflect.java
|
||||
@$(mkinstalldirs) $(srcdir)/net/php
|
||||
@cp $(srcdir)/reflect.java $(srcdir)/net/php
|
||||
@echo library=php_java > $(srcdir)/net/php/reflect.properties
|
||||
@$(JAVA_C) $(srcdir)/net/php/reflect.java
|
||||
@test ! -f reflect.class || mv reflect.class $(srcdir)/net/php # bug in KJC javac
|
||||
@$(JAVA_JAR) $(srcdir)/php_java.jar -C $(srcdir) net/php/reflect.class -C $(srcdir) net/php/reflect.properties
|
||||
@rm $(srcdir)/net/php/reflect.*
|
||||
@rmdir $(srcdir)/net/php
|
||||
@rmdir $(srcdir)/net
|
247
ext/java/README
247
ext/java/README
@ -1,247 +0,0 @@
|
||||
What is PHP4 ext/java?
|
||||
|
||||
PHP4 ext/java provides a simple and effective means for creating and
|
||||
invoking methods on Java objects from PHP. The JVM is created using JNI,
|
||||
and everything runs in-process.
|
||||
|
||||
Two examples are provided, jver and jawt, to illustrate usage of this
|
||||
extension. A few things to note:
|
||||
|
||||
1) new Java() will create an instance of a class if a suitable constructor
|
||||
is available. If no parameters are passed and the default constructor
|
||||
is useful as it provides access to classes like "java.lang.System"
|
||||
which expose most of their functionallity through static methods.
|
||||
|
||||
2) Accessing a member of an instance will first look for bean properties
|
||||
then public fields. In other words, "print $date.time" will first
|
||||
attempt to be resolved as "$date.getTime()", then as "$date.time";
|
||||
|
||||
3) Both static and instance members can be accessed on an object with
|
||||
the same syntax. Furthermore, if the java object is of type
|
||||
"java.lang.Class", then static members of the class (fields and
|
||||
methods) can be accessed.
|
||||
|
||||
4) Exceptions raised result in PHP warnings, and null results. The
|
||||
warnings may be eliminated by prefixing the method call with an
|
||||
"@" sign. The following APIs may be used to retrieve and reset
|
||||
the last error:
|
||||
|
||||
java_last_exception_get()
|
||||
java_last_exception_clear()
|
||||
|
||||
5) Overload resolution is in general a hard problem given the
|
||||
differences in types between the two languages. The PHP Java
|
||||
extension employs a simple, but fairly effective, metric for
|
||||
determining which overload is the best match.
|
||||
|
||||
Additionally, method names in PHP are not case sensitive, potentially
|
||||
increasing the number of overloads to select from.
|
||||
|
||||
Once a method is selected, the parameters are cooerced if necessary,
|
||||
possibly with a loss of data (example: double precision floating point
|
||||
numbers will be converted to boolean).
|
||||
|
||||
6) In the tradition of PHP, arrays and hashtables may pretty much
|
||||
be used interchangably. Note that hashtables in PHP may only be
|
||||
indexed by integers or strings; and that arrays of primitive types
|
||||
in Java can not be sparse. Also note that these constructs are
|
||||
passed by value, so may be expensive in terms of memory and time.
|
||||
|
||||
Build and execution instructions:
|
||||
|
||||
Given the number of platforms and providers of JVMs, no single set of
|
||||
instructions will be able to cover all cases. So in place of hard and
|
||||
fast instructions, below are a working examples for a number of free and
|
||||
commercial implementations and platforms. Please adjust the paths to
|
||||
suit your installation. Also, if you happen to get this to work on
|
||||
another JVM/platform combination, please let me know, particularly if
|
||||
a unique build or execution setup was required.
|
||||
|
||||
Note for Windows users: semi-colons (";") mark the beginning of
|
||||
comments in php.ini files, so if you wish to add to the classpath,
|
||||
make sure that the entire string is in quotes. See the JDK 1.1.8
|
||||
instructions below for an example.
|
||||
|
||||
This function has been tested in both CGI and Apache (apxs) modes. As
|
||||
the current design requires shared libraries, this support can not be
|
||||
linked statically into Apache.
|
||||
|
||||
With ext/java, no Java Virtual Machines are created until the first
|
||||
Java call is made. This not only eliminates unnecessary overhead if
|
||||
the extension is never used, it also provides error messages directly
|
||||
back to the user instead of being burried in a log some place.
|
||||
|
||||
For people interested in robustness, performance, and more complete
|
||||
integration with Java, consider using the sapi/servlet interface which
|
||||
is built upon the Java extension. Running PHP as a servlet enables PHP
|
||||
to utilize the existing JVM and threads from the servlet engine, and
|
||||
provides direct access to the servlet request and response objects.
|
||||
|
||||
Finally, the bottom of this readme contains some guidance for how to
|
||||
approach situations in which these instructions don't work on your
|
||||
machine.
|
||||
|
||||
========================================================================
|
||||
=== JVM=Kaffe 1.0.4 (as delivered with OS), OS=Redhat Linux 6.1 ===
|
||||
========================================================================
|
||||
|
||||
build instructions:
|
||||
|
||||
./configure --with-java
|
||||
|
||||
php.ini:
|
||||
|
||||
[java]
|
||||
java.library.path=/usr/lib/kaffe:/home/rubys/php4/modules
|
||||
java.class.path=/usr/share/kaffe/Klasses.jar:/home/rubys/php4/modules/php_java.jar
|
||||
extension_dir=/home/rubys/php4/modules
|
||||
extension=java.so
|
||||
|
||||
========================================================================
|
||||
=== JVM=Kaffe 1.0.5 (built from source), OS=Redhat Linux 6.1 ===
|
||||
========================================================================
|
||||
|
||||
build instructions:
|
||||
|
||||
./configure --with-java
|
||||
|
||||
php.ini:
|
||||
|
||||
[java]
|
||||
java.library.path=/usr/local/lib/kaffe:/home/rubys/php4/modules
|
||||
java.class.path=/usr/local/share/kaffe/Klasses.jar:/home/rubys/php4/modules/php_java.jar
|
||||
extension_dir=/home/rubys/php4/modules
|
||||
extension=java.so
|
||||
|
||||
========================================================================
|
||||
=== JVM=IBM 1.1.8, OS=Redhat Linux 6.1 ===
|
||||
========================================================================
|
||||
|
||||
build instructions:
|
||||
|
||||
./configure --with-java
|
||||
|
||||
php.ini:
|
||||
|
||||
[java]
|
||||
java.class.path=/home/jdk118/lib/classes.zip:/home/rubys/php4/modules/php_java.jar
|
||||
extension_dir=/home/rubys/php4/modules
|
||||
extension=java.so
|
||||
|
||||
========================================================================
|
||||
=== JVM=Blackdown 1.2.2 RC4, OS=Redhat Linux 6.1 ===
|
||||
========================================================================
|
||||
|
||||
build instructions:
|
||||
|
||||
./configure --with-java
|
||||
|
||||
php.ini:
|
||||
|
||||
[java]
|
||||
java.class.path=/home/rubys/php4/lib/php_java.jar
|
||||
extension_dir=/home/rubys/php4/modules
|
||||
extension=java.so
|
||||
|
||||
========================================================================
|
||||
=== JVM=Sun JDK 1.2.2, OS=Linux ===
|
||||
========================================================================
|
||||
|
||||
build instructions:
|
||||
|
||||
./configure --with-java
|
||||
|
||||
php.ini:
|
||||
|
||||
[java]
|
||||
java.class.path=/home/rubys/php4/lib/php_java.jar
|
||||
java.library.path=/home/rubys/php4/modules
|
||||
extension_dir=/home/rubys/php4/modules
|
||||
extension=java.so
|
||||
|
||||
========================================================================
|
||||
=== JVM=Sun JDK 1.1.8, OS=Windows NT 4 ===
|
||||
========================================================================
|
||||
|
||||
build instructions:
|
||||
|
||||
SET JAVA_HOME=D:\jdk1.1.8
|
||||
msdev ext\java\java.dsp /MAKE "java - Win32 Debug_TS"
|
||||
|
||||
php.ini:
|
||||
|
||||
[java]
|
||||
java.class.path="D:\jdk1.1.8\lib\classes.zip;F:\PHP4\Debug_TS\php_java.jar"
|
||||
extension=php_java.dll
|
||||
|
||||
========================================================================
|
||||
=== JVM=Sun JDK 1.2.2, OS=Windows NT 4 ===
|
||||
========================================================================
|
||||
|
||||
build instructions:
|
||||
|
||||
SET JAVA_HOME=D:\jdk1.2.2
|
||||
msdev ext\java\java.dsp /MAKE "java - Win32 Debug_TS"
|
||||
|
||||
php.ini:
|
||||
|
||||
[java]
|
||||
java.class.path=F:\PHP4\Debug_TS\php_java.jar
|
||||
extension=php_java.dll
|
||||
|
||||
=========================================================================
|
||||
|
||||
Guidance for when these instructions don't work.
|
||||
|
||||
JDK vendors don't typically document their internal workings, and are
|
||||
typically very reliant on code inside of the JAVA main program and the
|
||||
installation directory structure. For this reason, running PHP as a
|
||||
servlet is typically much easier to get working. But if for some reason
|
||||
this is not appropriate for you, and the instructions above don't work,
|
||||
then read on.
|
||||
|
||||
The first thing to realize is that the directory structure of the JDK is
|
||||
very important. Some users (particularly on Windows) get a message about
|
||||
a DLL or shared library not being available and proceed to find that file
|
||||
and copy it into a system directory. This typically just gets you to the
|
||||
next problem - for example, it appears that many JDKs attempt to locate
|
||||
the runtime Java classes (rt.jar) in a directory relative to these system
|
||||
libraries. So unless you are inclined to copy your entire Java
|
||||
installation, you are much better adjusting your PATHs.
|
||||
|
||||
Not documented above, but useful for many JDK's is ability to specify the
|
||||
library path via java.library.path in the php.ini. On many Unix machines,
|
||||
determining the initial value for this can be done by changing directory
|
||||
to where you find a shared library that can't be loaded (example:
|
||||
libjava.so), and executing "ld libjava.so". If you see some modules
|
||||
listed as "not found", add the necessary directories to LD_LIBRARY_PATH
|
||||
and repeat until successful. On my system, I require the following
|
||||
two directories.
|
||||
|
||||
/home/jdk1.2.2/jre/lib/i386/native_threads
|
||||
/home/jdk1.2.2/jre/lib/i386/classic
|
||||
|
||||
Note: this only determines the statically loaded libraries. Additional
|
||||
libraries (such as libzip.so) may be loaded dynamically. On my system,
|
||||
libzip.so is located in
|
||||
|
||||
/home/jdk1.2.2/jre/lib/i386
|
||||
|
||||
Another php.ini variable which may be helpful is java.home.
|
||||
|
||||
If java.library.path doesn't work for you (it won't on any JDK 1.1
|
||||
implementations, for example), then try setting the system PATH or the
|
||||
LD_LIBRARY_PATH before starting your web server. For Apache on Linux
|
||||
systems, this can be accomplished by editing the Root's .bashrc and
|
||||
adding the necessary export LD_LIBRARY_PATH statement.
|
||||
|
||||
If that doesn't work, try dividing an (hopefully) conquering by temporarily
|
||||
eliminating items such as Apache from the process by adjusting the
|
||||
arguments passed to the ./configure command (i.e., removing --with-apxs).
|
||||
|
||||
If all else fails, "man dlopen" on Unix systems will give more insight on
|
||||
what the system is trying to do internally.
|
||||
|
||||
There have been some issues where users need to create a symbolic link
|
||||
from java.so to libphp_java.so. If you notice a large number of unexplained
|
||||
crashes in your webserver log file, try doing this.
|
@ -1,184 +0,0 @@
|
||||
dnl
|
||||
dnl $Id$
|
||||
dnl
|
||||
AC_DEFUN(JAVA_FIND_JAR, [
|
||||
AC_MSG_CHECKING([Java Jar location])
|
||||
if test "$PHP_JAVA" = "yes"; then
|
||||
if JAVA_JAR=`which jar 2>/dev/null`; then
|
||||
JAVA_JAR="$JAVA_JAR cf"
|
||||
else
|
||||
JAVA_JAR=
|
||||
fi
|
||||
PHP_JAVA=`cd \`dirname \\\`which javac\\\`\`/..;pwd`
|
||||
|
||||
dnl
|
||||
dnl substitue zip for systems which don't have jar
|
||||
dnl
|
||||
if test -z "$JAVA_JAR"; then
|
||||
JAVA_JAR='zip -q0'
|
||||
fi
|
||||
else
|
||||
dnl
|
||||
dnl we have a custom path defined so use it
|
||||
dnl
|
||||
if test -x $PHP_JAVA/bin/jar; then
|
||||
JAVA_JAR="$PHP_JAVA/bin/jar cf"
|
||||
else
|
||||
AC_MSG_ERROR([Unable to locate $PHP_JAVA/bin])
|
||||
fi
|
||||
fi
|
||||
PHP_SUBST(JAVA_JAR)
|
||||
AC_MSG_RESULT([$JAVA_JAR])
|
||||
])
|
||||
|
||||
AC_DEFUN(JAVA_FIND_C, [
|
||||
AC_MSG_CHECKING([Java C location])
|
||||
if test "$PHP_JAVA" = "yes"; then
|
||||
JAVA_C=`which javac`
|
||||
else
|
||||
dnl
|
||||
dnl We've been given a path to use, so use it
|
||||
dnl
|
||||
if test -x $PHP_JAVA/bin/javac; then
|
||||
JAVA_C=$PHP_JAVA/bin/javac
|
||||
else
|
||||
AC_MSG_ERROR([Unable to locate $PHP_JAVA/bin])
|
||||
fi
|
||||
fi
|
||||
if test -z "$JAVA_C"; then
|
||||
AC_MSG_ERROR([Unable to locate the javac binary in your system path
|
||||
Either adjust your Java installation or provide the Java installation path,
|
||||
e.g. --with-java=/java expecting /java/bin/ to contain the binaries])
|
||||
fi
|
||||
|
||||
PHP_SUBST(JAVA_C)
|
||||
AC_MSG_RESULT([$JAVA_C])
|
||||
])
|
||||
|
||||
AC_DEFUN(JAVA_CHECK_LIB, [
|
||||
AC_MSG_CHECKING([Checking for libjava])
|
||||
if test -d $PHP_JAVA/lib/kaffe; then
|
||||
PHP_ADD_LIBPATH($PHP_JAVA/lib)
|
||||
JAVA_CFLAGS=-DKAFFE
|
||||
JAVA_INCLUDE=-I$PHP_JAVA/include/kaffe
|
||||
JAVA_CLASSPATH=$PHP_JAVA/share/kaffe/Klasses.jar
|
||||
JAVA_LIB=kaffevm
|
||||
JAVA_LIBPATH=$PHP_JAVA/lib/kaffe
|
||||
java_libext=kaffevm
|
||||
|
||||
test -f $PHP_JAVA/lib/$JAVA_LIB && JAVA_LIBPATH=$PHP_JAVA/lib
|
||||
test -f $PHP_JAVA/lib/kaffe/$JAVA_LIB && JAVA_LIBPATH=$PHP_JAVA/lib/kaffe
|
||||
|
||||
dnl
|
||||
dnl accomodate old versions of kaffe which don't support jar
|
||||
dnl
|
||||
if kaffe -version 2>&1 | grep 1.0b > /dev/null; then
|
||||
JAVA_JAR='zip -q0'
|
||||
fi
|
||||
elif test -f $PHP_JAVA/lib/$java_libext; then
|
||||
JAVA_LIB=java
|
||||
JAVA_LIBPATH=$PHP_JAVA/lib
|
||||
JAVA_INCLUDE=-I$PHP_JAVA/include
|
||||
|
||||
test -f $PHP_JAVA/lib/classes.zip && JAVA_CFLAGS=-DJNI_11
|
||||
test -f $PHP_JAVA/lib/jvm.jar && JAVA_CFLAGS=-DJNI_12
|
||||
test -f $PHP_JAVA/lib/classes.zip && JAVA_CLASSPATH=$PHP_JAVA/lib/classes.zip
|
||||
test -f $PHP_JAVA/lib/jvm.jar && JAVA_CLASSPATH=$PHP_JAVA/lib/jvm.jar
|
||||
|
||||
for i in $PHP_JAVA/include/*; do
|
||||
test -f $i/jni_md.h && JAVA_INCLUDE="$JAVA_INCLUDE $i"
|
||||
done
|
||||
dnl
|
||||
dnl sample JDK v 1.4 path
|
||||
dnl /usr/java/j2sdk1.4.0_01/jre/lib/i386/libjava.so
|
||||
dnl
|
||||
else
|
||||
dnl
|
||||
dnl We have to find everything
|
||||
dnl
|
||||
for i in `find $PHP_JAVA/include -type d`; do
|
||||
test -f $i/jni.h && JAVA_INCLUDE=-I$i
|
||||
test -f $i/jni_md.h && JAVA_INCLUDE="$JAVA_INCLUDE -I$i"
|
||||
done
|
||||
|
||||
for i in `find $PHP_JAVA/ -type d`; do
|
||||
test -f $i/classes.zip && JAVA_CFLAGS=-DJNI_11
|
||||
test -f $i/rt.jar && JAVA_CFLAGS=-DJNI_12
|
||||
test -f $i/classes.zip && JAVA_CLASSPATH=$i/classes.zip
|
||||
test -f $i/rt.jar && JAVA_CLASSPATH=$i/rt.jar
|
||||
|
||||
if test -f $i/$java_libext; then
|
||||
JAVA_LIB=java
|
||||
JAVA_LIBPATH=$i
|
||||
|
||||
test -d $i/hotspot && PHP_ADD_LIBPATH($i/hotspot)
|
||||
test -d $i/classic && PHP_ADD_LIBPATH($i/classic)
|
||||
test -d $i/server && PHP_ADD_LIBPATH($i/server)
|
||||
test -d $i/native_threads && PHP_ADD_LIBPATH($i/native_threads)
|
||||
fi
|
||||
done
|
||||
|
||||
if test -z "$JAVA_INCLUDE"; then
|
||||
AC_MSG_RESULT(no)
|
||||
AC_MSG_ERROR(unable to find Java VM includes)
|
||||
fi
|
||||
|
||||
JAVA_CFLAGS="$JAVA_CFLAGS -D_REENTRANT"
|
||||
fi
|
||||
|
||||
AC_MSG_RESULT([$JAVA_LIBPATH])
|
||||
])
|
||||
|
||||
|
||||
PHP_ARG_WITH(java, for Java support,
|
||||
[ --with-java[=DIR] Include Java support. DIR is the JDK base install directory.
|
||||
This extension is always built as shared.])
|
||||
|
||||
if test "$PHP_JAVA" != "no"; then
|
||||
platform=`uname -s 2>/dev/null`
|
||||
java_libext=libjava.so
|
||||
case $platform in
|
||||
AIX) java_libext=libjava.a ;;
|
||||
HP-UX) java_libext=libjava.sl ;;
|
||||
Darwin) java_libext=libjava.jnilib ;;
|
||||
esac
|
||||
JAVA_FIND_JAR()
|
||||
JAVA_FIND_C()
|
||||
|
||||
if test "$platform" = "Darwin"; then
|
||||
AC_CHECK_HEADERS([JavaVM/JavaVM.h])
|
||||
AC_CHECK_HEADERS([JavaVM/jni.h])
|
||||
dnl JAVA_CLASSPATH=/System/Library/Frameworks/JavaVM.framework/Classes/classes.jar
|
||||
PHP_CHECK_FRAMEWORK("JavaVM", JNI_CreateJavaVM,[AC_DEFINE(HAVE_JAVA,1,[ ])])
|
||||
PHP_ADD_FRAMEWORK("JavaVM")
|
||||
JAVA_CFLAGS="-x objective-c"
|
||||
else
|
||||
JAVA_CHECK_LIB()
|
||||
AC_DEFINE(HAVE_JAVA,1,[ ])
|
||||
|
||||
if test -z "$JAVA_LIBPATH"; then
|
||||
AC_MSG_ERROR([unable to find Java VM libraries in $PHP_JAVA])
|
||||
fi
|
||||
|
||||
PHP_ADD_LIBPATH($JAVA_LIBPATH)
|
||||
JAVA_CFLAGS="$JAVA_CFLAGS '-DJAVALIB=\"$JAVA_LIBPATH/$java_libext\"'"
|
||||
fi
|
||||
|
||||
if test "$PHP_SAPI" != "servlet"; then
|
||||
PHP_NEW_EXTENSION(java, java.c, shared,, $JAVA_CFLAGS $JAVA_INCLUDE)
|
||||
|
||||
if test "$PHP_SAPI" = "cgi"; then
|
||||
if test "$platform" != "Darwin"; then
|
||||
PHP_ADD_LIBRARY($JAVA_LIB)
|
||||
fi
|
||||
fi
|
||||
|
||||
INSTALL_IT="$INSTALL_IT; \$(srcdir)/build/shtool mkdir -p -f -m 0755 \$(INSTALL_ROOT)\$(libdir)"
|
||||
INSTALL_IT="$INSTALL_IT; \$(INSTALL) -m 0755 \$(srcdir)/ext/java/php_java.jar \$(INSTALL_ROOT)\$(libdir)"
|
||||
fi
|
||||
|
||||
PHP_SUBST(JAVA_CLASSPATH)
|
||||
|
||||
PHP_ADD_MAKEFILE_FRAGMENT
|
||||
fi
|
||||
|
@ -1,23 +0,0 @@
|
||||
<?
|
||||
$stack=new Java("java.util.Stack");
|
||||
$stack->push(1);
|
||||
|
||||
#
|
||||
# Should succeed and print out "1"
|
||||
#
|
||||
$result = $stack->pop();
|
||||
$ex = java_last_exception_get();
|
||||
if (!$ex) print "$result\n";
|
||||
|
||||
#
|
||||
# Should fail - note the "@" eliminates the warning
|
||||
#
|
||||
$result=@$stack->pop();
|
||||
$ex=java_last_exception_get();
|
||||
if ($ex) print $ex->toString();
|
||||
|
||||
#
|
||||
# Reset last exception
|
||||
#
|
||||
java_last_exception_clear();
|
||||
?>
|
864
ext/java/java.c
864
ext/java/java.c
@ -1,864 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 4 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2003 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.02 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available at through the world-wide-web at |
|
||||
| http://www.php.net/license/2_02.txt. |
|
||||
| If you did not receive a copy of the PHP license and are unable to |
|
||||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Author: Sam Ruby (rubys@us.ibm.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* This module implements Zend OO syntax overloading support for Java
|
||||
* components using JNI and reflection.
|
||||
*/
|
||||
|
||||
#include "php.h"
|
||||
#include "zend_compile.h"
|
||||
#include "php_ini.h"
|
||||
#include "php_globals.h"
|
||||
|
||||
#if HAVE_JAVAVM_JAVAVM_H
|
||||
#include <JavaVM/JavaVM.h>
|
||||
#include <JavaVM/jni.h>
|
||||
#define JNI_12
|
||||
#else
|
||||
#include <jni.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef PHP_WIN32
|
||||
#include "win32/winutil.h"
|
||||
#define DL_ERROR php_win_err
|
||||
#endif
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define IS_EXCEPTION 86
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
#ifndef KAFFE
|
||||
#ifndef JNI_11
|
||||
#ifndef JNI_12
|
||||
|
||||
#ifdef JNI_VERSION_1_2
|
||||
#define JNI_12
|
||||
#else
|
||||
#define JNI_11
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef PHP_WIN32
|
||||
#ifdef JNI_12
|
||||
#define JAVALIB "jvm.dll"
|
||||
#else
|
||||
#define JAVALIB "javai.dll"
|
||||
#endif
|
||||
#else
|
||||
#endif
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
static int le_jobject = 0;
|
||||
|
||||
static char *classpath = 0;
|
||||
static char *libpath = 0;
|
||||
static char *javahome = 0;
|
||||
static char *javalib = 0;
|
||||
|
||||
static void *dl_handle = 0;
|
||||
|
||||
/* {{{ ZEND_BEGIN_MODULE_GLOBALS
|
||||
*/
|
||||
ZEND_BEGIN_MODULE_GLOBALS(java)
|
||||
JavaVM *jvm;
|
||||
JNIEnv *jenv;
|
||||
jobject php_reflect;
|
||||
jclass reflect_class;
|
||||
ZEND_END_MODULE_GLOBALS(java)
|
||||
/* }}} */
|
||||
|
||||
#ifdef ZTS
|
||||
# define JG(v) TSRMG(java_globals_id, zend_java_globals *, v)
|
||||
#else
|
||||
# define JG(v) (java_globals.v)
|
||||
#endif
|
||||
|
||||
ZEND_DECLARE_MODULE_GLOBALS(java)
|
||||
|
||||
static zend_class_entry java_class_entry;
|
||||
|
||||
static PHP_INI_MH(OnIniUpdate)
|
||||
{
|
||||
if (new_value) *(char**)mh_arg1 = new_value;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/* {{{ PHP_INI_BEGIN
|
||||
*/
|
||||
PHP_INI_BEGIN()
|
||||
PHP_INI_ENTRY1("java.class.path", NULL, PHP_INI_SYSTEM, OnIniUpdate, &classpath)
|
||||
#ifndef JNI_11
|
||||
PHP_INI_ENTRY1("java.home", NULL, PHP_INI_SYSTEM, OnIniUpdate, &javahome)
|
||||
PHP_INI_ENTRY1("java.library.path", NULL, PHP_INI_SYSTEM,OnIniUpdate, &libpath)
|
||||
#endif
|
||||
#ifdef JAVALIB
|
||||
PHP_INI_ENTRY1("java.library", JAVALIB, PHP_INI_SYSTEM, OnIniUpdate, &javalib)
|
||||
#else
|
||||
PHP_INI_ENTRY1("java.library", NULL, PHP_INI_SYSTEM, OnIniUpdate, &javalib)
|
||||
#endif
|
||||
PHP_INI_END()
|
||||
/* }}} */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* {{{ jvm_destroy
|
||||
*/
|
||||
/*
|
||||
* Destroy a Java Virtual Machine.
|
||||
*/
|
||||
void jvm_destroy(TSRMLS_D)
|
||||
{
|
||||
if (JG(php_reflect)) (*JG(jenv))->DeleteGlobalRef(JG(jenv), JG(php_reflect));
|
||||
JG(php_reflect) = 0;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ addJVMOption
|
||||
*/
|
||||
/*
|
||||
* Create a Java Virtual Machine.
|
||||
* - class.path, home, and library.path are read out of the INI file
|
||||
* - appropriate (pre 1.1, JDK 1.1, and JDK 1.2) initialization is performed
|
||||
* - net.php.reflect class file is located
|
||||
*/
|
||||
|
||||
#ifdef JNI_12
|
||||
static void addJVMOption(JavaVMInitArgs *vm_args, char *name, char *value)
|
||||
{
|
||||
char *option = (char*) malloc(strlen(name) + strlen(value) + 1);
|
||||
strcpy(option, name);
|
||||
strcat(option, value);
|
||||
vm_args->options[vm_args->nOptions++].optionString = option;
|
||||
}
|
||||
#endif
|
||||
/* }}} */
|
||||
|
||||
/* {{{ jvm_create
|
||||
*/
|
||||
static int jvm_create(TSRMLS_D)
|
||||
{
|
||||
int rc;
|
||||
jobject local_php_reflect;
|
||||
jthrowable error;
|
||||
|
||||
jint (JNICALL *JNI_CreateVM)(const void*, const void*, void*);
|
||||
#ifndef JNI_12
|
||||
jint (JNICALL *JNI_DefaultArgs)(void*);
|
||||
#endif
|
||||
|
||||
#ifdef JNI_11
|
||||
JDK1_1InitArgs vm_args;
|
||||
#else
|
||||
JavaVMInitArgs vm_args;
|
||||
#ifdef JNI_12
|
||||
JavaVMOption options[3];
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
if (javalib) {
|
||||
dl_handle = DL_LOAD(javalib);
|
||||
|
||||
if (!dl_handle) {
|
||||
php_error(E_ERROR, "Unable to load Java Library %s, error: %s",
|
||||
javalib, DL_ERROR());
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef JAVALIB
|
||||
if (!dl_handle)
|
||||
JNI_CreateVM = &JNI_CreateJavaVM;
|
||||
else
|
||||
#endif
|
||||
|
||||
JNI_CreateVM = (jint (JNICALL *)(const void*, const void*, void*))
|
||||
DL_FETCH_SYMBOL(dl_handle, "JNI_CreateJavaVM");
|
||||
|
||||
if (!JNI_CreateVM) {
|
||||
php_error(E_ERROR, "Unable to locate CreateJavaVM function");
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef JNI_12
|
||||
|
||||
vm_args.version = JNI_VERSION_1_2;
|
||||
vm_args.ignoreUnrecognized = JNI_FALSE;
|
||||
vm_args.options = options;
|
||||
vm_args.nOptions = 0;
|
||||
|
||||
if (classpath) addJVMOption(&vm_args, "-Djava.class.path=", classpath);
|
||||
if (javahome) addJVMOption(&vm_args, "-Djava.home=", javahome);
|
||||
if (libpath) addJVMOption(&vm_args, "-Djava.library.path=", libpath);
|
||||
|
||||
#else
|
||||
|
||||
#ifndef JAVALIB
|
||||
if (!dl_handle)
|
||||
JNI_DefaultArgs = &JNI_GetDefaultJavaVMInitArgs;
|
||||
else
|
||||
#endif
|
||||
|
||||
JNI_DefaultArgs = (jint (JNICALL *)(void*))
|
||||
DL_FETCH_SYMBOL(dl_handle, "JNI_GetDefaultJavaVMInitArgs");
|
||||
|
||||
if (!JNI_DefaultArgs) {
|
||||
php_error(E_ERROR, "Unable to locate GetDefaultJavaVMInitArgs function");
|
||||
return -1;
|
||||
}
|
||||
|
||||
vm_args.version=0x00010001;
|
||||
(*JNI_DefaultArgs)(&vm_args);
|
||||
|
||||
if (!classpath) classpath = "";
|
||||
vm_args.classpath = classpath;
|
||||
#ifdef KAFFE
|
||||
vm_args.classhome = javahome;
|
||||
vm_args.libraryhome = libpath;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
rc = (*JNI_CreateVM)(&JG(jvm), &JG(jenv), &vm_args);
|
||||
|
||||
if (rc) {
|
||||
php_error(E_ERROR, "Unable to create Java Virtual Machine");
|
||||
return rc;
|
||||
}
|
||||
|
||||
JG(reflect_class) = (*JG(jenv))->FindClass(JG(jenv), "net/php/reflect");
|
||||
error = (*JG(jenv))->ExceptionOccurred(JG(jenv));
|
||||
if (error) {
|
||||
jclass errClass;
|
||||
jmethodID toString;
|
||||
jobject errString;
|
||||
const char *errAsUTF;
|
||||
jboolean isCopy;
|
||||
JNIEnv *jenv = JG(jenv);
|
||||
(*jenv)->ExceptionClear(jenv);
|
||||
errClass = (*jenv)->GetObjectClass(jenv, error);
|
||||
toString = (*jenv)->GetMethodID(jenv, errClass, "toString",
|
||||
"()Ljava/lang/String;");
|
||||
errString = (*jenv)->CallObjectMethod(jenv, error, toString);
|
||||
errAsUTF = (*jenv)->GetStringUTFChars(jenv, errString, &isCopy);
|
||||
php_error(E_ERROR, "%s", errAsUTF);
|
||||
if (isCopy) (*jenv)->ReleaseStringUTFChars(jenv, error, errAsUTF);
|
||||
jvm_destroy(TSRMLS_C);
|
||||
return -1;
|
||||
}
|
||||
|
||||
local_php_reflect = (*JG(jenv))->AllocObject(JG(jenv), JG(reflect_class));
|
||||
JG(php_reflect) = (*JG(jenv))->NewGlobalRef(JG(jenv), local_php_reflect);
|
||||
return rc;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* {{{ _java_makeObject
|
||||
*/
|
||||
static jobject _java_makeObject(pval* arg TSRMLS_DC)
|
||||
{
|
||||
JNIEnv *jenv = JG(jenv);
|
||||
jobject result;
|
||||
pval **handle;
|
||||
int type;
|
||||
jmethodID makeArg;
|
||||
jclass hashClass;
|
||||
|
||||
switch (Z_TYPE_P(arg)) {
|
||||
case IS_STRING:
|
||||
result=(*jenv)->NewByteArray(jenv, Z_STRLEN_P(arg));
|
||||
(*jenv)->SetByteArrayRegion(jenv, (jbyteArray)result, 0,
|
||||
Z_STRLEN_P(arg), Z_STRVAL_P(arg));
|
||||
break;
|
||||
|
||||
case IS_OBJECT:
|
||||
zend_hash_index_find(Z_OBJPROP_P(arg), 0, (void*)&handle);
|
||||
result = zend_list_find(Z_LVAL_PP(handle), &type);
|
||||
break;
|
||||
|
||||
case IS_BOOL:
|
||||
makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
|
||||
"(Z)Ljava/lang/Object;");
|
||||
result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
|
||||
(jboolean)(Z_LVAL_P(arg)));
|
||||
break;
|
||||
|
||||
case IS_LONG:
|
||||
makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
|
||||
"(J)Ljava/lang/Object;");
|
||||
result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
|
||||
(jlong)(Z_LVAL_P(arg)));
|
||||
break;
|
||||
|
||||
case IS_DOUBLE:
|
||||
makeArg = (*jenv)->GetMethodID(jenv, JG(reflect_class), "MakeArg",
|
||||
"(D)Ljava/lang/Object;");
|
||||
result = (*jenv)->CallObjectMethod(jenv, JG(php_reflect), makeArg,
|
||||
(jdouble)(Z_DVAL_P(arg)));
|
||||
break;
|
||||
|
||||
case IS_ARRAY:
|
||||
{
|
||||
jobject jkey, jval;
|
||||
zval **value;
|
||||
zval key;
|
||||
char *string_key;
|
||||
ulong num_key;
|
||||
jobject jold;
|
||||
jmethodID put, init;
|
||||
|
||||
hashClass = (*jenv)->FindClass(jenv, "java/util/Hashtable");
|
||||
init = (*jenv)->GetMethodID(jenv, hashClass, "<init>", "()V");
|
||||
result = (*jenv)->NewObject(jenv, hashClass, init);
|
||||
|
||||
put = (*jenv)->GetMethodID(jenv, hashClass, "put",
|
||||
"(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
|
||||
|
||||
/* Iterate through hash */
|
||||
zend_hash_internal_pointer_reset(Z_ARRVAL_P(arg));
|
||||
while(zend_hash_get_current_data(Z_ARRVAL_P(arg), (void**)&value) == SUCCESS) {
|
||||
jval = _java_makeObject(*value TSRMLS_CC);
|
||||
|
||||
switch (zend_hash_get_current_key(Z_ARRVAL_P(arg), &string_key, &num_key, 0)) {
|
||||
case HASH_KEY_IS_STRING:
|
||||
Z_TYPE(key) = IS_STRING;
|
||||
Z_STRVAL(key) = string_key;
|
||||
Z_STRLEN(key) = strlen(string_key);
|
||||
jkey = _java_makeObject(&key TSRMLS_CC);
|
||||
break;
|
||||
case HASH_KEY_IS_LONG:
|
||||
Z_TYPE(key) = IS_LONG;
|
||||
Z_LVAL(key) = num_key;
|
||||
jkey = _java_makeObject(&key TSRMLS_CC);
|
||||
break;
|
||||
default: /* HASH_KEY_NON_EXISTANT */
|
||||
jkey = 0;
|
||||
}
|
||||
jold = (*jenv)->CallObjectMethod(jenv, result, put, jkey, jval);
|
||||
if (Z_TYPE_PP(value) != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, jval);
|
||||
zend_hash_move_forward(Z_ARRVAL_P(arg));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
result=0;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* {{{ _java_makeArray
|
||||
*/
|
||||
static jobjectArray _java_makeArray(int argc, pval** argv TSRMLS_DC)
|
||||
{
|
||||
JNIEnv *jenv = JG(jenv);
|
||||
|
||||
jclass objectClass = (*jenv)->FindClass(jenv, "java/lang/Object");
|
||||
jobjectArray result = (*jenv)->NewObjectArray(jenv, argc, objectClass, 0);
|
||||
jobject arg;
|
||||
int i;
|
||||
|
||||
for (i=0; i<argc; i++) {
|
||||
arg = _java_makeObject(argv[i] TSRMLS_CC);
|
||||
(*jenv)->SetObjectArrayElement(jenv, result, i, arg);
|
||||
if (Z_TYPE_P(argv[i]) != IS_OBJECT) (*jenv)->DeleteLocalRef(jenv, arg);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ checkError
|
||||
*/
|
||||
static int checkError(pval *value)
|
||||
{
|
||||
if (Z_TYPE_P(value) == IS_EXCEPTION) {
|
||||
php_error(E_WARNING, "%s", Z_STRVAL_P(value));
|
||||
efree(Z_STRVAL_P(value));
|
||||
ZVAL_FALSE(value);
|
||||
return 1;
|
||||
};
|
||||
return 0;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* {{{ java_call_function_handler
|
||||
*/
|
||||
/*
|
||||
* Invoke a method on an object. If method name is "java", create a new
|
||||
* object instead.
|
||||
*/
|
||||
void java_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference)
|
||||
{
|
||||
JNIEnv *jenv;
|
||||
|
||||
pval *object = property_reference->object;
|
||||
zend_overloaded_element *function_name = (zend_overloaded_element *)
|
||||
property_reference->elements_list->tail->data;
|
||||
|
||||
int arg_count = ZEND_NUM_ARGS();
|
||||
jlong result = 0;
|
||||
pval **arguments = (pval **) emalloc(sizeof(pval *)*arg_count);
|
||||
|
||||
getParametersArray(ht, arg_count, arguments);
|
||||
|
||||
if (!JG(jenv)) jvm_create(TSRMLS_C);
|
||||
if (!JG(jenv)) return;
|
||||
jenv = JG(jenv);
|
||||
|
||||
if (!strcmp("java", Z_STRVAL(function_name->element))) {
|
||||
|
||||
/* construct a Java object:
|
||||
First argument is the class name. Any additional arguments will
|
||||
be treated as constructor parameters. */
|
||||
|
||||
jmethodID co = (*jenv)->GetMethodID(jenv, JG(reflect_class), "CreateObject",
|
||||
"(Ljava/lang/String;[Ljava/lang/Object;J)V");
|
||||
jstring className;
|
||||
result = (jlong)(long)object;
|
||||
|
||||
if (ZEND_NUM_ARGS() < 1) {
|
||||
php_error(E_ERROR, "Missing classname in new Java() call");
|
||||
return;
|
||||
}
|
||||
|
||||
className=(*jenv)->NewStringUTF(jenv, Z_STRVAL_P(arguments[0]));
|
||||
(*jenv)->CallVoidMethod(jenv, JG(php_reflect), co,
|
||||
className, _java_makeArray(arg_count-1, arguments+1 TSRMLS_CC), result);
|
||||
|
||||
(*jenv)->DeleteLocalRef(jenv, className);
|
||||
|
||||
} else {
|
||||
|
||||
pval **handle;
|
||||
int type;
|
||||
jobject obj;
|
||||
jstring method;
|
||||
|
||||
/* invoke a method on the given object */
|
||||
|
||||
jmethodID invoke = (*jenv)->GetMethodID(jenv, JG(reflect_class), "Invoke",
|
||||
"(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;J)V");
|
||||
zend_hash_index_find(Z_OBJPROP_P(object), 0, (void**) &handle);
|
||||
obj = zend_list_find(Z_LVAL_PP(handle), &type);
|
||||
method = (*jenv)->NewStringUTF(jenv, Z_STRVAL(function_name->element));
|
||||
result = (jlong)(long)return_value;
|
||||
|
||||
(*jenv)->CallVoidMethod(jenv, JG(php_reflect), invoke,
|
||||
obj, method, _java_makeArray(arg_count, arguments TSRMLS_CC), result);
|
||||
|
||||
(*jenv)->DeleteLocalRef(jenv, method);
|
||||
|
||||
}
|
||||
|
||||
efree(arguments);
|
||||
pval_destructor(&function_name->element);
|
||||
|
||||
checkError((pval*)(long)result);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* {{{ proto object java_last_exception_get(void)
|
||||
Get last Java exception */
|
||||
PHP_FUNCTION(java_last_exception_get)
|
||||
{
|
||||
jlong result = 0;
|
||||
jmethodID lastEx;
|
||||
|
||||
if (ZEND_NUM_ARGS()!=0) WRONG_PARAM_COUNT;
|
||||
|
||||
result = (jlong)(long)return_value;
|
||||
|
||||
lastEx = (*JG(jenv))->GetMethodID(JG(jenv), JG(reflect_class),
|
||||
"lastException", "(J)V");
|
||||
|
||||
(*JG(jenv))->CallVoidMethod(JG(jenv), JG(php_reflect), lastEx, result);
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* {{{ proto void java_last_exception_clear(void)
|
||||
Clear last java extension */
|
||||
PHP_FUNCTION(java_last_exception_clear)
|
||||
{
|
||||
jlong result = 0;
|
||||
jmethodID clearEx;
|
||||
|
||||
if (ZEND_NUM_ARGS()!=0) WRONG_PARAM_COUNT;
|
||||
|
||||
result = (jlong)(long)return_value;
|
||||
|
||||
clearEx = (*JG(jenv))->GetMethodID(JG(jenv), JG(reflect_class),
|
||||
"clearException", "()V");
|
||||
|
||||
(*JG(jenv))->CallVoidMethod(JG(jenv), JG(php_reflect), clearEx);
|
||||
}
|
||||
|
||||
/* }}} */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* {{{ _java_getset_property
|
||||
*/
|
||||
static pval _java_getset_property
|
||||
(zend_property_reference *property_reference, jobjectArray value TSRMLS_DC)
|
||||
{
|
||||
pval presult;
|
||||
jlong result = 0;
|
||||
pval **pobject;
|
||||
jobject obj;
|
||||
int type;
|
||||
|
||||
/* get the property name */
|
||||
zend_llist_element *element = property_reference->elements_list->head;
|
||||
zend_overloaded_element *property=(zend_overloaded_element *)element->data;
|
||||
jstring propName;
|
||||
|
||||
JNIEnv *jenv;
|
||||
jenv = JG(jenv);
|
||||
|
||||
propName = (*jenv)->NewStringUTF(jenv, Z_STRVAL(property->element));
|
||||
|
||||
/* get the object */
|
||||
zend_hash_index_find(Z_OBJPROP_P(property_reference->object),
|
||||
0, (void **) &pobject);
|
||||
obj = zend_list_find(Z_LVAL_PP(pobject), &type);
|
||||
result = (jlong)(long) &presult;
|
||||
Z_TYPE(presult) = IS_NULL;
|
||||
|
||||
if (!obj || (type!=le_jobject)) {
|
||||
php_error(E_ERROR,
|
||||
"Attempt to access a Java property on a non-Java object");
|
||||
} else {
|
||||
/* invoke the method */
|
||||
jmethodID gsp = (*jenv)->GetMethodID(jenv, JG(reflect_class), "GetSetProp",
|
||||
"(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;J)V");
|
||||
(*jenv)->CallVoidMethod
|
||||
(jenv, JG(php_reflect), gsp, obj, propName, value, result);
|
||||
}
|
||||
|
||||
(*jenv)->DeleteLocalRef(jenv, propName);
|
||||
pval_destructor(&property->element);
|
||||
return presult;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ java_get_property_handler
|
||||
*/
|
||||
pval java_get_property_handler(zend_property_reference *property_reference)
|
||||
{
|
||||
pval presult;
|
||||
TSRMLS_FETCH();
|
||||
|
||||
presult = _java_getset_property(property_reference, 0 TSRMLS_CC);
|
||||
checkError(&presult);
|
||||
return presult;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ java_set_property_handler
|
||||
*/
|
||||
int java_set_property_handler(zend_property_reference *property_reference, pval *value)
|
||||
{
|
||||
pval presult;
|
||||
TSRMLS_FETCH();
|
||||
|
||||
presult = _java_getset_property(property_reference, _java_makeArray(1, &value TSRMLS_CC) TSRMLS_CC);
|
||||
return checkError(&presult) ? FAILURE : SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* {{{ _php_java_destructor
|
||||
*/
|
||||
static void _php_java_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
|
||||
{
|
||||
void *jobject = (void *)rsrc->ptr;
|
||||
|
||||
if (JG(jenv)) (*JG(jenv))->DeleteGlobalRef(JG(jenv), jobject);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ alloc_java_globals_ctor
|
||||
*/
|
||||
static void alloc_java_globals_ctor(zend_java_globals *java_globals TSRMLS_DC)
|
||||
{
|
||||
memset(java_globals, 0, sizeof(zend_java_globals));
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MINIT_FUNCTION
|
||||
*/
|
||||
PHP_MINIT_FUNCTION(java)
|
||||
{
|
||||
INIT_OVERLOADED_CLASS_ENTRY(java_class_entry, "java", NULL,
|
||||
java_call_function_handler,
|
||||
java_get_property_handler,
|
||||
java_set_property_handler);
|
||||
|
||||
zend_register_internal_class(&java_class_entry TSRMLS_CC);
|
||||
|
||||
le_jobject = zend_register_list_destructors_ex(_php_java_destructor, NULL, "java", module_number);
|
||||
|
||||
REGISTER_INI_ENTRIES();
|
||||
|
||||
if (!classpath) classpath = getenv("CLASSPATH");
|
||||
|
||||
if (!libpath) {
|
||||
libpath=PG(extension_dir);
|
||||
}
|
||||
|
||||
ZEND_INIT_MODULE_GLOBALS(java, alloc_java_globals_ctor, NULL);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ PHP_MSHUTDOWN_FUNCTION
|
||||
*/
|
||||
PHP_MSHUTDOWN_FUNCTION(java)
|
||||
{
|
||||
UNREGISTER_INI_ENTRIES();
|
||||
if (JG(jvm)) jvm_destroy(TSRMLS_C);
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
function_entry java_functions[] = {
|
||||
PHP_FE(java_last_exception_get, NULL)
|
||||
PHP_FE(java_last_exception_clear, NULL)
|
||||
{NULL, NULL, NULL}
|
||||
};
|
||||
|
||||
|
||||
static PHP_MINFO_FUNCTION(java) {
|
||||
DISPLAY_INI_ENTRIES();
|
||||
}
|
||||
|
||||
zend_module_entry java_module_entry = {
|
||||
STANDARD_MODULE_HEADER,
|
||||
"java",
|
||||
java_functions,
|
||||
PHP_MINIT(java),
|
||||
PHP_MSHUTDOWN(java),
|
||||
NULL,
|
||||
NULL,
|
||||
PHP_MINFO(java),
|
||||
NO_VERSION_YET,
|
||||
STANDARD_MODULE_PROPERTIES
|
||||
};
|
||||
|
||||
ZEND_GET_MODULE(java)
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
/* {{{ Java_net_php_reflect_setResultFromString
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromString
|
||||
(JNIEnv *jenv, jclass self, jlong result, jbyteArray jvalue)
|
||||
{
|
||||
jboolean isCopy;
|
||||
jbyte *value = (*jenv)->GetByteArrayElements(jenv, jvalue, &isCopy);
|
||||
pval *presult = (pval*)(long)result;
|
||||
Z_TYPE_P(presult)=IS_STRING;
|
||||
Z_STRLEN_P(presult)=(*jenv)->GetArrayLength(jenv, jvalue);
|
||||
Z_STRVAL_P(presult)=emalloc(Z_STRLEN_P(presult)+1);
|
||||
memcpy(Z_STRVAL_P(presult), value, Z_STRLEN_P(presult));
|
||||
Z_STRVAL_P(presult)[Z_STRLEN_P(presult)]=0;
|
||||
if (isCopy) (*jenv)->ReleaseByteArrayElements(jenv, jvalue, value, 0);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Java_net_php_reflect_setResultFromLong
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromLong
|
||||
(JNIEnv *jenv, jclass self, jlong result, jlong value)
|
||||
{
|
||||
pval *presult = (pval*)(long)result;
|
||||
Z_TYPE_P(presult)=IS_LONG;
|
||||
Z_LVAL_P(presult)=(long)value;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Java_net_php_reflect_setResultFromDouble
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromDouble
|
||||
(JNIEnv *jenv, jclass self, jlong result, jdouble value)
|
||||
{
|
||||
pval *presult = (pval*)(long)result;
|
||||
Z_TYPE_P(presult)=IS_DOUBLE;
|
||||
Z_DVAL_P(presult)=value;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Java_net_php_reflect_setResultFromBoolean
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromBoolean
|
||||
(JNIEnv *jenv, jclass self, jlong result, jboolean value)
|
||||
{
|
||||
pval *presult = (pval*)(long)result;
|
||||
Z_TYPE_P(presult)=IS_BOOL;
|
||||
Z_LVAL_P(presult)=value;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Java_net_php_reflect_setResultFromObject
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromObject
|
||||
(JNIEnv *jenv, jclass self, jlong result, jobject value)
|
||||
{
|
||||
/* wrapper the java object in a pval object */
|
||||
pval *presult = (pval*)(long)result;
|
||||
pval *handle;
|
||||
TSRMLS_FETCH();
|
||||
|
||||
if (Z_TYPE_P(presult) != IS_OBJECT) {
|
||||
object_init_ex(presult, &java_class_entry);
|
||||
presult->is_ref=1;
|
||||
presult->refcount=1;
|
||||
}
|
||||
|
||||
ALLOC_ZVAL(handle);
|
||||
Z_TYPE_P(handle) = IS_LONG;
|
||||
Z_LVAL_P(handle) =
|
||||
zend_list_insert((*jenv)->NewGlobalRef(jenv, value), le_jobject);
|
||||
pval_copy_constructor(handle);
|
||||
INIT_PZVAL(handle);
|
||||
zend_hash_index_update(Z_OBJPROP_P(presult), 0, &handle, sizeof(pval *), NULL);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Java_net_php_reflect_setResultFromArray
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_php_reflect_setResultFromArray
|
||||
(JNIEnv *jenv, jclass self, jlong result)
|
||||
{
|
||||
array_init( (pval*)(long)result );
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Java_net_php_reflect_nextElement
|
||||
*/
|
||||
JNIEXPORT jlong JNICALL Java_net_php_reflect_nextElement
|
||||
(JNIEnv *jenv, jclass self, jlong array)
|
||||
{
|
||||
pval *result;
|
||||
pval *handle = (pval*)(long)array;
|
||||
ALLOC_ZVAL(result);
|
||||
zend_hash_next_index_insert(Z_ARRVAL_P(handle), &result, sizeof(zval *), NULL);
|
||||
return (jlong)(long)result;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Java_net_php_reflect_hashIndexUpdate
|
||||
*/
|
||||
JNIEXPORT jlong JNICALL Java_net_php_reflect_hashIndexUpdate
|
||||
(JNIEnv *jenv, jclass self, jlong array, jlong key)
|
||||
{
|
||||
pval *result;
|
||||
pval *handle = (pval*)(long)array;
|
||||
ALLOC_ZVAL(result);
|
||||
zend_hash_index_update(Z_ARRVAL_P(handle), (unsigned long)key,
|
||||
&result, sizeof(zval *), NULL);
|
||||
return (jlong)(long)result;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Java_net_php_reflect_hashUpdate
|
||||
*/
|
||||
JNIEXPORT jlong JNICALL Java_net_php_reflect_hashUpdate
|
||||
(JNIEnv *jenv, jclass self, jlong array, jbyteArray key)
|
||||
{
|
||||
pval *result;
|
||||
pval pkey;
|
||||
pval *handle = (pval*)(long)array;
|
||||
ALLOC_ZVAL(result);
|
||||
Java_net_php_reflect_setResultFromString(jenv, self, (jlong)(long)&pkey, key);
|
||||
zend_hash_update(Z_ARRVAL_P(handle), Z_STRVAL(pkey), Z_STRLEN(pkey)+1,
|
||||
&result, sizeof(zval *), NULL);
|
||||
return (jlong)(long)result;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Java_net_php_reflect_setException
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_php_reflect_setException
|
||||
(JNIEnv *jenv, jclass self, jlong result, jbyteArray value)
|
||||
{
|
||||
pval *presult = (pval*)(long)result;
|
||||
Java_net_php_reflect_setResultFromString(jenv, self, result, value);
|
||||
Z_TYPE_P(presult)=IS_EXCEPTION;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ Java_net_php_reflect_setEnv
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_net_php_reflect_setEnv
|
||||
(JNIEnv *newJenv, jclass self TSRMLS_DC)
|
||||
{
|
||||
jobject local_php_reflect;
|
||||
|
||||
JG(jenv)=newJenv;
|
||||
|
||||
if (!self) self = (*JG(jenv))->FindClass(JG(jenv), "net/php/reflect");
|
||||
JG(reflect_class) = self;
|
||||
|
||||
if (JG(php_reflect)) (*JG(jenv))->DeleteGlobalRef(JG(jenv), JG(php_reflect));
|
||||
local_php_reflect = (*JG(jenv))->AllocObject(JG(jenv), JG(reflect_class));
|
||||
JG(php_reflect) = (*JG(jenv))->NewGlobalRef(JG(jenv), local_php_reflect);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* tab-width: 4
|
||||
* c-basic-offset: 4
|
||||
* End:
|
||||
* vim600: sw=4 ts=4 fdm=marker
|
||||
* vim<600: sw=4 ts=4
|
||||
*/
|
@ -1,254 +0,0 @@
|
||||
# Microsoft Developer Studio Project File - Name="java" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=java - Win32 Debug_TS
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "java.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "java.mak" CFG="java - Win32 Debug_TS"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "java - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "java - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "java - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "java - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "java - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "..\..\Release"
|
||||
# PROP BASE Intermediate_Dir "..\..\Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "..\..\Release"
|
||||
# PROP Intermediate_Dir "..\..\Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "NDEBUG" /D ZEND_DEBUG=0 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x40d /d "NDEBUG"
|
||||
# ADD RSC /l 0x40d /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\Release/php_java.dll" /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "java - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "..\..\Debug"
|
||||
# PROP BASE Intermediate_Dir "..\..\Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "..\..\Debug"
|
||||
# PROP Intermediate_Dir "..\..\Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "_DEBUG" /D ZEND_DEBUG=1 /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /FR /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x40d /d "_DEBUG"
|
||||
# ADD RSC /l 0x40d /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug/php_java.dll" /pdbtype:sept /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Debug"
|
||||
|
||||
!ELSEIF "$(CFG)" == "java - Win32 Debug_TS"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "..\..\Debug_TS"
|
||||
# PROP BASE Intermediate_Dir "..\..\Debug_TS"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "..\..\Debug_TS"
|
||||
# PROP Intermediate_Dir "..\..\Debug_TS"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "_DEBUG" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /FR /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\..\\" /I "..\..\main" /I "..\..\TSRM" /I "..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "_DEBUG" /D ZEND_DEBUG=1 /D "ZTS" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /FR /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x40d /d "_DEBUG"
|
||||
# ADD RSC /l 0x40d /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts_debug.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS/php_java.dll" /pdbtype:sept /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Debug_TS"
|
||||
|
||||
!ELSEIF "$(CFG)" == "java - Win32 Release_TS"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "..\..\Release_TS"
|
||||
# PROP BASE Intermediate_Dir "..\..\Release_TS"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "..\..\Release_TS"
|
||||
# PROP Intermediate_Dir "..\..\Release_TS"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "NDEBUG" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\\" /I "..\..\main" /I "..\..\TSRM" /I "..\..\Zend" /I "$(JAVA_HOME)\include\win32" /I "$(JAVA_HOME)\include" /I "..\..\..\bindlib_w32" /D "NDEBUG" /D ZEND_DEBUG=0 /D "ZTS" /D "PHP_WIN32" /D "ZEND_WIN32" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "COMPILE_DL_JAVA" /D HAVE_JAVA=1 /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x40d /d "NDEBUG"
|
||||
# ADD RSC /l 0x40d /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4ts.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_java.dll" /libpath:"$(JAVA_HOME)\lib" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "java - Win32 Release"
|
||||
# Name "java - Win32 Debug"
|
||||
# Name "java - Win32 Debug_TS"
|
||||
# Name "java - Win32 Release_TS"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\java.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\php_java.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Java Files"
|
||||
|
||||
# PROP Default_Filter "java"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\reflect.java
|
||||
|
||||
!IF "$(CFG)" == "java - Win32 Release"
|
||||
|
||||
# Begin Custom Build
|
||||
OutDir=.\..\..\Release
|
||||
InputPath=.\reflect.java
|
||||
|
||||
"$(OutDir)\php_java.jar" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
if not exist net mkdir net
|
||||
if not exist net\php mkdir net\php
|
||||
copy $(InputPath) net\php > nul
|
||||
echo library=php_java>net\php\reflect.properties
|
||||
$(JAVA_HOME)\bin\javac net\php\reflect.java
|
||||
$(JAVA_HOME)\bin\jar c0f $(OutDir)\php_java.jar net\php\*.class net\php\*.properties
|
||||
erase net\php\reflect.*
|
||||
rmdir net\php
|
||||
rmdir net
|
||||
|
||||
# End Custom Build
|
||||
|
||||
!ELSEIF "$(CFG)" == "java - Win32 Debug"
|
||||
|
||||
# Begin Custom Build
|
||||
OutDir=.\..\..\Debug
|
||||
InputPath=.\reflect.java
|
||||
|
||||
"$(OutDir)\php_java.jar" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
if not exist net mkdir net
|
||||
if not exist net\php mkdir net\php
|
||||
copy $(InputPath) net\php > nul
|
||||
echo library=php_java>net\php\reflect.properties
|
||||
$(JAVA_HOME)\bin\javac -g net\php\reflect.java
|
||||
$(JAVA_HOME)\bin\jar c0f $(OutDir)\php_java.jar net\php\*.class net\php\*.properties
|
||||
erase net\php\reflect.*
|
||||
rmdir net\php
|
||||
rmdir net
|
||||
|
||||
# End Custom Build
|
||||
|
||||
!ELSEIF "$(CFG)" == "java - Win32 Debug_TS"
|
||||
|
||||
# Begin Custom Build
|
||||
OutDir=.\..\..\Debug_TS
|
||||
InputPath=.\reflect.java
|
||||
|
||||
"$(OutDir)\php_java.jar" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
if not exist net mkdir net
|
||||
if not exist net\php mkdir net\php
|
||||
copy $(InputPath) net\php > nul
|
||||
echo library=php_java>net\php\reflect.properties
|
||||
$(JAVA_HOME)\bin\javac -g net\php\reflect.java
|
||||
$(JAVA_HOME)\bin\jar c0f $(OutDir)\php_java.jar net\php\*.class net\php\*.properties
|
||||
erase net\php\reflect.*
|
||||
rmdir net\php
|
||||
rmdir net
|
||||
|
||||
# End Custom Build
|
||||
|
||||
!ELSEIF "$(CFG)" == "java - Win32 Release_TS"
|
||||
|
||||
# Begin Custom Build
|
||||
OutDir=.\..\..\Release_TS
|
||||
InputPath=.\reflect.java
|
||||
|
||||
"$(OutDir)\php_java.jar" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
if not exist net mkdir net
|
||||
if not exist net\php mkdir net\php
|
||||
copy $(InputPath) net\php > nul
|
||||
echo library=php_java>net\php\reflect.properties
|
||||
$(JAVA_HOME)\bin\javac net\php\reflect.java
|
||||
$(JAVA_HOME)\bin\jar c0f $(OutDir)\php_java.jar net\php\*.class net\php\*.properties
|
||||
erase net\php\reflect.*
|
||||
rmdir net\php
|
||||
rmdir net
|
||||
|
||||
# End Custom Build
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\jtest.php
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
@ -1,27 +0,0 @@
|
||||
<?
|
||||
|
||||
// This example is only intented to be run as a CGI.
|
||||
|
||||
$frame = new Java("java.awt.Frame", "Zend");
|
||||
$button = new Java("java.awt.Button", "Hello Java world!");
|
||||
$frame->add("North", $button);
|
||||
$frame->validate();
|
||||
$frame->pack();
|
||||
$frame->visible = True;
|
||||
|
||||
$thread = new Java("java.lang.Thread");
|
||||
$thread->sleep(10000);
|
||||
|
||||
$frame->dispose();
|
||||
|
||||
// Odd behavior noted with Sun JVMs:
|
||||
//
|
||||
// 1) $thread->destroy() will fail with a NoSuchMethodError exception.
|
||||
// 2) The call to (*jvm)->DestroyJVM(jvm) made when PHP terminates
|
||||
// will hang, unless _BOTH_ the calls to pack and setVisible above
|
||||
// are removed.
|
||||
//
|
||||
// Even more odd: both effects are seen with a 100% Java implementation
|
||||
// of the above!
|
||||
|
||||
?>
|
@ -1,17 +0,0 @@
|
||||
<html>
|
||||
<?
|
||||
|
||||
$system = new Java("java.lang.System");
|
||||
print "Java version=".$system->getProperty("java.version")." <br>\n";
|
||||
print "Java vendor=".$system->getProperty("java.vendor")." <p>\n\n";
|
||||
print "OS=".$system->getProperty("os.name")." ".
|
||||
$system->getProperty("os.version")." on ".
|
||||
$system->getProperty("os.arch")." <br>\n";
|
||||
|
||||
$formatter = new Java("java.text.SimpleDateFormat",
|
||||
"EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");
|
||||
|
||||
print $formatter->format(new Java("java.util.Date"))."\n";
|
||||
|
||||
?>
|
||||
</html>
|
@ -1,419 +0,0 @@
|
||||
/*
|
||||
+----------------------------------------------------------------------+
|
||||
| PHP Version 4 |
|
||||
+----------------------------------------------------------------------+
|
||||
| Copyright (c) 1997-2002 The PHP Group |
|
||||
+----------------------------------------------------------------------+
|
||||
| This source file is subject to version 2.02 of the PHP license, |
|
||||
| that is bundled with this package in the file LICENSE, and is |
|
||||
| available at through the world-wide-web at |
|
||||
| http://www.php.net/license/2_02.txt. |
|
||||
| If you did not receive a copy of the PHP license and are unable to |
|
||||
| obtain it through the world-wide-web, please send a note to |
|
||||
| license@php.net so we can mail you a copy immediately. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Author: Sam Ruby (rubys@us.ibm.com) |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
package net.php;
|
||||
|
||||
import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
import java.beans.*;
|
||||
|
||||
public class reflect {
|
||||
|
||||
static { loadLibrary("reflect"); }
|
||||
|
||||
protected static void loadLibrary(String property) {
|
||||
try {
|
||||
ResourceBundle bundle = ResourceBundle.getBundle("net.php."+property);
|
||||
System.loadLibrary(bundle.getString("library"));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Native methods
|
||||
//
|
||||
private static native void setResultFromString(long result, byte value[]);
|
||||
private static native void setResultFromLong(long result, long value);
|
||||
private static native void setResultFromDouble(long result, double value);
|
||||
private static native void setResultFromBoolean(long result, boolean value);
|
||||
private static native void setResultFromObject(long result, Object value);
|
||||
private static native void setResultFromArray(long result);
|
||||
private static native long nextElement(long array);
|
||||
private static native long hashUpdate(long array, byte key[]);
|
||||
private static native long hashIndexUpdate(long array, long key);
|
||||
private static native void setException(long result, byte value[]);
|
||||
public static native void setEnv();
|
||||
|
||||
//
|
||||
// Helper routines which encapsulate the native methods
|
||||
//
|
||||
public static void setResult(long result, Object value) {
|
||||
if (value == null) return;
|
||||
|
||||
if (value instanceof java.lang.String) {
|
||||
|
||||
setResultFromString(result, ((String)value).getBytes());
|
||||
|
||||
} else if (value instanceof java.lang.Number) {
|
||||
|
||||
if (value instanceof java.lang.Integer ||
|
||||
value instanceof java.lang.Short ||
|
||||
value instanceof java.lang.Byte) {
|
||||
setResultFromLong(result, ((Number)value).longValue());
|
||||
} else {
|
||||
/* Float, Double, BigDecimal, BigInteger, Double, Long, ... */
|
||||
setResultFromDouble(result, ((Number)value).doubleValue());
|
||||
}
|
||||
|
||||
} else if (value instanceof java.lang.Boolean) {
|
||||
|
||||
setResultFromBoolean(result, ((Boolean)value).booleanValue());
|
||||
|
||||
} else if (value.getClass().isArray()) {
|
||||
|
||||
long length = Array.getLength(value);
|
||||
setResultFromArray(result);
|
||||
for (int i=0; i<length; i++) {
|
||||
setResult(nextElement(result), Array.get(value, i));
|
||||
}
|
||||
|
||||
} else if (value instanceof java.util.Hashtable) {
|
||||
|
||||
Hashtable ht = (Hashtable) value;
|
||||
setResultFromArray(result);
|
||||
for (Enumeration e = ht.keys(); e.hasMoreElements(); ) {
|
||||
Object key = e.nextElement();
|
||||
long slot;
|
||||
if (key instanceof Number &&
|
||||
!(key instanceof Double || key instanceof Float))
|
||||
slot = hashIndexUpdate(result, ((Number)key).longValue());
|
||||
else
|
||||
slot = hashUpdate(result, key.toString().getBytes());
|
||||
setResult(slot, ht.get(key));
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
setResultFromObject(result, value);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Throwable lastException = null;
|
||||
|
||||
void lastException(long result) {
|
||||
setResult(result, lastException);
|
||||
}
|
||||
|
||||
void clearException() {
|
||||
lastException = null;
|
||||
}
|
||||
|
||||
void setException(long result, Throwable e) {
|
||||
if (e instanceof InvocationTargetException) {
|
||||
Throwable t = ((InvocationTargetException)e).getTargetException();
|
||||
if (t!=null) e=t;
|
||||
}
|
||||
|
||||
lastException = e;
|
||||
setException(result, e.toString().getBytes());
|
||||
}
|
||||
|
||||
//
|
||||
// Create an new instance of a given class
|
||||
//
|
||||
public void CreateObject(String name, Object args[], long result) {
|
||||
try {
|
||||
Vector matches = new Vector();
|
||||
|
||||
Constructor cons[] = Class.forName(name).getConstructors();
|
||||
for (int i=0; i<cons.length; i++) {
|
||||
if (cons[i].getParameterTypes().length == args.length) {
|
||||
matches.addElement(cons[i]);
|
||||
}
|
||||
}
|
||||
|
||||
Constructor selected = (Constructor)select(matches, args);
|
||||
|
||||
if (selected == null) {
|
||||
if (args.length > 0) {
|
||||
throw new InstantiationException("No matching constructor found");
|
||||
} else {
|
||||
// for classes which have no visible constructor, return the class
|
||||
// useful for classes like java.lang.System and java.util.Calendar.
|
||||
setResult(result, Class.forName(name));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Object coercedArgs[] = coerce(selected.getParameterTypes(), args);
|
||||
setResultFromObject(result, selected.newInstance(coercedArgs));
|
||||
|
||||
} catch (Exception e) {
|
||||
setException(result, e);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Select the best match from a list of methods
|
||||
//
|
||||
private static Object select(Vector methods, Object args[]) {
|
||||
if (methods.size() == 1) return methods.firstElement();
|
||||
|
||||
Object selected = null;
|
||||
int best = Integer.MAX_VALUE;
|
||||
|
||||
for (Enumeration e = methods.elements(); e.hasMoreElements(); ) {
|
||||
Object element = e.nextElement();
|
||||
int weight=0;
|
||||
|
||||
Class parms[] = (element instanceof Method) ?
|
||||
((Method)element).getParameterTypes() :
|
||||
((Constructor)element).getParameterTypes();
|
||||
|
||||
for (int i=0; i<parms.length; i++) {
|
||||
if (parms[i].isInstance(args[i])) {
|
||||
for (Class c=parms[i]; (c=c.getSuperclass()) != null; ) {
|
||||
if (!c.isInstance(args[i])) break;
|
||||
weight++;
|
||||
}
|
||||
} else if (parms[i].isAssignableFrom(java.lang.String.class)) {
|
||||
if (!(args[i] instanceof byte[]) && !(args[i] instanceof String))
|
||||
weight+=9999;
|
||||
} else if (parms[i].isArray()) {
|
||||
if (args[i] instanceof java.util.Hashtable)
|
||||
weight+=256;
|
||||
else
|
||||
weight+=9999;
|
||||
} else if (parms[i].isPrimitive()) {
|
||||
Class c=parms[i];
|
||||
if (args[i] instanceof Number) {
|
||||
if (c==Boolean.TYPE) weight+=5;
|
||||
if (c==Character.TYPE) weight+=4;
|
||||
if (c==Byte.TYPE) weight+=3;
|
||||
if (c==Short.TYPE) weight+=2;
|
||||
if (c==Integer.TYPE) weight++;
|
||||
if (c==Float.TYPE) weight++;
|
||||
} else if (args[i] instanceof Boolean) {
|
||||
if (c!=Boolean.TYPE) weight+=9999;
|
||||
} else if (args[i] instanceof String) {
|
||||
if (c== Character.TYPE || ((String)args[i]).length()>0)
|
||||
weight+=((String)args[i]).length();
|
||||
else
|
||||
weight+=64;
|
||||
} else {
|
||||
weight+=9999;
|
||||
}
|
||||
} else {
|
||||
weight+=9999;
|
||||
}
|
||||
}
|
||||
|
||||
if (weight < best) {
|
||||
if (weight == 0) return element;
|
||||
best = weight;
|
||||
selected = element;
|
||||
}
|
||||
}
|
||||
|
||||
return selected;
|
||||
}
|
||||
|
||||
//
|
||||
// Coerce arguments when possible to conform to the argument list.
|
||||
// Java's reflection will automatically do widening conversions,
|
||||
// unfortunately PHP only supports wide formats, so to be practical
|
||||
// some (possibly lossy) conversions are required.
|
||||
//
|
||||
private static Object[] coerce(Class parms[], Object args[]) {
|
||||
Object result[] = args;
|
||||
for (int i=0; i<args.length; i++) {
|
||||
if (args[i] instanceof byte[] && !parms[i].isArray()) {
|
||||
Class c = parms[i];
|
||||
String s = new String((byte[])args[i]);
|
||||
result[i] = s;
|
||||
try {
|
||||
if (c == Boolean.TYPE) result[i]=new Boolean(s);
|
||||
if (c == Byte.TYPE) result[i]=new Byte(s);
|
||||
if (c == Short.TYPE) result[i]=new Short(s);
|
||||
if (c == Integer.TYPE) result[i]=new Integer(s);
|
||||
if (c == Float.TYPE) result[i]=new Float(s);
|
||||
if (c == Long.TYPE) result[i]=new Long(s);
|
||||
if (c == Character.TYPE && s.length()>0)
|
||||
result[i]=new Character(s.charAt(0));
|
||||
} catch (NumberFormatException n) {
|
||||
// oh well, we tried!
|
||||
}
|
||||
} else if (args[i] instanceof Number && parms[i].isPrimitive()) {
|
||||
if (result==args) result=(Object[])result.clone();
|
||||
Class c = parms[i];
|
||||
Number n = (Number)args[i];
|
||||
if (c == Boolean.TYPE) result[i]=new Boolean(0.0!=n.floatValue());
|
||||
if (c == Byte.TYPE) result[i]=new Byte(n.byteValue());
|
||||
if (c == Short.TYPE) result[i]=new Short(n.shortValue());
|
||||
if (c == Integer.TYPE) result[i]=new Integer(n.intValue());
|
||||
if (c == Float.TYPE) result[i]=new Float(n.floatValue());
|
||||
if (c == Long.TYPE && !(n instanceof Long))
|
||||
result[i]=new Long(n.longValue());
|
||||
} else if (args[i] instanceof Hashtable && parms[i].isArray()) {
|
||||
try {
|
||||
Hashtable ht = (Hashtable)args[i];
|
||||
int size = ht.size();
|
||||
|
||||
// Verify that the keys are Long, and determine maximum
|
||||
for (Enumeration e = ht.keys(); e.hasMoreElements(); ) {
|
||||
int index = ((Long)e.nextElement()).intValue();
|
||||
if (index >= size) size = index+1;
|
||||
}
|
||||
|
||||
Object tempArray[] = new Object[size];
|
||||
Class tempTarget[] = new Class[size];
|
||||
Class targetType = parms[i].getComponentType();
|
||||
|
||||
// flatten the hash table into an array
|
||||
for (int j=0; j<size; j++) {
|
||||
tempArray[j] = ht.get(new Long(j));
|
||||
if (tempArray[j] == null && targetType.isPrimitive())
|
||||
throw new Exception("bail");
|
||||
tempTarget[j] = targetType;
|
||||
}
|
||||
|
||||
// coerce individual elements into the target type
|
||||
Object coercedArray[] = coerce(tempTarget, tempArray);
|
||||
|
||||
// copy the results into the desired array type
|
||||
Object array = Array.newInstance(targetType,size);
|
||||
for (int j=0; j<size; j++) {
|
||||
Array.set(array, j, coercedArray[j]);
|
||||
}
|
||||
|
||||
result[i]=array;
|
||||
} catch (Exception e) {
|
||||
// leave result[i] alone...
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
// Invoke a method on a given object
|
||||
//
|
||||
public void Invoke
|
||||
(Object object, String method, Object args[], long result)
|
||||
{
|
||||
try {
|
||||
Vector matches = new Vector();
|
||||
|
||||
// gather
|
||||
for (Class jclass = object.getClass();;jclass=(Class)object) {
|
||||
while (!Modifier.isPublic(jclass.getModifiers())) {
|
||||
// OK, some joker gave us an instance of a non-public class
|
||||
// This often occurs in the case of enumerators
|
||||
// Substitute the first public interface in its place,
|
||||
// and barring that, try the superclass
|
||||
Class interfaces[] = jclass.getInterfaces();
|
||||
jclass=jclass.getSuperclass();
|
||||
for (int i=interfaces.length; i-->0;) {
|
||||
if (Modifier.isPublic(interfaces[i].getModifiers())) {
|
||||
jclass=interfaces[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
Method methods[] = jclass.getMethods();
|
||||
for (int i=0; i<methods.length; i++) {
|
||||
if (methods[i].getName().equalsIgnoreCase(method) &&
|
||||
methods[i].getParameterTypes().length == args.length) {
|
||||
matches.addElement(methods[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// try a second time with the object itself, if it is of type Class
|
||||
if (!(object instanceof Class) || (jclass==object)) break;
|
||||
}
|
||||
|
||||
Method selected = (Method)select(matches, args);
|
||||
if (selected == null) throw new NoSuchMethodException(method);
|
||||
|
||||
Object coercedArgs[] = coerce(selected.getParameterTypes(), args);
|
||||
setResult(result, selected.invoke(object, coercedArgs));
|
||||
|
||||
} catch (Exception e) {
|
||||
setException(result, e);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Get or Set a property
|
||||
//
|
||||
public void GetSetProp
|
||||
(Object object, String prop, Object args[], long result)
|
||||
{
|
||||
try {
|
||||
|
||||
for (Class jclass = object.getClass();;jclass=(Class)object) {
|
||||
while (!Modifier.isPublic(jclass.getModifiers())) {
|
||||
// OK, some joker gave us an instance of a non-public class
|
||||
// Substitute the first public interface in its place,
|
||||
// and barring that, try the superclass
|
||||
Class interfaces[] = jclass.getInterfaces();
|
||||
jclass=jclass.getSuperclass();
|
||||
for (int i=interfaces.length; i-->0;) {
|
||||
if (Modifier.isPublic(interfaces[i].getModifiers())) {
|
||||
jclass=interfaces[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
BeanInfo beanInfo = Introspector.getBeanInfo(jclass);
|
||||
PropertyDescriptor props[] = beanInfo.getPropertyDescriptors();
|
||||
for (int i=0; i<props.length; i++) {
|
||||
if (props[i].getName().equalsIgnoreCase(prop)) {
|
||||
Method method;
|
||||
if (args!=null && args.length>0) {
|
||||
method=props[i].getWriteMethod();
|
||||
args = coerce(method.getParameterTypes(), args);
|
||||
} else {
|
||||
method=props[i].getReadMethod();
|
||||
}
|
||||
setResult(result, method.invoke(object, args));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Field jfields[] = jclass.getFields();
|
||||
for (int i=0; i<jfields.length; i++) {
|
||||
if (jfields[i].getName().equalsIgnoreCase(prop)) {
|
||||
if (args!=null && args.length>0) {
|
||||
args = coerce(new Class[] {jfields[i].getType()}, args);
|
||||
jfields[i].set(object, args[0]);
|
||||
} else {
|
||||
setResult(result, jfields[i].get(object));
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// try a second time with the object itself, if it is of type Class
|
||||
if (!(object instanceof Class) || (jclass==object)) break;
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
setException(result, e);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Helper routines for the C implementation
|
||||
//
|
||||
public Object MakeArg(boolean b) { return new Boolean(b); }
|
||||
public Object MakeArg(long l) { return new Long(l); }
|
||||
public Object MakeArg(double d) { return new Double(d); }
|
||||
}
|
Loading…
Reference in New Issue
Block a user