]> granicus.if.org Git - php/commitdiff
multiple codepage support
authorHarald Radi <phanto@php.net>
Sat, 17 Feb 2001 02:16:29 +0000 (02:16 +0000)
committerHarald Radi <phanto@php.net>
Sat, 17 Feb 2001 02:16:29 +0000 (02:16 +0000)
export global constants

ext/com/COM.c
ext/com/VARIANT.c
ext/com/conversion.c
ext/com/conversion.h
ext/dotnet/dotnet.cpp
ext/rpc/com/com_wrapper.c
ext/rpc/com/conversion.c
ext/rpc/com/conversion.h
ext/rpc/com/variant.c
ext/rpc/dotnet/dotnet.cpp

index 7ab103d5df7d95b1d4140a2f846e31aa27a73335..f1af638d90cdee5ba1de85956e145002c39a563d 100644 (file)
@@ -81,6 +81,7 @@ PHP_FUNCTION(com_propget);
 PHP_FUNCTION(com_propput);
 
 static int le_idispatch;
+static int codepage;
 
 function_entry COM_functions[] = {
        PHP_FE(COM_load,                                                                NULL)
@@ -125,7 +126,7 @@ static char *php_string_from_clsid(const CLSID clsid)
        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;
@@ -210,7 +211,7 @@ PHP_INI_END()
    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;
@@ -221,6 +222,7 @@ PHP_FUNCTION(COM_load)
        switch (ZEND_NUM_ARGS()) {
                case 1:
                        getParameters(ht, 1, &module_name);
+                       codepage = CP_ACP;
                        break;
                case 2:
                        if (!INI_INT("allow_dcom")) {
@@ -229,6 +231,24 @@ PHP_FUNCTION(COM_load)
                        }
                        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;
@@ -236,7 +256,7 @@ PHP_FUNCTION(COM_load)
        }
 
        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);
 
@@ -257,7 +277,7 @@ PHP_FUNCTION(COM_load)
 
                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;
@@ -296,7 +316,7 @@ int do_COM_invoke(IDispatch *i_dispatch, pval *function_name, VARIANTARG *var_re
        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);
 
@@ -312,7 +332,7 @@ int do_COM_invoke(IDispatch *i_dispatch, pval *function_name, VARIANTARG *var_re
 
        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;
@@ -377,7 +397,7 @@ PHP_FUNCTION(COM_invoke)
        }
        efree(arguments);
 
-       php_variant_to_pval(&var_result, return_value, 0);
+       php_variant_to_pval(&var_result, return_value, 0, codepage);
 }
 /* }}} */
 
@@ -413,7 +433,7 @@ static int do_COM_propget(VARIANTARG *var_result, IDispatch *i_dispatch, pval *a
 
 
        /* 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);
 
@@ -465,7 +485,7 @@ static void do_COM_propput(pval *return_value, IDispatch *i_dispatch, pval *arg_
 
 
        /* 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);
 
@@ -478,7 +498,7 @@ static void do_COM_propput(pval *return_value, IDispatch *i_dispatch, pval *arg_
        }
 
 
-       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;
@@ -504,7 +524,7 @@ static void do_COM_propput(pval *return_value, IDispatch *i_dispatch, pval *arg_
 
 
        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);
@@ -539,7 +559,7 @@ PHP_FUNCTION(com_propget)
        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);
 }
 /* }}} */
 
@@ -638,7 +658,7 @@ PHPAPI pval php_COM_get_property_handler(zend_property_reference *property_refer
        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;
 }
 
@@ -747,7 +767,7 @@ PHPAPI void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_pro
                }
                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);
@@ -775,7 +795,7 @@ static int php_COM_load_typelib(char *typelib_name, int mode)
        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);
@@ -799,7 +819,7 @@ static int php_COM_load_typelib(char *typelib_name, int mode)
                        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
@@ -818,10 +838,10 @@ static int php_COM_load_typelib(char *typelib_name, int mode)
                                        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);
index c923b507de3c48cda25ec5eeb6016c305917addf..ca7bdb4834e1c36bdda49ad53b187624e09f5e22 100644 (file)
@@ -42,6 +42,7 @@ static void php_variant_destructor(zend_rsrc_list_entry *rsrc);
 void php_register_VARIANT_class();
 
 static int le_variant;
