PHP_FUNCTION(com_propput);
static int le_idispatch;
+static int codepage;
function_entry COM_functions[] = {
PHP_FE(COM_load, NULL)
char *clsid_str;
StringFromCLSID(clsid, &ole_clsid);
- clsid_str = php_OLECHAR_to_char(ole_clsid, NULL, 0);
+ clsid_str = php_OLECHAR_to_char(ole_clsid, NULL, 0, codepage);
LocalFree(ole_clsid);
return clsid_str;
Loads a COM module */
PHP_FUNCTION(COM_load)
{
- pval *module_name, *server_name=NULL;
+ pval *module_name, *server_name=NULL, *code_page;
CLSID clsid;
HRESULT hr;
OLECHAR *ProgID;
switch (ZEND_NUM_ARGS()) {
case 1:
getParameters(ht, 1, &module_name);
+ codepage = CP_ACP;
break;
case 2:
if (!INI_INT("allow_dcom")) {
}
getParameters(ht, 2, &module_name, &server_name);
convert_to_string(server_name);
+ codepage = CP_ACP;
+ break;
+ case 3:
+ if (!INI_INT("allow_dcom")) {
+ php_error(E_WARNING, "DCOM is disabled");
+ RETURN_FALSE;
+ }
+ getParameters(ht, 3, &module_name, &server_name, &code_page);
+
+ if (server_name->type == IS_NULL) {
+ efree(server_name);
+ server_name = NULL;
+ }
+ else
+ convert_to_string(server_name);
+
+ convert_to_long(code_page);
+ codepage = code_page->value.lval;
break;
default:
WRONG_PARAM_COUNT;
}
convert_to_string(module_name);
- ProgID = php_char_to_OLECHAR(module_name->value.str.val, module_name->value.str.len);
+ ProgID = php_char_to_OLECHAR(module_name->value.str.val, module_name->value.str.len, codepage);
hr = CLSIDFromProgID(ProgID, &clsid);
efree(ProgID);
server_info.dwReserved1=0;
server_info.dwReserved2=0;
- server_info.pwszName = php_char_to_OLECHAR(server_name->value.str.val, server_name->value.str.len);
+ server_info.pwszName = php_char_to_OLECHAR(server_name->value.str.val, server_name->value.str.len, codepage);
server_info.pAuthInfo=NULL;
pResults.pIID = &IID_IDispatch;
int current_arg, current_variant;
DISPPARAMS dispparams;
- funcname = php_char_to_OLECHAR(function_name->value.str.val, function_name->value.str.len);
+ funcname = php_char_to_OLECHAR(function_name->value.str.val, function_name->value.str.len, codepage);
hr = i_dispatch->GetIDsOfNames(IID_NULL, &funcname, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
for (current_arg=0; current_arg<arg_count; current_arg++) {
current_variant = arg_count - current_arg - 1;
- php_pval_to_variant(arguments[current_arg], &variant_args[current_variant]);
+ php_pval_to_variant(arguments[current_arg], &variant_args[current_variant], codepage);
}
dispparams.rgvarg = variant_args;
}
efree(arguments);
- php_variant_to_pval(&var_result, return_value, 0);
+ php_variant_to_pval(&var_result, return_value, 0, codepage);
}
/* }}} */
/* obtain property handler */
- propname = php_char_to_OLECHAR(arg_property->value.str.val, arg_property->value.str.len);
+ propname = php_char_to_OLECHAR(arg_property->value.str.val, arg_property->value.str.len, codepage);
hr = i_dispatch->GetIDsOfNames(IID_NULL, &propname, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
/* obtain property handler */
- propname = php_char_to_OLECHAR(arg_property->value.str.val, arg_property->value.str.len);
+ propname = php_char_to_OLECHAR(arg_property->value.str.val, arg_property->value.str.len, codepage);
hr = i_dispatch->GetIDsOfNames(IID_NULL, &propname, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
}
- php_pval_to_variant(value, &new_value);
+ php_pval_to_variant(value, &new_value, codepage);
dispparams.rgvarg = &new_value;
dispparams.rgdispidNamedArgs = &mydispid;
dispparams.cArgs = 1;
if (SUCCEEDED(hr)) {
- php_variant_to_pval(&var_result, return_value, 0);
+ php_variant_to_pval(&var_result, return_value, 0, codepage);
} else {
*return_value = *value;
zval_copy_ctor(return_value);
if (do_COM_propget(&var_result, i_dispatch, arg_property, 0)==FAILURE) {
RETURN_FALSE;
}
- php_variant_to_pval(&var_result, return_value, 0);
+ php_variant_to_pval(&var_result, return_value, 0, codepage);
}
/* }}} */
pval result;
VARIANTARG var_result = _php_COM_get_property_handler(property_reference);
- php_variant_to_pval(&var_result, &result, 0);
+ php_variant_to_pval(&var_result, &result, 0, codepage);
return result;
}
}
pval_destructor(&function_name->element);
efree(arguments);
- php_variant_to_pval(&var_result, return_value, 0);
+ php_variant_to_pval(&var_result, return_value, 0, codepage);
}
for (overloaded_property = (zend_overloaded_element *) zend_llist_get_first(property_reference->elements_list);
int interfaces;
ELS_FETCH();
- p = php_char_to_OLECHAR(typelib_name, strlen(typelib_name));
+ p = php_char_to_OLECHAR(typelib_name, strlen(typelib_name), codepage);
if (FAILED(LoadTypeLib(p, &TypeLib))) {
efree(p);
char *EnumId;
TypeLib->lpVtbl->GetDocumentation(TypeLib, i, &bstr_EnumId, NULL, NULL, NULL);
- EnumId = php_OLECHAR_to_char(bstr_EnumId, NULL, 0);
+ EnumId = php_OLECHAR_to_char(bstr_EnumId, NULL, 0, codepage);
printf("Enumeration %d - %s:\n", i, EnumId);
efree(EnumId);
#endif
continue;
}
LocalFree(bstr_ids);
- ids = php_OLECHAR_to_char(bstr_ids, NULL, 1);
+ ids = php_OLECHAR_to_char(bstr_ids, NULL, 1, codepage);
c.name_len = strlen(ids)+1;
c.name = ids;
- php_variant_to_pval(pVarDesc->lpvarValue, &c.value, 1);
+ php_variant_to_pval(pVarDesc->lpvarValue, &c.value, 1, codepage);
c.flags = mode;
zend_register_constant(&c ELS_CC);
void php_register_VARIANT_class();
static int le_variant;
+static int codepage;
static zend_class_entry VARIANT_class_entry;
{
le_variant = zend_register_list_destructors_ex(php_variant_destructor, NULL, "VARIANT", module_number);
+ /* variant datatypes */
+ REGISTER_LONG_CONSTANT("VT_NULL", VT_NULL, 0);
+ REGISTER_LONG_CONSTANT("VT_EMPTY", VT_EMPTY, 0);
+ REGISTER_LONG_CONSTANT("VT_UI1", VT_UI1, 0);
+ REGISTER_LONG_CONSTANT("VT_I2", VT_I2, 0);
+ REGISTER_LONG_CONSTANT("VT_R4", VT_R4, 0);
+ REGISTER_LONG_CONSTANT("VT_R8", VT_R8, 0);
+ REGISTER_LONG_CONSTANT("VT_BOOL", VT_BOOL, 0);
+ REGISTER_LONG_CONSTANT("VT_ERROR", VT_ERROR, 0);
+ REGISTER_LONG_CONSTANT("VT_CY", VT_CY, 0);
+ REGISTER_LONG_CONSTANT("VT_DATE", VT_CY, 0);
+ REGISTER_LONG_CONSTANT("VT_BSTR", VT_BSTR, 0);
+ REGISTER_LONG_CONSTANT("VT_DECIMAL", VT_DECIMAL, 0);
+ REGISTER_LONG_CONSTANT("VT_UNKNOWN", VT_UNKNOWN, 0);
+ REGISTER_LONG_CONSTANT("VT_DISPATCH", VT_DISPATCH, 0);
+ REGISTER_LONG_CONSTANT("VT_VARIANT", VT_VARIANT, 0);
+ REGISTER_LONG_CONSTANT("VT_I1", VT_I1, 0);
+ REGISTER_LONG_CONSTANT("VT_UI2", VT_UI2, 0);
+ REGISTER_LONG_CONSTANT("VT_UI4", VT_UI4, 0);
+ REGISTER_LONG_CONSTANT("VT_INT", VT_INT, 0);
+ REGISTER_LONG_CONSTANT("VT_UINT", VT_UINT, 0);
+ REGISTER_LONG_CONSTANT("VT_ARRAY", VT_ARRAY, 0);
+ REGISTER_LONG_CONSTANT("VT_BYREF", VT_BYREF, 0);
+
+ /* codepages */
+ REGISTER_LONG_CONSTANT("CP_ACP", CP_ACP, 0);
+ REGISTER_LONG_CONSTANT("CP_MACCP", CP_MACCP, 0);
+ REGISTER_LONG_CONSTANT("CP_OEMCP", CP_OEMCP, 0);
+ REGISTER_LONG_CONSTANT("CP_SYMBOL", CP_SYMBOL, 0);
+ REGISTER_LONG_CONSTANT("CP_THREAD_ACP", CP_THREAD_ACP, 0);
+ REGISTER_LONG_CONSTANT("CP_UTF7", CP_UTF7, 0);
+ REGISTER_LONG_CONSTANT("CP_UTF8", CP_UTF8, 0);
+
php_register_VARIANT_class();
return SUCCESS;
}
if ((zend_llist_count(property_reference->elements_list)==1) && !strcmp(function_name->element.value.str.val, "variant"))
{
/* constructor */
- pval *object_handle, *data, *type;
+ pval *object_handle, *data, *type, *code_page;
pVar = emalloc(sizeof(VARIANT));
VariantInit(pVar);
break;
case 1:
getParameters(ht, 1, &data);
- php_pval_to_variant(data, pVar);
+ php_pval_to_variant(data, pVar, codepage);
+ codepage = CP_ACP;
break;
case 2:
getParameters(ht, 2, &data, &type);
- php_pval_to_variant_ex(data, pVar, type);
+ php_pval_to_variant_ex(data, pVar, type, codepage);
+ codepage = CP_ACP;
+ break;
+ case 3:
+ getParameters(ht, 3, &data, &type, &code_page);
+ php_pval_to_variant_ex(data, pVar, type, codepage);
+ convert_to_long(code_page);
+ codepage = code_page->value.lval;
break;
default:
WRONG_PARAM_COUNT;
case OE_IS_OBJECT:
if(!strcmp(overloaded_property->element.value.str.val, "value"))
- php_variant_to_pval(var_arg, &result, 0);
+ php_variant_to_pval(var_arg, &result, 0, codepage);
else
{
var_reset(&result);
if(!strcmp(arg_property->value.str.val, "bVal"))
{
- type.value.str.val = "VT_UI1";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UI1;
}
else if(!strcmp(arg_property->value.str.val, "iVal"))
{
- type.value.str.val = "VT_I2";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_I2;
}
else if(!strcmp(arg_property->value.str.val, "lVal"))
{
- type.value.str.val = "VT_I4";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_I4;
}
else if(!strcmp(arg_property->value.str.val, "fltVal"))
{
- type.value.str.val = "VT_R4";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_R4;
}
else if(!strcmp(arg_property->value.str.val, "dblVal"))
{
- type.value.str.val = "VT_R8";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_R8;
}
else if(!strcmp(arg_property->value.str.val, "boolVal"))
{
- type.value.str.val = "VT_BOOL";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_BOOL;
}
else if(!strcmp(arg_property->value.str.val, "scode"))
{
- type.value.str.val = "VT_ERROR";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_ERROR;
}
else if(!strcmp(arg_property->value.str.val, "cyVal"))
{
- type.value.str.val = "VT_CY";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_CY;
}
else if(!strcmp(arg_property->value.str.val, "date"))
{
- type.value.str.val = "VT_DATE";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_DATE;
}
else if(!strcmp(arg_property->value.str.val, "bstrVal"))
{
- type.value.str.val = "VT_BSTR";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_BSTR;
}
else if(!strcmp(arg_property->value.str.val, "pdecVal"))
{
- type.value.str.val = "VT_DECIMAL|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_DECIMAL|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "punkVal"))
{
- type.value.str.val = "VT_UNKNOWN";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UNKNOWN;
}
else if(!strcmp(arg_property->value.str.val, "pdispVal"))
{
- type.value.str.val = "VT_DISPATCH";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_DISPATCH;
}
else if(!strcmp(arg_property->value.str.val, "parray"))
{
- type.value.str.val = "VT_ARRAY";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_ARRAY;
}
else if(!strcmp(arg_property->value.str.val, "pbVal"))
{
- type.value.str.val = "VT_UI1|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UI1|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "piVal"))
{
- type.value.str.val = "VT_I2|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_I2|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "plVal"))
{
- type.value.str.val = "VT_I4|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_I4|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pfltVal"))
{
- type.value.str.val = "VT_R4|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_R4|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pdblVal"))
{
- type.value.str.val = "VT_R8|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_R8|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pboolVal"))
{
- type.value.str.val = "VT_BOOL|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_BOOL|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pscode"))
{
- type.value.str.val = "VT_ERROR|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_ERROR|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pcyVal"))
{
- type.value.str.val = "VT_CY|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_CY|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pdate"))
{
- type.value.str.val = "VT_DATE|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_DATE|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pbstrVal"))
{
- type.value.str.val = "VT_BSTR|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_BSTR|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "ppunkVal"))
{
- type.value.str.val = "VT_UNKNOWN|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UNKNOWN|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "ppdispVal"))
{
- type.value.str.val = "VT_DISPATCH|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_DISPATCH|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pparray"))
{
- type.value.str.val = "VT_ARRAY|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_ARRAY|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pvarVal"))
{
- type.value.str.val = "VT_VARIANT|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_VARIANT|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "byref"))
{
- type.value.str.val = "VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "cVal"))
{
- type.value.str.val = "VT_I1";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_I1;
}
else if(!strcmp(arg_property->value.str.val, "uiVal"))
{
- type.value.str.val = "VT_UI2";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UI2;
}
else if(!strcmp(arg_property->value.str.val, "ulVal"))
{
- type.value.str.val = "VT_UI4";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UI4;
}
else if(!strcmp(arg_property->value.str.val, "intVal"))
{
- type.value.str.val = "VT_INT";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_INT;
}
else if(!strcmp(arg_property->value.str.val, "uintVal"))
{
- type.value.str.val = "VT_UINT|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UINT|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pcVal"))
{
- type.value.str.val = "VT_I1|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_I1|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "puiVal"))
{
- type.value.str.val = "VT_UI2|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UI2|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pulVal"))
{
- type.value.str.val = "VT_UI4|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UI4|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pintVal"))
{
- type.value.str.val = "VT_INT|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_INT|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "puintVal"))
{
- type.value.str.val = "VT_UINT|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UINT|VT_BYREF;
}
else
{
php_error(E_WARNING, "Unknown member.");
return FAILURE;
}
+
+ php_pval_to_variant_ex(value, var_arg, &type, codepage);
+
return SUCCESS;
}
#include "php_COM.h"
#include "unknwn.h"
-// #define PHP_UNICODE_CODEPAGE CP_THREAD_ACP // for win2k
-#define PHP_UNICODE_CODEPAGE CP_ACP
-
// prototypes
-PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg);
-PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type);
-PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent);
-PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen);
-PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent);
+PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage);
+PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type, int codepage);
+PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent, int codepage);
+PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen, int codepage);
+PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent, int codepage);
// implementations
-PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg)
+PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage)
{
OLECHAR *unicode_str;
case IS_STRING:
var_arg->vt = VT_BSTR;
- unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len);
+ unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len, codepage);
var_arg->bstrVal = SysAllocString(unicode_str);
efree(unicode_str);
}
}
-PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type)
+PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type, int codepage)
{
- if(pval_type->type != IS_STRING)
- {
- php_error(E_WARNING, "Assuming string as parameter type for parameter 3.");
- php_pval_to_variant(pval_arg, var_arg);
- }
- else
- {
OLECHAR *unicode_str;
- // set type
- if(!strcmp(pval_type->value.str.val, "VT_UI1"))
- var_arg->vt = VT_UI1;
- else if(!strcmp(pval_type->value.str.val, "VT_I2"))
- var_arg->vt = VT_I4;
- else if(!strcmp(pval_type->value.str.val, "VT_R4"))
- var_arg->vt = VT_R4;
- else if(!strcmp(pval_type->value.str.val, "VT_R8"))
- var_arg->vt = VT_R8;
- else if(!strcmp(pval_type->value.str.val, "VT_BOOL"))
- var_arg->vt = VT_BOOL;
- else if(!strcmp(pval_type->value.str.val, "VT_ERROR"))
- var_arg->vt = VT_ERROR;
- else if(!strcmp(pval_type->value.str.val, "VT_CY"))
- var_arg->vt = VT_CY;
- else if(!strcmp(pval_type->value.str.val, "VT_DATE"))
- var_arg->vt = VT_DATE;
- else if(!strcmp(pval_type->value.str.val, "VT_BSTR"))
- var_arg->vt = VT_BSTR;
- else if(!strcmp(pval_type->value.str.val, "VT_DECIMAL"))
- var_arg->vt = VT_DECIMAL;
- else if(!strcmp(pval_type->value.str.val, "VT_UNKNOWN"))
- var_arg->vt = VT_UNKNOWN;
- else if(!strcmp(pval_type->value.str.val, "VT_DISPATCH"))
- var_arg->vt = VT_DISPATCH;
- else if(!strcmp(pval_type->value.str.val, "VT_VARIANT"))
- var_arg->vt = VT_VARIANT;
- else if(!strcmp(pval_type->value.str.val, "VT_I1"))
- var_arg->vt = VT_I1;
- else if(!strcmp(pval_type->value.str.val, "VT_UI2"))
- var_arg->vt = VT_UI2;
- else if(!strcmp(pval_type->value.str.val, "VT_UI4"))
- var_arg->vt = VT_UI4;
- else if(!strcmp(pval_type->value.str.val, "VT_INT"))
- var_arg->vt = VT_INT;
- else if(!strcmp(pval_type->value.str.val, "VT_UINT"))
- var_arg->vt = VT_UINT;
-
- // is safearray
- if(!strcmp(pval_type->value.str.val, "VT_ARRAY"))
- var_arg->vt |= VT_ARRAY; // have to read msdn first
-
- // by reference
- if(!strcmp(pval_type->value.str.val, "VT_BYREF"))
- var_arg->vt |= VT_BYREF;
+ var_arg->vt = (short) pval_type->value.lval;
switch(var_arg->vt)
{
case VT_BSTR:
convert_to_string_ex(&pval_arg);
- unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len);
+ unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len, codepage);
var_arg->bstrVal = SysAllocString(unicode_str);
efree(unicode_str);
break;
case VT_DECIMAL:
convert_to_string_ex(&pval_arg);
- unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len);
+ unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len, codepage);
VarDecFromStr(unicode_str, LOCALE_SYSTEM_DEFAULT, 0, &(var_arg->decVal));
break;
case VT_DECIMAL|VT_BYREF:
convert_to_string_ex(&pval_arg);
- unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len);
+ unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len, codepage);
VarDecFromStr(unicode_str, LOCALE_SYSTEM_DEFAULT, 0, var_arg->pdecVal);
break;
case VT_UNKNOWN:
- php_pval_to_variant(pval_arg, var_arg);
+ php_pval_to_variant(pval_arg, var_arg, codepage);
if(var_arg->vt != VT_DISPATCH)
var_arg->vt = VT_EMPTY;
else
break;
case VT_DISPATCH:
- php_pval_to_variant(pval_arg, var_arg);
+ php_pval_to_variant(pval_arg, var_arg, codepage);
if(var_arg->vt != VT_DISPATCH)
var_arg->vt = VT_EMPTY;
break;
case VT_BSTR|VT_BYREF:
convert_to_string(pval_arg);
var_arg->pbstrVal = (BSTR FAR*) emalloc(sizeof(BSTR FAR*));
- unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len);
+ unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len, codepage);
*(var_arg->pbstrVal) = SysAllocString(unicode_str);
efree(unicode_str);
break;
case VT_UNKNOWN|VT_BYREF:
- php_pval_to_variant(pval_arg, var_arg);
+ php_pval_to_variant(pval_arg, var_arg, codepage);
if(var_arg->vt != VT_DISPATCH)
var_arg->vt = VT_EMPTY;
else
break;
case VT_DISPATCH|VT_BYREF:
- php_pval_to_variant(pval_arg, var_arg);
+ php_pval_to_variant(pval_arg, var_arg, codepage);
if(var_arg->vt != VT_DISPATCH)
var_arg->vt = VT_EMPTY;
else
break;
case VT_VARIANT|VT_BYREF:
- php_pval_to_variant(pval_arg, var_arg);
+ php_pval_to_variant(pval_arg, var_arg, codepage);
if(var_arg->vt != (VT_VARIANT | VT_BYREF))
var_arg->vt = VT_EMPTY;
break;
default:
php_error(E_WARNING, "Type not supportet or not yet implemented.");
}
- }
}
-PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent)
+PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent, int codepage)
{
switch(var_arg->vt & ~VT_BYREF)
switch(VarBstrFromDec(&var_arg->decVal, LOCALE_SYSTEM_DEFAULT, 0, &unicode_str))
{
case S_OK:
- pval_arg->value.str.val = php_OLECHAR_to_char(unicode_str, &pval_arg->value.str.len, persistent);
+ pval_arg->value.str.val = php_OLECHAR_to_char(unicode_str, &pval_arg->value.str.len, persistent, codepage);
pval_arg->type = IS_STRING;
break;
break;
case VT_VARIANT:
- php_variant_to_pval(var_arg->pvarVal, pval_arg, persistent);
+ php_variant_to_pval(var_arg->pvarVal, pval_arg, persistent, codepage);
break;
case VT_BSTR:
if (pval_arg->is_ref == 0 || (var_arg->vt & VT_BYREF) != VT_BYREF) {
- pval_arg->value.str.val = php_OLECHAR_to_char(var_arg->bstrVal, &pval_arg->value.str.len, persistent);
+ pval_arg->value.str.val = php_OLECHAR_to_char(var_arg->bstrVal, &pval_arg->value.str.len, persistent, codepage);
SysFreeString(var_arg->bstrVal);
} else {
- pval_arg->value.str.val = php_OLECHAR_to_char(*(var_arg->pbstrVal), &pval_arg->value.str.len, persistent);
+ pval_arg->value.str.val = php_OLECHAR_to_char(*(var_arg->pbstrVal), &pval_arg->value.str.len, persistent, codepage);
SysFreeString(*(var_arg->pbstrVal));
efree(var_arg->pbstrVal);
}
}
}
-PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen)
+PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen, int codepage)
{
OLECHAR *unicode_str;
//request needed buffersize
- uint reqSize = MultiByteToWideChar(PHP_UNICODE_CODEPAGE, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, C_str, -1, NULL, 0);
+ uint reqSize = MultiByteToWideChar(codepage, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, C_str, -1, NULL, 0);
if(reqSize)
{
unicode_str = (OLECHAR *) emalloc(sizeof(OLECHAR) * reqSize);
//convert string
- MultiByteToWideChar(PHP_UNICODE_CODEPAGE, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, C_str, -1, unicode_str, reqSize);
+ MultiByteToWideChar(codepage, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, C_str, -1, unicode_str, reqSize);
}
else
{
return unicode_str;
}
-PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent)
+PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent, int codepage)
{
char *C_str;
uint length = 0;
//request needed buffersize
- uint reqSize = WideCharToMultiByte(PHP_UNICODE_CODEPAGE, WC_COMPOSITECHECK, unicode_str, -1, NULL, 0, NULL, NULL);
+ uint reqSize = WideCharToMultiByte(codepage, WC_COMPOSITECHECK, unicode_str, -1, NULL, 0, NULL, NULL);
if(reqSize)
{
C_str = (char *) pemalloc(sizeof(char) * reqSize, persistent);
//convert string
- length = WideCharToMultiByte(PHP_UNICODE_CODEPAGE, WC_COMPOSITECHECK, unicode_str, -1, C_str, reqSize, NULL, NULL) - 1;
+ length = WideCharToMultiByte(codepage, WC_COMPOSITECHECK, unicode_str, -1, C_str, reqSize, NULL, NULL) - 1;
}
else
{
BEGIN_EXTERN_C()
-extern void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg);
-extern void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type);
-extern void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent);
-extern OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen);
-extern char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent);
+extern void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage);
+extern void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type, int codepage);
+extern void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent, int codepage);
+extern OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen, int codepage);
+extern char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent, int codepage);
END_EXTERN_C()
static mscorlib::_AppDomain *pDomain;
static zend_class_entry dotnet_class_entry;
+static int codepage;
HRESULT dotnet_init() {
HRESULT hr;
if (ZEND_NUM_ARGS() != 2) WRONG_PARAM_COUNT;
+ /* should be made configurable like in ext/com */
+ codepage = CP_ACP;
+
getParameters(ht, 2, &assembly_name, &datatype_name);
convert_to_string(assembly_name);
- assembly = php_char_to_OLECHAR(assembly_name->value.str.val, assembly_name->value.str.len);
+ assembly = php_char_to_OLECHAR(assembly_name->value.str.val, assembly_name->value.str.len, codepage);
convert_to_string(datatype_name);
- datatype = php_char_to_OLECHAR(datatype_name->value.str.val, datatype_name->value.str.len);
+ datatype = php_char_to_OLECHAR(datatype_name->value.str.val, datatype_name->value.str.len, codepage);
/* obtain IDispatch */
hr=dotnet_create(assembly, datatype, &i_dispatch);
PHP_FUNCTION(com_propput);
static int le_idispatch;
+static int codepage;
function_entry COM_functions[] = {
PHP_FE(COM_load, NULL)
char *clsid_str;
StringFromCLSID(clsid, &ole_clsid);
- clsid_str = php_OLECHAR_to_char(ole_clsid, NULL, 0);
+ clsid_str = php_OLECHAR_to_char(ole_clsid, NULL, 0, codepage);
LocalFree(ole_clsid);
return clsid_str;
Loads a COM module */
PHP_FUNCTION(COM_load)
{
- pval *module_name, *server_name=NULL;
+ pval *module_name, *server_name=NULL, *code_page;
CLSID clsid;
HRESULT hr;
OLECHAR *ProgID;
switch (ZEND_NUM_ARGS()) {
case 1:
getParameters(ht, 1, &module_name);
+ codepage = CP_ACP;
break;
case 2:
if (!INI_INT("allow_dcom")) {
}
getParameters(ht, 2, &module_name, &server_name);
convert_to_string(server_name);
+ codepage = CP_ACP;
+ break;
+ case 3:
+ if (!INI_INT("allow_dcom")) {
+ php_error(E_WARNING, "DCOM is disabled");
+ RETURN_FALSE;
+ }
+ getParameters(ht, 3, &module_name, &server_name, &code_page);
+
+ if (server_name->type == IS_NULL) {
+ efree(server_name);
+ server_name = NULL;
+ }
+ else
+ convert_to_string(server_name);
+
+ convert_to_long(code_page);
+ codepage = code_page->value.lval;
break;
default:
WRONG_PARAM_COUNT;
}
convert_to_string(module_name);
- ProgID = php_char_to_OLECHAR(module_name->value.str.val, module_name->value.str.len);
+ ProgID = php_char_to_OLECHAR(module_name->value.str.val, module_name->value.str.len, codepage);
hr = CLSIDFromProgID(ProgID, &clsid);
efree(ProgID);
server_info.dwReserved1=0;
server_info.dwReserved2=0;
- server_info.pwszName = php_char_to_OLECHAR(server_name->value.str.val, server_name->value.str.len);
+ server_info.pwszName = php_char_to_OLECHAR(server_name->value.str.val, server_name->value.str.len, codepage);
server_info.pAuthInfo=NULL;
pResults.pIID = &IID_IDispatch;
int current_arg, current_variant;
DISPPARAMS dispparams;
- funcname = php_char_to_OLECHAR(function_name->value.str.val, function_name->value.str.len);
+ funcname = php_char_to_OLECHAR(function_name->value.str.val, function_name->value.str.len, codepage);
hr = i_dispatch->GetIDsOfNames(IID_NULL, &funcname, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
for (current_arg=0; current_arg<arg_count; current_arg++) {
current_variant = arg_count - current_arg - 1;
- php_pval_to_variant(arguments[current_arg], &variant_args[current_variant]);
+ php_pval_to_variant(arguments[current_arg], &variant_args[current_variant], codepage);
}
dispparams.rgvarg = variant_args;
}
efree(arguments);
- php_variant_to_pval(&var_result, return_value, 0);
+ php_variant_to_pval(&var_result, return_value, 0, codepage);
}
/* }}} */
/* obtain property handler */
- propname = php_char_to_OLECHAR(arg_property->value.str.val, arg_property->value.str.len);
+ propname = php_char_to_OLECHAR(arg_property->value.str.val, arg_property->value.str.len, codepage);
hr = i_dispatch->GetIDsOfNames(IID_NULL, &propname, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
/* obtain property handler */
- propname = php_char_to_OLECHAR(arg_property->value.str.val, arg_property->value.str.len);
+ propname = php_char_to_OLECHAR(arg_property->value.str.val, arg_property->value.str.len, codepage);
hr = i_dispatch->GetIDsOfNames(IID_NULL, &propname, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
}
- php_pval_to_variant(value, &new_value);
+ php_pval_to_variant(value, &new_value, codepage);
dispparams.rgvarg = &new_value;
dispparams.rgdispidNamedArgs = &mydispid;
dispparams.cArgs = 1;
if (SUCCEEDED(hr)) {
- php_variant_to_pval(&var_result, return_value, 0);
+ php_variant_to_pval(&var_result, return_value, 0, codepage);
} else {
*return_value = *value;
zval_copy_ctor(return_value);
if (do_COM_propget(&var_result, i_dispatch, arg_property, 0)==FAILURE) {
RETURN_FALSE;
}
- php_variant_to_pval(&var_result, return_value, 0);
+ php_variant_to_pval(&var_result, return_value, 0, codepage);
}
/* }}} */
pval result;
VARIANTARG var_result = _php_COM_get_property_handler(property_reference);
- php_variant_to_pval(&var_result, &result, 0);
+ php_variant_to_pval(&var_result, &result, 0, codepage);
return result;
}
}
pval_destructor(&function_name->element);
efree(arguments);
- php_variant_to_pval(&var_result, return_value, 0);
+ php_variant_to_pval(&var_result, return_value, 0, codepage);
}
for (overloaded_property = (zend_overloaded_element *) zend_llist_get_first(property_reference->elements_list);
int interfaces;
ELS_FETCH();
- p = php_char_to_OLECHAR(typelib_name, strlen(typelib_name));
+ p = php_char_to_OLECHAR(typelib_name, strlen(typelib_name), codepage);
if (FAILED(LoadTypeLib(p, &TypeLib))) {
efree(p);
char *EnumId;
TypeLib->lpVtbl->GetDocumentation(TypeLib, i, &bstr_EnumId, NULL, NULL, NULL);
- EnumId = php_OLECHAR_to_char(bstr_EnumId, NULL, 0);
+ EnumId = php_OLECHAR_to_char(bstr_EnumId, NULL, 0, codepage);
printf("Enumeration %d - %s:\n", i, EnumId);
efree(EnumId);
#endif
continue;
}
LocalFree(bstr_ids);
- ids = php_OLECHAR_to_char(bstr_ids, NULL, 1);
+ ids = php_OLECHAR_to_char(bstr_ids, NULL, 1, codepage);
c.name_len = strlen(ids)+1;
c.name = ids;
- php_variant_to_pval(pVarDesc->lpvarValue, &c.value, 1);
+ php_variant_to_pval(pVarDesc->lpvarValue, &c.value, 1, codepage);
c.flags = mode;
zend_register_constant(&c ELS_CC);
#include "php_COM.h"
#include "unknwn.h"
-// #define PHP_UNICODE_CODEPAGE CP_THREAD_ACP // for win2k
-#define PHP_UNICODE_CODEPAGE CP_ACP
-
// prototypes
-PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg);
-PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type);
-PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent);
-PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen);
-PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent);
+PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage);
+PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type, int codepage);
+PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent, int codepage);
+PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen, int codepage);
+PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent, int codepage);
// implementations
-PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg)
+PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage)
{
OLECHAR *unicode_str;
case IS_STRING:
var_arg->vt = VT_BSTR;
- unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len);
+ unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len, codepage);
var_arg->bstrVal = SysAllocString(unicode_str);
efree(unicode_str);
}
}
-PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type)
+PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type, int codepage)
{
- if(pval_type->type != IS_STRING)
- {
- php_error(E_WARNING, "Assuming string as parameter type for parameter 3.");
- php_pval_to_variant(pval_arg, var_arg);
- }
- else
- {
OLECHAR *unicode_str;
- // set type
- if(!strcmp(pval_type->value.str.val, "VT_UI1"))
- var_arg->vt = VT_UI1;
- else if(!strcmp(pval_type->value.str.val, "VT_I2"))
- var_arg->vt = VT_I4;
- else if(!strcmp(pval_type->value.str.val, "VT_R4"))
- var_arg->vt = VT_R4;
- else if(!strcmp(pval_type->value.str.val, "VT_R8"))
- var_arg->vt = VT_R8;
- else if(!strcmp(pval_type->value.str.val, "VT_BOOL"))
- var_arg->vt = VT_BOOL;
- else if(!strcmp(pval_type->value.str.val, "VT_ERROR"))
- var_arg->vt = VT_ERROR;
- else if(!strcmp(pval_type->value.str.val, "VT_CY"))
- var_arg->vt = VT_CY;
- else if(!strcmp(pval_type->value.str.val, "VT_DATE"))
- var_arg->vt = VT_DATE;
- else if(!strcmp(pval_type->value.str.val, "VT_BSTR"))
- var_arg->vt = VT_BSTR;
- else if(!strcmp(pval_type->value.str.val, "VT_DECIMAL"))
- var_arg->vt = VT_DECIMAL;
- else if(!strcmp(pval_type->value.str.val, "VT_UNKNOWN"))
- var_arg->vt = VT_UNKNOWN;
- else if(!strcmp(pval_type->value.str.val, "VT_DISPATCH"))
- var_arg->vt = VT_DISPATCH;
- else if(!strcmp(pval_type->value.str.val, "VT_VARIANT"))
- var_arg->vt = VT_VARIANT;
- else if(!strcmp(pval_type->value.str.val, "VT_I1"))
- var_arg->vt = VT_I1;
- else if(!strcmp(pval_type->value.str.val, "VT_UI2"))
- var_arg->vt = VT_UI2;
- else if(!strcmp(pval_type->value.str.val, "VT_UI4"))
- var_arg->vt = VT_UI4;
- else if(!strcmp(pval_type->value.str.val, "VT_INT"))
- var_arg->vt = VT_INT;
- else if(!strcmp(pval_type->value.str.val, "VT_UINT"))
- var_arg->vt = VT_UINT;
-
- // is safearray
- if(!strcmp(pval_type->value.str.val, "VT_ARRAY"))
- var_arg->vt |= VT_ARRAY; // have to read msdn first
-
- // by reference
- if(!strcmp(pval_type->value.str.val, "VT_BYREF"))
- var_arg->vt |= VT_BYREF;
+ var_arg->vt = (short) pval_type->value.lval;
switch(var_arg->vt)
{
case VT_BSTR:
convert_to_string_ex(&pval_arg);
- unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len);
+ unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len, codepage);
var_arg->bstrVal = SysAllocString(unicode_str);
efree(unicode_str);
break;
case VT_DECIMAL:
convert_to_string_ex(&pval_arg);
- unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len);
+ unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len, codepage);
VarDecFromStr(unicode_str, LOCALE_SYSTEM_DEFAULT, 0, &(var_arg->decVal));
break;
case VT_DECIMAL|VT_BYREF:
convert_to_string_ex(&pval_arg);
- unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len);
+ unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len, codepage);
VarDecFromStr(unicode_str, LOCALE_SYSTEM_DEFAULT, 0, var_arg->pdecVal);
break;
case VT_UNKNOWN:
- php_pval_to_variant(pval_arg, var_arg);
+ php_pval_to_variant(pval_arg, var_arg, codepage);
if(var_arg->vt != VT_DISPATCH)
var_arg->vt = VT_EMPTY;
else
break;
case VT_DISPATCH:
- php_pval_to_variant(pval_arg, var_arg);
+ php_pval_to_variant(pval_arg, var_arg, codepage);
if(var_arg->vt != VT_DISPATCH)
var_arg->vt = VT_EMPTY;
break;
case VT_BSTR|VT_BYREF:
convert_to_string(pval_arg);
var_arg->pbstrVal = (BSTR FAR*) emalloc(sizeof(BSTR FAR*));
- unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len);
+ unicode_str = php_char_to_OLECHAR(pval_arg->value.str.val, pval_arg->value.str.len, codepage);
*(var_arg->pbstrVal) = SysAllocString(unicode_str);
efree(unicode_str);
break;
case VT_UNKNOWN|VT_BYREF:
- php_pval_to_variant(pval_arg, var_arg);
+ php_pval_to_variant(pval_arg, var_arg, codepage);
if(var_arg->vt != VT_DISPATCH)
var_arg->vt = VT_EMPTY;
else
break;
case VT_DISPATCH|VT_BYREF:
- php_pval_to_variant(pval_arg, var_arg);
+ php_pval_to_variant(pval_arg, var_arg, codepage);
if(var_arg->vt != VT_DISPATCH)
var_arg->vt = VT_EMPTY;
else
break;
case VT_VARIANT|VT_BYREF:
- php_pval_to_variant(pval_arg, var_arg);
+ php_pval_to_variant(pval_arg, var_arg, codepage);
if(var_arg->vt != (VT_VARIANT | VT_BYREF))
var_arg->vt = VT_EMPTY;
break;
default:
php_error(E_WARNING, "Type not supportet or not yet implemented.");
}
- }
}
-PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent)
+PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent, int codepage)
{
switch(var_arg->vt & ~VT_BYREF)
switch(VarBstrFromDec(&var_arg->decVal, LOCALE_SYSTEM_DEFAULT, 0, &unicode_str))
{
case S_OK:
- pval_arg->value.str.val = php_OLECHAR_to_char(unicode_str, &pval_arg->value.str.len, persistent);
+ pval_arg->value.str.val = php_OLECHAR_to_char(unicode_str, &pval_arg->value.str.len, persistent, codepage);
pval_arg->type = IS_STRING;
break;
break;
case VT_VARIANT:
- php_variant_to_pval(var_arg->pvarVal, pval_arg, persistent);
+ php_variant_to_pval(var_arg->pvarVal, pval_arg, persistent, codepage);
break;
case VT_BSTR:
if (pval_arg->is_ref == 0 || (var_arg->vt & VT_BYREF) != VT_BYREF) {
- pval_arg->value.str.val = php_OLECHAR_to_char(var_arg->bstrVal, &pval_arg->value.str.len, persistent);
+ pval_arg->value.str.val = php_OLECHAR_to_char(var_arg->bstrVal, &pval_arg->value.str.len, persistent, codepage);
SysFreeString(var_arg->bstrVal);
} else {
- pval_arg->value.str.val = php_OLECHAR_to_char(*(var_arg->pbstrVal), &pval_arg->value.str.len, persistent);
+ pval_arg->value.str.val = php_OLECHAR_to_char(*(var_arg->pbstrVal), &pval_arg->value.str.len, persistent, codepage);
SysFreeString(*(var_arg->pbstrVal));
efree(var_arg->pbstrVal);
}
}
}
-PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen)
+PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen, int codepage)
{
OLECHAR *unicode_str;
//request needed buffersize
- uint reqSize = MultiByteToWideChar(PHP_UNICODE_CODEPAGE, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, C_str, -1, NULL, 0);
+ uint reqSize = MultiByteToWideChar(codepage, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, C_str, -1, NULL, 0);
if(reqSize)
{
unicode_str = (OLECHAR *) emalloc(sizeof(OLECHAR) * reqSize);
//convert string
- MultiByteToWideChar(PHP_UNICODE_CODEPAGE, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, C_str, -1, unicode_str, reqSize);
+ MultiByteToWideChar(codepage, MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, C_str, -1, unicode_str, reqSize);
}
else
{
return unicode_str;
}
-PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent)
+PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent, int codepage)
{
char *C_str;
uint length = 0;
//request needed buffersize
- uint reqSize = WideCharToMultiByte(PHP_UNICODE_CODEPAGE, WC_COMPOSITECHECK, unicode_str, -1, NULL, 0, NULL, NULL);
+ uint reqSize = WideCharToMultiByte(codepage, WC_COMPOSITECHECK, unicode_str, -1, NULL, 0, NULL, NULL);
if(reqSize)
{
C_str = (char *) pemalloc(sizeof(char) * reqSize, persistent);
//convert string
- length = WideCharToMultiByte(PHP_UNICODE_CODEPAGE, WC_COMPOSITECHECK, unicode_str, -1, C_str, reqSize, NULL, NULL) - 1;
+ length = WideCharToMultiByte(codepage, WC_COMPOSITECHECK, unicode_str, -1, C_str, reqSize, NULL, NULL) - 1;
}
else
{
BEGIN_EXTERN_C()
-extern void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg);
-extern void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type);
-extern void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent);
-extern OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen);
-extern char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent);
+extern void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage);
+extern void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type, int codepage);
+extern void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent, int codepage);
+extern OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen, int codepage);
+extern char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent, int codepage);
END_EXTERN_C()
void php_register_VARIANT_class();
static int le_variant;
+static int codepage;
static zend_class_entry VARIANT_class_entry;
{
le_variant = zend_register_list_destructors_ex(php_variant_destructor, NULL, "VARIANT", module_number);
+ /* variant datatypes */
+ REGISTER_LONG_CONSTANT("VT_NULL", VT_NULL, 0);
+ REGISTER_LONG_CONSTANT("VT_EMPTY", VT_EMPTY, 0);
+ REGISTER_LONG_CONSTANT("VT_UI1", VT_UI1, 0);
+ REGISTER_LONG_CONSTANT("VT_I2", VT_I2, 0);
+ REGISTER_LONG_CONSTANT("VT_R4", VT_R4, 0);
+ REGISTER_LONG_CONSTANT("VT_R8", VT_R8, 0);
+ REGISTER_LONG_CONSTANT("VT_BOOL", VT_BOOL, 0);
+ REGISTER_LONG_CONSTANT("VT_ERROR", VT_ERROR, 0);
+ REGISTER_LONG_CONSTANT("VT_CY", VT_CY, 0);
+ REGISTER_LONG_CONSTANT("VT_DATE", VT_CY, 0);
+ REGISTER_LONG_CONSTANT("VT_BSTR", VT_BSTR, 0);
+ REGISTER_LONG_CONSTANT("VT_DECIMAL", VT_DECIMAL, 0);
+ REGISTER_LONG_CONSTANT("VT_UNKNOWN", VT_UNKNOWN, 0);
+ REGISTER_LONG_CONSTANT("VT_DISPATCH", VT_DISPATCH, 0);
+ REGISTER_LONG_CONSTANT("VT_VARIANT", VT_VARIANT, 0);
+ REGISTER_LONG_CONSTANT("VT_I1", VT_I1, 0);
+ REGISTER_LONG_CONSTANT("VT_UI2", VT_UI2, 0);
+ REGISTER_LONG_CONSTANT("VT_UI4", VT_UI4, 0);
+ REGISTER_LONG_CONSTANT("VT_INT", VT_INT, 0);
+ REGISTER_LONG_CONSTANT("VT_UINT", VT_UINT, 0);
+ REGISTER_LONG_CONSTANT("VT_ARRAY", VT_ARRAY, 0);
+ REGISTER_LONG_CONSTANT("VT_BYREF", VT_BYREF, 0);
+
+ /* codepages */
+ REGISTER_LONG_CONSTANT("CP_ACP", CP_ACP, 0);
+ REGISTER_LONG_CONSTANT("CP_MACCP", CP_MACCP, 0);
+ REGISTER_LONG_CONSTANT("CP_OEMCP", CP_OEMCP, 0);
+ REGISTER_LONG_CONSTANT("CP_SYMBOL", CP_SYMBOL, 0);
+ REGISTER_LONG_CONSTANT("CP_THREAD_ACP", CP_THREAD_ACP, 0);
+ REGISTER_LONG_CONSTANT("CP_UTF7", CP_UTF7, 0);
+ REGISTER_LONG_CONSTANT("CP_UTF8", CP_UTF8, 0);
+
php_register_VARIANT_class();
return SUCCESS;
}
if ((zend_llist_count(property_reference->elements_list)==1) && !strcmp(function_name->element.value.str.val, "variant"))
{
/* constructor */
- pval *object_handle, *data, *type;
+ pval *object_handle, *data, *type, *code_page;
pVar = emalloc(sizeof(VARIANT));
VariantInit(pVar);
break;
case 1:
getParameters(ht, 1, &data);
- php_pval_to_variant(data, pVar);
+ php_pval_to_variant(data, pVar, codepage);
+ codepage = CP_ACP;
break;
case 2:
getParameters(ht, 2, &data, &type);
- php_pval_to_variant_ex(data, pVar, type);
+ php_pval_to_variant_ex(data, pVar, type, codepage);
+ codepage = CP_ACP;
+ break;
+ case 3:
+ getParameters(ht, 3, &data, &type, &code_page);
+ php_pval_to_variant_ex(data, pVar, type, codepage);
+ convert_to_long(code_page);
+ codepage = code_page->value.lval;
break;
default:
WRONG_PARAM_COUNT;
case OE_IS_OBJECT:
if(!strcmp(overloaded_property->element.value.str.val, "value"))
- php_variant_to_pval(var_arg, &result, 0);
+ php_variant_to_pval(var_arg, &result, 0, codepage);
else
{
var_reset(&result);
if(!strcmp(arg_property->value.str.val, "bVal"))
{
- type.value.str.val = "VT_UI1";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UI1;
}
else if(!strcmp(arg_property->value.str.val, "iVal"))
{
- type.value.str.val = "VT_I2";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_I2;
}
else if(!strcmp(arg_property->value.str.val, "lVal"))
{
- type.value.str.val = "VT_I4";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_I4;
}
else if(!strcmp(arg_property->value.str.val, "fltVal"))
{
- type.value.str.val = "VT_R4";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_R4;
}
else if(!strcmp(arg_property->value.str.val, "dblVal"))
{
- type.value.str.val = "VT_R8";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_R8;
}
else if(!strcmp(arg_property->value.str.val, "boolVal"))
{
- type.value.str.val = "VT_BOOL";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_BOOL;
}
else if(!strcmp(arg_property->value.str.val, "scode"))
{
- type.value.str.val = "VT_ERROR";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_ERROR;
}
else if(!strcmp(arg_property->value.str.val, "cyVal"))
{
- type.value.str.val = "VT_CY";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_CY;
}
else if(!strcmp(arg_property->value.str.val, "date"))
{
- type.value.str.val = "VT_DATE";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_DATE;
}
else if(!strcmp(arg_property->value.str.val, "bstrVal"))
{
- type.value.str.val = "VT_BSTR";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_BSTR;
}
else if(!strcmp(arg_property->value.str.val, "pdecVal"))
{
- type.value.str.val = "VT_DECIMAL|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_DECIMAL|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "punkVal"))
{
- type.value.str.val = "VT_UNKNOWN";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UNKNOWN;
}
else if(!strcmp(arg_property->value.str.val, "pdispVal"))
{
- type.value.str.val = "VT_DISPATCH";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_DISPATCH;
}
else if(!strcmp(arg_property->value.str.val, "parray"))
{
- type.value.str.val = "VT_ARRAY";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_ARRAY;
}
else if(!strcmp(arg_property->value.str.val, "pbVal"))
{
- type.value.str.val = "VT_UI1|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UI1|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "piVal"))
{
- type.value.str.val = "VT_I2|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_I2|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "plVal"))
{
- type.value.str.val = "VT_I4|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_I4|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pfltVal"))
{
- type.value.str.val = "VT_R4|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_R4|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pdblVal"))
{
- type.value.str.val = "VT_R8|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_R8|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pboolVal"))
{
- type.value.str.val = "VT_BOOL|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_BOOL|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pscode"))
{
- type.value.str.val = "VT_ERROR|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_ERROR|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pcyVal"))
{
- type.value.str.val = "VT_CY|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_CY|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pdate"))
{
- type.value.str.val = "VT_DATE|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_DATE|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pbstrVal"))
{
- type.value.str.val = "VT_BSTR|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_BSTR|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "ppunkVal"))
{
- type.value.str.val = "VT_UNKNOWN|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UNKNOWN|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "ppdispVal"))
{
- type.value.str.val = "VT_DISPATCH|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_DISPATCH|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pparray"))
{
- type.value.str.val = "VT_ARRAY|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_ARRAY|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pvarVal"))
{
- type.value.str.val = "VT_VARIANT|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_VARIANT|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "byref"))
{
- type.value.str.val = "VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "cVal"))
{
- type.value.str.val = "VT_I1";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_I1;
}
else if(!strcmp(arg_property->value.str.val, "uiVal"))
{
- type.value.str.val = "VT_UI2";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UI2;
}
else if(!strcmp(arg_property->value.str.val, "ulVal"))
{
- type.value.str.val = "VT_UI4";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UI4;
}
else if(!strcmp(arg_property->value.str.val, "intVal"))
{
- type.value.str.val = "VT_INT";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_INT;
}
else if(!strcmp(arg_property->value.str.val, "uintVal"))
{
- type.value.str.val = "VT_UINT|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UINT|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pcVal"))
{
- type.value.str.val = "VT_I1|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_I1|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "puiVal"))
{
- type.value.str.val = "VT_UI2|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UI2|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pulVal"))
{
- type.value.str.val = "VT_UI4|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UI4|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "pintVal"))
{
- type.value.str.val = "VT_INT|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_INT|VT_BYREF;
}
else if(!strcmp(arg_property->value.str.val, "puintVal"))
{
- type.value.str.val = "VT_UINT|VT_BYREF";
- php_pval_to_variant_ex(value, var_arg, &type);
+ type.value.lval = VT_UINT|VT_BYREF;
}
else
{
php_error(E_WARNING, "Unknown member.");
return FAILURE;
}
+
+ php_pval_to_variant_ex(value, var_arg, &type, codepage);
+
return SUCCESS;
}
static mscorlib::_AppDomain *pDomain;
static zend_class_entry dotnet_class_entry;
+static int codepage;
HRESULT dotnet_init() {
HRESULT hr;
if (ZEND_NUM_ARGS() != 2) WRONG_PARAM_COUNT;
+ /* should be made configurable like in ext/com */
+ codepage = CP_ACP;
+
getParameters(ht, 2, &assembly_name, &datatype_name);
convert_to_string(assembly_name);
- assembly = php_char_to_OLECHAR(assembly_name->value.str.val, assembly_name->value.str.len);
+ assembly = php_char_to_OLECHAR(assembly_name->value.str.val, assembly_name->value.str.len, codepage);
convert_to_string(datatype_name);
- datatype = php_char_to_OLECHAR(datatype_name->value.str.val, datatype_name->value.str.len);
+ datatype = php_char_to_OLECHAR(datatype_name->value.str.val, datatype_name->value.str.len, codepage);
/* obtain IDispatch */
hr=dotnet_create(assembly, datatype, &i_dispatch);