shcore: Implement a bunch of string conversion functions.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2018-11-29 12:06:11 +03:00 committed by Alexandre Julliard
parent 007414ec65
commit ea0dbc753f
3 changed files with 276 additions and 4 deletions

View File

@ -1455,3 +1455,93 @@ HRESULT WINAPI SHStrDupA(const char *src, WCHAR **dest)
return S_OK;
}
/*************************************************************************
* SHAnsiToAnsi [SHCORE.@]
*/
DWORD WINAPI SHAnsiToAnsi(const char *src, char *dest, int dest_len)
{
DWORD ret;
TRACE("(%s, %p, %d)\n", debugstr_a(src), dest, dest_len);
if (!src || !dest || dest_len <= 0)
return 0;
lstrcpynA(dest, src, dest_len);
ret = strlen(dest);
return src[ret] ? 0 : ret + 1;
}
/*************************************************************************
* SHUnicodeToAnsi [SHCORE.@]
*/
DWORD WINAPI SHUnicodeToAnsi(const WCHAR *src, char *dest, int dest_len)
{
int ret = 1;
TRACE("(%s, %p, %d)\n", debugstr_w(src), dest, dest_len);
if (!dest || !dest_len)
return 0;
if (src)
{
ret = WideCharToMultiByte(CP_ACP, 0, src, -1, dest, dest_len, NULL, NULL);
if (!ret)
{
dest[dest_len - 1] = 0;
ret = dest_len;
}
}
else
dest[0] = 0;
return ret;
}
/*************************************************************************
* SHUnicodeToUnicode [SHCORE.@]
*/
DWORD WINAPI SHUnicodeToUnicode(const WCHAR *src, WCHAR *dest, int dest_len)
{
DWORD ret;
TRACE("(%s, %p, %d)\n", debugstr_w(src), dest, dest_len);
if (!src || !dest || dest_len <= 0)
return 0;
lstrcpynW(dest, src, dest_len);
ret = strlenW(dest);
return src[ret] ? 0 : ret + 1;
}
/*************************************************************************
* SHAnsiToUnicode [SHCORE.@]
*/
DWORD WINAPI SHAnsiToUnicode(const char *src, WCHAR *dest, int dest_len)
{
int ret = 1;
TRACE("(%s, %p, %d)\n", debugstr_a(src), dest, dest_len);
if (!dest || !dest_len)
return 0;
if (src)
{
ret = MultiByteToWideChar(CP_ACP, 0, src, -1, dest, dest_len);
if (!ret)
{
dest[dest_len - 1] = 0;
ret = dest_len;
}
}
else
dest[0] = 0;
return ret;
}

View File

@ -29,8 +29,8 @@
@ stub RegisterScaleChangeEvent
@ stub RegisterScaleChangeNotifications
@ stub RevokeScaleChangeNotifications
@ stdcall SHAnsiToAnsi(str ptr long) shlwapi.SHAnsiToAnsi
@ stdcall SHAnsiToUnicode(str ptr long) shlwapi.SHAnsiToUnicode
@ stdcall SHAnsiToAnsi(str ptr long)
@ stdcall SHAnsiToUnicode(str ptr long)
@ stdcall SHCopyKeyA(long str long long) shlwapi.SHCopyKeyA
@ stdcall SHCopyKeyW(long wstr long long) shlwapi.SHCopyKeyW
@ stdcall SHCreateMemStream(ptr long)
@ -75,8 +75,8 @@
@ stdcall SHSetValueW(long wstr wstr long ptr long) shlwapi.SHSetValueW
@ stdcall SHStrDupA(str ptr)
@ stdcall SHStrDupW(wstr ptr)
@ stdcall SHUnicodeToAnsi(wstr ptr ptr) shlwapi.SHUnicodeToAnsi
@ stdcall SHUnicodeToUnicode(wstr ptr long) shlwapi.SHUnicodeToUnicode
@ stdcall SHUnicodeToAnsi(wstr ptr ptr)
@ stdcall SHUnicodeToUnicode(wstr ptr long)
@ stdcall SetCurrentProcessExplicitAppUserModelID(wstr)
@ stdcall SetProcessDpiAwareness(long)
@ stdcall SetProcessReference(ptr)

View File