+static int codepage;
 
 static zend_class_entry VARIANT_class_entry;
 
@@ -67,6 +68,39 @@ PHP_MINIT_FUNCTION(VARIANT)
 {
        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;
 }
@@ -86,7 +120,7 @@ void php_VARIANT_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_proper
        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);
@@ -98,11 +132,19 @@ void php_VARIANT_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_proper
                                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;
@@ -152,7 +194,7 @@ pval php_VARIANT_get_property_handler(zend_property_reference *property_referenc
 
                        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);
@@ -200,204 +242,168 @@ static int do_VARIANT_propset(VARIANT *var_arg, pval *arg_property, pval *value)
        
        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;
 }
 
index 219de13baa0bd177d2cdc969983c425e11d3a835..d0effd96e3266bfd0116dcb03b5bc943f2854897 100644 (file)
@@ -4,20 +4,17 @@
 #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;
 
@@ -83,68 +80,17 @@ PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg)
 
       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)
       {
@@ -207,25 +153,25 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_
 
          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
@@ -245,7 +191,7 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_
             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;
@@ -310,13 +256,13 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_
          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
@@ -336,7 +282,7 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_
             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
@@ -344,7 +290,7 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_
             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;
@@ -402,10 +348,9 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_
          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)
@@ -465,7 +410,7 @@ PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent
             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;
 
@@ -497,15 +442,15 @@ PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent
          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);
          }
@@ -560,19 +505,19 @@ 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 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
    {
@@ -592,20 +537,20 @@ PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen)
    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
    {
index a972b7759601c763317029bcbab91cce70b42258..f24b81868e8d747b3dfb65595b95b2e0a180c45a 100644 (file)
@@ -3,11 +3,11 @@
 
 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()
 
index 099f190908ff19784e73e2f57e68a43d7179407e..f51af1d6fd8842bfa5a55a1a58299ddaebbb77aa 100644 (file)
@@ -52,6 +52,7 @@ static ICorRuntimeHost *pHost;
 static mscorlib::_AppDomain *pDomain;
 
 static zend_class_entry dotnet_class_entry;
+static int codepage;
 
 HRESULT dotnet_init() {
   HRESULT hr;
@@ -112,12 +113,15 @@ PHP_FUNCTION(DOTNET_load)
 
        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);
index 7ab103d5df7d95b1d4140a2f846e31aa27a73335..f1af638d90cdee5ba1de85956e145002c39a563d 100644 (file)
@@ -81,6 +81,7 @@ PHP_FUNCTION(com_propget);
 PHP_FUNCTION(com_propput);
 
 static int le_idispatch;
+static int codepage;
 
 function_entry COM_functions[] = {
        PHP_FE(COM_load,                                                                NULL)
@@ -125,7 +126,7 @@ static char *php_string_from_clsid(const CLSID clsid)
        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;
@@ -210,7 +211,7 @@ PHP_INI_END()
    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;
@@ -221,6 +222,7 @@ PHP_FUNCTION(COM_load)
        switch (ZEND_NUM_ARGS()) {
                case 1:
                        getParameters(ht, 1, &module_name);
+                       codepage = CP_ACP;
                        break;
                case 2:
                        if (!INI_INT("allow_dcom")) {
@@ -229,6 +231,24 @@ PHP_FUNCTION(COM_load)
                        }
                        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;
@@ -236,7 +256,7 @@ PHP_FUNCTION(COM_load)
        }
 
        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);
 
@@ -257,7 +277,7 @@ PHP_FUNCTION(COM_load)
 
                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;
@@ -296,7 +316,7 @@ int do_COM_invoke(IDispatch *i_dispatch, pval *function_name, VARIANTARG *var_re
        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);
 
@@ -312,7 +332,7 @@ int do_COM_invoke(IDispatch *i_dispatch, pval *function_name, VARIANTARG *var_re
 
        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;
@@ -377,7 +397,7 @@ PHP_FUNCTION(COM_invoke)
        }
        efree(arguments);
 
-       php_variant_to_pval(&var_result, return_value, 0);
+       php_variant_to_pval(&var_result, return_value, 0, codepage);
 }
 /* }}} */
 
