diff options
| author | Ondřej Surý <ondrej@sury.org> | 2014-05-05 11:21:23 +0200 |
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2014-05-05 11:21:23 +0200 |
| commit | 4bbffbee21093458feadd96f93b96d4627461cff (patch) | |
| tree | d316b17d64aede352ae0a336c23238b8756004e6 /ext/com_dotnet | |
| parent | 9566c3fcaf4cfaa866ea395ee5d1a480785fef0d (diff) | |
| download | php-4bbffbee21093458feadd96f93b96d4627461cff.tar.gz | |
New upstream version 5.6.0~beta2+dfsgupstream/5.6.0_beta2+dfsg
Diffstat (limited to 'ext/com_dotnet')
| -rw-r--r-- | ext/com_dotnet/com_olechar.c | 6 | ||||
| -rw-r--r-- | ext/com_dotnet/com_variant.c | 8 | ||||
| -rw-r--r-- | ext/com_dotnet/tests/bug66431_0.phpt | 42 | ||||
| -rw-r--r-- | ext/com_dotnet/tests/bug66431_1.phpt | 60 |
4 files changed, 114 insertions, 2 deletions
diff --git a/ext/com_dotnet/com_olechar.c b/ext/com_dotnet/com_olechar.c index a3e81978b..bf42b4fff 100644 --- a/ext/com_dotnet/com_olechar.c +++ b/ext/com_dotnet/com_olechar.c @@ -46,7 +46,13 @@ PHP_COM_DOTNET_API OLECHAR *php_com_string_to_olestring(char *string, uint strin if (string_len > 0) { olestring = (OLECHAR*)safe_emalloc(string_len, sizeof(OLECHAR), 0); + /* XXX if that's a real multibyte string, olestring is obviously allocated excessively. + This should be fixed by reallocating the olestring, but as emalloc is used, that doesn't + matter much. */ ok = MultiByteToWideChar(codepage, flags, string, string_len, olestring, string_len); + if (ok > 0 && ok < string_len) { + olestring[ok] = '\0'; + } } else { ok = FALSE; olestring = (OLECHAR*)emalloc(sizeof(OLECHAR)); diff --git a/ext/com_dotnet/com_variant.c b/ext/com_dotnet/com_variant.c index 4e044b20b..3cc057127 100644 --- a/ext/com_dotnet/com_variant.c +++ b/ext/com_dotnet/com_variant.c @@ -154,13 +154,17 @@ PHP_COM_DOTNET_API void php_com_variant_from_zval(VARIANT *v, zval *z, int codep case IS_STRING: V_VT(v) = VT_BSTR; olestring = php_com_string_to_olestring(Z_STRVAL_P(z), Z_STRLEN_P(z), codepage TSRMLS_CC); - V_BSTR(v) = SysAllocStringByteLen((char*)olestring, Z_STRLEN_P(z) * sizeof(OLECHAR)); + if (CP_UTF8 == codepage) { + V_BSTR(v) = SysAllocStringByteLen((char*)olestring, wcslen(olestring) * sizeof(OLECHAR)); + } else { + V_BSTR(v) = SysAllocStringByteLen((char*)olestring, Z_STRLEN_P(z) * sizeof(OLECHAR)); + } efree(olestring); break; case IS_RESOURCE: case IS_CONSTANT: - case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: default: V_VT(v) = VT_NULL; break; diff --git a/ext/com_dotnet/tests/bug66431_0.phpt b/ext/com_dotnet/tests/bug66431_0.phpt new file mode 100644 index 000000000..daac32853 --- /dev/null +++ b/ext/com_dotnet/tests/bug66431_0.phpt @@ -0,0 +1,42 @@ +--TEST-- +Bug #66431 Special Character via COM Interface (CP_UTF8), Scripting.FileSystemObject +--SKIPIF-- +<?php +if (!extension_loaded("com_dotnet")){ echo "skip COM/.Net support not present"; } +?> +--FILE-- +<?php + +$text= "Xin chào cộng đồng PHP"; +$fpath = str_replace("/", "\\", dirname(__FILE__) . "/bug66431.txt"); + +$fso = new COM("Scripting.FileSystemObject"); +$fh = $fso->OpenTextFile($fpath, 2, true); +$fh->Write($text); +$fh->Close(); + +$check_text = file_get_contents($fpath); + +$result = ($check_text == $text); + +var_dump($result); + +if (!$result) { + echo "Expected: '$check_text'\n"; + echo "Have: '$text'\n"; +} + +?> +===DONE=== +--CLEAN-- +<?php + +$fpath = str_replace("/", "\\", dirname(__FILE__) . "/bug66431.txt"); + +if (file_exists($fpath)) { + unlink($fpath); +} +?> +--EXPECT-- +bool(true) +===DONE=== diff --git a/ext/com_dotnet/tests/bug66431_1.phpt b/ext/com_dotnet/tests/bug66431_1.phpt new file mode 100644 index 000000000..d97011c2b --- /dev/null +++ b/ext/com_dotnet/tests/bug66431_1.phpt @@ -0,0 +1,60 @@ +--TEST-- +Bug #66431 Special Character via COM Interface (CP_UTF8), Application.Word +--SKIPIF-- +<?php +if (!extension_loaded("com_dotnet")){ echo "skip COM/.Net support not present"; } + +try { + new COM("word.application", NULL, CP_UTF8); +} catch (Exception $e) { + die('skip ' . $e->getMessage(); +} + +?> +--FILE-- +<?php + +$text= "Xin chào cộng đồng PHP"; +$fpath = str_replace("/", "\\", dirname(__FILE__) . "/bug66431.docx"); + +com_load_typelib('Word.Application'); + +$Wrd = new COM("word.application", NULL, CP_UTF8); +$Wrd->Documents->Add(); +$Wrd->Selection->TypeText($text); +$Wrd->ActiveDocument->SaveAs($fpath); +$Wrd->ActiveDocument->Close(false); +$Wrd->Application->Quit(); +unset($Wrd); + +$Wrd = new COM("word.application", NULL, CP_UTF8); +$Wrd->Documents->Open($fpath, NULL, false); +$check_text = $Wrd->ActiveDocument->Range($Wrd->ActiveDocument->Sentences(1)->Start, $Wrd->ActiveDocument->Sentences(1)->End)->Text; +$Wrd->ActiveDocument->Close(false); +$Wrd->Application->Quit(); +unset($Wrd); + +/* trim the returned text as we'll get windows eol from a word doc. */ +$result = (trim($check_text) == $text); + +var_dump($result); + +if (!$result) { + echo "Expected: '$check_text'\n"; + echo "Have: '$text'\n"; +} + +?> +===DONE=== +--CLEAN-- +<?php + +$fpath = str_replace("/", "\\", dirname(__FILE__) . "/bug66431.docx"); + +if (file_exists($fpath)) { + unlink($fpath); +} +?> +--EXPECT-- +bool(true) +===DONE=== |
