switch (hr) {
case DISP_E_EXCEPTION: {
int srclen;
- char *src = php_OLECHAR_to_char(ExceptInfo.bstrSource, &srclen, 1, codepage TSRMLS_CC);
+ char *src = php_OLECHAR_to_char(ExceptInfo.bstrSource, &srclen, codepage TSRMLS_CC);
int desclen;
- char *desc = php_OLECHAR_to_char(ExceptInfo.bstrDescription, &desclen, 1, codepage TSRMLS_CC);
+ char *desc = php_OLECHAR_to_char(ExceptInfo.bstrDescription, &desclen, codepage TSRMLS_CC);
+
*ErrString = pemalloc(srclen+desclen+50, 1);
sprintf(*ErrString, "<b>Source</b>: %s <b>Description</b>: %s", src, desc);
- pefree(src, 1);
- pefree(desc, 1);
+ efree(src);
+ efree(desc);
SysFreeString(ExceptInfo.bstrSource);
SysFreeString(ExceptInfo.bstrDescription);
SysFreeString(ExceptInfo.bstrHelpFile);
char *clsid_str;
StringFromCLSID(clsid, &ole_clsid);
- clsid_str = php_OLECHAR_to_char(ole_clsid, NULL, 0, codepage TSRMLS_CC);
+ clsid_str = php_OLECHAR_to_char(ole_clsid, NULL, codepage TSRMLS_CC);
LocalFree(ole_clsid);
return clsid_str;
ITypeLib *pTL;
char *typelib_name;
char *modifier, *ptr;
- int mode = CONST_CS;
+ int mode = CONST_CS | CONST_PERSISTENT;
if (typelib_name_buffer[0]==';') {
continue;
RETURN_FALSE;
}
- php_variant_to_pval(var_result, return_value, FALSE, codepage TSRMLS_CC);
+ php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
FREE_VARIANT(var_result);
efree(arguments);
hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYGET, &dispparams, var_result, &ErrString TSRMLS_CC);
if (SUCCEEDED(hr)) {
- php_variant_to_pval(var_result, return_value, FALSE, codepage TSRMLS_CC);
+ php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
} else {
*return_value = *value;
zval_copy_ctor(return_value);
RETURN_FALSE;
}
- php_variant_to_pval(var_result, return_value, FALSE, codepage TSRMLS_CC);
+ php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
FREE_VARIANT(var_result);
}
obj = obj_prop;
php_COM_set(obj, &V_DISPATCH(var_result), TRUE TSRMLS_CC);
} else {
- php_variant_to_pval(var_result, &return_value, FALSE, codepage TSRMLS_CC);
+ php_variant_to_pval(var_result, &return_value, codepage TSRMLS_CC);
FREE_COM(obj_prop);
obj_prop = NULL;
if (do_COM_invoke(obj , &function_name->element, var_result, arguments, arg_count TSRMLS_CC) == FAILURE) {
RETVAL_FALSE;
} else {
- php_variant_to_pval(var_result, return_value, FALSE, codepage TSRMLS_CC);
+ php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
}
FREE_VARIANT(var_result);
char *EnumId;
TypeLib->lpVtbl->GetDocumentation(TypeLib, i, &bstr_EnumId, NULL, NULL, NULL);
- EnumId = php_OLECHAR_to_char(bstr_EnumId, NULL, 0, codepage);
+ EnumId = php_OLECHAR_to_char(bstr_EnumId, NULL, codepage);
printf("Enumeration %d - %s:\n", i, EnumId);
efree(EnumId);
#endif
j=0;
while(SUCCEEDED(TypeInfo->lpVtbl->GetVarDesc(TypeInfo, j, &pVarDesc))) {
BSTR bstr_ids;
- char *ids;
zend_constant c;
zval exists, results;
+ char *const_name;
TypeInfo->lpVtbl->GetNames(TypeInfo, pVarDesc->memid, &bstr_ids, 1, &NameCount);
if (NameCount!=1) {
j++;
continue;
}
- ids = php_OLECHAR_to_char(bstr_ids, NULL, TRUE, codepage TSRMLS_CC);
+ const_name = php_OLECHAR_to_char(bstr_ids, &c.name_len, codepage TSRMLS_CC);
+ c.name = zend_strndup(const_name, c.name_len);
+ efree(const_name);
+ c.name_len++; /* length should include the NULL */
SysFreeString(bstr_ids);
- c.name_len = strlen(ids)+1;
- c.name = ids;
/* Before registering the contsnt, let's see if we can find it */
if (zend_get_constant(c.name, c.name_len-1, &exists TSRMLS_CC)) {
if (!compare_function(&results, &c.value, &exists TSRMLS_CC) && INI_INT("com.autoregister_verbose")) {
php_error(E_WARNING,"Type library value %s is already defined and has a different value", c.name);
}
- free(ids);
+ free(c.name);
j++;
continue;
}
- php_variant_to_pval(pVarDesc->lpvarValue, &c.value, mode & CONST_PERSISTENT, codepage TSRMLS_CC);
+ php_variant_to_pval(pVarDesc->lpvarValue, &c.value, codepage TSRMLS_CC);
+ if (mode & CONST_PERSISTENT) {
+ zval_persist(&c.value TSRMLS_CC);
+ mode |= CONST_EFREE_PERSISTENT;
+ }
c.flags = mode;
zend_register_constant(&c TSRMLS_CC);
case OE_IS_OBJECT:
if (!strcmp(overloaded_property->element.value.str.val, "value")) {
- php_variant_to_pval(var_arg, &result, 0, codepage TSRMLS_CC);
+ php_variant_to_pval(var_arg, &result, codepage TSRMLS_CC);
} else if (!strcmp(Z_STRVAL(overloaded_property->element), "type")) {
ZVAL_LONG(&result, V_VT(var_arg))
} else {
}
-PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent, int codepage TSRMLS_DC)
+PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int codepage TSRMLS_DC)
{
/* Changed the function to return a value for recursive error testing */
/* Existing calls will be unaffected by the change - so it */
/* If SafeArrayGetElement proclaims to allocate */
/* memory for a BSTR, so the recursive call frees */
/* the string correctly */
- if (FAILURE == php_variant_to_pval(&vv, element, persistent, codepage TSRMLS_CC)) {
+ if (FAILURE == php_variant_to_pval(&vv, element, codepage TSRMLS_CC)) {
/* Error occurred setting up array element */
/* Error was displayed by the recursive call */
FREE_ZVAL(element);
OLECHAR *unicode_str;
switch (VarBstrFromDec(&V_DECIMAL(var_arg), LOCALE_SYSTEM_DEFAULT, 0, &unicode_str)) {
case S_OK:
- Z_STRVAL_P(pval_arg) = php_OLECHAR_to_char(unicode_str, &Z_STRLEN_P(pval_arg), persistent, codepage TSRMLS_CC);
+ Z_STRVAL_P(pval_arg) = php_OLECHAR_to_char(unicode_str, &Z_STRLEN_P(pval_arg), codepage TSRMLS_CC);
Z_TYPE_P(pval_arg) = IS_STRING;
break;
break;
case VT_VARIANT:
- php_variant_to_pval(V_VARIANTREF(var_arg), pval_arg, persistent, codepage TSRMLS_CC);
+ php_variant_to_pval(V_VARIANTREF(var_arg), pval_arg, codepage TSRMLS_CC);
break;
case VT_BSTR:
if (V_ISBYREF(var_arg)) {
- Z_STRVAL_P(pval_arg) = php_OLECHAR_to_char(*V_BSTRREF(var_arg), &Z_STRLEN_P(pval_arg), persistent, codepage TSRMLS_CC);
+ Z_STRVAL_P(pval_arg) = php_OLECHAR_to_char(*V_BSTRREF(var_arg), &Z_STRLEN_P(pval_arg), codepage TSRMLS_CC);
efree(V_BSTRREF(var_arg));
} else {
- Z_STRVAL_P(pval_arg) = php_OLECHAR_to_char(V_BSTR(var_arg), &Z_STRLEN_P(pval_arg), persistent, codepage TSRMLS_CC);
+ Z_STRVAL_P(pval_arg) = php_OLECHAR_to_char(V_BSTR(var_arg), &Z_STRLEN_P(pval_arg), codepage TSRMLS_CC);
}
Z_TYPE_P(pval_arg) = IS_STRING;
}
-PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent, int codepage TSRMLS_DC)
+PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int codepage TSRMLS_DC)
{
char *C_str;
uint length = 0;
uint reqSize = WideCharToMultiByte(codepage, WC_COMPOSITECHECK, unicode_str, -1, NULL, 0, NULL, NULL);
if (reqSize) {
- C_str = (char *) pemalloc(sizeof(char) * reqSize, persistent);
+ C_str = (char *) emalloc(sizeof(char) * reqSize);
/* convert string */
length = WideCharToMultiByte(codepage, WC_COMPOSITECHECK, unicode_str, -1, C_str, reqSize, NULL, NULL) - 1;
} else {
- C_str = (char *) pemalloc(sizeof(char), persistent);
+ C_str = (char *) emalloc(sizeof(char));
*C_str = 0;
php_error(E_WARNING,"Error in php_OLECHAR_to_char()");
PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage TSRMLS_DC);
PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type, int codepage TSRMLS_DC);
-PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent, int codepage TSRMLS_DC);
+PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int codepage TSRMLS_DC);
PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen, int codepage TSRMLS_DC);
-PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent, int codepage TSRMLS_DC);
+PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int codepage TSRMLS_DC);
END_EXTERN_C()
switch (hr) {
case DISP_E_EXCEPTION: {
int srclen;
- char *src = php_OLECHAR_to_char(ExceptInfo.bstrSource, &srclen, 1, codepage TSRMLS_CC);
+ char *src = php_OLECHAR_to_char(ExceptInfo.bstrSource, &srclen, codepage TSRMLS_CC);
int desclen;
- char *desc = php_OLECHAR_to_char(ExceptInfo.bstrDescription, &desclen, 1, codepage TSRMLS_CC);
+ char *desc = php_OLECHAR_to_char(ExceptInfo.bstrDescription, &desclen, codepage TSRMLS_CC);
+
*ErrString = pemalloc(srclen+desclen+50, 1);
sprintf(*ErrString, "<b>Source</b>: %s <b>Description</b>: %s", src, desc);
- pefree(src, 1);
- pefree(desc, 1);
+ efree(src);
+ efree(desc);
SysFreeString(ExceptInfo.bstrSource);
SysFreeString(ExceptInfo.bstrDescription);
SysFreeString(ExceptInfo.bstrHelpFile);
char *clsid_str;
StringFromCLSID(clsid, &ole_clsid);
- clsid_str = php_OLECHAR_to_char(ole_clsid, NULL, 0, codepage TSRMLS_CC);
+ clsid_str = php_OLECHAR_to_char(ole_clsid, NULL, codepage TSRMLS_CC);
LocalFree(ole_clsid);
return clsid_str;
ITypeLib *pTL;
char *typelib_name;
char *modifier, *ptr;
- int mode = CONST_CS;
+ int mode = CONST_CS | CONST_PERSISTENT;
if (typelib_name_buffer[0]==';') {
continue;
RETURN_FALSE;
}
- php_variant_to_pval(var_result, return_value, FALSE, codepage TSRMLS_CC);
+ php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
FREE_VARIANT(var_result);
efree(arguments);
hr = php_COM_invoke(obj, dispid, DISPATCH_PROPERTYGET, &dispparams, var_result, &ErrString TSRMLS_CC);
if (SUCCEEDED(hr)) {
- php_variant_to_pval(var_result, return_value, FALSE, codepage TSRMLS_CC);
+ php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
} else {
*return_value = *value;
zval_copy_ctor(return_value);
RETURN_FALSE;
}
- php_variant_to_pval(var_result, return_value, FALSE, codepage TSRMLS_CC);
+ php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
FREE_VARIANT(var_result);
}
obj = obj_prop;
php_COM_set(obj, &V_DISPATCH(var_result), TRUE TSRMLS_CC);
} else {
- php_variant_to_pval(var_result, &return_value, FALSE, codepage TSRMLS_CC);
+ php_variant_to_pval(var_result, &return_value, codepage TSRMLS_CC);
FREE_COM(obj_prop);
obj_prop = NULL;
if (do_COM_invoke(obj , &function_name->element, var_result, arguments, arg_count TSRMLS_CC) == FAILURE) {
RETVAL_FALSE;
} else {
- php_variant_to_pval(var_result, return_value, FALSE, codepage TSRMLS_CC);
+ php_variant_to_pval(var_result, return_value, codepage TSRMLS_CC);
}
FREE_VARIANT(var_result);
char *EnumId;
TypeLib->lpVtbl->GetDocumentation(TypeLib, i, &bstr_EnumId, NULL, NULL, NULL);
- EnumId = php_OLECHAR_to_char(bstr_EnumId, NULL, 0, codepage);
+ EnumId = php_OLECHAR_to_char(bstr_EnumId, NULL, codepage);
printf("Enumeration %d - %s:\n", i, EnumId);
efree(EnumId);
#endif
j=0;
while(SUCCEEDED(TypeInfo->lpVtbl->GetVarDesc(TypeInfo, j, &pVarDesc))) {
BSTR bstr_ids;
- char *ids;
zend_constant c;
zval exists, results;
+ char *const_name;
TypeInfo->lpVtbl->GetNames(TypeInfo, pVarDesc->memid, &bstr_ids, 1, &NameCount);
if (NameCount!=1) {
j++;
continue;
}
- ids = php_OLECHAR_to_char(bstr_ids, NULL, TRUE, codepage TSRMLS_CC);
+ const_name = php_OLECHAR_to_char(bstr_ids, &c.name_len, codepage TSRMLS_CC);
+ c.name = zend_strndup(const_name, c.name_len);
+ efree(const_name);
+ c.name_len++; /* length should include the NULL */
SysFreeString(bstr_ids);
- c.name_len = strlen(ids)+1;
- c.name = ids;
/* Before registering the contsnt, let's see if we can find it */
if (zend_get_constant(c.name, c.name_len-1, &exists TSRMLS_CC)) {
if (!compare_function(&results, &c.value, &exists TSRMLS_CC) && INI_INT("com.autoregister_verbose")) {
php_error(E_WARNING,"Type library value %s is already defined and has a different value", c.name);
}
- free(ids);
+ free(c.name);
j++;
continue;
}
- php_variant_to_pval(pVarDesc->lpvarValue, &c.value, mode & CONST_PERSISTENT, codepage TSRMLS_CC);
+ php_variant_to_pval(pVarDesc->lpvarValue, &c.value, codepage TSRMLS_CC);
+ if (mode & CONST_PERSISTENT) {
+ zval_persist(&c.value TSRMLS_CC);
+ mode |= CONST_EFREE_PERSISTENT;
+ }
c.flags = mode;
zend_register_constant(&c TSRMLS_CC);
}
-PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent, int codepage TSRMLS_DC)
+PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int codepage TSRMLS_DC)
{
/* Changed the function to return a value for recursive error testing */
/* Existing calls will be unaffected by the change - so it */
/* If SafeArrayGetElement proclaims to allocate */
/* memory for a BSTR, so the recursive call frees */
/* the string correctly */
- if (FAILURE == php_variant_to_pval(&vv, element, persistent, codepage TSRMLS_CC)) {
+ if (FAILURE == php_variant_to_pval(&vv, element, codepage TSRMLS_CC)) {
/* Error occurred setting up array element */
/* Error was displayed by the recursive call */
FREE_ZVAL(element);
OLECHAR *unicode_str;
switch (VarBstrFromDec(&V_DECIMAL(var_arg), LOCALE_SYSTEM_DEFAULT, 0, &unicode_str)) {
case S_OK:
- Z_STRVAL_P(pval_arg) = php_OLECHAR_to_char(unicode_str, &Z_STRLEN_P(pval_arg), persistent, codepage TSRMLS_CC);
+ Z_STRVAL_P(pval_arg) = php_OLECHAR_to_char(unicode_str, &Z_STRLEN_P(pval_arg), codepage TSRMLS_CC);
Z_TYPE_P(pval_arg) = IS_STRING;
break;
break;
case VT_VARIANT:
- php_variant_to_pval(V_VARIANTREF(var_arg), pval_arg, persistent, codepage TSRMLS_CC);
+ php_variant_to_pval(V_VARIANTREF(var_arg), pval_arg, codepage TSRMLS_CC);
break;
case VT_BSTR:
if (V_ISBYREF(var_arg)) {
- Z_STRVAL_P(pval_arg) = php_OLECHAR_to_char(*V_BSTRREF(var_arg), &Z_STRLEN_P(pval_arg), persistent, codepage TSRMLS_CC);
+ Z_STRVAL_P(pval_arg) = php_OLECHAR_to_char(*V_BSTRREF(var_arg), &Z_STRLEN_P(pval_arg), codepage TSRMLS_CC);
efree(V_BSTRREF(var_arg));
} else {
- Z_STRVAL_P(pval_arg) = php_OLECHAR_to_char(V_BSTR(var_arg), &Z_STRLEN_P(pval_arg), persistent, codepage TSRMLS_CC);
+ Z_STRVAL_P(pval_arg) = php_OLECHAR_to_char(V_BSTR(var_arg), &Z_STRLEN_P(pval_arg), codepage TSRMLS_CC);
}
Z_TYPE_P(pval_arg) = IS_STRING;
}
-PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent, int codepage TSRMLS_DC)
+PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int codepage TSRMLS_DC)
{
char *C_str;
uint length = 0;
uint reqSize = WideCharToMultiByte(codepage, WC_COMPOSITECHECK, unicode_str, -1, NULL, 0, NULL, NULL);
if (reqSize) {
- C_str = (char *) pemalloc(sizeof(char) * reqSize, persistent);
+ C_str = (char *) emalloc(sizeof(char) * reqSize);
/* convert string */
length = WideCharToMultiByte(codepage, WC_COMPOSITECHECK, unicode_str, -1, C_str, reqSize, NULL, NULL) - 1;
} else {
- C_str = (char *) pemalloc(sizeof(char), persistent);
+ C_str = (char *) emalloc(sizeof(char));
*C_str = 0;
php_error(E_WARNING,"Error in php_OLECHAR_to_char()");
PHPAPI void php_pval_to_variant(pval *pval_arg, VARIANT *var_arg, int codepage TSRMLS_DC);
PHPAPI void php_pval_to_variant_ex(pval *pval_arg, VARIANT *var_arg, pval *pval_type, int codepage TSRMLS_DC);
-PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int persistent, int codepage TSRMLS_DC);
+PHPAPI int php_variant_to_pval(VARIANT *var_arg, pval *pval_arg, int codepage TSRMLS_DC);
PHPAPI OLECHAR *php_char_to_OLECHAR(char *C_str, uint strlen, int codepage TSRMLS_DC);
-PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int persistent, int codepage TSRMLS_DC);
+PHPAPI char *php_OLECHAR_to_char(OLECHAR *unicode_str, uint *out_length, int codepage TSRMLS_DC);
END_EXTERN_C()
case OE_IS_OBJECT:
if (!strcmp(overloaded_property->element.value.str.val, "value")) {
- php_variant_to_pval(var_arg, &result, 0, codepage TSRMLS_CC);
+ php_variant_to_pval(var_arg, &result, codepage TSRMLS_CC);
} else if (!strcmp(Z_STRVAL(overloaded_property->element), "type")) {
ZVAL_LONG(&result, V_VT(var_arg))
} else {