@@ -413,7 +433,7 @@ static int do_COM_propget(VARIANTARG *var_result, IDispatch *i_dispatch, pval *a
 
 
        /* 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);
 
@@ -465,7 +485,7 @@ static void do_COM_propput(pval *return_value, IDispatch *i_dispatch, pval *arg_
 
 
        /* 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);
 
@@ -478,7 +498,7 @@ static void do_COM_propput(pval *return_value, IDispatch *i_dispatch, pval *arg_
        }
 
 
-       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;
@@ -504,7 +524,7 @@ static void do_COM_propput(pval *return_value, IDispatch *i_dispatch, pval *arg_
 
 
        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);
@@ -539,7 +559,7 @@ PHP_FUNCTION(com_propget)
        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);
 }
 /* }}} */
 
@@ -638,7 +658,7 @@ PHPAPI pval php_COM_get_property_handler(zend_property_reference *property_refer
        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;
 }
 
@@ -747,7 +767,7 @@ PHPAPI void php_COM_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_pro
                }
                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);
@@ -775,7 +795,7 @@ static int php_COM_load_typelib(char *typelib_name, int mode)
        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);
@@ -799,7 +819,7 @@ static int php_COM_load_typelib(char *typelib_name, int mode)
                        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
@@ -818,10 +838,10 @@ static int php_COM_load_typelib(char *typelib_name, int mode)
                                        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);
index 219de13baa0bd177d2cdc969983c425e11d3a835..d0effd96e3266bfd0116dcb03b5bc943f2854897 100644 (file)
@@ -4,20 +4,17 @@
 #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;
 
@@ -83,68 +80,17 @@ PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg)
 
       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)
       {
@@ -207,25 +153,25 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_
 
          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
@@ -245,7 +191,7 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_
             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;
@@ -310,13 +256,13 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_
          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
@@ -336,7 +282,7 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_
             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
@@ -344,7 +290,7 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_
             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;
@@ -402,10 +348,9 @@ PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_
          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)
@@ -465,7 +410,7 @@ PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent
             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;
 
@@ -497,15 +442,15 @@ PHPAPI void php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent
          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);
          }
@@ -560,19 +505,19 @@ 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 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
    {
@@ -592,20 +537,20 @@ PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen)
    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
    {
index a972b7759601c763317029bcbab91cce70b42258..f24b81868e8d747b3dfb65595b95b2e0a180c45a 100644 (file)
@@ -3,11 +3,11 @@
 
 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()
 
index c923b507de3c48cda25ec5eeb6016c305917addf..ca7bdb4834e1c36bdda49ad53b187624e09f5e22 100644 (file)
@@ -42,6 +42,7 @@ static void php_variant_destructor(zend_rsrc_list_entry *rsrc);
 void php_register_VARIANT_class();
 
 static int le_variant;
+static int codepage;
 
 static zend_class_entry VARIANT_class_entry;
 
@@ -67,6 +68,39 @@ PHP_MINIT_FUNCTION(VARIANT)
 {
        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;
 }
@@ -86,7 +120,7 @@ void php_VARIANT_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_proper
        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);
@@ -98,11 +132,19 @@ void php_VARIANT_call_function_handler(INTERNAL_FUNCTION_PARAMETERS, zend_proper
                                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;
@@ -152,7 +194,7 @@ pval php_VARIANT_get_property_handler(zend_property_reference *property_referenc
 
                        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);
@@ -200,204 +242,168 @@ static int do_VARIANT_propset(VARIANT *var_arg, pval *arg_property, pval *value)
        
        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;
 }
 
index 099f190908ff19784e73e2f57e68a43d7179407e..f51af1d6fd8842bfa5a55a1a58299ddaebbb77aa 100644 (file)
@@ -52,6 +52,7 @@ static ICorRuntimeHost *pHost;
 static mscorlib::_AppDomain *pDomain;
 
 static zend_class_entry dotnet_class_entry;
+static int codepage;
 
 HRESULT dotnet_init() {
   HRESULT hr;
@@ -112,12 +113,15 @@ PHP_FUNCTION(DOTNET_load)
 
        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);