Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/LAVFilters.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2016-01-14 13:44:17 +0300
committerHendrik Leppkes <h.leppkes@gmail.com>2016-01-14 13:44:17 +0300
commit36101d6f43f1b4fdcacc16eb5abaa8589271f5b3 (patch)
tree897aee9d2fdb332cc0e0c90619182dd6e24184d1 /common
parent1013c924a821771be6326c3988d3533f09849a11 (diff)
Parse strings as ANSI when UTF8 fails
This may help to parse "wrong" metadata in some files.
Diffstat (limited to 'common')
-rw-r--r--common/DSUtilLite/DShowUtil.cpp27
1 files changed, 17 insertions, 10 deletions
diff --git a/common/DSUtilLite/DShowUtil.cpp b/common/DSUtilLite/DShowUtil.cpp
index ff5377c8..ffea3fe3 100644
--- a/common/DSUtilLite/DShowUtil.cpp
+++ b/common/DSUtilLite/DShowUtil.cpp
@@ -202,6 +202,13 @@ int SafeMultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr,
if (len == cchWideChar || (len == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
lpWideCharStr[cchWideChar - 1] = 0;
} else if (len == 0) {
+ DWORD dwErr = GetLastError();
+ if (dwErr == ERROR_NO_UNICODE_TRANSLATION && CodePage == CP_UTF8) {
+ return SafeMultiByteToWideChar(CP_ACP, dwFlags, lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar);
+ }
+ else if (dwErr == ERROR_NO_UNICODE_TRANSLATION && (dwFlags & MB_ERR_INVALID_CHARS)) {
+ return SafeMultiByteToWideChar(CP_UTF8, (dwFlags & ~MB_ERR_INVALID_CHARS), lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar);
+ }
lpWideCharStr[0] = 0;
}
}
@@ -230,6 +237,15 @@ LPWSTR CoTaskGetWideCharFromMultiByte(UINT CodePage, DWORD dwFlags, LPCSTR lpMul
return pszWideString;
}
+ else {
+ DWORD dwErr = GetLastError();
+ if (dwErr == ERROR_NO_UNICODE_TRANSLATION && CodePage == CP_UTF8) {
+ return CoTaskGetWideCharFromMultiByte(CP_ACP, dwFlags, lpMultiByteStr, cbMultiByte);
+ }
+ else if (dwErr == ERROR_NO_UNICODE_TRANSLATION && (dwFlags & MB_ERR_INVALID_CHARS)) {
+ return CoTaskGetWideCharFromMultiByte(CP_UTF8, (dwFlags & ~MB_ERR_INVALID_CHARS), lpMultiByteStr, cbMultiByte);
+ }
+ }
return NULL;
}
@@ -251,18 +267,9 @@ BSTR ConvertCharToBSTR(const char *sz)
if (!sz || strlen(sz) == 0)
return nullptr;
- int len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, sz, -1, nullptr, 0);
- if (len == 0) {
- acp = true;
- len = MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, sz, -1, nullptr, 0);
- if (len == 0)
- return nullptr;
- }
-
- WCHAR *wide = (WCHAR *)CoTaskMemAlloc(len * sizeof(WCHAR));
+ WCHAR *wide = CoTaskGetWideCharFromMultiByte(CP_UTF8, MB_ERR_INVALID_CHARS, sz, -1);
if (!wide)
return nullptr;
- MultiByteToWideChar(acp ? CP_ACP : CP_UTF8, MB_ERR_INVALID_CHARS, sz, -1, wide, len);
BSTR bstr = SysAllocString(wide);
CoTaskMemFree(wide);