phanto Fri Feb 16 18:15:12 2001 EDT Modified files: /php4/ext/com typedef_VARIANT.c conversion.h conversion.c COM.cpp Log: multiple codepage support export global constants
Index: php4/ext/com/typedef_VARIANT.c diff -u php4/ext/com/typedef_VARIANT.c:1.5 php4/ext/com/typedef_VARIANT.c:1.6 --- php4/ext/com/typedef_VARIANT.c:1.5 Mon Feb 5 13:59:16 2001 +++ php4/ext/com/typedef_VARIANT.c Fri Feb 16 18:15:12 2001 @@ -42,6 +42,7 @@ void php_register_VARIANT_class(); static int le_variant; +static int codepage; static zend_class_entry VARIANT_class_entry; @@ -67,6 +68,39 @@ { 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 @@ 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 @@ 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 @@ 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 @@ 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: php4/ext/com/conversion.h diff -u php4/ext/com/conversion.h:1.2 php4/ext/com/conversion.h:1.3 --- php4/ext/com/conversion.h:1.2 Mon Jan 29 13:54:09 2001 +++ php4/ext/com/conversion.h Fri Feb 16 18:15:12 2001 @@ -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: php4/ext/com/conversion.c diff -u php4/ext/com/conversion.c:1.5 php4/ext/com/conversion.c:1.6 --- php4/ext/com/conversion.c:1.5 Mon Feb 5 10:36:53 2001 +++ php4/ext/com/conversion.c Fri Feb 16 18:15:12 2001 @@ -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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 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 @@ 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: php4/ext/com/COM.cpp diff -u php4/ext/com/COM.cpp:1.2 php4/ext/com/COM.cpp:1.3 --- php4/ext/com/COM.cpp:1.2 Mon Jan 29 13:54:09 2001 +++ php4/ext/com/COM.cpp Fri Feb 16 18:15:12 2001 @@ -81,6 +81,7 @@ PHP_FUNCTION(com_propput); static int le_idispatch; +static int codepage; function_entry COM_functions[] = { PHP_FE(COM_load, NULL) @@ -125,7 +126,7 @@ 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 @@ 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 @@ switch (ZEND_NUM_ARGS()) { case 1: getParameters(ht, 1, &module_name); + codepage = CP_ACP; break; case 2: if (!INI_INT("allow_dcom")) { @@ -229,14 +231,32 @@ } 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; break; } 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 @@ 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 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 @@ 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 @@ } 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 @@ /* 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 @@ /* 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 @@ } - 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 @@ 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 @@ 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 @@ 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 @@ } 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 @@ 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 @@ 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 @@ 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);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]