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]

Reply via email to