Dmitry Timoshkov : propsys: Add support for VT_LPSTR and VT_LPWSTR to PropVariantCompareEx.

Alexandre Julliard julliard at winehq.org
Thu Jun 22 16:50:51 CDT 2017


Module: wine
Branch: master
Commit: ff9601147d88b04c99cd99629187d169d2111921
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ff9601147d88b04c99cd99629187d169d2111921

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Thu Jun 22 11:38:46 2017 +0800

propsys: Add support for VT_LPSTR and VT_LPWSTR to PropVariantCompareEx.

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/propsys/propvar.c       | 38 ++++++++++++++++++++++++++++++++++++--
 dlls/propsys/tests/propsys.c |  4 ++--
 2 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/dlls/propsys/propvar.c b/dlls/propsys/propvar.c
index 8a8698f..90e20e3 100644
--- a/dlls/propsys/propvar.c
+++ b/dlls/propsys/propvar.c
@@ -18,8 +18,12 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#include "config.h"
+#include "wine/port.h"
+
 #include <stdarg.h>
 #include <stdio.h>
+#include <stdlib.h>
 
 #define NONAMELESSUNION
 
@@ -112,6 +116,25 @@ static HRESULT PROPVAR_ConvertNumber(REFPROPVARIANT pv, int dest_bits,
         src_signed = FALSE;
         *res = 0;
         break;
+    case VT_LPSTR:
+    {
+        char *end;
+        *res = strtoll(pv->u.pszVal, &end, 0);
+        if (pv->u.pszVal == end)
+            return DISP_E_TYPEMISMATCH;
+        src_signed = *res < 0;
+        break;
+    }
+    case VT_LPWSTR:
+    case VT_BSTR:
+    {
+        WCHAR *end;
+        *res = strtolW(pv->u.pwszVal, &end, 0);
+        if (pv->u.pwszVal == end)
+            return DISP_E_TYPEMISMATCH;
+        src_signed = *res < 0;
+        break;
+    }
     default:
         FIXME("unhandled vt %d\n", pv->vt);
         return E_NOTIMPL;
@@ -698,8 +721,19 @@ INT WINAPI PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2
         CMP_INT_VALUE(uhVal.QuadPart);
         break;
     case VT_BSTR:
-        /* FIXME: Use string flags. */
-        res = lstrcmpW(propvar1->u.bstrVal, propvar2->u.bstrVal);
+    case VT_LPWSTR:
+        /* FIXME: Use other string flags. */
+        if (flags & (PVCF_USESTRCMPI | PVCF_USESTRCMPIC))
+            res = lstrcmpiW(propvar1->u.bstrVal, propvar2_converted->u.bstrVal);
+        else
+            res = lstrcmpW(propvar1->u.bstrVal, propvar2_converted->u.bstrVal);
+        break;
+    case VT_LPSTR:
+        /* FIXME: Use other string flags. */
+        if (flags & (PVCF_USESTRCMPI | PVCF_USESTRCMPIC))
+            res = lstrcmpiA(propvar1->u.pszVal, propvar2_converted->u.pszVal);
+        else
+            res = lstrcmpA(propvar1->u.pszVal, propvar2_converted->u.pszVal);
         break;
     default:
         FIXME("vartype %d not handled\n", propvar1->vt);
diff --git a/dlls/propsys/tests/propsys.c b/dlls/propsys/tests/propsys.c
index 71b6a93..54b45ac 100644
--- a/dlls/propsys/tests/propsys.c
+++ b/dlls/propsys/tests/propsys.c
@@ -735,10 +735,10 @@ static void test_PropVariantCompare(void)
     ok(res == 0, "res=%i\n", res);
 
     res = PropVariantCompareEx(&i2_2, &str_2, 0, 0);
-    todo_wine ok(res == 0, "res=%i\n", res);
+    ok(res == 0, "res=%i\n", res);
 
     res = PropVariantCompareEx(&i2_2, &str_02, 0, 0);
-    todo_wine ok(res == 0, "res=%i\n", res);
+    ok(res == 0, "res=%i\n", res);
 
     res = PropVariantCompareEx(&str_2, &i2_2, 0, 0);
     todo_wine ok(res == 0, "res=%i\n", res);




More information about the wine-cvs mailing list