@ -29,12 +29,20 @@
static HRESULT (WINAPI *pGetProcessReference)(IUnknown **);
static void (WINAPI *pSetProcessReference)(IUnknown *);
static HRESULT (WINAPI *pSHGetInstanceExplorer)(IUnknown **);
static int (WINAPI *pSHUnicodeToAnsi)(const WCHAR *, char *, int);
static int (WINAPI *pSHAnsiToUnicode)(const char *, WCHAR *, int);
static int (WINAPI *pSHAnsiToAnsi)(const char *, char *, int);
static int (WINAPI *pSHUnicodeToUnicode)(const WCHAR *, WCHAR *, int);
static void init(HMODULE hshcore)
{
#define X(f) p##f = (void*)GetProcAddress(hshcore, #f)
X(GetProcessReference);
X(SetProcessReference);
X(SHUnicodeToAnsi);
X(SHAnsiToUnicode);
X(SHAnsiToAnsi);
X(SHUnicodeToUnicode);
#undef X
}
@ -122,6 +130,176 @@ static void test_process_reference(void)
ok(test_unk2.refcount == 3, "Unexpected refcount %u.\n", test_unk2.refcount);
}
static void test_SHUnicodeToAnsi(void)
{
static const WCHAR testW[] = {'t','e','s','t',0};
static const WCHAR emptyW[] = { 0 };
char buff[16];
int ret;
ret = pSHUnicodeToAnsi(NULL, NULL, 0);
ok(ret == 0, "Unexpected return value %d.\n", ret);
strcpy(buff, "abc");
ret = pSHUnicodeToAnsi(NULL, buff, 2);
ok(ret == 1, "Unexpected return value %d.\n", ret);
ok(buff[0] == 0 && buff[1] == 'b', "Unexpected buffer contents.\n");
buff[0] = 1;
ret = pSHUnicodeToAnsi(NULL, buff, 0);
ok(ret == 0, "Unexpected return value %d.\n", ret);
ok(buff[0] == 1, "Unexpected buffer contents.\n");
buff[0] = 1;
strcpy(buff, "test");
ret = pSHUnicodeToAnsi(emptyW, buff, 1);
ok(ret == 1, "Unexpected return value %d.\n", ret);
ok(*buff == 0, "Unexpected buffer contents.\n");
buff[0] = 1;
ret = pSHUnicodeToAnsi(testW, buff, 0);
ok(ret == 0, "Unexpected return value %d.\n", ret);
ok(buff[0] == 1, "Unexpected buffer contents.\n");
buff[0] = 1;
ret = pSHUnicodeToAnsi(testW, buff, 1);
ok(ret == 1, "Unexpected return value %d.\n", ret);
ok(*buff == 0, "Unexpected buffer contents.\n");
ret = pSHUnicodeToAnsi(testW, buff, 16);
ok(ret == 5, "Unexpected return value %d.\n", ret);
ok(!strcmp(buff, "test"), "Unexpected buffer contents.\n");
ret = pSHUnicodeToAnsi(testW, buff, 2);
ok(ret == 2, "Unexpected return value %d.\n", ret);
ok(!strcmp(buff, "t"), "Unexpected buffer contents.\n");
}
static void test_SHAnsiToUnicode(void)
{
static const WCHAR testW[] = {'t','e','s','t',0};
WCHAR buffW[16];
int ret;
ret = pSHAnsiToUnicode(NULL, NULL, 0);
ok(ret == 0, "Unexpected return value %d.\n", ret);
buffW[0] = 1;
buffW[1] = 2;
ret = pSHAnsiToUnicode(NULL, buffW, 2);
ok(ret == 1, "Unexpected return value %d.\n", ret);
ok(buffW[0] == 0 && buffW[1] == 2, "Unexpected buffer contents.\n");
buffW[0] = 1;
ret = pSHAnsiToUnicode(NULL, buffW, 0);
ok(ret == 0, "Unexpected return value %d.\n", ret);
ok(buffW[0] == 1, "Unexpected buffer contents.\n");
buffW[0] = 1;
ret = pSHAnsiToUnicode("", buffW, 1);
ok(ret == 1, "Unexpected return value %d.\n", ret);
ok(*buffW == 0, "Unexpected buffer contents.\n");
buffW[0] = 1;
ret = pSHAnsiToUnicode("test", buffW, 0);
ok(ret == 0, "Unexpected return value %d.\n", ret);
ok(buffW[0] == 1, "Unexpected buffer contents.\n");
buffW[0] = 1;
ret = pSHAnsiToUnicode("test", buffW, 1);
ok(ret == 1, "Unexpected return value %d.\n", ret);
ok(*buffW == 0, "Unexpected buffer contents.\n");
ret = pSHAnsiToUnicode("test", buffW, 16);
ok(ret == 5, "Unexpected return value %d.\n", ret);
ok(!lstrcmpW(buffW, testW), "Unexpected buffer contents.\n");
ret = pSHAnsiToUnicode("test", buffW, 2);
ok(ret == 2, "Unexpected return value %d.\n", ret);
ok(buffW[0] == 't' && buffW[1] == 0, "Unexpected buffer contents.\n");
}
static void test_SHAnsiToAnsi(void)
{
char buff[16];
int ret;
ret = pSHAnsiToAnsi(NULL, NULL, 0);
ok(ret == 0, "Unexpected return value %d.\n", ret);
strcpy(buff, "abcdefghijklm");
ret = pSHAnsiToAnsi("test", buff, 3);
ok(ret == 0, "Unexpected return value %d.\n", ret);
ok(!strcmp(buff, "te"), "Unexpected buffer contents.\n");
ok(buff[3] == 'd', "Unexpected buffer contents.\n");
strcpy(buff, "abcdefghijklm");
ret = pSHAnsiToAnsi("", buff, 3);
ok(ret == 1, "Unexpected return value %d.\n", ret);
ok(!*buff, "Unexpected buffer contents.\n");
ok(buff[3] == 'd', "Unexpected buffer contents.\n");
strcpy(buff, "abcdefghijklm");
ret = pSHAnsiToAnsi("test", buff, 4);
ok(ret == 0, "Unexpected return value %d.\n", ret);
ok(!strcmp(buff, "tes"), "Unexpected buffer contents.\n");
ok(buff[4] == 'e', "Unexpected buffer contents.\n");
strcpy(buff, "abcdefghijklm");
ret = pSHAnsiToAnsi("test", buff, 5);
ok(ret == 5, "Unexpected return value %d.\n", ret);
ok(!strcmp(buff, "test"), "Unexpected buffer contents.\n");
ok(buff[5] == 'f', "Unexpected buffer contents.\n");
strcpy(buff, "abcdefghijklm");
ret = pSHAnsiToAnsi("test", buff, 6);
ok(ret == 5, "Unexpected return value %d.\n", ret);
ok(!strcmp(buff, "test"), "Unexpected buffer contents.\n");
ok(buff[5] == 'f', "Unexpected buffer contents.\n");
}
static void test_SHUnicodeToUnicode(void)
{
static const WCHAR testW[] = {'t','e','s','t',0};
static const WCHAR strW[] = {'a','b','c','d','e','f','g','h','i','k','l','m',0};
static const WCHAR emptyW[] = { 0 };
WCHAR buff[16];
int ret;
ret = pSHUnicodeToUnicode(NULL, NULL, 0);
ok(ret == 0, "Unexpected return value %d.\n", ret);
lstrcpyW(buff, strW);
ret = pSHUnicodeToUnicode(testW, buff, 3);
ok(ret == 0, "Unexpected return value %d.\n", ret);
ok(!memcmp(buff, testW, 2 * sizeof(WCHAR)) && !buff[2], "Unexpected buffer contents.\n");
ok(buff[3] == 'd', "Unexpected buffer contents.\n");
lstrcpyW(buff, strW);
ret = pSHUnicodeToUnicode(emptyW, buff, 3);
ok(ret == 1, "Unexpected return value %d.\n", ret);
ok(!*buff, "Unexpected buffer contents.\n");
ok(buff[3] == 'd', "Unexpected buffer contents.\n");
lstrcpyW(buff, strW);
ret = pSHUnicodeToUnicode(testW, buff, 4);
ok(ret == 0, "Unexpected return value %d.\n", ret);
ok(!memcmp(buff, testW, 3 * sizeof(WCHAR)) && !buff[3], "Unexpected buffer contents.\n");
ok(buff[4] == 'e', "Unexpected buffer contents.\n");
lstrcpyW(buff, strW);
ret = pSHUnicodeToUnicode(testW, buff, 5);
ok(ret == 5, "Unexpected return value %d.\n", ret);
ok(!lstrcmpW(buff, testW), "Unexpected buffer contents.\n");
ok(buff[5] == 'f', "Unexpected buffer contents.\n");
lstrcpyW(buff, strW);
ret = pSHUnicodeToUnicode(testW, buff, 6);
ok(ret == 5, "Unexpected return value %d.\n", ret);
ok(!lstrcmpW(buff, testW), "Unexpected buffer contents.\n");
ok(buff[5] == 'f', "Unexpected buffer contents.\n");
}
START_TEST(shcore)
{
HMODULE hshcore = LoadLibraryA("shcore.dll");
@ -135,4 +313,8 @@ START_TEST(shcore)
init(hshcore);
test_process_reference();
test_SHUnicodeToAnsi();
test_SHAnsiToUnicode();
test_SHAnsiToAnsi();
test_SHUnicodeToUnicode();
}