crypt32: Add support for CERT_RDN_UNICODE_STRING (eterbug #5694).
authorAlexander Morozov <amorozov@etersoft.ru>
Thu, 19 Aug 2010 13:36:21 +0000 (17:36 +0400)
committerAlexander Morozov <amorozov@etersoft.ru>
Wed, 25 Aug 2010 15:53:10 +0000 (19:53 +0400)
dlls/crypt32/str.c

index 758abc9c0724658dac7cde62472c5cb279257704..899b8cb8e75ad6214aecbc275f917c12ac96e676 100644 (file)
@@ -62,6 +62,24 @@ DWORD WINAPI CertRDNValueToStrA(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue,
             }
         }
         break;
+    case CERT_RDN_UNICODE_STRING:
+    {
+        DWORD chars = 0;
+        LPCWSTR p = (LPWSTR)pValue->pbData;
+
+        if (p)
+            while (chars < pValue->cbData / sizeof(WCHAR) && *(p + chars))
+                ++chars;
+        if (!psz || !csz)
+            ret = WideCharToMultiByte(CP_ACP, 0, p, chars, NULL, 0, NULL, NULL);
+        else if (csz - 1)
+        {
+            ret = WideCharToMultiByte(CP_ACP, 0, p, chars, psz, csz - 1, NULL,
+             NULL);
+            csz -= ret;
+        }
+        break;
+    }
     case CERT_RDN_UTF8_STRING:
         if (!psz || !csz)
             ret = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)pValue->pbData,
@@ -124,6 +142,31 @@ DWORD WINAPI CertRDNValueToStrW(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue,
             }
         }
         break;
+    case CERT_RDN_UNICODE_STRING:
+    {
+        DWORD chars = 0;
+        LPCWSTR p = (LPWSTR)pValue->pbData;
+
+        if (p)
+            while (chars < pValue->cbData / sizeof(WCHAR) && *(p + chars))
+                ++chars;
+        if (!psz || !csz)
+            ret = chars;
+        else
+        {
+            chars = min(chars, csz - 1);
+            if (chars)
+            {
+                DWORD i;
+
+                for (i = 0; i < chars; i++)
+                    psz[i] = p[i];
+                ret += chars;
+                csz -= chars;
+            }
+        }
+        break;
+    }
     case CERT_RDN_UTF8_STRING:
         if (!psz || !csz)
             ret = pValue->cbData / sizeof(WCHAR);