mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-03 04:13:31 +00:00
Sync advapi32, gdi32, gdiplus, inetmib1, kernel32, mlang, msi, msvcrt, ntdll, oleaut32, rpcrt4, secur32, setupapi, shdocvw, shlwapi, snmpapi, twain_32, urlmon, user32, userenv, usp10, winhttp, wininet, wintrust, ws2_32 winetests to Wine 1.2rc6
svn path=/trunk/; revision=47939
This commit is contained in:
@@ -1931,7 +1931,7 @@ static void test_LookupAccountName(void)
|
||||
ok(!lstrcmp(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain);
|
||||
}
|
||||
ok(domain_size == domain_save - 1, "Expected %d, got %d\n", domain_save - 1, domain_size);
|
||||
ok(lstrlen(domain) == domain_size, "Expected %d, got %d\n", lstrlen(domain), domain_size);
|
||||
ok(strlen(domain) == domain_size, "Expected %d, got %d\n", lstrlen(domain), domain_size);
|
||||
ok(sid_use == SidTypeUser, "Expected SidTypeUser (%d), got %d\n", SidTypeUser, sid_use);
|
||||
domain_size = domain_save;
|
||||
sid_size = sid_save;
|
||||
@@ -1949,7 +1949,7 @@ static void test_LookupAccountName(void)
|
||||
ok(!lstrcmp(account, "Everyone"), "Expected Everyone, got %s\n", account);
|
||||
ok(!lstrcmp(domain, sid_dom), "Expected %s, got %s\n", sid_dom, domain);
|
||||
ok(domain_size == 0, "Expected 0, got %d\n", domain_size);
|
||||
ok(lstrlen(domain) == domain_size, "Expected %d, got %d\n", lstrlen(domain), domain_size);
|
||||
ok(strlen(domain) == domain_size, "Expected %d, got %d\n", lstrlen(domain), domain_size);
|
||||
ok(sid_use == SidTypeWellKnownGroup, "Expected SidTypeWellKnownGroup (%d), got %d\n", SidTypeWellKnownGroup, sid_use);
|
||||
domain_size = domain_save;
|
||||
}
|
||||
|
||||
@@ -313,6 +313,9 @@ static void test_bitmap_font(void)
|
||||
SIZE size_orig;
|
||||
INT ret, i, width_orig, height_orig, scale, lfWidth;
|
||||
|
||||
skip("ROS-HACK: Skipping bitmap font tests!\n");
|
||||
return;
|
||||
|
||||
hdc = GetDC(0);
|
||||
|
||||
/* "System" has only 1 pixel size defined, otherwise the test breaks */
|
||||
|
||||
@@ -1427,6 +1427,12 @@ static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits,
|
||||
const ENHMETARECORD *emr1 = (const ENHMETARECORD *)(bits + offset1);
|
||||
const ENHMETARECORD *emr2 = (const ENHMETARECORD *)(buf + offset2);
|
||||
|
||||
skip("skipping match_emf_record(), bug 5392\n");
|
||||
// trace("%s: EMF record %u, size %u/record %u, size %u\n",
|
||||
// desc, emr1->iType, emr1->nSize, emr2->iType, emr2->nSize);
|
||||
|
||||
// if (!match_emf_record(emr1, emr2, desc, ignore_scaling)) return -1;
|
||||
|
||||
trace("%s: EMF record %u, size %u/record %u, size %u\n",
|
||||
desc, emr1->iType, emr1->nSize, emr2->iType, emr2->nSize);
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ static const WCHAR MSSansSerif[] = {'M','S',' ','S','a','n','s',' ','S','e','r',
|
||||
static const WCHAR MicrosoftSansSerif[] = {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f','\0'};
|
||||
static const WCHAR TimesNewRoman[] = {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n','\0'};
|
||||
static const WCHAR CourierNew[] = {'C','o','u','r','i','e','r',' ','N','e','w','\0'};
|
||||
static const WCHAR Tahoma[] = {'T','a','h','o','m','a',0};
|
||||
|
||||
static void test_createfont(void)
|
||||
{
|
||||
@@ -295,9 +296,12 @@ static void test_getgenerics (void)
|
||||
expect (Ok, stat);
|
||||
stat = GdipGetFamilyName (family, familyName, LANG_NEUTRAL);
|
||||
expect (Ok, stat);
|
||||
todo_wine ok ((lstrcmpiW(familyName, MicrosoftSansSerif) == 0),
|
||||
"Expected Microsoft Sans Serif, got %s\n",
|
||||
wine_dbgstr_w(familyName));
|
||||
if (!lstrcmpiW(familyName, Tahoma))
|
||||
todo_wine ok ((lstrcmpiW(familyName, MicrosoftSansSerif) == 0),
|
||||
"Expected Microsoft Sans Serif, got Tahoma\n");
|
||||
else
|
||||
ok ((lstrcmpiW(familyName, MicrosoftSansSerif) == 0),
|
||||
"Expected Microsoft Sans Serif, got %s\n", wine_dbgstr_w(familyName));
|
||||
stat = GdipDeleteFontFamily (family);
|
||||
expect (Ok, stat);
|
||||
|
||||
|
||||
@@ -2411,9 +2411,8 @@ static void test_string_functions(void)
|
||||
GpBrush *brush;
|
||||
ARGB color = 0xff000000;
|
||||
HDC hdc = GetDC( hwnd );
|
||||
const WCHAR fontname[] = {'C','o','u','r','i','e','r',' ','N','e','w',0};
|
||||
const WCHAR fontname2[] = {'C','o','u','r','i','e','r',0};
|
||||
const WCHAR teststring[] = {'o','o',' ','o','\n','o',0};
|
||||
const WCHAR fontname[] = {'T','a','h','o','m','a',0};
|
||||
const WCHAR teststring[] = {'M','M',' ','M','\n','M',0};
|
||||
REAL char_width, char_height;
|
||||
INT codepointsfitted, linesfilled;
|
||||
GpStringFormat *format;
|
||||
@@ -2428,14 +2427,6 @@ static void test_string_functions(void)
|
||||
ok(graphics != NULL, "Expected graphics to be initialized\n");
|
||||
|
||||
status = GdipCreateFontFamilyFromName(fontname, NULL, &family);
|
||||
|
||||
if (status != Ok)
|
||||
{
|
||||
/* Wine doesn't have Courier New? */
|
||||
todo_wine expect(Ok, status);
|
||||
status = GdipCreateFontFamilyFromName(fontname2, NULL, &family);
|
||||
}
|
||||
|
||||
expect(Ok, status);
|
||||
|
||||
status = GdipCreateFont(family, 10.0, FontStyleRegular, UnitPixel, &font);
|
||||
@@ -2514,14 +2505,15 @@ static void test_string_functions(void)
|
||||
expect(Ok, status);
|
||||
expectf(0.0, bounds.X);
|
||||
expectf(0.0, bounds.Y);
|
||||
expectf_(char_bounds.Width + char_width * 3, bounds.Width, 0.01);
|
||||
ok(bounds.Width > char_bounds.Width + char_width * 2, "got %0.2f, expected at least %0.2f\n",
|
||||
bounds.Width, char_bounds.Width + char_width * 2);
|
||||
ok(bounds.Height > char_bounds.Height, "got %0.2f, expected at least %0.2f\n", bounds.Height, char_bounds.Height);
|
||||
expect(6, codepointsfitted);
|
||||
expect(2, linesfilled);
|
||||
char_height = bounds.Height - char_bounds.Height;
|
||||
|
||||
/* Cut off everything after the first space. */
|
||||
rc.Width = char_bounds.Width + char_width * 2.5;
|
||||
rc.Width = char_bounds.Width + char_width * 2.1;
|
||||
|
||||
status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled);
|
||||
expect(Ok, status);
|
||||
@@ -2607,7 +2599,7 @@ static void test_string_functions(void)
|
||||
ok(!region_isempty[3], "region shouldn't be empty\n");
|
||||
|
||||
/* Cut off everything after the first space, and the second line. */
|
||||
rc.Width = char_bounds.Width + char_width * 2.5;
|
||||
rc.Width = char_bounds.Width + char_width * 2.1;
|
||||
rc.Height = char_bounds.Height + char_height * 0.5;
|
||||
|
||||
status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, &rc, format, 3, regions);
|
||||
|
||||
@@ -225,7 +225,13 @@ static void test_dasharray(void)
|
||||
|
||||
/* Try to set with count = 0. */
|
||||
GdipSetPenDashStyle(pen, DashStyleDot);
|
||||
if (0) /* corrupts stack on 64-bit Vista */
|
||||
{
|
||||
status = GdipSetPenDashArray(pen, dashes, 0);
|
||||
ok(status == OutOfMemory || status == InvalidParameter,
|
||||
"Expected OutOfMemory or InvalidParameter, got %.8x\n", status);
|
||||
}
|
||||
status = GdipSetPenDashArray(pen, dashes, -1);
|
||||
ok(status == OutOfMemory || status == InvalidParameter,
|
||||
"Expected OutOfMemory or InvalidParameter, got %.8x\n", status);
|
||||
GdipGetPenDashStyle(pen, &style);
|
||||
|
||||
@@ -47,6 +47,8 @@ static void testInit(void)
|
||||
ok(ret, "SnmpExtensionInit failed: %d\n", GetLastError());
|
||||
ok(!strcmp("1.3.6.1.2.1.1", SnmpUtilOidToA(&oid)),
|
||||
"Expected 1.3.6.1.2.1.1, got %s\n", SnmpUtilOidToA(&oid));
|
||||
|
||||
SnmpUtilOidFree(&oid);
|
||||
}
|
||||
|
||||
static void testQuery(void)
|
||||
@@ -88,7 +90,7 @@ static void testQuery(void)
|
||||
error = 0xdeadbeef;
|
||||
index = 0xdeadbeef;
|
||||
ret = pQuery(SNMP_PDU_GET, &list, &error, &index);
|
||||
ok(ret, "SnmpExtensionQuery failed: %d\n", GetLastError());
|
||||
ok(ret, "SnmpExtensionQuery failed: %d, %d\n", error, index);
|
||||
ok(error == SNMP_ERRORSTATUS_NOERROR,
|
||||
"expected SNMP_ERRORSTATUS_NOERROR, got %d\n", error);
|
||||
ok(index == 0, "expected index 0, got %d\n", index);
|
||||
@@ -105,7 +107,7 @@ static void testQuery(void)
|
||||
error = 0xdeadbeef;
|
||||
index = 0xdeadbeef;
|
||||
ret = pQuery(SNMP_PDU_GET, &list, &error, &index);
|
||||
ok(ret, "SnmpExtensionQuery failed: %d\n", GetLastError());
|
||||
ok(ret, "SnmpExtensionQuery failed: %d, %d\n", error, index);
|
||||
ok(error == SNMP_ERRORSTATUS_NOERROR ||
|
||||
error == ERROR_FILE_NOT_FOUND /* Win9x */,
|
||||
"expected SNMP_ERRORSTATUS_NOERROR or ERROR_FILE_NOT_FOUND, got %d\n",
|
||||
@@ -125,7 +127,7 @@ static void testQuery(void)
|
||||
error = 0xdeadbeef;
|
||||
index = 0xdeadbeef;
|
||||
ret = pQuery(SNMP_PDU_GET, &list, &error, &index);
|
||||
ok(ret, "SnmpExtensionQuery failed: %d\n", GetLastError());
|
||||
ok(ret, "SnmpExtensionQuery failed: %d, %d\n", error, index);
|
||||
ok(error == SNMP_ERRORSTATUS_NOSUCHNAME,
|
||||
"expected SNMP_ERRORSTATUS_NOSUCHNAME, got %d\n", error);
|
||||
/* The index is 1-based rather than 0-based */
|
||||
@@ -147,7 +149,7 @@ static void testQuery(void)
|
||||
error = 0xdeadbeef;
|
||||
index = 0xdeadbeef;
|
||||
ret = pQuery(SNMP_PDU_GET, &list, &error, &index);
|
||||
ok(ret, "SnmpExtensionQuery failed: %d\n", GetLastError());
|
||||
ok(ret, "SnmpExtensionQuery failed: %d, %d\n", error, index);
|
||||
ok(error == SNMP_ERRORSTATUS_NOSUCHNAME,
|
||||
"expected SNMP_ERRORSTATUS_NOSUCHNAME, got %d\n", error);
|
||||
ok(index == 1, "expected index 1, got %d\n", index);
|
||||
@@ -169,7 +171,7 @@ static void testQuery(void)
|
||||
error = 0xdeadbeef;
|
||||
index = 0xdeadbeef;
|
||||
ret = pQuery(SNMP_PDU_GETNEXT, &list, &error, &index);
|
||||
ok(ret, "SnmpExtensionQuery failed: %d\n", GetLastError());
|
||||
ok(ret, "SnmpExtensionQuery failed: %d, %d\n", error, index);
|
||||
ok(error == SNMP_ERRORSTATUS_NOERROR,
|
||||
"expected SNMP_ERRORSTATUS_NOERROR, got %d\n", error);
|
||||
ok(index == 0, "expected index 0, got %d\n", index);
|
||||
@@ -187,8 +189,8 @@ static void testQuery(void)
|
||||
vars[2].name.idLength))
|
||||
moreData = FALSE;
|
||||
else if (!SnmpUtilOidCmp(&vars[0].name, &vars2[0].name) ||
|
||||
!SnmpUtilOidCmp(&vars[0].name, &vars2[0].name) ||
|
||||
!SnmpUtilOidCmp(&vars[0].name, &vars2[0].name))
|
||||
!SnmpUtilOidCmp(&vars[1].name, &vars2[1].name) ||
|
||||
!SnmpUtilOidCmp(&vars[2].name, &vars2[2].name))
|
||||
{
|
||||
/* If the OID isn't modified, the function isn't implemented on this
|
||||
* platform, skip the remaining tests.
|
||||
@@ -252,7 +254,7 @@ static void testQuery(void)
|
||||
moreData = TRUE;
|
||||
noChange = FALSE;
|
||||
ret = pQuery(SNMP_PDU_GETNEXT, &list, &error, &index);
|
||||
ok(ret, "SnmpExtensionQuery failed: %d\n", GetLastError());
|
||||
ok(ret, "SnmpExtensionQuery failed: %d, %d\n", error, index);
|
||||
ok(error == SNMP_ERRORSTATUS_NOERROR,
|
||||
"expected SNMP_ERRORSTATUS_NOERROR, got %d\n", error);
|
||||
ok(index == 0, "expected index 0, got %d\n", index);
|
||||
@@ -274,7 +276,7 @@ static void testQuery(void)
|
||||
moreData = TRUE;
|
||||
do {
|
||||
ret = pQuery(SNMP_PDU_GETNEXT, &list, &error, &index);
|
||||
ok(ret, "SnmpExtensionQuery failed: %d\n", GetLastError());
|
||||
ok(ret, "SnmpExtensionQuery failed: %d, %d\n", error, index);
|
||||
ok(error == SNMP_ERRORSTATUS_NOERROR,
|
||||
"expected SNMP_ERRORSTATUS_NOERROR, got %d\n", error);
|
||||
ok(index == 0, "expected index 0, got %d\n", index);
|
||||
@@ -340,7 +342,7 @@ static void testQuery(void)
|
||||
noChange = FALSE;
|
||||
do {
|
||||
ret = pQuery(SNMP_PDU_GETNEXT, &list, &error, &index);
|
||||
ok(ret, "SnmpExtensionQuery failed: %d\n", GetLastError());
|
||||
ok(ret, "SnmpExtensionQuery failed: %d, %d\n", error, index);
|
||||
ok(error == SNMP_ERRORSTATUS_NOERROR,
|
||||
"expected SNMP_ERRORSTATUS_NOERROR, got %d\n", error);
|
||||
ok(index == 0, "expected index 0, got %d\n", index);
|
||||
@@ -406,7 +408,7 @@ static void testQuery(void)
|
||||
noChange = FALSE;
|
||||
do {
|
||||
ret = pQuery(SNMP_PDU_GETNEXT, &list, &error, &index);
|
||||
ok(ret, "SnmpExtensionQuery failed: %d\n", GetLastError());
|
||||
ok(ret, "SnmpExtensionQuery failed: %d, %d\n", error, index);
|
||||
/* FIXME: error and index aren't checked here because the UDP table is
|
||||
* the last OID currently supported by Wine, so the last GetNext fails.
|
||||
* todo_wine is also not effective because it will succeed for all but
|
||||
|
||||
@@ -21,10 +21,9 @@
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
#define WIN32_NO_STATUS
|
||||
#include <windows.h>
|
||||
#include <winternl.h>
|
||||
#include <winreg.h>
|
||||
#include <ntndk.h>
|
||||
#include "wine/test.h"
|
||||
|
||||
#ifndef STATUS_DEBUGGER_INACTIVE
|
||||
@@ -541,7 +540,7 @@ static void doChild(int argc, char **argv)
|
||||
|
||||
if (pNtCurrentTeb)
|
||||
{
|
||||
pNtCurrentTeb()->ProcessEnvironmentBlock->BeingDebugged = FALSE;
|
||||
pNtCurrentTeb()->Peb->BeingDebugged = FALSE;
|
||||
|
||||
ret = pIsDebuggerPresent();
|
||||
child_ok(!ret, "Expected ret != 0, got %#x.\n", ret);
|
||||
@@ -549,7 +548,7 @@ static void doChild(int argc, char **argv)
|
||||
child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError());
|
||||
child_ok(debug, "Expected debug != 0, got %#x.\n", debug);
|
||||
|
||||
pNtCurrentTeb()->ProcessEnvironmentBlock->BeingDebugged = TRUE;
|
||||
pNtCurrentTeb()->Peb->BeingDebugged = TRUE;
|
||||
}
|
||||
|
||||
blackbox.failures = child_failures;
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define WIN32_NO_STATUS
|
||||
#include <windows.h>
|
||||
#define NTOS_MODE_USER
|
||||
#include <ndk/ntndk.h>
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
#include "winreg.h"
|
||||
#include "winternl.h"
|
||||
#include "wine/test.h"
|
||||
|
||||
#define MAGIC_DEAD 0xdeadbeef
|
||||
|
||||
@@ -36,14 +36,8 @@
|
||||
#define CP_UNICODE 1200
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
#define DUMP_CP_INFO
|
||||
#define DUMP_SCRIPT_INFO
|
||||
|
||||
#if defined DUMP_CP_INFO || defined DUMP_SCRIPT_INFO
|
||||
#include "wine/debug.h"
|
||||
#endif
|
||||
#endif /* 0 */
|
||||
/* #define DUMP_CP_INFO */
|
||||
/* #define DUMP_SCRIPT_INFO */
|
||||
|
||||
static BOOL (WINAPI *pGetCPInfoExA)(UINT, DWORD, LPCPINFOEXA);
|
||||
static HRESULT (WINAPI *pConvertINetMultiByteToUnicode)(LPDWORD, DWORD, LPCSTR,
|
||||
@@ -630,13 +624,8 @@ static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags)
|
||||
#ifdef DUMP_CP_INFO
|
||||
trace("%s: %u %u %s\n", wine_dbgstr_w(cpinfo[i].wszWebCharset), mcsi.uiCodePage, mcsi.uiInternetEncoding, wine_dbgstr_w(mcsi.wszCharset));
|
||||
#endif
|
||||
ok(!lstrcmpiW(cpinfo[i].wszWebCharset, mcsi.wszCharset),
|
||||
#ifdef DUMP_CP_INFO
|
||||
"%s != %s\n",
|
||||
wine_dbgstr_w(cpinfo[i].wszWebCharset), wine_dbgstr_w(mcsi.wszCharset));
|
||||
#else
|
||||
"wszWebCharset mismatch\n");
|
||||
#endif
|
||||
ok(!lstrcmpiW(cpinfo[i].wszWebCharset, mcsi.wszCharset), "%s != %s\n",
|
||||
wine_dbgstr_w(cpinfo[i].wszWebCharset), wine_dbgstr_w(mcsi.wszCharset));
|
||||
|
||||
if (0)
|
||||
{
|
||||
@@ -661,13 +650,8 @@ static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags)
|
||||
#ifdef DUMP_CP_INFO
|
||||
trace("%s: %u %u %s\n", wine_dbgstr_w(cpinfo[i].wszHeaderCharset), mcsi.uiCodePage, mcsi.uiInternetEncoding, wine_dbgstr_w(mcsi.wszCharset));
|
||||
#endif
|
||||
ok(!lstrcmpiW(cpinfo[i].wszHeaderCharset, mcsi.wszCharset),
|
||||
#ifdef DUMP_CP_INFO
|
||||
"%s != %s\n",
|
||||
wine_dbgstr_w(cpinfo[i].wszHeaderCharset), wine_dbgstr_w(mcsi.wszCharset));
|
||||
#else
|
||||
"wszHeaderCharset mismatch\n");
|
||||
#endif
|
||||
ok(!lstrcmpiW(cpinfo[i].wszHeaderCharset, mcsi.wszCharset), "%s != %s\n",
|
||||
wine_dbgstr_w(cpinfo[i].wszHeaderCharset), wine_dbgstr_w(mcsi.wszCharset));
|
||||
|
||||
if (0)
|
||||
{
|
||||
@@ -692,13 +676,8 @@ static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags)
|
||||
#ifdef DUMP_CP_INFO
|
||||
trace("%s: %u %u %s\n", wine_dbgstr_w(cpinfo[i].wszBodyCharset), mcsi.uiCodePage, mcsi.uiInternetEncoding, wine_dbgstr_w(mcsi.wszCharset));
|
||||
#endif
|
||||
ok(!lstrcmpiW(cpinfo[i].wszBodyCharset, mcsi.wszCharset),
|
||||
#ifdef DUMP_CP_INFO
|
||||
"%s != %s\n",
|
||||
wine_dbgstr_w(cpinfo[i].wszBodyCharset), wine_dbgstr_w(mcsi.wszCharset));
|
||||
#else
|
||||
"wszBodyCharset mismatch\n");
|
||||
#endif
|
||||
ok(!lstrcmpiW(cpinfo[i].wszBodyCharset, mcsi.wszCharset), "%s != %s\n",
|
||||
wine_dbgstr_w(cpinfo[i].wszBodyCharset), wine_dbgstr_w(mcsi.wszCharset));
|
||||
|
||||
if (0)
|
||||
{
|
||||
@@ -1946,7 +1925,10 @@ static void test_IsCodePageInstallable(IMultiLanguage2 *ml2)
|
||||
* up an installation dialog on some platforms, even when specifying CPIOD_PEEK.
|
||||
*/
|
||||
if (IsValidCodePage(i))
|
||||
ok(hr == S_OK, "code page %u is valid but not installable 0x%08x\n", i, hr);
|
||||
ok(hr == S_OK ||
|
||||
broken(hr == S_FALSE) || /* win2k */
|
||||
broken(hr == E_INVALIDARG), /* win2k */
|
||||
"code page %u is valid but not installable 0x%08x\n", i, hr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -308,7 +308,8 @@ static BOOL get_program_files_dir(LPSTR buf)
|
||||
return FALSE;
|
||||
|
||||
size = MAX_PATH;
|
||||
if (RegQueryValueEx(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)buf, &size))
|
||||
if (RegQueryValueEx(hkey, "ProgramFilesDir (x86)", 0, &type, (LPBYTE)buf, &size) &&
|
||||
RegQueryValueEx(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)buf, &size))
|
||||
return FALSE;
|
||||
|
||||
RegCloseKey(hkey);
|
||||
|
||||
@@ -3246,7 +3246,8 @@ static BOOL get_system_dirs(void)
|
||||
return FALSE;
|
||||
|
||||
size = MAX_PATH;
|
||||
if (RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR, &size)) {
|
||||
if (RegQueryValueExA(hkey, "ProgramFilesDir (x86)", 0, &type, (LPBYTE)PROG_FILES_DIR, &size) &&
|
||||
RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR, &size)) {
|
||||
RegCloseKey(hkey);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -11298,6 +11298,9 @@ static void test_MsiEnumProducts(void)
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||
|
||||
index = 0;
|
||||
r = MsiEnumProductsA(index, guid);
|
||||
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r);
|
||||
|
||||
r = MsiEnumProductsA(index, NULL);
|
||||
ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r);
|
||||
|
||||
|
||||
@@ -159,7 +159,8 @@ static BOOL get_program_files_dir( char *buf, char *buf2 )
|
||||
return FALSE;
|
||||
|
||||
size = MAX_PATH;
|
||||
if (RegQueryValueExA( hkey, "ProgramFilesDir", 0, &type, (LPBYTE)buf, &size ))
|
||||
if (RegQueryValueExA( hkey, "ProgramFilesDir (x86)", 0, &type, (LPBYTE)buf, &size ) &&
|
||||
RegQueryValueExA( hkey, "ProgramFilesDir", 0, &type, (LPBYTE)buf, &size ))
|
||||
{
|
||||
RegCloseKey( hkey );
|
||||
return FALSE;
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
TOPSRCDIR = @top_srcdir@
|
||||
TOPOBJDIR = ../../..
|
||||
SRCDIR = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
TESTDLL = msvcrt.dll
|
||||
IMPORTS = msvcrt
|
||||
EXTRAINCL = -I$(TOPSRCDIR)/include/msvcrt -I$(SRCDIR)/..
|
||||
|
||||
CTESTS = \
|
||||
cpp.c \
|
||||
environ.c \
|
||||
file.c \
|
||||
heap.c \
|
||||
printf.c \
|
||||
scanf.c \
|
||||
string.c \
|
||||
time.c
|
||||
|
||||
@MAKE_TEST_RULES@
|
||||
|
||||
### Dependencies:
|
||||
@@ -31,6 +31,17 @@
|
||||
#include <process.h>
|
||||
#include <errno.h>
|
||||
|
||||
static int (__cdecl *p_makepath_s)(char *, size_t, const char *, const char *, const char *, const char *);
|
||||
static int (__cdecl *p_wmakepath_s)(wchar_t *, size_t, const wchar_t *,const wchar_t *, const wchar_t *, const wchar_t *);
|
||||
|
||||
static void init(void)
|
||||
{
|
||||
HMODULE hmod = GetModuleHandleA("msvcrt.dll");
|
||||
|
||||
p_makepath_s = (void *)GetProcAddress(hmod, "_makepath_s");
|
||||
p_wmakepath_s = (void *)GetProcAddress(hmod, "_wmakepath_s");
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char* buffer;
|
||||
@@ -121,6 +132,207 @@ static void test_makepath(void)
|
||||
}
|
||||
}
|
||||
|
||||
static const WCHAR expected0[] = {'\0','X','X','X','X','X','X','X','X','X','X','X','X'};
|
||||
static const WCHAR expected1[] = {'\0','X','X','X','X','X','X','X','X','X','X','X','X'};
|
||||
static const WCHAR expected2[] = {'\0',':','X','X','X','X','X','X','X','X','X','X','X'};
|
||||
static const WCHAR expected3[] = {'\0',':','d','X','X','X','X','X','X','X','X','X','X'};
|
||||
static const WCHAR expected4[] = {'\0',':','d','\\','X','X','X','X','X','X','X','X','X'};
|
||||
static const WCHAR expected5[] = {'\0',':','d','\\','f','X','X','X','X','X','X','X','X'};
|
||||
static const WCHAR expected6[] = {'\0',':','d','\\','f','i','X','X','X','X','X','X','X'};
|
||||
static const WCHAR expected7[] = {'\0',':','d','\\','f','i','l','X','X','X','X','X','X'};
|
||||
static const WCHAR expected8[] = {'\0',':','d','\\','f','i','l','e','X','X','X','X','X'};
|
||||
static const WCHAR expected9[] = {'\0',':','d','\\','f','i','l','e','.','X','X','X','X'};
|
||||
static const WCHAR expected10[] = {'\0',':','d','\\','f','i','l','e','.','e','X','X','X'};
|
||||
static const WCHAR expected11[] = {'\0',':','d','\\','f','i','l','e','.','e','x','X','X'};
|
||||
|
||||
static const WCHAR expected12[] = {'\0',':','X','X','X','X','X','X','X','X'};
|
||||
static const WCHAR expected13[] = {'\0',':','d','X','X','X','X','X','X','X'};
|
||||
static const WCHAR expected14[] = {'\0',':','d','i','X','X','X','X','X','X'};
|
||||
static const WCHAR expected15[] = {'\0',':','d','i','r','X','X','X','X','X'};
|
||||
static const WCHAR expected16[] = {'\0',':','d','i','r','\\','X','X','X','X'};
|
||||
|
||||
static const WCHAR expected17[] = {'\0','o','o'};
|
||||
static const WCHAR expected18[] = {'\0','o','o','\0','X'};
|
||||
static const WCHAR expected19[] = {'\0','o','o','\0'};
|
||||
static const WCHAR expected20[] = {'\0','o','o','\0','X','X','X','X','X'};
|
||||
static const WCHAR expected21[] = {'\0','o','o','\\','f','i','l','X','X'};
|
||||
static const WCHAR expected22[] = {'\0','o','o','\0','X','X','X','X','X','X','X','X','X'};
|
||||
static const WCHAR expected23[] = {'\0','o','o','\\','f','i','l','X','X','X','X','X','X'};
|
||||
static const WCHAR expected24[] = {'\0','o','o','\\','f','i','l','e','.','e','x','X','X'};
|
||||
static const WCHAR expected25[] = {'\0','o','o','\0','X','X','X','X'};
|
||||
static const WCHAR expected26[] = {'\0','o','o','.','e','x','X','X'};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char* buffer;
|
||||
size_t length;
|
||||
const char* drive;
|
||||
const char* dir;
|
||||
const char* file;
|
||||
const char* ext;
|
||||
const char* expected;
|
||||
const WCHAR *expected_unicode;
|
||||
size_t expected_length;
|
||||
} makepath_s_case;
|
||||
|
||||
static const makepath_s_case makepath_s_cases[] =
|
||||
{
|
||||
/* Behavior with directory parameter containing backslash. */
|
||||
{NULL, 1, "c:", "d\\", "file", "ext", "\0XXXXXXXXXXXX", expected0, 13},
|
||||
{NULL, 2, "c:", "d\\", "file", "ext", "\0XXXXXXXXXXXX", expected1, 13},
|
||||
{NULL, 3, "c:", "d\\", "file", "ext", "\0:XXXXXXXXXXX", expected2, 13},
|
||||
{NULL, 4, "c:", "d\\", "file", "ext", "\0:dXXXXXXXXXX", expected3, 13},
|
||||
{NULL, 5, "c:", "d\\", "file", "ext", "\0:d\\XXXXXXXXX", expected4, 13},
|
||||
{NULL, 6, "c:", "d\\", "file", "ext", "\0:d\\fXXXXXXXX", expected5, 13},
|
||||
{NULL, 7, "c:", "d\\", "file", "ext", "\0:d\\fiXXXXXXX", expected6, 13},
|
||||
{NULL, 8, "c:", "d\\", "file", "ext", "\0:d\\filXXXXXX", expected7, 13},
|
||||
{NULL, 9, "c:", "d\\", "file", "ext", "\0:d\\fileXXXXX", expected8, 13},
|
||||
{NULL, 10, "c:", "d\\", "file", "ext", "\0:d\\file.XXXX", expected9, 13},
|
||||
{NULL, 11, "c:", "d\\", "file", "ext", "\0:d\\file.eXXX", expected10, 13},
|
||||
{NULL, 12, "c:", "d\\", "file", "ext", "\0:d\\file.exXX", expected11, 13},
|
||||
/* Behavior with directory parameter lacking backslash. */
|
||||
{NULL, 3, "c:", "dir", "f", "ext", "\0:XXXXXXXX", expected12, 10},
|
||||
{NULL, 4, "c:", "dir", "f", "ext", "\0:dXXXXXXX", expected13, 10},
|
||||
{NULL, 5, "c:", "dir", "f", "ext", "\0:diXXXXXX", expected14, 10},
|
||||
{NULL, 6, "c:", "dir", "f", "ext", "\0:dirXXXXX", expected15, 10},
|
||||
{NULL, 7, "c:", "dir", "f", "ext", "\0:dir\\XXXX", expected16, 10},
|
||||
/* Behavior with overlapped buffer. */
|
||||
{"foo", 2, USE_BUFF, NULL, NULL, NULL, "\0oo", expected17, 3},
|
||||
{"foo", 4, NULL, USE_BUFF, NULL, NULL, "\0oo\0X", expected18, 5},
|
||||
{"foo", 3, NULL, NULL, USE_BUFF, NULL, "\0oo\0", expected19, 4},
|
||||
{"foo", 4, NULL, USE_BUFF, "file", NULL, "\0oo\0XXXXX", expected20, 9},
|
||||
{"foo", 8, NULL, USE_BUFF, "file", NULL, "\0oo\\filXX", expected21, 9},
|
||||
{"foo", 4, NULL, USE_BUFF, "file", "ext", "\0oo\0XXXXXXXXX", expected22, 13},
|
||||
{"foo", 8, NULL, USE_BUFF, "file", "ext", "\0oo\\filXXXXXX", expected23, 13},
|
||||
{"foo", 12, NULL, USE_BUFF, "file", "ext", "\0oo\\file.exXX", expected24, 13},
|
||||
{"foo", 4, NULL, NULL, USE_BUFF, "ext", "\0oo\0XXXX", expected25, 8},
|
||||
{"foo", 7, NULL, NULL, USE_BUFF, "ext", "\0oo.exXX", expected26, 8},
|
||||
};
|
||||
|
||||
static void test_makepath_s(void)
|
||||
{
|
||||
WCHAR driveW[MAX_PATH];
|
||||
WCHAR dirW[MAX_PATH];
|
||||
WCHAR fileW[MAX_PATH];
|
||||
WCHAR extW[MAX_PATH];
|
||||
WCHAR bufferW[MAX_PATH];
|
||||
char buffer[MAX_PATH];
|
||||
int ret;
|
||||
unsigned int i, n;
|
||||
|
||||
if (!p_makepath_s || !p_wmakepath_s)
|
||||
{
|
||||
win_skip("Safe makepath functions are not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
errno = EBADF;
|
||||
ret = p_makepath_s(NULL, 0, NULL, NULL, NULL, NULL);
|
||||
ok(ret == EINVAL, "Expected _makepath_s to return EINVAL, got %d\n", ret);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
|
||||
errno = EBADF;
|
||||
ret = p_makepath_s(buffer, 0, NULL, NULL, NULL, NULL);
|
||||
ok(ret == EINVAL, "Expected _makepath_s to return EINVAL, got %d\n", ret);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
|
||||
errno = EBADF;
|
||||
ret = p_wmakepath_s(NULL, 0, NULL, NULL, NULL, NULL);
|
||||
ok(ret == EINVAL, "Expected _wmakepath_s to return EINVAL, got %d\n", ret);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
|
||||
errno = EBADF;
|
||||
ret = p_wmakepath_s(bufferW, 0, NULL, NULL, NULL, NULL);
|
||||
ok(ret == EINVAL, "Expected _wmakepath_s to return EINVAL, got %d\n", ret);
|
||||
ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno);
|
||||
|
||||
/* Test with the normal _makepath cases. */
|
||||
for (i = 0; i < sizeof(makepath_cases)/sizeof(makepath_cases[0]); i++)
|
||||
{
|
||||
const makepath_case *p = makepath_cases + i;
|
||||
|
||||
memset(buffer, 'X', MAX_PATH);
|
||||
if (p->buffer)
|
||||
strcpy(buffer, p->buffer);
|
||||
|
||||
/* Ascii */
|
||||
ret = p_makepath_s(buffer, MAX_PATH,
|
||||
p->drive == USE_BUFF ? buffer : p->drive,
|
||||
p->dir == USE_BUFF ? buffer : p->dir,
|
||||
p->file == USE_BUFF? buffer : p->file,
|
||||
p->ext == USE_BUFF ? buffer : p->ext);
|
||||
ok(ret == 0, "[%d] Expected _makepath_s to return 0, got %d\n", i, ret);
|
||||
|
||||
buffer[MAX_PATH - 1] = '\0';
|
||||
ok(!strcmp(p->expected, buffer), "got '%s' for case %d\n", buffer, i);
|
||||
|
||||
/* Unicode */
|
||||
if (p->drive != USE_BUFF) MultiByteToWideChar(CP_ACP, 0, p->drive, -1, driveW, MAX_PATH);
|
||||
if (p->dir != USE_BUFF) MultiByteToWideChar(CP_ACP, 0, p->dir, -1, dirW, MAX_PATH);
|
||||
if (p->file != USE_BUFF) MultiByteToWideChar(CP_ACP, 0, p->file, -1, fileW, MAX_PATH);
|
||||
if (p->ext != USE_BUFF) MultiByteToWideChar(CP_ACP, 0, p->ext, -1, extW, MAX_PATH);
|
||||
|
||||
memset(buffer, 0, MAX_PATH);
|
||||
for (n = 0; n < MAX_PATH; ++n)
|
||||
bufferW[n] = 'X';
|
||||
if (p->buffer) MultiByteToWideChar( CP_ACP, 0, p->buffer, -1, bufferW, MAX_PATH);
|
||||
|
||||
ret = p_wmakepath_s(bufferW, MAX_PATH,
|
||||
p->drive == USE_BUFF ? bufferW : p->drive ? driveW : NULL,
|
||||
p->dir == USE_BUFF ? bufferW : p->dir ? dirW : NULL,
|
||||
p->file == USE_BUFF? bufferW : p->file ? fileW : NULL,
|
||||
p->ext == USE_BUFF ? bufferW : p->ext ? extW : NULL);
|
||||
ok(ret == 0, "[%d] Expected _wmakepath_s to return 0, got %d\n", i, ret);
|
||||
|
||||
bufferW[MAX_PATH - 1] = '\0';
|
||||
WideCharToMultiByte(CP_ACP, 0, bufferW, -1, buffer, MAX_PATH, NULL, NULL);
|
||||
ok(!strcmp(p->expected, buffer), "got '%s' for unicode case %d\n", buffer, i);
|
||||
}
|
||||
|
||||
/* Try insufficient length cases. */
|
||||
for (i = 0; i < sizeof(makepath_s_cases)/sizeof(makepath_s_cases[0]); i++)
|
||||
{
|
||||
const makepath_s_case *p = makepath_s_cases + i;
|
||||
|
||||
memset(buffer, 'X', MAX_PATH);
|
||||
if (p->buffer)
|
||||
strcpy(buffer, p->buffer);
|
||||
|
||||
/* Ascii */
|
||||
errno = EBADF;
|
||||
ret = p_makepath_s(buffer, p->length,
|
||||
p->drive == USE_BUFF ? buffer : p->drive,
|
||||
p->dir == USE_BUFF ? buffer : p->dir,
|
||||
p->file == USE_BUFF? buffer : p->file,
|
||||
p->ext == USE_BUFF ? buffer : p->ext);
|
||||
ok(ret == ERANGE, "[%d] Expected _makepath_s to return ERANGE, got %d\n", i, ret);
|
||||
ok(errno == ERANGE, "[%d] Expected errno to be ERANGE, got %d\n", i, errno);
|
||||
ok(!memcmp(p->expected, buffer, p->expected_length), "unexpected output for case %d\n", i);
|
||||
|
||||
/* Unicode */
|
||||
if (p->drive != USE_BUFF) MultiByteToWideChar(CP_ACP, 0, p->drive, -1, driveW, MAX_PATH);
|
||||
if (p->dir != USE_BUFF) MultiByteToWideChar(CP_ACP, 0, p->dir, -1, dirW, MAX_PATH);
|
||||
if (p->file != USE_BUFF) MultiByteToWideChar(CP_ACP, 0, p->file, -1, fileW, MAX_PATH);
|
||||
if (p->ext != USE_BUFF) MultiByteToWideChar(CP_ACP, 0, p->ext, -1, extW, MAX_PATH);
|
||||
|
||||
memset(buffer, 0, MAX_PATH);
|
||||
for (n = 0; n < MAX_PATH; ++n)
|
||||
bufferW[n] = 'X';
|
||||
if (p->buffer) MultiByteToWideChar( CP_ACP, 0, p->buffer, -1, bufferW, MAX_PATH);
|
||||
|
||||
errno = EBADF;
|
||||
ret = p_wmakepath_s(bufferW, p->length,
|
||||
p->drive == USE_BUFF ? bufferW : p->drive ? driveW : NULL,
|
||||
p->dir == USE_BUFF ? bufferW : p->dir ? dirW : NULL,
|
||||
p->file == USE_BUFF? bufferW : p->file ? fileW : NULL,
|
||||
p->ext == USE_BUFF ? bufferW : p->ext ? extW : NULL);
|
||||
ok(ret == ERANGE, "[%d] Expected _wmakepath_s to return ERANGE, got %d\n", i, ret);
|
||||
ok(errno == ERANGE, "[%d] Expected errno to be ERANGE, got %d\n", i, errno);
|
||||
|
||||
ok(!memcmp(p->expected_unicode, bufferW, p->expected_length * sizeof(WCHAR)), "unexpected output for case %d\n", i);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_fullpath(void)
|
||||
{
|
||||
char full[MAX_PATH];
|
||||
@@ -180,6 +392,9 @@ static void test_fullpath(void)
|
||||
|
||||
START_TEST(dir)
|
||||
{
|
||||
init();
|
||||
|
||||
test_fullpath();
|
||||
test_makepath();
|
||||
test_makepath_s();
|
||||
}
|
||||
|
||||
@@ -1414,7 +1414,7 @@ static void test_unlink(void)
|
||||
rmdir("test_unlink");
|
||||
}
|
||||
|
||||
void test_dup2(void)
|
||||
static void test_dup2(void)
|
||||
{
|
||||
ok(-1 == _dup2(0, -1), "expected _dup2 to fail when second arg is negative\n" );
|
||||
}
|
||||
|
||||
@@ -0,0 +1,619 @@
|
||||
/*
|
||||
* Unit test suite for locale functions.
|
||||
*
|
||||
* Copyright 2010 Piotr Caban for CodeWeavers
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <locale.h>
|
||||
|
||||
#include "wine/test.h"
|
||||
#include "winnls.h"
|
||||
|
||||
static BOOL (__cdecl *p__crtGetStringTypeW)(DWORD, DWORD, const wchar_t*, int, WORD*);
|
||||
static int (__cdecl *pmemcpy_s)(void *, size_t, void*, size_t);
|
||||
|
||||
static void init(void)
|
||||
{
|
||||
HMODULE hmod = GetModuleHandleA("msvcrt.dll");
|
||||
|
||||
p__crtGetStringTypeW = (void*)GetProcAddress(hmod, "__crtGetStringTypeW");
|
||||
pmemcpy_s = (void*)GetProcAddress(hmod, "memcpy_s");
|
||||
}
|
||||
|
||||
static void test_setlocale(void)
|
||||
{
|
||||
static const char lc_all[] = "LC_COLLATE=C;LC_CTYPE=C;"
|
||||
"LC_MONETARY=Greek_Greece.1253;LC_NUMERIC=Polish_Poland.1250;LC_TIME=C";
|
||||
|
||||
char *ret, buf[100];
|
||||
|
||||
ret = setlocale(20, "C");
|
||||
ok(ret == NULL, "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "");
|
||||
ok(ret != NULL, "ret == NULL\n");
|
||||
|
||||
ret = setlocale(LC_ALL, "C");
|
||||
ok(!strcmp(ret, "C"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, NULL);
|
||||
ok(!strcmp(ret, "C"), "ret = %s\n", ret);
|
||||
|
||||
if(!setlocale(LC_NUMERIC, "Polish")
|
||||
|| !setlocale(LC_NUMERIC, "Greek")
|
||||
|| !setlocale(LC_NUMERIC, "German")
|
||||
|| !setlocale(LC_NUMERIC, "English")) {
|
||||
win_skip("System with limited locales\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = setlocale(LC_NUMERIC, "Polish");
|
||||
ok(!strcmp(ret, "Polish_Poland.1250"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_MONETARY, "Greek");
|
||||
ok(!strcmp(ret, "Greek_Greece.1253"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, NULL);
|
||||
ok(!strcmp(ret, lc_all), "ret = %s\n", ret);
|
||||
|
||||
strcpy(buf, ret);
|
||||
ret = setlocale(LC_ALL, buf);
|
||||
ok(!strcmp(ret, lc_all), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "German");
|
||||
ok(!strcmp(ret, "German_Germany.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "american");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "american english");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "american-english");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "australian");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_Australia.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "belgian");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Dutch_Belgium.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "canadian");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_Canada.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "chinese");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936")
|
||||
|| broken(!strcmp(ret, "Chinese_Taiwan.950")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "chinese-simplified");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936")
|
||||
|| broken(!strcmp(ret, "Chinese_People's Republic of China.936")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "chinese-traditional");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Chinese (Traditional)_Taiwan.950")
|
||||
|| broken(!strcmp(ret, "Chinese_Taiwan.950")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "chs");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936")
|
||||
|| broken(!strcmp(ret, "Chinese_People's Republic of China.936")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "cht");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Chinese (Traditional)_Taiwan.950")
|
||||
|| broken(!strcmp(ret, "Chinese_Taiwan.950")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "csy");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Czech_Czech Republic.1250"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "czech");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Czech_Czech Republic.1250"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "dan");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Danish_Denmark.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "danish");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Danish_Denmark.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "dea");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "German_Austria.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "des");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "German_Switzerland.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "deu");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "German_Germany.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "dutch");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Dutch_Netherlands.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "dutch-belgian");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Dutch_Belgium.1252")
|
||||
|| broken(!strcmp(ret, "Dutch_Netherlands.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "ena");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_Australia.1252")
|
||||
|| broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "ell");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Greek_Greece.1253"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "enc");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_Canada.1252")
|
||||
|| broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "eng");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United Kingdom.1252")
|
||||
|| broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "enu");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "enz");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_New Zealand.1252")
|
||||
|| broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "english");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "english-american");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "english-aus");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_Australia.1252")
|
||||
|| broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "english-can");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_Canada.1252")
|
||||
|| broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "english-nz");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_New Zealand.1252")
|
||||
|| broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "english-uk");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United Kingdom.1252")
|
||||
|| broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "english-us");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "english-usa");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "esm");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Spanish_Mexico.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "esn");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Spanish_Spain.1252")
|
||||
|| broken(!strcmp(ret, "Spanish - Modern Sort_Spain.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "esp");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Spanish_Spain.1252")
|
||||
|| broken(!strcmp(ret, "Spanish - Traditional Sort_Spain.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "fin");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Finnish_Finland.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "finnish");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Finnish_Finland.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "fra");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "French_France.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "frb");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "French_Belgium.1252")
|
||||
|| broken(!strcmp(ret, "French_France.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "frc");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "French_Canada.1252")
|
||||
|| broken(!strcmp(ret, "French_France.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "french");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "French_France.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "french-belgian");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "French_Belgium.1252")
|
||||
|| broken(!strcmp(ret, "French_France.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "french-canadian");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "French_Canada.1252")
|
||||
|| broken(!strcmp(ret, "French_France.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "french-swiss");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "French_Switzerland.1252")
|
||||
|| broken(!strcmp(ret, "French_France.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "frs");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "French_Switzerland.1252")
|
||||
|| broken(!strcmp(ret, "French_France.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "german");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "German_Germany.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "german-austrian");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "German_Austria.1252")
|
||||
|| broken(!strcmp(ret, "German_Germany.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "german-swiss");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "German_Switzerland.1252")
|
||||
|| broken(!strcmp(ret, "German_Germany.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "greek");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Greek_Greece.1253"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "hun");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Hungarian_Hungary.1250"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "hungarian");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Hungarian_Hungary.1250"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "icelandic");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Icelandic_Iceland.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "isl");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Icelandic_Iceland.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "ita");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Italian_Italy.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "italian");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Italian_Italy.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "italian-swiss");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Italian_Switzerland.1252") || broken(!strcmp(ret, "Italian_Italy.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "its");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Italian_Switzerland.1252") || broken(!strcmp(ret, "Italian_Italy.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "japanese");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Japanese_Japan.932"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "jpn");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Japanese_Japan.932"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "korean");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Korean_Korea.949"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "korean");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Korean_Korea.949"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "nlb");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Dutch_Belgium.1252")
|
||||
|| broken(!strcmp(ret, "Dutch_Netherlands.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "nld");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Dutch_Netherlands.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "non");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok((!strcmp( ret, "Norwegian-Nynorsk_Norway.1252"))
|
||||
|| broken(!strcmp(ret, "Norwegian (Bokmål)_Norway.1252"))
|
||||
|| broken(!strcmp(ret, "Norwegian_Norway.1252"))
|
||||
|| broken(!strcmp(ret, "Norwegian (Nynorsk)_Norway.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "nor");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Norwegian (Bokmål)_Norway.1252")
|
||||
|| broken(!strcmp(ret, "Norwegian_Norway.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "norwegian-bokmal");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Norwegian (Bokmål)_Norway.1252")
|
||||
|| broken(!strcmp(ret, "Norwegian_Norway.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "norwegian-nynorsk");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Norwegian-Nynorsk_Norway.1252")
|
||||
|| broken(!strcmp(ret, "Norwegian_Norway.1252"))
|
||||
|| broken(!strcmp(ret, "Norwegian (Nynorsk)_Norway.1252"))
|
||||
|| broken(!strcmp(ret, "Norwegian (Bokmål)_Norway.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "plk");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Polish_Poland.1250"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "polish");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Polish_Poland.1250"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "portugese");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Portuguese_Brazil.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "portuguese-brazil");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Portuguese_Brazil.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "ptb");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Portuguese_Brazil.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "ptg");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Portuguese_Portugal.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "rus");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Russian_Russia.1251"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "russian");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Russian_Russia.1251"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "sky");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Slovak_Slovakia.1250"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "slovak");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Slovak_Slovakia.1250"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "spanish");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Spanish_Spain.1252")
|
||||
|| broken(!strcmp(ret, "Spanish - Traditional Sort_Spain.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "spanish-mexican");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Spanish_Mexico.1252")
|
||||
|| broken(!strcmp(ret, "Spanish_Spain.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "spanish-modern");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
todo_wine ok(!strcmp(ret, "Spanish - Modern Sort_Spain.1252")
|
||||
|| broken(!strcmp(ret, "Spanish_Spain.1252")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "sve");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Swedish_Sweden.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "swedish");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Swedish_Sweden.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "swiss");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "German_Switzerland.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "trk");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Turkish_Turkey.1254"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "turkish");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "Turkish_Turkey.1254"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "uk");
|
||||
ok(ret != NULL, "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United Kingdom.1252")
|
||||
|| broken(!strcmp(ret, "Ukrainian_Ukraine.1251")), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "us");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret);
|
||||
|
||||
ret = setlocale(LC_ALL, "usa");
|
||||
ok(ret != NULL || broken (ret == NULL), "ret == NULL\n");
|
||||
if(ret)
|
||||
ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret);
|
||||
}
|
||||
|
||||
static void test_crtGetStringTypeW(void)
|
||||
{
|
||||
static const wchar_t str0[] = { '0', '\0' };
|
||||
static const wchar_t strA[] = { 'A', '\0' };
|
||||
static const wchar_t str_space[] = { ' ', '\0' };
|
||||
static const wchar_t str_null[] = { '\0', '\0' };
|
||||
static const wchar_t str_rand[] = { 1234, '\0' };
|
||||
|
||||
const wchar_t *str[] = { str0, strA, str_space, str_null, str_rand };
|
||||
|
||||
WORD out_crt, out;
|
||||
BOOL ret_crt, ret;
|
||||
int i;
|
||||
|
||||
if(!p__crtGetStringTypeW) {
|
||||
win_skip("Skipping __crtGetStringTypeW tests\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!pmemcpy_s) {
|
||||
win_skip("Too old version of msvcrt.dll\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for(i=0; i<sizeof(str)/sizeof(*str); i++) {
|
||||
ret_crt = p__crtGetStringTypeW(0, CT_CTYPE1, str[i], 1, &out_crt);
|
||||
ret = GetStringTypeW(CT_CTYPE1, str[i], 1, &out);
|
||||
ok(ret == ret_crt, "%d) ret_crt = %d\n", i, (int)ret_crt);
|
||||
ok(out == out_crt, "%d) out_crt = %x, expected %x\n", i, (int)out_crt, (int)out);
|
||||
|
||||
ret_crt = p__crtGetStringTypeW(0, CT_CTYPE2, str[i], 1, &out_crt);
|
||||
ret = GetStringTypeW(CT_CTYPE2, str[i], 1, &out);
|
||||
ok(ret == ret_crt, "%d) ret_crt = %d\n", i, (int)ret_crt);
|
||||
ok(out == out_crt, "%d) out_crt = %x, expected %x\n", i, (int)out_crt, (int)out);
|
||||
|
||||
ret_crt = p__crtGetStringTypeW(0, CT_CTYPE3, str[i], 1, &out_crt);
|
||||
ret = GetStringTypeW(CT_CTYPE3, str[i], 1, &out);
|
||||
ok(ret == ret_crt, "%d) ret_crt = %d\n", i, (int)ret_crt);
|
||||
ok(out == out_crt, "%d) out_crt = %x, expected %x\n", i, (int)out_crt, (int)out);
|
||||
}
|
||||
|
||||
ret = p__crtGetStringTypeW(0, 3, str[0], 1, &out);
|
||||
ok(!ret, "ret == TRUE\n");
|
||||
}
|
||||
|
||||
START_TEST(locale)
|
||||
{
|
||||
init();
|
||||
|
||||
test_crtGetStringTypeW();
|
||||
test_setlocale();
|
||||
}
|
||||
@@ -20,14 +20,19 @@
|
||||
|
||||
#include "wine/test.h"
|
||||
#include <errno.h>
|
||||
#include "msvcrt.h"
|
||||
|
||||
static int (__cdecl *prand_s)(unsigned int *);
|
||||
static int (__cdecl *pmemcpy_s)(void *, MSVCRT_size_t, void*, MSVCRT_size_t);
|
||||
static int (__cdecl *pI10_OUTPUT)(long double, int, int, void*);
|
||||
|
||||
static void init(void)
|
||||
{
|
||||
HMODULE hmod = GetModuleHandleA("msvcrt.dll");
|
||||
|
||||
prand_s = (void *)GetProcAddress(hmod, "rand_s");
|
||||
pmemcpy_s = (void*)GetProcAddress(hmod, "memcpy_s");
|
||||
pI10_OUTPUT = (void*)GetProcAddress(hmod, "$I10_OUTPUT");
|
||||
}
|
||||
|
||||
static void test_rand_s(void)
|
||||
@@ -50,9 +55,148 @@ static void test_rand_s(void)
|
||||
ok(ret == 0, "Expected rand_s to return 0, got %d\n", ret);
|
||||
}
|
||||
|
||||
static void test_memcpy_s(void)
|
||||
{
|
||||
static char data[] = "data\0to\0be\0copied";
|
||||
static char dest[32];
|
||||
int ret;
|
||||
|
||||
if(!pmemcpy_s)
|
||||
{
|
||||
win_skip("memcpy_s is not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
errno = 0xdeadbeef;
|
||||
ret = pmemcpy_s(NULL, 0, NULL, 0);
|
||||
ok(ret == 0, "ret = %x\n", ret);
|
||||
ok(errno == 0xdeadbeef, "errno = %x\n", errno);
|
||||
|
||||
errno = 0xdeadbeef;
|
||||
dest[0] = 'x';
|
||||
ret = pmemcpy_s(dest, 10, NULL, 0);
|
||||
ok(ret == 0, "ret = %x\n", ret);
|
||||
ok(errno == 0xdeadbeef, "errno = %x\n", errno);
|
||||
ok(dest[0] == 'x', "dest[0] != \'x\'\n");
|
||||
|
||||
errno = 0xdeadbeef;
|
||||
ret = pmemcpy_s(NULL, 10, data, 10);
|
||||
ok(ret == EINVAL, "ret = %x\n", ret);
|
||||
ok(errno == EINVAL, "errno = %x\n", errno);
|
||||
|
||||
errno = 0xdeadbeef;
|
||||
dest[7] = 'x';
|
||||
ret = pmemcpy_s(dest, 10, data, 5);
|
||||
ok(ret == 0, "ret = %x\n", ret);
|
||||
ok(errno == 0xdeadbeef, "errno = %x\n", errno);
|
||||
ok(memcmp(dest, data, 10), "All data copied\n");
|
||||
ok(!memcmp(dest, data, 5), "First five bytes are different\n");
|
||||
|
||||
errno = 0xdeadbeef;
|
||||
ret = pmemcpy_s(data, 10, data, 10);
|
||||
ok(ret == 0, "ret = %x\n", ret);
|
||||
ok(errno == 0xdeadbeef, "errno = %x\n", errno);
|
||||
ok(!memcmp(dest, data, 5), "data was destroyed during overwriting\n");
|
||||
|
||||
errno = 0xdeadbeef;
|
||||
dest[0] = 'x';
|
||||
ret = pmemcpy_s(dest, 5, data, 10);
|
||||
ok(ret == ERANGE, "ret = %x\n", ret);
|
||||
ok(errno == ERANGE, "errno = %x\n", errno);
|
||||
ok(dest[0] == '\0', "dest[0] != \'\\0\'\n");
|
||||
}
|
||||
|
||||
typedef struct _I10_OUTPUT_data {
|
||||
short pos;
|
||||
char sign;
|
||||
BYTE len;
|
||||
char str[100];
|
||||
} I10_OUTPUT_data;
|
||||
|
||||
typedef struct _I10_OUTPUT_test {
|
||||
long double d;
|
||||
int size;
|
||||
int flags;
|
||||
|
||||
I10_OUTPUT_data out;
|
||||
int ret;
|
||||
const char *remain;
|
||||
} I10_OUTPUT_test;
|
||||
|
||||
static const I10_OUTPUT_test I10_OUTPUT_tests[] = {
|
||||
/* arg3 = 0 */
|
||||
{ 0.0, 10, 0, {0, ' ', 1, "0"}, 1, "" },
|
||||
{ 1.0, 10, 0, {1, ' ', 1, "1"}, 1, "000000009" },
|
||||
{ -1.0, 10, 0, {1, '-', 1, "1"}, 1, "000000009" },
|
||||
{ 1.23, 10, 0, {1, ' ', 3, "123"}, 1, "0000009" },
|
||||
{ 1e13, 10, 0, {14, ' ', 1, "1"}, 1, "000000009" },
|
||||
{ 1e30, 30, 0, {31, ' ', 21, "100000000000000001988"}, 1, "" },
|
||||
{ 1e-13, 10, 0, {-12, ' ', 1, "1"}, 1, "000000000" },
|
||||
{ 0.25, 10, 0, {0, ' ', 2, "25"}, 1, "00000000" },
|
||||
{ 1.0000001, 10, 0, {1, ' ', 8, "10000001"}, 1, "00" },
|
||||
/* arg3 = 1 */
|
||||
{ 0.0, 10, 1, {0, ' ', 1, "0"}, 1, "" },
|
||||
{ 1.0, 10, 1, {1, ' ', 1, "1"}, 1, "0000000009" },
|
||||
{ -1.0, 10, 1, {1, '-', 1, "1"}, 1, "0000000009" },
|
||||
{ 1.23, 10, 1, {1, ' ', 3, "123"}, 1, "00000009" },
|
||||
{ 1e13, 10, 1, {14, ' ', 1, "1"}, 1, "00000000000000000009" },
|
||||
{ 1e30, 30, 1, {31, ' ', 21, "100000000000000001988"}, 1, "" },
|
||||
{ 1e-13, 10, 1, {0, ' ', 1, "0"}, 1, "" },
|
||||
{ 1e-7, 10, 1, {-6, ' ', 1, "1"}, 1, "09" },
|
||||
{ 0.25, 10, 1, {0, ' ', 2, "25"}, 1, "00000000" },
|
||||
{ 1.0000001, 10, 1, {1, ' ', 8, "10000001"}, 1, "000" },
|
||||
/* too small buffer */
|
||||
{ 0.0, 0, 0, {0, ' ', 1, "0"}, 1, "" },
|
||||
{ 0.0, 0, 1, {0, ' ', 1, "0"}, 1, "" },
|
||||
{ 123.0, 2, 0, {3, ' ', 2, "12"}, 1, "" },
|
||||
{ 123.0, 0, 0, {0, ' ', 1, "0"}, 1, "" },
|
||||
{ 123.0, 2, 1, {3, ' ', 3, "123"}, 1, "09" },
|
||||
{ 0.99, 1, 0, {1, ' ', 1, "1"}, 1, "" },
|
||||
{ 1264567.0, 2, 0, {7, ' ', 2, "13"}, 1, "" },
|
||||
{ 1264567.0, 2, 1, {7, ' ', 7, "1264567"}, 1, "00" },
|
||||
{ 1234567891.0, 2, 1, {10, ' ', 10, "1234567891"}, 1, "09" }
|
||||
};
|
||||
|
||||
static void test_I10_OUTPUT(void)
|
||||
{
|
||||
I10_OUTPUT_data out;
|
||||
int i, j, ret;
|
||||
|
||||
if(!pI10_OUTPUT) {
|
||||
win_skip("I10_OUTPUT not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for(i=0; i<sizeof(I10_OUTPUT_tests)/sizeof(I10_OUTPUT_test); i++) {
|
||||
memset(out.str, '#', sizeof(out.str));
|
||||
|
||||
ret = pI10_OUTPUT(I10_OUTPUT_tests[i].d, I10_OUTPUT_tests[i].size, I10_OUTPUT_tests[i].flags, &out);
|
||||
ok(ret == I10_OUTPUT_tests[i].ret, "%d: ret = %d\n", i, ret);
|
||||
ok(out.pos == I10_OUTPUT_tests[i].out.pos, "%d: out.pos = %hd\n", i, out.pos);
|
||||
ok(out.sign == I10_OUTPUT_tests[i].out.sign, "%d: out.size = %c\n", i, out.sign);
|
||||
ok(out.len == I10_OUTPUT_tests[i].out.len, "%d: out.len = %d\n", i, (int)out.len);
|
||||
ok(!strcmp(out.str, I10_OUTPUT_tests[i].out.str), "%d: out.str = %s\n", i, out.str);
|
||||
|
||||
j = strlen(I10_OUTPUT_tests[i].remain);
|
||||
if(j && I10_OUTPUT_tests[i].remain[j-1]=='9')
|
||||
todo_wine ok(!strncmp(out.str+out.len+1, I10_OUTPUT_tests[i].remain, j),
|
||||
"%d: &out.str[%d] = %.25s...\n", i, out.len+1, out.str+out.len+1);
|
||||
else
|
||||
ok(!strncmp(out.str+out.len+1, I10_OUTPUT_tests[i].remain, j),
|
||||
"%d: &out.str[%d] = %.25s...\n", i, out.len+1, out.str+out.len+1);
|
||||
|
||||
|
||||
for(j=out.len+strlen(I10_OUTPUT_tests[i].remain)+1; j<sizeof(out.str); j++)
|
||||
if(out.str[j] != '#')
|
||||
ok(0, "%d: out.str[%d] = %c (expected \'#\')\n", i, j, out.str[j]);
|
||||
}
|
||||
}
|
||||
|
||||
START_TEST(misc)
|
||||
{
|
||||
init();
|
||||
|
||||
test_rand_s();
|
||||
test_memcpy_s();
|
||||
test_I10_OUTPUT();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,841 @@
|
||||
/*
|
||||
* Copyright 2001 Jon Griffiths
|
||||
* Copyright 2004 Dimitrie O. Paun
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*
|
||||
* NOTES
|
||||
* Naming conventions
|
||||
* - Symbols are prefixed with MSVCRT_ if they conflict
|
||||
* with libc symbols
|
||||
* - Internal symbols are usually prefixed by msvcrt_.
|
||||
* - Exported symbols that are not present in the public
|
||||
* headers are usually kept the same as the original.
|
||||
* Other conventions
|
||||
* - To avoid conflicts with the standard C library,
|
||||
* no msvcrt headers are included in the implementation.
|
||||
* - Instead, symbols are duplicated here, prefixed with
|
||||
* MSVCRT_, as explained above.
|
||||
* - To avoid inconsistencies, a test for each symbol is
|
||||
* added into tests/headers.c. Please always add a
|
||||
* corresponding test when you add a new symbol!
|
||||
*/
|
||||
|
||||
#ifndef __WINE_MSVCRT_H
|
||||
#define __WINE_MSVCRT_H
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
|
||||
#define MSVCRT_LONG_MAX 0x7fffffffL
|
||||
#define MSVCRT_ULONG_MAX 0xffffffffUL
|
||||
#define MSVCRT_I64_MAX (((__int64)0x7fffffff << 32) | 0xffffffff)
|
||||
#define MSVCRT_I64_MIN (-MSVCRT_I64_MAX-1)
|
||||
#define MSVCRT_UI64_MAX (((unsigned __int64)0xffffffff << 32) | 0xffffffff)
|
||||
|
||||
typedef unsigned short MSVCRT_wchar_t;
|
||||
typedef unsigned short MSVCRT_wint_t;
|
||||
typedef unsigned short MSVCRT_wctype_t;
|
||||
typedef unsigned short MSVCRT__ino_t;
|
||||
typedef unsigned int MSVCRT__fsize_t;
|
||||
typedef int MSVCRT_long;
|
||||
typedef unsigned int MSVCRT_ulong;
|
||||
#ifdef _WIN64
|
||||
typedef unsigned __int64 MSVCRT_size_t;
|
||||
typedef __int64 MSVCRT_intptr_t;
|
||||
typedef unsigned __int64 MSVCRT_uintptr_t;
|
||||
#else
|
||||
typedef unsigned long MSVCRT_size_t;
|
||||
typedef long MSVCRT_intptr_t;
|
||||
typedef unsigned long MSVCRT_uintptr_t;
|
||||
#endif
|
||||
typedef unsigned int MSVCRT__dev_t;
|
||||
typedef int MSVCRT__off_t;
|
||||
typedef int MSVCRT_clock_t;
|
||||
typedef int MSVCRT___time32_t;
|
||||
typedef __int64 DECLSPEC_ALIGN(8) MSVCRT___time64_t;
|
||||
typedef __int64 DECLSPEC_ALIGN(8) MSVCRT_fpos_t;
|
||||
|
||||
typedef void (*__cdecl MSVCRT_terminate_handler)(void);
|
||||
typedef void (*__cdecl MSVCRT_terminate_function)(void);
|
||||
typedef void (*__cdecl MSVCRT_unexpected_handler)(void);
|
||||
typedef void (*__cdecl MSVCRT_unexpected_function)(void);
|
||||
typedef void (*__cdecl MSVCRT__se_translator_function)(unsigned int code, struct _EXCEPTION_POINTERS *info);
|
||||
typedef void (*__cdecl MSVCRT__beginthread_start_routine_t)(void *);
|
||||
typedef unsigned int (__stdcall *MSVCRT__beginthreadex_start_routine_t)(void *);
|
||||
typedef int (*__cdecl MSVCRT__onexit_t)(void);
|
||||
typedef void (__cdecl *MSVCRT_invalid_parameter_handler)(const MSVCRT_wchar_t*, const MSVCRT_wchar_t*, const MSVCRT_wchar_t*, unsigned, MSVCRT_uintptr_t);
|
||||
|
||||
typedef struct {long double x;} MSVCRT__LDOUBLE;
|
||||
|
||||
struct MSVCRT_tm {
|
||||
int tm_sec;
|
||||
int tm_min;
|
||||
int tm_hour;
|
||||
int tm_mday;
|
||||
int tm_mon;
|
||||
int tm_year;
|
||||
int tm_wday;
|
||||
int tm_yday;
|
||||
int tm_isdst;
|
||||
};
|
||||
|
||||
|
||||
/* TLS data */
|
||||
extern DWORD msvcrt_tls_index;
|
||||
|
||||
struct __thread_data {
|
||||
int thread_errno;
|
||||
MSVCRT_ulong thread_doserrno;
|
||||
unsigned int random_seed; /* seed for rand() */
|
||||
char *strtok_next; /* next ptr for strtok() */
|
||||
unsigned char *mbstok_next; /* next ptr for mbstok() */
|
||||
MSVCRT_wchar_t *wcstok_next; /* next ptr for wcstok() */
|
||||
char *efcvt_buffer; /* buffer for ecvt/fcvt */
|
||||
char *asctime_buffer; /* buffer for asctime */
|
||||
MSVCRT_wchar_t *wasctime_buffer; /* buffer for wasctime */
|
||||
struct MSVCRT_tm time_buffer; /* buffer for localtime/gmtime */
|
||||
char *strerror_buffer; /* buffer for strerror */
|
||||
int fpecode;
|
||||
MSVCRT_terminate_function terminate_handler;
|
||||
MSVCRT_unexpected_function unexpected_handler;
|
||||
MSVCRT__se_translator_function se_translator;
|
||||
EXCEPTION_RECORD *exc_record;
|
||||
struct MSVCRT_localeinfo_struct *locale;
|
||||
};
|
||||
|
||||
typedef struct __thread_data thread_data_t;
|
||||
|
||||
extern thread_data_t *msvcrt_get_thread_data(void);
|
||||
|
||||
extern int MSVCRT___lc_codepage;
|
||||
extern int MSVCRT___lc_collate_cp;
|
||||
extern int MSVCRT___mb_cur_max;
|
||||
extern WORD MSVCRT__ctype [257];
|
||||
extern WORD* MSVCRT__pctype;
|
||||
|
||||
void msvcrt_set_errno(int);
|
||||
|
||||
void __cdecl _purecall(void);
|
||||
void __cdecl _amsg_exit(int errnum);
|
||||
|
||||
extern char **MSVCRT__environ;
|
||||
extern MSVCRT_wchar_t **MSVCRT__wenviron;
|
||||
|
||||
extern char ** msvcrt_SnapshotOfEnvironmentA(char **);
|
||||
extern MSVCRT_wchar_t ** msvcrt_SnapshotOfEnvironmentW(MSVCRT_wchar_t **);
|
||||
|
||||
MSVCRT_wchar_t *msvcrt_wstrdupa(const char *);
|
||||
|
||||
/* FIXME: This should be declared in new.h but it's not an extern "C" so
|
||||
* it would not be much use anyway. Even for Winelib applications.
|
||||
*/
|
||||
int __cdecl MSVCRT__set_new_mode(int mode);
|
||||
|
||||
void* __cdecl MSVCRT_operator_new(MSVCRT_size_t);
|
||||
void __cdecl MSVCRT_operator_delete(void*);
|
||||
|
||||
typedef void* (*__cdecl malloc_func_t)(MSVCRT_size_t);
|
||||
typedef void (*__cdecl free_func_t)(void*);
|
||||
|
||||
extern char* __cdecl __unDName(char *,const char*,int,malloc_func_t,free_func_t,unsigned short int);
|
||||
extern char* __cdecl __unDNameEx(char *,const char*,int,malloc_func_t,free_func_t,void *,unsigned short int);
|
||||
|
||||
/* Setup and teardown multi threaded locks */
|
||||
extern void msvcrt_init_mt_locks(void);
|
||||
extern void msvcrt_free_mt_locks(void);
|
||||
|
||||
extern void msvcrt_init_io(void);
|
||||
extern void msvcrt_free_io(void);
|
||||
extern void msvcrt_init_console(void);
|
||||
extern void msvcrt_free_console(void);
|
||||
extern void msvcrt_init_args(void);
|
||||
extern void msvcrt_free_args(void);
|
||||
extern void msvcrt_init_signals(void);
|
||||
extern void msvcrt_free_signals(void);
|
||||
|
||||
extern unsigned msvcrt_create_io_inherit_block(WORD*, BYTE**);
|
||||
|
||||
extern unsigned int __cdecl _control87(unsigned int, unsigned int);
|
||||
|
||||
/* run-time error codes */
|
||||
#define _RT_STACK 0
|
||||
#define _RT_NULLPTR 1
|
||||
#define _RT_FLOAT 2
|
||||
#define _RT_INTDIV 3
|
||||
#define _RT_EXECMEM 5
|
||||
#define _RT_EXECFORM 6
|
||||
#define _RT_EXECENV 7
|
||||
#define _RT_SPACEARG 8
|
||||
#define _RT_SPACEENV 9
|
||||
#define _RT_ABORT 10
|
||||
#define _RT_NPTR 12
|
||||
#define _RT_FPTR 13
|
||||
#define _RT_BREAK 14
|
||||
#define _RT_INT 15
|
||||
#define _RT_THREAD 16
|
||||
#define _RT_LOCK 17
|
||||
#define _RT_HEAP 18
|
||||
#define _RT_OPENCON 19
|
||||
#define _RT_QWIN 20
|
||||
#define _RT_NOMAIN 21
|
||||
#define _RT_NONCONT 22
|
||||
#define _RT_INVALDISP 23
|
||||
#define _RT_ONEXIT 24
|
||||
#define _RT_PUREVIRT 25
|
||||
#define _RT_STDIOINIT 26
|
||||
#define _RT_LOWIOINIT 27
|
||||
#define _RT_HEAPINIT 28
|
||||
#define _RT_DOMAIN 120
|
||||
#define _RT_SING 121
|
||||
#define _RT_TLOSS 122
|
||||
#define _RT_CRNL 252
|
||||
#define _RT_BANNER 255
|
||||
|
||||
struct MSVCRT___timeb32 {
|
||||
MSVCRT___time32_t time;
|
||||
unsigned short millitm;
|
||||
short timezone;
|
||||
short dstflag;
|
||||
};
|
||||
|
||||
struct MSVCRT___timeb64 {
|
||||
MSVCRT___time64_t time;
|
||||
unsigned short millitm;
|
||||
short timezone;
|
||||
short dstflag;
|
||||
};
|
||||
|
||||
struct MSVCRT__iobuf {
|
||||
char* _ptr;
|
||||
int _cnt;
|
||||
char* _base;
|
||||
int _flag;
|
||||
int _file;
|
||||
int _charbuf;
|
||||
int _bufsiz;
|
||||
char* _tmpfname;
|
||||
};
|
||||
|
||||
typedef struct MSVCRT__iobuf MSVCRT_FILE;
|
||||
|
||||
struct MSVCRT_lconv {
|
||||
char* decimal_point;
|
||||
char* thousands_sep;
|
||||
char* grouping;
|
||||
char* int_curr_symbol;
|
||||
char* currency_symbol;
|
||||
char* mon_decimal_point;
|
||||
char* mon_thousands_sep;
|
||||
char* mon_grouping;
|
||||
char* positive_sign;
|
||||
char* negative_sign;
|
||||
char int_frac_digits;
|
||||
char frac_digits;
|
||||
char p_cs_precedes;
|
||||
char p_sep_by_space;
|
||||
char n_cs_precedes;
|
||||
char n_sep_by_space;
|
||||
char p_sign_posn;
|
||||
char n_sign_posn;
|
||||
};
|
||||
|
||||
struct MSVCRT__exception {
|
||||
int type;
|
||||
char* name;
|
||||
double arg1;
|
||||
double arg2;
|
||||
double retval;
|
||||
};
|
||||
|
||||
struct MSVCRT__complex {
|
||||
double x; /* Real part */
|
||||
double y; /* Imaginary part */
|
||||
};
|
||||
|
||||
typedef struct MSVCRT__div_t {
|
||||
int quot; /* quotient */
|
||||
int rem; /* remainder */
|
||||
} MSVCRT_div_t;
|
||||
|
||||
typedef struct MSVCRT__ldiv_t {
|
||||
MSVCRT_long quot; /* quotient */
|
||||
MSVCRT_long rem; /* remainder */
|
||||
} MSVCRT_ldiv_t;
|
||||
|
||||
struct MSVCRT__heapinfo {
|
||||
int* _pentry;
|
||||
MSVCRT_size_t _size;
|
||||
int _useflag;
|
||||
};
|
||||
|
||||
#ifdef __i386__
|
||||
struct MSVCRT___JUMP_BUFFER {
|
||||
unsigned long Ebp;
|
||||
unsigned long Ebx;
|
||||
unsigned long Edi;
|
||||
unsigned long Esi;
|
||||
unsigned long Esp;
|
||||
unsigned long Eip;
|
||||
unsigned long Registration;
|
||||
unsigned long TryLevel;
|
||||
/* Start of new struct members */
|
||||
unsigned long Cookie;
|
||||
unsigned long UnwindFunc;
|
||||
unsigned long UnwindData[6];
|
||||
};
|
||||
#endif /* __i386__ */
|
||||
|
||||
struct MSVCRT__diskfree_t {
|
||||
unsigned int total_clusters;
|
||||
unsigned int avail_clusters;
|
||||
unsigned int sectors_per_cluster;
|
||||
unsigned int bytes_per_sector;
|
||||
};
|
||||
|
||||
struct MSVCRT__finddata32_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time32_t time_create;
|
||||
MSVCRT___time32_t time_access;
|
||||
MSVCRT___time32_t time_write;
|
||||
MSVCRT__fsize_t size;
|
||||
char name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__finddata32i64_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time32_t time_create;
|
||||
MSVCRT___time32_t time_access;
|
||||
MSVCRT___time32_t time_write;
|
||||
__int64 DECLSPEC_ALIGN(8) size;
|
||||
char name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__finddata64i32_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time64_t time_create;
|
||||
MSVCRT___time64_t time_access;
|
||||
MSVCRT___time64_t time_write;
|
||||
MSVCRT__fsize_t size;
|
||||
char name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__finddata64_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time64_t time_create;
|
||||
MSVCRT___time64_t time_access;
|
||||
MSVCRT___time64_t time_write;
|
||||
__int64 DECLSPEC_ALIGN(8) size;
|
||||
char name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__wfinddata32_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time32_t time_create;
|
||||
MSVCRT___time32_t time_access;
|
||||
MSVCRT___time32_t time_write;
|
||||
MSVCRT__fsize_t size;
|
||||
MSVCRT_wchar_t name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__wfinddata32i64_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time32_t time_create;
|
||||
MSVCRT___time32_t time_access;
|
||||
MSVCRT___time32_t time_write;
|
||||
__int64 DECLSPEC_ALIGN(8) size;
|
||||
MSVCRT_wchar_t name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__wfinddata64i32_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time64_t time_create;
|
||||
MSVCRT___time64_t time_access;
|
||||
MSVCRT___time64_t time_write;
|
||||
MSVCRT__fsize_t size;
|
||||
MSVCRT_wchar_t name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT__wfinddata64_t {
|
||||
unsigned int attrib;
|
||||
MSVCRT___time64_t time_create;
|
||||
MSVCRT___time64_t time_access;
|
||||
MSVCRT___time64_t time_write;
|
||||
__int64 DECLSPEC_ALIGN(8) size;
|
||||
MSVCRT_wchar_t name[260];
|
||||
};
|
||||
|
||||
struct MSVCRT___utimbuf32
|
||||
{
|
||||
MSVCRT___time32_t actime;
|
||||
MSVCRT___time32_t modtime;
|
||||
};
|
||||
|
||||
struct MSVCRT___utimbuf64
|
||||
{
|
||||
MSVCRT___time64_t actime;
|
||||
MSVCRT___time64_t modtime;
|
||||
};
|
||||
|
||||
/* for FreeBSD */
|
||||
#undef st_atime
|
||||
#undef st_ctime
|
||||
#undef st_mtime
|
||||
|
||||
struct MSVCRT__stat32 {
|
||||
MSVCRT__dev_t st_dev;
|
||||
MSVCRT__ino_t st_ino;
|
||||
unsigned short st_mode;
|
||||
short st_nlink;
|
||||
short st_uid;
|
||||
short st_gid;
|
||||
MSVCRT__dev_t st_rdev;
|
||||
MSVCRT__off_t st_size;
|
||||
MSVCRT___time32_t st_atime;
|
||||
MSVCRT___time32_t st_mtime;
|
||||
MSVCRT___time32_t st_ctime;
|
||||
};
|
||||
|
||||
struct MSVCRT__stat32i64 {
|
||||
MSVCRT__dev_t st_dev;
|
||||
MSVCRT__ino_t st_ino;
|
||||
unsigned short st_mode;
|
||||
short st_nlink;
|
||||
short st_uid;
|
||||
short st_gid;
|
||||
MSVCRT__dev_t st_rdev;
|
||||
__int64 DECLSPEC_ALIGN(8) st_size;
|
||||
MSVCRT___time32_t st_atime;
|
||||
MSVCRT___time32_t st_mtime;
|
||||
MSVCRT___time32_t st_ctime;
|
||||
};
|
||||
|
||||
struct MSVCRT__stat64i32 {
|
||||
MSVCRT__dev_t st_dev;
|
||||
MSVCRT__ino_t st_ino;
|
||||
unsigned short st_mode;
|
||||
short st_nlink;
|
||||
short st_uid;
|
||||
short st_gid;
|
||||
MSVCRT__dev_t st_rdev;
|
||||
MSVCRT__off_t st_size;
|
||||
MSVCRT___time64_t st_atime;
|
||||
MSVCRT___time64_t st_mtime;
|
||||
MSVCRT___time64_t st_ctime;
|
||||
};
|
||||
|
||||
struct MSVCRT__stat64 {
|
||||
MSVCRT__dev_t st_dev;
|
||||
MSVCRT__ino_t st_ino;
|
||||
unsigned short st_mode;
|
||||
short st_nlink;
|
||||
short st_uid;
|
||||
short st_gid;
|
||||
MSVCRT__dev_t st_rdev;
|
||||
__int64 DECLSPEC_ALIGN(8) st_size;
|
||||
MSVCRT___time64_t st_atime;
|
||||
MSVCRT___time64_t st_mtime;
|
||||
MSVCRT___time64_t st_ctime;
|
||||
};
|
||||
|
||||
#ifdef _WIN64
|
||||
#define MSVCRT__finddata_t MSVCRT__finddata64i32_t
|
||||
#define MSVCRT__finddatai64_t MSVCRT__finddata64_t
|
||||
#define MSVCRT__wfinddata_t MSVCRT__wfinddata64i32_t
|
||||
#define MSVCRT__wfinddatai64_t MSVCRT__wfinddata64_t
|
||||
#define MSVCRT__stat MSVCRT__stat64i32
|
||||
#define MSVCRT__stati64 MSVCRT__stat64
|
||||
#else
|
||||
#define MSVCRT__finddata_t MSVCRT__finddata32_t
|
||||
#define MSVCRT__finddatai64_t MSVCRT__finddata32i64_t
|
||||
#define MSVCRT__wfinddata_t MSVCRT__wfinddata32_t
|
||||
#define MSVCRT__wfinddatai64_t MSVCRT__wfinddata32i64_t
|
||||
#define MSVCRT__stat MSVCRT__stat32
|
||||
#define MSVCRT__stati64 MSVCRT__stat32i64
|
||||
#endif
|
||||
|
||||
#define MSVCRT_WEOF (MSVCRT_wint_t)(0xFFFF)
|
||||
#define MSVCRT_EOF (-1)
|
||||
#define MSVCRT_TMP_MAX 0x7fff
|
||||
#define MSVCRT_RAND_MAX 0x7fff
|
||||
#define MSVCRT_BUFSIZ 512
|
||||
|
||||
#define MSVCRT_STDIN_FILENO 0
|
||||
#define MSVCRT_STDOUT_FILENO 1
|
||||
#define MSVCRT_STDERR_FILENO 2
|
||||
|
||||
/* more file._flag flags, but these conflict with Unix */
|
||||
#define MSVCRT__IOFBF 0x0000
|
||||
#define MSVCRT__IONBF 0x0004
|
||||
#define MSVCRT__IOLBF 0x0040
|
||||
|
||||
#define MSVCRT_FILENAME_MAX 260
|
||||
#define MSVCRT_DRIVE_MAX 3
|
||||
#define MSVCRT_FNAME_MAX 256
|
||||
#define MSVCRT_DIR_MAX 256
|
||||
#define MSVCRT_EXT_MAX 256
|
||||
#define MSVCRT_PATH_MAX 260
|
||||
#define MSVCRT_stdin (MSVCRT__iob+MSVCRT_STDIN_FILENO)
|
||||
#define MSVCRT_stdout (MSVCRT__iob+MSVCRT_STDOUT_FILENO)
|
||||
#define MSVCRT_stderr (MSVCRT__iob+MSVCRT_STDERR_FILENO)
|
||||
|
||||
#define MSVCRT__P_WAIT 0
|
||||
#define MSVCRT__P_NOWAIT 1
|
||||
#define MSVCRT__P_OVERLAY 2
|
||||
#define MSVCRT__P_NOWAITO 3
|
||||
#define MSVCRT__P_DETACH 4
|
||||
|
||||
#define MSVCRT_EPERM 1
|
||||
#define MSVCRT_ENOENT 2
|
||||
#define MSVCRT_ESRCH 3
|
||||
#define MSVCRT_EINTR 4
|
||||
#define MSVCRT_EIO 5
|
||||
#define MSVCRT_ENXIO 6
|
||||
#define MSVCRT_E2BIG 7
|
||||
#define MSVCRT_ENOEXEC 8
|
||||
#define MSVCRT_EBADF 9
|
||||
#define MSVCRT_ECHILD 10
|
||||
#define MSVCRT_EAGAIN 11
|
||||
#define MSVCRT_ENOMEM 12
|
||||
#define MSVCRT_EACCES 13
|
||||
#define MSVCRT_EFAULT 14
|
||||
#define MSVCRT_EBUSY 16
|
||||
#define MSVCRT_EEXIST 17
|
||||
#define MSVCRT_EXDEV 18
|
||||
#define MSVCRT_ENODEV 19
|
||||
#define MSVCRT_ENOTDIR 20
|
||||
#define MSVCRT_EISDIR 21
|
||||
#define MSVCRT_EINVAL 22
|
||||
#define MSVCRT_ENFILE 23
|
||||
#define MSVCRT_EMFILE 24
|
||||
#define MSVCRT_ENOTTY 25
|
||||
#define MSVCRT_EFBIG 27
|
||||
#define MSVCRT_ENOSPC 28
|
||||
#define MSVCRT_ESPIPE 29
|
||||
#define MSVCRT_EROFS 30
|
||||
#define MSVCRT_EMLINK 31
|
||||
#define MSVCRT_EPIPE 32
|
||||
#define MSVCRT_EDOM 33
|
||||
#define MSVCRT_ERANGE 34
|
||||
#define MSVCRT_EDEADLK 36
|
||||
#define MSVCRT_EDEADLOCK MSVCRT_EDEADLK
|
||||
#define MSVCRT_ENAMETOOLONG 38
|
||||
#define MSVCRT_ENOLCK 39
|
||||
#define MSVCRT_ENOSYS 40
|
||||
#define MSVCRT_ENOTEMPTY 41
|
||||
#define MSVCRT_EILSEQ 42
|
||||
|
||||
#define MSVCRT_LC_ALL 0
|
||||
#define MSVCRT_LC_COLLATE 1
|
||||
#define MSVCRT_LC_CTYPE 2
|
||||
#define MSVCRT_LC_MONETARY 3
|
||||
#define MSVCRT_LC_NUMERIC 4
|
||||
#define MSVCRT_LC_TIME 5
|
||||
#define MSVCRT_LC_MIN MSVCRT_LC_ALL
|
||||
#define MSVCRT_LC_MAX MSVCRT_LC_TIME
|
||||
|
||||
#define MSVCRT__HEAPEMPTY -1
|
||||
#define MSVCRT__HEAPOK -2
|
||||
#define MSVCRT__HEAPBADBEGIN -3
|
||||
#define MSVCRT__HEAPBADNODE -4
|
||||
#define MSVCRT__HEAPEND -5
|
||||
#define MSVCRT__HEAPBADPTR -6
|
||||
|
||||
#define MSVCRT__FREEENTRY 0
|
||||
#define MSVCRT__USEDENTRY 1
|
||||
|
||||
#define MSVCRT__OUT_TO_DEFAULT 0
|
||||
#define MSVCRT__REPORT_ERRMODE 3
|
||||
|
||||
/* ASCII char classification table - binary compatible */
|
||||
#define MSVCRT__UPPER 0x0001 /* C1_UPPER */
|
||||
#define MSVCRT__LOWER 0x0002 /* C1_LOWER */
|
||||
#define MSVCRT__DIGIT 0x0004 /* C1_DIGIT */
|
||||
#define MSVCRT__SPACE 0x0008 /* C1_SPACE */
|
||||
#define MSVCRT__PUNCT 0x0010 /* C1_PUNCT */
|
||||
#define MSVCRT__CONTROL 0x0020 /* C1_CNTRL */
|
||||
#define MSVCRT__BLANK 0x0040 /* C1_BLANK */
|
||||
#define MSVCRT__HEX 0x0080 /* C1_XDIGIT */
|
||||
#define MSVCRT__LEADBYTE 0x8000
|
||||
#define MSVCRT__ALPHA (0x0100|MSVCRT__UPPER|MSVCRT__LOWER) /* (C1_ALPHA|_UPPER|_LOWER) */
|
||||
|
||||
#define MSVCRT__IOREAD 0x0001
|
||||
#define MSVCRT__IOWRT 0x0002
|
||||
#define MSVCRT__IOMYBUF 0x0008
|
||||
#define MSVCRT__IOEOF 0x0010
|
||||
#define MSVCRT__IOERR 0x0020
|
||||
#define MSVCRT__IOSTRG 0x0040
|
||||
#define MSVCRT__IORW 0x0080
|
||||
|
||||
#define MSVCRT__S_IEXEC 0x0040
|
||||
#define MSVCRT__S_IWRITE 0x0080
|
||||
#define MSVCRT__S_IREAD 0x0100
|
||||
#define MSVCRT__S_IFIFO 0x1000
|
||||
#define MSVCRT__S_IFCHR 0x2000
|
||||
#define MSVCRT__S_IFDIR 0x4000
|
||||
#define MSVCRT__S_IFREG 0x8000
|
||||
#define MSVCRT__S_IFMT 0xF000
|
||||
|
||||
#define MSVCRT__LK_UNLCK 0
|
||||
#define MSVCRT__LK_LOCK 1
|
||||
#define MSVCRT__LK_NBLCK 2
|
||||
#define MSVCRT__LK_RLCK 3
|
||||
#define MSVCRT__LK_NBRLCK 4
|
||||
|
||||
#define MSVCRT__SH_COMPAT 0x00 /* Compatibility */
|
||||
#define MSVCRT__SH_DENYRW 0x10 /* Deny read/write */
|
||||
#define MSVCRT__SH_DENYWR 0x20 /* Deny write */
|
||||
#define MSVCRT__SH_DENYRD 0x30 /* Deny read */
|
||||
#define MSVCRT__SH_DENYNO 0x40 /* Deny nothing */
|
||||
|
||||
#define MSVCRT__O_RDONLY 0
|
||||
#define MSVCRT__O_WRONLY 1
|
||||
#define MSVCRT__O_RDWR 2
|
||||
#define MSVCRT__O_ACCMODE (MSVCRT__O_RDONLY|MSVCRT__O_WRONLY|MSVCRT__O_RDWR)
|
||||
#define MSVCRT__O_APPEND 0x0008
|
||||
#define MSVCRT__O_RANDOM 0x0010
|
||||
#define MSVCRT__O_SEQUENTIAL 0x0020
|
||||
#define MSVCRT__O_TEMPORARY 0x0040
|
||||
#define MSVCRT__O_NOINHERIT 0x0080
|
||||
#define MSVCRT__O_CREAT 0x0100
|
||||
#define MSVCRT__O_TRUNC 0x0200
|
||||
#define MSVCRT__O_EXCL 0x0400
|
||||
#define MSVCRT__O_SHORT_LIVED 0x1000
|
||||
#define MSVCRT__O_TEXT 0x4000
|
||||
#define MSVCRT__O_BINARY 0x8000
|
||||
#define MSVCRT__O_RAW MSVCRT__O_BINARY
|
||||
|
||||
/* _statusfp bit flags */
|
||||
#define MSVCRT__SW_INEXACT 0x00000001 /* inexact (precision) */
|
||||
#define MSVCRT__SW_UNDERFLOW 0x00000002 /* underflow */
|
||||
#define MSVCRT__SW_OVERFLOW 0x00000004 /* overflow */
|
||||
#define MSVCRT__SW_ZERODIVIDE 0x00000008 /* zero divide */
|
||||
#define MSVCRT__SW_INVALID 0x00000010 /* invalid */
|
||||
|
||||
#define MSVCRT__SW_UNEMULATED 0x00000040 /* unemulated instruction */
|
||||
#define MSVCRT__SW_SQRTNEG 0x00000080 /* square root of a neg number */
|
||||
#define MSVCRT__SW_STACKOVERFLOW 0x00000200 /* FP stack overflow */
|
||||
#define MSVCRT__SW_STACKUNDERFLOW 0x00000400 /* FP stack underflow */
|
||||
|
||||
#define MSVCRT__SW_DENORMAL 0x00080000 /* denormal status bit */
|
||||
|
||||
/* fpclass constants */
|
||||
#define MSVCRT__FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */
|
||||
#define MSVCRT__FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */
|
||||
#define MSVCRT__FPCLASS_NINF 0x0004 /* Negative Infinity */
|
||||
#define MSVCRT__FPCLASS_NN 0x0008 /* Negative Normal */
|
||||
#define MSVCRT__FPCLASS_ND 0x0010 /* Negative Denormal */
|
||||
#define MSVCRT__FPCLASS_NZ 0x0020 /* Negative Zero */
|
||||
#define MSVCRT__FPCLASS_PZ 0x0040 /* Positive Zero */
|
||||
#define MSVCRT__FPCLASS_PD 0x0080 /* Positive Denormal */
|
||||
#define MSVCRT__FPCLASS_PN 0x0100 /* Positive Normal */
|
||||
#define MSVCRT__FPCLASS_PINF 0x0200 /* Positive Infinity */
|
||||
|
||||
#define MSVCRT__EM_INVALID 0x00000010
|
||||
#define MSVCRT__EM_DENORMAL 0x00080000
|
||||
#define MSVCRT__EM_ZERODIVIDE 0x00000008
|
||||
#define MSVCRT__EM_OVERFLOW 0x00000004
|
||||
#define MSVCRT__EM_UNDERFLOW 0x00000002
|
||||
#define MSVCRT__EM_INEXACT 0x00000001
|
||||
#define MSVCRT__IC_AFFINE 0x00040000
|
||||
#define MSVCRT__IC_PROJECTIVE 0x00000000
|
||||
#define MSVCRT__RC_CHOP 0x00000300
|
||||
#define MSVCRT__RC_UP 0x00000200
|
||||
#define MSVCRT__RC_DOWN 0x00000100
|
||||
#define MSVCRT__RC_NEAR 0x00000000
|
||||
#define MSVCRT__PC_24 0x00020000
|
||||
#define MSVCRT__PC_53 0x00010000
|
||||
#define MSVCRT__PC_64 0x00000000
|
||||
|
||||
#define MSVCRT_CLOCKS_PER_SEC 1000
|
||||
|
||||
/* signals */
|
||||
#define MSVCRT_SIGINT 2
|
||||
#define MSVCRT_SIGILL 4
|
||||
#define MSVCRT_SIGFPE 8
|
||||
#define MSVCRT_SIGSEGV 11
|
||||
#define MSVCRT_SIGTERM 15
|
||||
#define MSVCRT_SIGBREAK 21
|
||||
#define MSVCRT_SIGABRT 22
|
||||
#define MSVCRT_NSIG (MSVCRT_SIGABRT + 1)
|
||||
|
||||
typedef void (__cdecl *MSVCRT___sighandler_t)(int);
|
||||
|
||||
#define MSVCRT_SIG_DFL ((MSVCRT___sighandler_t)0)
|
||||
#define MSVCRT_SIG_IGN ((MSVCRT___sighandler_t)1)
|
||||
#define MSVCRT_SIG_ERR ((MSVCRT___sighandler_t)-1)
|
||||
|
||||
#define MSVCRT__FPE_INVALID 0x81
|
||||
#define MSVCRT__FPE_DENORMAL 0x82
|
||||
#define MSVCRT__FPE_ZERODIVIDE 0x83
|
||||
#define MSVCRT__FPE_OVERFLOW 0x84
|
||||
#define MSVCRT__FPE_UNDERFLOW 0x85
|
||||
#define MSVCRT__FPE_INEXACT 0x86
|
||||
#define MSVCRT__FPE_UNEMULATED 0x87
|
||||
#define MSVCRT__FPE_SQRTNEG 0x88
|
||||
#define MSVCRT__FPE_STACKOVERFLOW 0x8a
|
||||
#define MSVCRT__FPE_STACKUNDERFLOW 0x8b
|
||||
#define MSVCRT__FPE_EXPLICITGEN 0x8c
|
||||
|
||||
#define _MS 0x01
|
||||
#define _MP 0x02
|
||||
#define _M1 0x04
|
||||
#define _M2 0x08
|
||||
|
||||
#define _SBUP 0x10
|
||||
#define _SBLOW 0x20
|
||||
|
||||
#define _MBC_SINGLE 0
|
||||
#define _MBC_LEAD 1
|
||||
#define _MBC_TRAIL 2
|
||||
#define _MBC_ILLEGAL -1
|
||||
|
||||
#define _MB_CP_SBCS 0
|
||||
#define _MB_CP_OEM -2
|
||||
#define _MB_CP_ANSI -3
|
||||
#define _MB_CP_LOCALE -4
|
||||
|
||||
#define MSVCRT__TRUNCATE ((MSVCRT_size_t)-1)
|
||||
|
||||
void __cdecl MSVCRT_free(void*);
|
||||
void* __cdecl MSVCRT_malloc(MSVCRT_size_t);
|
||||
void* __cdecl MSVCRT_calloc(MSVCRT_size_t,MSVCRT_size_t);
|
||||
void* __cdecl MSVCRT_realloc(void*,MSVCRT_size_t);
|
||||
|
||||
int __cdecl MSVCRT_iswalpha(MSVCRT_wint_t);
|
||||
int __cdecl MSVCRT_iswspace(MSVCRT_wint_t);
|
||||
int __cdecl MSVCRT_iswdigit(MSVCRT_wint_t);
|
||||
int __cdecl MSVCRT_isleadbyte(int);
|
||||
|
||||
int __cdecl MSVCRT_fgetc(MSVCRT_FILE*);
|
||||
int __cdecl MSVCRT_ungetc(int,MSVCRT_FILE*);
|
||||
MSVCRT_wint_t __cdecl MSVCRT_fgetwc(MSVCRT_FILE*);
|
||||
MSVCRT_wint_t __cdecl MSVCRT_ungetwc(MSVCRT_wint_t,MSVCRT_FILE*);
|
||||
void __cdecl MSVCRT__exit(int);
|
||||
void __cdecl MSVCRT_abort(void);
|
||||
MSVCRT_ulong* __cdecl MSVCRT___doserrno(void);
|
||||
int* __cdecl MSVCRT__errno(void);
|
||||
char* __cdecl MSVCRT_getenv(const char*);
|
||||
char* __cdecl MSVCRT_setlocale(int,const char*);
|
||||
int __cdecl MSVCRT_fclose(MSVCRT_FILE*);
|
||||
void __cdecl MSVCRT_terminate(void);
|
||||
MSVCRT_FILE* __cdecl MSVCRT__iob_func(void);
|
||||
MSVCRT_clock_t __cdecl MSVCRT_clock(void);
|
||||
MSVCRT___time32_t __cdecl MSVCRT__time32(MSVCRT___time32_t*);
|
||||
MSVCRT___time64_t __cdecl MSVCRT__time64(MSVCRT___time64_t*);
|
||||
MSVCRT_FILE* __cdecl MSVCRT__fdopen(int, const char *);
|
||||
MSVCRT_FILE* __cdecl MSVCRT__wfdopen(int, const MSVCRT_wchar_t *);
|
||||
int __cdecl MSVCRT_vsnprintf(char *str, MSVCRT_size_t len, const char *format, __ms_va_list valist);
|
||||
int __cdecl MSVCRT_vsnwprintf(MSVCRT_wchar_t *str, MSVCRT_size_t len,
|
||||
const MSVCRT_wchar_t *format, __ms_va_list valist );
|
||||
int __cdecl MSVCRT_raise(int sig);
|
||||
|
||||
typedef struct MSVCRT_tagLC_ID {
|
||||
unsigned short wLanguage;
|
||||
unsigned short wCountry;
|
||||
unsigned short wCodePage;
|
||||
} MSVCRT_LC_ID, *MSVCRT_LPLC_ID;
|
||||
|
||||
typedef struct MSVCRT_threadlocaleinfostruct {
|
||||
int refcount;
|
||||
unsigned int lc_codepage;
|
||||
unsigned int lc_collate_cp;
|
||||
unsigned long lc_handle[6];
|
||||
MSVCRT_LC_ID lc_id[6];
|
||||
struct {
|
||||
char *locale;
|
||||
wchar_t *wlocale;
|
||||
int *refcount;
|
||||
int *wrefcount;
|
||||
} lc_category[6];
|
||||
int lc_clike;
|
||||
int mb_cur_max;
|
||||
int *lconv_intl_refcount;
|
||||
int *lconv_num_refcount;
|
||||
int *lconv_mon_refcount;
|
||||
struct MSVCRT_lconv *lconv;
|
||||
int *ctype1_refcount;
|
||||
unsigned short *ctype1;
|
||||
unsigned short *pctype;
|
||||
unsigned char *pclmap;
|
||||
unsigned char *pcumap;
|
||||
struct MSVCRT___lc_time_data *lc_time_curr;
|
||||
} MSVCRT_threadlocinfo;
|
||||
|
||||
typedef struct MSVCRT_threadmbcinfostruct {
|
||||
int refcount;
|
||||
int mbcodepage;
|
||||
int ismbcodepage;
|
||||
int mblcid;
|
||||
unsigned short mbulinfo[6];
|
||||
char mbctype[257];
|
||||
char mbcasemap[256];
|
||||
} MSVCRT_threadmbcinfo;
|
||||
|
||||
typedef struct MSVCRT_threadlocaleinfostruct *MSVCRT_pthreadlocinfo;
|
||||
typedef struct MSVCRT_threadmbcinfostruct *MSVCRT_pthreadmbcinfo;
|
||||
|
||||
typedef struct MSVCRT_localeinfo_struct
|
||||
{
|
||||
MSVCRT_pthreadlocinfo locinfo;
|
||||
MSVCRT_pthreadmbcinfo mbcinfo;
|
||||
} MSVCRT__locale_tstruct, *MSVCRT__locale_t;
|
||||
|
||||
#define MSVCRT__ENABLE_PER_THREAD_LOCALE 1
|
||||
#define MSVCRT__DISABLE_PER_THREAD_LOCALE 2
|
||||
|
||||
extern MSVCRT__locale_t MSVCRT_locale;
|
||||
MSVCRT__locale_t get_locale(void);
|
||||
void __cdecl MSVCRT__free_locale(MSVCRT__locale_t);
|
||||
|
||||
#ifndef __WINE_MSVCRT_TEST
|
||||
int __cdecl MSVCRT__write(int,const void*,unsigned int);
|
||||
int __cdecl _getch(void);
|
||||
int __cdecl _ismbblead(unsigned int);
|
||||
int __cdecl _ismbstrail(const unsigned char* start, const unsigned char* str);
|
||||
MSVCRT_intptr_t __cdecl MSVCRT__spawnve(int,const char*,const char* const *,const char* const *);
|
||||
MSVCRT_intptr_t __cdecl MSVRT__spawnvpe(int,const char*,const char* const *,const char* const *);
|
||||
MSVCRT_intptr_t __cdecl _wspawnve(int,const MSVCRT_wchar_t*,const MSVCRT_wchar_t* const *,const MSVCRT_wchar_t* const *);
|
||||
MSVCRT_intptr_t __cdecl _wspawnvpe(int,const MSVCRT_wchar_t*,const MSVCRT_wchar_t* const *,const MSVCRT_wchar_t* const *);
|
||||
void __cdecl _searchenv(const char*,const char*,char*);
|
||||
int __cdecl _getdrive(void);
|
||||
char* __cdecl _strdup(const char*);
|
||||
char* __cdecl MSVCRT__strnset(char*,int,MSVCRT_size_t);
|
||||
char* __cdecl _strset(char*,int);
|
||||
int __cdecl _ungetch(int);
|
||||
int __cdecl _cputs(const char*);
|
||||
int __cdecl _cprintf(const char*,...);
|
||||
char*** __cdecl __p__environ(void);
|
||||
int* __cdecl __p___mb_cur_max(void);
|
||||
unsigned int* __cdecl __p__fmode(void);
|
||||
MSVCRT_wchar_t* __cdecl _wcsdup(const MSVCRT_wchar_t*);
|
||||
MSVCRT_wchar_t*** __cdecl __p__wenviron(void);
|
||||
char* __cdecl _strdate(char* date);
|
||||
char* __cdecl _strtime(char* date);
|
||||
int __cdecl _setmbcp(int);
|
||||
int __cdecl MSVCRT__close(int);
|
||||
int __cdecl MSVCRT__dup(int);
|
||||
int __cdecl MSVCRT__dup2(int, int);
|
||||
int __cdecl MSVCRT__pipe(int *, unsigned int, int);
|
||||
MSVCRT_wchar_t* __cdecl _wgetenv(const MSVCRT_wchar_t*);
|
||||
void __cdecl _wsearchenv(const MSVCRT_wchar_t*, const MSVCRT_wchar_t*, MSVCRT_wchar_t*);
|
||||
MSVCRT_intptr_t __cdecl MSVCRT__spawnvpe(int, const char*, const char* const*, const char* const*);
|
||||
void __cdecl MSVCRT__invalid_parameter(const MSVCRT_wchar_t *expr, const MSVCRT_wchar_t *func,
|
||||
const MSVCRT_wchar_t *file, unsigned int line, MSVCRT_uintptr_t arg);
|
||||
#endif
|
||||
|
||||
#endif /* __WINE_MSVCRT_H */
|
||||
@@ -27,6 +27,7 @@
|
||||
<file>file.c</file>
|
||||
<file>headers.c</file>
|
||||
<file>heap.c</file>
|
||||
<file>locale.c</file>
|
||||
<file>misc.c</file>
|
||||
<file>printf.c</file>
|
||||
<file>scanf.c</file>
|
||||
|
||||
@@ -33,6 +33,21 @@
|
||||
|
||||
#include "wine/test.h"
|
||||
|
||||
static int (__cdecl *p__vscprintf)(const char *format, __ms_va_list valist);
|
||||
static int (__cdecl *p__vscwprintf)(const wchar_t *format, __ms_va_list valist);
|
||||
static int (__cdecl *p__vsnwprintf_s)(wchar_t *str, size_t sizeOfBuffer,
|
||||
size_t count, const wchar_t *format,
|
||||
__ms_va_list valist);
|
||||
|
||||
static void init( void )
|
||||
{
|
||||
HMODULE hmod = GetModuleHandleA("msvcrt.dll");
|
||||
|
||||
p__vscprintf = (void *)GetProcAddress(hmod, "_vscprintf");
|
||||
p__vscwprintf = (void *)GetProcAddress(hmod, "_vscwprintf");
|
||||
p__vsnwprintf_s = (void *)GetProcAddress(hmod, "_vsnwprintf_s");
|
||||
}
|
||||
|
||||
static void test_sprintf( void )
|
||||
{
|
||||
char buffer[100];
|
||||
@@ -810,9 +825,6 @@ static void test_vsnwprintf(void)
|
||||
ok( !strcmp(buf, "onetwothree"), "got %s expected 'onetwothree'\n", buf );
|
||||
}
|
||||
|
||||
static int (__cdecl *p__vscprintf)(const char *format, __ms_va_list valist);
|
||||
static int (__cdecl *p__vscwprintf)(const wchar_t *format, __ms_va_list valist);
|
||||
|
||||
static int __cdecl _vscprintf_wrapper(const char *format, ...)
|
||||
{
|
||||
int ret;
|
||||
@@ -827,6 +839,12 @@ static void test_vscprintf(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!p__vscprintf)
|
||||
{
|
||||
win_skip("_vscprintf not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = _vscprintf_wrapper( "%s %d", "number", 1 );
|
||||
ok( ret == 8, "got %d expected 8\n", ret );
|
||||
}
|
||||
@@ -848,22 +866,85 @@ static void test_vscwprintf(void)
|
||||
|
||||
int ret;
|
||||
|
||||
if (!p__vscwprintf)
|
||||
{
|
||||
win_skip("_vscwprintf not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = _vscwprintf_wrapper( format, number, 1 );
|
||||
ok( ret == 8, "got %d expected 8\n", ret );
|
||||
}
|
||||
|
||||
static int __cdecl _vsnwprintf_s_wrapper(wchar_t *str, size_t sizeOfBuffer,
|
||||
size_t count, const wchar_t *format, ...)
|
||||
{
|
||||
int ret;
|
||||
__ms_va_list valist;
|
||||
__ms_va_start(valist, format);
|
||||
ret = p__vsnwprintf_s(str, sizeOfBuffer, count, format, valist);
|
||||
__ms_va_end(valist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void test_vsnwprintf_s(void)
|
||||
{
|
||||
const wchar_t format[] = { 'A','B','%','u','C',0 };
|
||||
const wchar_t out7[] = { 'A','B','1','2','3','C',0 };
|
||||
const wchar_t out6[] = { 'A','B','1','2','3',0 };
|
||||
const wchar_t out2[] = { 'A',0 };
|
||||
const wchar_t out1[] = { 0 };
|
||||
wchar_t buffer[14] = { 0 };
|
||||
int exp, got;
|
||||
|
||||
if (!p__vsnwprintf_s)
|
||||
{
|
||||
win_skip("_vsnwprintf_s not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Enough room. */
|
||||
exp = wcslen(out7);
|
||||
|
||||
got = _vsnwprintf_s_wrapper(buffer, 14, _TRUNCATE, format, 123);
|
||||
ok( exp == got, "length wrong, expect=%d, got=%d\n", exp, got);
|
||||
ok( !wcscmp(out7, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer));
|
||||
|
||||
got = _vsnwprintf_s_wrapper(buffer, 12, _TRUNCATE, format, 123);
|
||||
ok( exp == got, "length wrong, expect=%d, got=%d\n", exp, got);
|
||||
ok( !wcscmp(out7, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer));
|
||||
|
||||
got = _vsnwprintf_s_wrapper(buffer, 7, _TRUNCATE, format, 123);
|
||||
ok( exp == got, "length wrong, expect=%d, got=%d\n", exp, got);
|
||||
ok( !wcscmp(out7, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer));
|
||||
|
||||
/* Not enough room. */
|
||||
exp = -1;
|
||||
|
||||
got = _vsnwprintf_s_wrapper(buffer, 6, _TRUNCATE, format, 123);
|
||||
ok( exp == got, "length wrong, expect=%d, got=%d\n", exp, got);
|
||||
ok( !wcscmp(out6, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer));
|
||||
|
||||
got = _vsnwprintf_s_wrapper(buffer, 2, _TRUNCATE, format, 123);
|
||||
ok( exp == got, "length wrong, expect=%d, got=%d\n", exp, got);
|
||||
ok( !wcscmp(out2, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer));
|
||||
|
||||
got = _vsnwprintf_s_wrapper(buffer, 1, _TRUNCATE, format, 123);
|
||||
ok( exp == got, "length wrong, expect=%d, got=%d\n", exp, got);
|
||||
ok( !wcscmp(out1, buffer), "buffer wrong, got=%s\n", wine_dbgstr_w(buffer));
|
||||
}
|
||||
|
||||
START_TEST(printf)
|
||||
{
|
||||
init();
|
||||
|
||||
test_sprintf();
|
||||
test_swprintf();
|
||||
test_snprintf();
|
||||
test_fcvt();
|
||||
test_xcvt();
|
||||
test_vsnwprintf();
|
||||
|
||||
p__vscprintf = (void *)GetProcAddress(GetModuleHandle("msvcrt.dll"), "_vscprintf");
|
||||
p__vscwprintf = (void *)GetProcAddress(GetModuleHandle("msvcrt.dll"), "_vscwprintf");
|
||||
|
||||
if (p__vscprintf) test_vscprintf();
|
||||
if (p__vscwprintf) test_vscwprintf();
|
||||
test_vscprintf();
|
||||
test_vscwprintf();
|
||||
test_vsnwprintf_s();
|
||||
}
|
||||
|
||||
@@ -975,7 +975,7 @@ static void test__strtoi64(void)
|
||||
ok(res == 123, "res != 123\n");
|
||||
ok(endpos == oct+strlen(oct), "Incorrect endpos (%p-%p)\n", oct, endpos);
|
||||
res = p_strtoi64(blanks, &endpos, 10);
|
||||
ok(res == 12, "res != 12");
|
||||
ok(res == 12, "res != 12\n");
|
||||
ok(endpos == blanks+10, "Incorrect endpos (%p-%p)\n", blanks, endpos);
|
||||
ok(errno == 0xdeadbeef, "errno = %x\n", errno);
|
||||
|
||||
@@ -1215,22 +1215,22 @@ static void test_mbstowcs(void)
|
||||
return;
|
||||
}
|
||||
|
||||
err = pmbstowcs_s(&ret, wOut, 6, mSimple, -1/*_TRUNCATE*/);
|
||||
err = pmbstowcs_s(&ret, wOut, 6, mSimple, _TRUNCATE);
|
||||
ok(err == 0, "err = %d\n", err);
|
||||
ok(ret == 5, "ret = %d\n", (int)ret);
|
||||
ok(!memcmp(wOut, wSimple, sizeof(wSimple)), "wOut = %s\n", wine_dbgstr_w(wOut));
|
||||
|
||||
err = pmbstowcs_s(&ret, wOut, 6, mHiragana, -1/*_TRUNCATE*/);
|
||||
err = pmbstowcs_s(&ret, wOut, 6, mHiragana, _TRUNCATE);
|
||||
ok(err == 0, "err = %d\n", err);
|
||||
ok(ret == 3, "ret = %d\n", (int)ret);
|
||||
ok(!memcmp(wOut, wHiragana, sizeof(wHiragana)), "wOut = %s\n", wine_dbgstr_w(wOut));
|
||||
|
||||
err = pwcstombs_s(&ret, mOut, 6, wSimple, -1/*_TRUNCATE*/);
|
||||
err = pwcstombs_s(&ret, mOut, 6, wSimple, _TRUNCATE);
|
||||
ok(err == 0, "err = %d\n", err);
|
||||
ok(ret == 5, "ret = %d\n", (int)ret);
|
||||
ok(!memcmp(mOut, mSimple, sizeof(mSimple)), "mOut = %s\n", mOut);
|
||||
|
||||
err = pwcstombs_s(&ret, mOut, 6, wHiragana, -1/*_TRUNCATE*/);
|
||||
err = pwcstombs_s(&ret, mOut, 6, wHiragana, _TRUNCATE);
|
||||
ok(err == 0, "err = %d\n", err);
|
||||
ok(ret == 5, "ret = %d\n", (int)ret);
|
||||
ok(!memcmp(mOut, mHiragana, sizeof(mHiragana)), "mOut = %s\n", mOut);
|
||||
|
||||
@@ -203,6 +203,9 @@ static const struct exception
|
||||
{ { 0x1e, 0x06, 0x31, 0xc0, 0x8e, 0xd8, 0x8e, 0xc0, 0xfa, 0x07, 0x1f, 0xc3 },
|
||||
/* push %ds; push %es; xorl %eax,%eax; mov %ax,%ds; mov %ax,%es; cli; pop %es; pop %ds; ret */
|
||||
8, 1, TRUE, STATUS_PRIVILEGED_INSTRUCTION, 0 },
|
||||
|
||||
{ { 0xf1, 0x90, 0xc3 }, /* icebp; nop; ret */
|
||||
1, 1, FALSE, STATUS_SINGLE_STEP, 0 },
|
||||
};
|
||||
|
||||
static int got_exception;
|
||||
|
||||
@@ -44,6 +44,7 @@ static NTSTATUS (WINAPI *pNtOpenDirectoryObject)(PHANDLE, ACCESS_MASK, POBJECT_A
|
||||
static NTSTATUS (WINAPI *pNtCreateDirectoryObject)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
|
||||
static NTSTATUS (WINAPI *pNtOpenSymbolicLinkObject)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES);
|
||||
static NTSTATUS (WINAPI *pNtCreateSymbolicLinkObject)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PUNICODE_STRING);
|
||||
static NTSTATUS (WINAPI *pNtQuerySymbolicLinkObject)(HANDLE,PUNICODE_STRING,PULONG);
|
||||
static NTSTATUS (WINAPI *pNtQueryObject)(HANDLE,OBJECT_INFORMATION_CLASS,PVOID,ULONG,PULONG);
|
||||
|
||||
|
||||
@@ -402,13 +403,44 @@ static void test_directory(void)
|
||||
is_nt4 = (status == STATUS_OBJECT_NAME_NOT_FOUND); /* nt4 doesn't have Local\\ symlink */
|
||||
if (!is_nt4)
|
||||
{
|
||||
WCHAR buffer[256];
|
||||
ULONG len, full_len;
|
||||
|
||||
ok(status == STATUS_SUCCESS, "Failed to open SymbolicLink(%08x)\n", status);
|
||||
pRtlFreeUnicodeString(&str);
|
||||
InitializeObjectAttributes(&attr, &str, 0, dir, NULL);
|
||||
pRtlCreateUnicodeStringFromAsciiz(&str, "one more level");
|
||||
DIR_TEST_CREATE_FAILURE(&h, STATUS_OBJECT_TYPE_MISMATCH)
|
||||
pRtlFreeUnicodeString(&str);
|
||||
pNtClose(h);
|
||||
|
||||
str.Buffer = buffer;
|
||||
str.MaximumLength = sizeof(buffer);
|
||||
len = 0xdeadbeef;
|
||||
memset( buffer, 0xaa, sizeof(buffer) );
|
||||
status = pNtQuerySymbolicLinkObject( dir, &str, &len );
|
||||
ok( status == STATUS_SUCCESS, "NtQuerySymbolicLinkObject failed %08x\n", status );
|
||||
full_len = str.Length + sizeof(WCHAR);
|
||||
ok( len == full_len, "bad length %u/%u\n", len, full_len );
|
||||
ok( buffer[len / sizeof(WCHAR) - 1] == 0, "no terminating null\n" );
|
||||
|
||||
str.MaximumLength = str.Length;
|
||||
len = 0xdeadbeef;
|
||||
status = pNtQuerySymbolicLinkObject( dir, &str, &len );
|
||||
ok( status == STATUS_BUFFER_TOO_SMALL, "NtQuerySymbolicLinkObject failed %08x\n", status );
|
||||
ok( len == full_len, "bad length %u/%u\n", len, full_len );
|
||||
|
||||
str.MaximumLength = 0;
|
||||
len = 0xdeadbeef;
|
||||
status = pNtQuerySymbolicLinkObject( dir, &str, &len );
|
||||
ok( status == STATUS_BUFFER_TOO_SMALL, "NtQuerySymbolicLinkObject failed %08x\n", status );
|
||||
ok( len == full_len, "bad length %u/%u\n", len, full_len );
|
||||
|
||||
str.MaximumLength = str.Length + sizeof(WCHAR);
|
||||
len = 0xdeadbeef;
|
||||
status = pNtQuerySymbolicLinkObject( dir, &str, &len );
|
||||
ok( status == STATUS_SUCCESS, "NtQuerySymbolicLinkObject failed %08x\n", status );
|
||||
ok( len == full_len, "bad length %u/%u\n", len, full_len );
|
||||
|
||||
pNtClose(dir);
|
||||
}
|
||||
|
||||
@@ -710,6 +742,7 @@ START_TEST(om)
|
||||
pNtCreateDirectoryObject= (void *)GetProcAddress(hntdll, "NtCreateDirectoryObject");
|
||||
pNtOpenSymbolicLinkObject = (void *)GetProcAddress(hntdll, "NtOpenSymbolicLinkObject");
|
||||
pNtCreateSymbolicLinkObject = (void *)GetProcAddress(hntdll, "NtCreateSymbolicLinkObject");
|
||||
pNtQuerySymbolicLinkObject = (void *)GetProcAddress(hntdll, "NtQuerySymbolicLinkObject");
|
||||
pNtCreateSemaphore = (void *)GetProcAddress(hntdll, "NtCreateSemaphore");
|
||||
pNtCreateTimer = (void *)GetProcAddress(hntdll, "NtCreateTimer");
|
||||
pNtCreateSection = (void *)GetProcAddress(hntdll, "NtCreateSection");
|
||||
|
||||
@@ -0,0 +1,273 @@
|
||||
/*
|
||||
* Dispatch test
|
||||
*
|
||||
* Copyright 2009 James Hawkins
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <wine/test.h>
|
||||
#include <windef.h>
|
||||
#include <winbase.h>
|
||||
#include <oaidl.h>
|
||||
|
||||
static const WCHAR szSunshine[] = {'S','u','n','s','h','i','n','e',0};
|
||||
|
||||
/* Temporary storage for ok_bstr. */
|
||||
static CHAR temp_str[MAX_PATH];
|
||||
|
||||
#define ok_bstr(bstr, expected, format) \
|
||||
do { \
|
||||
WideCharToMultiByte(CP_ACP, 0, bstr, -1, temp_str, MAX_PATH, NULL, NULL); \
|
||||
if (lstrcmpA(temp_str, expected) != 0) \
|
||||
ok(0, format, expected, temp_str); \
|
||||
} while(0);
|
||||
|
||||
#define INIT_DISPPARAMS(dp, args, named_args, num_args, num_named_args) \
|
||||
dp.rgvarg = args; \
|
||||
dp.rgdispidNamedArgs = named_args; \
|
||||
dp.cArgs = num_args; \
|
||||
dp.cNamedArgs = num_named_args; \
|
||||
|
||||
/* Initializes vararg with three values:
|
||||
* VT_I2 - 42
|
||||
* VT_I4 - 1234567890
|
||||
* VT_BSTR - "Sunshine"
|
||||
*/
|
||||
#define INIT_VARARG(vararg) \
|
||||
VariantInit(&vararg[0]); \
|
||||
V_VT(&vararg[0]) = VT_I2; \
|
||||
V_I2(&vararg[0]) = 42; \
|
||||
VariantInit(&vararg[1]); \
|
||||
V_VT(&vararg[1]) = VT_I4; \
|
||||
V_I4(&vararg[1]) = 1234567890; \
|
||||
VariantInit(&vararg[2]); \
|
||||
V_VT(&vararg[2]) = VT_BSTR; \
|
||||
V_BSTR(&vararg[2]) = SysAllocString(szSunshine);
|
||||
|
||||
/* Clears the vararg. */
|
||||
#define CLEAR_VARARG(vararg) \
|
||||
VariantClear(&vararg[0]); \
|
||||
VariantClear(&vararg[1]); \
|
||||
VariantClear(&vararg[2]);
|
||||
|
||||
static void test_DispGetParam(void)
|
||||
{
|
||||
HRESULT hr;
|
||||
DISPPARAMS dispparams;
|
||||
VARIANTARG vararg[3];
|
||||
VARIANT result;
|
||||
unsigned int err_index;
|
||||
|
||||
VariantInit(&result);
|
||||
|
||||
/* DispGetParam crashes on Windows if pdispparams is NULL. */
|
||||
|
||||
/* pdispparams has zero parameters. */
|
||||
INIT_DISPPARAMS(dispparams, NULL, NULL, 0, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 0, VT_I2, &result, &err_index);
|
||||
ok(hr == DISP_E_PARAMNOTFOUND,
|
||||
"Expected DISP_E_PARAMNOTFOUND, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_EMPTY,
|
||||
"Expected VT_EMPTY, got %08x\n", V_VT(&result));
|
||||
ok(err_index == 0xdeadbeef,
|
||||
"Expected err_index to be unchanged, got %d\n", err_index);
|
||||
|
||||
/* pdispparams has zero parameters, position is invalid. */
|
||||
INIT_DISPPARAMS(dispparams, NULL, NULL, 0, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 1, VT_I2, &result, &err_index);
|
||||
ok(hr == DISP_E_PARAMNOTFOUND,
|
||||
"Expected DISP_E_PARAMNOTFOUND, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_EMPTY,
|
||||
"Expected VT_EMPTY, got %08x\n", V_VT(&result));
|
||||
ok(err_index == 0xdeadbeef,
|
||||
"Expected err_index to be unchanged, got %d\n", err_index);
|
||||
|
||||
/* pdispparams has zero parameters, pvarResult is NULL. */
|
||||
INIT_DISPPARAMS(dispparams, NULL, NULL, 0, 0);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 0, VT_I2, NULL, &err_index);
|
||||
ok(hr == DISP_E_PARAMNOTFOUND,
|
||||
"Expected DISP_E_PARAMNOTFOUND, got %08x\n", hr);
|
||||
ok(err_index == 0xdeadbeef,
|
||||
"Expected err_index to be unchanged, got %d\n", err_index);
|
||||
|
||||
/* pdispparams has zero parameters, puArgErr is NULL. */
|
||||
INIT_DISPPARAMS(dispparams, NULL, NULL, 0, 0);
|
||||
VariantInit(&result);
|
||||
hr = DispGetParam(&dispparams, 0, VT_I2, &result, NULL);
|
||||
ok(hr == DISP_E_PARAMNOTFOUND,
|
||||
"Expected DISP_E_PARAMNOTFOUND, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_EMPTY,
|
||||
"Expected VT_EMPTY, got %08x\n", V_VT(&result));
|
||||
|
||||
/* pdispparams.cArgs is 1, yet pdispparams.rgvarg is NULL. */
|
||||
INIT_DISPPARAMS(dispparams, NULL, NULL, 1, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 0, VT_I2, &result, &err_index);
|
||||
ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_EMPTY,
|
||||
"Expected VT_EMPTY, got %08x\n", V_VT(&result));
|
||||
ok(err_index == 0, "Expected 0, got %d\n", err_index);
|
||||
|
||||
/* pdispparams.cNamedArgs is 1, yet pdispparams.rgdispidNamedArgs is NULL.
|
||||
*
|
||||
* This crashes on Windows.
|
||||
*/
|
||||
|
||||
/* {42, 1234567890, "Sunshine"} */
|
||||
INIT_VARARG(vararg);
|
||||
|
||||
/* Get the first param. position is end-based, so 2 is the first parameter
|
||||
* of 3 parameters.
|
||||
*/
|
||||
INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 2, VT_I2, &result, &err_index);
|
||||
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_I2, "Expected VT_I2, got %08x\n", V_VT(&result));
|
||||
ok(V_I2(&result) == 42, "Expected 42, got %d\n", V_I2(&result));
|
||||
ok(err_index == 0xdeadbeef,
|
||||
"Expected err_index to be unchanged, got %d\n", err_index);
|
||||
|
||||
/* Get the second param. */
|
||||
INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 1, VT_I4, &result, &err_index);
|
||||
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_I4, "Expected VT_I4, got %08x\n", V_VT(&result));
|
||||
ok(V_I4(&result) == 1234567890,
|
||||
"Expected 1234567890, got %d\n", V_I4(&result));
|
||||
ok(err_index == 0xdeadbeef,
|
||||
"Expected err_index to be unchanged, got %d\n", err_index);
|
||||
|
||||
/* Get the third param. */
|
||||
INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 0, VT_BSTR, &result, &err_index);
|
||||
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_BSTR, "Expected VT_BSTR, got %08x\n", V_VT(&result));
|
||||
ok_bstr(V_BSTR(&result), "Sunshine", "Expected %s, got %s\n");
|
||||
ok(err_index == 0xdeadbeef,
|
||||
"Expected err_index to be unchanged, got %d\n", err_index);
|
||||
VariantClear(&result);
|
||||
|
||||
/* position is out of range. */
|
||||
INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 3, VT_I2, &result, &err_index);
|
||||
ok(hr == DISP_E_PARAMNOTFOUND,
|
||||
"Expected DISP_E_PARAMNOTFOUND, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_EMPTY,
|
||||
"Expected VT_EMPTY, got %08x\n", V_VT(&result));
|
||||
ok(err_index == 0xdeadbeef,
|
||||
"Expected err_index to be unchanged, got %d\n", err_index);
|
||||
|
||||
/* pvarResult is NULL. */
|
||||
INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 2, VT_I2, NULL, &err_index);
|
||||
ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
|
||||
ok(err_index == 0, "Expected 0, got %d\n", err_index);
|
||||
|
||||
/* puArgErr is NULL. */
|
||||
INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
|
||||
VariantInit(&result);
|
||||
hr = DispGetParam(&dispparams, 2, VT_I2, &result, NULL);
|
||||
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_I2, "Expected VT_I2, got %08x\n", V_VT(&result));
|
||||
ok(V_I2(&result) == 42, "Expected 42, got %d\n", V_I2(&result));
|
||||
|
||||
/* Coerce the first param to VT_I4. */
|
||||
INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 2, VT_I4, &result, &err_index);
|
||||
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_I4, "Expected VT_I4, got %08x\n", V_VT(&result));
|
||||
ok(V_I4(&result) == 42, "Expected 42, got %d\n", V_I4(&result));
|
||||
ok(err_index == 0xdeadbeef,
|
||||
"Expected err_index to be unchanged, got %d\n", err_index);
|
||||
|
||||
/* Coerce the first param to VT_BSTR. */
|
||||
INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 2, VT_BSTR, &result, &err_index);
|
||||
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_BSTR, "Expected VT_BSTR, got %08x\n", V_VT(&result));
|
||||
ok_bstr(V_BSTR(&result), "42", "Expected %s, got %s\n");
|
||||
ok(err_index == 0xdeadbeef,
|
||||
"Expected err_index to be unchanged, got %d\n", err_index);
|
||||
VariantClear(&result);
|
||||
|
||||
/* Coerce the second (VT_I4) param to VT_I2. */
|
||||
INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 1, VT_I2, &result, &err_index);
|
||||
ok(hr == DISP_E_OVERFLOW, "Expected DISP_E_OVERFLOW, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_EMPTY,
|
||||
"Expected VT_EMPTY, got %08x\n", V_VT(&result));
|
||||
ok(err_index == 1, "Expected 1, got %d\n", err_index);
|
||||
|
||||
/* Coerce the third (VT_BSTR) param to VT_I2. */
|
||||
INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 0, VT_I2, &result, &err_index);
|
||||
ok(hr == DISP_E_TYPEMISMATCH,
|
||||
"Expected DISP_E_TYPEMISMATCH, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_EMPTY,
|
||||
"Expected VT_EMPTY, got %08x\n", V_VT(&result));
|
||||
ok(err_index == 2, "Expected 2, got %d\n", err_index);
|
||||
|
||||
/* Coerce the first parameter to an invalid type. */
|
||||
INIT_DISPPARAMS(dispparams, vararg, NULL, 3, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 2, VT_ILLEGAL, &result, &err_index);
|
||||
ok(hr == DISP_E_BADVARTYPE, "Expected DISP_E_BADVARTYPE, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_EMPTY,
|
||||
"Expected VT_EMPTY, got %08x\n", V_VT(&result));
|
||||
ok(err_index == 0, "Expected 0, got %d\n", err_index);
|
||||
|
||||
CLEAR_VARARG(vararg);
|
||||
|
||||
/* Coerce the first parameter, which is of type VT_EMPTY, to VT_BSTR. */
|
||||
VariantInit(&vararg[0]);
|
||||
INIT_DISPPARAMS(dispparams, vararg, NULL, 1, 0);
|
||||
VariantInit(&result);
|
||||
err_index = 0xdeadbeef;
|
||||
hr = DispGetParam(&dispparams, 0, VT_BSTR, &result, &err_index);
|
||||
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
|
||||
ok(V_VT(&result) == VT_BSTR, "Expected VT_BSTR, got %08x\n", V_VT(&result));
|
||||
ok(err_index == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", err_index);
|
||||
VariantClear(&result);
|
||||
}
|
||||
|
||||
START_TEST(dispatch)
|
||||
{
|
||||
test_DispGetParam();
|
||||
}
|
||||
@@ -16,6 +16,7 @@
|
||||
<library>uuid</library>
|
||||
<library>ntdll</library>
|
||||
<library>tmarshal_interface</library>
|
||||
<file>dispatch.c</file>
|
||||
<file>olefont.c</file>
|
||||
<file>olepicture.c</file>
|
||||
<file>safearray.c</file>
|
||||
@@ -30,6 +31,8 @@
|
||||
<dependency>tmarshal_header</dependency>
|
||||
<dependency>tmarshal</dependency>
|
||||
<dependency>test_tlb</dependency>
|
||||
<dependency>test_reg_header</dependency>
|
||||
<dependency>test_reg</dependency>
|
||||
</module>
|
||||
<module name="tmarshal_header" type="idlheader">
|
||||
<dependency>stdole2</dependency>
|
||||
@@ -39,6 +42,14 @@
|
||||
<dependency>stdole2</dependency>
|
||||
<file>tmarshal.idl</file>
|
||||
</module>
|
||||
<module name="test_reg_header" type="idlheader" allowwarnings="true">
|
||||
<dependency>stdole2</dependency>
|
||||
<file>test_reg.idl</file>
|
||||
</module>
|
||||
<module name="test_reg" type="embeddedtypelib" allowwarnings="true">
|
||||
<dependency>stdole2</dependency>
|
||||
<file>test_reg.idl</file>
|
||||
</module>
|
||||
<module name="test_tlb" type="embeddedtypelib" allowwarnings="true">
|
||||
<dependency>stdole2</dependency>
|
||||
<file>test_tlb.idl</file>
|
||||
|
||||
@@ -45,6 +45,7 @@ DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
|
||||
static WCHAR MSSansSerif_font[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f',0};
|
||||
static WCHAR system_font[] = { 'S','y','s','t','e','m',0 };
|
||||
static WCHAR arial_font[] = { 'A','r','i','a','l',0 };
|
||||
static WCHAR marlett_font[] = { 'M','a','r','l','e','t','t',0 };
|
||||
|
||||
static HMODULE hOleaut32;
|
||||
|
||||
@@ -57,9 +58,9 @@ static HRESULT (WINAPI *pOleCreateFontIndirect)(LPFONTDESC,REFIID,LPVOID*);
|
||||
/* check that resulting hfont has height hfont_height. */
|
||||
/* Various checks along the way. */
|
||||
|
||||
static void test_ifont_sizes(long lo_size, long hi_size,
|
||||
long ratio_logical, long ratio_himetric,
|
||||
long hfont_height, const char * test_name)
|
||||
static void test_ifont_sizes(LONG lo_size, LONG hi_size,
|
||||
LONG ratio_logical, LONG ratio_himetric,
|
||||
LONG hfont_height, const char * test_name)
|
||||
{
|
||||
FONTDESC fd;
|
||||
LPVOID pvObj = NULL;
|
||||
@@ -91,8 +92,8 @@ static void test_ifont_sizes(long lo_size, long hi_size,
|
||||
ok(hres == S_OK,"%s: IFont_get_size returns 0x%08x instead of S_OK.\n",
|
||||
test_name, hres);
|
||||
ok(S(psize).Lo == lo_size && S(psize).Hi == 0,
|
||||
"%s: get_Size: Lo=%d, Hi=%d; expected Lo=%ld, Hi=%ld.\n",
|
||||
test_name, S(psize).Lo, S(psize).Hi, lo_size, 0L);
|
||||
"%s: get_Size: Lo=%d, Hi=%d; expected Lo=%d, Hi=0.\n",
|
||||
test_name, S(psize).Lo, S(psize).Hi, lo_size);
|
||||
|
||||
/* Change ratio, check size unchanged. Standard is 72, 2540. */
|
||||
hres = IFont_SetRatio(ifnt, ratio_logical, ratio_himetric);
|
||||
@@ -102,8 +103,8 @@ static void test_ifont_sizes(long lo_size, long hi_size,
|
||||
ok(hres == S_OK,"%s: IFont_get_size returns 0x%08x instead of S_OK.\n",
|
||||
test_name, hres);
|
||||
ok(S(psize).Lo == lo_size && S(psize).Hi == 0,
|
||||
"%s: gS after SR: Lo=%d, Hi=%d; expected Lo=%ld, Hi=%ld.\n",
|
||||
test_name, S(psize).Lo, S(psize).Hi, lo_size, 0L);
|
||||
"%s: gS after SR: Lo=%d, Hi=%d; expected Lo=%d, Hi=0.\n",
|
||||
test_name, S(psize).Lo, S(psize).Hi, lo_size);
|
||||
|
||||
/* Check hFont size with this ratio. This tests an important */
|
||||
/* conversion for which MSDN is very wrong. */
|
||||
@@ -112,7 +113,7 @@ static void test_ifont_sizes(long lo_size, long hi_size,
|
||||
test_name, hres);
|
||||
hres = GetObject (hfont, sizeof(LOGFONT), &lf);
|
||||
ok(lf.lfHeight == hfont_height,
|
||||
"%s: hFont has lf.lfHeight=%d, expected %ld.\n",
|
||||
"%s: hFont has lf.lfHeight=%d, expected %d.\n",
|
||||
test_name, lf.lfHeight, hfont_height);
|
||||
|
||||
/* Free IFont. */
|
||||
@@ -491,8 +492,6 @@ static void test_Invoke(void)
|
||||
static void test_IsEqual(void)
|
||||
{
|
||||
FONTDESC fd;
|
||||
LPVOID pvObj = NULL;
|
||||
LPVOID pvObj2 = NULL;
|
||||
IFont* ifnt = NULL;
|
||||
IFont* ifnt2 = NULL;
|
||||
HRESULT hres;
|
||||
@@ -509,12 +508,10 @@ static void test_IsEqual(void)
|
||||
fd.fStrikethrough = 0;
|
||||
|
||||
/* Create font */
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, &pvObj);
|
||||
ifnt = pvObj;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, (void **)&ifnt);
|
||||
|
||||
/* Test equal fonts */
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, &pvObj2);
|
||||
ifnt2 = pvObj2;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, (void **)&ifnt2);
|
||||
hres = IFont_IsEqual(ifnt,ifnt2);
|
||||
ok(hres == S_OK,
|
||||
"IFont_IsEqual: (EQUAL) Expected S_OK but got 0x%08x\n",hres);
|
||||
@@ -527,7 +524,7 @@ static void test_IsEqual(void)
|
||||
|
||||
/* Test strName */
|
||||
fd.lpstrName = arial_font;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, &pvObj2);
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, (void **)&ifnt2);
|
||||
hres = IFont_IsEqual(ifnt,ifnt2);
|
||||
ok(hres == S_FALSE,
|
||||
"IFont_IsEqual: (strName) Expected S_FALSE but got 0x%08x\n",hres);
|
||||
@@ -536,8 +533,7 @@ static void test_IsEqual(void)
|
||||
|
||||
/* Test lo font size */
|
||||
S(fd.cySize).Lo = 10000;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, &pvObj2);
|
||||
ifnt2 = pvObj2;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, (void **)&ifnt2);
|
||||
hres = IFont_IsEqual(ifnt,ifnt2);
|
||||
ok(hres == S_FALSE,
|
||||
"IFont_IsEqual: (Lo font size) Expected S_FALSE but got 0x%08x\n",hres);
|
||||
@@ -546,8 +542,7 @@ static void test_IsEqual(void)
|
||||
|
||||
/* Test hi font size */
|
||||
S(fd.cySize).Hi = 10000;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, &pvObj2);
|
||||
ifnt2 = pvObj2;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, (void **)&ifnt2);
|
||||
hres = IFont_IsEqual(ifnt,ifnt2);
|
||||
ok(hres == S_FALSE,
|
||||
"IFont_IsEqual: (Hi font size) Expected S_FALSE but got 0x%08x\n",hres);
|
||||
@@ -556,8 +551,7 @@ static void test_IsEqual(void)
|
||||
|
||||
/* Test font weight */
|
||||
fd.sWeight = 100;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, &pvObj2);
|
||||
ifnt2 = pvObj2;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, (void **)&ifnt2);
|
||||
hres = IFont_IsEqual(ifnt,ifnt2);
|
||||
ok(hres == S_FALSE,
|
||||
"IFont_IsEqual: (Weight) Expected S_FALSE but got 0x%08x\n",hres);
|
||||
@@ -566,7 +560,7 @@ static void test_IsEqual(void)
|
||||
|
||||
/* Test charset */
|
||||
fd.sCharset = 1;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, &pvObj2);
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, (void **)&ifnt2);
|
||||
hres = IFont_IsEqual(ifnt,ifnt2);
|
||||
ok(hres == S_FALSE,
|
||||
"IFont_IsEqual: (Charset) Expected S_FALSE but got 0x%08x\n",hres);
|
||||
@@ -575,7 +569,7 @@ static void test_IsEqual(void)
|
||||
|
||||
/* Test italic setting */
|
||||
fd.fItalic = 1;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, &pvObj2);
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, (void **)&ifnt2);
|
||||
hres = IFont_IsEqual(ifnt,ifnt2);
|
||||
ok(hres == S_FALSE,
|
||||
"IFont_IsEqual: (Italic) Expected S_FALSE but got 0x%08x\n",hres);
|
||||
@@ -584,7 +578,7 @@ static void test_IsEqual(void)
|
||||
|
||||
/* Test underline setting */
|
||||
fd.fUnderline = 1;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, &pvObj2);
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, (void **)&ifnt2);
|
||||
hres = IFont_IsEqual(ifnt,ifnt2);
|
||||
ok(hres == S_FALSE,
|
||||
"IFont_IsEqual: (Underline) Expected S_FALSE but got 0x%08x\n",hres);
|
||||
@@ -593,7 +587,7 @@ static void test_IsEqual(void)
|
||||
|
||||
/* Test strikethrough setting */
|
||||
fd.fStrikethrough = 1;
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, &pvObj2);
|
||||
pOleCreateFontIndirect(&fd, &IID_IFont, (void **)&ifnt2);
|
||||
hres = IFont_IsEqual(ifnt,ifnt2);
|
||||
ok(hres == S_FALSE,
|
||||
"IFont_IsEqual: (Strikethrough) Expected S_FALSE but got 0x%08x\n",hres);
|
||||
@@ -802,6 +796,287 @@ static void test_AddRefHfont(void)
|
||||
IFont_Release(ifnt3);
|
||||
}
|
||||
|
||||
static void test_returns(void)
|
||||
{
|
||||
IFont *pFont;
|
||||
FONTDESC fontdesc;
|
||||
HRESULT hr;
|
||||
|
||||
fontdesc.cbSizeofstruct = sizeof(fontdesc);
|
||||
fontdesc.lpstrName = MSSansSerif_font;
|
||||
fontdesc.cySize.int64 = 12 * 10000; /* 12 pt */
|
||||
fontdesc.sWeight = FW_NORMAL;
|
||||
fontdesc.sCharset = 0;
|
||||
fontdesc.fItalic = FALSE;
|
||||
fontdesc.fUnderline = FALSE;
|
||||
fontdesc.fStrikethrough = FALSE;
|
||||
|
||||
hr = pOleCreateFontIndirect(&fontdesc, &IID_IFont, (void **)&pFont);
|
||||
ok_ole_success(hr, "OleCreateFontIndirect");
|
||||
|
||||
hr = IFont_put_Name(pFont, NULL);
|
||||
ok(hr == CTL_E_INVALIDPROPERTYVALUE,
|
||||
"IFont::put_Name: Expected CTL_E_INVALIDPROPERTYVALUE got 0x%08x\n",
|
||||
hr);
|
||||
|
||||
hr = IFont_get_Name(pFont, NULL);
|
||||
ok(hr == E_POINTER,
|
||||
"IFont::get_Name: Expected E_POINTER got 0x%08x\n",
|
||||
hr);
|
||||
|
||||
hr = IFont_get_Size(pFont, NULL);
|
||||
ok(hr == E_POINTER,
|
||||
"IFont::get_Size: Expected E_POINTER got 0x%08x\n",
|
||||
hr);
|
||||
|
||||
hr = IFont_get_Bold(pFont, NULL);
|
||||
ok(hr == E_POINTER,
|
||||
"IFont::get_Bold: Expected E_POINTER got 0x%08x\n",
|
||||
hr);
|
||||
|
||||
IFont_Release(pFont);
|
||||
}
|
||||
|
||||
static void test_hfont_lifetime(void)
|
||||
{
|
||||
IFont *font, *font2;
|
||||
FONTDESC fontdesc;
|
||||
HRESULT hr;
|
||||
HFONT hfont, first_hfont = NULL;
|
||||
CY size;
|
||||
DWORD obj_type;
|
||||
int i;
|
||||
|
||||
fontdesc.cbSizeofstruct = sizeof(fontdesc);
|
||||
fontdesc.lpstrName = arial_font;
|
||||
fontdesc.cySize.int64 = 12 * 10000; /* 12 pt */
|
||||
fontdesc.sWeight = FW_NORMAL;
|
||||
fontdesc.sCharset = ANSI_CHARSET;
|
||||
fontdesc.fItalic = FALSE;
|
||||
fontdesc.fUnderline = FALSE;
|
||||
fontdesc.fStrikethrough = FALSE;
|
||||
|
||||
hr = pOleCreateFontIndirect(&fontdesc, &IID_IFont, (void **)&font);
|
||||
ok_ole_success(hr, "OleCreateFontIndirect");
|
||||
|
||||
hr = IFont_get_hFont(font, &hfont);
|
||||
ok_ole_success(hr, "get_hFont");
|
||||
|
||||
/* show that if the font is updated the old hfont is deleted when the
|
||||
new font is realized */
|
||||
for(i = 0; i < 100; i++)
|
||||
{
|
||||
HFONT last_hfont = hfont;
|
||||
|
||||
size.int64 = (i + 10) * 20000;
|
||||
|
||||
obj_type = GetObjectType(hfont);
|
||||
ok(obj_type == OBJ_FONT, "got obj type %d\n", obj_type);
|
||||
|
||||
hr = IFont_put_Size(font, size);
|
||||
ok_ole_success(hr, "put_Size");
|
||||
|
||||
/* put_Size doesn't cause the new font to be realized */
|
||||
obj_type = GetObjectType(last_hfont);
|
||||
ok(obj_type == OBJ_FONT, "got obj type %d\n", obj_type);
|
||||
|
||||
hr = IFont_get_hFont(font, &hfont);
|
||||
ok_ole_success(hr, "get_hFont");
|
||||
|
||||
obj_type = GetObjectType(last_hfont);
|
||||
ok(obj_type == 0, "%d: got obj type %d\n", i, obj_type);
|
||||
}
|
||||
|
||||
/* now show that if we take a reference on the hfont, it persists
|
||||
until the font object is released */
|
||||
for(i = 0; i < 100; i++)
|
||||
{
|
||||
|
||||
size.int64 = (i + 10) * 20000;
|
||||
|
||||
obj_type = GetObjectType(hfont);
|
||||
ok(obj_type == OBJ_FONT, "got obj type %d\n", obj_type);
|
||||
|
||||
hr = IFont_put_Size(font, size);
|
||||
ok_ole_success(hr, "put_Size");
|
||||
|
||||
hr = IFont_get_hFont(font, &hfont);
|
||||
ok_ole_success(hr, "get_hFont");
|
||||
|
||||
hr = IFont_AddRefHfont(font, hfont);
|
||||
ok_ole_success(hr, "AddRefHfont");
|
||||
|
||||
if(i == 0) first_hfont = hfont;
|
||||
obj_type = GetObjectType(first_hfont);
|
||||
ok(obj_type == OBJ_FONT, "got obj type %d\n", obj_type);
|
||||
}
|
||||
|
||||
IFont_Release(font);
|
||||
|
||||
obj_type = GetObjectType(first_hfont);
|
||||
ok(obj_type == 0, "got obj type %d\n", obj_type);
|
||||
|
||||
/* An AddRefHfont followed by a ReleaseHfont means the font doesn't not persist
|
||||
through re-realization */
|
||||
|
||||
hr = pOleCreateFontIndirect(&fontdesc, &IID_IFont, (void **)&font);
|
||||
ok_ole_success(hr, "OleCreateFontIndirect");
|
||||
|
||||
hr = IFont_get_hFont(font, &hfont);
|
||||
ok_ole_success(hr, "get_hFont");
|
||||
|
||||
for(i = 0; i < 100; i++)
|
||||
{
|
||||
HFONT last_hfont = hfont;
|
||||
|
||||
size.int64 = (i + 10) * 20000;
|
||||
|
||||
obj_type = GetObjectType(hfont);
|
||||
ok(obj_type == OBJ_FONT, "got obj type %d\n", obj_type);
|
||||
|
||||
hr = IFont_put_Size(font, size);
|
||||
ok_ole_success(hr, "put_Size");
|
||||
|
||||
/* put_Size doesn't cause the new font to be realized */
|
||||
obj_type = GetObjectType(last_hfont);
|
||||
ok(obj_type == OBJ_FONT, "got obj type %d\n", obj_type);
|
||||
|
||||
hr = IFont_get_hFont(font, &hfont);
|
||||
ok_ole_success(hr, "get_hFont");
|
||||
|
||||
hr = IFont_AddRefHfont(font, hfont);
|
||||
ok_ole_success(hr, "AddRefHfont");
|
||||
|
||||
hr = IFont_ReleaseHfont(font, hfont);
|
||||
ok_ole_success(hr, "ReleaseHfont");
|
||||
|
||||
obj_type = GetObjectType(last_hfont);
|
||||
ok(obj_type == 0, "%d: got obj type %d\n", i, obj_type);
|
||||
}
|
||||
|
||||
/* Interestingly if we release a nonexistent reference on the hfont,
|
||||
* it persists until the font object is released
|
||||
*/
|
||||
for(i = 0; i < 100; i++)
|
||||
{
|
||||
size.int64 = (i + 10) * 20000;
|
||||
|
||||
obj_type = GetObjectType(hfont);
|
||||
ok(obj_type == OBJ_FONT, "got obj type %d\n", obj_type);
|
||||
|
||||
hr = IFont_put_Size(font, size);
|
||||
ok_ole_success(hr, "put_Size");
|
||||
|
||||
hr = IFont_get_hFont(font, &hfont);
|
||||
ok_ole_success(hr, "get_hFont");
|
||||
|
||||
hr = IFont_ReleaseHfont(font, hfont);
|
||||
ok_ole_success(hr, "ReleaseHfont");
|
||||
|
||||
if(i == 0) first_hfont = hfont;
|
||||
obj_type = GetObjectType(first_hfont);
|
||||
ok(obj_type == OBJ_FONT, "got obj type %d\n", obj_type);
|
||||
}
|
||||
|
||||
IFont_Release(font);
|
||||
|
||||
obj_type = GetObjectType(first_hfont);
|
||||
ok(obj_type == 0, "got obj type %d\n", obj_type);
|
||||
|
||||
/* If we take two internal references on a hfont then we can release
|
||||
it twice. So it looks like there's a total reference count
|
||||
that includes internal and external references */
|
||||
|
||||
hr = pOleCreateFontIndirect(&fontdesc, &IID_IFont, (void **)&font);
|
||||
ok_ole_success(hr, "OleCreateFontIndirect");
|
||||
hr = pOleCreateFontIndirect(&fontdesc, &IID_IFont, (void **)&font2);
|
||||
ok_ole_success(hr, "OleCreateFontIndirect");
|
||||
|
||||
hr = IFont_get_hFont(font, &hfont);
|
||||
ok_ole_success(hr, "get_hFont");
|
||||
hr = IFont_get_hFont(font2, &first_hfont);
|
||||
ok_ole_success(hr, "get_hFont");
|
||||
todo_wine
|
||||
ok(hfont == first_hfont, "fonts differ\n");
|
||||
hr = IFont_ReleaseHfont(font, hfont);
|
||||
ok(hr == S_OK, "got %08x\n", hr);
|
||||
hr = IFont_ReleaseHfont(font, hfont);
|
||||
todo_wine
|
||||
ok(hr == S_OK, "got %08x\n", hr);
|
||||
hr = IFont_ReleaseHfont(font, hfont);
|
||||
ok(hr == S_FALSE, "got %08x\n", hr);
|
||||
|
||||
obj_type = GetObjectType(hfont);
|
||||
ok(obj_type == OBJ_FONT, "got obj type %d\n", obj_type);
|
||||
|
||||
IFont_Release(font);
|
||||
|
||||
obj_type = GetObjectType(hfont);
|
||||
ok(obj_type == OBJ_FONT, "got obj type %d\n", obj_type);
|
||||
|
||||
IFont_Release(font2);
|
||||
|
||||
obj_type = GetObjectType(hfont);
|
||||
ok(obj_type == 0, "got obj type %d\n", obj_type);
|
||||
}
|
||||
|
||||
static void test_realization(void)
|
||||
{
|
||||
IFont *font;
|
||||
FONTDESC fontdesc;
|
||||
HRESULT hr;
|
||||
BSTR name;
|
||||
SHORT cs;
|
||||
|
||||
/* Try to create a symbol only font (marlett) with charset
|
||||
set to ANSI. This will result in another, ANSI, font
|
||||
being selected */
|
||||
fontdesc.cbSizeofstruct = sizeof(fontdesc);
|
||||
fontdesc.lpstrName = marlett_font;
|
||||
fontdesc.cySize.int64 = 12 * 10000; /* 12 pt */
|
||||
fontdesc.sWeight = FW_NORMAL;
|
||||
fontdesc.sCharset = ANSI_CHARSET;
|
||||
fontdesc.fItalic = FALSE;
|
||||
fontdesc.fUnderline = FALSE;
|
||||
fontdesc.fStrikethrough = FALSE;
|
||||
|
||||
hr = pOleCreateFontIndirect(&fontdesc, &IID_IFont, (void **)&font);
|
||||
ok_ole_success(hr, "OleCreateFontIndirect");
|
||||
|
||||
hr = IFont_get_Charset(font, &cs);
|
||||
ok_ole_success(hr, "get_Charset");
|
||||
ok(cs == ANSI_CHARSET, "got charset %d\n", cs);
|
||||
|
||||
IFont_Release(font);
|
||||
|
||||
/* Now create an ANSI font and change the name to marlett */
|
||||
|
||||
fontdesc.lpstrName = arial_font;
|
||||
|
||||
hr = pOleCreateFontIndirect(&fontdesc, &IID_IFont, (void **)&font);
|
||||
ok_ole_success(hr, "OleCreateFontIndirect");
|
||||
|
||||
hr = IFont_get_Charset(font, &cs);
|
||||
ok_ole_success(hr, "get_Charset");
|
||||
ok(cs == ANSI_CHARSET, "got charset %d\n", cs);
|
||||
|
||||
name = SysAllocString(marlett_font);
|
||||
hr = IFont_put_Name(font, name);
|
||||
ok_ole_success(hr, "put_Name");
|
||||
SysFreeString(name);
|
||||
|
||||
hr = IFont_get_Name(font, &name);
|
||||
ok_ole_success(hr, "get_Name");
|
||||
ok(!lstrcmpiW(name, marlett_font), "got name %s\n", wine_dbgstr_w(name));
|
||||
SysFreeString(name);
|
||||
|
||||
hr = IFont_get_Charset(font, &cs);
|
||||
ok_ole_success(hr, "get_Charset");
|
||||
ok(cs == SYMBOL_CHARSET, "got charset %d\n", cs);
|
||||
|
||||
IFont_Release(font);
|
||||
}
|
||||
|
||||
START_TEST(olefont)
|
||||
{
|
||||
hOleaut32 = GetModuleHandleA("oleaut32.dll");
|
||||
@@ -834,4 +1109,7 @@ START_TEST(olefont)
|
||||
test_IsEqual();
|
||||
test_ReleaseHfont();
|
||||
test_AddRefHfont();
|
||||
test_returns();
|
||||
test_hfont_lifetime();
|
||||
test_realization();
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <winerror.h>
|
||||
#include <winnt.h>
|
||||
|
||||
#include <urlmon.h>
|
||||
#include <wtypes.h>
|
||||
#include <olectl.h>
|
||||
#include <objidl.h>
|
||||
@@ -357,6 +358,7 @@ static void test_empty_image(void) {
|
||||
ok (hres == S_OK,"empty picture get handle failed with hres 0x%08x\n", hres);
|
||||
ok (handle == 0, "empty picture get handle did not return 0, but 0x%08x\n", handle);
|
||||
IPicture_Release (pic);
|
||||
IStream_Release (stream);
|
||||
}
|
||||
|
||||
static void test_empty_image_2(void) {
|
||||
@@ -395,6 +397,7 @@ static void test_empty_image_2(void) {
|
||||
ok (type == PICTYPE_NONE,"type is %d, but should be PICTYPE_NONE(0)\n", type);
|
||||
|
||||
IPicture_Release (pic);
|
||||
IStream_Release (stream);
|
||||
}
|
||||
|
||||
static void test_Invoke(void)
|
||||
@@ -408,16 +411,17 @@ static void test_Invoke(void)
|
||||
HGLOBAL hglob;
|
||||
void *data;
|
||||
|
||||
hglob = GlobalAlloc (0, sizeof(gifimage));
|
||||
data = GlobalLock(hglob);
|
||||
memcpy(data, gifimage, sizeof(gifimage));
|
||||
hglob = GlobalAlloc (0, sizeof(gifimage));
|
||||
data = GlobalLock(hglob);
|
||||
memcpy(data, gifimage, sizeof(gifimage));
|
||||
GlobalUnlock(hglob);
|
||||
|
||||
hr = CreateStreamOnHGlobal (hglob, FALSE, &stream);
|
||||
hr = CreateStreamOnHGlobal (hglob, FALSE, &stream);
|
||||
ok_ole_success(hr, "CreateStreamOnHGlobal");
|
||||
|
||||
hr = pOleLoadPicture(stream, sizeof(gifimage), TRUE, &IID_IPictureDisp, (void **)&picdisp);
|
||||
hr = pOleLoadPicture(stream, sizeof(gifimage), TRUE, &IID_IPictureDisp, (void **)&picdisp);
|
||||
IStream_Release(stream);
|
||||
GlobalFree(hglob);
|
||||
ok_ole_success(hr, "OleLoadPicture");
|
||||
|
||||
V_VT(&vararg) = VT_BOOL;
|
||||
@@ -594,6 +598,9 @@ static void test_Render(void)
|
||||
HRESULT hres;
|
||||
short type;
|
||||
PICTDESC desc;
|
||||
OLE_XSIZE_HIMETRIC pWidth;
|
||||
OLE_YSIZE_HIMETRIC pHeight;
|
||||
COLORREF result, expected;
|
||||
HDC hdc = GetDC(0);
|
||||
|
||||
/* test IPicture::Render return code on uninitialized picture */
|
||||
@@ -646,8 +653,39 @@ static void test_Render(void)
|
||||
ole_expect(hres, CTL_E_INVALIDPROPERTYVALUE);
|
||||
hres = IPicture_Render(pic, hdc, 0, 0, 0, 0, 0, 0, 10, 10, NULL);
|
||||
ole_expect(hres, CTL_E_INVALIDPROPERTYVALUE);
|
||||
IPicture_Release(pic);
|
||||
|
||||
/* Check if target size and position is respected */
|
||||
IPicture_get_Width(pic, &pWidth);
|
||||
IPicture_get_Height(pic, &pHeight);
|
||||
|
||||
SetPixelV(hdc, 0, 0, 0x00F0F0F0);
|
||||
SetPixelV(hdc, 5, 5, 0x00F0F0F0);
|
||||
SetPixelV(hdc, 10, 10, 0x00F0F0F0);
|
||||
expected = GetPixel(hdc, 0, 0);
|
||||
|
||||
hres = IPicture_Render(pic, hdc, 1, 1, 9, 9, 0, 0, pWidth, -pHeight, NULL);
|
||||
ole_expect(hres, S_OK);
|
||||
|
||||
if(hres != S_OK) {
|
||||
IPicture_Release(pic);
|
||||
ReleaseDC(NULL, hdc);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Evaluate the rendered Icon */
|
||||
result = GetPixel(hdc, 0, 0);
|
||||
ok(result == expected,
|
||||
"Color at 0,0 should be unchanged 0x%06X, but was 0x%06X\n", expected, result);
|
||||
result = GetPixel(hdc, 5, 5);
|
||||
ok(result != expected ||
|
||||
broken(result == expected), /* WinNT 4.0 and older may claim they drew */
|
||||
/* the icon, even if they didn't. */
|
||||
"Color at 5,5 should have changed, but still was 0x%06X\n", expected);
|
||||
result = GetPixel(hdc, 10, 10);
|
||||
ok(result == expected,
|
||||
"Color at 10,10 should be unchanged 0x%06X, but was 0x%06X\n", expected, result);
|
||||
|
||||
IPicture_Release(pic);
|
||||
ReleaseDC(NULL, hdc);
|
||||
}
|
||||
|
||||
@@ -700,6 +738,141 @@ static void test_get_Type(void)
|
||||
IPicture_Release(pic);
|
||||
}
|
||||
|
||||
static void test_OleLoadPicturePath(void)
|
||||
{
|
||||
static WCHAR emptyW[] = {0};
|
||||
|
||||
IPicture *pic;
|
||||
HRESULT hres;
|
||||
int i;
|
||||
char temp_path[MAX_PATH];
|
||||
char temp_file[MAX_PATH];
|
||||
WCHAR temp_fileW[MAX_PATH + 5] = {'f','i','l','e',':','/','/','/'};
|
||||
HANDLE file;
|
||||
DWORD size;
|
||||
WCHAR *ptr;
|
||||
|
||||
const struct
|
||||
{
|
||||
LPOLESTR szURLorPath;
|
||||
REFIID riid;
|
||||
IPicture **pic;
|
||||
} invalid_parameters[] =
|
||||
{
|
||||
{NULL, NULL, NULL},
|
||||
{NULL, NULL, &pic},
|
||||
{NULL, &IID_IPicture, NULL},
|
||||
{NULL, &IID_IPicture, &pic},
|
||||
{emptyW, NULL, NULL},
|
||||
{emptyW, &IID_IPicture, NULL},
|
||||
};
|
||||
|
||||
for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
|
||||
{
|
||||
pic = (IPicture *)0xdeadbeef;
|
||||
hres = OleLoadPicturePath(invalid_parameters[i].szURLorPath, NULL, 0, 0,
|
||||
invalid_parameters[i].riid,
|
||||
(void **)invalid_parameters[i].pic);
|
||||
ok(hres == E_INVALIDARG,
|
||||
"[%d] Expected OleLoadPicturePath to return E_INVALIDARG, got 0x%08x\n", i, hres);
|
||||
ok(pic == (IPicture *)0xdeadbeef,
|
||||
"[%d] Expected output pointer to be 0xdeadbeef, got %p\n", i, pic);
|
||||
}
|
||||
|
||||
pic = (IPicture *)0xdeadbeef;
|
||||
hres = OleLoadPicturePath(emptyW, NULL, 0, 0, NULL, (void **)&pic);
|
||||
todo_wine
|
||||
ok(hres == INET_E_UNKNOWN_PROTOCOL || /* XP/Vista+ */
|
||||
hres == E_UNEXPECTED || /* NT4/Win95 */
|
||||
hres == E_FAIL || /* Win95 OSR2 */
|
||||
hres == E_OUTOFMEMORY, /* Win98/Win2k/Win2k3 */
|
||||
"Expected OleLoadPicturePath to return INET_E_UNKNOWN_PROTOCOL, got 0x%08x\n", hres);
|
||||
ok(pic == NULL,
|
||||
"Expected the output interface pointer to be NULL, got %p\n", pic);
|
||||
|
||||
pic = (IPicture *)0xdeadbeef;
|
||||
hres = OleLoadPicturePath(emptyW, NULL, 0, 0, &IID_IPicture, (void **)&pic);
|
||||
todo_wine
|
||||
ok(hres == INET_E_UNKNOWN_PROTOCOL || /* XP/Vista+ */
|
||||
hres == E_UNEXPECTED || /* NT4/Win95 */
|
||||
hres == E_FAIL || /* Win95 OSR2 */
|
||||
hres == E_OUTOFMEMORY, /* Win98/Win2k/Win2k3 */
|
||||
"Expected OleLoadPicturePath to return INET_E_UNKNOWN_PROTOCOL, got 0x%08x\n", hres);
|
||||
ok(pic == NULL,
|
||||
"Expected the output interface pointer to be NULL, got %p\n", pic);
|
||||
|
||||
/* Create a local temporary image file for testing. */
|
||||
GetTempPathA(sizeof(temp_path), temp_path);
|
||||
GetTempFileNameA(temp_path, "bmp", 0, temp_file);
|
||||
file = CreateFileA(temp_file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
WriteFile(file, bmpimage, sizeof(bmpimage), &size, NULL);
|
||||
CloseHandle(file);
|
||||
|
||||
MultiByteToWideChar(CP_ACP, 0, temp_file, -1, temp_fileW + 8, sizeof(temp_fileW)/sizeof(WCHAR) - 8);
|
||||
|
||||
/* Try a normal DOS path. */
|
||||
hres = OleLoadPicturePath(temp_fileW + 8, NULL, 0, 0, &IID_IPicture, (void **)&pic);
|
||||
ok(hres == S_OK ||
|
||||
broken(hres == E_UNEXPECTED), /* NT4/Win95 */
|
||||
"Expected OleLoadPicturePath to return S_OK, got 0x%08x\n", hres);
|
||||
if (pic)
|
||||
IPicture_Release(pic);
|
||||
|
||||
/* Try a DOS path with tacked on "file:". */
|
||||
hres = OleLoadPicturePath(temp_fileW, NULL, 0, 0, &IID_IPicture, (void **)&pic);
|
||||
ok(hres == S_OK ||
|
||||
broken(hres == E_UNEXPECTED), /* NT4/Win95 */
|
||||
"Expected OleLoadPicturePath to return S_OK, got 0x%08x\n", hres);
|
||||
if (pic)
|
||||
IPicture_Release(pic);
|
||||
|
||||
DeleteFileA(temp_file);
|
||||
|
||||
/* Try with a nonexistent file. */
|
||||
hres = OleLoadPicturePath(temp_fileW + 8, NULL, 0, 0, &IID_IPicture, (void **)&pic);
|
||||
ok(hres == INET_E_RESOURCE_NOT_FOUND || /* XP+ */
|
||||
hres == E_UNEXPECTED || /* NT4/Win95 */
|
||||
hres == E_FAIL, /* Win9x/Win2k */
|
||||
"Expected OleLoadPicturePath to return INET_E_RESOURCE_NOT_FOUND, got 0x%08x\n", hres);
|
||||
|
||||
hres = OleLoadPicturePath(temp_fileW, NULL, 0, 0, &IID_IPicture, (void **)&pic);
|
||||
ok(hres == INET_E_RESOURCE_NOT_FOUND || /* XP+ */
|
||||
hres == E_UNEXPECTED || /* NT4/Win95 */
|
||||
hres == E_FAIL, /* Win9x/Win2k */
|
||||
"Expected OleLoadPicturePath to return INET_E_RESOURCE_NOT_FOUND, got 0x%08x\n", hres);
|
||||
|
||||
file = CreateFileA(temp_file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
WriteFile(file, bmpimage, sizeof(bmpimage), &size, NULL);
|
||||
CloseHandle(file);
|
||||
|
||||
/* Try a "file:" URL with slash separators. */
|
||||
ptr = temp_fileW + 8;
|
||||
while (*ptr)
|
||||
{
|
||||
if (*ptr == '\\')
|
||||
*ptr = '/';
|
||||
ptr++;
|
||||
}
|
||||
|
||||
hres = OleLoadPicturePath(temp_fileW, NULL, 0, 0, &IID_IPicture, (void **)&pic);
|
||||
ok(hres == S_OK ||
|
||||
broken(hres == E_UNEXPECTED), /* NT4/Win95 */
|
||||
"Expected OleLoadPicturePath to return S_OK, got 0x%08x\n", hres);
|
||||
if (pic)
|
||||
IPicture_Release(pic);
|
||||
|
||||
DeleteFileA(temp_file);
|
||||
|
||||
/* Try with a nonexistent file. */
|
||||
hres = OleLoadPicturePath(temp_fileW, NULL, 0, 0, &IID_IPicture, (void **)&pic);
|
||||
ok(hres == INET_E_RESOURCE_NOT_FOUND || /* XP+ */
|
||||
hres == E_UNEXPECTED || /* NT4/Win95 */
|
||||
hres == E_FAIL, /* Win9x/Win2k */
|
||||
"Expected OleLoadPicturePath to return INET_E_RESOURCE_NOT_FOUND, got 0x%08x\n", hres);
|
||||
}
|
||||
|
||||
START_TEST(olepicture)
|
||||
{
|
||||
hOleaut32 = GetModuleHandleA("oleaut32.dll");
|
||||
@@ -716,22 +889,21 @@ START_TEST(olepicture)
|
||||
test_pic(jpgimage, sizeof(jpgimage));
|
||||
test_pic(bmpimage, sizeof(bmpimage));
|
||||
test_pic(gif4pixel, sizeof(gif4pixel));
|
||||
/* FIXME: No PNG support yet in Wine or in older Windows... */
|
||||
/* FIXME: No PNG support in Windows... */
|
||||
if (0) test_pic(pngimage, sizeof(pngimage));
|
||||
test_empty_image();
|
||||
test_empty_image_2();
|
||||
skip("skipping test_apm, see bug 5396\n");
|
||||
//test_apm();
|
||||
test_apm();
|
||||
test_metafile();
|
||||
skip("skipping test_enhmetafile, see bug 5396\n");
|
||||
//test_enhmetafile();
|
||||
test_enhmetafile();
|
||||
|
||||
test_Invoke();
|
||||
test_OleCreatePictureIndirect();
|
||||
test_Render();
|
||||
test_get_Attributes();
|
||||
test_get_Handle();
|
||||
test_get_Type();
|
||||
test_Invoke();
|
||||
test_OleCreatePictureIndirect();
|
||||
test_Render();
|
||||
test_get_Attributes();
|
||||
test_get_Handle();
|
||||
test_get_Type();
|
||||
test_OleLoadPicturePath();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1321,6 +1321,7 @@ static void test_SafeArrayCopyData(void)
|
||||
ok(SafeArrayGetElemsize(sa) == SafeArrayGetElemsize(sacopy),"elemsize wrong\n");
|
||||
ok(SafeArrayGetDim(sa) == SafeArrayGetDim(sacopy),"dimensions wrong\n");
|
||||
ok(!memcmp(sa->pvData, sacopy->pvData, size * sizeof(int)), "compared different\n");
|
||||
SafeArrayDestroy(sacopy);
|
||||
}
|
||||
|
||||
SafeArrayDestroy(sa);
|
||||
@@ -1548,6 +1549,7 @@ static void test_SafeArrayCopy(void)
|
||||
hres = SafeArrayCopy(sa, &sa2);
|
||||
ok(hres == S_OK, "SafeArrayCopy failed with error 0x%08x\n", hres);
|
||||
|
||||
SafeArrayDestroy(sa2);
|
||||
SafeArrayDestroy(sa);
|
||||
}
|
||||
|
||||
@@ -1652,15 +1654,18 @@ static void test_SafeArrayChangeTypeEx(void)
|
||||
hres = VariantChangeTypeEx(&v2, &v, 0, 0, VT_ARRAY|VT_UI1);
|
||||
ok(hres == S_OK, "CTE VT_ARRAY|VT_UI1->VT_ARRAY|VT_UI1 returned %x\n", hres);
|
||||
SafeArrayDestroy(sa);
|
||||
VariantClear(&v2);
|
||||
}
|
||||
|
||||
/* NULL/EMPTY */
|
||||
MKARRAY(0,1,VT_UI1);
|
||||
hres = VariantChangeTypeEx(&v2, &v, 0, 0, VT_NULL);
|
||||
ok(hres == DISP_E_TYPEMISMATCH, "CTE VT_ARRAY|VT_UI1 returned %x\n", hres);
|
||||
VariantClear(&v);
|
||||
MKARRAY(0,1,VT_UI1);
|
||||
hres = VariantChangeTypeEx(&v2, &v, 0, 0, VT_EMPTY);
|
||||
ok(hres == DISP_E_TYPEMISMATCH, "CTE VT_ARRAY|VT_UI1 returned %x\n", hres);
|
||||
VariantClear(&v);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
/*
|
||||
* A typelib to test registration.
|
||||
*
|
||||
* Copyright 2010 Huw Davies
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
import "oaidl.idl"; /* needed by widl */
|
||||
|
||||
[
|
||||
uuid(a2cfdbd3-2bbf-4b1c-a414-5a5904e634c9),
|
||||
version(1.0)
|
||||
]
|
||||
library register_test
|
||||
{
|
||||
importlib("stdole2.tlb");
|
||||
|
||||
[
|
||||
uuid(06c1f5f0-ea49-44f9-8e3b-4be00c7a0689)
|
||||
]
|
||||
interface Inon_ole : IUnknown
|
||||
{
|
||||
HRESULT test();
|
||||
}
|
||||
|
||||
[
|
||||
uuid(06c1f5f1-ea49-44f9-8e3b-4be00c7a0689)
|
||||
]
|
||||
interface Inon_ole_from_disp : IDispatch
|
||||
{
|
||||
HRESULT test();
|
||||
}
|
||||
|
||||
[
|
||||
uuid(06c1f5f2-ea49-44f9-8e3b-4be00c7a0689),
|
||||
oleautomation
|
||||
]
|
||||
interface Iole : IUnknown
|
||||
{
|
||||
HRESULT test();
|
||||
}
|
||||
|
||||
[
|
||||
uuid(06c1f5f3-ea49-44f9-8e3b-4be00c7a0689),
|
||||
oleautomation
|
||||
]
|
||||
interface Iole_from_disp : IDispatch
|
||||
{
|
||||
HRESULT test();
|
||||
}
|
||||
|
||||
[
|
||||
uuid(06c1f5f4-ea49-44f9-8e3b-4be00c7a0689),
|
||||
dual
|
||||
]
|
||||
interface Inon_ole_dual : IUnknown
|
||||
{
|
||||
HRESULT test();
|
||||
}
|
||||
|
||||
[
|
||||
uuid(06c1f5f5-ea49-44f9-8e3b-4be00c7a0689),
|
||||
oleautomation,
|
||||
dual
|
||||
]
|
||||
interface Iole_dual : IUnknown
|
||||
{
|
||||
HRESULT test();
|
||||
}
|
||||
|
||||
[
|
||||
uuid(06c1f5f6-ea49-44f9-8e3b-4be00c7a0689),
|
||||
dual
|
||||
]
|
||||
interface Inon_ole_dual_from_disp : IDispatch
|
||||
{
|
||||
HRESULT test();
|
||||
}
|
||||
|
||||
[
|
||||
uuid(06c1f5f7-ea49-44f9-8e3b-4be00c7a0689),
|
||||
oleautomation,
|
||||
dual
|
||||
]
|
||||
interface Iole_dual_from_disp : IDispatch
|
||||
{
|
||||
HRESULT test();
|
||||
}
|
||||
|
||||
/* oleautomation not allowed with dispinterfaces */
|
||||
[
|
||||
uuid(06c1f5f8-ea49-44f9-8e3b-4be00c7a0689)
|
||||
]
|
||||
dispinterface Idisp
|
||||
{
|
||||
properties:
|
||||
[id(0x0)] BSTR Name;
|
||||
methods:
|
||||
}
|
||||
|
||||
[
|
||||
uuid(06c1f5f9-ea49-44f9-8e3b-4be00c7a0689)
|
||||
]
|
||||
dispinterface Idisp_from_non_ole_iface
|
||||
{
|
||||
interface Inon_ole;
|
||||
}
|
||||
|
||||
[
|
||||
uuid(06c1f5fa-ea49-44f9-8e3b-4be00c7a0689)
|
||||
]
|
||||
dispinterface Idisp_from_ole_from_disp_iface
|
||||
{
|
||||
interface Iole_from_disp;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
#define STANDALONE
|
||||
#include "wine/test.h"
|
||||
|
||||
extern void func_dispatch(void);
|
||||
extern void func_olefont(void);
|
||||
extern void func_olepicture(void);
|
||||
extern void func_safearray(void);
|
||||
@@ -18,6 +19,7 @@ extern void func_vartype(void);
|
||||
|
||||
const struct test winetest_testlist[] =
|
||||
{
|
||||
{ "dispatch", func_dispatch },
|
||||
{ "olefont", func_olefont },
|
||||
{ "olepicture", func_olepicture },
|
||||
{ "safearray", func_safearray },
|
||||
|
||||
@@ -521,9 +521,18 @@ static HRESULT WINAPI Widget_StructArgs(
|
||||
MYSTRUCT *byptr,
|
||||
MYSTRUCT arr[5])
|
||||
{
|
||||
ok(memcmp(&byval, &MYSTRUCT_BYVAL, sizeof(MYSTRUCT))==0, "Struct parameter passed by value corrupted\n");
|
||||
ok(memcmp(byptr, &MYSTRUCT_BYPTR, sizeof(MYSTRUCT))==0, "Struct parameter passed by pointer corrupted\n");
|
||||
ok(memcmp(arr, MYSTRUCT_ARRAY, sizeof(MYSTRUCT_ARRAY))==0, "Array of structs corrupted\n");
|
||||
int i, diff = 0;
|
||||
ok(byval.field1 == MYSTRUCT_BYVAL.field1 &&
|
||||
byval.field2 == MYSTRUCT_BYVAL.field2,
|
||||
"Struct parameter passed by value corrupted\n");
|
||||
ok(byptr->field1 == MYSTRUCT_BYPTR.field1 &&
|
||||
byptr->field2 == MYSTRUCT_BYPTR.field2,
|
||||
"Struct parameter passed by pointer corrupted\n");
|
||||
for (i = 0; i < 5; i++)
|
||||
if (arr[i].field1 != MYSTRUCT_ARRAY[i].field1 ||
|
||||
arr[i].field2 != MYSTRUCT_ARRAY[i].field2)
|
||||
diff++;
|
||||
ok(diff == 0, "Array of structs corrupted\n");
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -578,6 +587,31 @@ static HRESULT WINAPI Widget_get_prop_uint(
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI Widget_ByRefUInt(
|
||||
IWidget* iface, UINT *i)
|
||||
{
|
||||
*i = 42;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI Widget_put_prop_opt_arg(
|
||||
IWidget* iface, INT opt, INT i)
|
||||
{
|
||||
trace("put_prop_opt_arg(%08x, %08x)\n", opt, i);
|
||||
todo_wine ok(opt == 0, "got opt=%08x\n", opt);
|
||||
ok(i == 0xcafe, "got i=%08x\n", i);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI Widget_put_prop_req_arg(
|
||||
IWidget* iface, INT req, INT i)
|
||||
{
|
||||
trace("put_prop_req_arg(%08x, %08x)\n", req, i);
|
||||
ok(req == 0x5678, "got req=%08x\n", req);
|
||||
ok(i == 0x1234, "got i=%08x\n", i);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static const struct IWidgetVtbl Widget_VTable =
|
||||
{
|
||||
Widget_QueryInterface,
|
||||
@@ -609,7 +643,10 @@ static const struct IWidgetVtbl Widget_VTable =
|
||||
Widget_put_prop_with_lcid,
|
||||
Widget_get_prop_with_lcid,
|
||||
Widget_get_prop_int,
|
||||
Widget_get_prop_uint
|
||||
Widget_get_prop_uint,
|
||||
Widget_ByRefUInt,
|
||||
Widget_put_prop_opt_arg,
|
||||
Widget_put_prop_req_arg,
|
||||
};
|
||||
|
||||
static HRESULT WINAPI StaticWidget_QueryInterface(IStaticWidget *iface, REFIID riid, void **ppvObject)
|
||||
@@ -878,12 +915,18 @@ static BSTR WINAPI NonOleAutomation_BstrRet(INonOleAutomation *iface)
|
||||
return SysAllocString(wszTestString);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI NonOleAutomation_Error(INonOleAutomation *iface)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
static INonOleAutomationVtbl NonOleAutomation_VTable =
|
||||
{
|
||||
NonOleAutomation_QueryInterface,
|
||||
NonOleAutomation_AddRef,
|
||||
NonOleAutomation_Release,
|
||||
NonOleAutomation_BstrRet,
|
||||
NonOleAutomation_Error
|
||||
};
|
||||
|
||||
static INonOleAutomation NonOleAutomation = { &NonOleAutomation_VTable };
|
||||
@@ -898,6 +941,7 @@ static ITypeInfo *NonOleAutomation_GetTypeInfo(void)
|
||||
ITypeInfo *pTypeInfo;
|
||||
hr = ITypeLib_GetTypeInfoOfGuid(pTypeLib, &IID_INonOleAutomation, &pTypeInfo);
|
||||
ok_ole_success(hr, ITypeLib_GetTypeInfoOfGuid);
|
||||
ITypeLib_Release(pTypeLib);
|
||||
return pTypeInfo;
|
||||
}
|
||||
return NULL;
|
||||
@@ -926,6 +970,7 @@ static void test_typelibmarshal(void)
|
||||
ITypeInfo *pTypeInfo;
|
||||
MYSTRUCT mystruct;
|
||||
MYSTRUCT mystructArray[5];
|
||||
UINT uval;
|
||||
|
||||
ok(pKEW != NULL, "Widget creation failed\n");
|
||||
|
||||
@@ -1069,9 +1114,7 @@ static void test_typelibmarshal(void)
|
||||
mystruct = MYSTRUCT_BYPTR;
|
||||
memcpy(mystructArray, MYSTRUCT_ARRAY, sizeof(mystructArray));
|
||||
hr = IWidget_StructArgs(pWidget, MYSTRUCT_BYVAL, &mystruct, mystructArray);
|
||||
todo_wine {
|
||||
ok_ole_success(hr, IWidget_StructArgs);
|
||||
}
|
||||
|
||||
/* call Clone */
|
||||
dispparams.cNamedArgs = 0;
|
||||
@@ -1222,6 +1265,19 @@ static void test_typelibmarshal(void)
|
||||
ok(V_BSTR(&varresult) != NULL, "V_BSTR(&varresult) should not be NULL\n");
|
||||
|
||||
VariantClear(&varresult);
|
||||
|
||||
dispparams.cNamedArgs = 0;
|
||||
dispparams.cArgs = 0;
|
||||
dispparams.rgdispidNamedArgs = NULL;
|
||||
dispparams.rgvarg = NULL;
|
||||
hr = ITypeInfo_Invoke(pTypeInfo, &NonOleAutomation, DISPID_NOA_ERROR, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
|
||||
ok(hr == DISP_E_EXCEPTION, "ITypeInfo_Invoke should have returned DISP_E_EXCEPTION instead of 0x%08x\n", hr);
|
||||
ok(V_VT(&varresult) == VT_EMPTY, "V_VT(&varresult) should be VT_EMPTY instead of %d\n", V_VT(&varresult));
|
||||
ok(excepinfo.wCode == 0x0 && excepinfo.scode == E_NOTIMPL,
|
||||
"EXCEPINFO differs from expected: wCode = 0x%x, scode = 0x%08x\n",
|
||||
excepinfo.wCode, excepinfo.scode);
|
||||
VariantClear(&varresult);
|
||||
|
||||
ITypeInfo_Release(pTypeInfo);
|
||||
|
||||
/* tests call put_Name without named arg */
|
||||
@@ -1244,10 +1300,8 @@ static void test_typelibmarshal(void)
|
||||
dispparams.cArgs = 1;
|
||||
dispparams.rgvarg = vararg;
|
||||
VariantInit(&varresult);
|
||||
#if 0 /* NULL unknown not currently marshaled correctly */
|
||||
hr = IDispatch_Invoke(pDispatch, DISPID_TM_NAME, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_PROPERTYPUT, &dispparams, &varresult, &excepinfo, NULL);
|
||||
ok(hr == DISP_E_TYPEMISMATCH, "IDispatch_Invoke should have returned DISP_E_TYPEMISMATCH instead of 0x%08x\n", hr);
|
||||
#endif
|
||||
VariantClear(&varresult);
|
||||
|
||||
/* tests bad param type */
|
||||
@@ -1299,7 +1353,6 @@ static void test_typelibmarshal(void)
|
||||
dispparams.rgvarg = vararg;
|
||||
VariantInit(&varresult);
|
||||
hr = IDispatch_Invoke(pDispatch, DISPID_TM_PROP_WITH_LCID, &IID_NULL, 0x40c, DISPATCH_PROPERTYPUT, &dispparams, &varresult, &excepinfo, NULL);
|
||||
todo_wine
|
||||
ok_ole_success(hr, ITypeInfo_Invoke);
|
||||
VariantClear(&varresult);
|
||||
|
||||
@@ -1309,12 +1362,9 @@ todo_wine
|
||||
dispparams.rgvarg = NULL;
|
||||
dispparams.rgdispidNamedArgs = NULL;
|
||||
hr = IDispatch_Invoke(pDispatch, DISPID_TM_PROP_WITH_LCID, &IID_NULL, 0x40c, DISPATCH_PROPERTYGET, &dispparams, &varresult, &excepinfo, NULL);
|
||||
todo_wine
|
||||
{
|
||||
ok_ole_success(hr, ITypeInfo_Invoke);
|
||||
ok(V_VT(&varresult) == VT_I4, "got %x\n", V_VT(&varresult));
|
||||
ok(V_I4(&varresult) == 0x409, "got %x\n", V_I4(&varresult));
|
||||
}
|
||||
VariantClear(&varresult);
|
||||
|
||||
/* test propget of INT value */
|
||||
@@ -1339,6 +1389,53 @@ todo_wine
|
||||
ok(V_UI4(&varresult) == 42, "got %x\n", V_UI4(&varresult));
|
||||
VariantClear(&varresult);
|
||||
|
||||
/* test byref marshalling */
|
||||
uval = 666;
|
||||
VariantInit(&vararg[0]);
|
||||
V_VT(&vararg[0]) = VT_UI4|VT_BYREF;
|
||||
V_UI4REF(&vararg[0]) = &uval;
|
||||
dispparams.cNamedArgs = 0;
|
||||
dispparams.cArgs = 1;
|
||||
dispparams.rgvarg = vararg;
|
||||
dispparams.rgdispidNamedArgs = NULL;
|
||||
hr = IDispatch_Invoke(pDispatch, DISPID_TM_BYREF_UINT, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
|
||||
ok_ole_success(hr, ITypeInfo_Invoke);
|
||||
ok(V_VT(&varresult) == VT_EMPTY, "varresult should be VT_EMPTY\n");
|
||||
ok(V_VT(&vararg[0]) == (VT_UI4|VT_BYREF), "arg VT not unmarshalled correctly: %x\n", V_VT(&vararg[0]));
|
||||
ok(V_UI4REF(&vararg[0]) == &uval, "Byref pointer not preserved: %p/%p\n", &uval, V_UI4REF(&vararg[0]));
|
||||
ok(*V_UI4REF(&vararg[0]) == 42, "Expected 42 to be returned instead of %u\n", *V_UI4REF(&vararg[0]));
|
||||
VariantClear(&varresult);
|
||||
VariantClear(&vararg[0]);
|
||||
|
||||
/* test propput with optional argument. */
|
||||
VariantInit(&vararg[0]);
|
||||
V_VT(&vararg[0]) = VT_I4;
|
||||
V_I4(&vararg[0]) = 0xcafe;
|
||||
dispparams.cNamedArgs = 1;
|
||||
dispparams.rgdispidNamedArgs = &dispidNamed;
|
||||
dispparams.cArgs = 1;
|
||||
dispparams.rgvarg = vararg;
|
||||
VariantInit(&varresult);
|
||||
hr = IDispatch_Invoke(pDispatch, DISPID_TM_PROP_OPT_ARG, &IID_NULL, 0x40c, DISPATCH_PROPERTYPUT, &dispparams, &varresult, &excepinfo, NULL);
|
||||
ok_ole_success(hr, ITypeInfo_Invoke);
|
||||
VariantClear(&varresult);
|
||||
|
||||
/* test propput with required argument. */
|
||||
VariantInit(&vararg[0]);
|
||||
VariantInit(&vararg[1]);
|
||||
V_VT(&vararg[0]) = VT_I4;
|
||||
V_I4(&vararg[0]) = 0x1234;
|
||||
V_VT(&vararg[1]) = VT_I4;
|
||||
V_I4(&vararg[1]) = 0x5678;
|
||||
dispparams.cNamedArgs = 1;
|
||||
dispparams.rgdispidNamedArgs = &dispidNamed;
|
||||
dispparams.cArgs = 2;
|
||||
dispparams.rgvarg = vararg;
|
||||
VariantInit(&varresult);
|
||||
hr = IDispatch_Invoke(pDispatch, DISPID_TM_PROP_REQ_ARG, &IID_NULL, 0x40c, DISPATCH_PROPERTYPUT, &dispparams, &varresult, &excepinfo, NULL);
|
||||
ok_ole_success(hr, ITypeInfo_Invoke);
|
||||
VariantClear(&varresult);
|
||||
|
||||
IDispatch_Release(pDispatch);
|
||||
IWidget_Release(pWidget);
|
||||
|
||||
@@ -1359,7 +1456,7 @@ static void test_DispCallFunc(void)
|
||||
V_VT(&vararg[0]) = VT_R8;
|
||||
V_R8(&vararg[0]) = 3.141;
|
||||
V_VT(&vararg[1]) = VT_BSTR;
|
||||
V_BSTR(&vararg[1]) = SysAllocString(szEmpty);
|
||||
V_BSTRREF(&vararg[1]) = CoTaskMemAlloc(sizeof(BSTR));
|
||||
V_VT(&vararg[2]) = VT_BSTR;
|
||||
V_BSTR(&vararg[2]) = SysAllocString(szEmpty);
|
||||
V_VT(&vararg[3]) = VT_VARIANT|VT_BYREF;
|
||||
@@ -1370,7 +1467,8 @@ static void test_DispCallFunc(void)
|
||||
hr = DispCallFunc(pWidget, 9*sizeof(void*), CC_STDCALL, VT_UI4, 4, rgvt, rgpvarg, &varresult);
|
||||
ok_ole_success(hr, DispCallFunc);
|
||||
VariantClear(&varresult);
|
||||
VariantClear(&vararg[1]);
|
||||
SysFreeString(*V_BSTRREF(&vararg[1]));
|
||||
CoTaskMemFree(V_BSTRREF(&vararg[1]));
|
||||
VariantClear(&vararg[2]);
|
||||
IWidget_Release(pWidget);
|
||||
}
|
||||
@@ -1403,6 +1501,29 @@ static void test_StaticWidget(void)
|
||||
ITypeInfo_Release(type_info);
|
||||
}
|
||||
|
||||
static void test_libattr(void)
|
||||
{
|
||||
ITypeLib *pTypeLib;
|
||||
HRESULT hr;
|
||||
TLIBATTR *pattr;
|
||||
|
||||
hr = LoadRegTypeLib(&LIBID_TestTypelib, 1, 0, LOCALE_NEUTRAL, &pTypeLib);
|
||||
ok_ole_success(hr, LoadRegTypeLib);
|
||||
if (FAILED(hr))
|
||||
return;
|
||||
|
||||
hr = ITypeLib_GetLibAttr(pTypeLib, &pattr);
|
||||
ok_ole_success(hr, GetLibAttr);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
ok(pattr->lcid == MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), "lcid %x\n", pattr->lcid);
|
||||
|
||||
ITypeLib_ReleaseTLibAttr(pTypeLib, pattr);
|
||||
}
|
||||
|
||||
ITypeLib_Release(pTypeLib);
|
||||
}
|
||||
|
||||
START_TEST(tmarshal)
|
||||
{
|
||||
HRESULT hr;
|
||||
@@ -1415,6 +1536,7 @@ START_TEST(tmarshal)
|
||||
test_typelibmarshal();
|
||||
test_DispCallFunc();
|
||||
test_StaticWidget();
|
||||
test_libattr();
|
||||
|
||||
hr = UnRegisterTypeLib(&LIBID_TestTypelib, 1, 0, LOCALE_NEUTRAL,
|
||||
sizeof(void*) == 8 ? SYS_WIN64 : SYS_WIN32);
|
||||
|
||||
@@ -137,6 +137,15 @@ library TestTypelib
|
||||
|
||||
[id(DISPID_TM_PROP_UINT), propget]
|
||||
HRESULT prop_uint([out,retval] UINT *i);
|
||||
|
||||
[id(DISPID_TM_BYREF_UINT)]
|
||||
HRESULT ByRefUInt([in, out] UINT *i);
|
||||
|
||||
[id(DISPID_TM_PROP_OPT_ARG), propput]
|
||||
HRESULT prop_opt_arg([in,optional] INT opt, [in] INT i);
|
||||
|
||||
[id(DISPID_TM_PROP_REQ_ARG), propput]
|
||||
HRESULT prop_req_arg([in] INT req, [in] INT i);
|
||||
}
|
||||
|
||||
[
|
||||
@@ -181,6 +190,9 @@ library TestTypelib
|
||||
{
|
||||
[id(DISPID_NOA_BSTRRET)]
|
||||
BSTR BstrRet();
|
||||
|
||||
[id(DISPID_NOA_ERROR)]
|
||||
HRESULT Error();
|
||||
}
|
||||
|
||||
|
||||
@@ -285,7 +297,7 @@ library TestTypelib
|
||||
]
|
||||
interface ItestIF7 : ItestIF6
|
||||
{
|
||||
[id(0x1236)] HRESULT fn6([in] int a);
|
||||
[id(0x1236)] HRESULT fn6([in] GUID a);
|
||||
}
|
||||
|
||||
[
|
||||
|
||||
@@ -32,3 +32,6 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||
|
||||
/* @makedep: test_tlb.tlb */
|
||||
2 TYPELIB LOADONCALL DISCARDABLE test_tlb.tlb
|
||||
|
||||
/* @makedep: test_reg.tlb */
|
||||
3 TYPELIB LOADONCALL DISCARDABLE test_reg.tlb
|
||||
|
||||
@@ -37,5 +37,9 @@
|
||||
#define DISPID_TM_PROP_WITH_LCID 18
|
||||
#define DISPID_TM_PROP_INT 19
|
||||
#define DISPID_TM_PROP_UINT 20
|
||||
#define DISPID_TM_BYREF_UINT 21
|
||||
#define DISPID_TM_PROP_OPT_ARG 22
|
||||
#define DISPID_TM_PROP_REQ_ARG 23
|
||||
|
||||
#define DISPID_NOA_BSTRRET 1
|
||||
#define DISPID_NOA_ERROR 2
|
||||
|
||||
@@ -31,6 +31,9 @@
|
||||
#include "ocidl.h"
|
||||
#include "shlwapi.h"
|
||||
#include "tmarshal.h"
|
||||
#include "initguid.h"
|
||||
|
||||
#include "test_reg.h"
|
||||
|
||||
#define expect_eq(expr, value, type, format) { type _ret = (expr); ok((value) == _ret, #expr " expected " format " got " format "\n", value, _ret); }
|
||||
#define expect_int(expr, value) expect_eq(expr, (int)(value), int, "%d")
|
||||
@@ -150,7 +153,7 @@ static void test_TypeComp(void)
|
||||
/* test getting a function within a TKIND_MODULE with INVOKE_PROPERTYGET */
|
||||
ulHash = LHashValOfNameSys(SYS_WIN32, LOCALE_NEUTRAL, wszSavePicture);
|
||||
hr = ITypeComp_Bind(pTypeComp, wszSavePicture, ulHash, INVOKE_PROPERTYGET, &pTypeInfo, &desckind, &bindptr);
|
||||
todo_wine ok(hr == TYPE_E_TYPEMISMATCH,
|
||||
ok(hr == TYPE_E_TYPEMISMATCH,
|
||||
"ITypeComp_Bind should have failed with TYPE_E_TYPEMISMATCH instead of 0x%08x\n",
|
||||
hr);
|
||||
|
||||
@@ -449,6 +452,7 @@ static void test_TypeInfo(void)
|
||||
{
|
||||
ITypeLib *pTypeLib;
|
||||
ITypeInfo *pTypeInfo;
|
||||
ITypeInfo2 *pTypeInfo2;
|
||||
HRESULT hr;
|
||||
static WCHAR wszBogus[] = { 'b','o','g','u','s',0 };
|
||||
static WCHAR wszGetTypeInfo[] = { 'G','e','t','T','y','p','e','I','n','f','o',0 };
|
||||
@@ -458,6 +462,8 @@ static void test_TypeInfo(void)
|
||||
OLECHAR* pwszClone = wszClone;
|
||||
DISPID dispidMember;
|
||||
DISPPARAMS dispparams;
|
||||
GUID bogusguid = {0x806afb4f,0x13f7,0x42d2,{0x89,0x2c,0x6c,0x97,0xc3,0x6a,0x36,0xc1}};
|
||||
VARIANT var;
|
||||
|
||||
hr = LoadTypeLib(wszStdOle2, &pTypeLib);
|
||||
ok_ole_success(hr, LoadTypeLib);
|
||||
@@ -503,6 +509,25 @@ static void test_TypeInfo(void)
|
||||
hr = ITypeInfo_GetIDsOfNames(pTypeInfo, &pwszGetTypeInfo, 1, &dispidMember);
|
||||
ok_ole_success(hr, ITypeInfo_GetIDsOfNames);
|
||||
|
||||
hr = ITypeInfo_QueryInterface(pTypeInfo, &IID_ITypeInfo2, (void**)&pTypeInfo2);
|
||||
ok_ole_success(hr, ITypeInfo_QueryInterface);
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
VariantInit(&var);
|
||||
|
||||
V_VT(&var) = VT_I4;
|
||||
|
||||
/* test unknown guid passed to GetCustData */
|
||||
hr = ITypeInfo2_GetCustData(pTypeInfo2, &bogusguid, &var);
|
||||
ok_ole_success(hr, ITypeInfo_GetCustData);
|
||||
ok(V_VT(&var) == VT_EMPTY, "got %i, expected VT_EMPTY\n", V_VT(&var));
|
||||
|
||||
ITypeInfo2_Release(pTypeInfo2);
|
||||
|
||||
VariantClear(&var);
|
||||
}
|
||||
|
||||
/* test invoking a method with a [restricted] keyword */
|
||||
hr = ITypeInfo_Invoke(pTypeInfo, NULL, dispidMember, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL);
|
||||
todo_wine {
|
||||
@@ -713,8 +738,10 @@ static void test_inheritance(void)
|
||||
if(use_midl_tlb) {
|
||||
ok(pTA->cFuncs == 6, "cfuncs %d\n", pTA->cFuncs);
|
||||
ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
|
||||
}
|
||||
ITypeInfo_ReleaseTypeAttr(pTI, pTA);
|
||||
|
||||
if(use_midl_tlb) {
|
||||
hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href);
|
||||
ok(hr == S_OK, "hr %08x\n", hr);
|
||||
hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p);
|
||||
@@ -839,8 +866,10 @@ if(use_midl_tlb) {
|
||||
if(use_midl_tlb) {
|
||||
ok(pTA->cFuncs == 3, "cfuncs %d\n", pTA->cFuncs);
|
||||
ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
|
||||
}
|
||||
ITypeInfo_ReleaseTypeAttr(pTI, pTA);
|
||||
|
||||
if(use_midl_tlb) {
|
||||
hr = ITypeInfo_GetRefTypeOfImplType(pTI, -1, &href);
|
||||
ok(hr == TYPE_E_ELEMENTNOTFOUND, "hr %08x\n", hr);
|
||||
hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href);
|
||||
@@ -875,8 +904,10 @@ if(use_midl_tlb) {
|
||||
if(use_midl_tlb) {
|
||||
ok(pTA->cFuncs == 10, "cfuncs %d\n", pTA->cFuncs);
|
||||
ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
|
||||
}
|
||||
ITypeInfo_ReleaseTypeAttr(pTI, pTA);
|
||||
|
||||
if(use_midl_tlb) {
|
||||
hr = ITypeInfo_GetRefTypeOfImplType(pTI, 0, &href);
|
||||
ok(hr == S_OK, "hr %08x\n", hr);
|
||||
hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p);
|
||||
@@ -893,6 +924,16 @@ if(use_midl_tlb) {
|
||||
ok(hr == S_OK, "hr %08x\n", hr);
|
||||
ok(pFD->memid == 0x1236, "memid %08x\n", pFD->memid);
|
||||
ok(pFD->oVft == 9 * sizeof(void *), "oVft %d\n", pFD->oVft);
|
||||
|
||||
/* first argument to 10th function is an HREFTYPE from the impl type */
|
||||
ok(pFD->cParams == 1, "cParams %i\n", pFD->cParams);
|
||||
ok(pFD->lprgelemdescParam[0].tdesc.vt == VT_USERDEFINED,
|
||||
"vt 0x%x\n", pFD->lprgelemdescParam[0].tdesc.vt);
|
||||
href = U(pFD->lprgelemdescParam[0].tdesc).hreftype;
|
||||
ok((href & 0xff000000) == 0x04000000, "href 0x%08x\n", href);
|
||||
hr = ITypeInfo_GetRefTypeInfo(pTI, href, &pTI_p);
|
||||
ok(SUCCEEDED(hr), "hr %08x\n", hr);
|
||||
if (SUCCEEDED(hr)) ITypeInfo_Release(pTI_p);
|
||||
ITypeInfo_ReleaseFuncDesc(pTI, pFD);
|
||||
}
|
||||
ITypeInfo_Release(pTI);
|
||||
@@ -910,8 +951,10 @@ if(use_midl_tlb) {
|
||||
if(use_midl_tlb) {
|
||||
ok(pTA->cFuncs == 1, "cfuncs %d\n", pTA->cFuncs);
|
||||
ok(pTA->cImplTypes == 1, "cimpltypes %d\n", pTA->cImplTypes);
|
||||
}
|
||||
ITypeInfo_ReleaseTypeAttr(pTI, pTA);
|
||||
|
||||
if(use_midl_tlb) {
|
||||
/* Should have one method */
|
||||
hr = ITypeInfo_GetFuncDesc(pTI, 1, &pFD);
|
||||
ok(hr == TYPE_E_ELEMENTNOTFOUND, "hr %08x\n", hr);
|
||||
@@ -928,6 +971,626 @@ if(use_midl_tlb) {
|
||||
return;
|
||||
}
|
||||
|
||||
static void test_CreateTypeLib(void) {
|
||||
static const WCHAR stdoleW[] = {'s','t','d','o','l','e','2','.','t','l','b',0};
|
||||
static OLECHAR typelibW[] = {'t','y','p','e','l','i','b',0};
|
||||
static OLECHAR helpfileW[] = {'C',':','\\','b','o','g','u','s','.','h','l','p',0};
|
||||
static OLECHAR interface1W[] = {'i','n','t','e','r','f','a','c','e','1',0};
|
||||
static OLECHAR interface2W[] = {'i','n','t','e','r','f','a','c','e','2',0};
|
||||
static OLECHAR interface3W[] = {'i','n','t','e','r','f','a','c','e','3',0};
|
||||
static OLECHAR dualW[] = {'d','u','a','l',0};
|
||||
static OLECHAR coclassW[] = {'c','o','c','l','a','s','s',0};
|
||||
static WCHAR defaultW[] = {'d','e','f','a','u','l','t',0x3213,0};
|
||||
static OLECHAR func1W[] = {'f','u','n','c','1',0};
|
||||
static OLECHAR func2W[] = {'f','u','n','c','2',0};
|
||||
static OLECHAR prop1W[] = {'P','r','o','p','1',0};
|
||||
static OLECHAR param1W[] = {'p','a','r','a','m','1',0};
|
||||
static OLECHAR param2W[] = {'p','a','r','a','m','2',0};
|
||||
static OLECHAR *names1[] = {func1W, param1W, param2W};
|
||||
static OLECHAR *names2[] = {func2W, param1W, param2W};
|
||||
static OLECHAR *propname[] = {prop1W, param1W};
|
||||
static const GUID custguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x70}};
|
||||
|
||||
char filename[MAX_PATH];
|
||||
WCHAR filenameW[MAX_PATH];
|
||||
ICreateTypeLib2 *createtl;
|
||||
ICreateTypeInfo *createti;
|
||||
ICreateTypeInfo2 *createti2;
|
||||
ITypeLib *tl, *stdole;
|
||||
ITypeInfo *interface1, *interface2, *dual, *unknown, *dispatch, *ti;
|
||||
ITypeInfo2 *ti2;
|
||||
FUNCDESC funcdesc;
|
||||
ELEMDESC elemdesc[5];
|
||||
PARAMDESCEX paramdescex;
|
||||
TYPEDESC typedesc1, typedesc2;
|
||||
TYPEATTR *typeattr;
|
||||
TLIBATTR *libattr;
|
||||
HREFTYPE hreftype;
|
||||
BSTR name, docstring, helpfile;
|
||||
DWORD helpcontext;
|
||||
int impltypeflags;
|
||||
VARIANT cust_data;
|
||||
HRESULT hres;
|
||||
|
||||
trace("CreateTypeLib tests\n");
|
||||
|
||||
hres = LoadTypeLib(stdoleW, &stdole);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeLib_GetTypeInfoOfGuid(stdole, &IID_IUnknown, &unknown);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeLib_GetTypeInfoOfGuid(stdole, &IID_IDispatch, &dispatch);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
GetTempFileNameA(".", "tlb", 0, filename);
|
||||
MultiByteToWideChar(CP_ACP, 0, filename, -1, filenameW, MAX_PATH);
|
||||
|
||||
hres = CreateTypeLib2(SYS_WIN32, filenameW, &createtl);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeLib_QueryInterface(createtl, &IID_ITypeLib, (void**)&tl);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeLib_GetLibAttr(tl, &libattr);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
ok(libattr->syskind == SYS_WIN32, "syskind = %d\n", libattr->syskind);
|
||||
ok(libattr->wMajorVerNum == 0, "wMajorVer = %d\n", libattr->wMajorVerNum);
|
||||
ok(libattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", libattr->wMinorVerNum);
|
||||
ok(libattr->wLibFlags == 0, "wLibFlags = %d\n", libattr->wLibFlags);
|
||||
|
||||
ITypeLib_ReleaseTLibAttr(tl, libattr);
|
||||
|
||||
name = (BSTR)0xdeadbeef;
|
||||
hres = ITypeLib_GetDocumentation(tl, -1, &name, &docstring, &helpcontext, &helpfile);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(name == NULL, "name != NULL\n");
|
||||
ok(docstring == NULL, "docstring != NULL\n");
|
||||
ok(helpcontext == 0, "helpcontext != 0\n");
|
||||
ok(helpfile == NULL, "helpfile != NULL\n");
|
||||
|
||||
hres = ITypeLib_GetDocumentation(tl, 0, &name, NULL, NULL, NULL);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeLib_SetName(createtl, typelibW);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeLib_SetHelpFileName(createtl, helpfileW);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeLib_GetDocumentation(tl, -1, NULL, NULL, NULL, NULL);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeLib_GetDocumentation(tl, -1, &name, NULL, NULL, &helpfile);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(!memcmp(name, typelibW, sizeof(typelibW)), "name = %s\n", wine_dbgstr_w(name));
|
||||
ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "helpfile = %s\n", wine_dbgstr_w(helpfile));
|
||||
|
||||
SysFreeString(name);
|
||||
SysFreeString(helpfile);
|
||||
|
||||
hres = ICreateTypeLib_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&interface1);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeLib_GetDocumentation(tl, 0, &name, NULL, NULL, NULL);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(!memcmp(name, interface1W, sizeof(interface1W)), "name = %s\n", wine_dbgstr_w(name));
|
||||
|
||||
SysFreeString(name);
|
||||
|
||||
ITypeLib_Release(tl);
|
||||
|
||||
name = (BSTR)0xdeadbeef;
|
||||
helpfile = (BSTR)0xdeadbeef;
|
||||
hres = ITypeInfo_GetDocumentation(interface1, -1, &name, &docstring, &helpcontext, &helpfile);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(!memcmp(name, interface1W, sizeof(interface1W)), "name = %s\n", wine_dbgstr_w(name));
|
||||
ok(docstring == NULL, "docstring != NULL\n");
|
||||
ok(helpcontext == 0, "helpcontext != 0\n");
|
||||
ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "helpfile = %s\n", wine_dbgstr_w(helpfile));
|
||||
|
||||
SysFreeString(name);
|
||||
SysFreeString(helpfile);
|
||||
|
||||
hres = ITypeInfo_GetDocumentation(interface1, 0, &name, NULL, NULL, NULL);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeInfo(interface1, 0, NULL);
|
||||
ok(hres == E_INVALIDARG, "got %08x\n", hres);
|
||||
|
||||
|
||||
hres = ICreateTypeInfo_LayOut(createti);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddRefTypeInfo(createti, NULL, &hreftype);
|
||||
ok(hres == E_INVALIDARG, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddRefTypeInfo(createti, unknown, NULL);
|
||||
ok(hres == E_INVALIDARG, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddRefTypeInfo(createti, unknown, &hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
if(hres != S_OK) {
|
||||
skip("Skipping some tests\n");
|
||||
return;
|
||||
}
|
||||
|
||||
hres = ICreateTypeInfo_AddImplType(createti, 1, hreftype);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddImplType(createti, 0, hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeOfImplType(interface1, 0, &hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(hreftype == 3, "hreftype = %d\n", hreftype);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeOfImplType(interface1, -1, &hreftype);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
memset(&funcdesc, 0, sizeof(FUNCDESC));
|
||||
funcdesc.funckind = FUNC_PUREVIRTUAL;
|
||||
funcdesc.invkind = INVOKE_PROPERTYGET;
|
||||
funcdesc.callconv = CC_STDCALL;
|
||||
funcdesc.elemdescFunc.tdesc.vt = VT_BSTR;
|
||||
U(funcdesc.elemdescFunc).idldesc.wIDLFlags = IDLFLAG_NONE;
|
||||
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 0, NULL);
|
||||
ok(hres == E_INVALIDARG, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncHelpContext(createti, 0, 0xabcdefab);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
funcdesc.invkind = INVOKE_PROPERTYPUT;
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
|
||||
ok(hres == TYPE_E_INCONSISTENTPROPFUNCS, "got %08x\n", hres);
|
||||
|
||||
funcdesc.invkind = INVOKE_PROPERTYPUTREF;
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
|
||||
ok(hres == TYPE_E_INCONSISTENTPROPFUNCS, "got %08x\n", hres);
|
||||
|
||||
elemdesc[0].tdesc.vt = VT_BSTR;
|
||||
U(elemdesc[0]).idldesc.dwReserved = 0;
|
||||
U(elemdesc[0]).idldesc.wIDLFlags = IDLFLAG_FIN;
|
||||
|
||||
funcdesc.lprgelemdescParam = elemdesc;
|
||||
funcdesc.invkind = INVOKE_PROPERTYPUT;
|
||||
funcdesc.cParams = 1;
|
||||
funcdesc.elemdescFunc.tdesc.vt = VT_VOID;
|
||||
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncHelpContext(createti, 1, 0xabcdefab);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, propname, 1);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 1, propname, 1);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 1, propname, 2);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
|
||||
funcdesc.invkind = INVOKE_PROPERTYPUTREF;
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncHelpContext(createti, 0, 0xabcdefab);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncHelpContext(createti, 0, 0x201);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
funcdesc.memid = 1;
|
||||
funcdesc.lprgelemdescParam = NULL;
|
||||
funcdesc.invkind = INVOKE_FUNC;
|
||||
funcdesc.cParams = 0;
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
funcdesc.memid = MEMBERID_NIL;
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
elemdesc[0].tdesc.vt = VT_PTR;
|
||||
U(elemdesc[0].tdesc).lptdesc = &typedesc1;
|
||||
typedesc1.vt = VT_BSTR;
|
||||
funcdesc.cParams = 1;
|
||||
funcdesc.lprgelemdescParam = elemdesc;
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 4, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
U(elemdesc[0].tdesc).lptdesc = &typedesc2;
|
||||
typedesc2.vt = VT_PTR;
|
||||
U(typedesc2).lptdesc = &typedesc1;
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 4, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
elemdesc[0].tdesc.vt = VT_INT;
|
||||
U(elemdesc[0]).paramdesc.wParamFlags = PARAMFLAG_FHASDEFAULT;
|
||||
U(elemdesc[0]).paramdesc.pparamdescex = ¶mdescex;
|
||||
V_VT(¶mdescex.varDefaultValue) = VT_INT;
|
||||
V_INT(¶mdescex.varDefaultValue) = 0x123;
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 3, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
U(elemdesc[0]).idldesc.dwReserved = 0;
|
||||
U(elemdesc[0]).idldesc.wIDLFlags = IDLFLAG_FIN;
|
||||
elemdesc[1].tdesc.vt = VT_UI2;
|
||||
U(elemdesc[1]).paramdesc.wParamFlags = PARAMFLAG_FHASDEFAULT;
|
||||
U(elemdesc[1]).paramdesc.pparamdescex = ¶mdescex;
|
||||
V_VT(¶mdescex.varDefaultValue) = VT_UI2;
|
||||
V_UI2(¶mdescex.varDefaultValue) = 0xffff;
|
||||
funcdesc.cParams = 2;
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 3, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
U(elemdesc[0]).paramdesc.wParamFlags = PARAMFLAG_FHASDEFAULT;
|
||||
U(elemdesc[0]).paramdesc.pparamdescex = ¶mdescex;
|
||||
elemdesc[1].tdesc.vt = VT_INT;
|
||||
V_VT(¶mdescex.varDefaultValue) = VT_INT;
|
||||
V_INT(¶mdescex.varDefaultValue) = 0xffffffff;
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 3, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
elemdesc[0].tdesc.vt = VT_BSTR;
|
||||
elemdesc[1].tdesc.vt = VT_BSTR;
|
||||
V_VT(¶mdescex.varDefaultValue) = VT_BSTR;
|
||||
V_BSTR(¶mdescex.varDefaultValue) = SysAllocString(defaultW);
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 3, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo_GetDocumentation(interface1, 0, &name, &docstring, &helpcontext, &helpfile);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(name == NULL, "name != NULL\n");
|
||||
ok(docstring == NULL, "docstring != NULL\n");
|
||||
ok(helpcontext == 0x201, "helpcontext != 0x201\n");
|
||||
ok(!memcmp(helpfile, helpfileW, sizeof(helpfileW)), "helpfile = %s\n", wine_dbgstr_w(helpfile));
|
||||
|
||||
SysFreeString(helpfile);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 1000, NULL, 1);
|
||||
ok(hres == E_INVALIDARG, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 1000, names1, 1);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, names1, 2);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, names2, 1);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 0, names1, 1);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo_GetDocumentation(interface1, 0, &name, NULL, NULL, NULL);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(!memcmp(name, func1W, sizeof(func1W)), "name = %s\n", wine_dbgstr_w(name));
|
||||
|
||||
SysFreeString(name);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 3, names2, 3);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetFuncAndParamNames(createti, 3, names1, 3);
|
||||
ok(hres == TYPE_E_AMBIGUOUSNAME, "got %08x\n", hres);
|
||||
|
||||
ICreateTypeInfo_Release(createti);
|
||||
|
||||
hres = ICreateTypeLib_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
|
||||
ok(hres == TYPE_E_NAMECONFLICT, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeLib_CreateTypeInfo(createtl, interface2W, TKIND_INTERFACE, &createti);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&interface2);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeOfImplType(interface2, 0, &hreftype);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddRefTypeInfo(createti, interface1, &hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeInfo(interface2, 0, &ti);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(ti == interface1, "Received and added interfaces are different\n");
|
||||
|
||||
ITypeInfo_Release(ti);
|
||||
|
||||
hres = ICreateTypeInfo_AddImplType(createti, 0, hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeOfImplType(interface2, 0, &hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(hreftype == 2, "hreftype = %d\n", hreftype);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeOfImplType(interface2, -1, &hreftype);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetImplTypeFlags(createti, 0, IMPLTYPEFLAG_FDEFAULT);
|
||||
ok(hres == TYPE_E_BADMODULEKIND, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo_GetImplTypeFlags(interface2, 0, &impltypeflags);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(impltypeflags == 0, "impltypeflags = %x\n", impltypeflags);
|
||||
|
||||
hres = ITypeInfo_GetImplTypeFlags(interface2, 1, &impltypeflags);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
funcdesc.oVft = 0xaaac;
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
funcdesc.oVft = 0xaaa8;
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
funcdesc.oVft = 0;
|
||||
|
||||
ICreateTypeInfo_Release(createti);
|
||||
|
||||
VariantInit(&cust_data);
|
||||
|
||||
hres = ICreateTypeLib_CreateTypeInfo(createtl, interface3W, TKIND_INTERFACE, &createti);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_QueryInterface(createti, &IID_ICreateTypeInfo2, (void**)&createti2);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo2_QueryInterface(createti2, &IID_ITypeInfo2, (void**)&ti2);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo2_GetCustData(ti2, NULL, NULL);
|
||||
todo_wine
|
||||
ok(hres == E_INVALIDARG, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo2_GetCustData(ti2, &custguid, NULL);
|
||||
todo_wine
|
||||
ok(hres == E_INVALIDARG, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data);
|
||||
todo_wine
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo2_SetCustData(createti2, NULL, NULL);
|
||||
ok(hres == E_INVALIDARG, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, NULL);
|
||||
ok(hres == E_INVALIDARG, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, &cust_data);
|
||||
ok(hres == DISP_E_BADVARTYPE, "got %08x\n", hres);
|
||||
|
||||
V_VT(&cust_data) = VT_UI4;
|
||||
V_I4(&cust_data) = 0xdeadbeef;
|
||||
|
||||
hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, &cust_data);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
V_I4(&cust_data) = 0;
|
||||
V_VT(&cust_data) = VT_EMPTY;
|
||||
|
||||
hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data);
|
||||
todo_wine
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
todo_wine
|
||||
ok(V_VT(&cust_data) == VT_UI4, "got %d\n", V_VT(&cust_data));
|
||||
todo_wine
|
||||
ok(V_I4(&cust_data) == 0xdeadbeef, "got 0x%08x\n", V_I4(&cust_data));
|
||||
|
||||
V_VT(&cust_data) = VT_UI4;
|
||||
V_I4(&cust_data) = 12345678;
|
||||
|
||||
hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, &cust_data);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
V_I4(&cust_data) = 0;
|
||||
V_VT(&cust_data) = VT_EMPTY;
|
||||
|
||||
hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data);
|
||||
todo_wine
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
todo_wine
|
||||
ok(V_VT(&cust_data) == VT_UI4, "got %d\n", V_VT(&cust_data));
|
||||
todo_wine
|
||||
ok(V_I4(&cust_data) == 12345678, "got 0x%08x\n", V_I4(&cust_data));
|
||||
|
||||
ITypeInfo2_Release(ti2);
|
||||
ICreateTypeInfo2_Release(createti2);
|
||||
ICreateTypeInfo_Release(createti);
|
||||
|
||||
hres = ICreateTypeLib_CreateTypeInfo(createtl, coclassW, TKIND_COCLASS, &createti);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddRefTypeInfo(createti, interface1, &hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddImplType(createti, 0, hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddImplType(createti, 0, hreftype);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddRefTypeInfo(createti, unknown, &hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddImplType(createti, 1, hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddImplType(createti, 1, hreftype);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddImplType(createti, 2, hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetImplTypeFlags(createti, 0, IMPLTYPEFLAG_FDEFAULT);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetImplTypeFlags(createti, 1, IMPLTYPEFLAG_FRESTRICTED);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&ti);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo_GetImplTypeFlags(ti, 0, NULL);
|
||||
ok(hres == E_INVALIDARG, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo_GetImplTypeFlags(ti, 0, &impltypeflags);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(impltypeflags == IMPLTYPEFLAG_FDEFAULT, "impltypeflags = %x\n", impltypeflags);
|
||||
|
||||
hres = ITypeInfo_GetImplTypeFlags(ti, 1, &impltypeflags);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(impltypeflags == IMPLTYPEFLAG_FRESTRICTED, "impltypeflags = %x\n", impltypeflags);
|
||||
|
||||
hres = ITypeInfo_GetImplTypeFlags(ti, 2, &impltypeflags);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(impltypeflags == 0, "impltypeflags = %x\n", impltypeflags);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeOfImplType(ti, 0, &hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(hreftype == 0, "hreftype = %d\n", hreftype);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeOfImplType(ti, 1, &hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(hreftype == 1, "hreftype = %d\n", hreftype);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeOfImplType(ti, 2, &hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(hreftype == 1, "hreftype = %d\n", hreftype);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeOfImplType(ti, -1, &hreftype);
|
||||
ok(hres == TYPE_E_ELEMENTNOTFOUND, "got %08x\n", hres);
|
||||
|
||||
ITypeInfo_Release(ti);
|
||||
|
||||
ICreateTypeInfo_Release(createti);
|
||||
|
||||
hres = ICreateTypeLib_CreateTypeInfo(createtl, dualW, TKIND_INTERFACE, &createti);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_SetTypeFlags(createti, TYPEFLAG_FDUAL);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddRefTypeInfo(createti, dispatch, &hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_AddImplType(createti, 0, hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ICreateTypeInfo_QueryInterface(createti, &IID_ITypeInfo, (void**)&dual);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo_GetTypeAttr(dual, &typeattr);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(typeattr->cbSizeInstance == 4, "cbSizeInstance = %d\n", typeattr->cbSizeInstance);
|
||||
ok(typeattr->typekind == 3, "typekind = %d\n", typeattr->typekind);
|
||||
ok(typeattr->cFuncs == 1, "cFuncs = %d\n", typeattr->cFuncs);
|
||||
ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
|
||||
ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
|
||||
ok(typeattr->cbSizeVft == 32 || broken(typeattr->cbSizeVft == 7 * sizeof(void *) + 4), /* xp64 */
|
||||
"cbSizeVft = %d\n", typeattr->cbSizeVft);
|
||||
ok(typeattr->cbAlignment == 4, "cbAlignment = %d\n", typeattr->cbAlignment);
|
||||
ok(typeattr->wTypeFlags == (TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL), "wTypeFlags = %d\n", typeattr->wTypeFlags);
|
||||
ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
|
||||
ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
|
||||
|
||||
ITypeInfo_ReleaseTypeAttr(dual, typeattr);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeOfImplType(dual, -1, &hreftype);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(hreftype == -2, "got %08x\n", hreftype);
|
||||
|
||||
hres = ITypeInfo_GetRefTypeInfo(dual, -2, &ti);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
hres = ITypeInfo_GetTypeAttr(ti, &typeattr);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(typeattr->cbSizeInstance == 4, "cbSizeInstance = %d\n", typeattr->cbSizeInstance);
|
||||
ok(typeattr->typekind == 4, "typekind = %d\n", typeattr->typekind);
|
||||
ok(typeattr->cFuncs == 8, "cFuncs = %d\n", typeattr->cFuncs);
|
||||
ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
|
||||
ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
|
||||
ok(typeattr->cbSizeVft == 7 * sizeof(void *), "cbSizeVft = %d\n", typeattr->cbSizeVft);
|
||||
ok(typeattr->cbAlignment == 4, "cbAlignment = %d\n", typeattr->cbAlignment);
|
||||
ok(typeattr->wTypeFlags == (TYPEFLAG_FDISPATCHABLE|TYPEFLAG_FDUAL), "wTypeFlags = %d\n", typeattr->wTypeFlags);
|
||||
ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
|
||||
ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
|
||||
|
||||
ITypeInfo_ReleaseTypeAttr(ti, typeattr);
|
||||
|
||||
ITypeInfo_Release(ti);
|
||||
|
||||
ICreateTypeInfo_Release(createti);
|
||||
|
||||
hres = ITypeInfo_GetTypeAttr(interface1, &typeattr);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(typeattr->cbSizeInstance == 4, "cbSizeInstance = %d\n", typeattr->cbSizeInstance);
|
||||
ok(typeattr->typekind == 3, "typekind = %d\n", typeattr->typekind);
|
||||
ok(typeattr->cFuncs == 11, "cFuncs = %d\n", typeattr->cFuncs);
|
||||
ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
|
||||
ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
|
||||
ok(typeattr->cbSizeVft == 56 || broken(typeattr->cbSizeVft == 3 * sizeof(void *) + 44), /* xp64 */
|
||||
"cbSizeVft = %d\n", typeattr->cbSizeVft);
|
||||
ok(typeattr->cbAlignment == 4, "cbAlignment = %d\n", typeattr->cbAlignment);
|
||||
ok(typeattr->wTypeFlags == 0, "wTypeFlags = %d\n", typeattr->wTypeFlags);
|
||||
ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
|
||||
ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
|
||||
|
||||
ITypeInfo_ReleaseTypeAttr(interface1, typeattr);
|
||||
|
||||
hres = ITypeInfo_GetTypeAttr(interface2, &typeattr);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(typeattr->cbSizeInstance == 4, "cbSizeInstance = %d\n", typeattr->cbSizeInstance);
|
||||
ok(typeattr->typekind == 3, "typekind = %d\n", typeattr->typekind);
|
||||
ok(typeattr->cFuncs == 2, "cFuncs = %d\n", typeattr->cFuncs);
|
||||
ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
|
||||
ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
|
||||
ok(typeattr->cbSizeVft == 43696, "cbSizeVft = %d\n", typeattr->cbSizeVft);
|
||||
ok(typeattr->cbAlignment == 4, "cbAlignment = %d\n", typeattr->cbAlignment);
|
||||
ok(typeattr->wTypeFlags == 0, "wTypeFlags = %d\n", typeattr->wTypeFlags);
|
||||
ok(typeattr->wMajorVerNum == 0, "wMajorVerNum = %d\n", typeattr->wMajorVerNum);
|
||||
ok(typeattr->wMinorVerNum == 0, "wMinorVerNum = %d\n", typeattr->wMinorVerNum);
|
||||
|
||||
ITypeInfo_ReleaseTypeAttr(interface2, typeattr);
|
||||
|
||||
hres = ICreateTypeLib2_SaveAllChanges(createtl);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
|
||||
ok(ITypeInfo_Release(interface2)==0, "Object should be freed\n");
|
||||
ok(ITypeInfo_Release(interface1)==0, "Object should be freed\n");
|
||||
ok(ITypeInfo_Release(dual)==0, "Object should be freed\n");
|
||||
ok(ICreateTypeLib2_Release(createtl)==0, "Object should be freed\n");
|
||||
|
||||
ok(ITypeInfo_Release(dispatch)==0, "Object should be freed\n");
|
||||
ok(ITypeInfo_Release(unknown)==0, "Object should be freed\n");
|
||||
ok(ITypeLib_Release(stdole)==0, "Object should be freed\n");
|
||||
|
||||
hres = LoadTypeLibEx(filenameW, REGKIND_NONE, &tl);
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
ok(ITypeLib_Release(tl)==0, "Object should be freed\n");
|
||||
|
||||
DeleteFileA(filename);
|
||||
}
|
||||
|
||||
#if 0 /* use this to generate more tests */
|
||||
|
||||
#define OLE_CHECK(x) { HRESULT hr = x; if (FAILED(hr)) { printf(#x "failed - %x\n", hr); return; } }
|
||||
@@ -1357,7 +2020,7 @@ static void test_dump_typelib(const char *name)
|
||||
|
||||
#endif
|
||||
|
||||
static const char *create_test_typelib(void)
|
||||
static const char *create_test_typelib(int res_no)
|
||||
{
|
||||
static char filename[MAX_PATH];
|
||||
HANDLE file;
|
||||
@@ -1369,7 +2032,7 @@ static const char *create_test_typelib(void)
|
||||
file = CreateFile( filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 );
|
||||
ok( file != INVALID_HANDLE_VALUE, "file creation failed\n" );
|
||||
if (file == INVALID_HANDLE_VALUE) return NULL;
|
||||
res = FindResource( GetModuleHandle(0), MAKEINTRESOURCE(2), "TYPELIB" );
|
||||
res = FindResource( GetModuleHandle(0), MAKEINTRESOURCE(res_no), "TYPELIB" );
|
||||
ok( res != 0, "couldn't find resource\n" );
|
||||
ptr = LockResource( LoadResource( GetModuleHandle(0), res ));
|
||||
WriteFile( file, ptr, SizeofResource( GetModuleHandle(0), res ), &written, NULL );
|
||||
@@ -1430,6 +2093,113 @@ static void test_create_typelibs(void)
|
||||
test_create_typelib_lcid(0x407);
|
||||
}
|
||||
|
||||
|
||||
static void test_register_typelib(void)
|
||||
{
|
||||
HRESULT hr;
|
||||
WCHAR filename[MAX_PATH];
|
||||
const char *filenameA;
|
||||
ITypeLib *typelib;
|
||||
WCHAR uuidW[40];
|
||||
char key_name[MAX_PATH], uuid[40];
|
||||
LONG ret, expect_ret;
|
||||
UINT count, i;
|
||||
HKEY hkey;
|
||||
struct
|
||||
{
|
||||
TYPEKIND kind;
|
||||
WORD flags;
|
||||
} attrs[11] =
|
||||
{
|
||||
{ TKIND_INTERFACE, 0 },
|
||||
{ TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE },
|
||||
{ TKIND_INTERFACE, TYPEFLAG_FOLEAUTOMATION },
|
||||
{ TKIND_INTERFACE, TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FOLEAUTOMATION },
|
||||
{ TKIND_DISPATCH, 0 /* TYPEFLAG_FDUAL - widl clears this flag for non-IDispatch derived interfaces */ },
|
||||
{ TKIND_DISPATCH, 0 /* TYPEFLAG_FDUAL - widl clears this flag for non-IDispatch derived interfaces */ },
|
||||
{ TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL },
|
||||
{ TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FDUAL },
|
||||
{ TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE },
|
||||
{ TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE },
|
||||
{ TKIND_DISPATCH, TYPEFLAG_FDISPATCHABLE }
|
||||
};
|
||||
|
||||
filenameA = create_test_typelib(3);
|
||||
MultiByteToWideChar(CP_ACP, 0, filenameA, -1, filename, MAX_PATH);
|
||||
|
||||
hr = LoadTypeLibEx(filename, REGKIND_NONE, &typelib);
|
||||
ok(SUCCEEDED(hr), "got %08x\n", hr);
|
||||
|
||||
hr = RegisterTypeLib(typelib, filename, NULL);
|
||||
ok(SUCCEEDED(hr), "got %08x\n", hr);
|
||||
|
||||
count = ITypeLib_GetTypeInfoCount(typelib);
|
||||
ok(count == 11, "got %d\n", count);
|
||||
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
ITypeInfo *typeinfo;
|
||||
TYPEATTR *attr;
|
||||
|
||||
hr = ITypeLib_GetTypeInfo(typelib, i, &typeinfo);
|
||||
ok(SUCCEEDED(hr), "got %08x\n", hr);
|
||||
|
||||
hr = ITypeInfo_GetTypeAttr(typeinfo, &attr);
|
||||
ok(SUCCEEDED(hr), "got %08x\n", hr);
|
||||
|
||||
ok(attr->typekind == attrs[i].kind, "%d: got kind %d\n", i, attr->typekind);
|
||||
ok(attr->wTypeFlags == attrs[i].flags, "%d: got flags %04x\n", i, attr->wTypeFlags);
|
||||
|
||||
if(attr->typekind == TKIND_DISPATCH && (attr->wTypeFlags & TYPEFLAG_FDUAL))
|
||||
{
|
||||
HREFTYPE reftype;
|
||||
ITypeInfo *dual_info;
|
||||
TYPEATTR *dual_attr;
|
||||
|
||||
hr = ITypeInfo_GetRefTypeOfImplType(typeinfo, -1, &reftype);
|
||||
ok(SUCCEEDED(hr), "got %08x\n", hr);
|
||||
|
||||
hr = ITypeInfo_GetRefTypeInfo(typeinfo, reftype, &dual_info);
|
||||
ok(SUCCEEDED(hr), "got %08x\n", hr);
|
||||
|
||||
hr = ITypeInfo_GetTypeAttr(dual_info, &dual_attr);
|
||||
ok(SUCCEEDED(hr), "got %08x\n", hr);
|
||||
|
||||
ok(dual_attr->typekind == TKIND_INTERFACE, "%d: got kind %d\n", i, dual_attr->typekind);
|
||||
ok(dual_attr->wTypeFlags == (TYPEFLAG_FDISPATCHABLE | TYPEFLAG_FOLEAUTOMATION | TYPEFLAG_FDUAL), "%d: got flags %04x\n", i, dual_attr->wTypeFlags);
|
||||
|
||||
ITypeInfo_ReleaseTypeAttr(dual_info, dual_attr);
|
||||
ITypeInfo_Release(dual_info);
|
||||
|
||||
}
|
||||
|
||||
StringFromGUID2(&attr->guid, uuidW, sizeof(uuidW) / sizeof(uuidW[0]));
|
||||
WideCharToMultiByte(CP_ACP, 0, uuidW, -1, uuid, sizeof(uuid), NULL, NULL);
|
||||
sprintf(key_name, "Interface\\%s", uuid);
|
||||
|
||||
/* All dispinterfaces will be registered (this includes dual interfaces) as well
|
||||
as oleautomation interfaces */
|
||||
if((attr->typekind == TKIND_INTERFACE && (attr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION)) ||
|
||||
attr->typekind == TKIND_DISPATCH)
|
||||
expect_ret = ERROR_SUCCESS;
|
||||
else
|
||||
expect_ret = ERROR_FILE_NOT_FOUND;
|
||||
|
||||
ret = RegOpenKeyExA(HKEY_CLASSES_ROOT, key_name, 0, KEY_READ, &hkey);
|
||||
ok(ret == expect_ret, "%d: got %d\n", i, ret);
|
||||
if(ret == ERROR_SUCCESS) RegCloseKey(hkey);
|
||||
|
||||
ITypeInfo_ReleaseTypeAttr(typeinfo, attr);
|
||||
ITypeInfo_Release(typeinfo);
|
||||
}
|
||||
|
||||
hr = UnRegisterTypeLib(&LIBID_register_test, 1, 0, LOCALE_NEUTRAL, sizeof(void*) == 8 ? SYS_WIN64 : SYS_WIN32);
|
||||
ok(SUCCEEDED(hr), "got %08x\n", hr);
|
||||
|
||||
ITypeLib_Release(typelib);
|
||||
DeleteFileA( filenameA );
|
||||
}
|
||||
|
||||
START_TEST(typelib)
|
||||
{
|
||||
const char *filename;
|
||||
@@ -1440,13 +2210,15 @@ START_TEST(typelib)
|
||||
test_TypeInfo();
|
||||
test_QueryPathOfRegTypeLib();
|
||||
test_inheritance();
|
||||
test_CreateTypeLib();
|
||||
|
||||
if ((filename = create_test_typelib()))
|
||||
if ((filename = create_test_typelib(2)))
|
||||
{
|
||||
test_dump_typelib( filename );
|
||||
DeleteFile( filename );
|
||||
}
|
||||
|
||||
test_register_typelib();
|
||||
test_create_typelibs();
|
||||
|
||||
}
|
||||
|
||||
@@ -109,6 +109,14 @@ static ULONG get_cell_count(const SAFEARRAY *psa)
|
||||
return ulNumCells;
|
||||
}
|
||||
|
||||
static DWORD elem_wire_size(LPSAFEARRAY lpsa, SF_TYPE sftype)
|
||||
{
|
||||
if (sftype == SF_BSTR)
|
||||
return sizeof(DWORD);
|
||||
else
|
||||
return lpsa->cbElements;
|
||||
}
|
||||
|
||||
static void check_safearray(void *buffer, LPSAFEARRAY lpsa)
|
||||
{
|
||||
unsigned char *wiresa = buffer;
|
||||
@@ -136,7 +144,7 @@ static void check_safearray(void *buffer, LPSAFEARRAY lpsa)
|
||||
wiresa += sizeof(WORD);
|
||||
ok(*(WORD *)wiresa == lpsa->fFeatures, "wiresa + 0xa should be lpsa->fFeatures instead of 0x%08x\n", *(WORD *)wiresa);
|
||||
wiresa += sizeof(WORD);
|
||||
ok(*(DWORD *)wiresa == lpsa->cbElements, "wiresa + 0xc should be lpsa->cbElements instead of 0x%08x\n", *(DWORD *)wiresa);
|
||||
ok(*(DWORD *)wiresa == elem_wire_size(lpsa, sftype), "wiresa + 0xc should be 0x%08x instead of 0x%08x\n", elem_wire_size(lpsa, sftype), *(DWORD *)wiresa);
|
||||
wiresa += sizeof(DWORD);
|
||||
ok(*(WORD *)wiresa == lpsa->cLocks, "wiresa + 0x10 should be lpsa->cLocks instead of 0x%04x\n", *(WORD *)wiresa);
|
||||
wiresa += sizeof(WORD);
|
||||
@@ -197,7 +205,7 @@ static void init_user_marshal_cb(USER_MARSHAL_CB *umcb,
|
||||
|
||||
static void test_marshal_LPSAFEARRAY(void)
|
||||
{
|
||||
unsigned char *buffer;
|
||||
unsigned char *buffer, *next;
|
||||
ULONG size, expected;
|
||||
LPSAFEARRAY lpsa;
|
||||
LPSAFEARRAY lpsa2 = NULL;
|
||||
@@ -207,6 +215,10 @@ static void test_marshal_LPSAFEARRAY(void)
|
||||
USER_MARSHAL_CB umcb;
|
||||
HRESULT hr;
|
||||
VARTYPE vt;
|
||||
OLECHAR *values[10];
|
||||
int expected_bstr_size;
|
||||
int i;
|
||||
LONG indices[1];
|
||||
|
||||
sab.lLbound = 5;
|
||||
sab.cElements = 10;
|
||||
@@ -228,7 +240,8 @@ static void test_marshal_LPSAFEARRAY(void)
|
||||
"size should be %u bytes, not %u\n", expected, size);
|
||||
buffer = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE);
|
||||
LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
next = LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
ok(next - buffer == expected, "Marshaled %u bytes, expected %u\n", (ULONG) (next - buffer), expected);
|
||||
|
||||
check_safearray(buffer, lpsa);
|
||||
|
||||
@@ -253,10 +266,12 @@ static void test_marshal_LPSAFEARRAY(void)
|
||||
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE);
|
||||
size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa);
|
||||
ok(size == 4, "size should be 4 bytes, not %d\n", size);
|
||||
expected = 4;
|
||||
ok(size == expected, "size should be 4 bytes, not %d\n", size);
|
||||
buffer = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE);
|
||||
LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
next = LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
ok(next - buffer == expected, "Marshaled %u bytes, expected %u\n", (ULONG) (next - buffer), expected);
|
||||
check_safearray(buffer, lpsa);
|
||||
|
||||
if (LPSAFEARRAY_UNMARSHAL_WORKS)
|
||||
@@ -290,7 +305,9 @@ static void test_marshal_LPSAFEARRAY(void)
|
||||
"size should be %u bytes, not %u\n", expected, size);
|
||||
buffer = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE);
|
||||
LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
next = LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
ok(next - buffer == expected || broken(next - buffer + sizeof(DWORD) == expected),
|
||||
"Marshaled %u bytes, expected %u\n", (ULONG) (next - buffer), expected);
|
||||
|
||||
check_safearray(buffer, lpsa);
|
||||
|
||||
@@ -318,12 +335,95 @@ static void test_marshal_LPSAFEARRAY(void)
|
||||
"size should be %u bytes, not %u\n", expected, size);
|
||||
buffer = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE);
|
||||
LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
next = LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
ok(next - buffer == expected || broken(next - buffer + sizeof(DWORD) == expected),
|
||||
"Marshaled %u bytes, expected %u\n", (ULONG) (next - buffer), expected);
|
||||
check_safearray(buffer, lpsa);
|
||||
HeapFree(GetProcessHeap(), 0, buffer);
|
||||
SafeArrayDestroyData(lpsa);
|
||||
SafeArrayDestroyDescriptor(lpsa);
|
||||
|
||||
/* Test an array of VT_BSTR */
|
||||
sab.lLbound = 3;
|
||||
sab.cElements = sizeof(values) / sizeof(values[0]);
|
||||
|
||||
lpsa = SafeArrayCreate(VT_BSTR, 1, &sab);
|
||||
expected_bstr_size = 0;
|
||||
for (i = 0; i < sab.cElements; i++)
|
||||
{
|
||||
int j;
|
||||
WCHAR buf[128];
|
||||
for (j = 0; j <= i; j++)
|
||||
buf[j] = 'a' + j;
|
||||
buf[j] = 0;
|
||||
indices[0] = i + sab.lLbound;
|
||||
values[i] = SysAllocString(buf);
|
||||
hr = SafeArrayPutElement(lpsa, indices, values[i]);
|
||||
ok(hr == S_OK, "Failed to put bstr element hr 0x%x\n", hr);
|
||||
expected_bstr_size += (j * sizeof(WCHAR)) + (3 * sizeof(DWORD));
|
||||
if (i % 2 == 0) /* Account for DWORD padding. Works so long as cElements is even */
|
||||
expected_bstr_size += sizeof(WCHAR);
|
||||
}
|
||||
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE);
|
||||
size = LPSAFEARRAY_UserSize(&umcb.Flags, 1, &lpsa);
|
||||
expected = 44 + (sab.cElements * sizeof(DWORD)) + expected_bstr_size;
|
||||
todo_wine
|
||||
ok(size == expected + sizeof(DWORD) || size == (expected + sizeof(DWORD) + 12 /* win64 */),
|
||||
"size should be %u bytes, not %u\n", expected + (ULONG) sizeof(DWORD), size);
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE);
|
||||
size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa);
|
||||
todo_wine
|
||||
ok(size == expected || size == (expected + 12 /* win64 */),
|
||||
"size should be %u bytes, not %u\n", expected, size);
|
||||
buffer = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
memset(buffer, 0xcc, size);
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE);
|
||||
next = LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
todo_wine
|
||||
ok(next - buffer == expected, "Marshaled %u bytes, expected %u\n", (ULONG) (next - buffer), expected);
|
||||
|
||||
check_safearray(buffer, lpsa);
|
||||
|
||||
lpsa2 = NULL;
|
||||
if (LPSAFEARRAY_UNMARSHAL_WORKS)
|
||||
{
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE);
|
||||
next = LPSAFEARRAY_UserUnmarshal(&umcb.Flags, buffer, &lpsa2);
|
||||
todo_wine
|
||||
ok(next - buffer == expected, "Marshaled %u bytes, expected %u\n", (ULONG) (next - buffer), expected);
|
||||
ok(lpsa2 != NULL, "LPSAFEARRAY didn't unmarshal, result %p\n", next);
|
||||
}
|
||||
|
||||
for (i = 0; i < sizeof(values) / sizeof(values[0]); i++)
|
||||
{
|
||||
BSTR gotvalue = NULL;
|
||||
|
||||
if (lpsa2)
|
||||
{
|
||||
indices[0] = i + sab.lLbound;
|
||||
hr = SafeArrayGetElement(lpsa2, indices, &gotvalue);
|
||||
ok(hr == S_OK, "Failed to get bstr element at hres 0x%x\n", hr);
|
||||
if (hr == S_OK)
|
||||
{
|
||||
ok(VarBstrCmp(values[i], gotvalue, 0, 0) == VARCMP_EQ, "String %d does not match\n", i);
|
||||
SysFreeString(gotvalue);
|
||||
}
|
||||
}
|
||||
|
||||
SysFreeString(values[i]);
|
||||
}
|
||||
|
||||
if (LPSAFEARRAY_UNMARSHAL_WORKS)
|
||||
{
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_DIFFERENTMACHINE);
|
||||
LPSAFEARRAY_UserFree(&umcb.Flags, &lpsa2);
|
||||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, buffer);
|
||||
SafeArrayDestroy(lpsa);
|
||||
|
||||
|
||||
/* VARTYPE-less arrays with FADF_VARIANT */
|
||||
hr = SafeArrayAllocDescriptor(1, &lpsa);
|
||||
ok(hr == S_OK, "saad failed %08x\n", hr);
|
||||
@@ -345,7 +445,10 @@ static void test_marshal_LPSAFEARRAY(void)
|
||||
"size should be %u bytes, not %u\n", expected, size);
|
||||
buffer = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_DIFFERENTMACHINE);
|
||||
LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
next = LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
|
||||
todo_wine
|
||||
ok(next - buffer == expected || broken(next - buffer + sizeof(DWORD) == expected),
|
||||
"Marshaled %u bytes, expected %u\n", (ULONG) (next - buffer), expected);
|
||||
lpsa->cbElements = 16; /* VARIANT wire size */
|
||||
check_safearray(buffer, lpsa);
|
||||
HeapFree(GetProcessHeap(), 0, buffer);
|
||||
@@ -1324,6 +1427,30 @@ static void test_marshal_VARIANT(void)
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, oldbuffer);
|
||||
|
||||
/*** NULL UNKNOWN ***/
|
||||
VariantInit(&v);
|
||||
V_VT(&v) = VT_UNKNOWN;
|
||||
V_UNKNOWN(&v) = NULL;
|
||||
|
||||
rpcMsg.BufferLength = stubMsg.BufferLength = VARIANT_UserSize(&umcb.Flags, 0, &v);
|
||||
ok(stubMsg.BufferLength >= 24, "size %d\n", stubMsg.BufferLength);
|
||||
buffer = rpcMsg.Buffer = stubMsg.Buffer = stubMsg.BufferStart = alloc_aligned(stubMsg.BufferLength, &oldbuffer);
|
||||
stubMsg.BufferEnd = stubMsg.Buffer + stubMsg.BufferLength;
|
||||
memset(buffer, 0xcc, stubMsg.BufferLength);
|
||||
next = VARIANT_UserMarshal(&umcb.Flags, buffer, &v);
|
||||
wirev = (DWORD*)buffer;
|
||||
check_variant_header(wirev, &v, next - buffer);
|
||||
wirev += 5;
|
||||
ok(*wirev == 0, "wv[5] %08x\n", *wirev);
|
||||
|
||||
VariantInit(&v2);
|
||||
stubMsg.Buffer = buffer;
|
||||
next = VARIANT_UserUnmarshal(&umcb.Flags, buffer, &v2);
|
||||
ok(V_VT(&v) == V_VT(&v2), "got vt %d expect %d\n", V_VT(&v), V_VT(&v2));
|
||||
ok(V_UNKNOWN(&v2) == NULL, "got %p expect NULL\n", V_UNKNOWN(&v2));
|
||||
VARIANT_UserFree(&umcb.Flags, &v2);
|
||||
HeapFree(GetProcessHeap(), 0, oldbuffer);
|
||||
|
||||
/*** UNKNOWN BYREF ***/
|
||||
heap_unknown = HeapAlloc(GetProcessHeap(), 0, sizeof(*heap_unknown));
|
||||
heap_unknown->lpVtbl = &HeapUnknown_Vtbl;
|
||||
|
||||
@@ -328,6 +328,7 @@ static void test_VarFormat(void)
|
||||
VARFMT(VT_I4,V_I4,1,"000###",S_OK,"000001");
|
||||
VARFMT(VT_I4,V_I4,1,"#00##00#0",S_OK,"00000001");
|
||||
VARFMT(VT_I4,V_I4,1,"1#####0000",S_OK,"10001");
|
||||
VARFMT(VT_I4,V_I4,1,"##abcdefghijklmnopqrstuvwxyz",S_OK,"1abcdefghijklmnopqrstuvwxyz");
|
||||
VARFMT(VT_I4,V_I4,100000,"#,###,###,###",S_OK,"100,000");
|
||||
VARFMT(VT_I4,V_I4,1,"0,000,000,000",S_OK,"0,000,000,001");
|
||||
VARFMT(VT_I4,V_I4,123456789,"#,#.#",S_OK,"123,456,789.");
|
||||
@@ -381,13 +382,23 @@ static void test_VarFormat(void)
|
||||
VARFMT(VT_R8,V_R8,-0.1,".#",S_OK,"-.1");
|
||||
VARFMT(VT_R8,V_R8,0.099,"#.#",S_OK,".1");
|
||||
VARFMT(VT_R8,V_R8,0.0999,"#.##",S_OK,".1");
|
||||
/* for large negative exponents, wine truncates instead of rounding */
|
||||
todo_wine VARFMT(VT_R8,V_R8,0.099,"#.##",S_OK,".1");
|
||||
VARFMT(VT_R8,V_R8,0.099,"#.##",S_OK,".1");
|
||||
VARFMT(VT_R8,V_R8,0.0099,"#.##",S_OK,".01");
|
||||
VARFMT(VT_R8,V_R8,0.0049,"#.##",S_OK,".");
|
||||
VARFMT(VT_R8,V_R8,0.0094,"#.##",S_OK,".01");
|
||||
VARFMT(VT_R8,V_R8,0.00099,"#.##",S_OK,".");
|
||||
VARFMT(VT_R8,V_R8,0.0995,"#.##",S_OK,".1");
|
||||
VARFMT(VT_R8,V_R8,8.0995,"#.##",S_OK,"8.1");
|
||||
VARFMT(VT_R8,V_R8,0.0994,"#.##",S_OK,".1");
|
||||
VARFMT(VT_R8,V_R8,1.00,"#,##0.00",S_OK,"1.00");
|
||||
VARFMT(VT_R8,V_R8,0.0995,"#.###",S_OK,".1");
|
||||
|
||||
|
||||
/* 'out' is not cleared */
|
||||
out = (BSTR)0x1;
|
||||
pVarFormat(&in,NULL,fd,fw,flags,&out); /* Would crash if out is cleared */
|
||||
hres = pVarFormat(&in,NULL,fd,fw,flags,&out); /* Would crash if out is cleared */
|
||||
ok(hres == S_OK, "got %08x\n", hres);
|
||||
SysFreeString(out);
|
||||
out = NULL;
|
||||
|
||||
/* VT_NULL */
|
||||
|
||||
@@ -1639,17 +1639,39 @@ static void test_VarDateFromUdate(void)
|
||||
CHECKPTR(VarDateFromUdate);
|
||||
UD2T(1,1,1980,0,0,0,0,2,1,0,S_OK,29221.0); /* 1 Jan 1980 */
|
||||
UD2T(2,1,1980,0,0,0,0,3,2,0,S_OK,29222.0); /* 2 Jan 1980 */
|
||||
UD2T(2,1,1980,0,0,0,0,4,5,0,S_OK,29222.0); /* 2 Jan 1980 */
|
||||
UD2T(31,12,1990,0,0,0,0,0,0,0,S_OK,33238.0); /* 31 Dec 1990 */
|
||||
UD2T(31,12,90,0,0,0,0,0,0,0,S_OK,33238.0); /* year < 100 is 1900+year! */
|
||||
UD2T(30,12,1899,0,0,0,0,6,364,0,S_OK,0.0); /* 30 Dec 1899 - VT_DATE 0.0 */
|
||||
UD2T(1,1,100,0,0,0,0,0,0,0,S_OK,-657434.0); /* 1 Jan 100 - Min */
|
||||
UD2T(31,12,9999,0,0,0,0,0,0,0,S_OK,2958465.0); /* 31 Dec 9999 - Max */
|
||||
UD2T(1,1,10000,0,0,0,0,0,0,0,E_INVALIDARG,0.0); /* > 31 Dec 9999 => err */
|
||||
UD2T(1,1,-10000,0,0,0,0,0,0,0,E_INVALIDARG,0.0);/* < -9999 => err */
|
||||
|
||||
UD2T(1,1,1980,18,1,16,0,2,1,0,S_OK,29221.75087962963); /* 6:18:02 PM */
|
||||
UD2T(30,12,1899,0,0,0,0,0,0,0,S_OK,0.0); /* 30 Dec 1899 0:00:00 */
|
||||
UD2T(30,12,1899,0,0,0,999,0,0,0,S_OK,0.0); /* Ignore milliseconds */
|
||||
|
||||
UD2T(0,1,1980,0,0,0,0,2,1,0,S_OK,29220.0); /* Rolls back to 31 Dec 1899 */
|
||||
UD2T(1,13,1980,0,0,0,0,2,1,0,S_OK,29587.0); /* Rolls fwd to 1/1/1981 */
|
||||
UD2T(1,1,1980,18,1,16,0,2,1,0,S_OK,29221.75087962963); /* 6:18:02 PM */
|
||||
UD2T(1,300,1980,18,1,16,0,2,1,0,S_OK,38322.75087962963); /* Test fwdrolled month */
|
||||
UD2T(300,1,1980,18,1,16,0,2,1,0,S_OK,29520.75087962963); /* Test fwdrolled days */
|
||||
UD2T(0,1,1980,42,1,16,0,2,1,0,S_OK,29221.75087962963); /* Test fwdrolled hours */
|
||||
UD2T(1,1,1980,17,61,16,0,2,1,0,S_OK,29221.75087962963); /* Test fwdrolled minutes */
|
||||
UD2T(1,1,1980,18,0,76,0,2,1,0,S_OK,29221.75087962963); /* Test fwdrolled seconds */
|
||||
UD2T(1,-300,1980,18,1,16,0,2,1,0,S_OK,20059.75087962963); /* Test backrolled month */
|
||||
UD2T(-300,1,1980,18,1,16,0,2,1,0,S_OK,28920.75087962963); /* Test backrolled days */
|
||||
UD2T(3,1,1980,-30,1,16,0,2,1,0,S_OK,29221.75087962963); /* Test backrolled hours */
|
||||
UD2T(1,1,1980,20,-119,16,0,2,1,0,S_OK,29221.75087962963); /* Test backrolled minutes */
|
||||
UD2T(1,1,1980,18,3,-104,0,2,1,0,S_OK,29221.75087962963); /* Test backrolled seconds */
|
||||
UD2T(1,12001,-1020,18,1,16,0,0,0,0,S_OK,29221.75087962963); /* Test rolled year and month */
|
||||
UD2T(1,-23,1982,18,1,16,0,0,0,0,S_OK,29221.75087962963); /* Test backrolled month */
|
||||
UD2T(-59,3,1980,18,1,16,0,0,0,0,S_OK,29221.75087962963); /* Test backrolled days */
|
||||
UD2T(1,1,0,0,0,0,0,0,0,0,S_OK,36526); /* Test zero year */
|
||||
UD2T(0,0,1980,0,0,0,0,0,0,0,S_OK,29189); /* Test zero day and month */
|
||||
UD2T(0,1,1980,0,0,0,0,2,1,0,S_OK,29220.0); /* Test zero day = LastDayOfMonth */
|
||||
UD2T(-1,1,1980,18,1,16,0,0,0,0,S_OK,29219.75087962963); /* Test day -1 = LastDayOfMonth - 1 */
|
||||
UD2T(1,1,-1,18,1,16,0,0,0,0,S_OK,36161.75087962963); /* Test year -1 = 1999 */
|
||||
UD2T(1,-1,1980,18,1,16,0,0,0,0,S_OK,29160.7508796296); /* Test month -1 = 11 */
|
||||
UD2T(1,13,1980,0,0,0,0,2,1,0,S_OK,29587.0); /* Rolls fwd to 1/1/1981 */
|
||||
}
|
||||
|
||||
static void test_st2dt(int line, WORD d, WORD m, WORD y, WORD h, WORD mn,
|
||||
@@ -1753,9 +1775,45 @@ static void test_DosDateTimeToVariantTime(void)
|
||||
DOS2DT(1,1,1980,0,0,29,1,29221.00032407407); /* 1/1/1980 12:00:28 AM */
|
||||
DOS2DT(1,1,1980,0,0,31,1,29221.00034722222); /* 1/1/1980 12:00:30 AM */
|
||||
DOS2DT(1,1,1980,0,59,0,1,29221.04097222222); /* 1/1/1980 12:59:00 AM */
|
||||
DOS2DT(1,1,1980,0,60,0,0,0.0); /* Invalid seconds */
|
||||
DOS2DT(1,1,1980,0,60,0,0,0.0); /* Invalid minutes */
|
||||
DOS2DT(1,1,1980,0,0,60,0,0.0); /* Invalid seconds */
|
||||
DOS2DT(1,1,1980,23,0,0,1,29221.95833333333); /* 1/1/1980 11:00:00 PM */
|
||||
DOS2DT(1,1,1980,24,0,0,0,0.0); /* Invalid hours */
|
||||
|
||||
DOS2DT(1,1,1980,0,0,1,1,29221.0);
|
||||
DOS2DT(2,1,1980,0,0,0,1,29222.0);
|
||||
DOS2DT(2,1,1980,0,0,0,1,29222.0);
|
||||
DOS2DT(31,12,1990,0,0,0,1,33238.0);
|
||||
DOS2DT(31,12,90,0,0,0,1,40543.0);
|
||||
DOS2DT(30,12,1899,0,0,0,1,46751.0);
|
||||
DOS2DT(1,1,100,0,0,0,1,43831.0);
|
||||
DOS2DT(31,12,9999,0,0,0,1,59901.0);
|
||||
DOS2DT(1,1,10000,0,0,0,1,59902.0);
|
||||
DOS2DT(1,1,-10000,0,0,0,1,48214.0);
|
||||
|
||||
DOS2DT(30,12,1899,0,0,0,1,46751.0);
|
||||
DOS2DT(30,12,1899,0,0,1,1,46751.0);
|
||||
|
||||
DOS2DT(1,1,1980,18,1,16,1,29221.75087962963);
|
||||
DOS2DT(1,300,1980,18,1,16,1,29556.75087962963);
|
||||
DOS2DT(300,1,1980,18,1,16,1,29232.75087962963);
|
||||
DOS2DT(0,1,1980,42,1,16,1,29220.4175462963);
|
||||
DOS2DT(1,1,1980,17,61,16,0,0.0);
|
||||
DOS2DT(1,1,1980,18,0,76,1,29221.75013888889);
|
||||
DOS2DT(1,-300,1980,18,1,16,1,29312.75087962963);
|
||||
DOS2DT(-300,1,1980,18,1,16,1,29240.75087962963);
|
||||
DOS2DT(3,1,1980,-30,1,16,1,29223.08421296296);
|
||||
DOS2DT(1,1,1980,20,-119,16,1,29221.83976851852);
|
||||
DOS2DT(1,1,1980,18,3,-104,1,29221.75236111111);
|
||||
DOS2DT(1,12001,-1020,18,1,16,1,55519.75087962963);
|
||||
DOS2DT(1,-23,1982,18,1,16,1,30195.75087962963);
|
||||
DOS2DT(-59,3,1980,18,1,16,1,29285.75087962963);
|
||||
DOS2DT(1,1,0,0,0,0,1,54058.0);
|
||||
DOS2DT(0,0,1980,0,0,0,1,29189.0);
|
||||
DOS2DT(0,1,1980,0,0,0,1,29220.0);
|
||||
DOS2DT(-1,1,1980,18,1,16,1,29251.75087962963);
|
||||
DOS2DT(1,1,-1,18,1,16,1,53693.75087962963);
|
||||
DOS2DT(1,-1,1980,18,1,16,0,0);
|
||||
}
|
||||
|
||||
static void test_dt2dos(int line, double dt, INT r, WORD d, WORD m, WORD y,
|
||||
@@ -2289,7 +2347,7 @@ static void test_VarMod(void)
|
||||
static const WCHAR szNum1[] = {'1','0','\0'};
|
||||
int l, r;
|
||||
BOOL lFound, rFound;
|
||||
BOOL lValid, rValid;
|
||||
BOOL lValid;
|
||||
BSTR strNum0, strNum1;
|
||||
|
||||
CHECKPTR(VarMod);
|
||||
@@ -2473,7 +2531,6 @@ static void test_VarMod(void)
|
||||
}
|
||||
|
||||
rFound = TRUE;
|
||||
rValid = TRUE;
|
||||
switch(r)
|
||||
{
|
||||
case VT_EMPTY:
|
||||
@@ -2500,7 +2557,6 @@ static void test_VarMod(void)
|
||||
case VT_VARIANT:
|
||||
case VT_UNKNOWN:
|
||||
case VT_RECORD:
|
||||
rValid = FALSE;
|
||||
break;
|
||||
default:
|
||||
rFound = FALSE;
|
||||
@@ -7072,7 +7128,7 @@ static void test_VarDiv(void)
|
||||
VARIANT left, right, exp, result, cy, dec;
|
||||
BSTR num1_str, num2_str;
|
||||
VARTYPE i;
|
||||
HRESULT hres, expectedhres;
|
||||
HRESULT hres;
|
||||
double r;
|
||||
|
||||
num1_str = SysAllocString(str1);
|
||||
@@ -7112,7 +7168,6 @@ static void test_VarDiv(void)
|
||||
V_VT(&right) = rightvt | ExtraFlags[i];
|
||||
V_VT(&result) = VT_EMPTY;
|
||||
resvt = VT_EMPTY;
|
||||
expectedhres = S_OK;
|
||||
|
||||
if (leftvt == VT_BSTR)
|
||||
V_BSTR(&left) = num2_str;
|
||||
|
||||
@@ -3435,10 +3435,15 @@ static void test_VarDateFromStr(void)
|
||||
DFS("1-2-1970"); EXPECT_DBL(25570.0);
|
||||
/* Native fails "1999 January 3, 9AM". I consider that a bug in native */
|
||||
|
||||
/* test a none english data string */
|
||||
/* test a non-english data string */
|
||||
DFS("02.01.1970"); EXPECT_MISMATCH;
|
||||
DFS("02.01.1970 00:00:00"); EXPECT_MISMATCH;
|
||||
lcid = MAKELCID(MAKELANGID(LANG_GERMAN,SUBLANG_GERMAN),SORT_DEFAULT);
|
||||
DFS("02.01.1970 00:00:00"); todo_wine EXPECT_DBL(25570.0);
|
||||
DFS("02.01.1970"); EXPECT_DBL(25570.0);
|
||||
DFS("02.01.1970 00:00:00"); EXPECT_DBL(25570.0);
|
||||
lcid = MAKELCID(MAKELANGID(LANG_SPANISH,SUBLANG_SPANISH),SORT_DEFAULT);
|
||||
DFS("02.01.1970"); EXPECT_MISMATCH;
|
||||
DFS("02.01.1970 00:00:00"); EXPECT_MISMATCH;
|
||||
}
|
||||
|
||||
static void test_VarDateCopy(void)
|
||||
@@ -3483,6 +3488,7 @@ static void test_VarDateChangeTypeEx(void)
|
||||
(!lstrcmpW(V_BSTR(&vDst), sz25570) || !lstrcmpW(V_BSTR(&vDst), sz25570_2)),
|
||||
"hres=0x%X, type=%d (should be VT_BSTR), *bstr=%s\n",
|
||||
hres, V_VT(&vDst), V_BSTR(&vDst) ? wtoascii(V_BSTR(&vDst)) : "?");
|
||||
VariantClear(&vDst);
|
||||
|
||||
lcid = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
|
||||
if (HAVE_OLEAUT32_LOCALES)
|
||||
@@ -3491,6 +3497,7 @@ static void test_VarDateChangeTypeEx(void)
|
||||
ok(hres == S_OK && V_VT(&vDst) == VT_BSTR && V_BSTR(&vDst) && !lstrcmpW(V_BSTR(&vDst), sz25570Nls),
|
||||
"hres=0x%X, type=%d (should be VT_BSTR), *bstr=%s\n",
|
||||
hres, V_VT(&vDst), V_BSTR(&vDst) ? wtoascii(V_BSTR(&vDst)) : "?");
|
||||
VariantClear(&vDst);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3511,7 +3518,7 @@ static void test_VarDateChangeTypeEx(void)
|
||||
|
||||
#define EXPECTCY64(x,y) \
|
||||
ok(hres == S_OK && S(out).Hi == (LONG)x && S(out).Lo == y, \
|
||||
"expected " #x #y "(%u,%u), got (%u,%u); hres=0x%08x\n", \
|
||||
"expected " #x " " #y " (%u,%u), got (%u,%u); hres=0x%08x\n", \
|
||||
(ULONG)(x), (ULONG)(y), S(out).Hi, S(out).Lo, hres)
|
||||
|
||||
static void test_VarCyFromI1(void)
|
||||
@@ -4019,6 +4026,12 @@ static void test_VarCyInt(void)
|
||||
scl, sgn, hi, (LONG)(mid), (LONG)(lo), S(U(out)).scale, \
|
||||
S(U(out)).sign, out.Hi32, S1(U1(out)).Mid32, S1(U1(out)).Lo32, hres)
|
||||
|
||||
/* expect either a positive or negative zero */
|
||||
#define EXPECTDECZERO() ok(hres == S_OK && S(U(out)).scale == 0 && \
|
||||
(S(U(out)).sign == 0 || S(U(out)).sign == 0x80) && out.Hi32 == 0 && U1(out).Lo64 == 0, \
|
||||
"expected zero, got (%d,%d,%d,(%x %x)) hres 0x%08x\n", \
|
||||
S(U(out)).scale, S(U(out)).sign, out.Hi32, S1(U1(out)).Mid32, S1(U1(out)).Lo32, hres)
|
||||
|
||||
#define EXPECTDECI if (i < 0) EXPECTDEC(0, 0x80, 0, -i); else EXPECTDEC(0, 0, 0, i)
|
||||
|
||||
static void test_VarDecFromI1(void)
|
||||
@@ -4262,11 +4275,11 @@ static void test_VarDecAdd(void)
|
||||
|
||||
SETDEC(l,0,0,0,1); SETDEC(r,0,0,0,0); MATH2(VarDecAdd); EXPECTDEC(0,0,0,1);
|
||||
SETDEC(l,0,0,0,1); SETDEC(r,0,0,0,1); MATH2(VarDecAdd); EXPECTDEC(0,0,0,2);
|
||||
SETDEC(l,0,0,0,1); SETDEC(r,0,0x80,0,1); MATH2(VarDecAdd); EXPECTDEC(0,0x80,0,0); /* '-0'! */
|
||||
SETDEC(l,0,0,0,1); SETDEC(r,0,0x80,0,1); MATH2(VarDecAdd); EXPECTDECZERO();
|
||||
SETDEC(l,0,0,0,1); SETDEC(r,0,0x80,0,2); MATH2(VarDecAdd); EXPECTDEC(0,0x80,0,1);
|
||||
|
||||
SETDEC(l,0,0x80,0,0); SETDEC(r,0,0,0,1); MATH2(VarDecAdd); EXPECTDEC(0,0,0,1);
|
||||
SETDEC(l,0,0x80,0,1); SETDEC(r,0,0,0,1); MATH2(VarDecAdd); EXPECTDEC(0,0,0,0);
|
||||
SETDEC(l,0,0x80,0,1); SETDEC(r,0,0,0,1); MATH2(VarDecAdd); EXPECTDECZERO();
|
||||
SETDEC(l,0,0x80,0,1); SETDEC(r,0,0,0,2); MATH2(VarDecAdd); EXPECTDEC(0,0,0,1);
|
||||
SETDEC(l,0,0x80,0,1); SETDEC(r,0,0x80,0,1); MATH2(VarDecAdd); EXPECTDEC(0,0x80,0,2);
|
||||
SETDEC(l,0,0x80,0,2); SETDEC(r,0,0,0,1); MATH2(VarDecAdd); EXPECTDEC(0,0x80,0,1);
|
||||
@@ -4303,9 +4316,9 @@ static void test_VarDecSub(void)
|
||||
MATHVARS2;
|
||||
|
||||
CHECKPTR(VarDecSub);
|
||||
SETDEC(l,0,0,0,0); SETDEC(r,0,0,0,0); MATH2(VarDecSub); EXPECTDEC(0,0x80,0,0);
|
||||
SETDEC(l,0,0,0,0); SETDEC(r,0,0,0,0); MATH2(VarDecSub); EXPECTDECZERO();
|
||||
SETDEC(l,0,0,0,0); SETDEC(r,0,0,0,1); MATH2(VarDecSub); EXPECTDEC(0,0x80,0,1);
|
||||
SETDEC(l,0,0,0,1); SETDEC(r,0,0,0,1); MATH2(VarDecSub); EXPECTDEC(0,0x80,0,0);
|
||||
SETDEC(l,0,0,0,1); SETDEC(r,0,0,0,1); MATH2(VarDecSub); EXPECTDECZERO();
|
||||
SETDEC(l,0,0,0,1); SETDEC(r,0,0x80,0,1); MATH2(VarDecSub); EXPECTDEC(0,0,0,2);
|
||||
}
|
||||
|
||||
@@ -4376,12 +4389,14 @@ static void test_VarDecDiv(void)
|
||||
SETDEC(l,0,0,0,45); SETDEC(r,1,0,0,9); MATH2(VarDecDiv); EXPECTDEC(0,0,0,50);
|
||||
SETDEC(l,1,0,0,45); SETDEC(r,2,0,0,9); MATH2(VarDecDiv); EXPECTDEC(0,0,0,50);
|
||||
/* these last three results suggest that native oleaut32 scales both operands down to zero
|
||||
before the division, but does *not* try to scale the result, even if it is possible -
|
||||
analogous to multiplication behavior
|
||||
before the division, but does not always try to scale the result, even if it is possible -
|
||||
analogous to multiplication behavior.
|
||||
*/
|
||||
SETDEC(l,1,0,0,45); SETDEC(r,1,0,0,9); MATH2(VarDecDiv); EXPECTDEC(0,0,0,5);
|
||||
SETDEC(l,2,0,0,450); SETDEC(r,1,0,0,9); MATH2(VarDecDiv); EXPECTDEC(1,0,0,50);
|
||||
|
||||
SETDEC(l,2,0,0,450); SETDEC(r,1,0,0,9); MATH2(VarDecDiv);
|
||||
if (S(U(out)).scale == 1) EXPECTDEC(1,0,0,50);
|
||||
else EXPECTDEC(0,0,0,5);
|
||||
|
||||
/* inexact divisions */
|
||||
SETDEC(l,0,0,0,1); SETDEC(r,0,0,0,3); MATH2(VarDecDiv); EXPECTDEC64(28,0,180700362,0x14b700cb,0x05555555);
|
||||
SETDEC(l,1,0,0,1); SETDEC(r,0,0,0,3); MATH2(VarDecDiv); EXPECTDEC64(28,0,18070036,0x35458014,0x4d555555);
|
||||
@@ -4771,7 +4786,8 @@ static void test_VarBoolCopy(void)
|
||||
ok(hres == S_OK && V_VT(&vDst) == VT_BSTR && \
|
||||
V_BSTR(&vDst) && !memcmp(V_BSTR(&vDst), str, sizeof(str)), \
|
||||
"hres=0x%X, type=%d (should be VT_BSTR), *bstr='%c'\n", \
|
||||
hres, V_VT(&vDst), V_BSTR(&vDst) ? *V_BSTR(&vDst) : '?')
|
||||
hres, V_VT(&vDst), V_BSTR(&vDst) ? *V_BSTR(&vDst) : '?'); \
|
||||
VariantClear(&vDst)
|
||||
|
||||
static void test_VarBoolChangeTypeEx(void)
|
||||
{
|
||||
@@ -4846,6 +4862,7 @@ static void test_VarBstrFromR4(void)
|
||||
*/
|
||||
ok(memcmp(bstr, szNative, sizeof(szNative)) == 0, "string different\n");
|
||||
}
|
||||
SysFreeString(bstr);
|
||||
}
|
||||
|
||||
f = -0.0;
|
||||
@@ -4853,7 +4870,11 @@ static void test_VarBstrFromR4(void)
|
||||
ok(hres == S_OK, "got hres 0x%08x\n", hres);
|
||||
if (bstr)
|
||||
{
|
||||
ok(memcmp(bstr, szZero, sizeof(szZero)) == 0, "negative zero (got %s)\n", wtoascii(bstr));
|
||||
if (bstr[0] == '-')
|
||||
ok(memcmp(bstr + 1, szZero, sizeof(szZero)) == 0, "negative zero (got %s)\n", wtoascii(bstr));
|
||||
else
|
||||
ok(memcmp(bstr, szZero, sizeof(szZero)) == 0, "negative zero (got %s)\n", wtoascii(bstr));
|
||||
SysFreeString(bstr);
|
||||
}
|
||||
|
||||
/* The following tests that lcid is used for decimal separator even without LOCALE_USE_NLS */
|
||||
@@ -4863,6 +4884,7 @@ static void test_VarBstrFromR4(void)
|
||||
if (bstr)
|
||||
{
|
||||
ok(memcmp(bstr, szOneHalf_English, sizeof(szOneHalf_English)) == 0, "English locale failed (got %s)\n", wtoascii(bstr));
|
||||
SysFreeString(bstr);
|
||||
}
|
||||
f = 0.5;
|
||||
hres = pVarBstrFromR4(f, lcid_spanish, LOCALE_NOUSEROVERRIDE, &bstr);
|
||||
@@ -4870,12 +4892,14 @@ static void test_VarBstrFromR4(void)
|
||||
if (bstr)
|
||||
{
|
||||
ok(memcmp(bstr, szOneHalf_Spanish, sizeof(szOneHalf_Spanish)) == 0, "Spanish locale failed (got %s)\n", wtoascii(bstr));
|
||||
SysFreeString(bstr);
|
||||
}
|
||||
}
|
||||
|
||||
#define BSTR_DATE(dt,str) SysFreeString(bstr); bstr = NULL; \
|
||||
#define BSTR_DATE(dt,str) \
|
||||
bstr = NULL; \
|
||||
hres = pVarBstrFromDate(dt,lcid,LOCALE_NOUSEROVERRIDE,&bstr); \
|
||||
if (bstr) WideCharToMultiByte(CP_ACP, 0, bstr, -1, buff, sizeof(buff), 0, 0); \
|
||||
if (bstr) {WideCharToMultiByte(CP_ACP, 0, bstr, -1, buff, sizeof(buff), 0, 0); SysFreeString(bstr);} \
|
||||
else buff[0] = 0; \
|
||||
ok(hres == S_OK && !strcmp(str,buff), "Expected '%s', got '%s', hres = 0x%08x\n", \
|
||||
str, buff, hres)
|
||||
@@ -4885,7 +4909,7 @@ static void test_VarBstrFromDate(void)
|
||||
char buff[256];
|
||||
LCID lcid;
|
||||
HRESULT hres;
|
||||
BSTR bstr = NULL;
|
||||
BSTR bstr;
|
||||
|
||||
CHECKPTR(VarBstrFromDate);
|
||||
lcid = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
|
||||
@@ -4908,6 +4932,7 @@ static void test_VarBstrFromDate(void)
|
||||
if (hres== S_OK && bstr)\
|
||||
{\
|
||||
ok(lstrcmpW(bstr, e) == 0, "invalid number (got %s)\n", wtoascii(bstr));\
|
||||
SysFreeString(bstr);\
|
||||
}
|
||||
|
||||
static void test_VarBstrFromCy(void)
|
||||
@@ -4970,6 +4995,7 @@ static void test_VarBstrFromCy(void)
|
||||
if (hres== S_OK && bstr)\
|
||||
{\
|
||||
ok(lstrcmpW(bstr, e) == 0, "invalid number (got %s)\n", wtoascii(bstr));\
|
||||
SysFreeString(bstr);\
|
||||
}
|
||||
|
||||
#define BSTR_DEC64(l, a, b, c, x, d, e) \
|
||||
@@ -4979,6 +5005,7 @@ static void test_VarBstrFromCy(void)
|
||||
if (hres== S_OK && bstr)\
|
||||
{\
|
||||
ok(lstrcmpW(bstr, e) == 0, "invalid number (got %s)\n", wtoascii(bstr));\
|
||||
SysFreeString(bstr);\
|
||||
}
|
||||
|
||||
static void test_VarBstrFromDec(void)
|
||||
@@ -5150,6 +5177,7 @@ static void test_VarBstrCmp(void)
|
||||
VARBSTRCMP(bstr2,bstr,0,VARCMP_GT);
|
||||
SysFreeString(bstr2);
|
||||
SysFreeString(bstr);
|
||||
SysFreeString(bstrempty);
|
||||
}
|
||||
|
||||
/* Get the internal representation of a BSTR */
|
||||
@@ -5214,10 +5242,8 @@ static void test_SysAllocStringLen(void)
|
||||
if (0)
|
||||
{
|
||||
str = SysAllocStringLen(szTest, 0x80000000);
|
||||
todo_wine {
|
||||
ok (str == NULL, "Expected NULL, got %p\n", str);
|
||||
}
|
||||
}
|
||||
|
||||
str = SysAllocStringLen(NULL, 0);
|
||||
ok (str != NULL, "Expected non-NULL\n");
|
||||
@@ -5248,8 +5274,11 @@ static void test_SysAllocStringByteLen(void)
|
||||
const CHAR szTestA[6] = { 'T','e','s','t','\0','?' };
|
||||
BSTR str;
|
||||
|
||||
str = SysAllocStringByteLen(szTestA, 0x80000000);
|
||||
ok (str == NULL, "Expected NULL, got %p\n", str);
|
||||
if (sizeof(void *) == 4) /* not limited to 0x80000000 on Win64 */
|
||||
{
|
||||
str = SysAllocStringByteLen(szTestA, 0x80000000);
|
||||
ok (str == NULL, "Expected NULL, got %p\n", str);
|
||||
}
|
||||
|
||||
str = SysAllocStringByteLen(szTestA, 0xffffffff);
|
||||
ok (str == NULL, "Expected NULL, got %p\n", str);
|
||||
@@ -5313,7 +5342,6 @@ static void test_SysReAllocString(void)
|
||||
if (str)
|
||||
{
|
||||
LPINTERNAL_BSTR bstr;
|
||||
BSTR oldstr = str;
|
||||
int changed;
|
||||
|
||||
bstr = Get(str);
|
||||
@@ -5328,7 +5356,6 @@ static void test_SysReAllocString(void)
|
||||
ok (bstr->dwLen == 2, "Expected 2, got %d\n", bstr->dwLen);
|
||||
ok (!lstrcmpW(bstr->szString, szSmaller), "String different\n");
|
||||
|
||||
oldstr = str;
|
||||
changed = SysReAllocString(&str, szLarger);
|
||||
ok (changed == 1, "Expected 1, got %d\n", changed);
|
||||
/* Early versions always make new strings rather than resizing */
|
||||
@@ -5353,7 +5380,6 @@ static void test_SysReAllocStringLen(void)
|
||||
if (str)
|
||||
{
|
||||
LPINTERNAL_BSTR bstr;
|
||||
BSTR oldstr = str;
|
||||
int changed;
|
||||
|
||||
bstr = Get(str);
|
||||
@@ -5368,7 +5394,6 @@ static void test_SysReAllocStringLen(void)
|
||||
ok (bstr->dwLen == 2, "Expected 2, got %d\n", bstr->dwLen);
|
||||
ok (!lstrcmpW(bstr->szString, szSmaller), "String different\n");
|
||||
|
||||
oldstr = str;
|
||||
changed = SysReAllocStringLen(&str, szLarger, 6);
|
||||
ok (changed == 1, "Expected 1, got %d\n", changed);
|
||||
/* Early versions always make new strings rather than resizing */
|
||||
@@ -5382,6 +5407,49 @@ static void test_SysReAllocStringLen(void)
|
||||
|
||||
SysFreeString(str);
|
||||
}
|
||||
|
||||
/* Windows always returns null terminated strings */
|
||||
str = SysAllocStringLen(szTest, 4);
|
||||
ok (str != NULL, "Expected non-NULL\n");
|
||||
if (str)
|
||||
{
|
||||
const int CHUNK_SIZE = 64;
|
||||
const int STRING_SIZE = 24;
|
||||
int changed;
|
||||
changed = SysReAllocStringLen(&str, NULL, CHUNK_SIZE);
|
||||
ok (changed == 1, "Expected 1, got %d\n", changed);
|
||||
ok (str != NULL, "Expected non-NULL\n");
|
||||
if (str)
|
||||
{
|
||||
BSTR oldstr = str;
|
||||
|
||||
/* Filling string */
|
||||
memset (str, 0xAB, CHUNK_SIZE * sizeof (OLECHAR));
|
||||
/* Checking null terminator */
|
||||
changed = SysReAllocStringLen(&str, NULL, STRING_SIZE);
|
||||
ok (changed == 1, "Expected 1, got %d\n", changed);
|
||||
ok (str != NULL, "Expected non-NULL\n");
|
||||
if (str)
|
||||
{
|
||||
ok (str == oldstr, "Expected reuse of the old string memory\n");
|
||||
ok (str[STRING_SIZE] == 0,
|
||||
"Expected null terminator, got 0x%04X\n", str[STRING_SIZE]);
|
||||
SysFreeString(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Some Windows applications use the same pointer for pbstr and psz */
|
||||
str = SysAllocStringLen(szTest, 4);
|
||||
ok(str != NULL, "Expected non-NULL\n");
|
||||
if(str)
|
||||
{
|
||||
SysReAllocStringLen(&str, str, 1000000);
|
||||
ok(SysStringLen(str)==1000000, "Incorrect string length\n");
|
||||
ok(!memcmp(szTest, str, 4*sizeof(WCHAR)), "Incorrect string returned\n");
|
||||
|
||||
SysFreeString(str);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_BstrCopy(void)
|
||||
@@ -5405,6 +5473,8 @@ static void test_BstrCopy(void)
|
||||
bstr = Get(V_BSTR(&vt2));
|
||||
ok (bstr->dwLen == 3, "Expected 3, got %d\n", bstr->dwLen);
|
||||
ok (!lstrcmpA((LPCSTR)bstr->szString, szTestTruncA), "String different\n");
|
||||
VariantClear(&vt2);
|
||||
VariantClear(&vt1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5416,12 +5486,17 @@ static void test_VarBstrCat(void)
|
||||
static const WCHAR s1[] = { 'a',0 };
|
||||
static const WCHAR s2[] = { 'b',0 };
|
||||
static const WCHAR s1s2[] = { 'a',0,'b',0 };
|
||||
static const char str1A[] = "Have ";
|
||||
static const char str2A[] = "A Cigar";
|
||||
HRESULT ret;
|
||||
BSTR str1, str2, res;
|
||||
UINT len;
|
||||
|
||||
/* Crash
|
||||
if (0)
|
||||
{
|
||||
/* Crash */
|
||||
ret = VarBstrCat(NULL, NULL, NULL);
|
||||
*/
|
||||
}
|
||||
|
||||
/* Concatenation of two NULL strings works */
|
||||
ret = VarBstrCat(NULL, NULL, &res);
|
||||
@@ -5473,6 +5548,43 @@ static void test_VarBstrCat(void)
|
||||
|
||||
SysFreeString(str2);
|
||||
SysFreeString(str1);
|
||||
|
||||
/* Concatenation of ansi BSTRs, both odd byte count not including termination */
|
||||
str1 = SysAllocStringByteLen(str1A, sizeof(str1A)-1);
|
||||
str2 = SysAllocStringByteLen(str2A, sizeof(str2A)-1);
|
||||
len = SysStringLen(str1);
|
||||
ok(len == (sizeof(str1A)-1)/sizeof(WCHAR), "got length %u\n", len);
|
||||
len = SysStringLen(str2);
|
||||
ok(len == (sizeof(str2A)-1)/sizeof(WCHAR), "got length %u\n", len);
|
||||
|
||||
ret = VarBstrCat(str1, str2, &res);
|
||||
ok(ret == S_OK, "VarBstrCat failed: %08x\n", ret);
|
||||
ok(res != NULL, "Expected a string\n");
|
||||
len = (sizeof(str1A) + sizeof(str2A) - 2)/sizeof(WCHAR);
|
||||
ok(SysStringLen(res) == len, "got %d, expected %u\n", SysStringLen(res), len);
|
||||
ok(!memcmp(res, "Have A Cigar", sizeof(str1A) + sizeof(str2A) - 1), "got (%s)\n", (char*)res);
|
||||
SysFreeString(res);
|
||||
|
||||
SysFreeString(str2);
|
||||
SysFreeString(str1);
|
||||
|
||||
/* Concatenation of ansi BSTRs, both 1 byte length not including termination */
|
||||
str1 = SysAllocStringByteLen(str1A, 1);
|
||||
str2 = SysAllocStringByteLen(str2A, 1);
|
||||
len = SysStringLen(str1);
|
||||
ok(len == 0, "got length %u\n", len);
|
||||
len = SysStringLen(str2);
|
||||
ok(len == 0, "got length %u\n", len);
|
||||
|
||||
ret = VarBstrCat(str1, str2, &res);
|
||||
ok(ret == S_OK, "VarBstrCat failed: %08x\n", ret);
|
||||
ok(res != NULL, "Expected a string\n");
|
||||
ok(SysStringLen(res) == 1, "got %d, expected 1\n", SysStringLen(res));
|
||||
ok(!memcmp(res, "HA", 2), "got (%s)\n", (char*)res);
|
||||
SysFreeString(res);
|
||||
|
||||
SysFreeString(str2);
|
||||
SysFreeString(str1);
|
||||
}
|
||||
|
||||
/* IUnknown */
|
||||
@@ -5812,6 +5924,7 @@ static void test_EmptyChangeTypeEx(void)
|
||||
ok(hres == hExpected && (hres != S_OK || V_VT(&vDst) == vt),
|
||||
"change empty: vt %d expected 0x%08x, got 0x%08x, vt %d\n",
|
||||
vt, hExpected, hres, V_VT(&vDst));
|
||||
if(hres == S_OK) VariantClear(&vDst);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -408,6 +408,28 @@ static int __stdcall iid_lookup( const IID * pIID, int * pIndex )
|
||||
}
|
||||
|
||||
|
||||
static BOOL check_address(void *actual, void *expected)
|
||||
{
|
||||
static void *ole32_start = NULL;
|
||||
static void *ole32_end = NULL;
|
||||
|
||||
if (actual == expected)
|
||||
return TRUE;
|
||||
|
||||
/* On Win7, actual can be located inside ole32.dll */
|
||||
if (ole32_start == NULL || ole32_end == NULL)
|
||||
{
|
||||
PIMAGE_NT_HEADERS nt_headers;
|
||||
ole32_start = (void *) GetModuleHandleA("ole32.dll");
|
||||
if (ole32_start == NULL)
|
||||
return FALSE;
|
||||
nt_headers = (PIMAGE_NT_HEADERS)((char *) ole32_start + ((PIMAGE_DOS_HEADER) ole32_start)->e_lfanew);
|
||||
ole32_end = (void *)((char *) ole32_start + nt_headers->OptionalHeader.SizeOfImage);
|
||||
}
|
||||
|
||||
return ole32_start <= actual && actual < ole32_end;
|
||||
}
|
||||
|
||||
static const ExtendedProxyFileInfo my_proxy_file_info =
|
||||
{
|
||||
(const PCInterfaceProxyVtblList *) &cstub_ProxyVtblList,
|
||||
@@ -477,7 +499,7 @@ static IPSFactoryBuffer *test_NdrDllGetClassObject(void)
|
||||
ok(stub_vtbl[i]->Vtbl.name != CStd_##name, #name "vtbl %d updated %p %p\n", \
|
||||
i, stub_vtbl[i]->Vtbl.name, CStd_##name )
|
||||
#define VTBL_TEST_CHANGE_TO(name, i) \
|
||||
ok(stub_vtbl[i]->Vtbl.name == CStd_##name, #name "vtbl %d not updated %p %p\n", \
|
||||
ok(check_address(stub_vtbl[i]->Vtbl.name, CStd_##name), #name "vtbl %d not updated %p %p\n", \
|
||||
i, stub_vtbl[i]->Vtbl.name, CStd_##name )
|
||||
#define VTBL_TEST_ZERO(name, i) \
|
||||
ok(stub_vtbl[i]->Vtbl.name == NULL, #name "vtbl %d not null %p\n", \
|
||||
@@ -528,7 +550,7 @@ static IPSFactoryBuffer *test_NdrDllGetClassObject(void)
|
||||
VTBL_TEST_CHANGE_TO(DebugServerRelease, 3);
|
||||
|
||||
#define VTBL_PROXY_TEST(i,num,ptr) \
|
||||
ok( proxy_vtbl[i]->Vtbl[num] == (ptr), "wrong proxy %u func %u %p/%p\n", \
|
||||
ok( check_address(proxy_vtbl[i]->Vtbl[num], (ptr)), "wrong proxy %u func %u %p/%p\n", \
|
||||
(i), (num), proxy_vtbl[i]->Vtbl[num], (ptr) )
|
||||
#define VTBL_PROXY_TEST_NOT_ZERO(i,num) \
|
||||
ok( proxy_vtbl[i]->Vtbl[num] != NULL, "wrong proxy %u func %u is NULL\n", (i), (num))
|
||||
@@ -748,6 +770,8 @@ static void test_CreateStub(IPSFactoryBuffer *ppsf)
|
||||
/* 0xdeadbeef returned from create_stub_test_QI */
|
||||
ok(cstd_stub->pvServerObject == (void*)0xdeadbeef, "pvServerObject %p\n", cstd_stub->pvServerObject);
|
||||
ok(cstd_stub->pPSFactory != NULL, "pPSFactory was NULL\n");
|
||||
cstd_stub->pvServerObject = NULL;
|
||||
IRpcStubBuffer_Release(pstub);
|
||||
|
||||
vtbl = &create_stub_test_fail_vtbl;
|
||||
pstub = create_stub(ppsf, &IID_if1, obj, E_NOINTERFACE);
|
||||
@@ -886,6 +910,7 @@ static void test_Disconnect(IPSFactoryBuffer *ppsf)
|
||||
IRpcStubBuffer_Disconnect(pstub);
|
||||
ok(connect_test_orig_release_called == 1, "release called %d\n", connect_test_orig_release_called);
|
||||
ok(cstd_stub->pvServerObject == NULL, "pvServerObject %p\n", cstd_stub->pvServerObject);
|
||||
IRpcStubBuffer_Release(pstub);
|
||||
}
|
||||
|
||||
|
||||
@@ -1064,6 +1089,69 @@ static void test_delegating_Invoke(IPSFactoryBuffer *ppsf)
|
||||
HeapFree(GetProcessHeap(), 0, msg.Buffer);
|
||||
IRpcStubBuffer_Release(pstub);
|
||||
}
|
||||
static const CInterfaceProxyVtbl *cstub_ProxyVtblList2[] =
|
||||
{
|
||||
NULL
|
||||
};
|
||||
|
||||
static const CInterfaceStubVtbl *cstub_StubVtblList2[] =
|
||||
{
|
||||
NULL
|
||||
};
|
||||
|
||||
static PCInterfaceName const if_name_list2[] =
|
||||
{
|
||||
NULL
|
||||
};
|
||||
|
||||
static const IID *base_iid_list2[] =
|
||||
{
|
||||
NULL,
|
||||
};
|
||||
|
||||
static const ExtendedProxyFileInfo my_proxy_file_info2 =
|
||||
{
|
||||
(const PCInterfaceProxyVtblList *) &cstub_ProxyVtblList2,
|
||||
(const PCInterfaceStubVtblList *) &cstub_StubVtblList2,
|
||||
(const PCInterfaceName *) &if_name_list2,
|
||||
(const IID **) &base_iid_list2,
|
||||
&iid_lookup,
|
||||
0,
|
||||
1,
|
||||
NULL,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
};
|
||||
|
||||
static const ProxyFileInfo *proxy_file_list2[] = {
|
||||
&my_proxy_file_info2,
|
||||
NULL
|
||||
};
|
||||
|
||||
static void test_NdrDllRegisterProxy( void )
|
||||
{
|
||||
HRESULT res;
|
||||
const ExtendedProxyFileInfo *pf;
|
||||
HMODULE hmod = GetModuleHandleA(NULL);
|
||||
|
||||
|
||||
res = NdrDllRegisterProxy(NULL, NULL, NULL);
|
||||
ok(res == E_HANDLE, "Incorrect return code %x\n",res);
|
||||
pf = NULL;
|
||||
res = NdrDllRegisterProxy(hmod, &pf, NULL);
|
||||
ok(res == E_NOINTERFACE, "Incorrect return code %x\n",res);
|
||||
res = NdrDllRegisterProxy(hmod, proxy_file_list2, NULL);
|
||||
ok(res == E_NOINTERFACE, "Incorrect return code %x\n",res);
|
||||
/* This fails on Vista and Windows 7 due to permissions */
|
||||
res = NdrDllRegisterProxy(hmod, proxy_file_list, NULL);
|
||||
ok(res == S_OK || res == E_ACCESSDENIED, "NdrDllRegisterProxy failed %x\n",res);
|
||||
if (res == S_OK)
|
||||
{
|
||||
res = NdrDllUnregisterProxy(hmod,proxy_file_list, NULL);
|
||||
ok(res == S_OK, "NdrDllUnregisterProxy failed %x\n",res);
|
||||
}
|
||||
}
|
||||
|
||||
START_TEST( cstub )
|
||||
{
|
||||
@@ -1079,6 +1167,7 @@ START_TEST( cstub )
|
||||
test_Disconnect(ppsf);
|
||||
test_Release(ppsf);
|
||||
test_delegating_Invoke(ppsf);
|
||||
test_NdrDllRegisterProxy();
|
||||
|
||||
OleUninitialize();
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -258,7 +258,7 @@ static void test_pointer_marshal(const unsigned char *formattypes,
|
||||
|
||||
StubMsg.Buffer = StubMsg.BufferStart;
|
||||
StubMsg.MemorySize = 0;
|
||||
mem_orig = mem = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
mem_orig = mem = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
|
||||
|
||||
if(formattypes[1] & 0x10 /* FC_POINTER_DEREF */)
|
||||
*(void**)mem = NULL;
|
||||
@@ -861,7 +861,7 @@ static int ps1_cmp(const void *s1, const void *s2, size_t num)
|
||||
if(*p1->pl1 != *p2->pl1)
|
||||
return 1;
|
||||
}
|
||||
else if(p1->pl1 || p1->pl1)
|
||||
else if(p1->pl1 || p2->pl1)
|
||||
return 1;
|
||||
|
||||
if(p1->pc1 && p2->pc1)
|
||||
@@ -869,7 +869,7 @@ static int ps1_cmp(const void *s1, const void *s2, size_t num)
|
||||
if(*p1->pc1 != *p2->pc1)
|
||||
return 1;
|
||||
}
|
||||
else if(p1->pc1 || p1->pc1)
|
||||
else if(p1->pc1 || p2->pc1)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
@@ -1046,6 +1046,9 @@ static void test_fullpointer_xlat(void)
|
||||
|
||||
/* "unmarshaling" phase */
|
||||
|
||||
ret = NdrFullPointerQueryRefId(pXlatTables, 0x0, 0, &Pointer);
|
||||
ok(ret == 1, "ret should be 1 instead of 0x%x\n", ret);
|
||||
|
||||
ret = NdrFullPointerQueryRefId(pXlatTables, 0x2, 0, &Pointer);
|
||||
ok(ret == 0, "ret should be 0 instead of 0x%x\n", ret);
|
||||
ok(Pointer == (void *)0xcafebabe, "Pointer should be 0xcafebabe instead of %p\n", Pointer);
|
||||
@@ -1184,30 +1187,15 @@ static void test_common_stub_data( const char *prefix, const MIDL_STUB_MESSAGE *
|
||||
"%s: pAsyncMsg should have been set to zero instead of %d\n", prefix, stubMsg->PointerLength );
|
||||
TEST_ZERO(fInDontFree, "%d");
|
||||
TEST_ZERO(fDontCallFreeInst, "%d");
|
||||
ok(stubMsg->fInOnlyParam == 0 ||
|
||||
stubMsg->fInOnlyParam == -1, /* Vista */
|
||||
"%s: fInOnlyParam should have been set to 0 or -1 instead of %d\n", prefix, stubMsg->fInOnlyParam);
|
||||
ok( stubMsg->fHasReturn == 0 ||
|
||||
broken(stubMsg->fHasReturn == -1), /* win9x, nt4 */
|
||||
ok( stubMsg->fHasReturn == 0 || broken(stubMsg->fHasReturn), /* win9x, nt4 */
|
||||
"%s: fHasReturn should have been set to zero instead of %d\n", prefix, stubMsg->fHasReturn );
|
||||
TEST_ZERO(fHasExtensions, "%d");
|
||||
TEST_ZERO(fHasNewCorrDesc, "%d");
|
||||
ok(stubMsg->fIsIn == 0 ||
|
||||
broken(stubMsg->fIsIn == -1), /* win9x, nt4 */
|
||||
ok(stubMsg->fIsIn == 0 || broken(stubMsg->fIsIn), /* win9x, nt4 */
|
||||
"%s: fIsIn should have been set to 0 instead of %d\n", prefix, stubMsg->fIsIn);
|
||||
ok(stubMsg->fIsOut == 0 ||
|
||||
stubMsg->fIsOut == -1, /* XP-SP3 */
|
||||
"%s: fIsOut should have been set to 0 or -1 instead of %d\n", prefix, stubMsg->fIsOut);
|
||||
TEST_ZERO(fIsOicf, "%d");
|
||||
ok(stubMsg->fBufferValid == 0,
|
||||
"%s: fBufferValid should have been set to 0 instead of %d\n", prefix, stubMsg->fBufferValid);
|
||||
ok(stubMsg->fHasMemoryValidateCallback == 0 ||
|
||||
stubMsg->fHasMemoryValidateCallback == -1, /* XP-SP3 */
|
||||
"%s: fHasMemoryValidateCallback should have been set to 0 or -1 instead of %d\n",
|
||||
prefix, stubMsg->fHasMemoryValidateCallback);
|
||||
ok(stubMsg->fInFree == 0 ||
|
||||
stubMsg->fInFree == -1, /* XP-SP3 */
|
||||
"%s: fInFree should have been set to 0 or -1 instead of %d\n", prefix, stubMsg->fInFree);
|
||||
TEST_ZERO(fNeedMCCP, "%d");
|
||||
ok(stubMsg->fUnused == 0 ||
|
||||
stubMsg->fUnused == -2, /* Vista */
|
||||
@@ -1891,6 +1879,197 @@ static void test_conf_complex_struct(void)
|
||||
StubMsg.pfnFree(mem);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, StubMsg.RpcMsg->Buffer);
|
||||
HeapFree(GetProcessHeap(), 0, memsrc);
|
||||
}
|
||||
|
||||
|
||||
static void test_conf_complex_array(void)
|
||||
{
|
||||
RPC_MESSAGE RpcMessage;
|
||||
MIDL_STUB_MESSAGE StubMsg;
|
||||
MIDL_STUB_DESC StubDesc;
|
||||
void *ptr;
|
||||
unsigned int i, j;
|
||||
struct conf_complex
|
||||
{
|
||||
unsigned int dim1, dim2;
|
||||
DWORD **array;
|
||||
};
|
||||
struct conf_complex memsrc;
|
||||
struct conf_complex *mem;
|
||||
DWORD *buf, expected_length;
|
||||
|
||||
static const unsigned char fmtstr_complex_array[] =
|
||||
{
|
||||
|
||||
/* 0 */ 0x21, /* FC_BOGUS_ARRAY */
|
||||
0x3, /* 3 */
|
||||
/* 2 */ NdrFcShort( 0x0 ), /* 0 */
|
||||
/* 4 */ 0x19, 0x0, /* Corr desc: field pointer, FC_ULONG */
|
||||
/* 6 */ NdrFcShort( 0x4 ), /* 4 */
|
||||
/* 8 */ NdrFcLong( 0xffffffff ), /* -1 */
|
||||
/* 12 */ 0x8, /* FC_LONG */
|
||||
0x5b, /* FC_END */
|
||||
/* 14 */
|
||||
0x21, /* FC_BOGUS_ARRAY */
|
||||
0x3, /* 3 */
|
||||
/* 16 */ NdrFcShort( 0x0 ), /* 0 */
|
||||
/* 18 */ 0x19, /* Corr desc: field pointer, FC_ULONG */
|
||||
0x0, /* */
|
||||
/* 20 */ NdrFcShort( 0x0 ), /* 0 */
|
||||
/* 22 */ NdrFcLong( 0xffffffff ), /* -1 */
|
||||
/* 26 */ 0x12, 0x0, /* FC_UP */
|
||||
/* 28 */ NdrFcShort( 0xffe4 ), /* Offset= -28 (0) */
|
||||
/* 30 */ 0x5c, /* FC_PAD */
|
||||
0x5b, /* FC_END */
|
||||
|
||||
#ifdef _WIN64
|
||||
/* 32 */ 0x1a, /* FC_BOGUS_STRUCT */
|
||||
0x3, /* 3 */
|
||||
/* 34 */ NdrFcShort( 0x10 ), /* 16 */
|
||||
/* 36 */ NdrFcShort( 0x0 ), /* 0 */
|
||||
/* 38 */ NdrFcShort( 0x6 ), /* Offset= 6 (44) */
|
||||
/* 40 */ 0x8, /* FC_LONG */
|
||||
0x8, /* FC_LONG */
|
||||
/* 42 */ 0x36, /* FC_POINTER */
|
||||
0x5b, /* FC_END */
|
||||
/* 44 */
|
||||
0x12, 0x0, /* FC_UP */
|
||||
/* 46 */ NdrFcShort( 0xffe0 ), /* Offset= -32 (14) */
|
||||
#else
|
||||
/* 32 */
|
||||
0x16, /* FC_PSTRUCT */
|
||||
0x3, /* 3 */
|
||||
/* 34 */ NdrFcShort( 0xc ), /* 12 */
|
||||
/* 36 */ 0x4b, /* FC_PP */
|
||||
0x5c, /* FC_PAD */
|
||||
/* 38 */ 0x46, /* FC_NO_REPEAT */
|
||||
0x5c, /* FC_PAD */
|
||||
/* 40 */ NdrFcShort( 0x8 ), /* 8 */
|
||||
/* 42 */ NdrFcShort( 0x8 ), /* 8 */
|
||||
/* 44 */ 0x12, 0x0, /* FC_UP */
|
||||
/* 46 */ NdrFcShort( 0xffe0 ), /* Offset= -32 (14) */
|
||||
/* 48 */ 0x5b, /* FC_END */
|
||||
0x8, /* FC_LONG */
|
||||
/* 50 */ 0x8, /* FC_LONG */
|
||||
0x8, /* FC_LONG */
|
||||
/* 52 */ 0x5c, /* FC_PAD */
|
||||
0x5b, /* FC_END */
|
||||
#endif
|
||||
};
|
||||
|
||||
memsrc.dim1 = 5;
|
||||
memsrc.dim2 = 3;
|
||||
|
||||
memsrc.array = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, memsrc.dim1 * sizeof(DWORD*));
|
||||
|
||||
for(i = 0; i < memsrc.dim1; i++)
|
||||
{
|
||||
memsrc.array[i] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, memsrc.dim2 * sizeof(DWORD));
|
||||
for(j = 0; j < memsrc.dim2; j++)
|
||||
memsrc.array[i][j] = i * memsrc.dim2 + j;
|
||||
}
|
||||
|
||||
StubDesc = Object_StubDesc;
|
||||
StubDesc.pFormatTypes = fmtstr_complex_array;
|
||||
|
||||
NdrClientInitializeNew(
|
||||
&RpcMessage,
|
||||
&StubMsg,
|
||||
&StubDesc,
|
||||
0);
|
||||
|
||||
StubMsg.BufferLength = 0;
|
||||
|
||||
#ifdef _WIN64
|
||||
NdrComplexStructBufferSize( &StubMsg,
|
||||
(unsigned char *)&memsrc,
|
||||
&fmtstr_complex_array[32] );
|
||||
#else
|
||||
NdrSimpleStructBufferSize( &StubMsg,
|
||||
(unsigned char *)&memsrc,
|
||||
&fmtstr_complex_array[32] );
|
||||
#endif
|
||||
|
||||
expected_length = (4 + memsrc.dim1 * (2 + memsrc.dim2)) * 4;
|
||||
if (StubMsg.BufferLength == 96)
|
||||
{
|
||||
win_skip("Tests crash on Win9x, WinMe and NT4\n");
|
||||
goto cleanup;
|
||||
}
|
||||
ok(StubMsg.BufferLength >= expected_length, "length %d\n", StubMsg.BufferLength);
|
||||
|
||||
/*NdrGetBuffer(&_StubMsg, _StubMsg.BufferLength, NULL);*/
|
||||
StubMsg.RpcMsg->Buffer = StubMsg.BufferStart = StubMsg.Buffer = HeapAlloc(GetProcessHeap(), 0, StubMsg.BufferLength);
|
||||
StubMsg.BufferEnd = StubMsg.BufferStart + StubMsg.BufferLength;
|
||||
|
||||
#ifdef _WIN64
|
||||
ptr = NdrComplexStructMarshall( &StubMsg, (unsigned char *)&memsrc,
|
||||
&fmtstr_complex_array[32] );
|
||||
#else
|
||||
ptr = NdrSimpleStructMarshall( &StubMsg, (unsigned char *)&memsrc,
|
||||
&fmtstr_complex_array[32] );
|
||||
#endif
|
||||
|
||||
ok(ptr == NULL, "ret %p\n", ptr);
|
||||
ok((char*)StubMsg.Buffer == (char*)StubMsg.BufferStart + expected_length, "not at expected length\n");
|
||||
|
||||
buf = (DWORD *)StubMsg.BufferStart;
|
||||
|
||||
ok(*buf == memsrc.dim1, "dim1 should have been %d instead of %08x\n", memsrc.dim1, *buf);
|
||||
buf++;
|
||||
ok(*buf == memsrc.dim2, "dim2 should have been %d instead of %08x\n", memsrc.dim2, *buf);
|
||||
buf++;
|
||||
ok(*buf != 0, "pointer id should be non-zero\n");
|
||||
buf++;
|
||||
ok(*buf == memsrc.dim1, "Conformance should have been %d instead of %08x\n", memsrc.dim1, *buf);
|
||||
buf++;
|
||||
for(i = 0; i < memsrc.dim1; i++)
|
||||
{
|
||||
ok(*buf != 0, "pointer id[%d] should be non-zero\n", i);
|
||||
buf++;
|
||||
}
|
||||
for(i = 0; i < memsrc.dim1; i++)
|
||||
{
|
||||
ok(*buf == memsrc.dim2, "Conformance should have been %d instead of %08x\n", memsrc.dim2, *buf);
|
||||
buf++;
|
||||
for(j = 0; j < memsrc.dim2; j++)
|
||||
{
|
||||
ok(*buf == i * memsrc.dim2 + j, "got %08x\n", *buf);
|
||||
buf++;
|
||||
}
|
||||
}
|
||||
|
||||
ok((void*)buf == StubMsg.Buffer, "not at end of buffer\n");
|
||||
|
||||
/* Server */
|
||||
my_alloc_called = 0;
|
||||
StubMsg.IsClient = 0;
|
||||
mem = NULL;
|
||||
StubMsg.Buffer = StubMsg.BufferStart;
|
||||
#ifdef _WIN64
|
||||
ptr = NdrComplexStructUnmarshall( &StubMsg, (unsigned char **)&mem, &fmtstr_complex_array[32], 0);
|
||||
#else
|
||||
ptr = NdrSimpleStructUnmarshall( &StubMsg, (unsigned char **)&mem, &fmtstr_complex_array[32], 0);
|
||||
#endif
|
||||
ok(ptr == NULL, "ret %p\n", ptr);
|
||||
ok(mem->dim1 == memsrc.dim1, "mem->dim1 wasn't unmarshalled correctly (%d)\n", mem->dim1);
|
||||
ok(mem->dim2 == memsrc.dim2, "mem->dim2 wasn't unmarshalled correctly (%d)\n", mem->dim2);
|
||||
ok(mem->array[1][0] == memsrc.dim2, "mem->array[1][0] wasn't unmarshalled correctly (%d)\n", mem->array[1][0]);
|
||||
|
||||
StubMsg.Buffer = StubMsg.BufferStart;
|
||||
#ifdef _WIN64
|
||||
NdrComplexStructFree( &StubMsg, (unsigned char*)mem, &fmtstr_complex_array[32]);
|
||||
#else
|
||||
NdrSimpleStructFree( &StubMsg, (unsigned char*)mem, &fmtstr_complex_array[32]);
|
||||
#endif
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, StubMsg.RpcMsg->Buffer);
|
||||
|
||||
cleanup:
|
||||
for(i = 0; i < memsrc.dim1; i++)
|
||||
HeapFree(GetProcessHeap(), 0, memsrc.array[i]);
|
||||
HeapFree(GetProcessHeap(), 0, memsrc.array);
|
||||
}
|
||||
|
||||
static void test_ndr_buffer(void)
|
||||
@@ -2063,21 +2242,21 @@ static void test_NdrGetUserMarshalInfo(void)
|
||||
ok( umi.InformationLevel == 1,
|
||||
"umi.InformationLevel was %u instead of 1\n",
|
||||
umi.InformationLevel);
|
||||
ok( U(umi.Level1).Buffer == buffer + 15,
|
||||
"U(umi.Level1).Buffer was %p instead of %p\n",
|
||||
U(umi.Level1).Buffer, buffer);
|
||||
ok( U(umi.Level1).BufferSize == 1,
|
||||
"U(umi.Level1).BufferSize was %u instead of 1\n",
|
||||
U(umi.Level1).BufferSize);
|
||||
ok( U(umi.Level1).pfnAllocate == my_alloc,
|
||||
"U(umi.Level1).pfnAllocate was %p instead of %p\n",
|
||||
U(umi.Level1).pfnAllocate, my_alloc);
|
||||
ok( U(umi.Level1).pfnFree == my_free,
|
||||
"U(umi.Level1).pfnFree was %p instead of %p\n",
|
||||
U(umi.Level1).pfnFree, my_free);
|
||||
ok( U(umi.Level1).pRpcChannelBuffer == rpc_channel_buffer,
|
||||
"U(umi.Level1).pRpcChannelBuffer was %p instead of %p\n",
|
||||
U(umi.Level1).pRpcChannelBuffer, rpc_channel_buffer);
|
||||
ok( U1(umi).Level1.Buffer == buffer + 15,
|
||||
"umi.Level1.Buffer was %p instead of %p\n",
|
||||
U1(umi).Level1.Buffer, buffer);
|
||||
ok( U1(umi).Level1.BufferSize == 1,
|
||||
"umi.Level1.BufferSize was %u instead of 1\n",
|
||||
U1(umi).Level1.BufferSize);
|
||||
ok( U1(umi).Level1.pfnAllocate == my_alloc,
|
||||
"umi.Level1.pfnAllocate was %p instead of %p\n",
|
||||
U1(umi).Level1.pfnAllocate, my_alloc);
|
||||
ok( U1(umi).Level1.pfnFree == my_free,
|
||||
"umi.Level1.pfnFree was %p instead of %p\n",
|
||||
U1(umi).Level1.pfnFree, my_free);
|
||||
ok( U1(umi).Level1.pRpcChannelBuffer == rpc_channel_buffer,
|
||||
"umi.Level1.pRpcChannelBuffer was %p instead of %p\n",
|
||||
U1(umi).Level1.pRpcChannelBuffer, rpc_channel_buffer);
|
||||
|
||||
/* buffer size */
|
||||
|
||||
@@ -2097,21 +2276,21 @@ static void test_NdrGetUserMarshalInfo(void)
|
||||
ok( umi.InformationLevel == 1,
|
||||
"umi.InformationLevel was %u instead of 1\n",
|
||||
umi.InformationLevel);
|
||||
ok( U(umi.Level1).Buffer == NULL,
|
||||
"U(umi.Level1).Buffer was %p instead of NULL\n",
|
||||
U(umi.Level1).Buffer);
|
||||
ok( U(umi.Level1).BufferSize == 0,
|
||||
"U(umi.Level1).BufferSize was %u instead of 0\n",
|
||||
U(umi.Level1).BufferSize);
|
||||
ok( U(umi.Level1).pfnAllocate == my_alloc,
|
||||
"U(umi.Level1).pfnAllocate was %p instead of %p\n",
|
||||
U(umi.Level1).pfnAllocate, my_alloc);
|
||||
ok( U(umi.Level1).pfnFree == my_free,
|
||||
"U(umi.Level1).pfnFree was %p instead of %p\n",
|
||||
U(umi.Level1).pfnFree, my_free);
|
||||
ok( U(umi.Level1).pRpcChannelBuffer == rpc_channel_buffer,
|
||||
"U(umi.Level1).pRpcChannelBuffer was %p instead of %p\n",
|
||||
U(umi.Level1).pRpcChannelBuffer, rpc_channel_buffer);
|
||||
ok( U1(umi).Level1.Buffer == NULL,
|
||||
"umi.Level1.Buffer was %p instead of NULL\n",
|
||||
U1(umi).Level1.Buffer);
|
||||
ok( U1(umi).Level1.BufferSize == 0,
|
||||
"umi.Level1.BufferSize was %u instead of 0\n",
|
||||
U1(umi).Level1.BufferSize);
|
||||
ok( U1(umi).Level1.pfnAllocate == my_alloc,
|
||||
"umi.Level1.pfnAllocate was %p instead of %p\n",
|
||||
U1(umi).Level1.pfnAllocate, my_alloc);
|
||||
ok( U1(umi).Level1.pfnFree == my_free,
|
||||
"umi.Level1.pfnFree was %p instead of %p\n",
|
||||
U1(umi).Level1.pfnFree, my_free);
|
||||
ok( U1(umi).Level1.pRpcChannelBuffer == rpc_channel_buffer,
|
||||
"umi.Level1.pRpcChannelBuffer was %p instead of %p\n",
|
||||
U1(umi).Level1.pRpcChannelBuffer, rpc_channel_buffer);
|
||||
|
||||
/* marshall */
|
||||
|
||||
@@ -2131,21 +2310,21 @@ static void test_NdrGetUserMarshalInfo(void)
|
||||
ok( umi.InformationLevel == 1,
|
||||
"umi.InformationLevel was %u instead of 1\n",
|
||||
umi.InformationLevel);
|
||||
ok( U(umi.Level1).Buffer == buffer + 15,
|
||||
"U(umi.Level1).Buffer was %p instead of %p\n",
|
||||
U(umi.Level1).Buffer, buffer);
|
||||
ok( U(umi.Level1).BufferSize == 1,
|
||||
"U(umi.Level1).BufferSize was %u instead of 1\n",
|
||||
U(umi.Level1).BufferSize);
|
||||
ok( U(umi.Level1).pfnAllocate == my_alloc,
|
||||
"U(umi.Level1).pfnAllocate was %p instead of %p\n",
|
||||
U(umi.Level1).pfnAllocate, my_alloc);
|
||||
ok( U(umi.Level1).pfnFree == my_free,
|
||||
"U(umi.Level1).pfnFree was %p instead of %p\n",
|
||||
U(umi.Level1).pfnFree, my_free);
|
||||
ok( U(umi.Level1).pRpcChannelBuffer == rpc_channel_buffer,
|
||||
"U(umi.Level1).pRpcChannelBuffer was %p instead of %p\n",
|
||||
U(umi.Level1).pRpcChannelBuffer, rpc_channel_buffer);
|
||||
ok( U1(umi).Level1.Buffer == buffer + 15,
|
||||
"umi.Level1.Buffer was %p instead of %p\n",
|
||||
U1(umi).Level1.Buffer, buffer);
|
||||
ok( U1(umi).Level1.BufferSize == 1,
|
||||
"umi.Level1.BufferSize was %u instead of 1\n",
|
||||
U1(umi).Level1.BufferSize);
|
||||
ok( U1(umi).Level1.pfnAllocate == my_alloc,
|
||||
"umi.Level1.pfnAllocate was %p instead of %p\n",
|
||||
U1(umi).Level1.pfnAllocate, my_alloc);
|
||||
ok( U1(umi).Level1.pfnFree == my_free,
|
||||
"umi.Level1.pfnFree was %p instead of %p\n",
|
||||
U1(umi).Level1.pfnFree, my_free);
|
||||
ok( U1(umi).Level1.pRpcChannelBuffer == rpc_channel_buffer,
|
||||
"umi.Level1.pRpcChannelBuffer was %p instead of %p\n",
|
||||
U1(umi).Level1.pRpcChannelBuffer, rpc_channel_buffer);
|
||||
|
||||
/* free */
|
||||
|
||||
@@ -2165,21 +2344,21 @@ static void test_NdrGetUserMarshalInfo(void)
|
||||
ok( umi.InformationLevel == 1,
|
||||
"umi.InformationLevel was %u instead of 1\n",
|
||||
umi.InformationLevel);
|
||||
ok( U(umi.Level1).Buffer == NULL,
|
||||
"U(umi.Level1).Buffer was %p instead of NULL\n",
|
||||
U(umi.Level1).Buffer);
|
||||
ok( U(umi.Level1).BufferSize == 0,
|
||||
"U(umi.Level1).BufferSize was %u instead of 0\n",
|
||||
U(umi.Level1).BufferSize);
|
||||
ok( U(umi.Level1).pfnAllocate == my_alloc,
|
||||
"U(umi.Level1).pfnAllocate was %p instead of %p\n",
|
||||
U(umi.Level1).pfnAllocate, my_alloc);
|
||||
ok( U(umi.Level1).pfnFree == my_free,
|
||||
"U(umi.Level1).pfnFree was %p instead of %p\n",
|
||||
U(umi.Level1).pfnFree, my_free);
|
||||
ok( U(umi.Level1).pRpcChannelBuffer == rpc_channel_buffer,
|
||||
"U(umi.Level1).pRpcChannelBuffer was %p instead of %p\n",
|
||||
U(umi.Level1).pRpcChannelBuffer, rpc_channel_buffer);
|
||||
ok( U1(umi).Level1.Buffer == NULL,
|
||||
"umi.Level1.Buffer was %p instead of NULL\n",
|
||||
U1(umi).Level1.Buffer);
|
||||
ok( U1(umi).Level1.BufferSize == 0,
|
||||
"umi.Level1.BufferSize was %u instead of 0\n",
|
||||
U1(umi).Level1.BufferSize);
|
||||
ok( U1(umi).Level1.pfnAllocate == my_alloc,
|
||||
"umi.Level1.pfnAllocate was %p instead of %p\n",
|
||||
U1(umi).Level1.pfnAllocate, my_alloc);
|
||||
ok( U1(umi).Level1.pfnFree == my_free,
|
||||
"umi.Level1.pfnFree was %p instead of %p\n",
|
||||
U1(umi).Level1.pfnFree, my_free);
|
||||
ok( U1(umi).Level1.pRpcChannelBuffer == rpc_channel_buffer,
|
||||
"umi.Level1.pRpcChannelBuffer was %p instead of %p\n",
|
||||
U1(umi).Level1.pRpcChannelBuffer, rpc_channel_buffer);
|
||||
|
||||
/* boundary test */
|
||||
|
||||
@@ -2194,9 +2373,9 @@ static void test_NdrGetUserMarshalInfo(void)
|
||||
|
||||
status = pNdrGetUserMarshalInfo(&umcb.Flags, 1, &umi);
|
||||
ok(status == RPC_S_OK, "NdrGetUserMarshalInfo failed with error %d\n", status);
|
||||
ok( U(umi.Level1).BufferSize == 0,
|
||||
"U(umi.Level1).BufferSize was %u instead of 0\n",
|
||||
U(umi.Level1).BufferSize);
|
||||
ok( U1(umi).Level1.BufferSize == 0,
|
||||
"umi.Level1.BufferSize was %u instead of 0\n",
|
||||
U1(umi).Level1.BufferSize);
|
||||
|
||||
/* error conditions */
|
||||
|
||||
@@ -2237,6 +2416,7 @@ START_TEST( ndr_marshall )
|
||||
test_conformant_string();
|
||||
test_nonconformant_string();
|
||||
test_conf_complex_struct();
|
||||
test_conf_complex_array();
|
||||
test_ndr_buffer();
|
||||
test_NdrMapCommAndFaultStatus();
|
||||
test_NdrGetUserMarshalInfo();
|
||||
|
||||
@@ -209,12 +209,15 @@ static RPC_IF_HANDLE IFoo_v0_0_s_ifspec = (RPC_IF_HANDLE)& IFoo___RpcServerInter
|
||||
static void test_rpc_ncacn_ip_tcp(void)
|
||||
{
|
||||
RPC_STATUS status;
|
||||
unsigned char *binding;
|
||||
unsigned char *binding, *principal;
|
||||
handle_t IFoo_IfHandle;
|
||||
ULONG level, authnsvc, authzsvc;
|
||||
RPC_AUTH_IDENTITY_HANDLE identity;
|
||||
static unsigned char foo[] = "foo";
|
||||
static unsigned char ncacn_ip_tcp[] = "ncacn_ip_tcp";
|
||||
static unsigned char address[] = "127.0.0.1";
|
||||
static unsigned char endpoint[] = "4114";
|
||||
static unsigned char spn[] = "principal";
|
||||
|
||||
status = RpcNetworkIsProtseqValid(foo);
|
||||
ok(status == RPC_S_INVALID_RPC_PROTSEQ, "return wrong\n");
|
||||
@@ -266,6 +269,29 @@ todo_wine {
|
||||
ok(status == RPC_S_OK || broken(status == RPC_S_UNKNOWN_AUTHN_SERVICE), /* win9x */
|
||||
"RpcBindingSetAuthInfo failed (%u)\n", status);
|
||||
|
||||
status = RpcBindingInqAuthInfo(IFoo_IfHandle, NULL, NULL, NULL, NULL, NULL);
|
||||
ok(status == RPC_S_BINDING_HAS_NO_AUTH, "RpcBindingInqAuthInfo failed (%u)\n",
|
||||
status);
|
||||
|
||||
status = RpcBindingSetAuthInfo(IFoo_IfHandle, spn, RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
|
||||
RPC_C_AUTHN_WINNT, NULL, RPC_C_AUTHZ_NAME);
|
||||
ok(status == RPC_S_OK, "RpcBindingSetAuthInfo failed (%u)\n", status);
|
||||
|
||||
level = authnsvc = authzsvc = 0;
|
||||
principal = (unsigned char *)0xdeadbeef;
|
||||
identity = (RPC_AUTH_IDENTITY_HANDLE *)0xdeadbeef;
|
||||
status = RpcBindingInqAuthInfo(IFoo_IfHandle, &principal, &level, &authnsvc,
|
||||
&identity, &authzsvc);
|
||||
|
||||
ok(status == RPC_S_OK, "RpcBindingInqAuthInfo failed (%u)\n", status);
|
||||
ok(identity == NULL, "expected NULL identity\n");
|
||||
ok(principal != (unsigned char *)0xdeadbeef, "expected valid principal\n");
|
||||
ok(level == RPC_C_AUTHN_LEVEL_PKT_PRIVACY, "expected RPC_C_AUTHN_LEVEL_PKT_PRIVACY\n");
|
||||
ok(authnsvc == RPC_C_AUTHN_WINNT, "expected RPC_C_AUTHN_WINNT\n");
|
||||
todo_wine ok(authzsvc == RPC_C_AUTHZ_NAME, "expected RPC_C_AUTHZ_NAME\n");
|
||||
|
||||
RpcStringFree(&principal);
|
||||
|
||||
status = RpcMgmtStopServerListening(NULL);
|
||||
ok(status == RPC_S_OK, "RpcMgmtStopServerListening failed (%u)\n",
|
||||
status);
|
||||
@@ -629,9 +655,13 @@ static void test_RpcStringBindingParseA(void)
|
||||
ok(status == RPC_S_INVALID_STRING_BINDING, "RpcStringBindingParseA should have returned RPC_S_INVALID_STRING_BINDING instead of %d\n", status);
|
||||
todo_wine
|
||||
ok(uuid == NULL, "uuid was %p instead of NULL\n", uuid);
|
||||
if (uuid)
|
||||
RpcStringFreeA(&uuid);
|
||||
ok(protseq == NULL, "protseq was %p instead of NULL\n", protseq);
|
||||
todo_wine
|
||||
ok(network_addr == NULL, "network_addr was %p instead of NULL\n", network_addr);
|
||||
if (network_addr)
|
||||
RpcStringFreeA(&network_addr);
|
||||
ok(endpoint == NULL, "endpoint was %p instead of NULL\n", endpoint);
|
||||
ok(options == NULL, "options was %p instead of NULL\n", options);
|
||||
}
|
||||
@@ -775,6 +805,67 @@ static void test_UuidCreate(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void test_UuidCreateSequential(void)
|
||||
{
|
||||
UUID guid1;
|
||||
BYTE version;
|
||||
RPC_STATUS (WINAPI *pUuidCreateSequential)(UUID *) = (void *)GetProcAddress(GetModuleHandle("rpcrt4.dll"), "UuidCreateSequential");
|
||||
RPC_STATUS ret;
|
||||
|
||||
if (!pUuidCreateSequential)
|
||||
{
|
||||
skip("UuidCreateSequential not exported\n");
|
||||
return;
|
||||
}
|
||||
ret = pUuidCreateSequential(&guid1);
|
||||
ok(!ret || ret == RPC_S_UUID_LOCAL_ONLY,
|
||||
"expected RPC_S_OK or RPC_S_UUID_LOCAL_ONLY, got %08x\n", ret);
|
||||
version = (guid1.Data3 & 0xf000) >> 12;
|
||||
ok(version == 1, "unexpected version %d\n", version);
|
||||
if (version == 1)
|
||||
{
|
||||
UUID guid2;
|
||||
|
||||
if (!ret)
|
||||
{
|
||||
/* If the call succeeded, there's a valid (non-multicast) MAC
|
||||
* address in the uuid:
|
||||
*/
|
||||
ok(!(guid1.Data4[2] & 0x01),
|
||||
"GUID does not appear to contain a MAC address\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Otherwise, there's a randomly generated multicast MAC address
|
||||
* address in the uuid:
|
||||
*/
|
||||
ok((guid1.Data4[2] & 0x01),
|
||||
"GUID does not appear to contain a multicast MAC address\n");
|
||||
}
|
||||
/* Generate another GUID, and make sure its MAC address matches the
|
||||
* first.
|
||||
*/
|
||||
ret = pUuidCreateSequential(&guid2);
|
||||
ok(!ret || ret == RPC_S_UUID_LOCAL_ONLY,
|
||||
"expected RPC_S_OK or RPC_S_UUID_LOCAL_ONLY, got %08x\n", ret);
|
||||
version = (guid2.Data3 & 0xf000) >> 12;
|
||||
ok(version == 1, "unexpected version %d\n", version);
|
||||
ok(!memcmp(guid1.Data4, guid2.Data4, sizeof(guid2.Data4)),
|
||||
"unexpected value in MAC address\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void test_RpcBindingFree(void)
|
||||
{
|
||||
RPC_BINDING_HANDLE binding = NULL;
|
||||
RPC_STATUS status;
|
||||
|
||||
status = RpcBindingFree(&binding);
|
||||
ok(status == RPC_S_INVALID_BINDING,
|
||||
"RpcBindingFree should have retured RPC_S_INVALID_BINDING instead of %d\n",
|
||||
status);
|
||||
}
|
||||
|
||||
START_TEST( rpc )
|
||||
{
|
||||
UuidConversionAndComparison();
|
||||
@@ -786,4 +877,6 @@ START_TEST( rpc )
|
||||
test_I_RpcExceptionFilter();
|
||||
test_RpcStringBindingFromBinding();
|
||||
test_UuidCreate();
|
||||
test_UuidCreateSequential();
|
||||
test_RpcBindingFree();
|
||||
}
|
||||
|
||||
@@ -157,6 +157,9 @@ static void test_endpoint_mapper(RPC_CSTR protseq, RPC_CSTR address)
|
||||
/* register endpoints created in test_RpcServerUseProtseq */
|
||||
status = RpcEpRegisterA(IFoo_v0_0_s_ifspec, binding_vector, NULL, annotation);
|
||||
ok(status == RPC_S_OK, "%s: RpcEpRegisterA failed with error %u\n", protseq, status);
|
||||
/* reregister the same endpoint with no annotation */
|
||||
status = RpcEpRegisterA(IFoo_v0_0_s_ifspec, binding_vector, NULL, NULL);
|
||||
ok(status == RPC_S_OK, "%s: RpcEpRegisterA failed with error %u\n", protseq, status);
|
||||
|
||||
status = RpcStringBindingCompose(NULL, protseq, address,
|
||||
NULL, NULL, &binding);
|
||||
@@ -170,8 +173,6 @@ static void test_endpoint_mapper(RPC_CSTR protseq, RPC_CSTR address)
|
||||
status = RpcBindingReset(handle);
|
||||
ok(status == RPC_S_OK, "%s: RpcBindingReset failed with error %u\n", protseq, status);
|
||||
|
||||
RpcStringFree(&binding);
|
||||
|
||||
status = RpcEpResolveBinding(handle, IFoo_v0_0_s_ifspec);
|
||||
ok(status == RPC_S_OK || broken(status == RPC_S_SERVER_UNAVAILABLE), /* win9x */
|
||||
"%s: RpcEpResolveBinding failed with error %u\n", protseq, status);
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
<library>pseh</library>
|
||||
<library>ole32</library>
|
||||
<library>uuid</library>
|
||||
<library>advapi32</library>
|
||||
<library>rpcrt4_winetest_server</library>
|
||||
<library>rpcrt4_winetest_client</library>
|
||||
<library>rpcrt4</library>
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
#include <secext.h>
|
||||
#include <rpcdce.h>
|
||||
#include "wine/test.h"
|
||||
#include "server_s.h"
|
||||
#include "server_defines.h"
|
||||
@@ -41,14 +43,27 @@ static void (WINAPI *pNDRSContextMarshall2)(RPC_BINDING_HANDLE, NDR_SCONTEXT, vo
|
||||
static NDR_SCONTEXT (WINAPI *pNDRSContextUnmarshall2)(RPC_BINDING_HANDLE, void*, ULONG, void*, ULONG);
|
||||
static RPC_STATUS (WINAPI *pRpcServerRegisterIfEx)(RPC_IF_HANDLE,UUID*, RPC_MGR_EPV*, unsigned int,
|
||||
unsigned int,RPC_IF_CALLBACK_FN*);
|
||||
static BOOLEAN (WINAPI *pGetUserNameExA)(EXTENDED_NAME_FORMAT, LPSTR, PULONG);
|
||||
static RPC_STATUS (WINAPI *pRpcBindingSetAuthInfoExA)(RPC_BINDING_HANDLE, RPC_CSTR, ULONG, ULONG,
|
||||
RPC_AUTH_IDENTITY_HANDLE, ULONG, RPC_SECURITY_QOS *);
|
||||
static RPC_STATUS (WINAPI *pRpcServerRegisterAuthInfoA)(RPC_CSTR, ULONG, RPC_AUTH_KEY_RETRIEVAL_FN, LPVOID);
|
||||
|
||||
static char *domain_and_user;
|
||||
|
||||
/* type check statements generated in header file */
|
||||
fnprintf *p_printf = printf;
|
||||
|
||||
static void InitFunctionPointers(void)
|
||||
{
|
||||
HMODULE hrpcrt4 = GetModuleHandleA("rpcrt4.dll");
|
||||
HMODULE hsecur32 = LoadLibraryA("secur32.dll");
|
||||
|
||||
pNDRSContextMarshall2 = (void *)GetProcAddress(hrpcrt4, "NDRSContextMarshall2");
|
||||
pNDRSContextUnmarshall2 = (void *)GetProcAddress(hrpcrt4, "NDRSContextUnmarshall2");
|
||||
pRpcServerRegisterIfEx = (void *)GetProcAddress(hrpcrt4, "RpcServerRegisterIfEx");
|
||||
pRpcBindingSetAuthInfoExA = (void *)GetProcAddress(hrpcrt4, "RpcBindingSetAuthInfoExA");
|
||||
pRpcServerRegisterAuthInfoA = (void *)GetProcAddress(hrpcrt4, "RpcServerRegisterAuthInfoA");
|
||||
pGetUserNameExA = (void *)GetProcAddress(hsecur32, "GetUserNameExA");
|
||||
|
||||
if (!pNDRSContextMarshall2) old_windows_version = TRUE;
|
||||
}
|
||||
@@ -267,12 +282,29 @@ s_sum_var_array(int x[20], int n)
|
||||
return s_sum_conf_array(x, n);
|
||||
}
|
||||
|
||||
int
|
||||
s_sum_complex_array(int n, refpint_t pi[])
|
||||
{
|
||||
int total = 0;
|
||||
for (; n > 0; n--)
|
||||
total += *pi[n - 1];
|
||||
return total;
|
||||
}
|
||||
|
||||
int
|
||||
s_dot_two_vectors(vector_t vs[2])
|
||||
{
|
||||
return vs[0].x * vs[1].x + vs[0].y * vs[1].y + vs[0].z * vs[1].z;
|
||||
}
|
||||
|
||||
void
|
||||
s_get_number_array(int x[20], int *n)
|
||||
{
|
||||
int c[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
|
||||
memcpy(x, c, sizeof(c));
|
||||
*n = sizeof(c)/sizeof(c[0]);
|
||||
}
|
||||
|
||||
int
|
||||
s_sum_cs(cs_t *cs)
|
||||
{
|
||||
@@ -571,6 +603,16 @@ s_get_filename(void)
|
||||
return (char *)__FILE__;
|
||||
}
|
||||
|
||||
int s_echo_ranged_int(int n)
|
||||
{
|
||||
return n;
|
||||
}
|
||||
|
||||
void s_get_ranged_enum(renum_t *re)
|
||||
{
|
||||
*re = RE3;
|
||||
}
|
||||
|
||||
void
|
||||
s_context_handle_test(void)
|
||||
{
|
||||
@@ -703,6 +745,21 @@ s_get_numbers_struct(numbers_struct_t **ns)
|
||||
*(*ns)->numbers[0].pi = 5;
|
||||
}
|
||||
|
||||
void
|
||||
s_full_pointer_test(int *a, int *b)
|
||||
{
|
||||
ok(*a == 42, "Expected *a to be 42 instead of %d\n", *a);
|
||||
ok(*b == 42, "Expected *b to be 42 instead of %d\n", *a);
|
||||
ok(a == b, "Expected a (%p) to point to the same memory as b (%p)\n", a, b);
|
||||
}
|
||||
|
||||
void
|
||||
s_full_pointer_null_test(int *a, int *b)
|
||||
{
|
||||
ok(*a == 42, "Expected *a to be 42 instead of %d\n", *a);
|
||||
ok(b == NULL, "Expected b to be NULL instead of %p\n", b);
|
||||
}
|
||||
|
||||
void
|
||||
s_stop(void)
|
||||
{
|
||||
@@ -762,6 +819,7 @@ basic_tests(void)
|
||||
wstr_struct_t ws = {wstring};
|
||||
str_t str;
|
||||
se_t se;
|
||||
renum_t re;
|
||||
|
||||
ok(int_return() == INT_CODE, "RPC int_return\n");
|
||||
|
||||
@@ -869,6 +927,17 @@ basic_tests(void)
|
||||
str = get_filename();
|
||||
ok(!strcmp(str, __FILE__), "get_filename() returned %s instead of %s\n", str, __FILE__);
|
||||
midl_user_free(str);
|
||||
|
||||
x = echo_ranged_int(0);
|
||||
ok(x == 0, "echo_ranged_int() returned %d instead of 0\n", x);
|
||||
x = echo_ranged_int(100);
|
||||
ok(x == 100, "echo_ranged_int() returned %d instead of 100\n", x);
|
||||
|
||||
if (!old_windows_version)
|
||||
{
|
||||
get_ranged_enum(&re);
|
||||
ok(re == RE3, "get_ranged_enum() returned %d instead of RE3\n", re);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1055,6 +1124,7 @@ pointer_tests(void)
|
||||
void *buffer;
|
||||
int *pa2;
|
||||
s123_t *s123;
|
||||
int val = 42;
|
||||
|
||||
ok(test_list_length(list) == 3, "RPC test_list_length\n");
|
||||
ok(square_puint(p1) == 121, "RPC square_puint\n");
|
||||
@@ -1115,6 +1185,9 @@ pointer_tests(void)
|
||||
s123 = get_s123();
|
||||
ok(s123->f1 == 1 && s123->f2 == 2 && s123->f3 == 3, "RPC get_s123\n");
|
||||
MIDL_user_free(s123);
|
||||
|
||||
full_pointer_test(&val, &val);
|
||||
full_pointer_null_test(&val, NULL);
|
||||
}
|
||||
|
||||
static int
|
||||
@@ -1147,6 +1220,7 @@ array_tests(void)
|
||||
};
|
||||
int c[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
|
||||
int c2[] = {10, 100, 200};
|
||||
int c3[20];
|
||||
vector_t vs[2] = {{1, -2, 3}, {4, -5, -6}};
|
||||
cps_t cps;
|
||||
cpsc_t cpsc;
|
||||
@@ -1157,6 +1231,7 @@ array_tests(void)
|
||||
int *pi;
|
||||
pints_t api[5];
|
||||
numbers_struct_t *ns;
|
||||
refpint_t rpi[5];
|
||||
|
||||
if (!old_windows_version)
|
||||
{
|
||||
@@ -1180,6 +1255,11 @@ array_tests(void)
|
||||
ok(sum_unique_conf_ptr(ca, 5) == 3, "RPC sum_unique_conf_array\n");
|
||||
ok(sum_unique_conf_ptr(NULL, 10) == 0, "RPC sum_unique_conf_array\n");
|
||||
|
||||
get_number_array(c3, &n);
|
||||
ok(n == 10, "RPC get_num_array\n");
|
||||
for (; n > 0; n--)
|
||||
ok(c3[n-1] == c[n-1], "get_num_array returned wrong value %d @ %d\n",
|
||||
c3[n-1], n);
|
||||
ok(sum_var_array(c, 10) == 45, "RPC sum_conf_array\n");
|
||||
ok(sum_var_array(&c[5], 2) == 11, "RPC sum_conf_array\n");
|
||||
ok(sum_var_array(&c[7], 1) == 7, "RPC sum_conf_array\n");
|
||||
@@ -1261,6 +1341,15 @@ array_tests(void)
|
||||
HeapFree(GetProcessHeap(), 0, ns);
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, pi);
|
||||
|
||||
pi = HeapAlloc(GetProcessHeap(), 0, 5 * sizeof(*pi));
|
||||
pi[0] = 3; rpi[0] = &pi[0];
|
||||
pi[1] = 5; rpi[1] = &pi[1];
|
||||
pi[2] = -2; rpi[2] = &pi[2];
|
||||
pi[3] = -1; rpi[3] = &pi[3];
|
||||
pi[4] = -4; rpi[4] = &pi[4];
|
||||
ok(sum_complex_array(5, rpi) == 1, "RPC sum_complex_array\n");
|
||||
HeapFree(GetProcessHeap(), 0, pi);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1273,35 +1362,90 @@ run_tests(void)
|
||||
context_handle_test();
|
||||
}
|
||||
|
||||
static void
|
||||
set_auth_info(RPC_BINDING_HANDLE handle)
|
||||
{
|
||||
RPC_STATUS status;
|
||||
RPC_SECURITY_QOS qos;
|
||||
|
||||
if (!pGetUserNameExA)
|
||||
return;
|
||||
|
||||
qos.Version = 1;
|
||||
qos.Capabilities = RPC_C_QOS_CAPABILITIES_MUTUAL_AUTH;
|
||||
qos.IdentityTracking = RPC_C_QOS_IDENTITY_STATIC;
|
||||
qos.ImpersonationType = RPC_C_IMP_LEVEL_IMPERSONATE;
|
||||
|
||||
status = pRpcBindingSetAuthInfoExA(handle, (RPC_CSTR)domain_and_user, RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
|
||||
RPC_C_AUTHN_WINNT, NULL, 0, &qos);
|
||||
ok(status == RPC_S_OK, "RpcBindingSetAuthInfoExA failed %d\n", status);
|
||||
}
|
||||
|
||||
static void
|
||||
client(const char *test)
|
||||
{
|
||||
static unsigned char iptcp[] = "ncacn_ip_tcp";
|
||||
static unsigned char np[] = "ncacn_np";
|
||||
static unsigned char ncalrpc[] = "ncalrpc";
|
||||
static unsigned char address[] = "127.0.0.1";
|
||||
static unsigned char address_np[] = "\\\\.";
|
||||
static unsigned char port[] = PORT;
|
||||
static unsigned char pipe[] = PIPE;
|
||||
static unsigned char guid[] = "00000000-4114-0704-2301-000000000000";
|
||||
|
||||
unsigned char *binding;
|
||||
|
||||
if (strcmp(test, "tcp_basic") == 0)
|
||||
{
|
||||
static unsigned char iptcp[] = "ncacn_ip_tcp";
|
||||
static unsigned char address[] = "127.0.0.1";
|
||||
static unsigned char port[] = PORT;
|
||||
unsigned char *binding;
|
||||
|
||||
ok(RPC_S_OK == RpcStringBindingCompose(NULL, iptcp, address, port, NULL, &binding), "RpcStringBindingCompose\n");
|
||||
ok(RPC_S_OK == RpcBindingFromStringBinding(binding, &IServer_IfHandle), "RpcBindingFromStringBinding\n");
|
||||
|
||||
run_tests();
|
||||
authinfo_test(RPC_PROTSEQ_TCP, 0);
|
||||
|
||||
ok(RPC_S_OK == RpcStringFree(&binding), "RpcStringFree\n");
|
||||
ok(RPC_S_OK == RpcBindingFree(&IServer_IfHandle), "RpcBindingFree\n");
|
||||
}
|
||||
else if (strcmp(test, "tcp_secure") == 0)
|
||||
{
|
||||
ok(RPC_S_OK == RpcStringBindingCompose(NULL, iptcp, address, port, NULL, &binding), "RpcStringBindingCompose\n");
|
||||
ok(RPC_S_OK == RpcBindingFromStringBinding(binding, &IServer_IfHandle), "RpcBindingFromStringBinding\n");
|
||||
|
||||
set_auth_info(IServer_IfHandle);
|
||||
authinfo_test(RPC_PROTSEQ_TCP, 1);
|
||||
|
||||
ok(RPC_S_OK == RpcStringFree(&binding), "RpcStringFree\n");
|
||||
ok(RPC_S_OK == RpcBindingFree(&IServer_IfHandle), "RpcBindingFree\n");
|
||||
}
|
||||
else if (strcmp(test, "ncalrpc_basic") == 0)
|
||||
{
|
||||
ok(RPC_S_OK == RpcStringBindingCompose(NULL, ncalrpc, NULL, guid, NULL, &binding), "RpcStringBindingCompose\n");
|
||||
ok(RPC_S_OK == RpcBindingFromStringBinding(binding, &IServer_IfHandle), "RpcBindingFromStringBinding\n");
|
||||
|
||||
run_tests(); /* can cause RPC_X_BAD_STUB_DATA exception */
|
||||
authinfo_test(RPC_PROTSEQ_LRPC, 0);
|
||||
|
||||
ok(RPC_S_OK == RpcStringFree(&binding), "RpcStringFree\n");
|
||||
ok(RPC_S_OK == RpcBindingFree(&IServer_IfHandle), "RpcBindingFree\n");
|
||||
}
|
||||
else if (strcmp(test, "ncalrpc_secure") == 0)
|
||||
{
|
||||
ok(RPC_S_OK == RpcStringBindingCompose(NULL, ncalrpc, NULL, guid, NULL, &binding), "RpcStringBindingCompose\n");
|
||||
ok(RPC_S_OK == RpcBindingFromStringBinding(binding, &IServer_IfHandle), "RpcBindingFromStringBinding\n");
|
||||
|
||||
set_auth_info(IServer_IfHandle);
|
||||
authinfo_test(RPC_PROTSEQ_LRPC, 1);
|
||||
|
||||
ok(RPC_S_OK == RpcStringFree(&binding), "RpcStringFree\n");
|
||||
ok(RPC_S_OK == RpcBindingFree(&IServer_IfHandle), "RpcBindingFree\n");
|
||||
}
|
||||
else if (strcmp(test, "np_basic") == 0)
|
||||
{
|
||||
static unsigned char np[] = "ncacn_np";
|
||||
static unsigned char address[] = "\\\\.";
|
||||
static unsigned char pipe[] = PIPE;
|
||||
unsigned char *binding;
|
||||
|
||||
ok(RPC_S_OK == RpcStringBindingCompose(NULL, np, address, pipe, NULL, &binding), "RpcStringBindingCompose\n");
|
||||
ok(RPC_S_OK == RpcStringBindingCompose(NULL, np, address_np, pipe, NULL, &binding), "RpcStringBindingCompose\n");
|
||||
ok(RPC_S_OK == RpcBindingFromStringBinding(binding, &IServer_IfHandle), "RpcBindingFromStringBinding\n");
|
||||
|
||||
run_tests();
|
||||
authinfo_test(RPC_PROTSEQ_NMP, 0);
|
||||
stop();
|
||||
|
||||
ok(RPC_S_OK == RpcStringFree(&binding), "RpcStringFree\n");
|
||||
@@ -1316,11 +1460,17 @@ server(void)
|
||||
static unsigned char port[] = PORT;
|
||||
static unsigned char np[] = "ncacn_np";
|
||||
static unsigned char pipe[] = PIPE;
|
||||
RPC_STATUS status, iptcp_status, np_status;
|
||||
static unsigned char ncalrpc[] = "ncalrpc";
|
||||
static unsigned char guid[] = "00000000-4114-0704-2301-000000000000";
|
||||
RPC_STATUS status, iptcp_status, np_status, ncalrpc_status;
|
||||
DWORD ret;
|
||||
|
||||
iptcp_status = RpcServerUseProtseqEp(iptcp, 20, port, NULL);
|
||||
ok(iptcp_status == RPC_S_OK, "RpcServerUseProtseqEp(ncacn_ip_tcp) failed with status %d\n", iptcp_status);
|
||||
|
||||
ncalrpc_status = RpcServerUseProtseqEp(ncalrpc, 0, guid, NULL);
|
||||
ok(ncalrpc_status == RPC_S_OK, "RpcServerUseProtseqEp(ncalrpc) failed with status %d\n", ncalrpc_status);
|
||||
|
||||
np_status = RpcServerUseProtseqEp(np, 0, pipe, NULL);
|
||||
if (np_status == RPC_S_PROTSEQ_NOT_SUPPORTED)
|
||||
skip("Protocol sequence ncacn_np is not supported\n");
|
||||
@@ -1345,7 +1495,19 @@ server(void)
|
||||
if (iptcp_status == RPC_S_OK)
|
||||
run_client("tcp_basic");
|
||||
else
|
||||
skip("tcp_basic tests skipped due to earlier failure\n");
|
||||
skip("tcp tests skipped due to earlier failure\n");
|
||||
|
||||
if (ncalrpc_status == RPC_S_OK)
|
||||
{
|
||||
run_client("ncalrpc_basic");
|
||||
if (pGetUserNameExA)
|
||||
{
|
||||
/* we don't need to register RPC_C_AUTHN_WINNT for ncalrpc */
|
||||
run_client("ncalrpc_secure");
|
||||
}
|
||||
}
|
||||
else
|
||||
skip("lrpc tests skipped due to earlier failure\n");
|
||||
|
||||
if (np_status == RPC_S_OK)
|
||||
run_client("np_basic");
|
||||
@@ -1376,6 +1538,16 @@ START_TEST(server)
|
||||
|
||||
InitFunctionPointers();
|
||||
|
||||
if (pGetUserNameExA)
|
||||
{
|
||||
ULONG size = 0;
|
||||
ok(!pGetUserNameExA(NameSamCompatible, NULL, &size), "GetUserNameExA\n");
|
||||
domain_and_user = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
ok(pGetUserNameExA(NameSamCompatible, domain_and_user, &size), "GetUserNameExA\n");
|
||||
}
|
||||
else
|
||||
win_skip("GetUserNameExA is needed for some authentication tests\n");
|
||||
|
||||
argc = winetest_get_mainargs(&argv);
|
||||
progname = argv[0];
|
||||
|
||||
@@ -1393,4 +1565,6 @@ START_TEST(server)
|
||||
}
|
||||
else
|
||||
server();
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, domain_and_user);
|
||||
}
|
||||
|
||||
@@ -27,6 +27,8 @@ typedef struct tag_vector
|
||||
int z;
|
||||
} vector_t;
|
||||
|
||||
typedef int fnprintf(const char *format, ...);
|
||||
|
||||
[
|
||||
uuid(00000000-4114-0704-2301-000000000000),
|
||||
#ifndef __midl
|
||||
@@ -118,6 +120,8 @@ cpp_quote("#endif")
|
||||
} u;
|
||||
} test_list_t;
|
||||
|
||||
typedef [ref] int *refpint_t;
|
||||
|
||||
int test_list_length(test_list_t *ls);
|
||||
int sum_fixed_int_3d(int m[2][3][4]);
|
||||
int sum_conf_array([size_is(n)] int x[], int n);
|
||||
@@ -126,6 +130,7 @@ cpp_quote("#endif")
|
||||
int sum_unique_conf_ptr([size_is(n), unique] int *x, int n);
|
||||
int sum_var_array([length_is(n)] int x[20], int n);
|
||||
int dot_two_vectors(vector_t vs[2]);
|
||||
void get_number_array([out, length_is(*n)] int x[20], [out] int *n);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -152,6 +157,7 @@ cpp_quote("#endif")
|
||||
int sum_cs(cs_t *cs);
|
||||
int sum_cps(cps_t *cps);
|
||||
int sum_cpsc(cpsc_t *cpsc);
|
||||
int sum_complex_array(int n, refpint_t pi[n]);
|
||||
|
||||
typedef [wire_marshal(int)] void *puint_t;
|
||||
int square_puint(puint_t p);
|
||||
@@ -339,6 +345,27 @@ cpp_quote("#endif")
|
||||
void get_numbers_struct([out] numbers_struct_t **ns);
|
||||
|
||||
str_t get_filename(void);
|
||||
|
||||
enum renum
|
||||
{
|
||||
RE0,
|
||||
RE1,
|
||||
RE2,
|
||||
RE3,
|
||||
};
|
||||
const int RE_MIN = RE0;
|
||||
const int RE_MAX = RE3;
|
||||
typedef [range(RE_MIN, RE_MAX)] enum renum renum_t;
|
||||
typedef [range(0, 100)] int rint_t;
|
||||
rint_t echo_ranged_int([range(0, 100)] int n);
|
||||
void get_ranged_enum([out] renum_t *re);
|
||||
|
||||
void context_handle_test(void);
|
||||
|
||||
void full_pointer_test([in, ptr] int *a, [in, ptr] int *b);
|
||||
void full_pointer_null_test([in, ptr] int *a, [in, ptr] int *b);
|
||||
|
||||
void authinfo_test(unsigned int protseq, int secure);
|
||||
|
||||
void stop(void);
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <sspi.h>
|
||||
#include <rpc.h>
|
||||
#include <rpcdce.h>
|
||||
#include <secext.h>
|
||||
|
||||
#include "wine/test.h"
|
||||
|
||||
@@ -59,10 +60,11 @@ static SECURITY_STATUS (SEC_ENTRY * pEncryptMessage)(PCtxtHandle, ULONG,
|
||||
PSecBufferDesc, ULONG);
|
||||
static SECURITY_STATUS (SEC_ENTRY * pDecryptMessage)(PCtxtHandle, PSecBufferDesc,
|
||||
ULONG, PULONG);
|
||||
static BOOLEAN (WINAPI * pGetUserNameExA)(EXTENDED_NAME_FORMAT, LPSTR, PULONG);
|
||||
|
||||
typedef struct _SspiData {
|
||||
PCredHandle cred;
|
||||
PCtxtHandle ctxt;
|
||||
CredHandle cred;
|
||||
CtxtHandle ctxt;
|
||||
PSecBufferDesc in_buf;
|
||||
PSecBufferDesc out_buf;
|
||||
PSEC_WINNT_AUTH_IDENTITY id;
|
||||
@@ -168,6 +170,7 @@ static void InitFunctionPtrs(void)
|
||||
pVerifySignature = (PVOID)GetProcAddress(secdll, "VerifySignature");
|
||||
pEncryptMessage = (PVOID)GetProcAddress(secdll, "EncryptMessage");
|
||||
pDecryptMessage = (PVOID)GetProcAddress(secdll, "DecryptMessage");
|
||||
pGetUserNameExA = (PVOID)GetProcAddress(secdll, "GetUserNameExA");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -310,17 +313,15 @@ static SECURITY_STATUS setupClient(SspiData *sspi_data, SEC_CHAR *provider)
|
||||
|
||||
trace("Running setupClient\n");
|
||||
|
||||
sspi_data->cred = HeapAlloc(GetProcessHeap(), 0, sizeof(CredHandle));
|
||||
sspi_data->ctxt = HeapAlloc(GetProcessHeap(), 0, sizeof(CtxtHandle));
|
||||
|
||||
ret = pQuerySecurityPackageInfoA(provider, &sec_pkg_info);
|
||||
|
||||
ok(ret == SEC_E_OK, "QuerySecurityPackageInfo returned %s\n", getSecError(ret));
|
||||
|
||||
setupBuffers(sspi_data, sec_pkg_info);
|
||||
pFreeContextBuffer(sec_pkg_info);
|
||||
|
||||
if((ret = pAcquireCredentialsHandleA(NULL, provider, SECPKG_CRED_OUTBOUND,
|
||||
NULL, sspi_data->id, NULL, NULL, sspi_data->cred, &ttl))
|
||||
NULL, sspi_data->id, NULL, NULL, &sspi_data->cred, &ttl))
|
||||
!= SEC_E_OK)
|
||||
{
|
||||
trace("AcquireCredentialsHandle() returned %s\n", getSecError(ret));
|
||||
@@ -341,17 +342,15 @@ static SECURITY_STATUS setupServer(SspiData *sspi_data, SEC_CHAR *provider)
|
||||
|
||||
trace("Running setupServer\n");
|
||||
|
||||
sspi_data->cred = HeapAlloc(GetProcessHeap(), 0, sizeof(CredHandle));
|
||||
sspi_data->ctxt = HeapAlloc(GetProcessHeap(), 0, sizeof(CtxtHandle));
|
||||
|
||||
ret = pQuerySecurityPackageInfoA(provider, &sec_pkg_info);
|
||||
|
||||
ok(ret == SEC_E_OK, "QuerySecurityPackageInfo returned %s\n", getSecError(ret));
|
||||
|
||||
setupBuffers(sspi_data, sec_pkg_info);
|
||||
pFreeContextBuffer(sec_pkg_info);
|
||||
|
||||
if((ret = pAcquireCredentialsHandleA(NULL, provider, SECPKG_CRED_INBOUND,
|
||||
NULL, NULL, NULL, NULL, sspi_data->cred, &ttl)) != SEC_E_OK)
|
||||
NULL, NULL, NULL, NULL, &sspi_data->cred, &ttl)) != SEC_E_OK)
|
||||
{
|
||||
trace("AcquireCredentialsHandle() returned %s\n", getSecError(ret));
|
||||
}
|
||||
@@ -371,14 +370,12 @@ static SECURITY_STATUS setupFakeServer(SspiData *sspi_data, SEC_CHAR *provider)
|
||||
|
||||
trace("Running setupFakeServer\n");
|
||||
|
||||
sspi_data->cred = HeapAlloc(GetProcessHeap(), 0, sizeof(CredHandle));
|
||||
sspi_data->ctxt = HeapAlloc(GetProcessHeap(), 0, sizeof(CtxtHandle));
|
||||
|
||||
ret = pQuerySecurityPackageInfoA(provider, &sec_pkg_info);
|
||||
|
||||
ok(ret == SEC_E_OK, "QuerySecurityPackageInfo returned %s\n", getSecError(ret));
|
||||
|
||||
ret = setupBuffers(sspi_data, sec_pkg_info);
|
||||
pFreeContextBuffer(sec_pkg_info);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -419,8 +416,8 @@ static SECURITY_STATUS runClient(SspiData *sspi_data, BOOL first, ULONG data_rep
|
||||
void *old_buf;
|
||||
|
||||
/* pass NULL as an output buffer */
|
||||
ret = pInitializeSecurityContextA(sspi_data->cred, NULL, NULL, req_attr,
|
||||
0, data_rep, NULL, 0, sspi_data->ctxt, NULL,
|
||||
ret = pInitializeSecurityContextA(&sspi_data->cred, NULL, NULL, req_attr,
|
||||
0, data_rep, NULL, 0, &sspi_data->ctxt, NULL,
|
||||
&ctxt_attr, &ttl);
|
||||
|
||||
ok(ret == SEC_E_BUFFER_TOO_SMALL, "expected SEC_E_BUFFER_TOO_SMALL, got %s\n", getSecError(ret));
|
||||
@@ -429,19 +426,20 @@ static SECURITY_STATUS runClient(SspiData *sspi_data, BOOL first, ULONG data_rep
|
||||
old_buf = out_buf->pBuffers[0].pvBuffer;
|
||||
out_buf->pBuffers[0].pvBuffer = NULL;
|
||||
|
||||
ret = pInitializeSecurityContextA(sspi_data->cred, NULL, NULL, req_attr,
|
||||
0, data_rep, NULL, 0, sspi_data->ctxt, out_buf,
|
||||
ret = pInitializeSecurityContextA(&sspi_data->cred, NULL, NULL, req_attr,
|
||||
0, data_rep, NULL, 0, &sspi_data->ctxt, out_buf,
|
||||
&ctxt_attr, &ttl);
|
||||
|
||||
ok(ret == SEC_E_INTERNAL_ERROR, "expected SEC_E_INTERNAL_ERROR, got %s\n", getSecError(ret));
|
||||
ok(ret == SEC_E_INTERNAL_ERROR || ret == SEC_I_CONTINUE_NEEDED,
|
||||
"expected SEC_E_INTERNAL_ERROR or SEC_I_CONTINUE_NEEDED, got %s\n", getSecError(ret));
|
||||
|
||||
out_buf->pBuffers[0].pvBuffer = old_buf;
|
||||
|
||||
/* pass an output buffer of 0 size */
|
||||
out_buf->pBuffers[0].cbBuffer = 0;
|
||||
|
||||
ret = pInitializeSecurityContextA(sspi_data->cred, NULL, NULL, req_attr,
|
||||
0, data_rep, NULL, 0, sspi_data->ctxt, out_buf,
|
||||
ret = pInitializeSecurityContextA(&sspi_data->cred, NULL, NULL, req_attr,
|
||||
0, data_rep, NULL, 0, &sspi_data->ctxt, out_buf,
|
||||
&ctxt_attr, &ttl);
|
||||
|
||||
ok(ret == SEC_E_BUFFER_TOO_SMALL, "expected SEC_E_BUFFER_TOO_SMALL, got %s\n", getSecError(ret));
|
||||
@@ -452,8 +450,8 @@ static SECURITY_STATUS runClient(SspiData *sspi_data, BOOL first, ULONG data_rep
|
||||
out_buf->pBuffers[0].cbBuffer = sspi_data->max_token;
|
||||
out_buf->pBuffers[0].BufferType = SECBUFFER_DATA;
|
||||
|
||||
ret = pInitializeSecurityContextA(sspi_data->cred, NULL, NULL, req_attr,
|
||||
0, data_rep, NULL, 0, sspi_data->ctxt, out_buf,
|
||||
ret = pInitializeSecurityContextA(&sspi_data->cred, NULL, NULL, req_attr,
|
||||
0, data_rep, NULL, 0, &sspi_data->ctxt, out_buf,
|
||||
&ctxt_attr, &ttl);
|
||||
|
||||
ok(ret == SEC_E_BUFFER_TOO_SMALL, "expected SEC_E_BUFFER_TOO_SMALL, got %s\n", getSecError(ret));
|
||||
@@ -462,13 +460,13 @@ static SECURITY_STATUS runClient(SspiData *sspi_data, BOOL first, ULONG data_rep
|
||||
|
||||
out_buf->pBuffers[0].cbBuffer = sspi_data->max_token;
|
||||
|
||||
ret = pInitializeSecurityContextA(first?sspi_data->cred:NULL, first?NULL:sspi_data->ctxt, NULL, req_attr,
|
||||
0, data_rep, first?NULL:in_buf, 0, sspi_data->ctxt, out_buf,
|
||||
ret = pInitializeSecurityContextA(first?&sspi_data->cred:NULL, first?NULL:&sspi_data->ctxt, NULL, req_attr,
|
||||
0, data_rep, first?NULL:in_buf, 0, &sspi_data->ctxt, out_buf,
|
||||
&ctxt_attr, &ttl);
|
||||
|
||||
if(ret == SEC_I_COMPLETE_AND_CONTINUE || ret == SEC_I_COMPLETE_NEEDED)
|
||||
{
|
||||
pCompleteAuthToken(sspi_data->ctxt, out_buf);
|
||||
pCompleteAuthToken(&sspi_data->ctxt, out_buf);
|
||||
if(ret == SEC_I_COMPLETE_AND_CONTINUE)
|
||||
ret = SEC_I_CONTINUE_NEEDED;
|
||||
else if(ret == SEC_I_COMPLETE_NEEDED)
|
||||
@@ -493,13 +491,13 @@ static SECURITY_STATUS runServer(SspiData *sspi_data, BOOL first, ULONG data_rep
|
||||
|
||||
trace("Running the server the %s time\n", first?"first":"second");
|
||||
|
||||
ret = pAcceptSecurityContext(sspi_data->cred, first?NULL:sspi_data->ctxt,
|
||||
sspi_data->in_buf, 0, data_rep, sspi_data->ctxt,
|
||||
ret = pAcceptSecurityContext(&sspi_data->cred, first?NULL:&sspi_data->ctxt,
|
||||
sspi_data->in_buf, 0, data_rep, &sspi_data->ctxt,
|
||||
sspi_data->out_buf, &ctxt_attr, &ttl);
|
||||
|
||||
if(ret == SEC_I_COMPLETE_AND_CONTINUE || ret == SEC_I_COMPLETE_NEEDED)
|
||||
{
|
||||
pCompleteAuthToken(sspi_data->ctxt, sspi_data->out_buf);
|
||||
pCompleteAuthToken(&sspi_data->ctxt, sspi_data->out_buf);
|
||||
if(ret == SEC_I_COMPLETE_AND_CONTINUE)
|
||||
ret = SEC_I_CONTINUE_NEEDED;
|
||||
else if(ret == SEC_I_COMPLETE_NEEDED)
|
||||
@@ -611,8 +609,8 @@ static void testInitializeSecurityContextFlags(void)
|
||||
/* Without any flags, the lowest byte should not have bits 0x20 or 0x10 set*/
|
||||
req_attr = 0;
|
||||
|
||||
if((sec_status = pInitializeSecurityContextA(client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, client.ctxt, client.out_buf,
|
||||
if((sec_status = pInitializeSecurityContextA(&client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, &client.ctxt, client.out_buf,
|
||||
&ctxt_attr, &ttl)) != SEC_I_CONTINUE_NEEDED)
|
||||
{
|
||||
trace("InitializeSecurityContext returned %s not SEC_I_CONTINUE_NEEDED, aborting.\n",
|
||||
@@ -623,12 +621,13 @@ static void testInitializeSecurityContextFlags(void)
|
||||
ok(((packet[12] & 0x10) == 0) && ((packet[12] & 0x20) == 0),
|
||||
"With req_attr == 0, flags are 0x%02x%02x%02x%02x.\n",
|
||||
packet[15], packet[14], packet[13], packet[12]);
|
||||
pDeleteSecurityContext(&client.ctxt);
|
||||
|
||||
/* With ISC_REQ_CONNECTION, the lowest byte should not have bits 0x20 or 0x10 set*/
|
||||
req_attr = ISC_REQ_CONNECTION;
|
||||
|
||||
if((sec_status = pInitializeSecurityContextA(client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, client.ctxt, client.out_buf,
|
||||
if((sec_status = pInitializeSecurityContextA(&client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, &client.ctxt, client.out_buf,
|
||||
&ctxt_attr, &ttl)) != SEC_I_CONTINUE_NEEDED)
|
||||
{
|
||||
trace("InitializeSecurityContext returned %s not SEC_I_CONTINUE_NEEDED, aborting.\n",
|
||||
@@ -639,12 +638,13 @@ static void testInitializeSecurityContextFlags(void)
|
||||
ok(((packet[12] & 0x10) == 0) && ((packet[12] & 0x20) == 0),
|
||||
"For ISC_REQ_CONNECTION, flags are 0x%02x%02x%02x%02x.\n",
|
||||
packet[15], packet[14], packet[13], packet[12]);
|
||||
pDeleteSecurityContext(&client.ctxt);
|
||||
|
||||
/* With ISC_REQ_EXTENDED_ERROR, the lowest byte should not have bits 0x20 or 0x10 set*/
|
||||
req_attr = ISC_REQ_EXTENDED_ERROR;
|
||||
|
||||
if((sec_status = pInitializeSecurityContextA(client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, client.ctxt, client.out_buf,
|
||||
if((sec_status = pInitializeSecurityContextA(&client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, &client.ctxt, client.out_buf,
|
||||
&ctxt_attr, &ttl)) != SEC_I_CONTINUE_NEEDED)
|
||||
{
|
||||
trace("InitializeSecurityContext returned %s not SEC_I_CONTINUE_NEEDED, aborting.\n",
|
||||
@@ -655,12 +655,13 @@ static void testInitializeSecurityContextFlags(void)
|
||||
ok(((packet[12] & 0x10) == 0) && ((packet[12] & 0x20) == 0),
|
||||
"For ISC_REQ_EXTENDED_ERROR, flags are 0x%02x%02x%02x%02x.\n",
|
||||
packet[15], packet[14], packet[13], packet[12]);
|
||||
pDeleteSecurityContext(&client.ctxt);
|
||||
|
||||
/* With ISC_REQ_MUTUAL_AUTH, the lowest byte should not have bits 0x20 or 0x10 set*/
|
||||
req_attr = ISC_REQ_MUTUAL_AUTH;
|
||||
|
||||
if((sec_status = pInitializeSecurityContextA(client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, client.ctxt, client.out_buf,
|
||||
if((sec_status = pInitializeSecurityContextA(&client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, &client.ctxt, client.out_buf,
|
||||
&ctxt_attr, &ttl)) != SEC_I_CONTINUE_NEEDED)
|
||||
{
|
||||
trace("InitializeSecurityContext returned %s not SEC_I_CONTINUE_NEEDED, aborting.\n",
|
||||
@@ -671,12 +672,13 @@ static void testInitializeSecurityContextFlags(void)
|
||||
ok(((packet[12] & 0x10) == 0) && ((packet[12] & 0x20) == 0),
|
||||
"For ISC_REQ_MUTUAL_AUTH, flags are 0x%02x%02x%02x%02x.\n",
|
||||
packet[15], packet[14], packet[13], packet[12]);
|
||||
pDeleteSecurityContext(&client.ctxt);
|
||||
|
||||
/* With ISC_REQ_USE_DCE_STYLE, the lowest byte should not have bits 0x20 or 0x10 set*/
|
||||
req_attr = ISC_REQ_USE_DCE_STYLE;
|
||||
|
||||
if((sec_status = pInitializeSecurityContextA(client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, client.ctxt, client.out_buf,
|
||||
if((sec_status = pInitializeSecurityContextA(&client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, &client.ctxt, client.out_buf,
|
||||
&ctxt_attr, &ttl)) != SEC_I_CONTINUE_NEEDED)
|
||||
{
|
||||
trace("InitializeSecurityContext returned %s not SEC_I_CONTINUE_NEEDED, aborting.\n",
|
||||
@@ -687,12 +689,13 @@ static void testInitializeSecurityContextFlags(void)
|
||||
ok(((packet[12] & 0x10) == 0) && ((packet[12] & 0x20) == 0),
|
||||
"For ISC_REQ_USE_DCE_STYLE, flags are 0x%02x%02x%02x%02x.\n",
|
||||
packet[15], packet[14], packet[13], packet[12]);
|
||||
pDeleteSecurityContext(&client.ctxt);
|
||||
|
||||
/* With ISC_REQ_DELEGATE, the lowest byte should not have bits 0x20 or 0x10 set*/
|
||||
req_attr = ISC_REQ_DELEGATE;
|
||||
|
||||
if((sec_status = pInitializeSecurityContextA(client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, client.ctxt, client.out_buf,
|
||||
if((sec_status = pInitializeSecurityContextA(&client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, &client.ctxt, client.out_buf,
|
||||
&ctxt_attr, &ttl)) != SEC_I_CONTINUE_NEEDED)
|
||||
{
|
||||
trace("InitializeSecurityContext returned %s not SEC_I_CONTINUE_NEEDED, aborting.\n",
|
||||
@@ -703,12 +706,13 @@ static void testInitializeSecurityContextFlags(void)
|
||||
ok(((packet[12] & 0x10) == 0) && ((packet[12] & 0x20) == 0),
|
||||
"For ISC_REQ_DELEGATE, flags are 0x%02x%02x%02x%02x.\n",
|
||||
packet[15], packet[14], packet[13], packet[12]);
|
||||
pDeleteSecurityContext(&client.ctxt);
|
||||
|
||||
/* With ISC_REQ_INTEGRITY, the lowest byte should have bit 0x10 set */
|
||||
req_attr = ISC_REQ_INTEGRITY;
|
||||
|
||||
if((sec_status = pInitializeSecurityContextA(client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, client.ctxt, client.out_buf,
|
||||
if((sec_status = pInitializeSecurityContextA(&client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, &client.ctxt, client.out_buf,
|
||||
&ctxt_attr, &ttl)) != SEC_I_CONTINUE_NEEDED)
|
||||
{
|
||||
trace("InitializeSecurityContext returned %s not SEC_I_CONTINUE_NEEDED, aborting.\n",
|
||||
@@ -719,12 +723,13 @@ static void testInitializeSecurityContextFlags(void)
|
||||
ok((packet[12] & 0x10) != 0,
|
||||
"For ISC_REQ_INTEGRITY, flags are 0x%02x%02x%02x%02x.\n",
|
||||
packet[15], packet[14], packet[13], packet[12]);
|
||||
pDeleteSecurityContext(&client.ctxt);
|
||||
|
||||
/* With ISC_REQ_REPLAY_DETECT, the lowest byte should have bit 0x10 set */
|
||||
req_attr = ISC_REQ_REPLAY_DETECT;
|
||||
|
||||
if((sec_status = pInitializeSecurityContextA(client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, client.ctxt, client.out_buf,
|
||||
if((sec_status = pInitializeSecurityContextA(&client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, &client.ctxt, client.out_buf,
|
||||
&ctxt_attr, &ttl)) != SEC_I_CONTINUE_NEEDED)
|
||||
{
|
||||
trace("InitializeSecurityContext returned %s not SEC_I_CONTINUE_NEEDED, aborting.\n",
|
||||
@@ -735,12 +740,13 @@ static void testInitializeSecurityContextFlags(void)
|
||||
ok((packet[12] & 0x10) != 0,
|
||||
"For ISC_REQ_REPLAY_DETECT, flags are 0x%02x%02x%02x%02x.\n",
|
||||
packet[15], packet[14], packet[13], packet[12]);
|
||||
pDeleteSecurityContext(&client.ctxt);
|
||||
|
||||
/* With ISC_REQ_SEQUENCE_DETECT, the lowest byte should have bit 0x10 set */
|
||||
req_attr = ISC_REQ_SEQUENCE_DETECT;
|
||||
|
||||
if((sec_status = pInitializeSecurityContextA(client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, client.ctxt, client.out_buf,
|
||||
if((sec_status = pInitializeSecurityContextA(&client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, &client.ctxt, client.out_buf,
|
||||
&ctxt_attr, &ttl)) != SEC_I_CONTINUE_NEEDED)
|
||||
{
|
||||
trace("InitializeSecurityContext returned %s not SEC_I_CONTINUE_NEEDED, aborting.\n",
|
||||
@@ -751,12 +757,13 @@ static void testInitializeSecurityContextFlags(void)
|
||||
ok((packet[12] & 0x10) != 0,
|
||||
"For ISC_REQ_SEQUENCE_DETECT, flags are 0x%02x%02x%02x%02x.\n",
|
||||
packet[15], packet[14], packet[13], packet[12]);
|
||||
pDeleteSecurityContext(&client.ctxt);
|
||||
|
||||
/* With ISC_REQ_CONFIDENTIALITY, the lowest byte should have bit 0x20 set */
|
||||
req_attr = ISC_REQ_CONFIDENTIALITY;
|
||||
|
||||
if((sec_status = pInitializeSecurityContextA(client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, client.ctxt, client.out_buf,
|
||||
if((sec_status = pInitializeSecurityContextA(&client.cred, NULL, NULL, req_attr,
|
||||
0, SECURITY_NETWORK_DREP, NULL, 0, &client.ctxt, client.out_buf,
|
||||
&ctxt_attr, &ttl)) != SEC_I_CONTINUE_NEEDED)
|
||||
{
|
||||
trace("InitializeSecurityContext returned %s not SEC_I_CONTINUE_NEEDED, aborting.\n",
|
||||
@@ -767,11 +774,11 @@ static void testInitializeSecurityContextFlags(void)
|
||||
ok((packet[12] & 0x20) != 0,
|
||||
"For ISC_REQ_CONFIDENTIALITY, flags are 0x%02x%02x%02x%02x.\n",
|
||||
packet[15], packet[14], packet[13], packet[12]);
|
||||
pDeleteSecurityContext(&client.ctxt);
|
||||
|
||||
tISCFend:
|
||||
cleanupBuffers(&client);
|
||||
pFreeCredentialsHandle(client.cred);
|
||||
|
||||
pFreeCredentialsHandle(&client.cred);
|
||||
}
|
||||
|
||||
/**********************************************************************/
|
||||
@@ -814,7 +821,7 @@ static void testAuth(ULONG data_rep, BOOL fake)
|
||||
{
|
||||
skip("Error: Setting up the client returned %s, exiting test!\n",
|
||||
getSecError(sec_status));
|
||||
pFreeCredentialsHandle(client.cred);
|
||||
pFreeCredentialsHandle(&client.cred);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -827,8 +834,8 @@ static void testAuth(ULONG data_rep, BOOL fake)
|
||||
{
|
||||
skip("Error: Setting up the server returned %s, exiting test!\n",
|
||||
getSecError(sec_status));
|
||||
pFreeCredentialsHandle(server.cred);
|
||||
pFreeCredentialsHandle(client.cred);
|
||||
pFreeCredentialsHandle(&server.cred);
|
||||
pFreeCredentialsHandle(&client.cred);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -863,7 +870,7 @@ static void testAuth(ULONG data_rep, BOOL fake)
|
||||
goto tAuthend;
|
||||
}
|
||||
|
||||
sec_status = pQueryContextAttributesA(client.ctxt,
|
||||
sec_status = pQueryContextAttributesA(&client.ctxt,
|
||||
SECPKG_ATTR_SIZES, &ctxt_sizes);
|
||||
|
||||
ok(sec_status == SEC_E_OK,
|
||||
@@ -888,23 +895,23 @@ tAuthend:
|
||||
|
||||
if(!fake)
|
||||
{
|
||||
sec_status = pDeleteSecurityContext(server.ctxt);
|
||||
sec_status = pDeleteSecurityContext(&server.ctxt);
|
||||
ok(sec_status == SEC_E_OK, "DeleteSecurityContext(server) returned %s\n",
|
||||
getSecError(sec_status));
|
||||
}
|
||||
|
||||
sec_status = pDeleteSecurityContext(client.ctxt);
|
||||
sec_status = pDeleteSecurityContext(&client.ctxt);
|
||||
ok(sec_status == SEC_E_OK, "DeleteSecurityContext(client) returned %s\n",
|
||||
getSecError(sec_status));
|
||||
|
||||
if(!fake)
|
||||
{
|
||||
sec_status = pFreeCredentialsHandle(server.cred);
|
||||
sec_status = pFreeCredentialsHandle(&server.cred);
|
||||
ok(sec_status == SEC_E_OK, "FreeCredentialsHandle(server) returned %s\n",
|
||||
getSecError(sec_status));
|
||||
}
|
||||
|
||||
sec_status = pFreeCredentialsHandle(client.cred);
|
||||
sec_status = pFreeCredentialsHandle(&client.cred);
|
||||
ok(sec_status == SEC_E_OK, "FreeCredentialsHandle(client) returned %s\n",
|
||||
getSecError(sec_status));
|
||||
}
|
||||
@@ -956,7 +963,7 @@ static void testSignSeal(void)
|
||||
{
|
||||
skip("Error: Setting up the client returned %s, exiting test!\n",
|
||||
getSecError(sec_status));
|
||||
pFreeCredentialsHandle(client.cred);
|
||||
pFreeCredentialsHandle(&client.cred);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -979,7 +986,7 @@ static void testSignSeal(void)
|
||||
* Now start with the actual testing *
|
||||
********************************************/
|
||||
|
||||
if(pQueryContextAttributesA(client.ctxt, SECPKG_ATTR_SIZES,
|
||||
if(pQueryContextAttributesA(&client.ctxt, SECPKG_ATTR_SIZES,
|
||||
&ctxt_sizes) != SEC_E_OK)
|
||||
{
|
||||
skip("Failed to get context sizes, aborting test.\n");
|
||||
@@ -999,7 +1006,7 @@ static void testSignSeal(void)
|
||||
fake_data[1].cbBuffer = lstrlen(message);
|
||||
fake_data[1].pvBuffer = HeapAlloc(GetProcessHeap(), 0, fake_data[1].cbBuffer);
|
||||
|
||||
sec_status = pMakeSignature(client.ctxt, 0, &crypt, 0);
|
||||
sec_status = pMakeSignature(&client.ctxt, 0, &crypt, 0);
|
||||
ok(sec_status == SEC_E_INVALID_TOKEN,
|
||||
"MakeSignature returned %s, not SEC_E_INVALID_TOKEN.\n",
|
||||
getSecError(sec_status));
|
||||
@@ -1019,7 +1026,7 @@ static void testSignSeal(void)
|
||||
* we should get the same signature for our data, no matter if
|
||||
* it is sent by the client or the server
|
||||
*/
|
||||
sec_status = pMakeSignature(client.ctxt, 0, &crypt, 0);
|
||||
sec_status = pMakeSignature(&client.ctxt, 0, &crypt, 0);
|
||||
ok(sec_status == SEC_E_OK, "MakeSignature returned %s, not SEC_E_OK.\n",
|
||||
getSecError(sec_status));
|
||||
ok(!memcmp(crypt.pBuffers[0].pvBuffer, message_signature,
|
||||
@@ -1029,18 +1036,18 @@ static void testSignSeal(void)
|
||||
|
||||
memcpy(data[0].pvBuffer, crypt_trailer_client, data[0].cbBuffer);
|
||||
|
||||
sec_status = pVerifySignature(client.ctxt, &crypt, 0, &qop);
|
||||
sec_status = pVerifySignature(&client.ctxt, &crypt, 0, &qop);
|
||||
ok(sec_status == SEC_E_MESSAGE_ALTERED,
|
||||
"VerifySignature returned %s, not SEC_E_MESSAGE_ALTERED.\n",
|
||||
getSecError(sec_status));
|
||||
|
||||
memcpy(data[0].pvBuffer, message_signature, data[0].cbBuffer);
|
||||
|
||||
sec_status = pVerifySignature(client.ctxt, &crypt, 0, &qop);
|
||||
sec_status = pVerifySignature(&client.ctxt, &crypt, 0, &qop);
|
||||
ok(sec_status == SEC_E_OK, "VerifySignature returned %s, not SEC_E_OK.\n",
|
||||
getSecError(sec_status));
|
||||
|
||||
sec_status = pEncryptMessage(client.ctxt, 0, &crypt, 0);
|
||||
sec_status = pEncryptMessage(&client.ctxt, 0, &crypt, 0);
|
||||
if (sec_status == SEC_E_UNSUPPORTED_FUNCTION)
|
||||
{
|
||||
skip("Encrypt message returned SEC_E_UNSUPPORTED_FUNCTION. "
|
||||
@@ -1052,15 +1059,39 @@ static void testSignSeal(void)
|
||||
|
||||
ok(!memcmp(crypt.pBuffers[0].pvBuffer, crypt_trailer_client,
|
||||
crypt.pBuffers[0].cbBuffer), "Crypt trailer not as expected.\n");
|
||||
if (memcmp(crypt.pBuffers[0].pvBuffer, crypt_trailer_client,
|
||||
crypt.pBuffers[0].cbBuffer))
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < crypt.pBuffers[0].cbBuffer; i++)
|
||||
{
|
||||
if (i % 8 == 0) printf(" ");
|
||||
printf("0x%02x,", ((unsigned char *)crypt.pBuffers[0].pvBuffer)[i]);
|
||||
if (i % 8 == 7) printf("\n");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
ok(!memcmp(crypt.pBuffers[1].pvBuffer, crypt_message_client,
|
||||
crypt.pBuffers[1].cbBuffer), "Crypt message not as expected.\n");
|
||||
if (memcmp(crypt.pBuffers[1].pvBuffer, crypt_message_client,
|
||||
crypt.pBuffers[1].cbBuffer))
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < crypt.pBuffers[1].cbBuffer; i++)
|
||||
{
|
||||
if (i % 8 == 0) printf(" ");
|
||||
printf("0x%02x,", ((unsigned char *)crypt.pBuffers[1].pvBuffer)[i]);
|
||||
if (i % 8 == 7) printf("\n");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
data[0].cbBuffer = sizeof(crypt_trailer_server);
|
||||
data[1].cbBuffer = sizeof(crypt_message_server);
|
||||
memcpy(data[0].pvBuffer, crypt_trailer_server, data[0].cbBuffer);
|
||||
memcpy(data[1].pvBuffer, crypt_message_server, data[1].cbBuffer);
|
||||
|
||||
sec_status = pDecryptMessage(client.ctxt, &crypt, 0, &qop);
|
||||
sec_status = pDecryptMessage(&client.ctxt, &crypt, 0, &qop);
|
||||
|
||||
ok(sec_status == SEC_E_OK, "DecryptMessage returned %s, not SEC_E_OK.\n",
|
||||
getSecError(sec_status));
|
||||
@@ -1091,7 +1122,7 @@ static void testSignSeal(void)
|
||||
complex_data[3].pvBuffer = HeapAlloc(GetProcessHeap(), 0, complex_data[3].cbBuffer);
|
||||
|
||||
/* We should get a dummy signature again. */
|
||||
sec_status = pMakeSignature(client.ctxt, 0, &crypt, 0);
|
||||
sec_status = pMakeSignature(&client.ctxt, 0, &crypt, 0);
|
||||
ok(sec_status == SEC_E_OK, "MakeSignature returned %s, not SEC_E_OK.\n",
|
||||
getSecError(sec_status));
|
||||
ok(!memcmp(crypt.pBuffers[3].pvBuffer, message_signature,
|
||||
@@ -1099,24 +1130,48 @@ static void testSignSeal(void)
|
||||
|
||||
/* Being a dummy signature, it will verify right away, as if the server
|
||||
* sent it */
|
||||
sec_status = pVerifySignature(client.ctxt, &crypt, 0, &qop);
|
||||
sec_status = pVerifySignature(&client.ctxt, &crypt, 0, &qop);
|
||||
ok(sec_status == SEC_E_OK, "VerifySignature returned %s, not SEC_E_OK\n",
|
||||
getSecError(sec_status));
|
||||
|
||||
sec_status = pEncryptMessage(client.ctxt, 0, &crypt, 0);
|
||||
sec_status = pEncryptMessage(&client.ctxt, 0, &crypt, 0);
|
||||
ok(sec_status == SEC_E_OK, "EncryptMessage returned %s, not SEC_E_OK.\n",
|
||||
getSecError(sec_status));
|
||||
|
||||
ok(!memcmp(crypt.pBuffers[3].pvBuffer, crypt_trailer_client2,
|
||||
crypt.pBuffers[3].cbBuffer), "Crypt trailer not as expected.\n");
|
||||
if (memcmp(crypt.pBuffers[3].pvBuffer, crypt_trailer_client2,
|
||||
crypt.pBuffers[3].cbBuffer))
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < crypt.pBuffers[3].cbBuffer; i++)
|
||||
{
|
||||
if (i % 8 == 0) printf(" ");
|
||||
printf("0x%02x,", ((unsigned char *)crypt.pBuffers[3].pvBuffer)[i]);
|
||||
if (i % 8 == 7) printf("\n");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
ok(!memcmp(crypt.pBuffers[1].pvBuffer, crypt_message_client2,
|
||||
crypt.pBuffers[1].cbBuffer), "Crypt message not as expected.\n");
|
||||
if (memcmp(crypt.pBuffers[1].pvBuffer, crypt_message_client2,
|
||||
crypt.pBuffers[1].cbBuffer))
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < crypt.pBuffers[1].cbBuffer; i++)
|
||||
{
|
||||
if (i % 8 == 0) printf(" ");
|
||||
printf("0x%02x,", ((unsigned char *)crypt.pBuffers[1].pvBuffer)[i]);
|
||||
if (i % 8 == 7) printf("\n");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
memcpy(complex_data[1].pvBuffer, crypt_message_server2, complex_data[1].cbBuffer);
|
||||
memcpy(complex_data[3].pvBuffer, crypt_trailer_server2, complex_data[3].cbBuffer);
|
||||
|
||||
sec_status = pDecryptMessage(client.ctxt, &crypt, 0, &qop);
|
||||
sec_status = pDecryptMessage(&client.ctxt, &crypt, 0, &qop);
|
||||
ok(sec_status == SEC_E_OK, "DecryptMessage returned %s, not SEC_E_OK.\n",
|
||||
getSecError(sec_status));
|
||||
|
||||
@@ -1125,8 +1180,8 @@ end:
|
||||
cleanupBuffers(&client);
|
||||
cleanupBuffers(&server);
|
||||
|
||||
pDeleteSecurityContext(client.ctxt);
|
||||
pFreeCredentialsHandle(client.cred);
|
||||
pDeleteSecurityContext(&client.ctxt);
|
||||
pFreeCredentialsHandle(&client.cred);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, fake_data[0].pvBuffer);
|
||||
HeapFree(GetProcessHeap(), 0, fake_data[1].pvBuffer);
|
||||
@@ -1265,6 +1320,57 @@ static void test_cred_multiple_use(void)
|
||||
ok(ret == SEC_E_OK, "DeleteSecurityContext failed with error 0x%x\n", ret);
|
||||
ret = pFreeCredentialsHandle(&cred);
|
||||
ok(ret == SEC_E_OK, "FreeCredentialsHandle failed with error 0x%x\n", ret);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, buffers[0].pvBuffer);
|
||||
}
|
||||
|
||||
static void test_null_auth_data(void)
|
||||
{
|
||||
SECURITY_STATUS status;
|
||||
PSecPkgInfo info;
|
||||
CredHandle cred;
|
||||
CtxtHandle ctx;
|
||||
SecBufferDesc buffer_desc;
|
||||
SecBuffer buffers[1];
|
||||
char user[256];
|
||||
TimeStamp ttl;
|
||||
ULONG attr, size;
|
||||
BOOLEAN ret;
|
||||
|
||||
if(pQuerySecurityPackageInfoA((SEC_CHAR *)"NTLM", &info) != SEC_E_OK)
|
||||
{
|
||||
skip("NTLM package not installed, skipping test\n");
|
||||
return;
|
||||
}
|
||||
|
||||
status = pAcquireCredentialsHandleA(NULL, (SEC_CHAR *)"NTLM", SECPKG_CRED_OUTBOUND,
|
||||
NULL, NULL, NULL, NULL, &cred, &ttl);
|
||||
ok(status == SEC_E_OK, "AcquireCredentialsHande() failed %s\n", getSecError(status));
|
||||
|
||||
buffers[0].cbBuffer = info->cbMaxToken;
|
||||
buffers[0].BufferType = SECBUFFER_TOKEN;
|
||||
buffers[0].pvBuffer = HeapAlloc(GetProcessHeap(), 0, buffers[0].cbBuffer);
|
||||
|
||||
buffer_desc.ulVersion = SECBUFFER_VERSION;
|
||||
buffer_desc.cBuffers = sizeof(buffers)/sizeof(buffers[0]);
|
||||
buffer_desc.pBuffers = buffers;
|
||||
|
||||
size = sizeof(user);
|
||||
ret = pGetUserNameExA(NameSamCompatible, user, &size);
|
||||
ok(ret, "GetUserNameExA failed %u\n", GetLastError());
|
||||
|
||||
status = pInitializeSecurityContextA(&cred, NULL, (SEC_CHAR *)user,
|
||||
ISC_REQ_CONNECTION, 0, SECURITY_NETWORK_DREP,
|
||||
NULL, 0, &ctx, &buffer_desc, &attr, &ttl);
|
||||
ok(status == SEC_I_CONTINUE_NEEDED, "InitializeSecurityContextA failed %s\n", getSecError(status));
|
||||
|
||||
ret = pDeleteSecurityContext(&ctx);
|
||||
ok(ret == SEC_E_OK, "DeleteSecurityContext failed with error 0x%x\n", ret);
|
||||
ret = pFreeCredentialsHandle(&cred);
|
||||
ok(ret == SEC_E_OK, "FreeCredentialsHandle failed with error 0x%x\n", ret);
|
||||
|
||||
pFreeContextBuffer(info);
|
||||
HeapFree(GetProcessHeap(), 0, buffers[0].pvBuffer);
|
||||
}
|
||||
|
||||
START_TEST(ntlm)
|
||||
@@ -1290,6 +1396,7 @@ START_TEST(ntlm)
|
||||
testSignSeal();
|
||||
|
||||
test_cred_multiple_use();
|
||||
if (pGetUserNameExA) test_null_auth_data();
|
||||
}
|
||||
else
|
||||
win_skip("Needed functions are not available\n");
|
||||
|
||||
@@ -210,8 +210,15 @@ static void testAcquireSecurityContext(void)
|
||||
certs[1] = pCertCreateCertificateContext(X509_ASN_ENCODING, selfSignedCert,
|
||||
sizeof(selfSignedCert));
|
||||
|
||||
pCryptAcquireContextW(&csp, cspNameW, MS_DEF_PROV_W, PROV_RSA_FULL,
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = pCryptAcquireContextW(&csp, cspNameW, MS_DEF_PROV_W, PROV_RSA_FULL,
|
||||
CRYPT_DELETEKEYSET);
|
||||
if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
|
||||
{
|
||||
/* WinMe would crash on some tests */
|
||||
win_skip("CryptAcquireContextW is not implemented\n");
|
||||
return;
|
||||
}
|
||||
|
||||
st = pAcquireCredentialsHandleA(NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL);
|
||||
|
||||
@@ -48,7 +48,7 @@ static void testGetComputerObjectNameA(void)
|
||||
char name[256];
|
||||
ULONG size;
|
||||
BOOLEAN rc;
|
||||
int i;
|
||||
UINT i;
|
||||
|
||||
for (i = 0; i < (sizeof(formats) / sizeof(formats[0])); i++) {
|
||||
size = sizeof(name);
|
||||
@@ -73,7 +73,7 @@ static void testGetComputerObjectNameW(void)
|
||||
WCHAR nameW[256];
|
||||
ULONG size;
|
||||
BOOLEAN rc;
|
||||
int i;
|
||||
UINT i;
|
||||
|
||||
for (i = 0; i < (sizeof(formats) / sizeof(formats[0])); i++) {
|
||||
size = sizeof(nameW)/sizeof(nameW[0]);
|
||||
@@ -101,7 +101,7 @@ static void testGetUserNameExA(void)
|
||||
char name[256];
|
||||
ULONG size;
|
||||
BOOLEAN rc;
|
||||
int i;
|
||||
UINT i;
|
||||
|
||||
for (i = 0; i < (sizeof(formats) / sizeof(formats[0])); i++) {
|
||||
size = sizeof(name);
|
||||
@@ -148,7 +148,7 @@ static void testGetUserNameExW(void)
|
||||
WCHAR nameW[256];
|
||||
ULONG size;
|
||||
BOOLEAN rc;
|
||||
int i;
|
||||
UINT i;
|
||||
|
||||
for (i = 0; i < (sizeof(formats) / sizeof(formats[0])); i++) {
|
||||
size = sizeof(nameW);
|
||||
|
||||
@@ -53,6 +53,7 @@ static char CURR_DIR[MAX_PATH];
|
||||
|
||||
static void (WINAPI *pInstallHinfSectionA)(HWND, HINSTANCE, LPCSTR, INT);
|
||||
static void (WINAPI *pInstallHinfSectionW)(HWND, HINSTANCE, LPCWSTR, INT);
|
||||
static BOOL (WINAPI *pSetupGetInfFileListA)(PCSTR, DWORD, PSTR, DWORD, PDWORD);
|
||||
static BOOL (WINAPI *pSetupGetInfFileListW)(PCWSTR, DWORD, PWSTR, DWORD, PDWORD);
|
||||
|
||||
/*
|
||||
@@ -468,6 +469,65 @@ cleanup:
|
||||
DeleteFile(inffile);
|
||||
}
|
||||
|
||||
static void test_inffilelistA(void)
|
||||
{
|
||||
static const char inffile2[] = "test2.inf";
|
||||
static const char *inf =
|
||||
"[Version]\n"
|
||||
"Signature=\"$Chicago$\"";
|
||||
|
||||
char buffer[MAX_PATH] = { 0 };
|
||||
char dir[MAX_PATH], *p;
|
||||
DWORD expected, outsize;
|
||||
BOOL ret;
|
||||
|
||||
if(!pSetupGetInfFileListA)
|
||||
{
|
||||
win_skip("SetupGetInfFileListA not present\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* create a private directory, the temp directory may contain some
|
||||
* inf files left over from old installations
|
||||
*/
|
||||
if (!GetTempFileNameA(CURR_DIR, "inftest", 1, dir))
|
||||
{
|
||||
win_skip("GetTempFileNameA failed with error %d\n", GetLastError());
|
||||
return;
|
||||
}
|
||||
if (!CreateDirectoryA(dir, NULL ))
|
||||
{
|
||||
win_skip("CreateDirectoryA(%s) failed with error %d\n", dir, GetLastError());
|
||||
return;
|
||||
}
|
||||
if (!SetCurrentDirectoryA(dir))
|
||||
{
|
||||
win_skip("SetCurrentDirectoryA failed with error %d\n", GetLastError());
|
||||
RemoveDirectoryA(dir);
|
||||
return;
|
||||
}
|
||||
|
||||
create_inf_file(inffile, inf);
|
||||
create_inf_file(inffile2, inf);
|
||||
|
||||
/* mixed style
|
||||
*/
|
||||
expected = 3 + strlen(inffile) + strlen(inffile2);
|
||||
ret = pSetupGetInfFileListA(dir, INF_STYLE_OLDNT | INF_STYLE_WIN4, buffer,
|
||||
MAX_PATH, &outsize);
|
||||
ok(ret, "expected SetupGetInfFileListA to succeed!\n");
|
||||
ok(expected == outsize, "expected required buffersize to be %d, got %d\n",
|
||||
expected, outsize);
|
||||
for(p = buffer; lstrlenA(p) && (outsize > (p - buffer)); p+=lstrlenA(p) + 1)
|
||||
ok(!lstrcmpA(p,inffile2) || !lstrcmpA(p,inffile),
|
||||
"unexpected filename %s\n",p);
|
||||
|
||||
DeleteFile(inffile);
|
||||
DeleteFile(inffile2);
|
||||
SetCurrentDirectoryA(CURR_DIR);
|
||||
RemoveDirectoryA(dir);
|
||||
}
|
||||
|
||||
static void test_inffilelist(void)
|
||||
{
|
||||
static const char inffile2[] = "test2.inf";
|
||||
@@ -656,6 +716,7 @@ START_TEST(install)
|
||||
|
||||
pInstallHinfSectionA = (void *)GetProcAddress(hsetupapi, "InstallHinfSectionA");
|
||||
pInstallHinfSectionW = (void *)GetProcAddress(hsetupapi, "InstallHinfSectionW");
|
||||
pSetupGetInfFileListA = (void *)GetProcAddress(hsetupapi, "SetupGetInfFileListA");
|
||||
pSetupGetInfFileListW = (void *)GetProcAddress(hsetupapi, "SetupGetInfFileListW");
|
||||
|
||||
if (pInstallHinfSectionA)
|
||||
@@ -695,6 +756,7 @@ START_TEST(install)
|
||||
}
|
||||
|
||||
test_inffilelist();
|
||||
test_inffilelistA();
|
||||
|
||||
SetCurrentDirectory(prev_path);
|
||||
}
|
||||
|
||||
@@ -361,6 +361,9 @@ static BOOL compare_file_data(LPSTR file, const BYTE *data, DWORD size)
|
||||
static const BYTE uncompressed[] = {
|
||||
'u','n','c','o','m','p','r','e','s','s','e','d','\r','\n'
|
||||
};
|
||||
static const BYTE laurence[] = {
|
||||
'l','a','u','r','e','n','c','e','\r','\n'
|
||||
};
|
||||
static const BYTE comp_lzx[] = {
|
||||
0x53, 0x5a, 0x44, 0x44, 0x88, 0xf0, 0x27, 0x33, 0x41, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xff, 0x00,
|
||||
0x00, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x3f, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64
|
||||
@@ -394,6 +397,18 @@ static const BYTE comp_cab_zip[] = {
|
||||
0x00, 0x7c, 0x80, 0x26, 0x2b, 0x12, 0x00, 0x0e, 0x00, 0x43, 0x4b, 0x2b, 0xcd, 0x4b, 0xce, 0xcf,
|
||||
0x2d, 0x28, 0x4a, 0x2d, 0x2e, 0x4e, 0x4d, 0xe1, 0xe5, 0x02, 0x00
|
||||
};
|
||||
static const BYTE comp_cab_zip_multi[] = {
|
||||
0x4d, 0x53, 0x43, 0x46, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x38, 0xf0, 0x48, 0x20, 0x00, 0x74, 0x72, 0x69, 0x73,
|
||||
0x74, 0x72, 0x61, 0x6d, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1,
|
||||
0x38, 0xf0, 0x48, 0x20, 0x00, 0x77, 0x69, 0x6e, 0x65, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0xd1, 0x38, 0xf0, 0x48, 0x20, 0x00, 0x73, 0x68, 0x61, 0x6e, 0x64, 0x79,
|
||||
0x00, 0x67, 0x2c, 0x03, 0x85, 0x23, 0x00, 0x20, 0x00, 0x43, 0x4b, 0xcb, 0x49, 0x2c, 0x2d, 0x4a,
|
||||
0xcd, 0x4b, 0x4e, 0xe5, 0xe5, 0x2a, 0xcd, 0x4b, 0xce, 0xcf, 0x2d, 0x28, 0x4a, 0x2d, 0x2e, 0x4e,
|
||||
0x4d, 0xe1, 0xe5, 0x2a, 0x2e, 0x49, 0x2d, 0xca, 0x03, 0x8a, 0x02, 0x00
|
||||
};
|
||||
|
||||
static void test_SetupGetFileCompressionInfo(void)
|
||||
{
|
||||
@@ -506,6 +521,39 @@ static void test_SetupDecompressOrCopyFile(void)
|
||||
DWORD ret;
|
||||
char source[MAX_PATH], target[MAX_PATH], temp[MAX_PATH], *p;
|
||||
UINT type;
|
||||
int i;
|
||||
|
||||
const struct
|
||||
{
|
||||
PCSTR source;
|
||||
PCSTR target;
|
||||
PUINT type;
|
||||
} invalid_parameters[] =
|
||||
{
|
||||
{NULL, NULL, NULL},
|
||||
{NULL, NULL, &type},
|
||||
{NULL, target, NULL},
|
||||
{NULL, target, &type},
|
||||
{source, NULL, NULL},
|
||||
{source, NULL, &type},
|
||||
};
|
||||
|
||||
const struct
|
||||
{
|
||||
const char *filename;
|
||||
const BYTE *expected_buffer;
|
||||
const size_t buffer_size;
|
||||
} zip_multi_tests[] =
|
||||
{
|
||||
{"tristram", laurence, sizeof(laurence)},
|
||||
{"tristram.txt", laurence, sizeof(laurence)},
|
||||
{"wine", laurence, sizeof(laurence)},
|
||||
{"wine.txt", laurence, sizeof(laurence)},
|
||||
{"shandy", laurence, sizeof(laurence)},
|
||||
{"shandy.txt", laurence, sizeof(laurence)},
|
||||
{"deadbeef", laurence, sizeof(laurence)},
|
||||
{"deadbeef.txt", laurence, sizeof(laurence)},
|
||||
};
|
||||
|
||||
GetTempPathA(sizeof(temp), temp);
|
||||
GetTempFileNameA(temp, "doc", 0, source);
|
||||
@@ -515,15 +563,25 @@ static void test_SetupDecompressOrCopyFile(void)
|
||||
|
||||
create_source_file(source, uncompressed, sizeof(uncompressed));
|
||||
|
||||
ret = SetupDecompressOrCopyFileA(NULL, NULL, NULL);
|
||||
ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
|
||||
for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
|
||||
{
|
||||
type = FILE_COMPRESSION_NONE;
|
||||
ret = SetupDecompressOrCopyFileA(invalid_parameters[i].source,
|
||||
invalid_parameters[i].target,
|
||||
invalid_parameters[i].type);
|
||||
ok(ret == ERROR_INVALID_PARAMETER,
|
||||
"[%d] Expected SetupDecompressOrCopyFileA to return ERROR_INVALID_PARAMETER, got %u\n",
|
||||
i, ret);
|
||||
|
||||
type = FILE_COMPRESSION_NONE;
|
||||
ret = SetupDecompressOrCopyFileA(NULL, target, &type);
|
||||
ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
|
||||
|
||||
ret = SetupDecompressOrCopyFileA(source, NULL, &type);
|
||||
ok(ret == ERROR_INVALID_PARAMETER, "SetupDecompressOrCopyFile failed unexpectedly\n");
|
||||
/* try an invalid compression type */
|
||||
type = 5;
|
||||
ret = SetupDecompressOrCopyFileA(invalid_parameters[i].source,
|
||||
invalid_parameters[i].target,
|
||||
invalid_parameters[i].type);
|
||||
ok(ret == ERROR_INVALID_PARAMETER,
|
||||
"[%d] Expected SetupDecompressOrCopyFileA to return ERROR_INVALID_PARAMETER, got %u\n",
|
||||
i, ret);
|
||||
}
|
||||
|
||||
type = 5; /* try an invalid compression type */
|
||||
ret = SetupDecompressOrCopyFileA(source, target, &type);
|
||||
@@ -598,7 +656,27 @@ static void test_SetupDecompressOrCopyFile(void)
|
||||
ok(!ret, "SetupDecompressOrCopyFile failed unexpectedly: %d\n", ret);
|
||||
ok(compare_file_data(target, comp_cab_zip, sizeof(comp_cab_zip)), "incorrect target file\n");
|
||||
|
||||
DeleteFileA(target);
|
||||
/* Show that SetupDecompressOrCopyFileA simply extracts the first file it
|
||||
* finds within the compressed cabinet. Contents are:
|
||||
* tristram -> "laurence\r\n"
|
||||
* wine -> "uncompressed\r\n"
|
||||
* shandy -> "sterne\r\n" */
|
||||
|
||||
create_source_file(source, comp_cab_zip_multi, sizeof(comp_cab_zip_multi));
|
||||
|
||||
p = strrchr(target, '\\');
|
||||
|
||||
for (i = 0; i < sizeof(zip_multi_tests)/sizeof(zip_multi_tests[0]); i++)
|
||||
{
|
||||
lstrcpyA(p + 1, zip_multi_tests[i].filename);
|
||||
|
||||
ret = SetupDecompressOrCopyFileA(source, target, NULL);
|
||||
ok(!ret, "[%d] SetupDecompressOrCopyFile failed unexpectedly: %d\n", i, ret);
|
||||
ok(compare_file_data(target, zip_multi_tests[i].expected_buffer, zip_multi_tests[i].buffer_size),
|
||||
"[%d] incorrect target file\n", i);
|
||||
DeleteFileA(target);
|
||||
}
|
||||
|
||||
DeleteFileA(source);
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
<file>misc.c</file>
|
||||
<file>parser.c</file>
|
||||
<file>query.c</file>
|
||||
<file>setupcab.c</file>
|
||||
<file>stringtable.c</file>
|
||||
<file>testlist.c</file>
|
||||
</module>
|
||||
|
||||
@@ -0,0 +1,456 @@
|
||||
/*
|
||||
* Unit tests for SetupIterateCabinet
|
||||
*
|
||||
* Copyright 2007 Hans Leidekker
|
||||
* Copyright 2010 Andrew Nguyen
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
#include "wingdi.h"
|
||||
#include "winuser.h"
|
||||
#include "winreg.h"
|
||||
#include "setupapi.h"
|
||||
#include "wine/test.h"
|
||||
|
||||
static const BYTE comp_cab_zip_multi[] = {
|
||||
0x4d, 0x53, 0x43, 0x46, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x38, 0xf0, 0x48, 0x20, 0x00, 0x74, 0x72, 0x69, 0x73,
|
||||
0x74, 0x72, 0x61, 0x6d, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1,
|
||||
0x38, 0xf0, 0x48, 0x20, 0x00, 0x77, 0x69, 0x6e, 0x65, 0x00, 0x08, 0x00, 0x00, 0x00, 0x18, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0xd1, 0x38, 0xf0, 0x48, 0x20, 0x00, 0x73, 0x68, 0x61, 0x6e, 0x64, 0x79,
|
||||
0x00, 0x67, 0x2c, 0x03, 0x85, 0x23, 0x00, 0x20, 0x00, 0x43, 0x4b, 0xcb, 0x49, 0x2c, 0x2d, 0x4a,
|
||||
0xcd, 0x4b, 0x4e, 0xe5, 0xe5, 0x2a, 0xcd, 0x4b, 0xce, 0xcf, 0x2d, 0x28, 0x4a, 0x2d, 0x2e, 0x4e,
|
||||
0x4d, 0xe1, 0xe5, 0x2a, 0x2e, 0x49, 0x2d, 0xca, 0x03, 0x8a, 0x02, 0x00
|
||||
};
|
||||
|
||||
static const WCHAR docW[] = {'d','o','c',0};
|
||||
|
||||
static void create_source_fileA(LPSTR filename, const BYTE *data, DWORD size)
|
||||
{
|
||||
HANDLE handle;
|
||||
DWORD written;
|
||||
|
||||
handle = CreateFileA(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
WriteFile(handle, data, size, &written, NULL);
|
||||
CloseHandle(handle);
|
||||
}
|
||||
|
||||
static void create_source_fileW(LPWSTR filename, const BYTE *data, DWORD size)
|
||||
{
|
||||
HANDLE handle;
|
||||
DWORD written;
|
||||
|
||||
handle = CreateFileW(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
WriteFile(handle, data, size, &written, NULL);
|
||||
CloseHandle(handle);
|
||||
}
|
||||
|
||||
static UINT CALLBACK dummy_callbackA(PVOID Context, UINT Notification,
|
||||
UINT_PTR Param1, UINT_PTR Param2)
|
||||
{
|
||||
ok(0, "Received unexpected notification (%p, %u, %lu, %lu)\n", Context,
|
||||
Notification, Param1, Param2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static UINT CALLBACK dummy_callbackW(PVOID Context, UINT Notification,
|
||||
UINT_PTR Param1, UINT_PTR Param2)
|
||||
{
|
||||
ok(0, "Received unexpected notification (%p, %u, %lu, %lu)\n", Context,
|
||||
Notification, Param1, Param2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void test_invalid_parametersA(void)
|
||||
{
|
||||
BOOL ret;
|
||||
char source[MAX_PATH], temp[MAX_PATH];
|
||||
int i;
|
||||
|
||||
const struct
|
||||
{
|
||||
PCSTR CabinetFile;
|
||||
PSP_FILE_CALLBACK MsgHandler;
|
||||
DWORD expected_lasterror;
|
||||
int todo_lasterror;
|
||||
} invalid_parameters[] =
|
||||
{
|
||||
{NULL, NULL, ERROR_INVALID_PARAMETER},
|
||||
{NULL, dummy_callbackA, ERROR_INVALID_PARAMETER},
|
||||
{"c:\\nonexistent.cab", NULL, ERROR_FILE_NOT_FOUND},
|
||||
{"c:\\nonexistent.cab", dummy_callbackA, ERROR_FILE_NOT_FOUND},
|
||||
{source, NULL, ERROR_INVALID_DATA, 1},
|
||||
{source, dummy_callbackA, ERROR_INVALID_DATA, 1},
|
||||
};
|
||||
|
||||
GetTempPathA(sizeof(temp), temp);
|
||||
GetTempFileNameA(temp, "doc", 0, source);
|
||||
|
||||
create_source_fileA(source, NULL, 0);
|
||||
|
||||
for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
|
||||
{
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = SetupIterateCabinetA(invalid_parameters[i].CabinetFile, 0,
|
||||
invalid_parameters[i].MsgHandler, NULL);
|
||||
ok(!ret, "[%d] Expected SetupIterateCabinetA to return 0, got %d\n", i, ret);
|
||||
if (invalid_parameters[i].todo_lasterror)
|
||||
{
|
||||
todo_wine
|
||||
ok(GetLastError() == invalid_parameters[i].expected_lasterror,
|
||||
"[%d] Expected GetLastError() to return %u, got %u\n",
|
||||
i, invalid_parameters[i].expected_lasterror, GetLastError());
|
||||
}
|
||||
else
|
||||
{
|
||||
ok(GetLastError() == invalid_parameters[i].expected_lasterror,
|
||||
"[%d] Expected GetLastError() to return %u, got %u\n",
|
||||
i, invalid_parameters[i].expected_lasterror, GetLastError());
|
||||
}
|
||||
}
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = SetupIterateCabinetA("", 0, NULL, NULL);
|
||||
ok(!ret, "Expected SetupIterateCabinetA to return 0, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_NOT_ENOUGH_MEMORY ||
|
||||
GetLastError() == ERROR_FILE_NOT_FOUND, /* Win9x/NT4/Win2k */
|
||||
"Expected GetLastError() to return ERROR_NOT_ENOUGH_MEMORY, got %u\n",
|
||||
GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = SetupIterateCabinetA("", 0, dummy_callbackA, NULL);
|
||||
ok(!ret, "Expected SetupIterateCabinetA to return 0, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_NOT_ENOUGH_MEMORY ||
|
||||
GetLastError() == ERROR_FILE_NOT_FOUND, /* Win9x/NT4/Win2k */
|
||||
"Expected GetLastError() to return ERROR_NOT_ENOUGH_MEMORY, got %u\n",
|
||||
GetLastError());
|
||||
|
||||
DeleteFileA(source);
|
||||
}
|
||||
|
||||
static void test_invalid_parametersW(void)
|
||||
{
|
||||
static const WCHAR nonexistentW[] = {'c',':','\\','n','o','n','e','x','i','s','t','e','n','t','.','c','a','b',0};
|
||||
static const WCHAR emptyW[] = {0};
|
||||
|
||||
BOOL ret;
|
||||
WCHAR source[MAX_PATH], temp[MAX_PATH];
|
||||
int i;
|
||||
|
||||
const struct
|
||||
{
|
||||
PCWSTR CabinetFile;
|
||||
PSP_FILE_CALLBACK MsgHandler;
|
||||
DWORD expected_lasterror;
|
||||
int todo_lasterror;
|
||||
} invalid_parameters[] =
|
||||
{
|
||||
{nonexistentW, NULL, ERROR_FILE_NOT_FOUND},
|
||||
{nonexistentW, dummy_callbackW, ERROR_FILE_NOT_FOUND},
|
||||
{source, NULL, ERROR_INVALID_DATA, 1},
|
||||
{source, dummy_callbackW, ERROR_INVALID_DATA, 1},
|
||||
};
|
||||
|
||||
ret = SetupIterateCabinetW(NULL, 0, NULL, NULL);
|
||||
if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
|
||||
{
|
||||
win_skip("SetupIterateCabinetW is not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
GetTempPathW(sizeof(temp)/sizeof(WCHAR), temp);
|
||||
GetTempFileNameW(temp, docW, 0, source);
|
||||
|
||||
create_source_fileW(source, NULL, 0);
|
||||
|
||||
for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
|
||||
{
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = SetupIterateCabinetW(invalid_parameters[i].CabinetFile, 0,
|
||||
invalid_parameters[i].MsgHandler, NULL);
|
||||
ok(!ret, "[%d] Expected SetupIterateCabinetW to return 0, got %d\n", i, ret);
|
||||
if (invalid_parameters[i].todo_lasterror)
|
||||
{
|
||||
todo_wine
|
||||
ok(GetLastError() == invalid_parameters[i].expected_lasterror,
|
||||
"[%d] Expected GetLastError() to return %u, got %u\n",
|
||||
i, invalid_parameters[i].expected_lasterror, GetLastError());
|
||||
}
|
||||
else
|
||||
{
|
||||
ok(GetLastError() == invalid_parameters[i].expected_lasterror,
|
||||
"[%d] Expected GetLastError() to return %u, got %u\n",
|
||||
i, invalid_parameters[i].expected_lasterror, GetLastError());
|
||||
}
|
||||
}
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = SetupIterateCabinetW(NULL, 0, NULL, NULL);
|
||||
ok(!ret, "Expected SetupIterateCabinetW to return 0, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_INVALID_PARAMETER ||
|
||||
GetLastError() == ERROR_NOT_ENOUGH_MEMORY, /* Vista/Win2k8 */
|
||||
"Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n",
|
||||
GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = SetupIterateCabinetW(NULL, 0, dummy_callbackW, NULL);
|
||||
ok(!ret, "Expected SetupIterateCabinetW to return 0, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_INVALID_PARAMETER ||
|
||||
GetLastError() == ERROR_NOT_ENOUGH_MEMORY, /* Vista/Win2k8 */
|
||||
"Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n",
|
||||
GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = SetupIterateCabinetW(emptyW, 0, NULL, NULL);
|
||||
ok(!ret, "Expected SetupIterateCabinetW to return 0, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_NOT_ENOUGH_MEMORY ||
|
||||
GetLastError() == ERROR_FILE_NOT_FOUND, /* NT4/Win2k */
|
||||
"Expected GetLastError() to return ERROR_NOT_ENOUGH_MEMORY, got %u\n",
|
||||
GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = SetupIterateCabinetW(emptyW, 0, dummy_callbackW, NULL);
|
||||
ok(!ret, "Expected SetupIterateCabinetW to return 0, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_NOT_ENOUGH_MEMORY ||
|
||||
GetLastError() == ERROR_FILE_NOT_FOUND, /* NT4/Win2k */
|
||||
"Expected GetLastError() to return ERROR_NOT_ENOUGH_MEMORY, got %u\n",
|
||||
GetLastError());
|
||||
|
||||
DeleteFileW(source);
|
||||
}
|
||||
|
||||
static UINT CALLBACK crash_callbackA(PVOID Context, UINT Notification,
|
||||
UINT_PTR Param1, UINT_PTR Param2)
|
||||
{
|
||||
*(volatile char*)0 = 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static UINT CALLBACK crash_callbackW(PVOID Context, UINT Notification,
|
||||
UINT_PTR Param1, UINT_PTR Param2)
|
||||
{
|
||||
*(volatile char*)0 = 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void test_invalid_callbackA(void)
|
||||
{
|
||||
BOOL ret;
|
||||
char source[MAX_PATH], temp[MAX_PATH];
|
||||
|
||||
GetTempPathA(sizeof(temp), temp);
|
||||
GetTempFileNameA(temp, "doc", 0, source);
|
||||
|
||||
create_source_fileA(source, comp_cab_zip_multi, sizeof(comp_cab_zip_multi));
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = SetupIterateCabinetA(source, 0, NULL, NULL);
|
||||
ok(!ret, "Expected SetupIterateCabinetA to return 0, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_INVALID_DATA,
|
||||
"Expected GetLastError() to return ERROR_INVALID_DATA, got %u\n",
|
||||
GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = SetupIterateCabinetA(source, 0, crash_callbackA, NULL);
|
||||
ok(!ret, "Expected SetupIterateCabinetA to return 0, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_INVALID_DATA,
|
||||
"Expected GetLastError() to return ERROR_INVALID_DATA, got %u\n",
|
||||
GetLastError());
|
||||
|
||||
DeleteFileA(source);
|
||||
}
|
||||
|
||||
static void test_invalid_callbackW(void)
|
||||
{
|
||||
BOOL ret;
|
||||
WCHAR source[MAX_PATH], temp[MAX_PATH];
|
||||
|
||||
ret = SetupIterateCabinetW(NULL, 0, NULL, NULL);
|
||||
if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
|
||||
{
|
||||
win_skip("SetupIterateCabinetW is not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
GetTempPathW(sizeof(temp)/sizeof(WCHAR), temp);
|
||||
GetTempFileNameW(temp, docW, 0, source);
|
||||
|
||||
create_source_fileW(source, comp_cab_zip_multi, sizeof(comp_cab_zip_multi));
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = SetupIterateCabinetW(source, 0, NULL, NULL);
|
||||
ok(!ret, "Expected SetupIterateCabinetW to return 0, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_INVALID_DATA,
|
||||
"Expected GetLastError() to return ERROR_INVALID_DATA, got %u\n",
|
||||
GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = SetupIterateCabinetW(source, 0, crash_callbackW, NULL);
|
||||
ok(!ret, "Expected SetupIterateCabinetW to return 0, got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_INVALID_DATA,
|
||||
"Expected GetLastError() to return ERROR_INVALID_DATA, got %u\n",
|
||||
GetLastError());
|
||||
|
||||
DeleteFileW(source);
|
||||
}
|
||||
|
||||
static const char *expected_files[] = {"tristram", "wine", "shandy"};
|
||||
|
||||
static UINT CALLBACK simple_callbackA(PVOID Context, UINT Notification,
|
||||
UINT_PTR Param1, UINT_PTR Param2)
|
||||
{
|
||||
static int index;
|
||||
int *file_count = Context;
|
||||
|
||||
switch (Notification)
|
||||
{
|
||||
case SPFILENOTIFY_CABINETINFO:
|
||||
index = 0;
|
||||
return NO_ERROR;
|
||||
case SPFILENOTIFY_FILEINCABINET:
|
||||
{
|
||||
FILE_IN_CABINET_INFO_A *info = (FILE_IN_CABINET_INFO_A *)Param1;
|
||||
|
||||
(*file_count)++;
|
||||
|
||||
if (index < sizeof(expected_files)/sizeof(char *))
|
||||
{
|
||||
ok(!strcmp(expected_files[index], info->NameInCabinet),
|
||||
"[%d] Expected file \"%s\", got \"%s\"\n",
|
||||
index, expected_files[index], info->NameInCabinet);
|
||||
index++;
|
||||
return FILEOP_SKIP;
|
||||
}
|
||||
else
|
||||
{
|
||||
ok(0, "Unexpectedly enumerated more than number of files in cabinet, index = %d\n", index);
|
||||
return FILEOP_ABORT;
|
||||
}
|
||||
}
|
||||
default:
|
||||
return NO_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
static void test_simple_enumerationA(void)
|
||||
{
|
||||
BOOL ret;
|
||||
char source[MAX_PATH], temp[MAX_PATH];
|
||||
int enum_count = 0;
|
||||
|
||||
GetTempPathA(sizeof(temp), temp);
|
||||
GetTempFileNameA(temp, "doc", 0, source);
|
||||
|
||||
create_source_fileA(source, comp_cab_zip_multi, sizeof(comp_cab_zip_multi));
|
||||
|
||||
ret = SetupIterateCabinetA(source, 0, simple_callbackA, &enum_count);
|
||||
ok(ret == 1, "Expected SetupIterateCabinetA to return 1, got %d\n", ret);
|
||||
ok(enum_count == sizeof(expected_files)/sizeof(char *),
|
||||
"Unexpectedly enumerated %d files\n", enum_count);
|
||||
|
||||
DeleteFileA(source);
|
||||
}
|
||||
|
||||
static const WCHAR tristramW[] = {'t','r','i','s','t','r','a','m',0};
|
||||
static const WCHAR wineW[] = {'w','i','n','e',0};
|
||||
static const WCHAR shandyW[] = {'s','h','a','n','d','y',0};
|
||||
static const WCHAR *expected_filesW[] = {tristramW, wineW, shandyW};
|
||||
|
||||
static UINT CALLBACK simple_callbackW(PVOID Context, UINT Notification,
|
||||
UINT_PTR Param1, UINT_PTR Param2)
|
||||
{
|
||||
static int index;
|
||||
int *file_count = Context;
|
||||
|
||||
switch (Notification)
|
||||
{
|
||||
case SPFILENOTIFY_CABINETINFO:
|
||||
index = 0;
|
||||
return NO_ERROR;
|
||||
case SPFILENOTIFY_FILEINCABINET:
|
||||
{
|
||||
FILE_IN_CABINET_INFO_W *info = (FILE_IN_CABINET_INFO_W *)Param1;
|
||||
|
||||
(*file_count)++;
|
||||
|
||||
if (index < sizeof(expected_filesW)/sizeof(WCHAR *))
|
||||
{
|
||||
ok(!lstrcmpW(expected_filesW[index], info->NameInCabinet),
|
||||
"[%d] Expected file %s, got %s\n",
|
||||
index, wine_dbgstr_w(expected_filesW[index]), wine_dbgstr_w(info->NameInCabinet));
|
||||
index++;
|
||||
return FILEOP_SKIP;
|
||||
}
|
||||
else
|
||||
{
|
||||
ok(0, "Unexpectedly enumerated more than number of files in cabinet, index = %d\n", index);
|
||||
return FILEOP_ABORT;
|
||||
}
|
||||
}
|
||||
default:
|
||||
return NO_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
static void test_simple_enumerationW(void)
|
||||
{
|
||||
BOOL ret;
|
||||
WCHAR source[MAX_PATH], temp[MAX_PATH];
|
||||
int enum_count = 0;
|
||||
|
||||
ret = SetupIterateCabinetW(NULL, 0, NULL, NULL);
|
||||
if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
|
||||
{
|
||||
win_skip("SetupIterateCabinetW is not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
GetTempPathW(sizeof(temp)/sizeof(WCHAR), temp);
|
||||
GetTempFileNameW(temp, docW, 0, source);
|
||||
|
||||
create_source_fileW(source, comp_cab_zip_multi, sizeof(comp_cab_zip_multi));
|
||||
|
||||
ret = SetupIterateCabinetW(source, 0, simple_callbackW, &enum_count);
|
||||
ok(ret == 1, "Expected SetupIterateCabinetW to return 1, got %d\n", ret);
|
||||
ok(enum_count == sizeof(expected_files)/sizeof(WCHAR *),
|
||||
"Unexpectedly enumerated %d files\n", enum_count);
|
||||
|
||||
DeleteFileW(source);
|
||||
}
|
||||
|
||||
START_TEST(setupcab)
|
||||
{
|
||||
test_invalid_parametersA();
|
||||
test_invalid_parametersW();
|
||||
|
||||
/* Tests crash on NT4/Win9x/Win2k and Wine. */
|
||||
if (0)
|
||||
{
|
||||
test_invalid_callbackA();
|
||||
test_invalid_callbackW();
|
||||
}
|
||||
|
||||
test_simple_enumerationA();
|
||||
test_simple_enumerationW();
|
||||
}
|
||||
@@ -216,9 +216,10 @@ static void test_ShortcutFolder(void) {
|
||||
ok (pidlCurFolder->mkid.cb == 20 && ((LPSHITEMID)((BYTE*)pidlCurFolder+20))->cb == 0 &&
|
||||
IsEqualCLSID(&CLSID_WineTest, (REFCLSID)((LPBYTE)pidlCurFolder+4)),
|
||||
"GetCurFolder returned unexpected pidl!\n");
|
||||
|
||||
|
||||
ILFree(pidlCurFolder);
|
||||
IPersistFolder3_Release(pWineTestPersistFolder);
|
||||
|
||||
|
||||
cleanup:
|
||||
unregister_keys(HKEY_CLASSES_ROOT, HKEY_CLASSES_ROOT_keys, 1);
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
#include "mimeinfo.h"
|
||||
|
||||
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
|
||||
DEFINE_OLEGUID(CGID_DocHostCmdPriv, 0x000214D4L, 0, 0);
|
||||
|
||||
#define DEFINE_EXPECT(func) \
|
||||
static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
|
||||
@@ -128,24 +129,28 @@ DEFINE_EXPECT(QueryStatus_STOP);
|
||||
DEFINE_EXPECT(DocHost_EnableModeless_TRUE);
|
||||
DEFINE_EXPECT(DocHost_EnableModeless_FALSE);
|
||||
DEFINE_EXPECT(GetDropTarget);
|
||||
DEFINE_EXPECT(TranslateUrl);
|
||||
|
||||
static const WCHAR wszItem[] = {'i','t','e','m',0};
|
||||
static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
|
||||
static const WCHAR emptyW[] = {0};
|
||||
|
||||
static VARIANT_BOOL exvb;
|
||||
static IWebBrowser2 *wb;
|
||||
|
||||
static HWND container_hwnd, shell_embedding_hwnd;
|
||||
static BOOL is_downloading = FALSE;
|
||||
static BOOL is_downloading, is_first_load;
|
||||
static const char *current_url;
|
||||
|
||||
static const char *debugstr_w(LPCWSTR str)
|
||||
#define DWL_EXPECT_BEFORE_NAVIGATE 0x01
|
||||
#define DWL_FROM_PUT_HREF 0x02
|
||||
|
||||
static DWORD dwl_flags;
|
||||
|
||||
static int strcmp_wa(LPCWSTR strw, const char *stra)
|
||||
{
|
||||
static char buf[1024];
|
||||
if(!str)
|
||||
return "(null)";
|
||||
WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL);
|
||||
return buf;
|
||||
CHAR buf[512];
|
||||
WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL);
|
||||
return lstrcmpA(stra, buf);
|
||||
}
|
||||
|
||||
static const char *debugstr_guid(REFIID riid)
|
||||
@@ -160,8 +165,20 @@ static const char *debugstr_guid(REFIID riid)
|
||||
return buf;
|
||||
}
|
||||
|
||||
static BSTR a2bstr(const char *str)
|
||||
{
|
||||
BSTR ret;
|
||||
int len;
|
||||
|
||||
len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
|
||||
ret = SysAllocStringLen(NULL, len);
|
||||
MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define test_LocationURL(a,b) _test_LocationURL(__LINE__,a,b)
|
||||
static void _test_LocationURL(unsigned line, IUnknown *unk, LPCWSTR exurl)
|
||||
static void _test_LocationURL(unsigned line, IUnknown *unk, const char *exurl)
|
||||
{
|
||||
IWebBrowser2 *wb;
|
||||
BSTR url = (void*)0xdeadbeef;
|
||||
@@ -174,12 +191,23 @@ static void _test_LocationURL(unsigned line, IUnknown *unk, LPCWSTR exurl)
|
||||
|
||||
hres = IWebBrowser2_get_LocationURL(wb, &url);
|
||||
ok_(__FILE__,line) (hres == (*exurl ? S_OK : S_FALSE), "get_LocationURL failed: %08x\n", hres);
|
||||
ok_(__FILE__,line) (!lstrcmpW(url, exurl), "unexpected URL: %s\n", debugstr_w(url));
|
||||
ok_(__FILE__,line) (!strcmp_wa(url, exurl), "unexpected URL: %s\n", wine_dbgstr_w(url));
|
||||
|
||||
SysFreeString(url);
|
||||
IWebBrowser2_Release(wb);
|
||||
}
|
||||
|
||||
#define test_ready_state(ex) _test_ready_state(__LINE__,ex);
|
||||
static void _test_ready_state(unsigned line, READYSTATE exstate)
|
||||
{
|
||||
READYSTATE state;
|
||||
HRESULT hres;
|
||||
|
||||
hres = IWebBrowser2_get_ReadyState(wb, &state);
|
||||
ok_(__FILE__,line)(hres == S_OK, "get_ReadyState failed: %08x\n", hres);
|
||||
ok_(__FILE__,line)(state == exstate, "ReadyState = %d, expected %d\n", state, exstate);
|
||||
}
|
||||
|
||||
static HRESULT QueryInterface(REFIID,void**);
|
||||
|
||||
static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface,
|
||||
@@ -275,6 +303,7 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID
|
||||
case 66: /* TODO */
|
||||
case 67: /* TODO */
|
||||
case 69: /* TODO */
|
||||
case 101: /* TODO (IE8) */
|
||||
return E_FAIL;
|
||||
default:
|
||||
ok(0, "unexpected nCmdID %d\n", nCmdID);
|
||||
@@ -282,10 +311,18 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID
|
||||
}else if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
|
||||
switch(nCmdID) {
|
||||
case 105: /* TODO */
|
||||
case 140: /* TODO (Win7) */
|
||||
return E_FAIL;
|
||||
default:
|
||||
ok(0, "unexpected nCmdID %d\n", nCmdID);
|
||||
}
|
||||
}else if(IsEqualGUID(&CGID_DocHostCmdPriv, pguidCmdGroup)) {
|
||||
switch(nCmdID) {
|
||||
case 11: /* TODO */
|
||||
break;
|
||||
default:
|
||||
ok(0, "unexpected nCmdID %d of CGID_DocHostCmdPriv\n", nCmdID);
|
||||
}
|
||||
}else {
|
||||
ok(0, "unexpected pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
|
||||
}
|
||||
@@ -494,8 +531,8 @@ static void test_OnBeforeNavigate(const VARIANT *disp, const VARIANT *url, const
|
||||
ok(V_VT(V_VARIANTREF(url)) == VT_BSTR, "V_VT(V_VARIANTREF(url))=%d, expected VT_BSTR\n",
|
||||
V_VT(V_VARIANTREF(url)));
|
||||
ok(V_BSTR(V_VARIANTREF(url)) != NULL, "V_BSTR(V_VARIANTREF(url)) == NULL\n");
|
||||
ok(!lstrcmpW(V_BSTR(V_VARIANTREF(url)), about_blankW), "unexpected url %s\n",
|
||||
debugstr_w(V_BSTR(V_VARIANTREF(url))));
|
||||
ok(!strcmp_wa(V_BSTR(V_VARIANTREF(url)), current_url), "unexpected url %s, expected %s\n",
|
||||
wine_dbgstr_w(V_BSTR(V_VARIANTREF(url))), current_url);
|
||||
}
|
||||
|
||||
ok(V_VT(flags) == (VT_BYREF|VT_VARIANT), "V_VT(flags)=%x, expected VT_BYREF|VT_VARIANT\n",
|
||||
@@ -506,8 +543,13 @@ static void test_OnBeforeNavigate(const VARIANT *disp, const VARIANT *url, const
|
||||
if(V_VARIANTREF(flags)) {
|
||||
ok(V_VT(V_VARIANTREF(flags)) == VT_I4, "V_VT(V_VARIANTREF(flags))=%d, expected VT_I4\n",
|
||||
V_VT(V_VARIANTREF(flags)));
|
||||
ok(V_I4(V_VARIANTREF(flags)) == 0, "V_I4(V_VARIANTREF(flags)) = %d, expected 0\n",
|
||||
V_I4(V_VARIANTREF(flags)));
|
||||
if(is_first_load) {
|
||||
ok(V_I4(V_VARIANTREF(flags)) == 0, "V_I4(V_VARIANTREF(flags)) = %x, expected 0\n",
|
||||
V_I4(V_VARIANTREF(flags)));
|
||||
}else {
|
||||
ok((V_I4(V_VARIANTREF(flags)) & ~0x40) == 0, "V_I4(V_VARIANTREF(flags)) = %x, expected 0x40 or 0\n",
|
||||
V_I4(V_VARIANTREF(flags)));
|
||||
}
|
||||
}
|
||||
|
||||
ok(V_VT(frame) == (VT_BYREF|VT_VARIANT), "V_VT(frame)=%x, expected VT_BYREF|VT_VARIANT\n",
|
||||
@@ -602,6 +644,7 @@ static HRESULT WINAPI WebBrowserEvents2_Invoke(IDispatch *iface, DISPID dispIdMe
|
||||
|
||||
ok(pDispParams->rgvarg == NULL, "rgvarg=%p, expected NULL\n", pDispParams->rgvarg);
|
||||
ok(pDispParams->cArgs == 0, "cArgs=%d, expected 0\n", pDispParams->cArgs);
|
||||
test_ready_state(READYSTATE_LOADING);
|
||||
break;
|
||||
|
||||
case DISPID_BEFORENAVIGATE2:
|
||||
@@ -612,6 +655,7 @@ static HRESULT WINAPI WebBrowserEvents2_Invoke(IDispatch *iface, DISPID dispIdMe
|
||||
test_OnBeforeNavigate(pDispParams->rgvarg+6, pDispParams->rgvarg+5, pDispParams->rgvarg+4,
|
||||
pDispParams->rgvarg+3, pDispParams->rgvarg+2, pDispParams->rgvarg+1,
|
||||
pDispParams->rgvarg);
|
||||
test_ready_state((dwl_flags & DWL_FROM_PUT_HREF) ? READYSTATE_COMPLETE : READYSTATE_LOADING);
|
||||
break;
|
||||
|
||||
case DISPID_SETSECURELOCKICON:
|
||||
@@ -643,6 +687,7 @@ static HRESULT WINAPI WebBrowserEvents2_Invoke(IDispatch *iface, DISPID dispIdMe
|
||||
|
||||
ok(pDispParams->rgvarg == NULL, "rgvarg=%p, expected NULL\n", pDispParams->rgvarg);
|
||||
ok(pDispParams->cArgs == 0, "cArgs=%d, expected 0\n", pDispParams->cArgs);
|
||||
test_ready_state(READYSTATE_LOADING);
|
||||
break;
|
||||
|
||||
case DISPID_ONMENUBAR:
|
||||
@@ -688,6 +733,7 @@ static HRESULT WINAPI WebBrowserEvents2_Invoke(IDispatch *iface, DISPID dispIdMe
|
||||
case DISPID_NAVIGATECOMPLETE2:
|
||||
CHECK_EXPECT(Invoke_NAVIGATECOMPLETE2);
|
||||
/* FIXME */
|
||||
test_ready_state((dwl_flags & DWL_FROM_PUT_HREF) ? READYSTATE_COMPLETE : READYSTATE_LOADING);
|
||||
break;
|
||||
|
||||
case DISPID_PROGRESSCHANGE:
|
||||
@@ -698,6 +744,7 @@ static HRESULT WINAPI WebBrowserEvents2_Invoke(IDispatch *iface, DISPID dispIdMe
|
||||
case DISPID_DOCUMENTCOMPLETE:
|
||||
CHECK_EXPECT(Invoke_DOCUMENTCOMPLETE);
|
||||
/* FIXME */
|
||||
test_ready_state(READYSTATE_COMPLETE);
|
||||
break;
|
||||
|
||||
case 282: /* FIXME */
|
||||
@@ -1233,7 +1280,10 @@ static HRESULT WINAPI DocHostUIHandler_GetExternal(IDocHostUIHandler2 *iface, ID
|
||||
static HRESULT WINAPI DocHostUIHandler_TranslateUrl(IDocHostUIHandler2 *iface, DWORD dwTranslate,
|
||||
OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
|
||||
{
|
||||
ok(0, "unexpected call\n");
|
||||
if(is_downloading && !(dwl_flags & DWL_EXPECT_BEFORE_NAVIGATE))
|
||||
todo_wine CHECK_EXPECT(TranslateUrl);
|
||||
else
|
||||
CHECK_EXPECT(TranslateUrl);
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
@@ -1300,6 +1350,9 @@ static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface,
|
||||
{
|
||||
*ppv = NULL;
|
||||
|
||||
if(!winetest_interactive)
|
||||
return E_NOINTERFACE;
|
||||
|
||||
if (IsEqualGUID(&SID_STopLevelBrowser, guidService))
|
||||
trace("Service SID_STopLevelBrowser\n");
|
||||
else if (IsEqualGUID(&SID_SEditCommandTarget, guidService))
|
||||
@@ -1476,7 +1529,7 @@ static void test_SetHostNames(IOleObject *oleobj)
|
||||
ok(hres == S_OK, "SetHostNames failed: %08x\n", hres);
|
||||
}
|
||||
|
||||
static void test_ClientSite(IUnknown *unk, IOleClientSite *client)
|
||||
static void test_ClientSite(IUnknown *unk, IOleClientSite *client, BOOL stop_download)
|
||||
{
|
||||
IOleObject *oleobj;
|
||||
IOleInPlaceObject *inplace;
|
||||
@@ -1507,7 +1560,7 @@ static void test_ClientSite(IUnknown *unk, IOleClientSite *client)
|
||||
SET_EXPECT(Site_GetWindow);
|
||||
SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
|
||||
SET_EXPECT(Invoke_AMBIENT_SILENT);
|
||||
}else if(!is_downloading) {
|
||||
}else if(stop_download) {
|
||||
SET_EXPECT(Invoke_DOWNLOADCOMPLETE);
|
||||
SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
|
||||
SET_EXPECT(Invoke_COMMANDSTATECHANGE);
|
||||
@@ -1521,7 +1574,7 @@ static void test_ClientSite(IUnknown *unk, IOleClientSite *client)
|
||||
CHECK_CALLED(Site_GetWindow);
|
||||
CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
|
||||
CHECK_CALLED(Invoke_AMBIENT_SILENT);
|
||||
}else if(!is_downloading) {
|
||||
}else if(stop_download) {
|
||||
todo_wine CHECK_CALLED(Invoke_DOWNLOADCOMPLETE);
|
||||
todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
|
||||
todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE);
|
||||
@@ -1579,6 +1632,7 @@ static void test_ie_funcs(IUnknown *unk)
|
||||
int i;
|
||||
LONG hwnd;
|
||||
HRESULT hres;
|
||||
BSTR sName;
|
||||
|
||||
hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
|
||||
ok(hres == S_OK, "Could not get IWebBrowser2 interface: %08x\n", hres);
|
||||
@@ -1798,6 +1852,15 @@ static void test_ie_funcs(IUnknown *unk)
|
||||
hres = IWebBrowser2_get_Application(wb, NULL);
|
||||
ok(hres == E_POINTER, "get_Application failed: %08x, expected E_POINTER\n", hres);
|
||||
|
||||
/* Name */
|
||||
hres = IWebBrowser2_get_Name(wb, &sName);
|
||||
ok(hres == S_OK, "getName failed: %08x, expected S_OK\n", hres);
|
||||
if (PRIMARYLANGID(LANGIDFROMLCID(GetThreadLocale())) == LANG_ENGLISH)
|
||||
ok(!strcmp_wa(sName, "Microsoft Web Browser Control"), "got '%s', expected 'Microsoft Web Browser Control'\n", wine_dbgstr_w(sName));
|
||||
else /* Non-English cannot be blank. */
|
||||
ok(sName!=NULL, "get_Name return a NULL string.\n");
|
||||
SysFreeString(sName);
|
||||
|
||||
/* Quit */
|
||||
|
||||
hres = IWebBrowser2_Quit(wb);
|
||||
@@ -2101,70 +2164,86 @@ static void test_Navigate2(IUnknown *unk)
|
||||
if(FAILED(hres))
|
||||
return;
|
||||
|
||||
test_LocationURL(unk, emptyW);
|
||||
test_LocationURL(unk, is_first_load ? "" : current_url);
|
||||
test_ready_state(is_first_load ? READYSTATE_UNINITIALIZED : READYSTATE_COMPLETE);
|
||||
|
||||
V_VT(&url) = VT_BSTR;
|
||||
V_BSTR(&url) = SysAllocString(about_blankW);
|
||||
V_BSTR(&url) = a2bstr("about:blank");
|
||||
current_url = "about:blank";
|
||||
|
||||
SET_EXPECT(Invoke_AMBIENT_USERMODE);
|
||||
SET_EXPECT(Invoke_PROPERTYCHANGE);
|
||||
SET_EXPECT(Invoke_BEFORENAVIGATE2);
|
||||
SET_EXPECT(Invoke_DOWNLOADBEGIN);
|
||||
SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
|
||||
SET_EXPECT(EnableModeless_FALSE);
|
||||
SET_EXPECT(Invoke_STATUSTEXTCHANGE);
|
||||
SET_EXPECT(SetStatusText);
|
||||
SET_EXPECT(GetHostInfo);
|
||||
SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
|
||||
SET_EXPECT(Invoke_AMBIENT_USERAGENT);
|
||||
SET_EXPECT(Invoke_AMBIENT_PALETTE);
|
||||
SET_EXPECT(GetOptionKeyPath);
|
||||
SET_EXPECT(GetOverridesKeyPath);
|
||||
SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
|
||||
SET_EXPECT(Exec_SETPROGRESSMAX);
|
||||
SET_EXPECT(Exec_SETPROGRESSPOS);
|
||||
SET_EXPECT(Invoke_SETSECURELOCKICON);
|
||||
SET_EXPECT(Invoke_FILEDOWNLOAD);
|
||||
SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
|
||||
SET_EXPECT(Invoke_COMMANDSTATECHANGE);
|
||||
SET_EXPECT(EnableModeless_TRUE);
|
||||
if(is_first_load) {
|
||||
SET_EXPECT(Invoke_AMBIENT_USERMODE);
|
||||
SET_EXPECT(Invoke_PROPERTYCHANGE);
|
||||
SET_EXPECT(Invoke_BEFORENAVIGATE2);
|
||||
SET_EXPECT(Invoke_DOWNLOADBEGIN);
|
||||
SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
|
||||
SET_EXPECT(EnableModeless_FALSE);
|
||||
SET_EXPECT(Invoke_STATUSTEXTCHANGE);
|
||||
SET_EXPECT(SetStatusText);
|
||||
SET_EXPECT(GetHostInfo);
|
||||
SET_EXPECT(Invoke_AMBIENT_DLCONTROL);
|
||||
SET_EXPECT(Invoke_AMBIENT_USERAGENT);
|
||||
SET_EXPECT(Invoke_AMBIENT_PALETTE);
|
||||
SET_EXPECT(GetOptionKeyPath);
|
||||
SET_EXPECT(GetOverridesKeyPath);
|
||||
SET_EXPECT(QueryStatus_SETPROGRESSTEXT);
|
||||
SET_EXPECT(Exec_SETPROGRESSMAX);
|
||||
SET_EXPECT(Exec_SETPROGRESSPOS);
|
||||
SET_EXPECT(Invoke_SETSECURELOCKICON);
|
||||
SET_EXPECT(Invoke_FILEDOWNLOAD);
|
||||
SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
|
||||
SET_EXPECT(Invoke_COMMANDSTATECHANGE);
|
||||
SET_EXPECT(EnableModeless_TRUE);
|
||||
}
|
||||
|
||||
hres = IWebBrowser2_Navigate2(webbrowser, &url, NULL, NULL, NULL, NULL);
|
||||
ok(hres == S_OK, "Navigate2 failed: %08x\n", hres);
|
||||
|
||||
CHECK_CALLED(Invoke_AMBIENT_USERMODE);
|
||||
todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE);
|
||||
CHECK_CALLED(Invoke_BEFORENAVIGATE2);
|
||||
todo_wine CHECK_CALLED(Invoke_DOWNLOADBEGIN);
|
||||
todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
|
||||
CHECK_CALLED(EnableModeless_FALSE);
|
||||
CHECK_CALLED(Invoke_STATUSTEXTCHANGE);
|
||||
CHECK_CALLED(SetStatusText);
|
||||
CHECK_CALLED(GetHostInfo);
|
||||
CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
|
||||
CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
|
||||
CHECK_CALLED(Invoke_AMBIENT_PALETTE);
|
||||
CHECK_CALLED(GetOptionKeyPath);
|
||||
CHECK_CALLED_BROKEN(GetOverridesKeyPath);
|
||||
todo_wine CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
|
||||
todo_wine CHECK_CALLED(Exec_SETPROGRESSMAX);
|
||||
todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS);
|
||||
todo_wine CHECK_CALLED_BROKEN(Invoke_SETSECURELOCKICON);
|
||||
todo_wine CHECK_CALLED_BROKEN(Invoke_FILEDOWNLOAD);
|
||||
todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE);
|
||||
todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
|
||||
CHECK_CALLED(EnableModeless_TRUE);
|
||||
if(is_first_load) {
|
||||
CHECK_CALLED(Invoke_AMBIENT_USERMODE);
|
||||
todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE);
|
||||
CHECK_CALLED(Invoke_BEFORENAVIGATE2);
|
||||
todo_wine CHECK_CALLED(Invoke_DOWNLOADBEGIN);
|
||||
todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
|
||||
CHECK_CALLED(EnableModeless_FALSE);
|
||||
CHECK_CALLED(Invoke_STATUSTEXTCHANGE);
|
||||
CHECK_CALLED(SetStatusText);
|
||||
CHECK_CALLED(GetHostInfo);
|
||||
CHECK_CALLED(Invoke_AMBIENT_DLCONTROL);
|
||||
CHECK_CALLED(Invoke_AMBIENT_USERAGENT);
|
||||
CHECK_CALLED(Invoke_AMBIENT_PALETTE);
|
||||
CHECK_CALLED(GetOptionKeyPath);
|
||||
CHECK_CALLED_BROKEN(GetOverridesKeyPath);
|
||||
todo_wine CHECK_CALLED(QueryStatus_SETPROGRESSTEXT);
|
||||
todo_wine CHECK_CALLED(Exec_SETPROGRESSMAX);
|
||||
todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS);
|
||||
todo_wine CHECK_CALLED_BROKEN(Invoke_SETSECURELOCKICON);
|
||||
todo_wine CHECK_CALLED_BROKEN(Invoke_FILEDOWNLOAD);
|
||||
todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE);
|
||||
todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
|
||||
CHECK_CALLED(EnableModeless_TRUE);
|
||||
}
|
||||
|
||||
VariantClear(&url);
|
||||
IWebBrowser2_Release(webbrowser);
|
||||
|
||||
test_ready_state(READYSTATE_LOADING);
|
||||
}
|
||||
|
||||
static void test_download(void)
|
||||
static void test_download(DWORD flags)
|
||||
{
|
||||
MSG msg;
|
||||
|
||||
is_downloading = TRUE;
|
||||
dwl_flags = flags;
|
||||
|
||||
test_ready_state((flags & DWL_FROM_PUT_HREF) ? READYSTATE_COMPLETE : READYSTATE_LOADING);
|
||||
|
||||
if(flags & DWL_EXPECT_BEFORE_NAVIGATE) {
|
||||
SET_EXPECT(Invoke_PROPERTYCHANGE);
|
||||
SET_EXPECT(Invoke_BEFORENAVIGATE2);
|
||||
SET_EXPECT(TranslateUrl);
|
||||
}
|
||||
SET_EXPECT(Exec_SETPROGRESSMAX);
|
||||
SET_EXPECT(Exec_SETPROGRESSPOS);
|
||||
SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
|
||||
@@ -2177,19 +2256,27 @@ static void test_download(void)
|
||||
SET_EXPECT(Invoke_STATUSTEXTCHANGE);
|
||||
SET_EXPECT(SetStatusText);
|
||||
SET_EXPECT(EnableModeless_TRUE);
|
||||
SET_EXPECT(QueryStatus_STOP);
|
||||
if(is_first_load)
|
||||
SET_EXPECT(QueryStatus_STOP);
|
||||
else
|
||||
SET_EXPECT(GetHostInfo);
|
||||
SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
|
||||
SET_EXPECT(Invoke_TITLECHANGE);
|
||||
SET_EXPECT(Invoke_NAVIGATECOMPLETE2);
|
||||
SET_EXPECT(GetDropTarget);
|
||||
if(is_first_load)
|
||||
SET_EXPECT(GetDropTarget);
|
||||
SET_EXPECT(Invoke_PROGRESSCHANGE);
|
||||
SET_EXPECT(Invoke_DOCUMENTCOMPLETE);
|
||||
|
||||
while(!called_Invoke_DOCUMENTCOMPLETE && GetMessage(&msg, NULL, 0, 0)) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
if(flags & DWL_EXPECT_BEFORE_NAVIGATE) {
|
||||
todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE);
|
||||
CHECK_CALLED(Invoke_BEFORENAVIGATE2);
|
||||
CHECK_CALLED(TranslateUrl);
|
||||
}
|
||||
todo_wine CHECK_CALLED(Exec_SETPROGRESSMAX);
|
||||
todo_wine CHECK_CALLED(Exec_SETPROGRESSPOS);
|
||||
todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
|
||||
@@ -2197,18 +2284,32 @@ static void test_download(void)
|
||||
CLEAR_CALLED(DocHost_EnableModeless_TRUE); /* IE 7 */
|
||||
todo_wine CHECK_CALLED(Invoke_SETSECURELOCKICON);
|
||||
CLEAR_CALLED(Invoke_282); /* IE 7 */
|
||||
todo_wine CHECK_CALLED(EnableModeless_FALSE);
|
||||
todo_wine CHECK_CALLED(Invoke_COMMANDSTATECHANGE);
|
||||
if(is_first_load)
|
||||
todo_wine CHECK_CALLED(EnableModeless_FALSE);
|
||||
else
|
||||
CLEAR_CALLED(EnableModeless_FALSE); /* IE 8 */
|
||||
CLEAR_CALLED(Invoke_COMMANDSTATECHANGE);
|
||||
todo_wine CHECK_CALLED(Invoke_STATUSTEXTCHANGE);
|
||||
todo_wine CHECK_CALLED(SetStatusText);
|
||||
todo_wine CHECK_CALLED(EnableModeless_TRUE);
|
||||
todo_wine CHECK_CALLED(QueryStatus_STOP);
|
||||
if(is_first_load)
|
||||
todo_wine CHECK_CALLED(EnableModeless_TRUE);
|
||||
else
|
||||
CLEAR_CALLED(EnableModeless_FALSE); /* IE 8 */
|
||||
if(is_first_load)
|
||||
todo_wine CHECK_CALLED(QueryStatus_STOP);
|
||||
else
|
||||
todo_wine CHECK_CALLED(GetHostInfo);
|
||||
todo_wine CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
|
||||
todo_wine CHECK_CALLED(Invoke_TITLECHANGE);
|
||||
CHECK_CALLED(Invoke_NAVIGATECOMPLETE2);
|
||||
todo_wine CHECK_CALLED(GetDropTarget);
|
||||
if(is_first_load)
|
||||
todo_wine CHECK_CALLED(GetDropTarget);
|
||||
todo_wine CHECK_CALLED(Invoke_PROGRESSCHANGE);
|
||||
CHECK_CALLED(Invoke_DOCUMENTCOMPLETE);
|
||||
|
||||
is_downloading = FALSE;
|
||||
|
||||
test_ready_state(READYSTATE_COMPLETE);
|
||||
}
|
||||
|
||||
static void test_olecmd(IUnknown *unk, BOOL loaded)
|
||||
@@ -2265,6 +2366,73 @@ static void test_IServiceProvider(IUnknown *unk)
|
||||
IServiceProvider_Release(servprov);
|
||||
}
|
||||
|
||||
#define get_document(u) _get_document(__LINE__,u)
|
||||
static IDispatch *_get_document(unsigned line, IUnknown *unk)
|
||||
{
|
||||
IHTMLDocument2 *html_doc;
|
||||
IWebBrowser2 *wb;
|
||||
IDispatch *disp;
|
||||
HRESULT hres;
|
||||
|
||||
hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
|
||||
ok_(__FILE__,line)(hres == S_OK, "QueryInterface(IID_IWebBrowser2) failed: %08x\n", hres);
|
||||
|
||||
disp = NULL;
|
||||
hres = IWebBrowser2_get_Document(wb, &disp);
|
||||
IWebBrowser2_Release(wb);
|
||||
ok_(__FILE__,line)(hres == S_OK, "get_Document failed: %08x\n", hres);
|
||||
ok_(__FILE__,line)(disp != NULL, "doc_disp == NULL\n");
|
||||
|
||||
hres = IDispatch_QueryInterface(disp, &IID_IHTMLDocument2, (void**)&html_doc);
|
||||
ok_(__FILE__,line)(hres == S_OK, "Could not get IHTMLDocument iface: %08x\n", hres);
|
||||
ok(disp == (IDispatch*)html_doc, "disp != html_doc\n");
|
||||
IHTMLDocument_Release(html_doc);
|
||||
|
||||
return disp;
|
||||
}
|
||||
|
||||
static void test_put_href(IUnknown *unk)
|
||||
{
|
||||
IHTMLLocation *location;
|
||||
IHTMLDocument2 *doc;
|
||||
IDispatch *doc_disp;
|
||||
BSTR str;
|
||||
HRESULT hres;
|
||||
|
||||
doc_disp = get_document(unk);
|
||||
|
||||
hres = IDispatch_QueryInterface(doc_disp, &IID_IHTMLDocument2, (void**)&doc);
|
||||
IDispatch_Release(doc_disp);
|
||||
ok(hres == S_OK, "QueryInterface(IID_IHTMLDocument2 failed: %08x\n", hres);
|
||||
|
||||
location = NULL;
|
||||
hres = IHTMLDocument2_get_location(doc, &location);
|
||||
IHTMLDocument2_Release(doc);
|
||||
ok(hres == S_OK, "get_location failed: %08x\n", hres);
|
||||
ok(location != NULL, "location == NULL\n");
|
||||
|
||||
SET_EXPECT(TranslateUrl);
|
||||
SET_EXPECT(Invoke_BEFORENAVIGATE2);
|
||||
SET_EXPECT(Invoke_PROPERTYCHANGE);
|
||||
|
||||
dwl_flags = DWL_FROM_PUT_HREF;
|
||||
|
||||
str = a2bstr("about:test");
|
||||
current_url = "about:test";
|
||||
is_first_load = FALSE;
|
||||
hres = IHTMLLocation_put_href(location, str);
|
||||
|
||||
CHECK_CALLED(TranslateUrl);
|
||||
CHECK_CALLED(Invoke_BEFORENAVIGATE2);
|
||||
todo_wine CHECK_CALLED(Invoke_PROPERTYCHANGE);
|
||||
|
||||
IHTMLLocation_Release(location);
|
||||
SysFreeString(str);
|
||||
ok(hres == S_OK, "put_href failed: %08x\n", hres);
|
||||
|
||||
test_ready_state(READYSTATE_COMPLETE);
|
||||
}
|
||||
|
||||
static void test_QueryInterface(IUnknown *unk)
|
||||
{
|
||||
IQuickActivate *qa = (IQuickActivate*)0xdeadbeef;
|
||||
@@ -2319,15 +2487,17 @@ static void test_WebBrowser(BOOL do_download)
|
||||
return;
|
||||
|
||||
is_downloading = FALSE;
|
||||
is_first_load = TRUE;
|
||||
|
||||
hres = IUnknown_QueryInterface(unk, &IID_IWebBrowser2, (void**)&wb);
|
||||
ok(hres == S_OK, "Could not get IWebBrowser2 iface: %08x\n", hres);
|
||||
|
||||
test_QueryInterface(unk);
|
||||
test_ready_state(READYSTATE_UNINITIALIZED);
|
||||
test_ClassInfo(unk);
|
||||
test_LocationURL(unk, emptyW);
|
||||
test_LocationURL(unk, "");
|
||||
test_ConnectionPoint(unk, TRUE);
|
||||
test_ClientSite(unk, &ClientSite);
|
||||
test_ClientSite(unk, &ClientSite, !do_download);
|
||||
test_Extent(unk);
|
||||
test_wb_funcs(unk, TRUE);
|
||||
test_DoVerb(unk);
|
||||
@@ -2335,11 +2505,27 @@ static void test_WebBrowser(BOOL do_download)
|
||||
test_Navigate2(unk);
|
||||
|
||||
if(do_download) {
|
||||
test_download();
|
||||
IDispatch *doc, *doc2;
|
||||
|
||||
test_download(0);
|
||||
test_olecmd(unk, TRUE);
|
||||
doc = get_document(unk);
|
||||
|
||||
test_put_href(unk);
|
||||
test_download(DWL_FROM_PUT_HREF);
|
||||
doc2 = get_document(unk);
|
||||
ok(doc == doc2, "doc != doc2\n");
|
||||
IDispatch_Release(doc2);
|
||||
|
||||
test_Navigate2(unk);
|
||||
test_download(DWL_EXPECT_BEFORE_NAVIGATE);
|
||||
doc2 = get_document(unk);
|
||||
ok(doc == doc2, "doc != doc2\n");
|
||||
IDispatch_Release(doc2);
|
||||
IDispatch_Release(doc2);
|
||||
}
|
||||
|
||||
test_ClientSite(unk, NULL);
|
||||
test_ClientSite(unk, NULL, !do_download);
|
||||
test_ie_funcs(unk);
|
||||
test_GetControlInfo(unk);
|
||||
test_wb_funcs(unk, FALSE);
|
||||
@@ -2351,40 +2537,8 @@ static void test_WebBrowser(BOOL do_download)
|
||||
ok(ref == 0, "ref=%d, expected 0\n", ref);
|
||||
}
|
||||
|
||||
static void gecko_installer_workaround(BOOL disable)
|
||||
{
|
||||
HKEY hkey;
|
||||
DWORD res;
|
||||
|
||||
static BOOL has_url = FALSE;
|
||||
static char url[2048];
|
||||
|
||||
if(!disable && !has_url)
|
||||
return;
|
||||
|
||||
res = RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\MSHTML", &hkey);
|
||||
if(res != ERROR_SUCCESS)
|
||||
return;
|
||||
|
||||
if(disable) {
|
||||
DWORD type, size = sizeof(url);
|
||||
|
||||
res = RegQueryValueEx(hkey, "GeckoUrl", NULL, &type, (PVOID)url, &size);
|
||||
if(res == ERROR_SUCCESS && type == REG_SZ)
|
||||
has_url = TRUE;
|
||||
|
||||
RegDeleteValue(hkey, "GeckoUrl");
|
||||
}else {
|
||||
RegSetValueEx(hkey, "GeckoUrl", 0, REG_SZ, (PVOID)url, lstrlenA(url)+1);
|
||||
}
|
||||
|
||||
RegCloseKey(hkey);
|
||||
}
|
||||
|
||||
START_TEST(webbrowser)
|
||||
{
|
||||
gecko_installer_workaround(TRUE);
|
||||
|
||||
container_hwnd = create_container_window();
|
||||
|
||||
OleInitialize(NULL);
|
||||
@@ -2395,6 +2549,4 @@ START_TEST(webbrowser)
|
||||
test_WebBrowser(TRUE);
|
||||
|
||||
OleUninitialize();
|
||||
|
||||
gecko_installer_workaround(FALSE);
|
||||
}
|
||||
|
||||
@@ -1960,7 +1960,7 @@ typedef struct {
|
||||
|
||||
static const IOleCommandTargetVtbl IOleCommandTargetImpl_Vtbl;
|
||||
|
||||
IOleCommandTarget* IOleCommandTargetImpl_Construct(void)
|
||||
static IOleCommandTarget* IOleCommandTargetImpl_Construct(void)
|
||||
{
|
||||
IOleCommandTargetImpl *obj;
|
||||
|
||||
@@ -2050,7 +2050,7 @@ typedef struct {
|
||||
static const IServiceProviderVtbl IServiceProviderImpl_Vtbl;
|
||||
static const IProfferServiceVtbl IProfferServiceImpl_Vtbl;
|
||||
|
||||
IServiceProvider* IServiceProviderImpl_Construct(void)
|
||||
static IServiceProvider* IServiceProviderImpl_Construct(void)
|
||||
{
|
||||
IServiceProviderImpl *obj;
|
||||
|
||||
@@ -2061,7 +2061,7 @@ IServiceProvider* IServiceProviderImpl_Construct(void)
|
||||
return (IServiceProvider*)obj;
|
||||
}
|
||||
|
||||
IProfferService* IProfferServiceImpl_Construct(void)
|
||||
static IProfferService* IProfferServiceImpl_Construct(void)
|
||||
{
|
||||
IProfferServiceImpl *obj;
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
<file>string.c</file>
|
||||
<file>url.c</file>
|
||||
<file>testlist.c</file>
|
||||
<file>thread.c</file>
|
||||
<library>wine</library>
|
||||
<library>uuid</library>
|
||||
<library>shlwapi</library>
|
||||
|
||||
@@ -0,0 +1,249 @@
|
||||
/* Tests for Thread and SHGlobalCounter functions
|
||||
*
|
||||
* Copyright 2010 Detlef Riekenberg
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#define COBJMACROS
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
#include "winerror.h"
|
||||
#include "ole2.h"
|
||||
#include "shlwapi.h"
|
||||
|
||||
#include "wine/test.h"
|
||||
|
||||
static HRESULT (WINAPI *pSHCreateThreadRef)(LONG*, IUnknown**);
|
||||
static HRESULT (WINAPI *pSHGetThreadRef)(IUnknown**);
|
||||
static HRESULT (WINAPI *pSHSetThreadRef)(IUnknown*);
|
||||
|
||||
static DWORD AddRef_called;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const IUnknownVtbl* lpVtbl;
|
||||
LONG *ref;
|
||||
} threadref;
|
||||
|
||||
static HRESULT WINAPI threadref_QueryInterface(IUnknown *iface, REFIID riid, LPVOID *ppvObj)
|
||||
{
|
||||
threadref * This = (threadref *)iface;
|
||||
|
||||
trace("unexpected QueryInterface(%p, %p, %p) called\n", This, riid, ppvObj);
|
||||
*ppvObj = NULL;
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static ULONG WINAPI threadref_AddRef(IUnknown *iface)
|
||||
{
|
||||
threadref * This = (threadref *)iface;
|
||||
|
||||
AddRef_called++;
|
||||
return InterlockedIncrement(This->ref);
|
||||
}
|
||||
|
||||
static ULONG WINAPI threadref_Release(IUnknown *iface)
|
||||
{
|
||||
threadref * This = (threadref *)iface;
|
||||
|
||||
trace("unexpected Release(%p) called\n", This);
|
||||
return InterlockedDecrement(This->ref);
|
||||
}
|
||||
|
||||
/* VTable */
|
||||
static const IUnknownVtbl threadref_vt =
|
||||
{
|
||||
threadref_QueryInterface,
|
||||
threadref_AddRef,
|
||||
threadref_Release
|
||||
};
|
||||
|
||||
static void init_threadref(threadref* iface, LONG *refcount)
|
||||
{
|
||||
iface->lpVtbl = &threadref_vt;
|
||||
iface->ref = refcount;
|
||||
}
|
||||
|
||||
/* ##### */
|
||||
|
||||
static void test_SHCreateThreadRef(void)
|
||||
{
|
||||
IUnknown *pobj;
|
||||
IUnknown *punk;
|
||||
LONG refcount;
|
||||
HRESULT hr;
|
||||
|
||||
/* Not present before IE 6_XP_sp2 */
|
||||
if (!pSHCreateThreadRef) {
|
||||
win_skip("SHCreateThreadRef not found\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* start with a clean state */
|
||||
hr = pSHSetThreadRef(NULL);
|
||||
ok(hr == S_OK, "got 0x%x (expected S_OK)\n", hr);
|
||||
|
||||
pobj = NULL;
|
||||
refcount = 0xdeadbeef;
|
||||
hr = pSHCreateThreadRef(&refcount, &pobj);
|
||||
ok((hr == S_OK) && pobj && (refcount == 1),
|
||||
"got 0x%x and %p with %d (expected S_OK and '!= NULL' with 1)\n",
|
||||
hr, pobj, refcount);
|
||||
|
||||
/* the object is not automatic set as ThreadRef */
|
||||
punk = NULL;
|
||||
hr = pSHGetThreadRef(&punk);
|
||||
ok( (hr == E_NOINTERFACE) && (punk == NULL),
|
||||
"got 0x%x and %p (expected E_NOINTERFACE and NULL)\n", hr, punk);
|
||||
|
||||
/* set the object */
|
||||
hr = pSHSetThreadRef(pobj);
|
||||
ok(hr == S_OK, "got 0x%x (expected S_OK)\n", hr);
|
||||
|
||||
/* read back */
|
||||
punk = NULL;
|
||||
hr = pSHGetThreadRef(&punk);
|
||||
ok( (hr == S_OK) && (punk == pobj) && (refcount == 2),
|
||||
"got 0x%x and %p with %d (expected S_OK and %p with 2)\n",
|
||||
hr, punk, refcount, pobj);
|
||||
|
||||
/* free the ref from SHGetThreadRef */
|
||||
if (SUCCEEDED(hr)) {
|
||||
hr = IUnknown_Release(pobj);
|
||||
ok((hr == 1) && (hr == refcount),
|
||||
"got %d with %d (expected 1 with 1)\n", hr, refcount);
|
||||
}
|
||||
|
||||
/* free the object */
|
||||
if (pobj) {
|
||||
hr = IUnknown_Release(pobj);
|
||||
ok((hr == 0) && (hr == refcount),
|
||||
"got %d with %d (expected 0 with 0)\n", hr, refcount);
|
||||
}
|
||||
|
||||
if (0) {
|
||||
/* the ThreadRef has still the pointer,
|
||||
but the object no longer exist after the *_Release */
|
||||
punk = NULL;
|
||||
hr = pSHGetThreadRef(&punk);
|
||||
trace("got 0x%x and %p with %d\n", hr, punk, refcount);
|
||||
}
|
||||
|
||||
/* remove the dead object pointer */
|
||||
hr = pSHSetThreadRef(NULL);
|
||||
ok(hr == S_OK, "got 0x%x (expected S_OK)\n", hr);
|
||||
|
||||
/* parameter check */
|
||||
if (0) {
|
||||
/* vista: E_INVALIDARG, XP: crash */
|
||||
pobj = NULL;
|
||||
hr = pSHCreateThreadRef(NULL, &pobj);
|
||||
ok(hr == E_INVALIDARG, "got 0x%x (expected E_INVALIDARG)\n", hr);
|
||||
|
||||
refcount = 0xdeadbeef;
|
||||
/* vista: E_INVALIDARG, XP: crash */
|
||||
hr = pSHCreateThreadRef(&refcount, NULL);
|
||||
ok( (hr == E_INVALIDARG) && (refcount == 0xdeadbeef),
|
||||
"got 0x%x with 0x%x (expected E_INVALIDARG and oxdeadbeef)\n",
|
||||
hr, refcount);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void test_SHGetThreadRef(void)
|
||||
{
|
||||
IUnknown *punk;
|
||||
HRESULT hr;
|
||||
|
||||
/* Not present before IE 5 */
|
||||
if (!pSHGetThreadRef) {
|
||||
win_skip("SHGetThreadRef not found\n");
|
||||
return;
|
||||
}
|
||||
|
||||
punk = NULL;
|
||||
hr = pSHGetThreadRef(&punk);
|
||||
ok( (hr == E_NOINTERFACE) && (punk == NULL),
|
||||
"got 0x%x and %p (expected E_NOINTERFACE and NULL)\n", hr, punk);
|
||||
|
||||
if (0) {
|
||||
/* this crash on Windows */
|
||||
hr = pSHGetThreadRef(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_SHSetThreadRef(void)
|
||||
{
|
||||
threadref ref;
|
||||
IUnknown *punk;
|
||||
HRESULT hr;
|
||||
LONG refcount;
|
||||
|
||||
/* Not present before IE 5 */
|
||||
if (!pSHSetThreadRef) {
|
||||
win_skip("SHSetThreadRef not found\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* start with a clean state */
|
||||
hr = pSHSetThreadRef(NULL);
|
||||
ok(hr == S_OK, "got 0x%x (expected S_OK)\n", hr);
|
||||
|
||||
/* build and set out object */
|
||||
init_threadref(&ref, &refcount);
|
||||
AddRef_called = 0;
|
||||
refcount = 1;
|
||||
hr = pSHSetThreadRef( (IUnknown *)&ref);
|
||||
ok( (hr == S_OK) && (refcount == 1) && (!AddRef_called),
|
||||
"got 0x%x with %d, %d (expected S_OK with 1, 0)\n",
|
||||
hr, refcount, AddRef_called);
|
||||
|
||||
/* read back our object */
|
||||
AddRef_called = 0;
|
||||
refcount = 1;
|
||||
punk = NULL;
|
||||
hr = pSHGetThreadRef(&punk);
|
||||
ok( (hr == S_OK) && (punk == (IUnknown *)&ref) && (refcount == 2) && (AddRef_called == 1),
|
||||
"got 0x%x and %p with %d, %d (expected S_OK and %p with 2, 1)\n",
|
||||
hr, punk, refcount, AddRef_called, &ref);
|
||||
|
||||
/* clear the object pointer */
|
||||
hr = pSHSetThreadRef(NULL);
|
||||
ok(hr == S_OK, "got 0x%x (expected S_OK)\n", hr);
|
||||
|
||||
/* verify, that our object is no longer known as ThreadRef */
|
||||
hr = pSHGetThreadRef(&punk);
|
||||
ok( (hr == E_NOINTERFACE) && (punk == NULL),
|
||||
"got 0x%x and %p (expected E_NOINTERFACE and NULL)\n", hr, punk);
|
||||
|
||||
}
|
||||
|
||||
START_TEST(thread)
|
||||
{
|
||||
HMODULE hshlwapi = GetModuleHandleA("shlwapi.dll");
|
||||
|
||||
pSHCreateThreadRef = (void *) GetProcAddress(hshlwapi, "SHCreateThreadRef");
|
||||
pSHGetThreadRef = (void *) GetProcAddress(hshlwapi, "SHGetThreadRef");
|
||||
pSHSetThreadRef = (void *) GetProcAddress(hshlwapi, "SHSetThreadRef");
|
||||
|
||||
test_SHCreateThreadRef();
|
||||
test_SHGetThreadRef();
|
||||
test_SHSetThreadRef();
|
||||
|
||||
}
|
||||
@@ -160,7 +160,9 @@ static const TEST_URL_CANONICALIZE TEST_CANONICALIZE[] = {
|
||||
{"A", 0, S_OK, "A", FALSE},
|
||||
{"/uri-res/N2R?urn:sha1:B3K", URL_DONT_ESCAPE_EXTRA_INFO | URL_WININET_COMPATIBILITY /*0x82000000*/, S_OK, "/uri-res/N2R?urn:sha1:B3K", FALSE} /*LimeWire online installer calls this*/,
|
||||
{"http:www.winehq.org/dir/../index.html", 0, S_OK, "http:www.winehq.org/index.html"},
|
||||
{"http://localhost/test.html", URL_FILE_USE_PATHURL, S_OK, "http://localhost/test.html"}
|
||||
{"http://localhost/test.html", URL_FILE_USE_PATHURL, S_OK, "http://localhost/test.html"},
|
||||
{"http://localhost/te%20st.html", URL_FILE_USE_PATHURL, S_OK, "http://localhost/te%20st.html"},
|
||||
{"http://www.winehq.org/%E6%A1%9C.html", URL_FILE_USE_PATHURL, S_OK, "http://www.winehq.org/%E6%A1%9C.html"}
|
||||
};
|
||||
|
||||
/* ################ */
|
||||
@@ -793,7 +795,8 @@ static void test_UrlEscape(void)
|
||||
static void test_UrlCanonicalizeA(void)
|
||||
{
|
||||
unsigned int i;
|
||||
CHAR szReturnUrl[INTERNET_MAX_URL_LENGTH];
|
||||
CHAR szReturnUrl[4*INTERNET_MAX_URL_LENGTH];
|
||||
CHAR longurl[4*INTERNET_MAX_URL_LENGTH];
|
||||
DWORD dwSize;
|
||||
DWORD urllen;
|
||||
HRESULT hr;
|
||||
@@ -845,6 +848,24 @@ static void test_UrlCanonicalizeA(void)
|
||||
"got 0x%x with %u and size %u for '%s' and %u (expected 'S_OK' and size %u)\n",
|
||||
hr, GetLastError(), dwSize, szReturnUrl, lstrlenA(szReturnUrl), urllen);
|
||||
|
||||
/* length is set to 0 */
|
||||
dwSize=0;
|
||||
memset(szReturnUrl, '#', urllen+4);
|
||||
szReturnUrl[urllen+4] = '\0';
|
||||
SetLastError(0xdeadbeef);
|
||||
hr = pUrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
|
||||
ok( (hr == E_INVALIDARG) && (dwSize == 0),
|
||||
"got 0x%x with %u and size %u for '%s' and %u (expected 'E_INVALIDARG' and size %u)\n",
|
||||
hr, GetLastError(), dwSize, szReturnUrl, lstrlenA(szReturnUrl), 0);
|
||||
|
||||
/* url length > INTERNET_MAX_URL_SIZE */
|
||||
dwSize=sizeof(szReturnUrl);
|
||||
memset(longurl, 'a', sizeof(longurl));
|
||||
memcpy(longurl, winehqA, sizeof(winehqA)-1);
|
||||
longurl[sizeof(longurl)-1] = '\0';
|
||||
hr = pUrlCanonicalizeA(longurl, szReturnUrl, &dwSize, URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE);
|
||||
ok(hr == S_OK, "hr = %x\n", hr);
|
||||
|
||||
test_url_canonicalize(-1, "", 0, S_OK, S_FALSE /* Vista/win2k8 */, "", FALSE);
|
||||
|
||||
/* test url-modification */
|
||||
|
||||
@@ -424,7 +424,7 @@ static void test_SnmpUtilOidAppend(void)
|
||||
static AsnObjectIdentifier oid1;
|
||||
static AsnObjectIdentifier oid2 = { 3, ids2 };
|
||||
|
||||
ids1 = HeapAlloc(GetProcessHeap(), 0, 3 * sizeof(UINT));
|
||||
ids1 = SnmpUtilMemAlloc(3 * sizeof(UINT));
|
||||
ids1[0] = 1;
|
||||
ids1[1] = 2;
|
||||
ids1[2] = 3;
|
||||
@@ -451,7 +451,7 @@ static void test_SnmpUtilOidAppend(void)
|
||||
ok(!memcmp(&oid1.ids[3], ids2, 3 * sizeof(UINT)),
|
||||
"SnmpUtilOidAppend failed\n");
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, ids1);
|
||||
SnmpUtilOidFree(&oid1);
|
||||
}
|
||||
|
||||
static void test_SnmpUtilVarBindCpyFree(void)
|
||||
|
||||
@@ -787,7 +787,8 @@ static void test_sources(TW_IDENTITY *appid)
|
||||
(rc == TWRC_FAILURE && status.ConditionCode == TWCC_NODS),
|
||||
"Get default invalid condition code, rc %d, cc %d\n", rc, status.ConditionCode);
|
||||
|
||||
if (rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS)
|
||||
/* A DS might display a Popup during MSG_OPENDS, when the scanner is not connected */
|
||||
if (rc == TWRC_SUCCESS && status.ConditionCode == TWCC_SUCCESS && winetest_interactive)
|
||||
{
|
||||
rc = pDSM_Entry(appid, NULL, DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &source);
|
||||
get_condition_code(appid, NULL, &status);
|
||||
|
||||
@@ -64,6 +64,17 @@ DEFINE_EXPECT(CreateInstance);
|
||||
DEFINE_EXPECT(unk_Release);
|
||||
|
||||
static HRESULT (WINAPI *pCoInternetCompareUrl)(LPCWSTR, LPCWSTR, DWORD);
|
||||
static HRESULT (WINAPI *pCoInternetGetSecurityUrl)(LPCWSTR, LPWSTR*, PSUACTION, DWORD);
|
||||
static HRESULT (WINAPI *pCoInternetGetSession)(DWORD, IInternetSession **, DWORD);
|
||||
static HRESULT (WINAPI *pCoInternetParseUrl)(LPCWSTR, PARSEACTION, DWORD, LPWSTR, DWORD, DWORD *, DWORD);
|
||||
static HRESULT (WINAPI *pCoInternetQueryInfo)(LPCWSTR, QUERYOPTION, DWORD, LPVOID, DWORD, DWORD *, DWORD);
|
||||
static HRESULT (WINAPI *pCopyStgMedium)(const STGMEDIUM *, STGMEDIUM *);
|
||||
static HRESULT (WINAPI *pFindMimeFromData)(LPBC, LPCWSTR, LPVOID, DWORD, LPCWSTR,
|
||||
DWORD, LPWSTR*, DWORD);
|
||||
static HRESULT (WINAPI *pObtainUserAgentString)(DWORD, LPSTR, DWORD*);
|
||||
static HRESULT (WINAPI *pReleaseBindInfo)(BINDINFO*);
|
||||
static HRESULT (WINAPI *pUrlMkGetSessionOption)(DWORD, LPVOID, DWORD, DWORD *, DWORD);
|
||||
|
||||
|
||||
static void test_CreateFormatEnum(void)
|
||||
{
|
||||
@@ -306,27 +317,31 @@ static void test_CoInternetParseUrl(void)
|
||||
|
||||
static WCHAR buf[4096];
|
||||
|
||||
if (!pCoInternetParseUrl) {
|
||||
return;
|
||||
}
|
||||
|
||||
memset(buf, 0xf0, sizeof(buf));
|
||||
hres = CoInternetParseUrl(parse_tests[0].url, PARSE_SCHEMA, 0, buf,
|
||||
hres = pCoInternetParseUrl(parse_tests[0].url, PARSE_SCHEMA, 0, buf,
|
||||
3, &size, 0);
|
||||
ok(hres == E_POINTER, "schema failed: %08x, expected E_POINTER\n", hres);
|
||||
|
||||
for(i=0; i < sizeof(parse_tests)/sizeof(parse_tests[0]); i++) {
|
||||
memset(buf, 0xf0, sizeof(buf));
|
||||
hres = CoInternetParseUrl(parse_tests[i].url, PARSE_SECURITY_URL, 0, buf,
|
||||
hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_SECURITY_URL, 0, buf,
|
||||
sizeof(buf)/sizeof(WCHAR), &size, 0);
|
||||
ok(hres == parse_tests[i].secur_hres, "[%d] security url failed: %08x, expected %08x\n",
|
||||
i, hres, parse_tests[i].secur_hres);
|
||||
|
||||
memset(buf, 0xf0, sizeof(buf));
|
||||
hres = CoInternetParseUrl(parse_tests[i].url, PARSE_ENCODE, 0, buf,
|
||||
hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_ENCODE, 0, buf,
|
||||
sizeof(buf)/sizeof(WCHAR), &size, 0);
|
||||
ok(hres == S_OK, "[%d] encoding failed: %08x\n", i, hres);
|
||||
ok(size == lstrlenW(parse_tests[i].encoded_url), "[%d] wrong size\n", i);
|
||||
ok(!lstrcmpW(parse_tests[i].encoded_url, buf), "[%d] wrong encoded url\n", i);
|
||||
|
||||
memset(buf, 0xf0, sizeof(buf));
|
||||
hres = CoInternetParseUrl(parse_tests[i].url, PARSE_PATH_FROM_URL, 0, buf,
|
||||
hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_PATH_FROM_URL, 0, buf,
|
||||
sizeof(buf)/sizeof(WCHAR), &size, 0);
|
||||
ok(hres == parse_tests[i].path_hres, "[%d] path failed: %08x, expected %08x\n",
|
||||
i, hres, parse_tests[i].path_hres);
|
||||
@@ -336,7 +351,7 @@ static void test_CoInternetParseUrl(void)
|
||||
}
|
||||
|
||||
memset(buf, 0xf0, sizeof(buf));
|
||||
hres = CoInternetParseUrl(parse_tests[i].url, PARSE_SCHEMA, 0, buf,
|
||||
hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_SCHEMA, 0, buf,
|
||||
sizeof(buf)/sizeof(WCHAR), &size, 0);
|
||||
ok(hres == S_OK, "[%d] schema failed: %08x\n", i, hres);
|
||||
ok(size == lstrlenW(parse_tests[i].schema), "[%d] wrong size\n", i);
|
||||
@@ -345,7 +360,7 @@ static void test_CoInternetParseUrl(void)
|
||||
if(memcmp(parse_tests[i].url, wszRes, 3*sizeof(WCHAR))
|
||||
&& memcmp(parse_tests[i].url, wszAbout, 5*sizeof(WCHAR))) {
|
||||
memset(buf, 0xf0, sizeof(buf));
|
||||
hres = CoInternetParseUrl(parse_tests[i].url, PARSE_DOMAIN, 0, buf,
|
||||
hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_DOMAIN, 0, buf,
|
||||
sizeof(buf)/sizeof(WCHAR), &size, 0);
|
||||
ok(hres == parse_tests[i].domain_hres, "[%d] domain failed: %08x\n", i, hres);
|
||||
if(parse_tests[i].domain)
|
||||
@@ -353,7 +368,7 @@ static void test_CoInternetParseUrl(void)
|
||||
}
|
||||
|
||||
memset(buf, 0xf0, sizeof(buf));
|
||||
hres = CoInternetParseUrl(parse_tests[i].url, PARSE_ROOTDOCUMENT, 0, buf,
|
||||
hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_ROOTDOCUMENT, 0, buf,
|
||||
sizeof(buf)/sizeof(WCHAR), &size, 0);
|
||||
ok(hres == parse_tests[i].rootdocument_hres, "[%d] rootdocument failed: %08x\n", i, hres);
|
||||
if(parse_tests[i].rootdocument)
|
||||
@@ -366,18 +381,17 @@ static void test_CoInternetCompareUrl(void)
|
||||
HRESULT hres;
|
||||
|
||||
if (!pCoInternetCompareUrl) {
|
||||
win_skip("CoInternetCompareUrl not found\n");
|
||||
return;
|
||||
}
|
||||
|
||||
hres = pCoInternetCompareUrl(url1, url1, 0);
|
||||
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
|
||||
ok(hres == S_OK, "CoInternetCompareUrl failed: %08x\n", hres);
|
||||
|
||||
hres = pCoInternetCompareUrl(url1, url3, 0);
|
||||
ok(hres == S_FALSE, "CoInternetParseUrl failed: %08x\n", hres);
|
||||
ok(hres == S_FALSE, "CoInternetCompareUrl failed: %08x\n", hres);
|
||||
|
||||
hres = pCoInternetCompareUrl(url3, url1, 0);
|
||||
ok(hres == S_FALSE, "CoInternetParseUrl failed: %08x\n", hres);
|
||||
ok(hres == S_FALSE, "CoInternetCompareUrl failed: %08x\n", hres);
|
||||
}
|
||||
|
||||
static const struct {
|
||||
@@ -400,22 +414,26 @@ static void test_CoInternetQueryInfo(void)
|
||||
DWORD cb, i;
|
||||
HRESULT hres;
|
||||
|
||||
if (!pCoInternetQueryInfo) {
|
||||
return;
|
||||
}
|
||||
|
||||
for(i=0; i < sizeof(query_info_tests)/sizeof(query_info_tests[0]); i++) {
|
||||
cb = 0xdeadbeef;
|
||||
memset(buf, '?', sizeof(buf));
|
||||
hres = CoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, buf, sizeof(buf), &cb, 0);
|
||||
hres = pCoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, buf, sizeof(buf), &cb, 0);
|
||||
ok(hres == S_OK, "[%d] CoInternetQueryInfo failed: %08x\n", i, hres);
|
||||
ok(cb == sizeof(DWORD), "[%d] cb = %d\n", i, cb);
|
||||
ok(*(DWORD*)buf == query_info_tests[i].uses_net, "[%d] ret %x, expected %x\n",
|
||||
i, *(DWORD*)buf, query_info_tests[i].uses_net);
|
||||
|
||||
hres = CoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, buf, 3, &cb, 0);
|
||||
hres = pCoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, buf, 3, &cb, 0);
|
||||
ok(hres == E_FAIL, "[%d] CoInternetQueryInfo failed: %08x, expected E_FAIL\n", i, hres);
|
||||
hres = CoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, NULL, sizeof(buf), &cb, 0);
|
||||
hres = pCoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, NULL, sizeof(buf), &cb, 0);
|
||||
ok(hres == E_FAIL, "[%d] CoInternetQueryInfo failed: %08x, expected E_FAIL\n", i, hres);
|
||||
|
||||
memset(buf, '?', sizeof(buf));
|
||||
hres = CoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, buf, sizeof(buf), NULL, 0);
|
||||
hres = pCoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, buf, sizeof(buf), NULL, 0);
|
||||
ok(hres == S_OK, "[%d] CoInternetQueryInfo failed: %08x\n", i, hres);
|
||||
ok(*(DWORD*)buf == query_info_tests[i].uses_net, "[%d] ret %x, expected %x\n",
|
||||
i, *(DWORD*)buf, query_info_tests[i].uses_net);
|
||||
@@ -647,9 +665,13 @@ static void test_FindMimeFromData(void)
|
||||
LPWSTR mime;
|
||||
int i;
|
||||
|
||||
if (!pFindMimeFromData) {
|
||||
return;
|
||||
}
|
||||
|
||||
for(i=0; i<sizeof(mime_tests)/sizeof(mime_tests[0]); i++) {
|
||||
mime = (LPWSTR)0xf0f0f0f0;
|
||||
hres = FindMimeFromData(NULL, mime_tests[i].url, NULL, 0, NULL, 0, &mime, 0);
|
||||
hres = pFindMimeFromData(NULL, mime_tests[i].url, NULL, 0, NULL, 0, &mime, 0);
|
||||
if(mime_tests[i].mime) {
|
||||
ok(hres == S_OK, "[%d] FindMimeFromData failed: %08x\n", i, hres);
|
||||
ok(!lstrcmpW(mime, mime_tests[i].mime), "[%d] wrong mime\n", i);
|
||||
@@ -662,26 +684,26 @@ static void test_FindMimeFromData(void)
|
||||
}
|
||||
|
||||
mime = (LPWSTR)0xf0f0f0f0;
|
||||
hres = FindMimeFromData(NULL, mime_tests[i].url, NULL, 0, mimeTextPlain, 0, &mime, 0);
|
||||
hres = pFindMimeFromData(NULL, mime_tests[i].url, NULL, 0, mimeTextPlain, 0, &mime, 0);
|
||||
ok(hres == S_OK, "[%d] FindMimeFromData failed: %08x\n", i, hres);
|
||||
ok(!lstrcmpW(mime, mimeTextPlain), "[%d] wrong mime\n", i);
|
||||
CoTaskMemFree(mime);
|
||||
|
||||
mime = (LPWSTR)0xf0f0f0f0;
|
||||
hres = FindMimeFromData(NULL, mime_tests[i].url, NULL, 0, mimeAppOctetStream, 0, &mime, 0);
|
||||
hres = pFindMimeFromData(NULL, mime_tests[i].url, NULL, 0, mimeAppOctetStream, 0, &mime, 0);
|
||||
ok(hres == S_OK, "[%d] FindMimeFromData failed: %08x\n", i, hres);
|
||||
ok(!lstrcmpW(mime, mimeAppOctetStream), "[%d] wrong mime\n", i);
|
||||
CoTaskMemFree(mime);
|
||||
}
|
||||
|
||||
for(i=0; i < sizeof(mime_tests2)/sizeof(mime_tests2[0]); i++) {
|
||||
hres = FindMimeFromData(NULL, NULL, mime_tests2[i].data, mime_tests2[i].size,
|
||||
hres = pFindMimeFromData(NULL, NULL, mime_tests2[i].data, mime_tests2[i].size,
|
||||
NULL, 0, &mime, 0);
|
||||
ok(hres == S_OK, "[%d] FindMimeFromData failed: %08x\n", i, hres);
|
||||
ok(!lstrcmpW(mime, mime_tests2[i].mime), "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
|
||||
CoTaskMemFree(mime);
|
||||
|
||||
hres = FindMimeFromData(NULL, NULL, mime_tests2[i].data, mime_tests2[i].size,
|
||||
hres = pFindMimeFromData(NULL, NULL, mime_tests2[i].data, mime_tests2[i].size,
|
||||
mimeTextHtml, 0, &mime, 0);
|
||||
ok(hres == S_OK, "[%d] FindMimeFromData failed: %08x\n", i, hres);
|
||||
if(!lstrcmpW(mimeAppOctetStream, mime_tests2[i].mime)
|
||||
@@ -691,7 +713,7 @@ static void test_FindMimeFromData(void)
|
||||
ok(!lstrcmpW(mime, mime_tests2[i].mime), "[%d] wrong mime\n", i);
|
||||
CoTaskMemFree(mime);
|
||||
|
||||
hres = FindMimeFromData(NULL, NULL, mime_tests2[i].data, mime_tests2[i].size,
|
||||
hres = pFindMimeFromData(NULL, NULL, mime_tests2[i].data, mime_tests2[i].size,
|
||||
mimeImagePjpeg, 0, &mime, 0);
|
||||
ok(hres == S_OK, "[%d] FindMimeFromData failed: %08x\n", i, hres);
|
||||
if(!lstrcmpW(mimeAppOctetStream, mime_tests2[i].mime) || i == 17)
|
||||
@@ -704,39 +726,39 @@ static void test_FindMimeFromData(void)
|
||||
CoTaskMemFree(mime);
|
||||
}
|
||||
|
||||
hres = FindMimeFromData(NULL, url1, data1, sizeof(data1), NULL, 0, &mime, 0);
|
||||
hres = pFindMimeFromData(NULL, url1, data1, sizeof(data1), NULL, 0, &mime, 0);
|
||||
ok(hres == S_OK, "FindMimeFromData failed: %08x\n", hres);
|
||||
ok(!lstrcmpW(mime, mimeTextPlain), "wrong mime\n");
|
||||
CoTaskMemFree(mime);
|
||||
|
||||
hres = FindMimeFromData(NULL, url1, data1, sizeof(data1), mimeAppOctetStream, 0, &mime, 0);
|
||||
hres = pFindMimeFromData(NULL, url1, data1, sizeof(data1), mimeAppOctetStream, 0, &mime, 0);
|
||||
ok(hres == S_OK, "FindMimeFromData failed: %08x\n", hres);
|
||||
ok(!lstrcmpW(mime, mimeTextPlain), "wrong mime\n");
|
||||
CoTaskMemFree(mime);
|
||||
|
||||
hres = FindMimeFromData(NULL, url4, data1, sizeof(data1), mimeAppOctetStream, 0, &mime, 0);
|
||||
hres = pFindMimeFromData(NULL, url4, data1, sizeof(data1), mimeAppOctetStream, 0, &mime, 0);
|
||||
ok(hres == S_OK, "FindMimeFromData failed: %08x\n", hres);
|
||||
ok(!lstrcmpW(mime, mimeTextPlain), "wrong mime\n");
|
||||
CoTaskMemFree(mime);
|
||||
|
||||
hres = FindMimeFromData(NULL, NULL, NULL, 0, NULL, 0, &mime, 0);
|
||||
hres = pFindMimeFromData(NULL, NULL, NULL, 0, NULL, 0, &mime, 0);
|
||||
ok(hres == E_INVALIDARG, "FindMimeFromData failed: %08x, excepted E_INVALIDARG\n", hres);
|
||||
|
||||
hres = FindMimeFromData(NULL, NULL, NULL, 0, mimeTextPlain, 0, &mime, 0);
|
||||
hres = pFindMimeFromData(NULL, NULL, NULL, 0, mimeTextPlain, 0, &mime, 0);
|
||||
ok(hres == E_INVALIDARG, "FindMimeFromData failed: %08x, expected E_INVALIDARG\n", hres);
|
||||
|
||||
hres = FindMimeFromData(NULL, NULL, data1, 0, NULL, 0, &mime, 0);
|
||||
hres = pFindMimeFromData(NULL, NULL, data1, 0, NULL, 0, &mime, 0);
|
||||
ok(hres == E_FAIL, "FindMimeFromData failed: %08x, expected E_FAIL\n", hres);
|
||||
|
||||
hres = FindMimeFromData(NULL, url1, data1, 0, NULL, 0, &mime, 0);
|
||||
hres = pFindMimeFromData(NULL, url1, data1, 0, NULL, 0, &mime, 0);
|
||||
ok(hres == E_FAIL, "FindMimeFromData failed: %08x, expected E_FAIL\n", hres);
|
||||
|
||||
hres = FindMimeFromData(NULL, NULL, data1, 0, mimeTextPlain, 0, &mime, 0);
|
||||
hres = pFindMimeFromData(NULL, NULL, data1, 0, mimeTextPlain, 0, &mime, 0);
|
||||
ok(hres == S_OK, "FindMimeFromData failed: %08x\n", hres);
|
||||
ok(!lstrcmpW(mime, mimeTextPlain), "wrong mime\n");
|
||||
CoTaskMemFree(mime);
|
||||
|
||||
hres = FindMimeFromData(NULL, NULL, data1, 0, mimeTextPlain, 0, NULL, 0);
|
||||
hres = pFindMimeFromData(NULL, NULL, data1, 0, mimeTextPlain, 0, NULL, 0);
|
||||
ok(hres == E_INVALIDARG, "FindMimeFromData failed: %08x, expected E_INVALIDARG\n", hres);
|
||||
}
|
||||
|
||||
@@ -748,7 +770,11 @@ static void register_protocols(void)
|
||||
|
||||
static const WCHAR wszAbout[] = {'a','b','o','u','t',0};
|
||||
|
||||
hres = CoInternetGetSession(0, &session, 0);
|
||||
if (!pCoInternetGetSession) {
|
||||
return;
|
||||
}
|
||||
|
||||
hres = pCoInternetGetSession(0, &session, 0);
|
||||
ok(hres == S_OK, "CoInternetGetSession failed: %08x\n", hres);
|
||||
if(FAILED(hres))
|
||||
return;
|
||||
@@ -921,7 +947,11 @@ static void test_NameSpace(void)
|
||||
|
||||
static const WCHAR wszTest[] = {'t','e','s','t',0};
|
||||
|
||||
hres = CoInternetGetSession(0, &session, 0);
|
||||
if (!pCoInternetGetSession || !pCoInternetParseUrl) {
|
||||
return;
|
||||
}
|
||||
|
||||
hres = pCoInternetGetSession(0, &session, 0);
|
||||
ok(hres == S_OK, "CoInternetGetSession failed: %08x\n", hres);
|
||||
if(FAILED(hres))
|
||||
return;
|
||||
@@ -944,7 +974,7 @@ static void test_NameSpace(void)
|
||||
SET_EXPECT(CreateInstance);
|
||||
SET_EXPECT(ParseUrl);
|
||||
|
||||
hres = CoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
&size, 0);
|
||||
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
|
||||
|
||||
@@ -956,7 +986,7 @@ static void test_NameSpace(void)
|
||||
SET_EXPECT(QI_IInternetProtocolInfo);
|
||||
SET_EXPECT(ParseUrl);
|
||||
|
||||
hres = CoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
&size, 0);
|
||||
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
|
||||
|
||||
@@ -966,7 +996,7 @@ static void test_NameSpace(void)
|
||||
SET_EXPECT(QI_IInternetProtocolInfo);
|
||||
SET_EXPECT(ParseUrl);
|
||||
|
||||
hres = CoInternetParseUrl(url8, PARSE_SECURITY_URL, 0, buf,
|
||||
hres = pCoInternetParseUrl(url8, PARSE_SECURITY_URL, 0, buf,
|
||||
sizeof(buf)/sizeof(WCHAR), &size, 0);
|
||||
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
|
||||
ok(size == sizeof(url1)/sizeof(WCHAR), "Size = %d\n", size);
|
||||
@@ -979,22 +1009,24 @@ static void test_NameSpace(void)
|
||||
SET_EXPECT(QI_IInternetProtocolInfo);
|
||||
SET_EXPECT(ParseUrl);
|
||||
|
||||
hres = CoInternetGetSecurityUrl(url8, &sec_url, PSU_SECURITY_URL_ONLY, 0);
|
||||
ok(hres == S_OK, "CoInternetGetSecurityUrl failed: %08x\n", hres);
|
||||
if(hres == S_OK) {
|
||||
ok(lstrlenW(sec_url)>sizeof(wszFile)/sizeof(WCHAR) &&
|
||||
!memcmp(sec_url, wszFile, sizeof(wszFile)-sizeof(WCHAR)),
|
||||
"Encoded url = %s\n", wine_dbgstr_w(sec_url));
|
||||
CoTaskMemFree(sec_url);
|
||||
}
|
||||
if (pCoInternetGetSecurityUrl) {
|
||||
hres = pCoInternetGetSecurityUrl(url8, &sec_url, PSU_SECURITY_URL_ONLY, 0);
|
||||
ok(hres == S_OK, "CoInternetGetSecurityUrl failed: %08x\n", hres);
|
||||
if(hres == S_OK) {
|
||||
ok(lstrlenW(sec_url)>sizeof(wszFile)/sizeof(WCHAR) &&
|
||||
!memcmp(sec_url, wszFile, sizeof(wszFile)-sizeof(WCHAR)),
|
||||
"Encoded url = %s\n", wine_dbgstr_w(sec_url));
|
||||
CoTaskMemFree(sec_url);
|
||||
}
|
||||
|
||||
CHECK_CALLED(QI_IInternetProtocolInfo);
|
||||
CHECK_CALLED(ParseUrl);
|
||||
CHECK_CALLED(QI_IInternetProtocolInfo);
|
||||
CHECK_CALLED(ParseUrl);
|
||||
}
|
||||
|
||||
hres = IInternetSession_UnregisterNameSpace(session, &test_protocol_cf, wszTest);
|
||||
ok(hres == S_OK, "UnregisterNameSpace failed: %08x\n", hres);
|
||||
|
||||
hres = CoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
&size, 0);
|
||||
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
|
||||
|
||||
@@ -1013,7 +1045,7 @@ static void test_NameSpace(void)
|
||||
SET_EXPECT(QI_IInternetProtocolInfo);
|
||||
SET_EXPECT(ParseUrl);
|
||||
|
||||
hres = CoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
&size, 0);
|
||||
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
|
||||
|
||||
@@ -1026,7 +1058,7 @@ static void test_NameSpace(void)
|
||||
SET_EXPECT(QI_IInternetProtocolInfo);
|
||||
SET_EXPECT(ParseUrl);
|
||||
|
||||
hres = CoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
&size, 0);
|
||||
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
|
||||
|
||||
@@ -1040,7 +1072,7 @@ static void test_NameSpace(void)
|
||||
SET_EXPECT(QI_IInternetProtocolInfo);
|
||||
SET_EXPECT(ParseUrl);
|
||||
|
||||
hres = CoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
&size, 0);
|
||||
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
|
||||
|
||||
@@ -1059,7 +1091,7 @@ static void test_NameSpace(void)
|
||||
hres = IInternetSession_UnregisterNameSpace(session, &test_protocol_cf2, wszTest);
|
||||
ok(hres == S_OK, "UnregisterNameSpace failed: %08x\n", hres);
|
||||
|
||||
hres = CoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, sizeof(buf)/sizeof(WCHAR),
|
||||
&size, 0);
|
||||
ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres);
|
||||
|
||||
@@ -1073,7 +1105,11 @@ static void test_MimeFilter(void)
|
||||
|
||||
static const WCHAR mimeW[] = {'t','e','s','t','/','m','i','m','e',0};
|
||||
|
||||
hres = CoInternetGetSession(0, &session, 0);
|
||||
if (!pCoInternetGetSession) {
|
||||
return;
|
||||
}
|
||||
|
||||
hres = pCoInternetGetSession(0, &session, 0);
|
||||
ok(hres == S_OK, "CoInternetGetSession failed: %08x\n", hres);
|
||||
if(FAILED(hres))
|
||||
return;
|
||||
@@ -1110,13 +1146,17 @@ static void test_ReleaseBindInfo(void)
|
||||
BINDINFO bi;
|
||||
IUnknown unk = { &unk_vtbl };
|
||||
|
||||
ReleaseBindInfo(NULL); /* shouldn't crash */
|
||||
if (!pReleaseBindInfo) {
|
||||
return;
|
||||
}
|
||||
|
||||
pReleaseBindInfo(NULL); /* shouldn't crash */
|
||||
|
||||
memset(&bi, 0, sizeof(bi));
|
||||
bi.cbSize = sizeof(BINDINFO);
|
||||
bi.pUnk = &unk;
|
||||
SET_EXPECT(unk_Release);
|
||||
ReleaseBindInfo(&bi);
|
||||
pReleaseBindInfo(&bi);
|
||||
ok(bi.cbSize == sizeof(BINDINFO), "bi.cbSize=%d\n", bi.cbSize);
|
||||
ok(bi.pUnk == NULL, "bi.pUnk=%p, expected NULL\n", bi.pUnk);
|
||||
CHECK_CALLED(unk_Release);
|
||||
@@ -1124,13 +1164,13 @@ static void test_ReleaseBindInfo(void)
|
||||
memset(&bi, 0, sizeof(bi));
|
||||
bi.cbSize = offsetof(BINDINFO, pUnk);
|
||||
bi.pUnk = &unk;
|
||||
ReleaseBindInfo(&bi);
|
||||
pReleaseBindInfo(&bi);
|
||||
ok(bi.cbSize == offsetof(BINDINFO, pUnk), "bi.cbSize=%d\n", bi.cbSize);
|
||||
ok(bi.pUnk == &unk, "bi.pUnk=%p, expected %p\n", bi.pUnk, &unk);
|
||||
|
||||
memset(&bi, 0, sizeof(bi));
|
||||
bi.pUnk = &unk;
|
||||
ReleaseBindInfo(&bi);
|
||||
pReleaseBindInfo(&bi);
|
||||
ok(!bi.cbSize, "bi.cbSize=%d, expected 0\n", bi.cbSize);
|
||||
ok(bi.pUnk == &unk, "bi.pUnk=%p, expected %p\n", bi.pUnk, &unk);
|
||||
}
|
||||
@@ -1143,12 +1183,17 @@ static void test_CopyStgMedium(void)
|
||||
|
||||
static WCHAR fileW[] = {'f','i','l','e',0};
|
||||
|
||||
if (!pCopyStgMedium) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
memset(&src, 0xf0, sizeof(src));
|
||||
memset(&dst, 0xe0, sizeof(dst));
|
||||
memset(&empty, 0xf0, sizeof(empty));
|
||||
src.tymed = TYMED_NULL;
|
||||
src.pUnkForRelease = NULL;
|
||||
hres = CopyStgMedium(&src, &dst);
|
||||
hres = pCopyStgMedium(&src, &dst);
|
||||
ok(hres == S_OK, "CopyStgMedium failed: %08x\n", hres);
|
||||
ok(dst.tymed == TYMED_NULL, "tymed=%d\n", dst.tymed);
|
||||
ok(dst.u.hGlobal == empty, "u=%p\n", dst.u.hGlobal);
|
||||
@@ -1158,7 +1203,7 @@ static void test_CopyStgMedium(void)
|
||||
src.tymed = TYMED_ISTREAM;
|
||||
src.u.pstm = NULL;
|
||||
src.pUnkForRelease = NULL;
|
||||
hres = CopyStgMedium(&src, &dst);
|
||||
hres = pCopyStgMedium(&src, &dst);
|
||||
ok(hres == S_OK, "CopyStgMedium failed: %08x\n", hres);
|
||||
ok(dst.tymed == TYMED_ISTREAM, "tymed=%d\n", dst.tymed);
|
||||
ok(!dst.u.pstm, "pstm=%p\n", dst.u.pstm);
|
||||
@@ -1168,16 +1213,16 @@ static void test_CopyStgMedium(void)
|
||||
src.tymed = TYMED_FILE;
|
||||
src.u.lpszFileName = fileW;
|
||||
src.pUnkForRelease = NULL;
|
||||
hres = CopyStgMedium(&src, &dst);
|
||||
hres = pCopyStgMedium(&src, &dst);
|
||||
ok(hres == S_OK, "CopyStgMedium failed: %08x\n", hres);
|
||||
ok(dst.tymed == TYMED_FILE, "tymed=%d\n", dst.tymed);
|
||||
ok(dst.u.lpszFileName && dst.u.lpszFileName != fileW, "lpszFileName=%p\n", dst.u.lpszFileName);
|
||||
ok(!lstrcmpW(dst.u.lpszFileName, fileW), "wrong file name\n");
|
||||
ok(!dst.pUnkForRelease, "pUnkForRelease=%p, expected NULL\n", dst.pUnkForRelease);
|
||||
|
||||
hres = CopyStgMedium(&src, NULL);
|
||||
hres = pCopyStgMedium(&src, NULL);
|
||||
ok(hres == E_POINTER, "CopyStgMedium failed: %08x, expected E_POINTER\n", hres);
|
||||
hres = CopyStgMedium(NULL, &dst);
|
||||
hres = pCopyStgMedium(NULL, &dst);
|
||||
ok(hres == E_POINTER, "CopyStgMedium failed: %08x, expected E_POINTER\n", hres);
|
||||
}
|
||||
|
||||
@@ -1186,36 +1231,41 @@ static void test_UrlMkGetSessionOption(void)
|
||||
DWORD encoding, size;
|
||||
HRESULT hres;
|
||||
|
||||
|
||||
if (!pUrlMkGetSessionOption) {
|
||||
return;
|
||||
}
|
||||
|
||||
size = encoding = 0xdeadbeef;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, &encoding,
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, &encoding,
|
||||
sizeof(encoding), &size, 0);
|
||||
ok(hres == S_OK, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(encoding != 0xdeadbeef, "encoding not changed\n");
|
||||
ok(size == sizeof(encoding), "size=%d\n", size);
|
||||
|
||||
size = encoding = 0xdeadbeef;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, &encoding,
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, &encoding,
|
||||
sizeof(encoding)+1, &size, 0);
|
||||
ok(hres == S_OK, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(encoding != 0xdeadbeef, "encoding not changed\n");
|
||||
ok(size == sizeof(encoding), "size=%d\n", size);
|
||||
|
||||
size = encoding = 0xdeadbeef;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, &encoding,
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, &encoding,
|
||||
sizeof(encoding)-1, &size, 0);
|
||||
ok(hres == E_INVALIDARG, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(encoding == 0xdeadbeef, "encoding = %08x, exepcted 0xdeadbeef\n", encoding);
|
||||
ok(size == 0xdeadbeef, "size=%d\n", size);
|
||||
|
||||
size = encoding = 0xdeadbeef;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, NULL,
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, NULL,
|
||||
sizeof(encoding)-1, &size, 0);
|
||||
ok(hres == E_INVALIDARG, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(encoding == 0xdeadbeef, "encoding = %08x, exepcted 0xdeadbeef\n", encoding);
|
||||
ok(size == 0xdeadbeef, "size=%d\n", size);
|
||||
|
||||
encoding = 0xdeadbeef;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, &encoding,
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, &encoding,
|
||||
sizeof(encoding)-1, NULL, 0);
|
||||
ok(hres == E_INVALIDARG, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(encoding == 0xdeadbeef, "encoding = %08x, exepcted 0xdeadbeef\n", encoding);
|
||||
@@ -1231,34 +1281,38 @@ static void test_user_agent(void)
|
||||
HRESULT hres;
|
||||
DWORD size, saved;
|
||||
|
||||
hres = ObtainUserAgentString(0, NULL, NULL);
|
||||
if (!pObtainUserAgentString || !pUrlMkGetSessionOption) {
|
||||
return;
|
||||
}
|
||||
|
||||
hres = pObtainUserAgentString(0, NULL, NULL);
|
||||
ok(hres == E_INVALIDARG, "ObtainUserAgentString failed: %08x\n", hres);
|
||||
|
||||
size = 100;
|
||||
hres = ObtainUserAgentString(0, NULL, &size);
|
||||
hres = pObtainUserAgentString(0, NULL, &size);
|
||||
ok(hres == E_INVALIDARG, "ObtainUserAgentString failed: %08x\n", hres);
|
||||
ok(size == 100, "size=%d, expected %d\n", size, 100);
|
||||
|
||||
size = 0;
|
||||
hres = ObtainUserAgentString(0, str, &size);
|
||||
hres = pObtainUserAgentString(0, str, &size);
|
||||
ok(hres == E_OUTOFMEMORY, "ObtainUserAgentString failed: %08x\n", hres);
|
||||
ok(size > 0, "size=%d, expected non-zero\n", size);
|
||||
|
||||
size = 2;
|
||||
str[0] = 'a';
|
||||
hres = ObtainUserAgentString(0, str, &size);
|
||||
hres = pObtainUserAgentString(0, str, &size);
|
||||
ok(hres == E_OUTOFMEMORY, "ObtainUserAgentString failed: %08x\n", hres);
|
||||
ok(size > 0, "size=%d, expected non-zero\n", size);
|
||||
ok(str[0] == 'a', "str[0]=%c, expected 'a'\n", str[0]);
|
||||
|
||||
size = 0;
|
||||
hres = ObtainUserAgentString(1, str, &size);
|
||||
hres = pObtainUserAgentString(1, str, &size);
|
||||
ok(hres == E_OUTOFMEMORY, "ObtainUserAgentString failed: %08x\n", hres);
|
||||
ok(size > 0, "size=%d, expected non-zero\n", size);
|
||||
|
||||
str2 = HeapAlloc(GetProcessHeap(), 0, (size+20)*sizeof(CHAR));
|
||||
saved = size;
|
||||
hres = ObtainUserAgentString(0, str2, &size);
|
||||
hres = pObtainUserAgentString(0, str2, &size);
|
||||
ok(hres == S_OK, "ObtainUserAgentString failed: %08x\n", hres);
|
||||
ok(size == saved, "size=%d, expected %d\n", size, saved);
|
||||
ok(strlen(expected) <= strlen(str2) &&
|
||||
@@ -1267,23 +1321,23 @@ static void test_user_agent(void)
|
||||
str2, expected);
|
||||
|
||||
size = saved+10;
|
||||
hres = ObtainUserAgentString(0, str2, &size);
|
||||
hres = pObtainUserAgentString(0, str2, &size);
|
||||
ok(hres == S_OK, "ObtainUserAgentString failed: %08x\n", hres);
|
||||
ok(size == saved, "size=%d, expected %d\n", size, saved);
|
||||
|
||||
size = 0;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, NULL, 0, &size, 0);
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, NULL, 0, &size, 0);
|
||||
ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(size, "size == 0\n");
|
||||
|
||||
size = 0xdeadbeef;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, NULL, 1000, &size, 0);
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, NULL, 1000, &size, 0);
|
||||
ok(hres == E_INVALIDARG, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(size, "size == 0\n");
|
||||
|
||||
saved = size;
|
||||
size = 0;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved+10, &size, 0);
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved+10, &size, 0);
|
||||
ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(size == saved, "size = %d, expected %d\n", size, saved);
|
||||
ok(sizeof(expected) <= strlen(str2) && !memcmp(expected, str2, sizeof(expected)-1),
|
||||
@@ -1292,7 +1346,7 @@ static void test_user_agent(void)
|
||||
|
||||
size = 0;
|
||||
str2[0] = 0;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, &size, 0);
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, &size, 0);
|
||||
ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(size == saved, "size = %d, expected %d\n", size, saved);
|
||||
ok(sizeof(expected) <= strlen(str2) && !memcmp(expected, str2, sizeof(expected)-1),
|
||||
@@ -1301,14 +1355,14 @@ static void test_user_agent(void)
|
||||
|
||||
size = saved;
|
||||
str2[0] = 0;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved-1, &size, 0);
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved-1, &size, 0);
|
||||
ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(size == saved, "size = %d, expected %d\n", size, saved);
|
||||
ok(!str2[0], "buf changed\n");
|
||||
|
||||
size = saved;
|
||||
str2[0] = 0;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, NULL, 0);
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, NULL, 0);
|
||||
ok(hres == E_INVALIDARG, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(!str2[0], "buf changed\n");
|
||||
|
||||
@@ -1317,7 +1371,7 @@ static void test_user_agent(void)
|
||||
|
||||
size = 0;
|
||||
str2[0] = 0;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, &size, 0);
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, &size, 0);
|
||||
ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(size == sizeof(test_str) && !memcmp(str2, test_str, sizeof(test_str)), "wrong user agent\n");
|
||||
|
||||
@@ -1326,7 +1380,7 @@ static void test_user_agent(void)
|
||||
|
||||
size = 0;
|
||||
str2[0] = 0;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, &size, 0);
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, &size, 0);
|
||||
ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(size == sizeof(test_str) && !memcmp(str2, test_str, sizeof(test_str)), "wrong user agent\n");
|
||||
|
||||
@@ -1335,7 +1389,7 @@ static void test_user_agent(void)
|
||||
|
||||
size = 0;
|
||||
str2[0] = 0;
|
||||
hres = UrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, &size, 0);
|
||||
hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, &size, 0);
|
||||
ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08x\n", hres);
|
||||
ok(size == 3 && !strcmp(str2, "te"), "wrong user agent\n");
|
||||
|
||||
@@ -1364,8 +1418,50 @@ static void test_MkParseDisplayNameEx(void)
|
||||
'2','0','D','0','4','F','E','0','-','3','A','E','A','-','1','0','6','9','-','A','2','D','8',
|
||||
'-','0','8','0','0','2','B','3','0','3','0','9','D',':',0};
|
||||
|
||||
const struct
|
||||
{
|
||||
LPBC *ppbc;
|
||||
LPCWSTR szDisplayName;
|
||||
ULONG *pchEaten;
|
||||
LPMONIKER *ppmk;
|
||||
} invalid_parameters[] =
|
||||
{
|
||||
{NULL, NULL, NULL, NULL},
|
||||
{NULL, NULL, NULL, &mon},
|
||||
{NULL, NULL, &eaten, NULL},
|
||||
{NULL, NULL, &eaten, &mon},
|
||||
{NULL, wszEmpty, NULL, NULL},
|
||||
{NULL, wszEmpty, NULL, &mon},
|
||||
{NULL, wszEmpty, &eaten, NULL},
|
||||
{NULL, wszEmpty, &eaten, &mon},
|
||||
{&bctx, NULL, NULL, NULL},
|
||||
{&bctx, NULL, NULL, &mon},
|
||||
{&bctx, NULL, &eaten, NULL},
|
||||
{&bctx, NULL, &eaten, &mon},
|
||||
{&bctx, wszEmpty, NULL, NULL},
|
||||
{&bctx, wszEmpty, NULL, &mon},
|
||||
{&bctx, wszEmpty, &eaten, NULL},
|
||||
{&bctx, wszEmpty, &eaten, &mon},
|
||||
};
|
||||
|
||||
int i;
|
||||
|
||||
CreateBindCtx(0, &bctx);
|
||||
|
||||
for (i = 0; i < sizeof(invalid_parameters)/sizeof(invalid_parameters[0]); i++)
|
||||
{
|
||||
eaten = 0xdeadbeef;
|
||||
mon = (IMoniker *)0xdeadbeef;
|
||||
hres = MkParseDisplayNameEx(invalid_parameters[i].ppbc ? *invalid_parameters[i].ppbc : NULL,
|
||||
invalid_parameters[i].szDisplayName,
|
||||
invalid_parameters[i].pchEaten,
|
||||
invalid_parameters[i].ppmk);
|
||||
ok(hres == E_INVALIDARG,
|
||||
"[%d] Expected MkParseDisplayNameEx to return E_INVALIDARG, got %08x\n", i, hres);
|
||||
ok(eaten == 0xdeadbeef, "[%d] Expected eaten to be 0xdeadbeef, got %u\n", i, eaten);
|
||||
ok(mon == (IMoniker *)0xdeadbeef, "[%d] Expected mon to be 0xdeadbeef, got %p\n", i, mon);
|
||||
}
|
||||
|
||||
hres = MkParseDisplayNameEx(bctx, url9, &eaten, &mon);
|
||||
ok(hres == S_OK, "MkParseDisplayNameEx failed: %08x\n", hres);
|
||||
ok(eaten == sizeof(url9)/sizeof(WCHAR)-1, "eaten=%d\n", eaten);
|
||||
@@ -1413,10 +1509,24 @@ START_TEST(misc)
|
||||
|
||||
OleInitialize(NULL);
|
||||
|
||||
register_protocols();
|
||||
|
||||
hurlmon = GetModuleHandle("urlmon.dll");
|
||||
pCoInternetCompareUrl = (void *) GetProcAddress(hurlmon, "CoInternetCompareUrl");
|
||||
pCoInternetGetSecurityUrl = (void*) GetProcAddress(hurlmon, "CoInternetGetSecurityUrl");
|
||||
pCoInternetGetSession = (void*) GetProcAddress(hurlmon, "CoInternetGetSession");
|
||||
pCoInternetParseUrl = (void*) GetProcAddress(hurlmon, "CoInternetParseUrl");
|
||||
pCoInternetQueryInfo = (void*) GetProcAddress(hurlmon, "CoInternetQueryInfo");
|
||||
pCopyStgMedium = (void*) GetProcAddress(hurlmon, "CopyStgMedium");
|
||||
pFindMimeFromData = (void*) GetProcAddress(hurlmon, "FindMimeFromData");
|
||||
pObtainUserAgentString = (void*) GetProcAddress(hurlmon, "ObtainUserAgentString");
|
||||
pReleaseBindInfo = (void*) GetProcAddress(hurlmon, "ReleaseBindInfo");
|
||||
pUrlMkGetSessionOption = (void*) GetProcAddress(hurlmon, "UrlMkGetSessionOption");
|
||||
|
||||
if (!pCoInternetCompareUrl || !pCoInternetGetSecurityUrl ||
|
||||
!pCoInternetGetSession || !pCoInternetParseUrl) {
|
||||
win_skip("Various needed functions not present in IE 4.0\n");
|
||||
}
|
||||
|
||||
register_protocols();
|
||||
|
||||
test_CreateFormatEnum();
|
||||
test_RegisterFormatEnumerator();
|
||||
|
||||
@@ -29,6 +29,9 @@
|
||||
#include "urlmon.h"
|
||||
#include "wininet.h"
|
||||
|
||||
static HRESULT (WINAPI *pCoInternetGetSession)(DWORD, IInternetSession **, DWORD);
|
||||
static HRESULT (WINAPI *pReleaseBindInfo)(BINDINFO*);
|
||||
|
||||
#define DEFINE_EXPECT(func) \
|
||||
static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
|
||||
|
||||
@@ -1318,7 +1321,7 @@ static HRESULT WINAPI ProtocolEmul_Start(IInternetProtocol *iface, LPCWSTR szUrl
|
||||
ok(cbindf == (bindf|BINDF_FROMURLMON), "bindf = %x, expected %x\n",
|
||||
cbindf, (bindf|BINDF_FROMURLMON));
|
||||
ok(!memcmp(&exp_bindinfo, &bindinfo, sizeof(bindinfo)), "unexpected bindinfo\n");
|
||||
ReleaseBindInfo(&bindinfo);
|
||||
pReleaseBindInfo(&bindinfo);
|
||||
|
||||
SET_EXPECT(ReportProgress_SENDINGREQUEST);
|
||||
hres = IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_SENDINGREQUEST, emptyW);
|
||||
@@ -2241,6 +2244,7 @@ static void test_file_protocol(void) {
|
||||
static const WCHAR wszFile[] = {'f','i','l','e',':',0};
|
||||
static const WCHAR wszFile2[] = {'f','i','l','e',':','/','/',0};
|
||||
static const WCHAR wszFile3[] = {'f','i','l','e',':','/','/','/',0};
|
||||
static const WCHAR wszFile4[] = {'f','i','l','e',':','\\','\\',0};
|
||||
static const char html_doc[] = "<HTML></HTML>";
|
||||
|
||||
trace("Testing file protocol...\n");
|
||||
@@ -2306,6 +2310,20 @@ static void test_file_protocol(void) {
|
||||
bindf = BINDF_FROMURLMON;
|
||||
test_file_protocol_url(buf);
|
||||
|
||||
memcpy(buf, wszFile4, sizeof(wszFile4));
|
||||
len = GetCurrentDirectoryW(sizeof(file_name_buf)/sizeof(WCHAR), file_name_buf);
|
||||
file_name_buf[len++] = '\\';
|
||||
memcpy(file_name_buf+len, wszIndexHtml, sizeof(wszIndexHtml));
|
||||
lstrcpyW(buf+sizeof(wszFile4)/sizeof(WCHAR)-1, file_name_buf);
|
||||
file_name = file_name_buf;
|
||||
bindf = 0;
|
||||
test_file_protocol_url(buf);
|
||||
bindf = BINDF_FROMURLMON;
|
||||
test_file_protocol_url(buf);
|
||||
|
||||
buf[sizeof(wszFile4)/sizeof(WCHAR)] = '|';
|
||||
test_file_protocol_url(buf);
|
||||
|
||||
DeleteFileW(wszIndexHtml);
|
||||
|
||||
bindf = 0;
|
||||
@@ -2778,7 +2796,7 @@ static void test_CreateBinding(void)
|
||||
trace("Testing CreateBinding...\n");
|
||||
init_test(BIND_TEST, TEST_BINDING);
|
||||
|
||||
hres = CoInternetGetSession(0, &session, 0);
|
||||
hres = pCoInternetGetSession(0, &session, 0);
|
||||
ok(hres == S_OK, "CoInternetGetSession failed: %08x\n", hres);
|
||||
|
||||
hres = IInternetSession_RegisterNameSpace(session, &ClassFactory, &IID_NULL, wsz_test, 0, NULL, 0);
|
||||
@@ -2917,7 +2935,7 @@ static void test_binding(int prot, DWORD grf_pi, DWORD test_flags)
|
||||
|
||||
init_test(prot, test_flags|TEST_BINDING);
|
||||
|
||||
hres = CoInternetGetSession(0, &session, 0);
|
||||
hres = pCoInternetGetSession(0, &session, 0);
|
||||
ok(hres == S_OK, "CoInternetGetSession failed: %08x\n", hres);
|
||||
|
||||
if(test_flags & TEST_EMULATEPROT) {
|
||||
@@ -3027,7 +3045,8 @@ static void register_filter(void)
|
||||
|
||||
static const WCHAR gzipW[] = {'g','z','i','p',0};
|
||||
|
||||
CoInternetGetSession(0, &session, 0);
|
||||
hres = pCoInternetGetSession(0, &session, 0);
|
||||
ok(hres == S_OK, "CoInternetGetSession failed: %08x\n", hres);
|
||||
|
||||
hres = IInternetSession_RegisterMimeFilter(session, &mimefilter_cf, &IID_IInternetProtocol, gzipW);
|
||||
ok(hres == S_OK, "RegisterMimeFilter failed: %08x\n", hres);
|
||||
@@ -3037,6 +3056,17 @@ static void register_filter(void)
|
||||
|
||||
START_TEST(protocol)
|
||||
{
|
||||
HMODULE hurlmon;
|
||||
|
||||
hurlmon = GetModuleHandle("urlmon.dll");
|
||||
pCoInternetGetSession = (void*) GetProcAddress(hurlmon, "CoInternetGetSession");
|
||||
pReleaseBindInfo = (void*) GetProcAddress(hurlmon, "ReleaseBindInfo");
|
||||
|
||||
if (!pCoInternetGetSession || !pReleaseBindInfo) {
|
||||
win_skip("Various needed functions not present in IE 4.0\n");
|
||||
return;
|
||||
}
|
||||
|
||||
OleInitialize(NULL);
|
||||
|
||||
event_complete = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
|
||||
#include "initguid.h"
|
||||
|
||||
|
||||
static HRESULT (WINAPI *pCoInternetCreateSecurityManager)(IServiceProvider *, IInternetSecurityManager**, DWORD);
|
||||
static HRESULT (WINAPI *pCoInternetCreateZoneManager)(IServiceProvider *, IInternetZoneManager**, DWORD);
|
||||
static HRESULT (WINAPI *pCoInternetGetSecurityUrl)(LPCWSTR, LPWSTR*, PSUACTION, DWORD);
|
||||
|
||||
static const WCHAR url1[] = {'r','e','s',':','/','/','m','s','h','t','m','l','.','d','l','l',
|
||||
@@ -109,7 +112,11 @@ static void test_SecurityManager(void)
|
||||
DWORD zone, size, policy;
|
||||
HRESULT hres;
|
||||
|
||||
hres = CoInternetCreateSecurityManager(NULL, &secmgr, 0);
|
||||
if(!pCoInternetCreateSecurityManager) {
|
||||
return;
|
||||
}
|
||||
|
||||
hres = pCoInternetCreateSecurityManager(NULL, &secmgr, 0);
|
||||
ok(hres == S_OK, "CoInternetCreateSecurityManager failed: %08x\n", hres);
|
||||
if(FAILED(hres))
|
||||
return;
|
||||
@@ -342,9 +349,13 @@ static void test_polices(void)
|
||||
IInternetSecurityManager *secmgr = NULL;
|
||||
HRESULT hres;
|
||||
|
||||
hres = CoInternetCreateSecurityManager(NULL, &secmgr, 0);
|
||||
if(!pCoInternetCreateSecurityManager || !pCoInternetCreateZoneManager) {
|
||||
return;
|
||||
}
|
||||
|
||||
hres = pCoInternetCreateSecurityManager(NULL, &secmgr, 0);
|
||||
ok(hres == S_OK, "CoInternetCreateSecurityManager failed: %08x\n", hres);
|
||||
hres = CoInternetCreateZoneManager(NULL, &zonemgr, 0);
|
||||
hres = pCoInternetCreateZoneManager(NULL, &zonemgr, 0);
|
||||
ok(hres == S_OK, "CoInternetCreateZoneManager failed: %08x\n", hres);
|
||||
|
||||
test_url_action(secmgr, zonemgr, URLACTION_SCRIPT_RUN);
|
||||
@@ -368,7 +379,11 @@ static void test_CoInternetCreateZoneManager(void)
|
||||
IUnknown *punk = NULL;
|
||||
HRESULT hr;
|
||||
|
||||
hr = CoInternetCreateZoneManager(NULL, &zonemgr, 0);
|
||||
if(!pCoInternetCreateZoneManager) {
|
||||
return;
|
||||
}
|
||||
|
||||
hr = pCoInternetCreateZoneManager(NULL, &zonemgr, 0);
|
||||
ok(hr == S_OK, "CoInternetCreateZoneManager result: 0x%x\n", hr);
|
||||
if (FAILED(hr))
|
||||
return;
|
||||
@@ -412,7 +427,11 @@ static void test_CreateZoneEnumerator(void)
|
||||
DWORD dwCount;
|
||||
DWORD dwCount2;
|
||||
|
||||
hr = CoInternetCreateZoneManager(NULL, &zonemgr, 0);
|
||||
if (!pCoInternetCreateZoneManager) {
|
||||
return;
|
||||
}
|
||||
|
||||
hr = pCoInternetCreateZoneManager(NULL, &zonemgr, 0);
|
||||
ok(hr == S_OK, "CoInternetCreateZoneManager result: 0x%x\n", hr);
|
||||
if (FAILED(hr))
|
||||
return;
|
||||
@@ -478,7 +497,7 @@ static void test_GetZoneActionPolicy(void)
|
||||
HRESULT hres;
|
||||
DWORD action = URLACTION_CREDENTIALS_USE; /* Implemented on all IE versions */
|
||||
|
||||
hres = CoInternetCreateZoneManager(NULL, &zonemgr, 0);
|
||||
hres = pCoInternetCreateZoneManager(NULL, &zonemgr, 0);
|
||||
ok(hres == S_OK, "CoInternetCreateZoneManager failed: %08x\n", hres);
|
||||
if(FAILED(hres))
|
||||
return;
|
||||
@@ -521,7 +540,7 @@ static void test_GetZoneAt(void)
|
||||
DWORD dwZone;
|
||||
DWORD i;
|
||||
|
||||
hr = CoInternetCreateZoneManager(NULL, &zonemgr, 0);
|
||||
hr = pCoInternetCreateZoneManager(NULL, &zonemgr, 0);
|
||||
ok(hr == S_OK, "CoInternetCreateZoneManager result: 0x%x\n", hr);
|
||||
if (FAILED(hr))
|
||||
return;
|
||||
@@ -569,7 +588,7 @@ static void test_GetZoneAttributes(void)
|
||||
HRESULT hr;
|
||||
DWORD i;
|
||||
|
||||
hr = CoInternetCreateZoneManager(NULL, &zonemgr, 0);
|
||||
hr = pCoInternetCreateZoneManager(NULL, &zonemgr, 0);
|
||||
ok(hr == S_OK, "CoInternetCreateZoneManager result: 0x%x\n", hr);
|
||||
if (FAILED(hr))
|
||||
return;
|
||||
@@ -622,7 +641,12 @@ static void test_InternetSecurityMarshalling(void)
|
||||
IStream *stream;
|
||||
HRESULT hres;
|
||||
|
||||
hres = CoInternetCreateSecurityManager(NULL, &secmgr, 0);
|
||||
if(!pCoInternetCreateSecurityManager) {
|
||||
return;
|
||||
}
|
||||
|
||||
hres = pCoInternetCreateSecurityManager(NULL, &secmgr, 0);
|
||||
ok(hres == S_OK, "CoInternetCreateSecurityManager failed: %08x\n", hres);
|
||||
if(FAILED(hres))
|
||||
return;
|
||||
|
||||
@@ -657,7 +681,6 @@ static void test_InternetGetSecurityUrl(void)
|
||||
HRESULT hres;
|
||||
|
||||
if (!pCoInternetGetSecurityUrl) {
|
||||
win_skip("CoInternetGetSecurityUrl not found\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -688,8 +711,15 @@ START_TEST(sec_mgr)
|
||||
OleInitialize(NULL);
|
||||
|
||||
hurlmon = GetModuleHandle("urlmon.dll");
|
||||
pCoInternetCreateSecurityManager = (void*) GetProcAddress(hurlmon, "CoInternetCreateSecurityManager");
|
||||
pCoInternetCreateZoneManager = (void*) GetProcAddress(hurlmon, "CoInternetCreateZoneManager");
|
||||
pCoInternetGetSecurityUrl = (void*) GetProcAddress(hurlmon, "CoInternetGetSecurityUrl");
|
||||
|
||||
if (!pCoInternetCreateSecurityManager || !pCoInternetCreateZoneManager ||
|
||||
!pCoInternetGetSecurityUrl) {
|
||||
win_skip("Various CoInternet* functions not present in IE 4.0\n");
|
||||
}
|
||||
|
||||
test_InternetGetSecurityUrl();
|
||||
test_SecurityManager();
|
||||
test_polices();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+146
-35
@@ -35,6 +35,10 @@
|
||||
|
||||
#include "wine/test.h"
|
||||
|
||||
static HRESULT (WINAPI *pCreateAsyncBindCtxEx)(IBindCtx *, DWORD,
|
||||
IBindStatusCallback *, IEnumFORMATETC *, IBindCtx **, DWORD);
|
||||
|
||||
|
||||
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
|
||||
DEFINE_GUID(CLSID_IdentityUnmarshal,0x0000001b,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
|
||||
DEFINE_GUID(IID_IBindStatusCallbackHolder,0x79eac9cc,0xbaf9,0x11ce,0x8c,0x82,0x00,0xaa,0x00,0x4b,0xa9,0x0b);
|
||||
@@ -172,6 +176,7 @@ static const WCHAR wszIndexHtml[] = {'i','n','d','e','x','.','h','t','m','l',0};
|
||||
static const WCHAR cache_fileW[] = {'c',':','\\','c','a','c','h','e','.','h','t','m',0};
|
||||
static const CHAR dwl_htmlA[] = "dwl.html";
|
||||
static const WCHAR dwl_htmlW[] = {'d','w','l','.','h','t','m','l',0};
|
||||
static const WCHAR test_txtW[] = {'t','e','s','t','.','t','x','t',0};
|
||||
static const WCHAR emptyW[] = {0};
|
||||
|
||||
static BOOL stopped_binding = FALSE, stopped_obj_binding = FALSE, emulate_protocol = FALSE,
|
||||
@@ -183,7 +188,8 @@ static IBinding *current_binding;
|
||||
static HANDLE complete_event, complete_event2;
|
||||
static HRESULT binding_hres;
|
||||
static BOOL have_IHttpNegotiate2, use_bscex;
|
||||
static BOOL test_redirect;
|
||||
static BOOL test_redirect, use_cache_file, callback_read;
|
||||
static WCHAR cache_file_name[MAX_PATH];
|
||||
|
||||
static LPCWSTR urls[] = {
|
||||
WINE_ABOUT_URL,
|
||||
@@ -236,6 +242,26 @@ static void test_CreateURLMoniker(LPCWSTR url1, LPCWSTR url2)
|
||||
IMoniker *mon1 = NULL;
|
||||
IMoniker *mon2 = NULL;
|
||||
|
||||
hr = CreateURLMoniker(NULL, NULL, NULL);
|
||||
ok(hr == E_INVALIDARG,
|
||||
"Expected CreateURLMoniker to return E_INVALIDARG, got 0x%08x\n", hr);
|
||||
|
||||
mon1 = (IMoniker *)0xdeadbeef;
|
||||
hr = CreateURLMoniker(NULL, NULL, &mon1);
|
||||
ok(hr == E_INVALIDARG,
|
||||
"Expected CreateURLMoniker to return E_INVALIDARG, got 0x%08x\n", hr);
|
||||
ok(mon1 == NULL, "Expected the output pointer to be NULL, got %p\n", mon1);
|
||||
|
||||
hr = CreateURLMoniker(NULL, emptyW, NULL);
|
||||
ok(hr == E_INVALIDARG,
|
||||
"Expected CreateURLMoniker to return E_INVALIDARG, got 0x%08x\n", hr);
|
||||
|
||||
hr = CreateURLMoniker(NULL, emptyW, &mon1);
|
||||
ok(hr == S_OK ||
|
||||
broken(hr == MK_E_SYNTAX), /* IE5/IE5.01/IE6 SP2 */
|
||||
"Expected CreateURLMoniker to return S_OK, got 0x%08x\n", hr);
|
||||
if(mon1) IMoniker_Release(mon1);
|
||||
|
||||
hr = CreateURLMoniker(NULL, url1, &mon1);
|
||||
ok(SUCCEEDED(hr), "failed to create moniker: 0x%08x\n", hr);
|
||||
if(SUCCEEDED(hr)) {
|
||||
@@ -475,7 +501,7 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
|
||||
DWORD grfPI, HANDLE_PTR dwReserved)
|
||||
{
|
||||
BINDINFO bindinfo;
|
||||
DWORD bindf, bscf = BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION;
|
||||
DWORD bind_info, bscf = BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION;
|
||||
HRESULT hres;
|
||||
|
||||
static const STGMEDIUM stgmed_zero = {0};
|
||||
@@ -505,20 +531,22 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
|
||||
|
||||
memset(&bindinfo, 0, sizeof(bindinfo));
|
||||
bindinfo.cbSize = sizeof(bindinfo);
|
||||
hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &bindf, &bindinfo);
|
||||
hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &bind_info, &bindinfo);
|
||||
ok(hres == S_OK, "GetBindInfo failed: %08x\n", hres);
|
||||
|
||||
if(filedwl_api) {
|
||||
ok(bindf == (BINDF_PULLDATA|BINDF_FROMURLMON|BINDF_NEEDFILE), "bindf=%08x\n", bindf);
|
||||
}else if(tymed == TYMED_ISTREAM && is_urlmon_protocol(test_protocol)) {
|
||||
ok(bindf == (BINDF_ASYNCHRONOUS|BINDF_ASYNCSTORAGE|BINDF_PULLDATA
|
||||
|BINDF_FROMURLMON),
|
||||
"bindf=%08x\n", bindf);
|
||||
}else {
|
||||
ok(bindf == (BINDF_ASYNCHRONOUS|BINDF_ASYNCSTORAGE|BINDF_PULLDATA
|
||||
|BINDF_FROMURLMON|BINDF_NEEDFILE),
|
||||
"bindf=%08x\n", bindf);
|
||||
}
|
||||
ok(bind_info & BINDF_FROMURLMON, "BINDF_FROMURLMON is not set\n");
|
||||
|
||||
if(filedwl_api || !is_urlmon_protocol(test_protocol) || !(bindf&BINDF_ASYNCSTORAGE) || tymed != TYMED_ISTREAM)
|
||||
ok(bind_info & BINDF_NEEDFILE, "BINDF_NEEDFILE is not set\n");
|
||||
else
|
||||
ok(!(bind_info & BINDF_NEEDFILE), "BINDF_NEEDFILE is set\n");
|
||||
|
||||
bind_info &= ~(BINDF_NEEDFILE|BINDF_FROMURLMON);
|
||||
if(filedwl_api)
|
||||
ok(bind_info == BINDF_PULLDATA, "bind_info = %x, expected BINDF_PULLDATA\n", bind_info);
|
||||
else
|
||||
ok(bind_info == (bindf & ~(BINDF_NEEDFILE|BINDF_FROMURLMON)), "bind_info = %x, expected %x\n",
|
||||
bind_info, (bindf & ~(BINDF_NEEDFILE|BINDF_FROMURLMON)));
|
||||
|
||||
ok(bindinfo.cbSize == sizeof(bindinfo), "bindinfo.cbSize = %d\n", bindinfo.cbSize);
|
||||
ok(!bindinfo.szExtraInfo, "bindinfo.szExtraInfo = %p\n", bindinfo.szExtraInfo);
|
||||
@@ -800,12 +828,9 @@ static HRESULT WINAPI Protocol_Continue(IInternetProtocol *iface,
|
||||
ok(hres == S_OK,
|
||||
"ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE) failed: %08x\n", hres);
|
||||
|
||||
if(tymed == TYMED_FILE) {
|
||||
hres = IInternetProtocolSink_ReportProgress(protocol_sink,
|
||||
BINDSTATUS_CACHEFILENAMEAVAILABLE, cache_fileW);
|
||||
ok(hres == S_OK,
|
||||
"ReportProgress(BINDSTATUS_CACHEFILENAMEAVAILABLE) failed: %08x\n", hres);
|
||||
}
|
||||
hres = IInternetProtocolSink_ReportProgress(protocol_sink,
|
||||
BINDSTATUS_CACHEFILENAMEAVAILABLE, use_cache_file ? cache_file_name : cache_fileW);
|
||||
ok(hres == S_OK, "ReportProgress(BINDSTATUS_CACHEFILENAMEAVAILABLE) failed: %08x\n", hres);
|
||||
|
||||
bscf |= BSCF_FIRSTDATANOTIFICATION;
|
||||
break;
|
||||
@@ -1279,7 +1304,7 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallbackEx *iface, ULONG u
|
||||
todo_wine CHECK_EXPECT(OnProgress_FINDINGRESOURCE);
|
||||
else
|
||||
CHECK_EXPECT(OnProgress_FINDINGRESOURCE);
|
||||
if((bindf & BINDF_ASYNCHRONOUS) && emulate_protocol)
|
||||
if(emulate_protocol && (test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST))
|
||||
SetEvent(complete_event);
|
||||
break;
|
||||
case BINDSTATUS_CONNECTING:
|
||||
@@ -1289,7 +1314,7 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallbackEx *iface, ULONG u
|
||||
todo_wine CHECK_EXPECT(OnProgress_CONNECTING);
|
||||
else
|
||||
CHECK_EXPECT(OnProgress_CONNECTING);
|
||||
if((bindf & BINDF_ASYNCHRONOUS) && emulate_protocol)
|
||||
if(emulate_protocol && (test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST))
|
||||
SetEvent(complete_event);
|
||||
break;
|
||||
case BINDSTATUS_REDIRECTING:
|
||||
@@ -1299,7 +1324,8 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallbackEx *iface, ULONG u
|
||||
CHECK_EXPECT(OnProgress_REDIRECTING);
|
||||
ok(!lstrcmpW(szStatusText, WINE_ABOUT_URL), "unexpected status text %s\n",
|
||||
wine_dbgstr_w(szStatusText));
|
||||
if(!bind_to_object || iface == &objbsc)
|
||||
if(emulate_protocol && (test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST)
|
||||
&& (!bind_to_object || iface == &objbsc))
|
||||
SetEvent(complete_event);
|
||||
break;
|
||||
case BINDSTATUS_SENDINGREQUEST:
|
||||
@@ -1309,7 +1335,7 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallbackEx *iface, ULONG u
|
||||
CHECK_EXPECT2(OnProgress_SENDINGREQUEST);
|
||||
else
|
||||
CHECK_EXPECT(OnProgress_SENDINGREQUEST);
|
||||
if((bindf & BINDF_ASYNCHRONOUS) && emulate_protocol)
|
||||
if(emulate_protocol && (test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST))
|
||||
SetEvent(complete_event);
|
||||
break;
|
||||
case BINDSTATUS_MIMETYPEAVAILABLE:
|
||||
@@ -1539,9 +1565,14 @@ static HRESULT WINAPI statusclb_OnDataAvailable(IBindStatusCallbackEx *iface, DW
|
||||
}
|
||||
|
||||
ok(U(*pstgmed).pstm != NULL, "U(*pstgmed).pstm == NULL\n");
|
||||
do hres = IStream_Read(U(*pstgmed).pstm, buf, 512, &readed);
|
||||
while(hres == S_OK);
|
||||
ok(hres == S_FALSE || hres == E_PENDING, "IStream_Read returned %08x\n", hres);
|
||||
if(callback_read) {
|
||||
do {
|
||||
hres = IStream_Read(U(*pstgmed).pstm, buf, 512, &readed);
|
||||
if(test_protocol == HTTP_TEST && emulate_protocol && readed)
|
||||
ok(buf[0] == (use_cache_file && !(bindf&BINDF_ASYNCHRONOUS) ? 'X' : '?'), "buf[0] = '%c'\n", buf[0]);
|
||||
}while(hres == S_OK);
|
||||
ok(hres == S_FALSE || hres == E_PENDING, "IStream_Read returned %08x\n", hres);
|
||||
}
|
||||
break;
|
||||
|
||||
case TYMED_FILE:
|
||||
@@ -1897,10 +1928,15 @@ static void test_CreateAsyncBindCtxEx(void)
|
||||
|
||||
static WCHAR testW[] = {'t','e','s','t',0};
|
||||
|
||||
hres = CreateAsyncBindCtxEx(NULL, 0, NULL, NULL, NULL, 0);
|
||||
if (!pCreateAsyncBindCtxEx) {
|
||||
win_skip("CreateAsyncBindCtxEx not present\n");
|
||||
return;
|
||||
}
|
||||
|
||||
hres = pCreateAsyncBindCtxEx(NULL, 0, NULL, NULL, NULL, 0);
|
||||
ok(hres == E_INVALIDARG, "CreateAsyncBindCtx failed: %08x, expected E_INVALIDARG\n", hres);
|
||||
|
||||
hres = CreateAsyncBindCtxEx(NULL, 0, NULL, NULL, &bctx, 0);
|
||||
hres = pCreateAsyncBindCtxEx(NULL, 0, NULL, NULL, &bctx, 0);
|
||||
ok(hres == S_OK, "CreateAsyncBindCtxEx failed: %08x\n", hres);
|
||||
|
||||
if(SUCCEEDED(hres)) {
|
||||
@@ -1919,7 +1955,7 @@ static void test_CreateAsyncBindCtxEx(void)
|
||||
}
|
||||
|
||||
CreateBindCtx(0, &bctx_arg);
|
||||
hres = CreateAsyncBindCtxEx(NULL, 0, NULL, NULL, &bctx, 0);
|
||||
hres = pCreateAsyncBindCtxEx(NULL, 0, NULL, NULL, &bctx, 0);
|
||||
ok(hres == S_OK, "CreateAsyncBindCtxEx failed: %08x\n", hres);
|
||||
|
||||
if(SUCCEEDED(hres)) {
|
||||
@@ -1940,7 +1976,7 @@ static void test_CreateAsyncBindCtxEx(void)
|
||||
IBindCtx_Release(bctx_arg);
|
||||
|
||||
SET_EXPECT(QueryInterface_IServiceProvider);
|
||||
hres = CreateAsyncBindCtxEx(NULL, 0, (IBindStatusCallback*)&bsc, NULL, &bctx, 0);
|
||||
hres = pCreateAsyncBindCtxEx(NULL, 0, (IBindStatusCallback*)&bsc, NULL, &bctx, 0);
|
||||
ok(hres == S_OK, "CreateAsyncBindCtxEx failed: %08x\n", hres);
|
||||
CHECK_CALLED(QueryInterface_IServiceProvider);
|
||||
|
||||
@@ -1954,7 +1990,7 @@ static void test_CreateAsyncBindCtxEx(void)
|
||||
hres = CreateBindCtx(0, &bctx2);
|
||||
ok(hres == S_OK, "CreateBindCtx failed: %08x\n", hres);
|
||||
|
||||
hres = CreateAsyncBindCtxEx(bctx2, 0, NULL, NULL, &bctx, 0);
|
||||
hres = pCreateAsyncBindCtxEx(bctx2, 0, NULL, NULL, &bctx, 0);
|
||||
ok(hres == S_OK, "CreateAsyncBindCtxEx failed: %08x\n", hres);
|
||||
|
||||
hres = IBindCtx_RegisterObjectParam(bctx2, testW, (IUnknown*)&Protocol);
|
||||
@@ -2220,6 +2256,8 @@ static BOOL test_RegisterBindStatusCallback(void)
|
||||
#define BINDTEST_FILEDWLAPI 0x0004
|
||||
#define BINDTEST_HTTPRESPONSE 0x0008
|
||||
#define BINDTEST_REDIRECT 0x0010
|
||||
#define BINDTEST_USE_CACHE 0x0020
|
||||
#define BINDTEST_NO_CALLBACK_READ 0x0040
|
||||
|
||||
static void init_bind_test(int protocol, DWORD flags, DWORD t)
|
||||
{
|
||||
@@ -2239,6 +2277,8 @@ static void init_bind_test(int protocol, DWORD flags, DWORD t)
|
||||
else
|
||||
urls[HTTP_TEST] = WINE_ABOUT_URL;
|
||||
test_redirect = (flags & BINDTEST_REDIRECT) != 0;
|
||||
use_cache_file = (flags & BINDTEST_USE_CACHE) != 0;
|
||||
callback_read = !(flags & BINDTEST_NO_CALLBACK_READ);
|
||||
}
|
||||
|
||||
static void test_BindToStorage(int protocol, DWORD flags, DWORD t)
|
||||
@@ -2344,7 +2384,10 @@ static void test_BindToStorage(int protocol, DWORD flags, DWORD t)
|
||||
return;
|
||||
}
|
||||
|
||||
if(((bindf & BINDF_ASYNCHRONOUS) && !data_available)
|
||||
if(!(bindf & BINDF_ASYNCHRONOUS) && tymed == TYMED_FILE) {
|
||||
ok(hres == S_OK, "IMoniker_BindToStorage failed: %08x\n", hres);
|
||||
ok(unk == NULL, "unk != NULL\n");
|
||||
}else if(((bindf & BINDF_ASYNCHRONOUS) && !data_available)
|
||||
|| (tymed == TYMED_FILE && test_protocol == FILE_TEST)) {
|
||||
ok(hres == MK_S_ASYNCHRONOUS, "IMoniker_BindToStorage failed: %08x\n", hres);
|
||||
ok(unk == NULL, "istr should be NULL\n");
|
||||
@@ -2356,7 +2399,7 @@ static void test_BindToStorage(int protocol, DWORD flags, DWORD t)
|
||||
ok(hres == S_OK, "IMoniker_BindToStorage failed: %08x\n", hres);
|
||||
ok(unk != NULL, "unk == NULL\n");
|
||||
}
|
||||
if(unk)
|
||||
if(unk && callback_read)
|
||||
IUnknown_Release(unk);
|
||||
|
||||
if(FAILED(hres))
|
||||
@@ -2432,6 +2475,28 @@ static void test_BindToStorage(int protocol, DWORD flags, DWORD t)
|
||||
|
||||
if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST)
|
||||
http_is_first = FALSE;
|
||||
|
||||
if(!callback_read) {
|
||||
BYTE buf[512];
|
||||
DWORD readed;
|
||||
IStream *stream;
|
||||
|
||||
hres = IUnknown_QueryInterface(unk, &IID_IStream, (void**)&stream);
|
||||
ok(hres == S_OK, "Could not get IStream iface: %08x\n", hres);
|
||||
IUnknown_Release(unk);
|
||||
|
||||
do {
|
||||
readed = 0xdeadbeef;
|
||||
hres = IStream_Read(stream, buf, sizeof(buf), &readed);
|
||||
ok(readed != 0xdeadbeef, "readed = 0xdeadbeef\n");
|
||||
if(emulate_protocol && test_protocol == HTTP_TEST && readed)
|
||||
ok(buf[0] == (use_cache_file && !(bindf&BINDF_ASYNCHRONOUS) ? 'X' : '?'), "buf[0] = '%c'\n", buf[0]);
|
||||
}while(hres == S_OK);
|
||||
ok(hres == S_FALSE, "IStream_Read returned %08x\n", hres);
|
||||
ok(!readed, "readed = %d\n", readed);
|
||||
|
||||
IStream_Release(stream);
|
||||
}
|
||||
}
|
||||
|
||||
static void test_BindToObject(int protocol, DWORD flags)
|
||||
@@ -2764,6 +2829,27 @@ static void create_file(void)
|
||||
set_file_url(path);
|
||||
}
|
||||
|
||||
static void create_cache_file(void)
|
||||
{
|
||||
char buf[6500];
|
||||
HANDLE file;
|
||||
DWORD size;
|
||||
|
||||
file = CreateFileW(test_txtW, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
ok(file != INVALID_HANDLE_VALUE, "CreateFile failed\n");
|
||||
if(file == INVALID_HANDLE_VALUE)
|
||||
return;
|
||||
|
||||
memset(buf, 'X', sizeof(buf));
|
||||
WriteFile(file, buf, sizeof(buf), &size, NULL);
|
||||
CloseHandle(file);
|
||||
|
||||
size = GetCurrentDirectoryW(MAX_PATH, cache_file_name);
|
||||
cache_file_name[size] = '\\';
|
||||
memcpy(cache_file_name+size+1, test_txtW, sizeof(test_txtW));
|
||||
}
|
||||
|
||||
static void test_ReportResult(HRESULT exhres)
|
||||
{
|
||||
IMoniker *mon = NULL;
|
||||
@@ -2823,7 +2909,7 @@ static void test_BindToStorage_fail(void)
|
||||
if(FAILED(hres))
|
||||
return;
|
||||
|
||||
hres = CreateAsyncBindCtxEx(NULL, 0, NULL, NULL, &bctx, 0);
|
||||
hres = pCreateAsyncBindCtxEx(NULL, 0, NULL, NULL, &bctx, 0);
|
||||
ok(hres == S_OK, "CreateAsyncBindCtxEx failed: %08x\n", hres);
|
||||
|
||||
hres = IMoniker_BindToStorage(mon, bctx, NULL, &IID_IStream, (void**)&unk);
|
||||
@@ -2863,10 +2949,16 @@ static void test_StdURLMoniker(void)
|
||||
|
||||
START_TEST(url)
|
||||
{
|
||||
HMODULE hurlmon;
|
||||
|
||||
hurlmon = GetModuleHandle("urlmon.dll");
|
||||
pCreateAsyncBindCtxEx = (void*) GetProcAddress(hurlmon, "CreateAsyncBindCtxEx");
|
||||
|
||||
complete_event = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
complete_event2 = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
thread_id = GetCurrentThreadId();
|
||||
create_file();
|
||||
create_cache_file();
|
||||
|
||||
test_create();
|
||||
|
||||
@@ -2892,12 +2984,27 @@ START_TEST(url)
|
||||
trace("synchronous http test...\n");
|
||||
test_BindToStorage(HTTP_TEST, 0, TYMED_ISTREAM);
|
||||
|
||||
trace("emulated synchronous http test (to file)...\n");
|
||||
test_BindToStorage(HTTP_TEST, BINDTEST_EMULATE, TYMED_FILE);
|
||||
|
||||
trace("synchronous http test (to object)...\n");
|
||||
test_BindToObject(HTTP_TEST, 0);
|
||||
|
||||
trace("emulated synchronous http test (with cache)...\n");
|
||||
test_BindToStorage(HTTP_TEST, BINDTEST_EMULATE|BINDTEST_USE_CACHE, TYMED_ISTREAM);
|
||||
|
||||
trace("emulated synchronous http test (with cache, no read)...\n");
|
||||
test_BindToStorage(HTTP_TEST, BINDTEST_EMULATE|BINDTEST_USE_CACHE|BINDTEST_NO_CALLBACK_READ, TYMED_ISTREAM);
|
||||
|
||||
trace("synchronous http test (with cache, no read)...\n");
|
||||
test_BindToStorage(HTTP_TEST, BINDTEST_USE_CACHE|BINDTEST_NO_CALLBACK_READ, TYMED_ISTREAM);
|
||||
|
||||
trace("synchronous file test...\n");
|
||||
test_BindToStorage(FILE_TEST, 0, TYMED_ISTREAM);
|
||||
|
||||
trace("emulated synchronous file test (to file)...\n");
|
||||
test_BindToStorage(FILE_TEST, BINDTEST_EMULATE, TYMED_FILE);
|
||||
|
||||
trace("synchronous file test (to object)...\n");
|
||||
test_BindToObject(FILE_TEST, 0);
|
||||
|
||||
@@ -2934,6 +3041,9 @@ START_TEST(url)
|
||||
trace("emulated http test (redirect)...\n");
|
||||
test_BindToStorage(HTTP_TEST, BINDTEST_EMULATE|BINDTEST_REDIRECT, TYMED_ISTREAM);
|
||||
|
||||
trace("emulated http test (with cache)...\n");
|
||||
test_BindToStorage(HTTP_TEST, BINDTEST_EMULATE|BINDTEST_USE_CACHE, TYMED_ISTREAM);
|
||||
|
||||
trace("asynchronous https test...\n");
|
||||
test_BindToStorage(HTTPS_TEST, 0, TYMED_ISTREAM);
|
||||
|
||||
@@ -3004,6 +3114,7 @@ START_TEST(url)
|
||||
}
|
||||
|
||||
DeleteFileA(wszIndexHtmlA);
|
||||
DeleteFileW(test_txtW);
|
||||
CloseHandle(complete_event);
|
||||
CloseHandle(complete_event2);
|
||||
CoUninitialize();
|
||||
|
||||
@@ -9,12 +9,14 @@
|
||||
<file>protocol.c</file>
|
||||
<file>sec_mgr.c</file>
|
||||
<file>stream.c</file>
|
||||
<file>uri.c</file>
|
||||
<file>url.c</file>
|
||||
<file>testlist.c</file>
|
||||
<library>wine</library>
|
||||
<library>uuid</library>
|
||||
<library>urlmon</library>
|
||||
<library>ole32</library>
|
||||
<library>oleaut32</library>
|
||||
<library>user32</library>
|
||||
<library>advapi32</library>
|
||||
<library>ntdll</library>
|
||||
|
||||
@@ -320,6 +320,7 @@ static void test_instances(void)
|
||||
HINSTANCE kernel32 = GetModuleHandleA("kernel32");
|
||||
HINSTANCE user32 = GetModuleHandleA("user32");
|
||||
HINSTANCE main_module = GetModuleHandleA(NULL);
|
||||
HINSTANCE zero_instance = 0;
|
||||
DWORD r;
|
||||
char buffer[0x10];
|
||||
|
||||
@@ -397,15 +398,19 @@ static void test_instances(void)
|
||||
/* GetClassInfo with instance 0 finds user32 instance */
|
||||
SetClassLongPtrA( hwnd, GCLP_HMODULE, (LONG_PTR)user32 );
|
||||
ok( RegisterClassA( &cls ), "Failed to register local class for kernel32\n" );
|
||||
if (!GetClassInfo( 0, name, &wc )) zero_instance = user32; /* instance 0 not supported on wow64 */
|
||||
else
|
||||
{
|
||||
check_instance( name, 0, 0, kernel32 );
|
||||
check_thread_instance( name, 0, 0, kernel32 );
|
||||
}
|
||||
check_class( kernel32, name, "kernel32" );
|
||||
check_class( user32, name, "main_module" );
|
||||
check_class( 0, name, "main_module" );
|
||||
check_class( zero_instance, name, "main_module" );
|
||||
check_instance( name, kernel32, kernel32, kernel32 );
|
||||
check_instance( name, user32, 0, user32 );
|
||||
check_instance( name, 0, 0, kernel32 );
|
||||
check_instance( name, user32, zero_instance, user32 );
|
||||
check_thread_instance( name, kernel32, kernel32, kernel32 );
|
||||
check_thread_instance( name, user32, 0, user32 );
|
||||
check_thread_instance( name, 0, 0, kernel32 );
|
||||
check_thread_instance( name, user32, zero_instance, user32 );
|
||||
ok( UnregisterClassA( name, kernel32 ), "Unregister failed for kernel32\n" );
|
||||
|
||||
SetClassLongPtrA( hwnd, GCLP_HMODULE, 0x12345678 );
|
||||
@@ -551,10 +556,10 @@ static void test_instances(void)
|
||||
/* GetClassInfo sets instance to passed value for global classes */
|
||||
check_instance( "BUTTON", 0, 0, user32 );
|
||||
check_instance( "BUTTON", (HINSTANCE)0xdeadbeef, (HINSTANCE)0xdeadbeef, user32 );
|
||||
check_instance( "BUTTON", user32, 0, user32 );
|
||||
check_instance( "BUTTON", user32, zero_instance, user32 );
|
||||
check_thread_instance( "BUTTON", 0, 0, user32 );
|
||||
check_thread_instance( "BUTTON", (HINSTANCE)0xdeadbeef, (HINSTANCE)0xdeadbeef, user32 );
|
||||
check_thread_instance( "BUTTON", user32, 0, user32 );
|
||||
check_thread_instance( "BUTTON", user32, zero_instance, user32 );
|
||||
|
||||
/* we can unregister system classes */
|
||||
ok( GetClassInfo( 0, "BUTTON", &wc ), "Button class not found with null instance\n" );
|
||||
@@ -656,8 +661,16 @@ static void test_builtinproc(void)
|
||||
ok(IsWindowUnicode(hwnd), "Windows should be Unicode\n");
|
||||
SetWindowLongPtrW(hwnd, GWLP_WNDPROC, (LONG_PTR)pDefWindowProcA);
|
||||
ok(IsWindowUnicode(hwnd), "Windows should have remained Unicode\n");
|
||||
ok(GetWindowLongPtrW(hwnd, GWLP_WNDPROC) == (LONG_PTR)pDefWindowProcW, "Invalid ANSI winproc\n");
|
||||
ok(GetWindowLongPtrA(hwnd, GWLP_WNDPROC) == (LONG_PTR)pDefWindowProcA, "Invalid Unicode winproc\n");
|
||||
if (GetWindowLongPtrW(hwnd, GWLP_WNDPROC) == (LONG_PTR)pDefWindowProcA)
|
||||
{
|
||||
/* DefWindowProc isn't magic on wow64 */
|
||||
ok(IS_WNDPROC_HANDLE(GetWindowLongPtrA(hwnd, GWLP_WNDPROC)), "Ansi winproc is not a handle\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ok(GetWindowLongPtrW(hwnd, GWLP_WNDPROC) == (LONG_PTR)pDefWindowProcW, "Invalid Unicode winproc\n");
|
||||
ok(GetWindowLongPtrA(hwnd, GWLP_WNDPROC) == (LONG_PTR)pDefWindowProcA, "Invalid Ansi winproc\n");
|
||||
}
|
||||
SetWindowLongPtrA(hwnd, GWLP_WNDPROC, (LONG_PTR)ClassTest_WndProc);
|
||||
ok(IsWindowUnicode(hwnd) == FALSE, "SetWindowLongPtrA should have switched window to ANSI\n");
|
||||
|
||||
|
||||
@@ -384,6 +384,8 @@ static void test_changesize( DWORD style)
|
||||
rc.right - rc.left, clwidth - 2);
|
||||
ok( rc.bottom - rc.top == ddheight, "drop-down rect height is %d vs %d\n",
|
||||
rc.bottom - rc.top, ddheight);
|
||||
ok( rc.right - rc.left == ddwidth -2, "drop-down rect width is %d vs %d\n",
|
||||
rc.right - rc.left, ddwidth - 2);
|
||||
/* new cx, cy is slightly bigger than the initial values */
|
||||
MoveWindow( hCombo, 10, 10, clwidth + 2, clheight + 2, TRUE);
|
||||
GetClientRect( hCombo, &rc);
|
||||
|
||||
@@ -225,6 +225,14 @@ static void test_child_process(void)
|
||||
SendMessage(child, WM_USER+1, 0, (LPARAM) cursor);
|
||||
}
|
||||
|
||||
static BOOL color_match(COLORREF a, COLORREF b)
|
||||
{
|
||||
/* 5-bit accuracy is a sufficient test. This will match as long as
|
||||
* colors are never truncated to less that 3x5-bit accuracy i.e.
|
||||
* palettized. */
|
||||
return (a & 0x00F8F8F8) == (b & 0x00F8F8F8);
|
||||
}
|
||||
|
||||
static void test_CopyImage_Check(HBITMAP bitmap, UINT flags, INT copyWidth, INT copyHeight,
|
||||
INT expectedWidth, INT expectedHeight, WORD expectedDepth, BOOL dibExpected)
|
||||
{
|
||||
@@ -659,14 +667,14 @@ static void test_CreateIcon(void)
|
||||
|
||||
/* Shamelessly ripped from dlls/oleaut32/tests/olepicture.c */
|
||||
/* 1x1 pixel gif */
|
||||
static const unsigned char gifimage[35] = {
|
||||
static unsigned char gifimage[35] = {
|
||||
0x47,0x49,0x46,0x38,0x37,0x61,0x01,0x00,0x01,0x00,0x80,0x00,0x00,0xff,0xff,0xff,
|
||||
0xff,0xff,0xff,0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x02,0x02,0x44,
|
||||
0x01,0x00,0x3b
|
||||
};
|
||||
|
||||
/* 1x1 pixel jpg */
|
||||
static const unsigned char jpgimage[285] = {
|
||||
static unsigned char jpgimage[285] = {
|
||||
0xff,0xd8,0xff,0xe0,0x00,0x10,0x4a,0x46,0x49,0x46,0x00,0x01,0x01,0x01,0x01,0x2c,
|
||||
0x01,0x2c,0x00,0x00,0xff,0xdb,0x00,0x43,0x00,0x05,0x03,0x04,0x04,0x04,0x03,0x05,
|
||||
0x04,0x04,0x04,0x05,0x05,0x05,0x06,0x07,0x0c,0x08,0x07,0x07,0x07,0x07,0x0f,0x0b,
|
||||
@@ -688,7 +696,7 @@ static const unsigned char jpgimage[285] = {
|
||||
};
|
||||
|
||||
/* 1x1 pixel png */
|
||||
static const unsigned char pngimage[285] = {
|
||||
static unsigned char pngimage[285] = {
|
||||
0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
|
||||
0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x02,0x00,0x00,0x00,0x90,0x77,0x53,
|
||||
0xde,0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,
|
||||
@@ -698,23 +706,54 @@ static const unsigned char pngimage[285] = {
|
||||
0xe7,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82
|
||||
};
|
||||
|
||||
/* 1x1 pixel bmp */
|
||||
static const unsigned char bmpimage[66] = {
|
||||
0x42,0x4d,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x28,0x00,
|
||||
/* 1x1 pixel bmp with gap between palette and bitmap. Correct bitmap contains only
|
||||
zeroes, gap is 0xFF. */
|
||||
static unsigned char bmpimage[70] = {
|
||||
0x42,0x4d,0x46,0x00,0x00,0x00,0xDE,0xAD,0xBE,0xEF,0x42,0x00,0x00,0x00,0x28,0x00,
|
||||
0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,
|
||||
0x00,0x00,0x04,0x00,0x00,0x00,0x12,0x0b,0x00,0x00,0x12,0x0b,0x00,0x00,0x02,0x00,
|
||||
0x00,0x00,0x02,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x00,0x00,0x00,
|
||||
0x00,0x00
|
||||
0x00,0x00,0x02,0x00,0x00,0x00,0xff,0xff,0xff,0x00,0x55,0x55,0x55,0x00,0xFF,0xFF,
|
||||
0xFF,0xFF,0x00,0x00,0x00,0x00
|
||||
};
|
||||
|
||||
/* 1x1 pixel bmp using BITMAPCOREHEADER */
|
||||
static unsigned char bmpcoreimage[38] = {
|
||||
0x42,0x4d,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x0c,0x00,
|
||||
0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xff,0xff,0xff,0x00,0x55,0x55,
|
||||
0x55,0x00,0x00,0x00,0x00,0x00
|
||||
};
|
||||
|
||||
/* 2x2 pixel gif */
|
||||
static const unsigned char gif4pixel[42] = {
|
||||
static unsigned char gif4pixel[42] = {
|
||||
0x47,0x49,0x46,0x38,0x37,0x61,0x02,0x00,0x02,0x00,0xa1,0x00,0x00,0x00,0x00,0x00,
|
||||
0x39,0x62,0xfc,0xff,0x1a,0xe5,0xff,0xff,0xff,0x2c,0x00,0x00,0x00,0x00,0x02,0x00,
|
||||
0x02,0x00,0x00,0x02,0x03,0x14,0x16,0x05,0x00,0x3b
|
||||
};
|
||||
|
||||
static void test_LoadImageFile(const unsigned char * image_data,
|
||||
static void test_LoadImageBitmap(const char * test_desc, HBITMAP hbm)
|
||||
{
|
||||
BITMAP bm;
|
||||
BITMAPINFO bmi;
|
||||
DWORD ret, pixel = 0;
|
||||
HDC hdc = GetDC(NULL);
|
||||
|
||||
ret = GetObject(hbm, sizeof(bm), &bm);
|
||||
ok(ret == sizeof(bm), "GetObject returned %d\n", ret);
|
||||
|
||||
memset(&bmi, 0, sizeof(bmi));
|
||||
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
|
||||
bmi.bmiHeader.biWidth = bm.bmWidth;
|
||||
bmi.bmiHeader.biHeight = bm.bmHeight;
|
||||
bmi.bmiHeader.biPlanes = 1;
|
||||
bmi.bmiHeader.biBitCount= 24;
|
||||
bmi.bmiHeader.biCompression= BI_RGB;
|
||||
ret = GetDIBits(hdc, hbm, 0, bm.bmHeight, &pixel, &bmi, DIB_RGB_COLORS);
|
||||
ok(ret == bm.bmHeight, "%s: %d lines were converted, not %d\n", test_desc, ret, bm.bmHeight);
|
||||
|
||||
ok(color_match(pixel, 0x00ffffff), "%s: Pixel is 0x%08x\n", test_desc, pixel);
|
||||
}
|
||||
|
||||
static void test_LoadImageFile(const char * test_desc, unsigned char * image_data,
|
||||
unsigned int image_size, const char * ext, BOOL expect_success)
|
||||
{
|
||||
HANDLE handle;
|
||||
@@ -730,13 +769,13 @@ static void test_LoadImageFile(const unsigned char * image_data,
|
||||
FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
ok(handle != INVALID_HANDLE_VALUE, "CreateFileA failed. %u\n", GetLastError());
|
||||
ret = WriteFile(handle, image_data, image_size, &bytes_written, NULL);
|
||||
ok(bytes_written == image_size, "test file created improperly.\n");
|
||||
ok(ret && bytes_written == image_size, "test file created improperly.\n");
|
||||
CloseHandle(handle);
|
||||
|
||||
/* Load as cursor. For all tested formats, this should fail */
|
||||
SetLastError(0xdeadbeef);
|
||||
handle = LoadImageA(NULL, filename, IMAGE_CURSOR, 0, 0, LR_LOADFROMFILE);
|
||||
ok(handle == NULL, "LoadImage(%s) as IMAGE_CURSOR succeeded incorrectly.\n", ext);
|
||||
ok(handle == NULL, "%s: IMAGE_CURSOR succeeded incorrectly.\n", test_desc);
|
||||
error = GetLastError();
|
||||
ok(error == 0 ||
|
||||
broken(error == 0xdeadbeef) || /* Win9x */
|
||||
@@ -747,7 +786,7 @@ static void test_LoadImageFile(const unsigned char * image_data,
|
||||
/* Load as icon. For all tested formats, this should fail */
|
||||
SetLastError(0xdeadbeef);
|
||||
handle = LoadImageA(NULL, filename, IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
|
||||
ok(handle == NULL, "LoadImage(%s) as IMAGE_ICON succeeded incorrectly.\n", ext);
|
||||
ok(handle == NULL, "%s: IMAGE_ICON succeeded incorrectly.\n", test_desc);
|
||||
error = GetLastError();
|
||||
ok(error == 0 ||
|
||||
broken(error == 0xdeadbeef) || /* Win9x */
|
||||
@@ -755,18 +794,21 @@ static void test_LoadImageFile(const unsigned char * image_data,
|
||||
"Last error: %u\n", error);
|
||||
if (handle != NULL) DestroyIcon(handle);
|
||||
|
||||
/* Load as bitmap. Should succeed if bmp, fail for everything else */
|
||||
/* Load as bitmap. Should succeed for correct bmp, fail for everything else */
|
||||
SetLastError(0xdeadbeef);
|
||||
handle = LoadImageA(NULL, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
|
||||
if (expect_success)
|
||||
ok(handle != NULL, "LoadImage(%s) as IMAGE_BITMAP failed.\n", ext);
|
||||
else ok(handle == NULL, "LoadImage(%s) as IMAGE_BITMAP succeeded incorrectly.\n", ext);
|
||||
error = GetLastError();
|
||||
ok(error == 0 ||
|
||||
error == 0xdeadbeef, /* Win9x, WinMe */
|
||||
"Last error: %u\n", error);
|
||||
if (handle != NULL) DeleteObject(handle);
|
||||
|
||||
if (expect_success) {
|
||||
ok(handle != NULL, "%s: IMAGE_BITMAP failed.\n", test_desc);
|
||||
if (handle != NULL) test_LoadImageBitmap(test_desc, handle);
|
||||
}
|
||||
else ok(handle == NULL, "%s: IMAGE_BITMAP succeeded incorrectly.\n", test_desc);
|
||||
|
||||
if (handle != NULL) DeleteObject(handle);
|
||||
DeleteFileA(filename);
|
||||
}
|
||||
|
||||
@@ -817,7 +859,7 @@ static void test_LoadImage(void)
|
||||
FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
ok(handle != INVALID_HANDLE_VALUE, "CreateFileA failed. %u\n", GetLastError());
|
||||
ret = WriteFile(handle, icon_data, ICON_SIZE, &bytes_written, NULL);
|
||||
ok(bytes_written == ICON_SIZE, "icon.ico created improperly.\n");
|
||||
ok(ret && bytes_written == ICON_SIZE, "icon.ico created improperly.\n");
|
||||
CloseHandle(handle);
|
||||
|
||||
/* Test loading an icon as a cursor. */
|
||||
@@ -857,11 +899,19 @@ static void test_LoadImage(void)
|
||||
HeapFree(GetProcessHeap(), 0, icon_data);
|
||||
DeleteFileA("icon.ico");
|
||||
|
||||
test_LoadImageFile(bmpimage, sizeof(bmpimage), "bmp", 1);
|
||||
test_LoadImageFile(gifimage, sizeof(gifimage), "gif", 0);
|
||||
test_LoadImageFile(gif4pixel, sizeof(gif4pixel), "gif", 0);
|
||||
test_LoadImageFile(jpgimage, sizeof(jpgimage), "jpg", 0);
|
||||
test_LoadImageFile(pngimage, sizeof(pngimage), "png", 0);
|
||||
test_LoadImageFile("BMP", bmpimage, sizeof(bmpimage), "bmp", 1);
|
||||
test_LoadImageFile("BMP (coreinfo)", bmpcoreimage, sizeof(bmpcoreimage), "bmp", 1);
|
||||
test_LoadImageFile("GIF", gifimage, sizeof(gifimage), "gif", 0);
|
||||
test_LoadImageFile("GIF (2x2 pixel)", gif4pixel, sizeof(gif4pixel), "gif", 0);
|
||||
test_LoadImageFile("JPG", jpgimage, sizeof(jpgimage), "jpg", 0);
|
||||
test_LoadImageFile("PNG", pngimage, sizeof(pngimage), "png", 0);
|
||||
/* Check failure for broken BMP images */
|
||||
bmpimage[0x14]++; /* biHeight > 65535 */
|
||||
test_LoadImageFile("BMP (too high)", bmpimage, sizeof(bmpimage), "bmp", 0);
|
||||
bmpimage[0x14]--;
|
||||
bmpimage[0x18]++; /* biWidth > 65535 */
|
||||
test_LoadImageFile("BMP (too wide)", bmpimage, sizeof(bmpimage), "bmp", 0);
|
||||
bmpimage[0x18]--;
|
||||
}
|
||||
|
||||
static void test_CreateIconFromResource(void)
|
||||
@@ -994,22 +1044,12 @@ static HICON create_test_icon(HDC hdc, int width, int height, int bpp,
|
||||
return CreateIconIndirect(&iconInfo);
|
||||
}
|
||||
|
||||
static BOOL color_match(COLORREF a, COLORREF b)
|
||||
{
|
||||
/* 5-bit accuracy is a sufficient test. This will match, so long as
|
||||
* colors are never truncated to less that 3x5-bit accuracy i.e.
|
||||
* paletized. */
|
||||
return (a & 0x00F8F8F8) == (b & 0x00F8F8F8);
|
||||
}
|
||||
|
||||
static void check_alpha_draw(HDC hdc, BOOL drawiconex, BOOL alpha, int bpp, int line)
|
||||
{
|
||||
HICON hicon;
|
||||
UINT32 mask;
|
||||
UINT32 color[2];
|
||||
COLORREF modern_expected, legacy_expected, result;
|
||||
|
||||
mask = 0x00000000;
|
||||
color[0] = 0x00A0B0C0;
|
||||
color[1] = alpha ? 0xFF000000 : 0x00000000;
|
||||
modern_expected = alpha ? 0x00FFFFFF : 0x00C0B0A0;
|
||||
@@ -1192,15 +1232,12 @@ static void test_DrawIconEx(void)
|
||||
check_DrawIconEx(hdcDst, FALSE, 0x80A0B0C0, 32, DI_MASK, 0x00FFFFFF, 0x00000000, 0x00000000, __LINE__);
|
||||
check_DrawIconEx(hdcDst, TRUE, 0x80A0B0C0, 32, DI_MASK, 0x00FFFFFF, 0x00FFFFFF, 0x00FFFFFF, __LINE__);
|
||||
|
||||
todo_wine
|
||||
{
|
||||
check_DrawIconEx(hdcDst, FALSE, 0x00A0B0C0, 32, DI_IMAGE, 0x00FFFFFF, 0x00C0B0A0, 0x00C0B0A0, __LINE__);
|
||||
check_DrawIconEx(hdcDst, TRUE, 0x00A0B0C0, 32, DI_IMAGE, 0x00FFFFFF, 0x00C0B0A0, 0x00C0B0A0, __LINE__);
|
||||
}
|
||||
check_DrawIconEx(hdcDst, FALSE, 0x00A0B0C0, 32, DI_IMAGE, 0x00FFFFFF, 0x00C0B0A0, 0x00C0B0A0, __LINE__);
|
||||
check_DrawIconEx(hdcDst, TRUE, 0x00A0B0C0, 32, DI_IMAGE, 0x00FFFFFF, 0x00C0B0A0, 0x00C0B0A0, __LINE__);
|
||||
|
||||
/* Test normal drawing */
|
||||
check_DrawIconEx(hdcDst, FALSE, 0x00A0B0C0, 32, DI_NORMAL, 0x00FFFFFF, 0x00C0B0A0, 0x00C0B0A0, __LINE__);
|
||||
todo_wine check_DrawIconEx(hdcDst, TRUE, 0x00A0B0C0, 32, DI_NORMAL, 0x00FFFFFF, 0x003F4F5F, 0x003F4F5F, __LINE__);
|
||||
check_DrawIconEx(hdcDst, TRUE, 0x00A0B0C0, 32, DI_NORMAL, 0x00FFFFFF, 0x003F4F5F, 0x003F4F5F, __LINE__);
|
||||
check_DrawIconEx(hdcDst, FALSE, 0xFFA0B0C0, 32, DI_NORMAL, 0x00FFFFFF, 0x00C0B0A0, 0x00C0B0A0, __LINE__);
|
||||
|
||||
/* Test alpha blending */
|
||||
@@ -1641,13 +1678,12 @@ static void test_DestroyCursor(void)
|
||||
* ERROR_INVALID_CURSOR_HANDLE. This happens because we called
|
||||
* DestroyCursor() 2+ times after calling SetCursor(). The calls to
|
||||
* GetCursor() and SetCursor(NULL) in between make no difference. */
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = DestroyCursor(cursor);
|
||||
todo_wine {
|
||||
ok(!ret, "DestroyCursor succeeded.\n");
|
||||
error = GetLastError();
|
||||
ok(error == ERROR_INVALID_CURSOR_HANDLE || error == 0xdeadbeef, /* vista */
|
||||
"Last error: 0x%08x\n", error);
|
||||
}
|
||||
todo_wine ok(!ret, "DestroyCursor succeeded.\n");
|
||||
error = GetLastError();
|
||||
ok(error == ERROR_INVALID_CURSOR_HANDLE || error == 0xdeadbeef, /* vista */
|
||||
"Last error: 0x%08x\n", error);
|
||||
}
|
||||
|
||||
DeleteObject(cursorInfo.hbmMask);
|
||||
@@ -1666,9 +1702,7 @@ static void test_DestroyCursor(void)
|
||||
SetLastError(0xdeadbeef);
|
||||
SetCursor(cursor);
|
||||
error = GetLastError();
|
||||
todo_wine {
|
||||
ok(error == 0xdeadbeef, "Last error: 0x%08x\n", error);
|
||||
}
|
||||
ok(error == 0xdeadbeef, "Last error: 0x%08x\n", error);
|
||||
|
||||
/* Check if LoadCursor() returns the same handle with the same icon. */
|
||||
cursor2 = LoadCursor(NULL, IDC_ARROW);
|
||||
|
||||
@@ -40,7 +40,8 @@ static HWND hwnd_cache, hwnd_owndc, hwnd_classdc, hwnd_classdc2;
|
||||
static void test_dc_attributes(void)
|
||||
{
|
||||
HDC hdc, old_hdc;
|
||||
INT rop, def_rop;
|
||||
HDC hdcs[20];
|
||||
INT i, rop, def_rop, found_dc;
|
||||
|
||||
/* test cache DC */
|
||||
|
||||
@@ -57,26 +58,60 @@ static void test_dc_attributes(void)
|
||||
ok( rop == def_rop, "wrong ROP2 %d after release\n", rop );
|
||||
SetROP2( hdc, R2_WHITE );
|
||||
ReleaseDC( hwnd_cache, hdc );
|
||||
old_hdc = hdc;
|
||||
|
||||
hdc = GetDCEx( hwnd_cache, 0, DCX_USESTYLE | DCX_NORESETATTRS );
|
||||
rop = GetROP2( hdc );
|
||||
/* Win9x seems to silently ignore DCX_NORESETATTRS */
|
||||
ok( rop == def_rop || rop == R2_WHITE, "wrong ROP2 %d\n", rop );
|
||||
found_dc = 0;
|
||||
for (i = 0; i < 20; i++)
|
||||
{
|
||||
hdc = hdcs[i] = GetDCEx( hwnd_cache, 0, DCX_USESTYLE | DCX_NORESETATTRS );
|
||||
if (!hdc) break;
|
||||
rop = GetROP2( hdc );
|
||||
if (hdc == old_hdc)
|
||||
todo_wine ok( rop == def_rop, "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
|
||||
else
|
||||
ok( rop == def_rop, "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
|
||||
if (hdc == old_hdc)
|
||||
{
|
||||
found_dc = 1;
|
||||
SetROP2( hdc, R2_WHITE );
|
||||
}
|
||||
}
|
||||
if (!found_dc)
|
||||
{
|
||||
trace( "hdc %p not found in cache using %p\n", old_hdc, hdcs[0] );
|
||||
old_hdc = hdcs[0];
|
||||
SetROP2( old_hdc, R2_WHITE );
|
||||
}
|
||||
while (i >= 0) ReleaseDC( hwnd_cache, hdcs[--i] );
|
||||
|
||||
SetROP2( hdc, R2_WHITE );
|
||||
rop = GetROP2( hdc );
|
||||
ok( rop == R2_WHITE, "wrong ROP2 %d\n", rop );
|
||||
for (i = 0; i < 20; i++)
|
||||
{
|
||||
hdc = hdcs[i] = GetDCEx( hwnd_cache, 0, DCX_USESTYLE | DCX_NORESETATTRS );
|
||||
if (!hdc) break;
|
||||
rop = GetROP2( hdc );
|
||||
if (hdc == old_hdc)
|
||||
ok( rop == R2_WHITE || broken( rop == def_rop), /* win9x doesn't support DCX_NORESETATTRS */
|
||||
"wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
|
||||
else
|
||||
ok( rop == def_rop, "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
|
||||
}
|
||||
while (i >= 0) ReleaseDC( hwnd_cache, hdcs[--i] );
|
||||
|
||||
ReleaseDC( hwnd_cache, hdc );
|
||||
hdc = GetDCEx( hwnd_cache, 0, DCX_USESTYLE | DCX_NORESETATTRS );
|
||||
rop = GetROP2( hdc );
|
||||
ok( rop == def_rop || rop == R2_WHITE, "wrong ROP2 %d after release\n", rop );
|
||||
ReleaseDC( hwnd_cache, hdc );
|
||||
|
||||
hdc = GetDCEx( hwnd_cache, 0, DCX_USESTYLE );
|
||||
rop = GetROP2( hdc );
|
||||
ok( rop == def_rop, "wrong ROP2 %d after release\n", rop );
|
||||
ReleaseDC( hwnd_cache, hdc );
|
||||
for (i = 0; i < 20; i++)
|
||||
{
|
||||
hdc = hdcs[i] = GetDCEx( hwnd_cache, 0, DCX_USESTYLE );
|
||||
if (!hdc) break;
|
||||
rop = GetROP2( hdc );
|
||||
if (hdc == old_hdc)
|
||||
{
|
||||
todo_wine ok( rop == R2_WHITE || broken( rop == def_rop),
|
||||
"wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
|
||||
SetROP2( old_hdc, def_rop );
|
||||
}
|
||||
else
|
||||
ok( rop == def_rop, "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
|
||||
}
|
||||
while (i >= 0) ReleaseDC( hwnd_cache, hdcs[--i] );
|
||||
|
||||
/* test own DC */
|
||||
|
||||
@@ -392,6 +427,23 @@ static void test_invisible_create(void)
|
||||
DestroyWindow(hwnd_owndc);
|
||||
}
|
||||
|
||||
static void test_destroyed_window(void)
|
||||
{
|
||||
HDC dc;
|
||||
|
||||
dc = GetDCEx(hwnd_cache, 0, DCX_USESTYLE);
|
||||
ok(!dc, "Got a non-NULL DC (%p) for a destroyed window.\n", dc);
|
||||
|
||||
dc = GetDCEx(hwnd_owndc, 0, DCX_USESTYLE);
|
||||
ok(!dc, "Got a non-NULL DC (%p) for a destroyed window.\n", dc);
|
||||
|
||||
dc = GetDCEx(hwnd_classdc, 0, DCX_USESTYLE);
|
||||
ok(!dc, "Got a non-NULL DC (%p) for a destroyed window.\n", dc);
|
||||
|
||||
dc = GetDCEx(hwnd_classdc2, 0, DCX_USESTYLE);
|
||||
ok(!dc, "Got a non-NULL DC (%p) for a destroyed window.\n", dc);
|
||||
}
|
||||
|
||||
START_TEST(dce)
|
||||
{
|
||||
WNDCLASSA cls;
|
||||
@@ -431,4 +483,11 @@ START_TEST(dce)
|
||||
test_dc_visrgn();
|
||||
test_begin_paint();
|
||||
test_invisible_create();
|
||||
|
||||
DestroyWindow(hwnd_classdc2);
|
||||
DestroyWindow(hwnd_classdc);
|
||||
DestroyWindow(hwnd_owndc);
|
||||
DestroyWindow(hwnd_cache);
|
||||
|
||||
test_destroyed_window();
|
||||
}
|
||||
|
||||
+548
-193
File diff suppressed because it is too large
Load Diff
@@ -338,7 +338,7 @@ static int id (HWND h)
|
||||
* (tab test)
|
||||
*/
|
||||
|
||||
static void GetNextDlgItemTest (void)
|
||||
static void test_GetNextDlgItem(void)
|
||||
{
|
||||
static test_record test [] =
|
||||
{
|
||||
@@ -574,7 +574,7 @@ static BOOL RegisterWindowClasses (void)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void WM_NEXTDLGCTLTest(void)
|
||||
static void test_WM_NEXTDLGCTL(void)
|
||||
{
|
||||
DWORD dwVal;
|
||||
|
||||
@@ -681,7 +681,7 @@ static void WM_NEXTDLGCTLTest(void)
|
||||
DestroyWindow(g_hwndTestDlg);
|
||||
}
|
||||
|
||||
static void IsDialogMessageWTest (void)
|
||||
static void test_IsDialogMessage(void)
|
||||
{
|
||||
MSG msg;
|
||||
|
||||
@@ -795,7 +795,7 @@ static const char * GetHwndString(HWND hw)
|
||||
return "unknown handle";
|
||||
}
|
||||
|
||||
static void InitialFocusTest (void)
|
||||
static void test_initial_focus(void)
|
||||
{
|
||||
/* Test 1:
|
||||
* This test intentionally returns FALSE in response to WM_INITDIALOG
|
||||
@@ -897,6 +897,57 @@ static void test_GetDlgItemText(void)
|
||||
"string retrieved using GetDlgItemText should have been NULL terminated\n");
|
||||
}
|
||||
|
||||
static void test_GetDlgItem(void)
|
||||
{
|
||||
HWND hwnd, child1, child2, hwnd2;
|
||||
BOOL ret;
|
||||
|
||||
hwnd = CreateWindowA("button", "parent", WS_VISIBLE, 0, 0, 100, 100, NULL, 0, g_hinst, NULL);
|
||||
ok(hwnd != NULL, "failed to created window\n");
|
||||
|
||||
/* created with the same ID */
|
||||
child1 = CreateWindowA("button", "child1", WS_VISIBLE|WS_CHILD, 0, 0, 10, 10, hwnd, 0, g_hinst, NULL);
|
||||
ok(child1 != NULL, "failed to create first child\n");
|
||||
child2 = CreateWindowA("button", "child2", WS_VISIBLE|WS_CHILD, 0, 0, 10, 10, hwnd, 0, g_hinst, NULL);
|
||||
ok(child2 != NULL, "failed to create second child\n");
|
||||
|
||||
hwnd2 = GetDlgItem(hwnd, 0);
|
||||
ok(hwnd2 == child1, "expected first child, got %p\n", hwnd2);
|
||||
|
||||
hwnd2 = GetTopWindow(hwnd);
|
||||
ok(hwnd2 == child1, "expected first child to be top, got %p\n", hwnd2);
|
||||
|
||||
ret = SetWindowPos(child1, child2, 0, 0, 0, 0, SWP_NOMOVE);
|
||||
ok(ret, "got %d\n", ret);
|
||||
hwnd2 = GetTopWindow(hwnd);
|
||||
ok(hwnd2 == child2, "expected second child to be top, got %p\n", hwnd2);
|
||||
|
||||
/* top window from child list is picked */
|
||||
hwnd2 = GetDlgItem(hwnd, 0);
|
||||
ok(hwnd2 == child2, "expected second child, got %p\n", hwnd2);
|
||||
|
||||
/* Now test how GetDlgItem searches */
|
||||
DestroyWindow(child2);
|
||||
child2 = CreateWindowA("button", "child2", WS_VISIBLE|WS_CHILD, 0, 0, 10, 10, child1, 0, g_hinst, NULL);
|
||||
ok(child2 != NULL, "failed to create second child\n");
|
||||
|
||||
/* give child2 an ID */
|
||||
SetWindowLong(child2, GWLP_ID, 100);
|
||||
|
||||
hwnd2 = GetDlgItem(hwnd, 100);
|
||||
ok(!hwnd2, "expected child to not be found, got %p\n", hwnd2);
|
||||
|
||||
/* make the ID of child2 public with a WS_EX_CONTROLPARENT parent */
|
||||
SetWindowLong(child1, GWL_EXSTYLE, WS_EX_CONTROLPARENT);
|
||||
|
||||
hwnd2 = GetDlgItem(hwnd, 100);
|
||||
ok(!hwnd2, "expected child to not be found, got %p\n", hwnd2);
|
||||
|
||||
DestroyWindow(child1);
|
||||
DestroyWindow(child2);
|
||||
DestroyWindow(hwnd);
|
||||
}
|
||||
|
||||
static INT_PTR CALLBACK DestroyDlgWinProc (HWND hDlg, UINT uiMsg,
|
||||
WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
@@ -1212,10 +1263,11 @@ START_TEST(dialog)
|
||||
|
||||
if (!RegisterWindowClasses()) assert(0);
|
||||
|
||||
GetNextDlgItemTest();
|
||||
IsDialogMessageWTest();
|
||||
WM_NEXTDLGCTLTest();
|
||||
InitialFocusTest();
|
||||
test_GetNextDlgItem();
|
||||
test_IsDialogMessage();
|
||||
test_WM_NEXTDLGCTL();
|
||||
test_initial_focus();
|
||||
test_GetDlgItem();
|
||||
test_GetDlgItemText();
|
||||
test_DialogBoxParamA();
|
||||
test_DisabledDialogTest();
|
||||
|
||||
@@ -38,6 +38,15 @@ struct edit_notify {
|
||||
|
||||
static struct edit_notify notifications;
|
||||
|
||||
static BOOL (WINAPI *pEndMenu) (void);
|
||||
|
||||
static void init_function_pointers(void)
|
||||
{
|
||||
HMODULE hdll = GetModuleHandleA("user32");
|
||||
|
||||
pEndMenu = (void*)GetProcAddress(hdll, "EndMenu");
|
||||
}
|
||||
|
||||
static INT_PTR CALLBACK multi_edit_dialog_proc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
static int num_ok_commands = 0;
|
||||
@@ -537,6 +546,7 @@ static HINSTANCE hinst;
|
||||
static HWND hwndET2;
|
||||
static const char szEditTest2Class[] = "EditTest2Class";
|
||||
static const char szEditTest3Class[] = "EditTest3Class";
|
||||
static const char szEditTest4Class[] = "EditTest4Class";
|
||||
static const char szEditTextPositionClass[] = "EditTextPositionWindowClass";
|
||||
|
||||
static HWND create_editcontrol (DWORD style, DWORD exstyle)
|
||||
@@ -1371,13 +1381,12 @@ static void test_margins(void)
|
||||
{
|
||||
HWND hwEdit;
|
||||
RECT old_rect, new_rect;
|
||||
INT old_left_margin, old_right_margin;
|
||||
INT old_right_margin;
|
||||
DWORD old_margins, new_margins;
|
||||
|
||||
hwEdit = create_editcontrol(WS_BORDER | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0);
|
||||
|
||||
old_margins = SendMessage(hwEdit, EM_GETMARGINS, 0, 0);
|
||||
old_left_margin = LOWORD(old_margins);
|
||||
old_right_margin = HIWORD(old_margins);
|
||||
|
||||
/* Check if setting the margins works */
|
||||
@@ -2081,10 +2090,63 @@ static void test_child_edit_wmkeydown(void)
|
||||
destroy_child_editcontrol(hwEdit);
|
||||
}
|
||||
|
||||
static int got_en_setfocus = 0;
|
||||
static int got_wm_capturechanged = 0;
|
||||
|
||||
static LRESULT CALLBACK edit4_wnd_procA(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (msg) {
|
||||
case WM_COMMAND:
|
||||
switch (HIWORD(wParam)) {
|
||||
case EN_SETFOCUS:
|
||||
got_en_setfocus = 1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case WM_CAPTURECHANGED:
|
||||
if (hWnd != (HWND)lParam)
|
||||
{
|
||||
got_wm_capturechanged = 1;
|
||||
pEndMenu();
|
||||
}
|
||||
break;
|
||||
}
|
||||
return DefWindowProcA(hWnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
static void test_contextmenu_focus(void)
|
||||
{
|
||||
HWND hwndMain, hwndEdit;
|
||||
|
||||
hwndMain = CreateWindow(szEditTest4Class, "ET4", WS_OVERLAPPEDWINDOW|WS_VISIBLE,
|
||||
0, 0, 200, 200, NULL, NULL, hinst, NULL);
|
||||
assert(hwndMain);
|
||||
|
||||
hwndEdit = CreateWindow("EDIT", NULL,
|
||||
WS_CHILD|WS_BORDER|WS_VISIBLE|ES_LEFT|ES_AUTOHSCROLL,
|
||||
0, 0, 150, 50, /* important this not be 0 size. */
|
||||
hwndMain, (HMENU) ID_EDITTEST2, hinst, NULL);
|
||||
assert(hwndEdit);
|
||||
|
||||
SetFocus(NULL);
|
||||
|
||||
SetCapture(hwndMain);
|
||||
|
||||
SendMessage(hwndEdit, WM_CONTEXTMENU, (WPARAM)hwndEdit, MAKEWORD(10, 10));
|
||||
|
||||
ok(got_en_setfocus, "edit box didn't get focused\n");
|
||||
|
||||
ok(got_wm_capturechanged, "main window capture did not change\n");
|
||||
|
||||
DestroyWindow (hwndEdit);
|
||||
DestroyWindow (hwndMain);
|
||||
}
|
||||
|
||||
static BOOL RegisterWindowClasses (void)
|
||||
{
|
||||
WNDCLASSA test2;
|
||||
WNDCLASSA test3;
|
||||
WNDCLASSA test4;
|
||||
WNDCLASSA text_position;
|
||||
|
||||
test2.style = 0;
|
||||
@@ -2110,6 +2172,18 @@ static BOOL RegisterWindowClasses (void)
|
||||
test3.lpszMenuName = NULL;
|
||||
test3.lpszClassName = szEditTest3Class;
|
||||
if (!RegisterClassA(&test3)) return FALSE;
|
||||
|
||||
test4.style = 0;
|
||||
test4.lpfnWndProc = edit4_wnd_procA;
|
||||
test4.cbClsExtra = 0;
|
||||
test4.cbWndExtra = 0;
|
||||
test4.hInstance = hinst;
|
||||
test4.hIcon = NULL;
|
||||
test4.hCursor = LoadCursorA (NULL, IDC_ARROW);
|
||||
test4.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
||||
test4.lpszMenuName = NULL;
|
||||
test4.lpszClassName = szEditTest4Class;
|
||||
if (!RegisterClassA(&test4)) return FALSE;
|
||||
|
||||
text_position.style = CS_HREDRAW | CS_VREDRAW;
|
||||
text_position.cbClsExtra = 0;
|
||||
@@ -2130,6 +2204,7 @@ static void UnregisterWindowClasses (void)
|
||||
{
|
||||
UnregisterClassA(szEditTest2Class, hinst);
|
||||
UnregisterClassA(szEditTest3Class, hinst);
|
||||
UnregisterClassA(szEditTest4Class, hinst);
|
||||
UnregisterClassA(szEditTextPositionClass, hinst);
|
||||
}
|
||||
|
||||
@@ -2360,6 +2435,8 @@ static void test_dialogmode(void)
|
||||
|
||||
START_TEST(edit)
|
||||
{
|
||||
init_function_pointers();
|
||||
|
||||
hinst = GetModuleHandleA(NULL);
|
||||
assert(RegisterWindowClasses());
|
||||
|
||||
@@ -2385,6 +2462,10 @@ START_TEST(edit)
|
||||
test_child_edit_wmkeydown();
|
||||
test_fontsize();
|
||||
test_dialogmode();
|
||||
if (pEndMenu)
|
||||
test_contextmenu_focus();
|
||||
else
|
||||
win_skip("EndMenu is not available\n");
|
||||
|
||||
UnregisterWindowClasses();
|
||||
}
|
||||
|
||||
+3596
-110
File diff suppressed because it is too large
Load Diff
@@ -357,7 +357,7 @@ static void test_subpopup_locked_by_menu(void)
|
||||
ret = IsMenu( hsubmenu);
|
||||
ok( ret , "Menu handle is not valid\n");
|
||||
SetLastError( 0xdeadbeef);
|
||||
ret = TrackPopupMenu( hmenu, 0x100, 100,100, 0, hwnd, NULL);
|
||||
ret = TrackPopupMenu( hmenu, TPM_RETURNCMD, 100,100, 0, hwnd, NULL);
|
||||
if( ret == (itemid & 0xffff)) {
|
||||
win_skip("not on 16 bit menu subsystem\n");
|
||||
DestroyMenu( hsubmenu);
|
||||
@@ -384,7 +384,7 @@ static void test_subpopup_locked_by_menu(void)
|
||||
ok( !ret , "Menu handle should be invalid\n");
|
||||
/* but TrackPopupMenu still works! */
|
||||
SetLastError( 0xdeadbeef);
|
||||
ret = TrackPopupMenu( hmenu, 0x100, 100,100, 0, hwnd, NULL);
|
||||
ret = TrackPopupMenu( hmenu, TPM_RETURNCMD, 100,100, 0, hwnd, NULL);
|
||||
gle = GetLastError();
|
||||
todo_wine {
|
||||
ok( ret == itemid , "TrackPopupMenu returned %d error is %d\n", ret, gle);
|
||||
@@ -425,7 +425,7 @@ static void test_menu_ownerdraw(void)
|
||||
MOD_maxid = k-1;
|
||||
assert( k <= sizeof(MOD_rc)/sizeof(RECT));
|
||||
/* display the menu */
|
||||
ret = TrackPopupMenu( hmenu, 0x100, 100,100, 0, hwnd, NULL);
|
||||
ret = TrackPopupMenu( hmenu, TPM_RETURNCMD, 100,100, 0, hwnd, NULL);
|
||||
|
||||
/* columns have a 4 pixel gap between them */
|
||||
ok( MOD_rc[0].right + 4 == MOD_rc[2].left,
|
||||
@@ -449,7 +449,7 @@ static void test_menu_ownerdraw(void)
|
||||
leftcol= MOD_rc[0].left;
|
||||
ModifyMenu( hmenu, 0, MF_BYCOMMAND| MF_OWNERDRAW| MF_SEPARATOR, 0, 0);
|
||||
/* display the menu */
|
||||
ret = TrackPopupMenu( hmenu, 0x100, 100,100, 0, hwnd, NULL);
|
||||
ret = TrackPopupMenu( hmenu, TPM_RETURNCMD, 100,100, 0, hwnd, NULL);
|
||||
/* left should be 4 pixels less now */
|
||||
ok( leftcol == MOD_rc[0].left + 4,
|
||||
"columns should be 4 pixels to the left (actual %d).\n",
|
||||
@@ -562,7 +562,7 @@ static void test_mbs_help( int ispop, int hassub, int mnuopt,
|
||||
ReleaseDC( hwnd, hdc);
|
||||
}
|
||||
if(ispop)
|
||||
ret = TrackPopupMenu( hmenu, 0x100, 100,100, 0, hwnd, NULL);
|
||||
ret = TrackPopupMenu( hmenu, TPM_RETURNCMD, 100,100, 0, hwnd, NULL);
|
||||
else {
|
||||
ret = SetMenu( hwnd, hmenu);
|
||||
ok(ret, "SetMenu failed with error %d\n", GetLastError());
|
||||
@@ -2032,6 +2032,12 @@ static void test_menu_input(void) {
|
||||
HANDLE hThread, hWnd;
|
||||
DWORD tid;
|
||||
|
||||
if (!pSendInput)
|
||||
{
|
||||
win_skip("SendInput is not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
wclass.lpszClassName = "MenuTestClass";
|
||||
wclass.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wclass.lpfnWndProc = WndProc;
|
||||
@@ -2670,6 +2676,12 @@ static void test_menu_getmenuinfo(void)
|
||||
BOOL ret;
|
||||
DWORD gle;
|
||||
|
||||
if (!pGetMenuInfo)
|
||||
{
|
||||
win_skip("GetMenuInfo is not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* create a menu */
|
||||
hmenu = CreateMenu();
|
||||
assert( hmenu);
|
||||
@@ -2716,6 +2728,12 @@ static void test_menu_setmenuinfo(void)
|
||||
BOOL ret;
|
||||
DWORD gle;
|
||||
|
||||
if (!pGetMenuInfo || !pSetMenuInfo)
|
||||
{
|
||||
win_skip("Get/SetMenuInfo are not available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* create a menu with a submenu */
|
||||
hmenu = CreateMenu();
|
||||
hsubmenu = CreateMenu();
|
||||
@@ -2868,7 +2886,7 @@ static void test_menu_trackpopupmenu(void)
|
||||
/* start with an invalid menu handle */
|
||||
gle = 0xdeadbeef;
|
||||
gflag_initmenupopup = gflag_entermenuloop = gflag_initmenu = 0;
|
||||
ret = MyTrackPopupMenu( Ex, NULL, 0x100, 100,100, hwnd, NULL);
|
||||
ret = MyTrackPopupMenu( Ex, NULL, TPM_RETURNCMD, 100,100, hwnd, NULL);
|
||||
gle = GetLastError();
|
||||
ok( !ret, "TrackPopupMenu%s should have failed\n", Ex ? "Ex" : "");
|
||||
ok( gle == ERROR_INVALID_MENU_HANDLE
|
||||
@@ -2884,7 +2902,7 @@ static void test_menu_trackpopupmenu(void)
|
||||
/* another one but not NULL */
|
||||
gle = 0xdeadbeef;
|
||||
gflag_initmenupopup = gflag_entermenuloop = gflag_initmenu = 0;
|
||||
ret = MyTrackPopupMenu( Ex, (HMENU)hwnd, 0x100, 100,100, hwnd, NULL);
|
||||
ret = MyTrackPopupMenu( Ex, (HMENU)hwnd, TPM_RETURNCMD, 100,100, hwnd, NULL);
|
||||
gle = GetLastError();
|
||||
ok( !ret, "TrackPopupMenu%s should have failed\n", Ex ? "Ex" : "");
|
||||
ok( gle == ERROR_INVALID_MENU_HANDLE
|
||||
@@ -2900,7 +2918,7 @@ static void test_menu_trackpopupmenu(void)
|
||||
/* now a somewhat successful call */
|
||||
gle = 0xdeadbeef;
|
||||
gflag_initmenupopup = gflag_entermenuloop = gflag_initmenu = 0;
|
||||
ret = MyTrackPopupMenu( Ex, hmenu, 0x100, 100,100, hwnd, NULL);
|
||||
ret = MyTrackPopupMenu( Ex, hmenu, TPM_RETURNCMD, 100,100, hwnd, NULL);
|
||||
gle = GetLastError();
|
||||
ok( ret == 0, "TrackPopupMenu%s returned %d expected zero\n", Ex ? "Ex" : "", ret);
|
||||
ok( gle == NO_ERROR
|
||||
@@ -2918,7 +2936,7 @@ static void test_menu_trackpopupmenu(void)
|
||||
ok( ret, "AppendMenA has failed!\n");
|
||||
gle = 0xdeadbeef;
|
||||
gflag_initmenupopup = gflag_entermenuloop = gflag_initmenu = 0;
|
||||
ret = MyTrackPopupMenu( Ex, hmenu, 0x100, 100,100, hwnd, NULL);
|
||||
ret = MyTrackPopupMenu( Ex, hmenu, TPM_RETURNCMD, 100,100, hwnd, NULL);
|
||||
gle = GetLastError();
|
||||
ok( ret == 0, "TrackPopupMenu%s returned %d expected zero\n", Ex ? "Ex" : "", ret);
|
||||
ok( gle == NO_ERROR
|
||||
@@ -2937,6 +2955,53 @@ static void test_menu_trackpopupmenu(void)
|
||||
DestroyWindow(hwnd);
|
||||
}
|
||||
|
||||
static HMENU g_hmenu;
|
||||
|
||||
static LRESULT WINAPI menu_track_again_wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
switch (msg)
|
||||
{
|
||||
case WM_ENTERMENULOOP:
|
||||
{
|
||||
BOOL ret;
|
||||
|
||||
/* try a recursive call */
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = TrackPopupMenu(g_hmenu, 0, 100, 100, 0, hwnd, NULL);
|
||||
ok(ret == FALSE, "got %d\n", ret);
|
||||
ok(GetLastError() == ERROR_POPUP_ALREADY_ACTIVE ||
|
||||
broken(GetLastError() == 0xdeadbeef) /* W9x */, "got %d\n", GetLastError());
|
||||
|
||||
/* exit menu modal loop
|
||||
* ( A SendMessage does not work on NT3.51 here ) */
|
||||
return PostMessage(hwnd, WM_CANCELMODE, 0, 0);
|
||||
}
|
||||
}
|
||||
return DefWindowProc(hwnd, msg, wparam, lparam);
|
||||
}
|
||||
|
||||
static void test_menu_trackagain(void)
|
||||
{
|
||||
HWND hwnd;
|
||||
BOOL ret;
|
||||
|
||||
hwnd = CreateWindowEx(0, MAKEINTATOM(atomMenuCheckClass), NULL,
|
||||
WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200,
|
||||
NULL, NULL, NULL, NULL);
|
||||
ok(hwnd != NULL, "CreateWindowEx failed with error %d\n", GetLastError());
|
||||
if (!hwnd) return;
|
||||
SetWindowLongPtr( hwnd, GWLP_WNDPROC, (LONG_PTR)menu_track_again_wnd_proc);
|
||||
|
||||
g_hmenu = CreatePopupMenu();
|
||||
ok(g_hmenu != NULL, "CreateMenu failed with error %d\n", GetLastError());
|
||||
|
||||
ret = TrackPopupMenu( g_hmenu, 0, 100, 100, 0, hwnd, NULL);
|
||||
todo_wine ok(ret == FALSE, "got %d\n", ret);
|
||||
|
||||
DestroyMenu(g_hmenu);
|
||||
DestroyWindow(hwnd);
|
||||
}
|
||||
|
||||
/* test handling of WM_CANCELMODE messages */
|
||||
static int g_got_enteridle;
|
||||
static HWND g_hwndtosend;
|
||||
@@ -2997,17 +3062,14 @@ static void test_menu_cancelmode(void)
|
||||
*/
|
||||
/* menu owner is top level window */
|
||||
g_hwndtosend = hwnd;
|
||||
ret = TrackPopupMenu( menu, 0x100, 100,100, 0, hwnd, NULL);
|
||||
ret = TrackPopupMenu( menu, TPM_RETURNCMD, 100,100, 0, hwnd, NULL);
|
||||
todo_wine {
|
||||
ok( g_got_enteridle == 0, "received %d WM_ENTERIDLE messages, none expected\n", g_got_enteridle);
|
||||
}
|
||||
ok( g_got_enteridle < 2, "received %d WM_ENTERIDLE messages, should be less than 2\n", g_got_enteridle);
|
||||
|
||||
skip("skipping TrackPopupMenu, that hangs on reactos\n");
|
||||
#if 0
|
||||
/* menu owner is child window */
|
||||
g_hwndtosend = hwndchild;
|
||||
ret = TrackPopupMenu( menu, 0x100, 100,100, 0, hwndchild, NULL);
|
||||
ret = TrackPopupMenu( menu, TPM_RETURNCMD, 100,100, 0, hwndchild, NULL);
|
||||
todo_wine {
|
||||
ok(g_got_enteridle == 0, "received %d WM_ENTERIDLE messages, none expected\n", g_got_enteridle);
|
||||
}
|
||||
@@ -3015,9 +3077,8 @@ static void test_menu_cancelmode(void)
|
||||
/* now send the WM_CANCELMODE messages to the WRONG window */
|
||||
/* those should fail ( to have any effect) */
|
||||
g_hwndtosend = hwnd;
|
||||
ret = TrackPopupMenu( menu, 0x100, 100,100, 0, hwndchild, NULL);
|
||||
ret = TrackPopupMenu( menu, TPM_RETURNCMD, 100,100, 0, hwndchild, NULL);
|
||||
ok( g_got_enteridle == 2, "received %d WM_ENTERIDLE messages, should be 2\n", g_got_enteridle);
|
||||
#endif
|
||||
/* cleanup */
|
||||
DestroyMenu( menu);
|
||||
DestroyWindow( hwndchild);
|
||||
@@ -3208,20 +3269,14 @@ START_TEST(menu)
|
||||
test_subpopup_locked_by_menu();
|
||||
test_menu_ownerdraw();
|
||||
test_menu_bmp_and_string();
|
||||
/* test Get/SetMenuInfo if available */
|
||||
if( pGetMenuInfo && pSetMenuInfo) {
|
||||
test_menu_getmenuinfo();
|
||||
test_menu_setmenuinfo();
|
||||
} else
|
||||
win_skip("Get/SetMenuInfo are not available\n");
|
||||
if( !pSendInput)
|
||||
win_skip("SendInput is not available\n");
|
||||
else
|
||||
test_menu_input();
|
||||
test_menu_getmenuinfo();
|
||||
test_menu_setmenuinfo();
|
||||
test_menu_input();
|
||||
test_menu_flags();
|
||||
|
||||
test_menu_hilitemenuitem();
|
||||
test_menu_trackpopupmenu();
|
||||
test_menu_trackagain();
|
||||
test_menu_cancelmode();
|
||||
test_menu_maxdepth();
|
||||
test_menu_circref();
|
||||
|
||||
+168
-19
@@ -20,7 +20,8 @@
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#define _WIN32_WINNT 0x0501 /* For WM_CHANGEUISTATE,QS_RAWINPUT */
|
||||
#define _WIN32_WINNT 0x0600 /* For WM_CHANGEUISTATE,QS_RAWINPUT,WM_DWMxxxx */
|
||||
#define WINVER 0x0600 /* for WM_GETTITLEBARINFOEX */
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
@@ -184,7 +185,7 @@ static const struct message WmSWP_ShowOverlappedSeq[] = {
|
||||
{ WM_GETTITLEBARINFOEX, sent|optional },
|
||||
{ WM_PAINT, sent|optional },
|
||||
{ WM_NCPAINT, sent|beginpaint|optional },
|
||||
{ WM_GETTEXT, sent|defwinproc|optional },
|
||||
{ WM_GETTEXT, sent|beginpaint|defwinproc|optional },
|
||||
{ WM_ERASEBKGND, sent|beginpaint|optional },
|
||||
{ 0 }
|
||||
};
|
||||
@@ -4716,10 +4717,10 @@ static void test_messages(void)
|
||||
ok(hwnd != 0, "Failed to create custom dialog window\n");
|
||||
ok_sequence(WmCreateCustomDialogSeq, "CreateCustomDialog", TRUE);
|
||||
|
||||
/*
|
||||
if(0) {
|
||||
trace("testing scroll APIs on a visible dialog %p\n", hwnd);
|
||||
test_scroll_messages(hwnd);
|
||||
*/
|
||||
}
|
||||
|
||||
flush_sequence();
|
||||
|
||||
@@ -5256,6 +5257,65 @@ static const struct message WmSetStyleOwnerdrawSeq[] =
|
||||
{ WM_DRAWITEM, sent|wparam|lparam|parent, ID_BUTTON, 0x000010e4 },
|
||||
{ 0 }
|
||||
};
|
||||
static const struct message WmSetStateButtonSeq[] =
|
||||
{
|
||||
{ BM_SETSTATE, sent },
|
||||
{ WM_CTLCOLORBTN, sent|parent },
|
||||
{ WM_APP, sent|wparam|lparam, 0, 0 },
|
||||
{ 0 }
|
||||
};
|
||||
static const struct message WmSetStateStaticSeq[] =
|
||||
{
|
||||
{ BM_SETSTATE, sent },
|
||||
{ WM_CTLCOLORSTATIC, sent|parent },
|
||||
{ WM_APP, sent|wparam|lparam, 0, 0 },
|
||||
{ 0 }
|
||||
};
|
||||
static const struct message WmSetStateUserSeq[] =
|
||||
{
|
||||
{ BM_SETSTATE, sent },
|
||||
{ WM_CTLCOLORBTN, sent|parent },
|
||||
{ WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_BUTTON, BN_HILITE) },
|
||||
{ WM_APP, sent|wparam|lparam, 0, 0 },
|
||||
{ 0 }
|
||||
};
|
||||
static const struct message WmSetStateOwnerdrawSeq[] =
|
||||
{
|
||||
{ BM_SETSTATE, sent },
|
||||
{ WM_CTLCOLORBTN, sent|parent },
|
||||
{ WM_DRAWITEM, sent|wparam|lparam|parent, ID_BUTTON, 0x000120e4 },
|
||||
{ WM_APP, sent|wparam|lparam, 0, 0 },
|
||||
{ 0 }
|
||||
};
|
||||
static const struct message WmClearStateButtonSeq[] =
|
||||
{
|
||||
{ BM_SETSTATE, sent },
|
||||
{ WM_CTLCOLORBTN, sent|parent },
|
||||
{ WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_BUTTON, BN_UNHILITE) },
|
||||
{ WM_APP, sent|wparam|lparam, 0, 0 },
|
||||
{ 0 }
|
||||
};
|
||||
static const struct message WmClearStateOwnerdrawSeq[] =
|
||||
{
|
||||
{ BM_SETSTATE, sent },
|
||||
{ WM_CTLCOLORBTN, sent|parent },
|
||||
{ WM_DRAWITEM, sent|wparam|lparam|parent, ID_BUTTON, 0x000020e4 },
|
||||
{ WM_APP, sent|wparam|lparam, 0, 0 },
|
||||
{ 0 }
|
||||
};
|
||||
static const struct message WmSetCheckIgnoredSeq[] =
|
||||
{
|
||||
{ BM_SETCHECK, sent },
|
||||
{ WM_APP, sent|wparam|lparam, 0, 0 },
|
||||
{ 0 }
|
||||
};
|
||||
static const struct message WmSetCheckStaticSeq[] =
|
||||
{
|
||||
{ BM_SETCHECK, sent },
|
||||
{ WM_CTLCOLORSTATIC, sent|parent },
|
||||
{ WM_APP, sent|wparam|lparam, 0, 0 },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
static WNDPROC old_button_proc;
|
||||
|
||||
@@ -5272,7 +5332,8 @@ static LRESULT CALLBACK button_hook_proc(HWND hwnd, UINT message, WPARAM wParam,
|
||||
case WM_SYNCPAINT:
|
||||
break;
|
||||
case BM_SETSTATE:
|
||||
ok(GetCapture() == hwnd, "GetCapture() = %p\n", GetCapture());
|
||||
if (GetCapture())
|
||||
ok(GetCapture() == hwnd, "GetCapture() = %p\n", GetCapture());
|
||||
/* fall through */
|
||||
default:
|
||||
msg.hwnd = hwnd;
|
||||
@@ -5316,29 +5377,43 @@ static void test_button_messages(void)
|
||||
const struct message *setfocus;
|
||||
const struct message *killfocus;
|
||||
const struct message *setstyle;
|
||||
const struct message *setstate;
|
||||
const struct message *clearstate;
|
||||
const struct message *setcheck;
|
||||
} button[] = {
|
||||
{ BS_PUSHBUTTON, DLGC_BUTTON | DLGC_UNDEFPUSHBUTTON,
|
||||
WmSetFocusButtonSeq, WmKillFocusButtonSeq, WmSetStyleButtonSeq },
|
||||
WmSetFocusButtonSeq, WmKillFocusButtonSeq, WmSetStyleButtonSeq,
|
||||
WmSetStateButtonSeq, WmSetStateButtonSeq, WmSetCheckIgnoredSeq },
|
||||
{ BS_DEFPUSHBUTTON, DLGC_BUTTON | DLGC_DEFPUSHBUTTON,
|
||||
WmSetFocusButtonSeq, WmKillFocusButtonSeq, WmSetStyleButtonSeq },
|
||||
WmSetFocusButtonSeq, WmKillFocusButtonSeq, WmSetStyleButtonSeq,
|
||||
WmSetStateButtonSeq, WmSetStateButtonSeq, WmSetCheckIgnoredSeq },
|
||||
{ BS_CHECKBOX, DLGC_BUTTON,
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq },
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq,
|
||||
WmSetStateStaticSeq, WmSetStateStaticSeq, WmSetCheckStaticSeq },
|
||||
{ BS_AUTOCHECKBOX, DLGC_BUTTON,
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq },
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq,
|
||||
WmSetStateStaticSeq, WmSetStateStaticSeq, WmSetCheckStaticSeq },
|
||||
{ BS_RADIOBUTTON, DLGC_BUTTON | DLGC_RADIOBUTTON,
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq },
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq,
|
||||
WmSetStateStaticSeq, WmSetStateStaticSeq, WmSetCheckStaticSeq },
|
||||
{ BS_3STATE, DLGC_BUTTON,
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq },
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq,
|
||||
WmSetStateStaticSeq, WmSetStateStaticSeq, WmSetCheckStaticSeq },
|
||||
{ BS_AUTO3STATE, DLGC_BUTTON,
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq },
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq,
|
||||
WmSetStateStaticSeq, WmSetStateStaticSeq, WmSetCheckStaticSeq },
|
||||
{ BS_GROUPBOX, DLGC_STATIC,
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq },
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq,
|
||||
WmSetStateStaticSeq, WmSetStateStaticSeq, WmSetCheckIgnoredSeq },
|
||||
{ BS_USERBUTTON, DLGC_BUTTON | DLGC_UNDEFPUSHBUTTON,
|
||||
WmSetFocusButtonSeq, WmKillFocusButtonSeq, WmSetStyleUserSeq },
|
||||
WmSetFocusButtonSeq, WmKillFocusButtonSeq, WmSetStyleUserSeq,
|
||||
WmSetStateUserSeq, WmClearStateButtonSeq, WmSetCheckIgnoredSeq },
|
||||
{ BS_AUTORADIOBUTTON, DLGC_BUTTON | DLGC_RADIOBUTTON,
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq },
|
||||
WmSetFocusStaticSeq, WmKillFocusStaticSeq, WmSetStyleStaticSeq,
|
||||
WmSetStateStaticSeq, WmSetStateStaticSeq, WmSetCheckStaticSeq },
|
||||
{ BS_OWNERDRAW, DLGC_BUTTON,
|
||||
WmSetFocusOwnerdrawSeq, WmKillFocusOwnerdrawSeq, WmSetStyleOwnerdrawSeq }
|
||||
WmSetFocusOwnerdrawSeq, WmKillFocusOwnerdrawSeq, WmSetStyleOwnerdrawSeq,
|
||||
WmSetStateOwnerdrawSeq, WmClearStateOwnerdrawSeq, WmSetCheckIgnoredSeq },
|
||||
};
|
||||
unsigned int i;
|
||||
HWND hwnd, parent;
|
||||
@@ -5365,7 +5440,7 @@ static void test_button_messages(void)
|
||||
for (i = 0; i < sizeof(button)/sizeof(button[0]); i++)
|
||||
{
|
||||
MSG msg;
|
||||
DWORD style;
|
||||
DWORD style, state;
|
||||
|
||||
trace("button style %08x\n", button[i].style);
|
||||
|
||||
@@ -5414,7 +5489,80 @@ static void test_button_messages(void)
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
style &= ~(WS_VISIBLE | WS_CHILD | BS_NOTIFY);
|
||||
/* XP doesn't turn a BS_USERBUTTON into BS_PUSHBUTTON here! */
|
||||
ok(style == button[i].style, "expected style %x got %x\n", button[i].style, style);
|
||||
ok(style == button[i].style, "expected style %04x got %04x\n", button[i].style, style);
|
||||
|
||||
state = SendMessage(hwnd, BM_GETSTATE, 0, 0);
|
||||
ok(state == 0, "expected state 0, got %04x\n", state);
|
||||
|
||||
flush_sequence();
|
||||
|
||||
SendMessage(hwnd, BM_SETSTATE, TRUE, 0);
|
||||
SendMessage(hwnd, WM_APP, 0, 0); /* place a separator mark here */
|
||||
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessage(&msg);
|
||||
ok_sequence(button[i].setstate, "BM_SETSTATE/TRUE on a button", FALSE);
|
||||
|
||||
state = SendMessage(hwnd, BM_GETSTATE, 0, 0);
|
||||
ok(state == 0x0004, "expected state 0x0004, got %04x\n", state);
|
||||
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
style &= ~(WS_CHILD | BS_NOTIFY | WS_VISIBLE);
|
||||
ok(style == button[i].style, "expected style %04x got %04x\n", button[i].style, style);
|
||||
|
||||
flush_sequence();
|
||||
|
||||
SendMessage(hwnd, BM_SETSTATE, FALSE, 0);
|
||||
SendMessage(hwnd, WM_APP, 0, 0); /* place a separator mark here */
|
||||
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessage(&msg);
|
||||
ok_sequence(button[i].clearstate, "BM_SETSTATE/FALSE on a button", FALSE);
|
||||
|
||||
state = SendMessage(hwnd, BM_GETSTATE, 0, 0);
|
||||
ok(state == 0, "expected state 0, got %04x\n", state);
|
||||
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
style &= ~(WS_CHILD | BS_NOTIFY | WS_VISIBLE);
|
||||
ok(style == button[i].style, "expected style %04x got %04x\n", button[i].style, style);
|
||||
|
||||
state = SendMessage(hwnd, BM_GETCHECK, 0, 0);
|
||||
ok(state == BST_UNCHECKED, "expected BST_UNCHECKED, got %04x\n", state);
|
||||
|
||||
flush_sequence();
|
||||
|
||||
SendMessage(hwnd, BM_SETCHECK, BST_UNCHECKED, 0);
|
||||
SendMessage(hwnd, WM_APP, 0, 0); /* place a separator mark here */
|
||||
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessage(&msg);
|
||||
ok_sequence(WmSetCheckIgnoredSeq, "BM_SETCHECK on a button", FALSE);
|
||||
|
||||
state = SendMessage(hwnd, BM_GETCHECK, 0, 0);
|
||||
ok(state == BST_UNCHECKED, "expected BST_UNCHECKED, got %04x\n", state);
|
||||
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
style &= ~(WS_CHILD | BS_NOTIFY | WS_VISIBLE);
|
||||
ok(style == button[i].style, "expected style %04x got %04x\n", button[i].style, style);
|
||||
|
||||
flush_sequence();
|
||||
|
||||
SendMessage(hwnd, BM_SETCHECK, BST_CHECKED, 0);
|
||||
SendMessage(hwnd, WM_APP, 0, 0); /* place a separator mark here */
|
||||
while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessage(&msg);
|
||||
ok_sequence(button[i].setcheck, "BM_SETCHECK on a button", FALSE);
|
||||
|
||||
state = SendMessage(hwnd, BM_GETCHECK, 0, 0);
|
||||
if (button[i].style == BS_PUSHBUTTON ||
|
||||
button[i].style == BS_DEFPUSHBUTTON ||
|
||||
button[i].style == BS_GROUPBOX ||
|
||||
button[i].style == BS_USERBUTTON ||
|
||||
button[i].style == BS_OWNERDRAW)
|
||||
ok(state == BST_UNCHECKED, "expected check 0, got %04x\n", state);
|
||||
else
|
||||
ok(state == BST_CHECKED, "expected check 1, got %04x\n", state);
|
||||
|
||||
style = GetWindowLongA(hwnd, GWL_STYLE);
|
||||
style &= ~(WS_CHILD | BS_NOTIFY | WS_VISIBLE);
|
||||
if (button[i].style == BS_RADIOBUTTON ||
|
||||
button[i].style == BS_AUTORADIOBUTTON)
|
||||
ok(style == (button[i].style | WS_TABSTOP), "expected style %04x | WS_TABSTOP got %04x\n", button[i].style, style);
|
||||
else
|
||||
ok(style == button[i].style, "expected style %04x got %04x\n", button[i].style, style);
|
||||
|
||||
log_all_parent_messages--;
|
||||
|
||||
@@ -11515,7 +11663,7 @@ static const struct message wm_popup_menu_1[] =
|
||||
{ WM_MENUSELECT, sent|wparam, MAKEWPARAM(200,MF_HILITE) },
|
||||
{ HCBT_KEYSKIPPED, hook|wparam|lparam|optional, 'E', 0xf0000001 },
|
||||
{ HCBT_KEYSKIPPED, hook|wparam|lparam|optional, VK_MENU, 0xd0000001 },
|
||||
{ HCBT_KEYSKIPPED, hook|wparam|lparam|optional, VK_RETURN, 0x10000001 },
|
||||
{ HCBT_KEYSKIPPED, hook|wparam|lparam|optional, VK_RETURN, 0x10000001, 0, 0x40000000 },
|
||||
{ HCBT_DESTROYWND, hook|optional }, /* Win9x doesn't create a window */
|
||||
{ WM_UNINITMENUPOPUP, sent|lparam, 0, 0 },
|
||||
{ WM_MENUSELECT, sent|wparam|lparam, MAKEWPARAM(0,0xffff), 0 },
|
||||
@@ -12275,6 +12423,7 @@ static DWORD CALLBACK wait_idle_thread( void *arg )
|
||||
|
||||
hwnd = CreateWindowExA(0, "TestClass", NULL, WS_POPUP, 0, 0, 10, 10, 0, 0, 0, NULL);
|
||||
while (GetMessage( &msg, 0, 0, 0 )) DispatchMessage( &msg );
|
||||
DestroyWindow(hwnd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1040,7 +1040,6 @@ static void test_shell_window(void)
|
||||
DWORD error;
|
||||
HMODULE hinst, hUser32;
|
||||
BOOL (WINAPI*SetShellWindow)(HWND);
|
||||
BOOL (WINAPI*SetShellWindowEx)(HWND, HWND);
|
||||
HWND hwnd1, hwnd2, hwnd3, hwnd4, hwnd5;
|
||||
HWND shellWindow, nextWnd;
|
||||
|
||||
@@ -1055,7 +1054,6 @@ static void test_shell_window(void)
|
||||
hUser32 = GetModuleHandleA("user32");
|
||||
|
||||
SetShellWindow = (void *)GetProcAddress(hUser32, "SetShellWindow");
|
||||
SetShellWindowEx = (void *)GetProcAddress(hUser32, "SetShellWindowEx");
|
||||
|
||||
trace("previous shell window: %p\n", shellWindow);
|
||||
|
||||
@@ -2181,7 +2179,7 @@ static void check_z_order_debug(HWND hwnd, HWND next, HWND prev, HWND owner,
|
||||
hwnd, topmost ? "" : "NOT ");
|
||||
}
|
||||
|
||||
static void test_popup_zorder(HWND hwnd_D, HWND hwnd_E)
|
||||
static void test_popup_zorder(HWND hwnd_D, HWND hwnd_E, DWORD style)
|
||||
{
|
||||
HWND hwnd_A, hwnd_B, hwnd_C, hwnd_F;
|
||||
|
||||
@@ -2205,7 +2203,7 @@ static void test_popup_zorder(HWND hwnd_D, HWND hwnd_E)
|
||||
check_z_order(hwnd_D, hwnd_E, 0, 0, FALSE);
|
||||
|
||||
hwnd_C = CreateWindowEx(0, "MainWindowClass", NULL,
|
||||
WS_POPUP,
|
||||
style,
|
||||
100, 100, 100, 100,
|
||||
hwnd_F, 0, GetModuleHandle(0), NULL);
|
||||
trace("hwnd_C %p\n", hwnd_C);
|
||||
@@ -2215,7 +2213,7 @@ static void test_popup_zorder(HWND hwnd_D, HWND hwnd_E)
|
||||
check_z_order(hwnd_C, hwnd_D, 0, hwnd_F, FALSE);
|
||||
|
||||
hwnd_B = CreateWindowEx(WS_EX_TOPMOST, "MainWindowClass", NULL,
|
||||
WS_POPUP,
|
||||
style,
|
||||
100, 100, 100, 100,
|
||||
hwnd_F, 0, GetModuleHandle(0), NULL);
|
||||
trace("hwnd_B %p\n", hwnd_B);
|
||||
@@ -2226,7 +2224,7 @@ static void test_popup_zorder(HWND hwnd_D, HWND hwnd_E)
|
||||
check_z_order(hwnd_B, hwnd_C, 0, hwnd_F, TRUE);
|
||||
|
||||
hwnd_A = CreateWindowEx(WS_EX_TOPMOST, "MainWindowClass", NULL,
|
||||
WS_POPUP,
|
||||
style,
|
||||
100, 100, 100, 100,
|
||||
0, 0, GetModuleHandle(0), NULL);
|
||||
trace("hwnd_A %p\n", hwnd_A);
|
||||
@@ -2262,7 +2260,7 @@ static void test_popup_zorder(HWND hwnd_D, HWND hwnd_E)
|
||||
/* make hwnd_C owned by a topmost window */
|
||||
DestroyWindow( hwnd_C );
|
||||
hwnd_C = CreateWindowEx(0, "MainWindowClass", NULL,
|
||||
WS_POPUP,
|
||||
style,
|
||||
100, 100, 100, 100,
|
||||
hwnd_A, 0, GetModuleHandle(0), NULL);
|
||||
trace("hwnd_C %p\n", hwnd_C);
|
||||
@@ -3215,10 +3213,12 @@ static void test_validatergn(HWND hwnd)
|
||||
GetWindowRect( child, &rc);
|
||||
MapWindowPoints( NULL, hwnd, (POINT*) &rc, 2);
|
||||
ret = GetUpdateRect( child, &rc2, 0);
|
||||
ok( ret == 1, "Expected GetUpdateRect to return non-zero, got %d\n", ret);
|
||||
ok( rc2.right > rc2.left && rc2.bottom > rc2.top,
|
||||
"Update rectangle is empty!\n");
|
||||
ValidateRect( hwnd, &rc);
|
||||
ret = GetUpdateRect( child, &rc2, 0);
|
||||
ok( !ret, "Expected GetUpdateRect to return zero, got %d\n", ret);
|
||||
ok( rc2.left == 0 && rc2.top == 0 && rc2.right == 0 && rc2.bottom == 0,
|
||||
"Update rectangle %d,%d-%d,%d is not empty!\n", rc2.left, rc2.top,
|
||||
rc2.right, rc2.bottom);
|
||||
@@ -3230,6 +3230,7 @@ static void test_validatergn(HWND hwnd)
|
||||
rgn = CreateRectRgnIndirect( &rc);
|
||||
ValidateRgn( hwnd, rgn);
|
||||
ret = GetUpdateRect( child, &rc2, 0);
|
||||
ok( !ret, "Expected GetUpdateRect to return zero, got %d\n", ret);
|
||||
ok( rc2.left == 0 && rc2.top == 0 && rc2.right == 0 && rc2.bottom == 0,
|
||||
"Update rectangle %d,%d-%d,%d is not empty!\n", rc2.left, rc2.top,
|
||||
rc2.right, rc2.bottom);
|
||||
@@ -3295,8 +3296,6 @@ static void test_SetParent(void)
|
||||
BOOL ret;
|
||||
HWND desktop = GetDesktopWindow();
|
||||
HMENU hMenu;
|
||||
/* FIXME: This detection is not correct as it also covers (all?) XP+ */
|
||||
BOOL is_win9x = GetWindowLongPtrW(desktop, GWLP_WNDPROC) == 0;
|
||||
HWND parent, child1, child2, child3, child4, sibling;
|
||||
|
||||
parent = CreateWindowExA(0, "static", NULL, WS_OVERLAPPEDWINDOW,
|
||||
@@ -3342,19 +3341,41 @@ static void test_SetParent(void)
|
||||
|
||||
if (!is_win9x) /* Win9x doesn't survive this test */
|
||||
{
|
||||
HWND ret;
|
||||
|
||||
ok(!SetParent(parent, child1), "SetParent should fail\n");
|
||||
ok(!SetParent(child2, child3), "SetParent should fail\n");
|
||||
ok(SetParent(child1, parent) != 0, "SetParent should not fail\n");
|
||||
ok(SetParent(parent, child2) != 0, "SetParent should not fail\n");
|
||||
ok(SetParent(parent, child3) != 0, "SetParent should not fail\n");
|
||||
ok(!SetParent(child2, parent), "SetParent should fail\n");
|
||||
ok(SetParent(parent, child4) != 0, "SetParent should not fail\n");
|
||||
|
||||
check_parents(parent, child4, child4, 0, 0, child4, parent);
|
||||
check_parents(child1, parent, parent, parent, 0, child4, parent);
|
||||
check_parents(child2, desktop, parent, parent, parent, child2, parent);
|
||||
check_parents(child3, child2, child2, child2, 0, child2, parent);
|
||||
check_parents(child4, desktop, child2, child2, child2, child4, parent);
|
||||
ret = SetParent(parent, child2);
|
||||
todo_wine ok( !ret || broken( ret != 0 ), "SetParent should fail\n");
|
||||
if (ret) /* nt4, win2k */
|
||||
{
|
||||
ret = SetParent(parent, child3);
|
||||
ok(ret != 0, "SetParent should not fail\n");
|
||||
ret = SetParent(child2, parent);
|
||||
ok(!ret, "SetParent should fail\n");
|
||||
ret = SetParent(parent, child4);
|
||||
ok(ret != 0, "SetParent should not fail\n");
|
||||
check_parents(parent, child4, child4, 0, 0, child4, parent);
|
||||
check_parents(child1, parent, parent, parent, 0, child4, parent);
|
||||
check_parents(child2, desktop, parent, parent, parent, child2, parent);
|
||||
check_parents(child3, child2, child2, child2, 0, child2, parent);
|
||||
check_parents(child4, desktop, child2, child2, child2, child4, parent);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = SetParent(parent, child3);
|
||||
ok(ret != 0, "SetParent should not fail\n");
|
||||
ret = SetParent(child2, parent);
|
||||
ok(!ret, "SetParent should fail\n");
|
||||
ret = SetParent(parent, child4);
|
||||
ok(!ret, "SetParent should fail\n");
|
||||
check_parents(parent, child3, child3, 0, 0, child2, parent);
|
||||
check_parents(child1, parent, parent, parent, 0, child2, parent);
|
||||
check_parents(child2, desktop, parent, parent, parent, child2, parent);
|
||||
check_parents(child3, child2, child2, child2, 0, child2, parent);
|
||||
check_parents(child4, desktop, child2, child2, child2, child4, parent);
|
||||
}
|
||||
}
|
||||
else
|
||||
skip("Win9x/WinMe crash\n");
|
||||
@@ -5169,14 +5190,14 @@ static LRESULT CALLBACK TestExposedRegion_WndProc(HWND hwnd, UINT msg, WPARAM wP
|
||||
|
||||
static void test_Expose(void)
|
||||
{
|
||||
ATOM atom;
|
||||
WNDCLASSA cls;
|
||||
HWND mw;
|
||||
|
||||
memset(&cls, 0, sizeof(WNDCLASSA));
|
||||
cls.lpfnWndProc = TestExposedRegion_WndProc;
|
||||
cls.hbrBackground = GetStockObject(WHITE_BRUSH);
|
||||
cls.lpszClassName = "TestExposeClass";
|
||||
atom = RegisterClassA(&cls);
|
||||
RegisterClassA(&cls);
|
||||
|
||||
mw = CreateWindowA("TestExposeClass", "MainWindow", WS_VISIBLE|WS_OVERLAPPEDWINDOW,
|
||||
0, 0, 200, 100, NULL, NULL, 0, NULL);
|
||||
@@ -6037,7 +6058,7 @@ START_TEST(win)
|
||||
test_capture_1();
|
||||
test_capture_2();
|
||||
test_capture_3(hwndMain, hwndMain2);
|
||||
//test_capture_4();
|
||||
test_capture_4();
|
||||
|
||||
test_CreateWindow();
|
||||
test_parent_owner();
|
||||
@@ -6053,7 +6074,8 @@ START_TEST(win)
|
||||
test_NCRedraw();
|
||||
|
||||
test_children_zorder(hwndMain);
|
||||
test_popup_zorder(hwndMain2, hwndMain);
|
||||
test_popup_zorder(hwndMain2, hwndMain, WS_POPUP);
|
||||
test_popup_zorder(hwndMain2, hwndMain, 0);
|
||||
test_keyboard_input(hwndMain);
|
||||
test_mouse_input(hwndMain);
|
||||
test_validatergn(hwndMain);
|
||||
|
||||
@@ -95,7 +95,7 @@ static void test_create_env(void)
|
||||
{ "ALLUSERSPROFILE", { 1, 1, 0, 0 } },
|
||||
{ "TEMP", { 1, 1, 0, 0 } },
|
||||
{ "TMP", { 1, 1, 0, 0 } },
|
||||
{ "CommonProgramFiles", { 1, 1, 1, 1 } },
|
||||
{ "CommonProgramFiles", { 1, 1, 0, 0 } },
|
||||
{ "ProgramFiles", { 1, 1, 0, 0 } }
|
||||
};
|
||||
static const struct profile_item htok_vars[] = {
|
||||
@@ -145,6 +145,7 @@ static void test_create_env(void)
|
||||
todo_wine expect_env(TRUE, r, common_vars[i].name);
|
||||
else
|
||||
expect_env(TRUE, r, common_vars[i].name);
|
||||
if (r) HeapFree(GetProcessHeap(), 0, st);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +165,7 @@ static void test_create_env(void)
|
||||
todo_wine expect_env(TRUE, r, common_post_nt4_vars[i].name);
|
||||
else
|
||||
expect_env(TRUE, r, common_post_nt4_vars[i].name);
|
||||
if (r) HeapFree(GetProcessHeap(), 0, st);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -178,17 +180,29 @@ static void test_create_env(void)
|
||||
todo_wine expect_env(TRUE, r, htok_vars[i].name);
|
||||
else
|
||||
expect_env(TRUE, r, htok_vars[i].name);
|
||||
if (r) HeapFree(GetProcessHeap(), 0, st);
|
||||
}
|
||||
}
|
||||
|
||||
r = get_env(env[0], "WINE_XYZZY", &st);
|
||||
expect(FALSE, r);
|
||||
|
||||
r = get_env(env[1], "WINE_XYZZY", &st);
|
||||
expect(FALSE, r);
|
||||
|
||||
r = get_env(env[2], "WINE_XYZZY", &st);
|
||||
expect(TRUE, r);
|
||||
if (r) HeapFree(GetProcessHeap(), 0, st);
|
||||
|
||||
r = get_env(env[3], "WINE_XYZZY", &st);
|
||||
expect(TRUE, r);
|
||||
if (r) HeapFree(GetProcessHeap(), 0, st);
|
||||
|
||||
for (i = 0; i < sizeof(env) / sizeof(env[0]); i++)
|
||||
{
|
||||
r = DestroyEnvironmentBlock(env[i]);
|
||||
expect(TRUE, r);
|
||||
}
|
||||
}
|
||||
|
||||
START_TEST(userenv)
|
||||
|
||||
+201
-244
@@ -31,22 +31,108 @@
|
||||
#include <windows.h>
|
||||
#include <usp10.h>
|
||||
|
||||
typedef struct _itemTest {
|
||||
char todo_flag[4];
|
||||
int iCharPos;
|
||||
int fRTL;
|
||||
int fLayoutRTL;
|
||||
int uBidiLevel;
|
||||
} itemTest;
|
||||
|
||||
static inline void _test_items_ok(LPCWSTR string, DWORD cchString,
|
||||
SCRIPT_CONTROL *Control, SCRIPT_STATE *State,
|
||||
DWORD nItems, const itemTest* items, BOOL nItemsToDo)
|
||||
{
|
||||
HRESULT hr;
|
||||
int x, outnItems;
|
||||
SCRIPT_ITEM outpItems[15];
|
||||
|
||||
hr = ScriptItemize(string, cchString, 15, Control, State, outpItems, &outnItems);
|
||||
winetest_ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
if (nItemsToDo)
|
||||
todo_wine winetest_ok(outnItems == nItems, "Wrong number of items\n");
|
||||
else
|
||||
winetest_ok(outnItems == nItems, "Wrong number of items\n");
|
||||
for (x = 0; x <= outnItems; x++)
|
||||
{
|
||||
if (items[x].todo_flag[0])
|
||||
todo_wine winetest_ok(outpItems[x].iCharPos == items[x].iCharPos, "%i:Wrong CharPos\n",x);
|
||||
else
|
||||
winetest_ok(outpItems[x].iCharPos == items[x].iCharPos, "%i:Wrong CharPos (%i)\n",x,outpItems[x].iCharPos);
|
||||
|
||||
if (items[x].todo_flag[1])
|
||||
todo_wine winetest_ok(outpItems[x].a.fRTL == items[x].fRTL, "%i:Wrong fRTL\n",x);
|
||||
else
|
||||
winetest_ok(outpItems[x].a.fRTL == items[x].fRTL, "%i:Wrong fRTL(%i)\n",x,outpItems[x].a.fRTL);
|
||||
if (items[x].todo_flag[2])
|
||||
todo_wine winetest_ok(outpItems[x].a.fLayoutRTL == items[x].fLayoutRTL, "%i:Wrong fLayoutRTL\n",x);
|
||||
else
|
||||
winetest_ok(outpItems[x].a.fLayoutRTL == items[x].fLayoutRTL, "%i:Wrong fLayoutRTL(%i)\n",x,outpItems[x].a.fLayoutRTL);
|
||||
if (items[x].todo_flag[3])
|
||||
todo_wine winetest_ok(outpItems[x].a.s.uBidiLevel == items[x].uBidiLevel, "%i:Wrong BidiLevel\n",x);
|
||||
else
|
||||
winetest_ok(outpItems[x].a.s.uBidiLevel == items[x].uBidiLevel, "%i:Wrong BidiLevel(%i)\n",x,outpItems[x].a.s.uBidiLevel);
|
||||
}
|
||||
}
|
||||
|
||||
#define test_items_ok(a,b,c,d,e,f,g) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _test_items_ok(a,b,c,d,e,f,g)
|
||||
|
||||
|
||||
static void test_ScriptItemize( void )
|
||||
{
|
||||
static const WCHAR test1[] = {'t', 'e', 's', 't',0};
|
||||
static const itemTest t11[2] = {{{0,0,0,0},0,0,0,0},{{0,0,0,0},4,0,0,0}};
|
||||
static const itemTest t12[2] = {{{0,0,0,0},0,0,0,2},{{0,0,0,0},4,0,0,0}};
|
||||
|
||||
/* Arabic, English*/
|
||||
static const WCHAR test2[] = {'1','2','3','-','5','2',0x064a,0x064f,0x0633,0x0627,0x0648,0x0650,0x064a,'7','1','.',0};
|
||||
static const itemTest t21[7] = {{{0,0,0,0},0,0,0,0},{{0,0,0,0},3,0,0,0},{{0,0,0,0},4,0,0,0},{{0,0,0,0},6,1,1,1},{{0,0,0,0},13,0,0,0},{{0,0,0,0},15,0,0,0},{{0,0,0,0},16,0,0,0}};
|
||||
static const itemTest t22[5] = {{{0,0,0,1},0,0,0,2},{{0,0,0,0},6,1,1,1},{{0,0,1,0},13,0,1,2},{{0,0,0,0},15,0,0,0},{{0,0,0,0},16,0,0,0}};
|
||||
static const itemTest t23[5] = {{{0,0,1,0},0,0,1,2},{{0,0,0,0},6,1,1,1},{{0,0,1,0},13,0,1,2},{{0,0,0,0},15,1,1,1},{{0,0,0,0},16,0,0,0}};
|
||||
|
||||
/* Thai */
|
||||
static const WCHAR test3[] =
|
||||
{0x0e04,0x0e27,0x0e32,0x0e21,0x0e1e,0x0e22,0x0e32,0x0e22,0x0e32, 0x0e21
|
||||
,0x0e2d,0x0e22,0x0e39,0x0e48,0x0e17,0x0e35,0x0e48,0x0e44,0x0e2b,0x0e19
|
||||
,0x0e04,0x0e27,0x0e32,0x0e21,0x0e2a, 0x0e33,0x0e40,0x0e23,0x0e47,0x0e08,
|
||||
0x0e2d,0x0e22,0x0e39,0x0e48,0x0e17,0x0e35,0x0e48,0x0e19,0x0e31,0x0e48,0x0e19,0};
|
||||
|
||||
static const itemTest t31[2] = {{{0,0,0,0},0,0,0,0},{{0,0,0,0},41,0,0,0}};
|
||||
static const itemTest t32[2] = {{{0,0,0,0},0,0,0,2},{{0,0,0,0},41,0,0,0}};
|
||||
|
||||
static const WCHAR test4[] = {'1','2','3','-','5','2',' ','i','s',' ','7','1','.',0};
|
||||
|
||||
static const itemTest t41[6] = {{{0,0,0,0},0,0,0,0},{{0,0,0,0},3,0,0,0},{{0,0,0,0},4,0,0,0},{{0,0,0,0},7,0,0,0},{{0,0,0,0},10,0,0,0},{{0,0,0,0},12,0,0,0}};
|
||||
static const itemTest t42[5] = {{{0,0,1,0},0,0,1,2},{{0,0,0,0},6,1,1,1},{{0,0,0,0},7,0,0,2},{{1,0,0,1},10,0,0,2},{{1,0,0,0},12,0,0,0}};
|
||||
|
||||
/* Arabic */
|
||||
static const WCHAR test5[] =
|
||||
{0x0627,0x0644,0x0635,0x0651,0x0650,0x062d,0x0629,0x064f,' ',0x062a,0x064e,
|
||||
0x0627,0x062c,0x064c,' ',0x0639,0x064e,0x0644,0x0649,' ',
|
||||
0x0631,0x064f,0x0624,0x0648,0x0633,0x0650,' ',0x0627,0x0644
|
||||
,0x0623,0x0635,0x0650,0x062d,0x0651,0x064e,0x0627,0x0621,0x0650,0};
|
||||
SCRIPT_ITEM items[10];
|
||||
static const itemTest t51[2] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},38,0,0,0}};
|
||||
|
||||
/* Hebrew */
|
||||
static const WCHAR test6[] = {0x05e9, 0x05dc, 0x05d5, 0x05dd, '.',0};
|
||||
static const itemTest t61[3] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},4,0,0,0},{{0,0,0,0},5,0,0,0}};
|
||||
static const itemTest t62[3] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},4,1,1,1},{{0,0,0,0},5,0,0,0}};
|
||||
static const WCHAR test7[] = {'p','a','r','t',' ','o','n','e',' ',0x05d7, 0x05dc, 0x05e7, ' ', 0x05e9, 0x05ea, 0x05d9, 0x05d9, 0x05dd, ' ','p','a','r','t',' ','t','h','r','e','e', 0};
|
||||
static const itemTest t71[4] = {{{0,0,0,0},0,0,0,0},{{0,0,0,0},9,1,1,1},{{0,0,0,0},19,0,0,0},{{0,0,0,0},29,0,0,0}};
|
||||
static const itemTest t72[4] = {{{0,0,0,0},0,0,0,0},{{0,0,0,0},9,1,1,1},{{0,0,0,0},18,0,0,0},{{0,0,0,0},29,0,0,0}};
|
||||
static const itemTest t73[4] = {{{0,0,0,0},0,0,0,2},{{0,0,0,0},8,1,1,1},{{0,0,0,0},19,0,0,2},{{0,0,0,0},29,0,0,0}};
|
||||
static const WCHAR test8[] = {0x0633, 0x0644, 0x0627, 0x0645,0};
|
||||
static const itemTest t81[2] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},4,0,0,0}};
|
||||
|
||||
/* Syriac (Like Arabic )*/
|
||||
static const WCHAR test9[] = {0x0710, 0x0712, 0x0712, 0x0714, '.',0};
|
||||
static const itemTest t91[3] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},4,0,0,0},{{0,0,0,0},5,0,0,0}};
|
||||
static const itemTest t92[3] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},4,1,1,1},{{0,0,0,0},5,0,0,0}};
|
||||
|
||||
static const WCHAR test10[] = {0x0717, 0x0718, 0x071a, 0x071b,0};
|
||||
static const itemTest t101[2] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},4,0,0,0}};
|
||||
|
||||
SCRIPT_ITEM items[15];
|
||||
SCRIPT_CONTROL Control;
|
||||
SCRIPT_STATE State;
|
||||
HRESULT hr;
|
||||
@@ -62,228 +148,45 @@ static void test_ScriptItemize( void )
|
||||
ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if pItems is NULL\n");
|
||||
|
||||
hr = ScriptItemize(test1, 4, 1, &Control, &State, items, NULL);
|
||||
ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if cMaxItems < 2.");
|
||||
ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if cMaxItems < 2.\n");
|
||||
|
||||
hr = ScriptItemize(test1, 0, 10, NULL, NULL, items, &nItems);
|
||||
ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if cInChars is 0\n");
|
||||
|
||||
hr = ScriptItemize(test1, 4, 10, NULL, NULL, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 1, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
test_items_ok(test1,4,NULL,NULL,1,t11,FALSE);
|
||||
test_items_ok(test2,16,NULL,NULL,6,t21,FALSE);
|
||||
test_items_ok(test3,41,NULL,NULL,1,t31,FALSE);
|
||||
test_items_ok(test4,12,NULL,NULL,5,t41,FALSE);
|
||||
test_items_ok(test5,38,NULL,NULL,1,t51,FALSE);
|
||||
test_items_ok(test6,5,NULL,NULL,2,t61,FALSE);
|
||||
test_items_ok(test7,29,NULL,NULL,3,t71,FALSE);
|
||||
test_items_ok(test8,4,NULL,NULL,1,t81,FALSE);
|
||||
test_items_ok(test9,5,NULL,NULL,2,t91,FALSE);
|
||||
test_items_ok(test10,4,NULL,NULL,1,t101,FALSE);
|
||||
|
||||
State.uBidiLevel = 0;
|
||||
hr = ScriptItemize(test1, 4, 10, &Control, &State, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 1, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
test_items_ok(test1,4,&Control,&State,1,t11,FALSE);
|
||||
test_items_ok(test2,16,&Control,&State,4,t22,FALSE);
|
||||
test_items_ok(test3,41,&Control,&State,1,t31,FALSE);
|
||||
test_items_ok(test4,12,&Control,&State,5,t41,FALSE);
|
||||
test_items_ok(test5,38,&Control,&State,1,t51,FALSE);
|
||||
test_items_ok(test6,5,&Control,&State,2,t61,FALSE);
|
||||
test_items_ok(test7,29,&Control,&State,3,t72,FALSE);
|
||||
test_items_ok(test8,4,&Control,&State,1,t81,FALSE);
|
||||
test_items_ok(test9,5,&Control,&State,2,t91,FALSE);
|
||||
test_items_ok(test10,4,&Control,&State,1,t101,FALSE);
|
||||
|
||||
State.uBidiLevel = 1;
|
||||
hr = ScriptItemize(test1, 4, 10, &Control, &State, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 1, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
todo_wine ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n");
|
||||
|
||||
hr = ScriptItemize(test2, 16, 10, NULL, NULL, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 6, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
ok(items[1].iCharPos == 3, "Wrong CharPos \n");
|
||||
ok(items[1].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[1].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[1].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
ok(items[2].iCharPos == 4, "Wrong CharPos \n");
|
||||
ok(items[2].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[2].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[2].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
ok(items[3].iCharPos == 6, "Wrong CharPos \n");
|
||||
ok(items[3].a.fRTL == 1, "Wrong fRTL\n");
|
||||
ok(items[3].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n");
|
||||
ok(items[3].a.s.uBidiLevel == 1, "Wrong BidiLevel\n");
|
||||
ok(items[4].iCharPos == 13, "Wrong CharPos \n");
|
||||
ok(items[4].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[4].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[4].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
ok(items[5].iCharPos == 15, "Wrong CharPos \n");
|
||||
ok(items[5].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[5].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[5].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
|
||||
State.uBidiLevel = 0;
|
||||
hr = ScriptItemize(test2, 16, 10, &Control, &State, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 4, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
todo_wine ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n");
|
||||
ok(items[1].iCharPos == 6, "Wrong CharPos \n");
|
||||
ok(items[1].a.fRTL == 1, "Wrong fRTL\n");
|
||||
ok(items[1].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n");
|
||||
ok(items[1].a.s.uBidiLevel == 1, "Wrong BidiLevel\n");
|
||||
ok(items[2].iCharPos == 13, "Wrong CharPos \n");
|
||||
ok(items[2].a.fRTL == 0, "Wrong fRTL\n");
|
||||
todo_wine ok(items[2].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n");
|
||||
ok(items[2].a.s.uBidiLevel == 2, "Wrong BidiLevel\n");
|
||||
ok(items[3].iCharPos == 15, "Wrong CharPos \n");
|
||||
ok(items[3].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[3].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[3].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
|
||||
State.uBidiLevel = 1;
|
||||
hr = ScriptItemize(test2, 16, 10, &Control, &State, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 4, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 0, "Wrong fRTL\n");
|
||||
todo_wine ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n");
|
||||
ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n");
|
||||
ok(items[1].iCharPos == 6, "Wrong CharPos \n");
|
||||
ok(items[1].a.fRTL == 1, "Wrong fRTL\n");
|
||||
ok(items[1].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n");
|
||||
ok(items[1].a.s.uBidiLevel == 1, "Wrong BidiLevel\n");
|
||||
ok(items[2].iCharPos == 13, "Wrong CharPos \n");
|
||||
ok(items[2].a.fRTL == 0, "Wrong fRTL\n");
|
||||
todo_wine ok(items[2].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n");
|
||||
ok(items[2].a.s.uBidiLevel == 2, "Wrong BidiLevel\n");
|
||||
ok(items[3].iCharPos == 15, "Wrong CharPos \n");
|
||||
ok(items[3].a.fRTL == 1, "Wrong fRTL\n");
|
||||
ok(items[3].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n");
|
||||
ok(items[3].a.s.uBidiLevel == 1, "Wrong BidiLevel\n");
|
||||
|
||||
hr = ScriptItemize(test3, 41, 10, NULL, NULL, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 1, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
|
||||
State.uBidiLevel = 0;
|
||||
hr = ScriptItemize(test3, 41, 10, &Control, &State, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 1, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
|
||||
State.uBidiLevel = 1;
|
||||
hr = ScriptItemize(test3, 41, 10, &Control, &State, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 1, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
todo_wine ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n");
|
||||
|
||||
hr = ScriptItemize(test4, 12, 10, NULL, NULL, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 5, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
ok(items[1].iCharPos == 3, "Wrong CharPos \n");
|
||||
ok(items[1].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[1].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[1].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
ok(items[2].iCharPos == 4, "Wrong CharPos \n");
|
||||
ok(items[2].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[2].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[2].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
ok(items[3].iCharPos == 7, "Wrong CharPos \n");
|
||||
ok(items[3].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[3].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[3].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
ok(items[4].iCharPos == 10, "Wrong CharPos \n");
|
||||
ok(items[4].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[4].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[4].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
|
||||
State.uBidiLevel = 0;
|
||||
hr = ScriptItemize(test4, 12, 10, &Control, &State, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 5, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
ok(items[1].iCharPos == 3, "Wrong CharPos \n");
|
||||
ok(items[1].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[1].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[1].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
ok(items[2].iCharPos == 4, "Wrong CharPos \n");
|
||||
ok(items[2].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[2].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[2].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
ok(items[3].iCharPos == 7, "Wrong CharPos \n");
|
||||
ok(items[3].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[3].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[3].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
ok(items[4].iCharPos == 10, "Wrong CharPos \n");
|
||||
ok(items[4].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[4].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[4].a.s.uBidiLevel == 0, "Wrong BidiLevel\n");
|
||||
|
||||
State.uBidiLevel = 1;
|
||||
hr = ScriptItemize(test4, 12, 10, &Control, &State, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
todo_wine ok(nItems == 4, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 0, "Wrong fRTL\n");
|
||||
todo_wine ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n");
|
||||
ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n");
|
||||
ok(items[1].iCharPos == 6, "Wrong CharPos \n");
|
||||
ok(items[1].a.fRTL == 1, "Wrong fRTL\n");
|
||||
ok(items[1].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n");
|
||||
ok(items[1].a.s.uBidiLevel == 1, "Wrong BidiLevel\n");
|
||||
ok(items[2].iCharPos == 7, "Wrong CharPos \n");
|
||||
ok(items[2].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[2].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
ok(items[2].a.s.uBidiLevel == 2, "Wrong BidiLevel\n");
|
||||
todo_wine ok(items[3].iCharPos == 10, "Wrong CharPos \n");
|
||||
ok(items[3].a.fRTL == 0, "Wrong fRTL\n");
|
||||
ok(items[3].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n");
|
||||
todo_wine ok(items[3].a.s.uBidiLevel == 2, "Wrong BidiLevel\n");
|
||||
|
||||
hr = ScriptItemize(test5, 38, 10, NULL, NULL, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 1, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 1, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n");
|
||||
ok(items[0].a.s.uBidiLevel == 1, "Wrong BidiLevel\n");
|
||||
|
||||
State.uBidiLevel = 0;
|
||||
hr = ScriptItemize(test5, 38, 10, &Control, &State, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 1, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 1, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n");
|
||||
ok(items[0].a.s.uBidiLevel == 1, "Wrong BidiLevel\n");
|
||||
|
||||
State.uBidiLevel = 1;
|
||||
hr = ScriptItemize(test5, 38, 10, &Control, &State, items, &nItems);
|
||||
ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr);
|
||||
ok(nItems == 1, "Wrong number of items\n");
|
||||
ok(items[0].iCharPos == 0, "Wrong CharPos \n");
|
||||
ok(items[0].a.fRTL == 1, "Wrong fRTL\n");
|
||||
ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n");
|
||||
ok(items[0].a.s.uBidiLevel == 1, "Wrong BidiLevel\n");
|
||||
test_items_ok(test1,4,&Control,&State,1,t12,FALSE);
|
||||
test_items_ok(test2,16,&Control,&State,4,t23,FALSE);
|
||||
test_items_ok(test3,41,&Control,&State,1,t32,FALSE);
|
||||
test_items_ok(test4,12,&Control,&State,4,t42,TRUE);
|
||||
test_items_ok(test5,38,&Control,&State,1,t51,FALSE);
|
||||
test_items_ok(test6,5,&Control,&State,2,t62,FALSE);
|
||||
test_items_ok(test7,29,&Control,&State,3,t73,FALSE);
|
||||
test_items_ok(test8,4,&Control,&State,1,t81,FALSE);
|
||||
test_items_ok(test9,5,&Control,&State,2,t92,FALSE);
|
||||
test_items_ok(test10,4,&Control,&State,1,t101,FALSE);
|
||||
}
|
||||
|
||||
|
||||
@@ -359,8 +262,8 @@ static void test_ScriptShape(HDC hdc)
|
||||
hr = ScriptShape(hdc, &sc, test2, 4, 4, &items[0].a, glyphs2, logclust, attrs, &nb);
|
||||
ok(hr == S_OK, "ScriptShape should return S_OK not %08x\n", hr);
|
||||
ok(nb == 4, "Wrong number of items\n");
|
||||
ok(glyphs2[0] == 0, "Incorrect glyph for 0x202B\n");
|
||||
ok(glyphs2[3] == 0, "Incorrect glyph for 0x202C\n");
|
||||
ok(glyphs2[0] == 0 || broken(glyphs2[0] == 0x80), "Incorrect glyph for 0x202B\n");
|
||||
ok(glyphs2[3] == 0 || broken(glyphs2[3] == 0x80), "Incorrect glyph for 0x202C\n");
|
||||
ok(logclust[0] == 0, "clusters out of order\n");
|
||||
ok(logclust[1] == 1, "clusters out of order\n");
|
||||
ok(logclust[2] == 2, "clusters out of order\n");
|
||||
@@ -479,9 +382,10 @@ static void test_ScriptItemIzeShapePlace(HDC hdc, unsigned short pwOutGlyphs[256
|
||||
int pcItems;
|
||||
WCHAR TestItem1[] = {'T', 'e', 's', 't', 'a', 0};
|
||||
WCHAR TestItem2[] = {'T', 'e', 's', 't', 'b', 0};
|
||||
WCHAR TestItem3[] = {'T', 'e', 's', 't', 'c',' ','1','2','3',' ',' ','e','n','d',0};
|
||||
WCHAR TestItem4[] = {'T', 'e', 's', 't', 'c',' ',0x0684,0x0694,0x06a4,' ',' ','e','n','d',0};
|
||||
WCHAR TestItem5[] = {0x0684,'T','e','s','t','c',' ',0x0684,0x0694,0x06a4,' ',' ','e','n','d',0};
|
||||
WCHAR TestItem3[] = {'T', 'e', 's', 't', 'c',' ','1','2','3',' ',' ','e','n','d',0};
|
||||
WCHAR TestItem4[] = {'T', 'e', 's', 't', 'd',' ',0x0684,0x0694,0x06a4,' ',' ','\r','\n','e','n','d',0};
|
||||
WCHAR TestItem5[] = {0x0684,'T','e','s','t','e',' ',0x0684,0x0694,0x06a4,' ',' ','e','n','d',0};
|
||||
WCHAR TestItem6[] = {'T', 'e', 's', 't', 'f',' ',' ',' ','\r','\n','e','n','d',0};
|
||||
|
||||
SCRIPT_CACHE psc;
|
||||
int cChars;
|
||||
@@ -501,7 +405,7 @@ static void test_ScriptItemIzeShapePlace(HDC hdc, unsigned short pwOutGlyphs[256
|
||||
* by checking a known value in the table */
|
||||
hr = ScriptGetProperties(&ppSp, &iMaxProps);
|
||||
trace("number of script properties %d\n", iMaxProps);
|
||||
ok (iMaxProps > 0, "Number of scripts returned should not be 0\n");
|
||||
ok (iMaxProps > 0, "Number of scripts returned should not be 0\n");
|
||||
if (iMaxProps > 0)
|
||||
ok( ppSp[5]->langid == 9, "Langid[5] not = to 9\n"); /* Check a known value to ensure */
|
||||
/* ptrs work */
|
||||
@@ -563,7 +467,7 @@ static void test_ScriptItemIzeShapePlace(HDC hdc, unsigned short pwOutGlyphs[256
|
||||
cMaxItems = 255;
|
||||
hr = ScriptItemize(TestItem2, cInChars, cMaxItems, NULL, NULL, pItem, &pcItems);
|
||||
ok (hr == 0, "ScriptItemize should return 0, returned %08x\n", hr);
|
||||
/* This test is for the interim operation of ScriptItemize where only one SCRIPT_ITEM is *
|
||||
/* This test is for the interim operation of ScriptItemize where only one SCRIPT_ITEM is *
|
||||
* returned. */
|
||||
ok (pItem[0].iCharPos == 0 && pItem[1].iCharPos == cInChars,
|
||||
"Start pos not = 0 (%d) or end pos not = %d (%d)\n",
|
||||
@@ -614,43 +518,62 @@ static void test_ScriptItemIzeShapePlace(HDC hdc, unsigned short pwOutGlyphs[256
|
||||
"Start pos [2] not = 11 (%d) or end [3] pos not = 14 (%d), cInChars = %d\n",
|
||||
pItem[2].iCharPos, pItem[3].iCharPos, cInChars);
|
||||
}
|
||||
hr = ScriptFreeCache( &psc);
|
||||
ok (!psc, "psc is not null after ScriptFreeCache\n");
|
||||
}
|
||||
|
||||
/* This is a valid test that will cause parsing to take place and create 3 script_items */
|
||||
/* This is a valid test that will cause parsing to take place and create 5 script_items */
|
||||
cInChars = (sizeof(TestItem4)/2)-1;
|
||||
cMaxItems = 255;
|
||||
hr = ScriptItemize(TestItem4, cInChars, cMaxItems, NULL, NULL, pItem, &pcItems);
|
||||
ok (hr == 0, "ScriptItemize should return 0, returned %08x\n", hr);
|
||||
if (hr == 0)
|
||||
{
|
||||
ok (pcItems == 3, "The number of SCRIPT_ITEMS should be 3 not %d\n", pcItems);
|
||||
if (pcItems > 2)
|
||||
ok (pcItems == 5, "The number of SCRIPT_ITEMS should be 5 not %d\n", pcItems);
|
||||
if (pcItems > 4)
|
||||
{
|
||||
ok (pItem[0].iCharPos == 0 && pItem[1].iCharPos == 6,
|
||||
"Start pos [0] not = 0 (%d) or end pos [1] not = %d\n",
|
||||
pItem[0].iCharPos, pItem[1].iCharPos);
|
||||
ok (pItem[0].a.s.uBidiLevel == 0, "Should have been bidi=0 not %d\n",
|
||||
pItem[0].a.s.uBidiLevel);
|
||||
ok (pItem[1].iCharPos == 6 && pItem[2].iCharPos == 11,
|
||||
"Start pos [1] not = 6 (%d) or end pos [2] not = 11 (%d)\n",
|
||||
pItem[1].iCharPos, pItem[2].iCharPos);
|
||||
ok (pItem[2].iCharPos == 11 && pItem[3].iCharPos == cInChars,
|
||||
"Start pos [2] not = 11 (%d) or end [3] pos not = 14 (%d), cInChars = %d\n",
|
||||
pItem[2].iCharPos, pItem[3].iCharPos, cInChars);
|
||||
ok (pItem[1].a.s.uBidiLevel == 1, "Should have been bidi=1 not %d\n",
|
||||
pItem[1].a.s.uBidiLevel);
|
||||
ok (pItem[2].iCharPos == 11 && pItem[3].iCharPos == 12,
|
||||
"Start pos [2] not = 11 (%d) or end [3] pos not = 12 (%d)\n",
|
||||
pItem[2].iCharPos, pItem[3].iCharPos);
|
||||
ok (pItem[2].a.s.uBidiLevel == 0, "Should have been bidi=0 not %d\n",
|
||||
pItem[2].a.s.uBidiLevel);
|
||||
ok (pItem[3].iCharPos == 12 && pItem[4].iCharPos == 13,
|
||||
"Start pos [3] not = 12 (%d) or end [4] pos not = 13 (%d)\n",
|
||||
pItem[3].iCharPos, pItem[4].iCharPos);
|
||||
ok (pItem[3].a.s.uBidiLevel == 0, "Should have been bidi=0 not %d\n",
|
||||
pItem[3].a.s.uBidiLevel);
|
||||
ok (pItem[4].iCharPos == 13 && pItem[5].iCharPos == cInChars,
|
||||
"Start pos [4] not = 13 (%d) or end [5] pos not = 16 (%d), cInChars = %d\n",
|
||||
pItem[4].iCharPos, pItem[5].iCharPos, cInChars);
|
||||
}
|
||||
hr = ScriptFreeCache( &psc);
|
||||
ok (!psc, "psc is not null after ScriptFreeCache\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* This test is for when the first unicode character requires bidi support
|
||||
*/
|
||||
*/
|
||||
cInChars = (sizeof(TestItem5)-1)/sizeof(WCHAR);
|
||||
hr = ScriptItemize(TestItem5, cInChars, cMaxItems, NULL, NULL, pItem, &pcItems);
|
||||
ok (hr == 0, "ScriptItemize should return 0, returned %08x\n", hr);
|
||||
ok (pcItems == 4, "There should have been 4 items, found %d\n", pcItems);
|
||||
ok (pItem[0].a.s.uBidiLevel == 1, "The first character should have been bidi=1 not %d\n",
|
||||
ok (pItem[0].a.s.uBidiLevel == 1, "The first character should have been bidi=1 not %d\n",
|
||||
pItem[0].a.s.uBidiLevel);
|
||||
|
||||
/* This test checks to make sure that the test to see if there are sufficient buffers to store *
|
||||
* the pointer to the last char works. Note that windows often needs a greater number of *
|
||||
* SCRIPT_ITEMS to process a string than is returned in pcItems. */
|
||||
cInChars = (sizeof(TestItem6)/2)-1;
|
||||
cMaxItems = 4;
|
||||
hr = ScriptItemize(TestItem6, cInChars, cMaxItems, NULL, NULL, pItem, &pcItems);
|
||||
ok (hr == E_OUTOFMEMORY, "ScriptItemize should return E_OUTOFMEMORY, returned %08x\n", hr);
|
||||
|
||||
}
|
||||
|
||||
static void test_ScriptGetCMap(HDC hdc, unsigned short pwOutGlyphs[256])
|
||||
@@ -659,11 +582,16 @@ static void test_ScriptGetCMap(HDC hdc, unsigned short pwOutGlyphs[256])
|
||||
SCRIPT_CACHE psc = NULL;
|
||||
int cInChars;
|
||||
int cChars;
|
||||
unsigned short pwOutGlyphs2[256];
|
||||
unsigned short pwOutGlyphs3[256];
|
||||
WCHAR TestItem1[] = {'T', 'e', 's', 't', 'a', 0};
|
||||
DWORD dwFlags;
|
||||
int cnt;
|
||||
|
||||
static const WCHAR TestItem1[] = {'T', 'e', 's', 't', 'a', 0};
|
||||
static const WCHAR TestItem2[] = {0x202B, 'i', 'n', 0x202C,0};
|
||||
static const WCHAR TestItem3[] = {'a','b','c','d','(','<','{','[',0x2039,0};
|
||||
static const WCHAR TestItem3b[] = {'a','b','c','d',')','>','}',']',0x203A,0};
|
||||
|
||||
/* Check to make sure that SCRIPT_CACHE gets allocated ok */
|
||||
dwFlags = 0;
|
||||
cInChars = cChars = 5;
|
||||
@@ -704,10 +632,40 @@ static void test_ScriptGetCMap(HDC hdc, unsigned short pwOutGlyphs[256])
|
||||
for (cnt=0; cnt < cChars && pwOutGlyphs[cnt] == pwOutGlyphs3[cnt]; cnt++) {}
|
||||
ok (cnt == cInChars, "Translation not correct. WCHAR %d - %04x != %04x\n",
|
||||
cnt, pwOutGlyphs[cnt], pwOutGlyphs3[cnt]);
|
||||
|
||||
|
||||
hr = ScriptFreeCache( &psc);
|
||||
ok (!psc, "psc is not null after ScriptFreeCache\n");
|
||||
|
||||
cInChars = cChars = 4;
|
||||
hr = ScriptGetCMap(hdc, &psc, TestItem2, cInChars, dwFlags, pwOutGlyphs3);
|
||||
ok (hr == S_FALSE, "ScriptGetCMap should return S_FALSE not (%08x)\n", hr);
|
||||
ok (psc != NULL, "psc should not be null and have SCRIPT_CACHE buffer address\n");
|
||||
ok(pwOutGlyphs3[0] == 0 || broken(pwOutGlyphs3[0] == 0x80), "Glyph 0 should be default glyph\n");
|
||||
ok(pwOutGlyphs3[3] == 0 || broken(pwOutGlyphs3[0] == 0x80), "Glyph 0 should be default glyph\n");
|
||||
|
||||
|
||||
cInChars = cChars = 9;
|
||||
hr = ScriptGetCMap(hdc, &psc, TestItem3b, cInChars, dwFlags, pwOutGlyphs2);
|
||||
ok (hr == S_OK, "ScriptGetCMap should return S_OK not (%08x)\n", hr);
|
||||
ok (psc != NULL, "psc should not be null and have SCRIPT_CACHE buffer address\n");
|
||||
|
||||
cInChars = cChars = 9;
|
||||
dwFlags = SGCM_RTL;
|
||||
hr = ScriptGetCMap(hdc, &psc, TestItem3, cInChars, dwFlags, pwOutGlyphs3);
|
||||
ok (hr == S_OK, "ScriptGetCMap should return S_OK not (%08x)\n", hr);
|
||||
ok (psc != NULL, "psc should not be null and have SCRIPT_CACHE buffer address\n");
|
||||
ok(pwOutGlyphs3[0] == pwOutGlyphs2[0], "glyph incorrectly altered\n");
|
||||
ok(pwOutGlyphs3[1] == pwOutGlyphs2[1], "glyph incorreclty altered\n");
|
||||
ok(pwOutGlyphs3[2] == pwOutGlyphs2[2], "glyph incorreclty altered\n");
|
||||
ok(pwOutGlyphs3[3] == pwOutGlyphs2[3], "glyph incorreclty altered\n");
|
||||
ok(pwOutGlyphs3[4] == pwOutGlyphs2[4], "glyph not mirrored correctly\n");
|
||||
ok(pwOutGlyphs3[5] == pwOutGlyphs2[5], "glyph not mirrored correctly\n");
|
||||
ok(pwOutGlyphs3[6] == pwOutGlyphs2[6], "glyph not mirrored correctly\n");
|
||||
ok(pwOutGlyphs3[7] == pwOutGlyphs2[7], "glyph not mirrored correctly\n");
|
||||
ok(pwOutGlyphs3[8] == pwOutGlyphs2[8], "glyph not mirrored correctly\n");
|
||||
|
||||
hr = ScriptFreeCache( &psc);
|
||||
ok (!psc, "psc is not null after ScriptFreeCache\n");
|
||||
}
|
||||
|
||||
static void test_ScriptGetFontProperties(HDC hdc)
|
||||
@@ -1285,7 +1243,7 @@ static void test_ScriptStringXtoCP_CPtoX(HDC hdc)
|
||||
*/
|
||||
|
||||
HRESULT hr;
|
||||
WCHAR teststr1[] = {'T', 'e', 's', 't', 'e', '1', '2', ' ', 'a', '\0'};
|
||||
WCHAR teststr1[] = {'T', 'e', 's', 't', 'e', 'a', 'b', ' ', 'a', '\0'};
|
||||
void *String = (WCHAR *) &teststr1; /* ScriptStringAnalysis needs void */
|
||||
int String_len = (sizeof(teststr1)/sizeof(WCHAR))-1;
|
||||
int Glyphs = String_len * 2 + 16; /* size of buffer as recommended */
|
||||
@@ -1308,6 +1266,10 @@ static void test_ScriptStringXtoCP_CPtoX(HDC hdc)
|
||||
* Here we generate an SCRIPT_STRING_ANALYSIS that will be used as input to the
|
||||
* following character positions to X and X to character position functions.
|
||||
*/
|
||||
memset(&Control, 0, sizeof(SCRIPT_CONTROL));
|
||||
memset(&State, 0, sizeof(SCRIPT_STATE));
|
||||
memset(&Tabdef, 0, sizeof(SCRIPT_TABDEF));
|
||||
|
||||
hr = ScriptStringAnalyse( hdc, String, String_len, Glyphs, Charset, Flags,
|
||||
ReqWidth, &Control, &State, NULL, &Tabdef,
|
||||
&InClass, &ssa);
|
||||
@@ -1426,13 +1388,7 @@ static void test_ScriptStringXtoCP_CPtoX(HDC hdc)
|
||||
hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X);
|
||||
ok(hr == E_INVALIDARG, "ScriptStringCPtoX should return E_INVALIDARG not %08x\n", hr);
|
||||
|
||||
hr = ScriptStringFree(&ssa);
|
||||
/*
|
||||
* ScriptStringCPtoX should free ssa, hence ScriptStringFree should fail
|
||||
*/
|
||||
ok(hr == E_INVALIDARG ||
|
||||
hr == E_FAIL, /* win2k3 */
|
||||
"ScriptStringFree should return E_INVALIDARG or E_FAIL not %08x\n", hr);
|
||||
ScriptStringFree(&ssa);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1772,6 +1728,7 @@ START_TEST(usp10)
|
||||
lf.lfWidth = 10;
|
||||
|
||||
hfont = SelectObject(hdc, CreateFontIndirectA(&lf));
|
||||
ok(hfont != NULL, "SelectObject failed: %p\n", hfont);
|
||||
|
||||
test_ScriptItemize();
|
||||
test_ScriptItemIzeShapePlace(hdc,pwOutGlyphs);
|
||||
|
||||
@@ -88,7 +88,10 @@ static void CALLBACK check_notification( HINTERNET handle, DWORD_PTR context, DW
|
||||
}
|
||||
}
|
||||
if (status_ok) info->index++;
|
||||
if (status & WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS) SetEvent( info->wait );
|
||||
if (status & (WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS | WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING))
|
||||
{
|
||||
SetEvent( info->wait );
|
||||
}
|
||||
}
|
||||
|
||||
static const struct notification cache_test[] =
|
||||
@@ -103,11 +106,11 @@ static const struct notification cache_test[] =
|
||||
{ winhttp_send_request, WINHTTP_CALLBACK_STATUS_REQUEST_SENT, 0 },
|
||||
{ winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE, 0 },
|
||||
{ winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED, 0 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION, 0 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED, 0 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 0 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 }
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION, 0, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED, 0, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 0, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1, 1 }
|
||||
};
|
||||
|
||||
static void setup_test( struct info *info, enum api function, unsigned int line )
|
||||
@@ -227,11 +230,11 @@ static const struct notification redirect_test[] =
|
||||
{ winhttp_receive_response, WINHTTP_CALLBACK_STATUS_REQUEST_SENT, 0 },
|
||||
{ winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE, 0 },
|
||||
{ winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED, 0 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION, 0 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED, 0 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 0 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 }
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION, 0, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED, 0, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 0, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1, 1 }
|
||||
};
|
||||
|
||||
static void test_redirect( void )
|
||||
@@ -309,11 +312,11 @@ static const struct notification async_test[] =
|
||||
{ winhttp_read_data, WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE, 0, 1 },
|
||||
{ winhttp_read_data, WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED, 0, 1 },
|
||||
{ winhttp_read_data, WINHTTP_CALLBACK_STATUS_READ_COMPLETE, 0, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION, 0 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED, 0 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 0 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 }
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION, 0, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED, 0, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 0, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1, 1 },
|
||||
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1, 1 }
|
||||
};
|
||||
|
||||
static void test_async( void )
|
||||
@@ -380,6 +383,8 @@ static void test_async( void )
|
||||
WinHttpCloseHandle( req );
|
||||
WinHttpCloseHandle( con );
|
||||
WinHttpCloseHandle( ses );
|
||||
|
||||
WaitForSingleObject( info.wait, INFINITE );
|
||||
CloseHandle( info.wait );
|
||||
}
|
||||
|
||||
|
||||
@@ -25,8 +25,6 @@
|
||||
|
||||
#include "wine/test.h"
|
||||
|
||||
#define ICU_ESCAPE 0x80000000
|
||||
|
||||
static WCHAR empty[] = {0};
|
||||
static WCHAR ftp[] = {'f','t','p',0};
|
||||
static WCHAR http[] = {'h','t','t','p',0};
|
||||
@@ -67,6 +65,8 @@ static const WCHAR url10[] =
|
||||
static const WCHAR url11[] =
|
||||
{'h','t','t','p','s',':','/','/','u','s','e','r','n','a','m','e',':','p','a','s','s','w','o','r','d',
|
||||
'@','w','w','w','.','w','i','n','e','h','q','.','o','r','g',':','4','4','3','/','s','i','t','e','/','a','b','o','u','t','?','q','u','e','r','y',0};
|
||||
static const WCHAR url12[] =
|
||||
{'h','t','t','p',':','/','/','e','x','a','m','p','l','e','.','n','e','t','/','p','a','t','h','?','v','a','r','1','=','e','x','a','m','p','l','e','@','e','x','a','m','p','l','e','.','c','o','m','&','v','a','r','2','=','x','&','v','a','r','3','=','y', 0};
|
||||
|
||||
|
||||
|
||||
@@ -92,13 +92,6 @@ static const WCHAR url_k9[] =
|
||||
static const WCHAR url_k10[] =
|
||||
{'h','t','t','p',':','/','/','w','i','n','e','h','q','/','p','o','s','t',';','a',0};
|
||||
|
||||
static const char *debugstr_w(LPCWSTR str)
|
||||
{
|
||||
static char buf[1024];
|
||||
WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL);
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void fill_url_components( URL_COMPONENTS *uc )
|
||||
{
|
||||
uc->dwStructSize = sizeof(URL_COMPONENTS);
|
||||
@@ -153,16 +146,18 @@ static void WinHttpCreateUrl_test( void )
|
||||
SetLastError( 0xdeadbeef );
|
||||
ret = WinHttpCreateUrl( &uc, 0, NULL, &len );
|
||||
ok( !ret, "expected failure\n" );
|
||||
ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER got %u\n", GetLastError() );
|
||||
ok( len == 57, "expected len 57 got %u\n", len );
|
||||
ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
|
||||
GetLastError() == ERROR_INVALID_PARAMETER,
|
||||
"expected ERROR_INSUFFICIENT_BUFFER or ERROR_INVALID_PARAMETER got %u\n", GetLastError() );
|
||||
|
||||
/* correct size, NULL url */
|
||||
fill_url_components( &uc );
|
||||
SetLastError( 0xdeadbeef );
|
||||
ret = WinHttpCreateUrl( &uc, 0, NULL, &len );
|
||||
ok( !ret, "expected failure\n" );
|
||||
ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER got %u\n", GetLastError() );
|
||||
ok( len == 57, "expected len 57 got %u\n", len );
|
||||
ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
|
||||
GetLastError() == ERROR_INVALID_PARAMETER,
|
||||
"expected ERROR_INSUFFICIENT_BUFFER or ERROR_INVALID_PARAMETER got %u\n", GetLastError() );
|
||||
|
||||
/* valid components, allocated url, short length */
|
||||
SetLastError( 0xdeadbeef );
|
||||
@@ -324,7 +319,7 @@ static void reset_url_components( URL_COMPONENTS *uc )
|
||||
static void WinHttpCrackUrl_test( void )
|
||||
{
|
||||
URL_COMPONENTSW uc;
|
||||
WCHAR scheme[20], user[20], pass[20], host[20], path[40], extra[20];
|
||||
WCHAR scheme[20], user[20], pass[20], host[20], path[80], extra[40];
|
||||
DWORD error;
|
||||
BOOL ret;
|
||||
|
||||
@@ -508,17 +503,17 @@ static void WinHttpCrackUrl_test( void )
|
||||
uc.dwHostNameLength = 20;
|
||||
uc.nPort = 0;
|
||||
uc.lpszUrlPath = path;
|
||||
uc.dwUrlPathLength = 40;
|
||||
uc.dwUrlPathLength = 80;
|
||||
uc.lpszExtraInfo = extra;
|
||||
uc.dwExtraInfoLength = 20;
|
||||
uc.dwExtraInfoLength = 40;
|
||||
path[0] = 0;
|
||||
|
||||
ret = WinHttpCrackUrl( url8, 0, ICU_DECODE, &uc );
|
||||
ok( ret, "WinHttpCrackUrl failed\n" );
|
||||
ok( ret, "WinHttpCrackUrl failed %u\n", GetLastError() );
|
||||
ok( !memcmp( uc.lpszUrlPath + 11, escape, 21 * sizeof(WCHAR) ), "unexpected path\n" );
|
||||
ok( uc.dwUrlPathLength == 32, "unexpected path length\n" );
|
||||
ok( uc.dwUrlPathLength == 32, "unexpected path length %u\n", uc.dwUrlPathLength );
|
||||
ok( !memcmp( uc.lpszExtraInfo, escape + 21, 12 * sizeof(WCHAR) ), "unexpected extra info\n" );
|
||||
ok( uc.dwExtraInfoLength == 12, "unexpected extra info length\n" );
|
||||
ok( uc.dwExtraInfoLength == 12, "unexpected extra info length %u\n", uc.dwExtraInfoLength );
|
||||
|
||||
/* Urls with specified port numbers */
|
||||
/* decoding with buffers */
|
||||
@@ -539,7 +534,7 @@ static void WinHttpCrackUrl_test( void )
|
||||
|
||||
ret = WinHttpCrackUrl( url7, 0, 0, &uc );
|
||||
ok( ret, "WinHttpCrackUrl failed\n" );
|
||||
ok( !memcmp( uc.lpszHostName, winehq, sizeof(winehq) ), "unexpected host name: %s\n", debugstr_w(uc.lpszHostName) );
|
||||
ok( !memcmp( uc.lpszHostName, winehq, sizeof(winehq) ), "unexpected host name: %s\n", wine_dbgstr_w(uc.lpszHostName) );
|
||||
ok( uc.dwHostNameLength == 14, "unexpected host name length: %d\n", uc.dwHostNameLength );
|
||||
ok( uc.nPort == 42, "unexpected port: %u\n", uc.nPort );
|
||||
|
||||
@@ -572,9 +567,26 @@ static void WinHttpCrackUrl_test( void )
|
||||
error = GetLastError();
|
||||
ok( !ret, "WinHttpCrackUrl succeeded\n" );
|
||||
ok( error == ERROR_WINHTTP_UNRECOGNIZED_SCHEME, "got %u, expected ERROR_WINHTTP_UNRECOGNIZED_SCHEME\n", error );
|
||||
|
||||
reset_url_components( &uc );
|
||||
ret = WinHttpCrackUrl( url12, 0, 0, &uc);
|
||||
|
||||
ok( ret, "WinHttpCrackUrl failed\n" );
|
||||
ok( uc.nScheme == INTERNET_SCHEME_HTTP, "unexpected scheme\n" );
|
||||
ok( uc.lpszScheme == url12,"unexpected scheme\n" );
|
||||
ok( uc.dwSchemeLength == 4, "unexpected scheme length\n" );
|
||||
ok( uc.lpszUserName == NULL, "unexpected username\n" );
|
||||
ok( uc.lpszPassword == NULL, "unexpected password\n" );
|
||||
ok( uc.lpszHostName == url12 + 7, "unexpected hostname\n" );
|
||||
ok( uc.dwHostNameLength == 11, "unexpected hostname length\n" );
|
||||
ok( uc.nPort == 80, "unexpected port: %u\n", uc.nPort );
|
||||
ok( uc.lpszUrlPath == url12 + 18, "unexpected path\n" );
|
||||
ok( uc.dwUrlPathLength == 5, "unexpected path length\n" );
|
||||
ok( uc.lpszExtraInfo == url12 + 23, "unexpected extra info\n" );
|
||||
ok( uc.dwExtraInfoLength == 39, "unexpected extra info length\n" );
|
||||
}
|
||||
|
||||
START_TEST (url)
|
||||
START_TEST(url)
|
||||
{
|
||||
WinHttpCreateUrl_test();
|
||||
WinHttpCrackUrl_test();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -10,6 +10,9 @@
|
||||
<file>winhttp.c</file>
|
||||
<library>wine</library>
|
||||
<library>winhttp</library>
|
||||
<library>crypt32</library>
|
||||
<library>advapi32</library>
|
||||
<library>ws2_32</library>
|
||||
<library>ntdll</library>
|
||||
</module>
|
||||
</group>
|
||||
|
||||
@@ -2416,6 +2416,113 @@ static void test_HttpQueryInfo(int port)
|
||||
InternetCloseHandle(hi);
|
||||
}
|
||||
|
||||
static void test_options(int port)
|
||||
{
|
||||
HINTERNET ses, con, req;
|
||||
DWORD size, error;
|
||||
DWORD_PTR ctx;
|
||||
BOOL ret;
|
||||
|
||||
ses = InternetOpen("winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
|
||||
ok(ses != NULL, "InternetOpen failed\n");
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = InternetSetOption(ses, INTERNET_OPTION_CONTEXT_VALUE, NULL, 0);
|
||||
error = GetLastError();
|
||||
ok(!ret, "InternetSetOption succeeded\n");
|
||||
ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = InternetSetOption(ses, INTERNET_OPTION_CONTEXT_VALUE, NULL, sizeof(ctx));
|
||||
ok(!ret, "InternetSetOption succeeded\n");
|
||||
error = GetLastError();
|
||||
ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = InternetSetOption(ses, INTERNET_OPTION_CONTEXT_VALUE, &ctx, 0);
|
||||
ok(!ret, "InternetSetOption succeeded\n");
|
||||
error = GetLastError();
|
||||
ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
|
||||
|
||||
ctx = 1;
|
||||
ret = InternetSetOption(ses, INTERNET_OPTION_CONTEXT_VALUE, &ctx, sizeof(ctx));
|
||||
ok(ret, "InternetSetOption failed %u\n", GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = InternetQueryOption(ses, INTERNET_OPTION_CONTEXT_VALUE, NULL, NULL);
|
||||
error = GetLastError();
|
||||
ok(!ret, "InternetQueryOption succeeded\n");
|
||||
ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = InternetQueryOption(ses, INTERNET_OPTION_CONTEXT_VALUE, &ctx, NULL);
|
||||
error = GetLastError();
|
||||
ok(!ret, "InternetQueryOption succeeded\n");
|
||||
ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
|
||||
|
||||
size = 0;
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = InternetQueryOption(ses, INTERNET_OPTION_CONTEXT_VALUE, NULL, &size);
|
||||
error = GetLastError();
|
||||
ok(!ret, "InternetQueryOption succeeded\n");
|
||||
ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", error);
|
||||
|
||||
size = sizeof(ctx);
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = InternetQueryOption(NULL, INTERNET_OPTION_CONTEXT_VALUE, &ctx, &size);
|
||||
error = GetLastError();
|
||||
ok(!ret, "InternetQueryOption succeeded\n");
|
||||
ok(error == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %u\n", error);
|
||||
|
||||
ctx = 0xdeadbeef;
|
||||
size = sizeof(ctx);
|
||||
ret = InternetQueryOption(ses, INTERNET_OPTION_CONTEXT_VALUE, &ctx, &size);
|
||||
ok(ret, "InternetQueryOption failed %u\n", GetLastError());
|
||||
ok(ctx == 1, "expected 1 got %lu\n", ctx);
|
||||
|
||||
con = InternetConnect(ses, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
|
||||
ok(con != NULL, "InternetConnect failed\n");
|
||||
|
||||
ctx = 0xdeadbeef;
|
||||
size = sizeof(ctx);
|
||||
ret = InternetQueryOption(con, INTERNET_OPTION_CONTEXT_VALUE, &ctx, &size);
|
||||
ok(ret, "InternetQueryOption failed %u\n", GetLastError());
|
||||
ok(ctx == 0, "expected 0 got %lu\n", ctx);
|
||||
|
||||
ctx = 2;
|
||||
ret = InternetSetOption(con, INTERNET_OPTION_CONTEXT_VALUE, &ctx, sizeof(ctx));
|
||||
ok(ret, "InternetSetOption failed %u\n", GetLastError());
|
||||
|
||||
ctx = 0xdeadbeef;
|
||||
size = sizeof(ctx);
|
||||
ret = InternetQueryOption(con, INTERNET_OPTION_CONTEXT_VALUE, &ctx, &size);
|
||||
ok(ret, "InternetQueryOption failed %u\n", GetLastError());
|
||||
ok(ctx == 2, "expected 2 got %lu\n", ctx);
|
||||
|
||||
req = HttpOpenRequest(con, NULL, "/test1", NULL, NULL, NULL, 0, 0);
|
||||
ok(req != NULL, "HttpOpenRequest failed\n");
|
||||
|
||||
ctx = 0xdeadbeef;
|
||||
size = sizeof(ctx);
|
||||
ret = InternetQueryOption(req, INTERNET_OPTION_CONTEXT_VALUE, &ctx, &size);
|
||||
ok(ret, "InternetQueryOption failed %u\n", GetLastError());
|
||||
ok(ctx == 0, "expected 0 got %lu\n", ctx);
|
||||
|
||||
ctx = 3;
|
||||
ret = InternetSetOption(req, INTERNET_OPTION_CONTEXT_VALUE, &ctx, sizeof(ctx));
|
||||
ok(ret, "InternetSetOption failed %u\n", GetLastError());
|
||||
|
||||
ctx = 0xdeadbeef;
|
||||
size = sizeof(ctx);
|
||||
ret = InternetQueryOption(req, INTERNET_OPTION_CONTEXT_VALUE, &ctx, &size);
|
||||
ok(ret, "InternetQueryOption failed %u\n", GetLastError());
|
||||
ok(ctx == 3, "expected 3 got %lu\n", ctx);
|
||||
|
||||
InternetCloseHandle(req);
|
||||
InternetCloseHandle(con);
|
||||
InternetCloseHandle(ses);
|
||||
}
|
||||
|
||||
static void test_http_connection(void)
|
||||
{
|
||||
struct server_info si;
|
||||
@@ -2451,6 +2558,7 @@ static void test_http_connection(void)
|
||||
test_HttpQueryInfo(si.port);
|
||||
test_HttpSendRequestW(si.port);
|
||||
test_last_error(si.port);
|
||||
test_options(si.port);
|
||||
|
||||
/* send the basic request again to shutdown the server thread */
|
||||
test_basic_request(si.port, "GET", "/quit");
|
||||
|
||||
@@ -835,27 +835,75 @@ static void test_PrivacyGetSetZonePreferenceW(void)
|
||||
ok(ret == 0, "expected ret == 0, got %u\n", ret);
|
||||
}
|
||||
|
||||
static void test_Option_Policy(void)
|
||||
static void test_InternetSetOption(void)
|
||||
{
|
||||
HINTERNET hinet;
|
||||
HINTERNET ses, con, req;
|
||||
ULONG ulArg;
|
||||
DWORD size;
|
||||
BOOL ret;
|
||||
|
||||
hinet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
|
||||
ok(hinet != 0, "InternetOpen failed: 0x%08x\n", GetLastError());
|
||||
ses = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
|
||||
ok(ses != 0, "InternetOpen failed: 0x%08x\n", GetLastError());
|
||||
con = InternetConnect(ses, "www.winehq.org", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
|
||||
ok(con != 0, "InternetConnect failed: 0x%08x\n", GetLastError());
|
||||
req = HttpOpenRequest(con, "GET", "/", NULL, NULL, NULL, 0, 0);
|
||||
ok(req != 0, "HttpOpenRequest failed: 0x%08x\n", GetLastError());
|
||||
|
||||
/* INTERNET_OPTION_POLICY tests */
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = InternetSetOptionW(hinet, INTERNET_OPTION_POLICY, NULL, 0);
|
||||
ret = InternetSetOptionW(ses, INTERNET_OPTION_POLICY, NULL, 0);
|
||||
ok(ret == FALSE, "InternetSetOption should've failed\n");
|
||||
ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError should've "
|
||||
"given ERROR_INVALID_PARAMETER, gave: 0x%08x\n", GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ret = InternetQueryOptionW(hinet, INTERNET_OPTION_POLICY, NULL, 0);
|
||||
ret = InternetQueryOptionW(ses, INTERNET_OPTION_POLICY, NULL, 0);
|
||||
ok(ret == FALSE, "InternetQueryOption should've failed\n");
|
||||
ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError should've "
|
||||
"given ERROR_INVALID_PARAMETER, gave: 0x%08x\n", GetLastError());
|
||||
|
||||
ret = InternetCloseHandle(hinet);
|
||||
/* INTERNET_OPTION_ERROR_MASK tests */
|
||||
SetLastError(0xdeadbeef);
|
||||
size = sizeof(ulArg);
|
||||
ret = InternetQueryOptionW(NULL, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, &size);
|
||||
ok(ret == FALSE, "InternetQueryOption should've failed\n");
|
||||
ok(GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "GetLastError() = %x\n", GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ulArg = 11;
|
||||
ret = InternetSetOption(NULL, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, sizeof(ULONG));
|
||||
ok(ret == FALSE, "InternetQueryOption should've failed\n");
|
||||
ok(GetLastError() == ERROR_INTERNET_INCORRECT_HANDLE_TYPE, "GetLastError() = %x\n", GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ulArg = 11;
|
||||
ret = InternetSetOption(req, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, 20);
|
||||
ok(ret == FALSE, "InternetQueryOption should've failed\n");
|
||||
ok(GetLastError() == ERROR_INTERNET_BAD_OPTION_LENGTH, "GetLastError() = %d\n", GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ulArg = 11;
|
||||
ret = InternetSetOption(req, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, sizeof(ULONG));
|
||||
ok(ret == TRUE, "InternetQueryOption should've succeeded\n");
|
||||
ok(GetLastError() == 0xdeadbeef, "GetLastError() = %d\n", GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ulArg = 4;
|
||||
ret = InternetSetOption(req, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, sizeof(ULONG));
|
||||
ok(ret == FALSE, "InternetQueryOption should've failed\n");
|
||||
ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError() = %x\n", GetLastError());
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
ulArg = 16;
|
||||
ret = InternetSetOption(req, INTERNET_OPTION_ERROR_MASK, (void*)&ulArg, sizeof(ULONG));
|
||||
ok(ret == FALSE, "InternetQueryOption should've failed\n");
|
||||
ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError() = %x\n", GetLastError());
|
||||
|
||||
ret = InternetCloseHandle(req);
|
||||
ok(ret == TRUE, "InternetCloseHandle failed: 0x%08x\n", GetLastError());
|
||||
ret = InternetCloseHandle(con);
|
||||
ok(ret == TRUE, "InternetCloseHandle failed: 0x%08x\n", GetLastError());
|
||||
ret = InternetCloseHandle(ses);
|
||||
ok(ret == TRUE, "InternetCloseHandle failed: 0x%08x\n", GetLastError());
|
||||
}
|
||||
|
||||
@@ -1097,7 +1145,6 @@ START_TEST(internet)
|
||||
test_complicated_cookie();
|
||||
test_version();
|
||||
test_null();
|
||||
test_Option_Policy();
|
||||
test_Option_PerConnectionOption();
|
||||
test_Option_PerConnectionOptionA();
|
||||
|
||||
@@ -1123,4 +1170,6 @@ START_TEST(internet)
|
||||
test_PrivacyGetSetZonePreferenceW();
|
||||
else
|
||||
win_skip("Privacy[SG]etZonePreferenceW are not available\n");
|
||||
|
||||
test_InternetSetOption();
|
||||
}
|
||||
|
||||
@@ -200,7 +200,7 @@ static void test_crack_url(const crack_url_test_t *test)
|
||||
urlw.dwUrlPathLength = 1;
|
||||
urlw.dwExtraInfoLength = 1;
|
||||
|
||||
MultiByteToWideChar(CP_ACP, 0, test->url, -1, buf, sizeof(buf));
|
||||
MultiByteToWideChar(CP_ACP, 0, test->url, -1, buf, sizeof(buf)/sizeof(buf[0]));
|
||||
b = InternetCrackUrlW(buf, lstrlenW(buf), 0, &urlw);
|
||||
if(!b && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) {
|
||||
win_skip("InternetCrackUrlW is not implemented\n");
|
||||
@@ -416,19 +416,19 @@ static void InternetCrackUrlW_test(void)
|
||||
user[0]=0;
|
||||
pwd[0]=0;
|
||||
memset(&comp, 0, sizeof comp);
|
||||
comp.dwStructSize = sizeof comp;
|
||||
comp.dwStructSize = sizeof(comp);
|
||||
comp.lpszScheme = scheme;
|
||||
comp.dwSchemeLength = sizeof scheme;
|
||||
comp.dwSchemeLength = sizeof(scheme)/sizeof(scheme[0]);
|
||||
comp.lpszHostName = host;
|
||||
comp.dwHostNameLength = sizeof host;
|
||||
comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
|
||||
comp.lpszUserName = user;
|
||||
comp.dwUserNameLength = sizeof user;
|
||||
comp.dwUserNameLength = sizeof(user)/sizeof(user[0]);
|
||||
comp.lpszPassword = pwd;
|
||||
comp.dwPasswordLength = sizeof pwd;
|
||||
comp.dwPasswordLength = sizeof(pwd)/sizeof(pwd[0]);
|
||||
comp.lpszUrlPath = urlpart;
|
||||
comp.dwUrlPathLength = sizeof urlpart;
|
||||
comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
|
||||
comp.lpszExtraInfo = extra;
|
||||
comp.dwExtraInfoLength = sizeof extra;
|
||||
comp.dwExtraInfoLength = sizeof(extra)/sizeof(extra[0]);
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
r = InternetCrackUrlW(NULL, 0, 0, &comp );
|
||||
@@ -471,9 +471,9 @@ static void InternetCrackUrlW_test(void)
|
||||
memset(&comp, 0, sizeof comp);
|
||||
comp.dwStructSize = sizeof comp;
|
||||
comp.lpszHostName = host;
|
||||
comp.dwHostNameLength = sizeof host;
|
||||
comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
|
||||
comp.lpszUrlPath = urlpart;
|
||||
comp.dwUrlPathLength = sizeof urlpart;
|
||||
comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
|
||||
|
||||
r = InternetCrackUrlW(url, 0, 0, &comp );
|
||||
ok( r, "failed to crack url\n");
|
||||
@@ -493,11 +493,11 @@ static void InternetCrackUrlW_test(void)
|
||||
memset(&comp, 0, sizeof comp);
|
||||
comp.dwStructSize = sizeof comp;
|
||||
comp.lpszHostName = host;
|
||||
comp.dwHostNameLength = sizeof host;
|
||||
comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
|
||||
comp.lpszUrlPath = urlpart;
|
||||
comp.dwUrlPathLength = sizeof urlpart;
|
||||
comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
|
||||
comp.lpszExtraInfo = NULL;
|
||||
comp.dwExtraInfoLength = sizeof extra;
|
||||
comp.dwExtraInfoLength = sizeof(extra)/sizeof(extra[0]);
|
||||
|
||||
r = InternetCrackUrlW(url, 0, 0, &comp );
|
||||
ok( r, "failed to crack url\n");
|
||||
@@ -547,17 +547,17 @@ static void InternetCrackUrlW_test(void)
|
||||
memset(&comp, 0, sizeof comp);
|
||||
comp.dwStructSize = sizeof comp;
|
||||
comp.lpszScheme = scheme;
|
||||
comp.dwSchemeLength = sizeof scheme;
|
||||
comp.dwSchemeLength = sizeof(scheme)/sizeof(scheme[0]);
|
||||
comp.lpszHostName = host;
|
||||
comp.dwHostNameLength = sizeof host;
|
||||
comp.dwHostNameLength = sizeof(host)/sizeof(host[0]);
|
||||
comp.lpszUserName = user;
|
||||
comp.dwUserNameLength = sizeof user;
|
||||
comp.dwUserNameLength = sizeof(user)/sizeof(user[0]);
|
||||
comp.lpszPassword = pwd;
|
||||
comp.dwPasswordLength = sizeof pwd;
|
||||
comp.dwPasswordLength = sizeof(pwd)/sizeof(pwd[0]);
|
||||
comp.lpszUrlPath = urlpart;
|
||||
comp.dwUrlPathLength = sizeof urlpart;
|
||||
comp.dwUrlPathLength = sizeof(urlpart)/sizeof(urlpart[0]);
|
||||
comp.lpszExtraInfo = extra;
|
||||
comp.dwExtraInfoLength = sizeof extra;
|
||||
comp.dwExtraInfoLength = sizeof(extra)/sizeof(extra[0]);
|
||||
r = InternetCrackUrlW(url3, 0, 0, &comp );
|
||||
ok( r, "InternetCrackUrlW failed unexpectedly\n");
|
||||
ok( host[0] == 'x', "host should be x.org\n");
|
||||
|
||||
@@ -233,7 +233,12 @@ static void test_context(void)
|
||||
*/
|
||||
|
||||
ret = pCryptCATAdminAcquireContext(&hca, &dummy, 0);
|
||||
ok(ret, "Expected success\n");
|
||||
ok(ret || GetLastError() == ERROR_ACCESS_DENIED, "CryptCATAdminAcquireContext failed %u\n", GetLastError());
|
||||
if (!ret && GetLastError() == ERROR_ACCESS_DENIED)
|
||||
{
|
||||
win_skip("Not running as administrator\n");
|
||||
return;
|
||||
}
|
||||
ok(hca != NULL, "Expected a context handle, got NULL\n");
|
||||
|
||||
attrs = GetFileAttributes(catroot);
|
||||
@@ -492,7 +497,12 @@ static void test_CryptCATAdminAddRemoveCatalog(void)
|
||||
CloseHandle(file);
|
||||
|
||||
ret = pCryptCATAdminAcquireContext(&hcatadmin, &dummy, 0);
|
||||
ok(ret, "CryptCATAdminAcquireContext failed %u\n", GetLastError());
|
||||
ok(ret || GetLastError() == ERROR_ACCESS_DENIED, "CryptCATAdminAcquireContext failed %u\n", GetLastError());
|
||||
if (!ret && GetLastError() == ERROR_ACCESS_DENIED)
|
||||
{
|
||||
win_skip("Not running as administrator\n");
|
||||
return;
|
||||
}
|
||||
|
||||
SetLastError(0xdeadbeef);
|
||||
hcatinfo = pCryptCATAdminAddCatalog(NULL, NULL, NULL, 0);
|
||||
@@ -1111,7 +1121,6 @@ static void test_cdf_parsing(void)
|
||||
|
||||
START_TEST(crypt)
|
||||
{
|
||||
int myARGC;
|
||||
char** myARGV;
|
||||
char sysdir[MAX_PATH];
|
||||
|
||||
@@ -1129,7 +1138,7 @@ START_TEST(crypt)
|
||||
lstrcpyA(catroot2, sysdir);
|
||||
lstrcatA(catroot2, "\\CatRoot2");
|
||||
|
||||
myARGC = winetest_get_mainargs(&myARGV);
|
||||
winetest_get_mainargs(&myARGV);
|
||||
strcpy(selfname, myARGV[0]);
|
||||
|
||||
GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
|
||||
|
||||
+1719
-102
File diff suppressed because it is too large
Load Diff
@@ -10,5 +10,6 @@
|
||||
<library>wine</library>
|
||||
<library>ws2_32</library>
|
||||
<library>ntdll</library>
|
||||
<library>user32</library>
|
||||
</module>
|
||||
</group>
|
||||
|
||||
Reference in New Issue
Block a user