2008-01-14 17:07:49 +00:00
|
|
|
/*
|
|
|
|
* Implementation of hyperlinking (hlink.dll)
|
|
|
|
*
|
|
|
|
* Copyright 2006 Mike McCormack
|
2008-04-04 16:43:16 +00:00
|
|
|
* Copyright 2007-2008 Jacek Caban for CodeWeavers
|
2008-01-14 17:07:49 +00:00
|
|
|
*
|
|
|
|
* 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
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define COBJMACROS
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
2009-01-04 11:33:07 +00:00
|
|
|
#include <initguid.h>
|
2008-01-14 17:07:49 +00:00
|
|
|
#include <hlink.h>
|
|
|
|
#include <hlguids.h>
|
|
|
|
|
|
|
|
#include "wine/test.h"
|
|
|
|
|
2008-04-04 16:43:16 +00:00
|
|
|
#define DEFINE_EXPECT(func) \
|
|
|
|
static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
|
|
|
|
|
|
|
|
#define SET_EXPECT(func) \
|
|
|
|
expect_ ## func = TRUE
|
|
|
|
|
|
|
|
#define CHECK_EXPECT2(func) \
|
|
|
|
do { \
|
|
|
|
ok(expect_ ##func, "unexpected call " #func "\n"); \
|
|
|
|
called_ ## func = TRUE; \
|
|
|
|
}while(0)
|
|
|
|
|
|
|
|
#define CHECK_EXPECT(func) \
|
|
|
|
do { \
|
|
|
|
CHECK_EXPECT2(func); \
|
|
|
|
expect_ ## func = FALSE; \
|
|
|
|
}while(0)
|
|
|
|
|
|
|
|
#define CHECK_CALLED(func) \
|
|
|
|
do { \
|
|
|
|
ok(called_ ## func, "expected " #func "\n"); \
|
|
|
|
expect_ ## func = called_ ## func = FALSE; \
|
|
|
|
}while(0)
|
|
|
|
|
|
|
|
DEFINE_EXPECT(IsSystemMoniker);
|
|
|
|
DEFINE_EXPECT(BindToStorage);
|
2013-09-19 16:12:38 +00:00
|
|
|
DEFINE_EXPECT(BindToObject);
|
2008-04-04 16:43:16 +00:00
|
|
|
DEFINE_EXPECT(GetDisplayName);
|
|
|
|
|
2012-01-27 12:14:09 +00:00
|
|
|
DEFINE_EXPECT(ComposeWith);
|
|
|
|
DEFINE_EXPECT(OnNavigationComplete);
|
|
|
|
DEFINE_EXPECT(Enum);
|
|
|
|
DEFINE_EXPECT(Reduce);
|
|
|
|
|
|
|
|
DEFINE_EXPECT(GetClassID);
|
|
|
|
DEFINE_EXPECT(Save);
|
|
|
|
|
2013-09-19 16:12:38 +00:00
|
|
|
DEFINE_EXPECT(HBC_QueryInterface_IHlinkHistory);
|
|
|
|
DEFINE_EXPECT(HBC_GetObject);
|
|
|
|
DEFINE_EXPECT(HBC_UpdateHlink);
|
|
|
|
|
|
|
|
DEFINE_EXPECT(HT_SetBrowseContext);
|
|
|
|
DEFINE_EXPECT(HT_GetBrowseContext);
|
|
|
|
DEFINE_EXPECT(HT_Navigate);
|
|
|
|
DEFINE_EXPECT(HT_GetFriendlyName);
|
|
|
|
|
|
|
|
DEFINE_EXPECT(HLF_UpdateHlink);
|
|
|
|
|
|
|
|
DEFINE_GUID(IID_IHlinkHistory,0x79eac9c8,0xbaf9,0x11ce,0x8c,0x82,0x00,0xaa,0x00,0x4b,0xa9,0x0b);
|
|
|
|
|
2008-01-14 17:07:49 +00:00
|
|
|
static void test_HlinkIsShortcut(void)
|
|
|
|
{
|
2009-12-22 11:40:11 +00:00
|
|
|
UINT i;
|
2008-01-14 17:07:49 +00:00
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
static const WCHAR file0[] = {'f','i','l','e',0};
|
|
|
|
static const WCHAR file1[] = {'f','i','l','e','.','u','r','l',0};
|
|
|
|
static const WCHAR file2[] = {'f','i','l','e','.','l','n','k',0};
|
|
|
|
static const WCHAR file3[] = {'f','i','l','e','.','u','R','l',0};
|
|
|
|
static const WCHAR file4[] = {'f','i','l','e','u','r','l',0};
|
|
|
|
static const WCHAR file5[] = {'c',':','\\','f','i','l','e','.','u','r','l',0};
|
|
|
|
static const WCHAR file6[] = {'c',':','\\','f','i','l','e','.','l','n','k',0};
|
|
|
|
static const WCHAR file7[] = {'.','u','r','l',0};
|
|
|
|
|
|
|
|
static struct {
|
|
|
|
LPCWSTR file;
|
|
|
|
HRESULT hres;
|
|
|
|
} shortcut_test[] = {
|
|
|
|
{file0, S_FALSE},
|
|
|
|
{file1, S_OK},
|
|
|
|
{file2, S_FALSE},
|
|
|
|
{file3, S_OK},
|
|
|
|
{file4, S_FALSE},
|
|
|
|
{file5, S_OK},
|
|
|
|
{file6, S_FALSE},
|
|
|
|
{file7, S_OK},
|
|
|
|
{NULL, E_INVALIDARG}
|
|
|
|
};
|
|
|
|
|
|
|
|
for(i=0; i<sizeof(shortcut_test)/sizeof(shortcut_test[0]); i++) {
|
|
|
|
hres = HlinkIsShortcut(shortcut_test[i].file);
|
|
|
|
ok(hres == shortcut_test[i].hres, "[%d] HlinkIsShortcut returned %08x, expected %08x\n",
|
|
|
|
i, hres, shortcut_test[i].hres);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void test_reference(void)
|
|
|
|
{
|
|
|
|
HRESULT r;
|
|
|
|
IHlink *lnk = NULL;
|
|
|
|
IMoniker *mk = NULL;
|
|
|
|
const WCHAR url[] = { 'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g',0 };
|
|
|
|
const WCHAR url2[] = { 'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g','/',0 };
|
|
|
|
LPWSTR str = NULL;
|
|
|
|
|
|
|
|
r = HlinkCreateFromString(url, NULL, NULL, NULL,
|
|
|
|
0, NULL, &IID_IHlink, (LPVOID*) &lnk);
|
|
|
|
ok(r == S_OK, "failed to create link\n");
|
|
|
|
if (FAILED(r))
|
|
|
|
return;
|
|
|
|
|
|
|
|
r = IHlink_GetMonikerReference(lnk, HLINKGETREF_DEFAULT, NULL, NULL);
|
|
|
|
ok(r == S_OK, "failed\n");
|
|
|
|
|
|
|
|
r = IHlink_GetMonikerReference(lnk, HLINKGETREF_DEFAULT, &mk, &str);
|
|
|
|
ok(r == S_OK, "failed\n");
|
|
|
|
ok(mk != NULL, "no moniker\n");
|
|
|
|
ok(str == NULL, "string should be null\n");
|
|
|
|
|
|
|
|
r = IMoniker_Release(mk);
|
|
|
|
ok( r == 1, "moniker refcount wrong\n");
|
|
|
|
|
|
|
|
r = IHlink_GetStringReference(lnk, -1, &str, NULL);
|
|
|
|
ok(r == S_OK, "failed\n");
|
|
|
|
CoTaskMemFree(str);
|
|
|
|
|
2010-03-06 12:27:21 +00:00
|
|
|
r = IHlink_GetStringReference(lnk, -1, NULL, NULL);
|
|
|
|
ok(r == S_OK, "failed, r=%08x\n", r);
|
|
|
|
|
|
|
|
r = IHlink_GetStringReference(lnk, -1, NULL, &str);
|
|
|
|
ok(r == S_OK, "failed, r=%08x\n", r);
|
|
|
|
ok(str == NULL, "string should be null\n");
|
|
|
|
|
2008-01-14 17:07:49 +00:00
|
|
|
r = IHlink_GetStringReference(lnk, HLINKGETREF_DEFAULT, &str, NULL);
|
|
|
|
ok(r == S_OK, "failed\n");
|
|
|
|
ok(!lstrcmpW(str, url2), "url wrong\n");
|
|
|
|
CoTaskMemFree(str);
|
|
|
|
|
|
|
|
r = IHlink_GetStringReference(lnk, HLINKGETREF_DEFAULT, NULL, NULL);
|
|
|
|
ok(r == S_OK, "failed\n");
|
|
|
|
|
|
|
|
r = IHlink_GetStringReference(lnk, HLINKGETREF_DEFAULT, NULL, &str);
|
|
|
|
ok(r == S_OK, "failed\n");
|
|
|
|
ok(str == NULL, "string should be null\n");
|
|
|
|
|
2009-01-04 11:33:07 +00:00
|
|
|
/* Unimplented functions checks */
|
|
|
|
r = IHlink_GetAdditionalParams(lnk, NULL);
|
|
|
|
ok(r == E_NOTIMPL, "failed\n");
|
|
|
|
|
|
|
|
r = IHlink_SetAdditionalParams(lnk, NULL);
|
|
|
|
ok(r == E_NOTIMPL, "failed\n");
|
|
|
|
|
2008-01-14 17:07:49 +00:00
|
|
|
IHlink_Release(lnk);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* url only */
|
|
|
|
static const unsigned char expected_hlink_data[] =
|
|
|
|
{
|
|
|
|
0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
|
|
|
|
0xe0,0xc9,0xea,0x79,0xf9,0xba,0xce,0x11,
|
|
|
|
0x8c,0x82,0x00,0xaa,0x00,0x4b,0xa9,0x0b,
|
|
|
|
0x26,0x00,0x00,0x00,0x68,0x00,0x74,0x00,
|
|
|
|
0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,
|
|
|
|
0x2f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,
|
|
|
|
0x65,0x00,0x68,0x00,0x71,0x00,0x2e,0x00,
|
|
|
|
0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,
|
|
|
|
0x00,0x00,
|
|
|
|
};
|
|
|
|
|
2009-01-04 11:33:07 +00:00
|
|
|
/* url only (IE7) */
|
|
|
|
static const unsigned char expected_hlink_data_ie7[] =
|
|
|
|
{
|
|
|
|
0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
|
|
|
|
0xe0,0xc9,0xea,0x79,0xf9,0xba,0xce,0x11,
|
|
|
|
0x8c,0x82,0x00,0xaa,0x00,0x4b,0xa9,0x0b,
|
|
|
|
0x3e,0x00,0x00,0x00,0x68,0x00,0x74,0x00,
|
|
|
|
0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,
|
|
|
|
0x2f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,
|
|
|
|
0x65,0x00,0x68,0x00,0x71,0x00,0x2e,0x00,
|
|
|
|
0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,
|
|
|
|
0x00,0x00,0x79,0x58,0x81,0xf4,0x3b,0x1d,
|
|
|
|
0x7f,0x48,0xaf,0x2c,0x82,0x5d,0xc4,0x85,
|
|
|
|
0x27,0x63,0x00,0x00,0x00,0x00,0xa5,0xab,
|
|
|
|
0x00,0x00,
|
|
|
|
};
|
|
|
|
|
2008-01-14 17:07:49 +00:00
|
|
|
/* url + friendly name */
|
|
|
|
static const unsigned char expected_hlink_data2[] =
|
|
|
|
{
|
|
|
|
0x02,0x00,0x00,0x00,0x17,0x00,0x00,0x00,
|
|
|
|
0x08,0x00,0x00,0x00,0x57,0x00,0x69,0x00,
|
|
|
|
0x6e,0x00,0x65,0x00,0x20,0x00,0x48,0x00,
|
|
|
|
0x51,0x00,0x00,0x00,0xe0,0xc9,0xea,0x79,
|
|
|
|
0xf9,0xba,0xce,0x11,0x8c,0x82,0x00,0xaa,
|
|
|
|
0x00,0x4b,0xa9,0x0b,0x26,0x00,0x00,0x00,
|
|
|
|
0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,
|
|
|
|
0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,
|
|
|
|
0x69,0x00,0x6e,0x00,0x65,0x00,0x68,0x00,
|
|
|
|
0x71,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,
|
|
|
|
0x67,0x00,0x2f,0x00,0x00,0x00,
|
|
|
|
};
|
|
|
|
|
2009-01-04 11:33:07 +00:00
|
|
|
/* url + friendly name (IE7) */
|
|
|
|
static const unsigned char expected_hlink_data2_ie7[] =
|
|
|
|
{
|
|
|
|
0x02,0x00,0x00,0x00,0x17,0x00,0x00,0x00,
|
|
|
|
0x08,0x00,0x00,0x00,0x57,0x00,0x69,0x00,
|
|
|
|
0x6e,0x00,0x65,0x00,0x20,0x00,0x48,0x00,
|
|
|
|
0x51,0x00,0x00,0x00,0xe0,0xc9,0xea,0x79,
|
|
|
|
0xf9,0xba,0xce,0x11,0x8c,0x82,0x00,0xaa,
|
|
|
|
0x00,0x4b,0xa9,0x0b,0x3e,0x00,0x00,0x00,
|
|
|
|
0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,
|
|
|
|
0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,
|
|
|
|
0x69,0x00,0x6e,0x00,0x65,0x00,0x68,0x00,
|
|
|
|
0x71,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,
|
|
|
|
0x67,0x00,0x2f,0x00,0x00,0x00,0x79,0x58,
|
|
|
|
0x81,0xf4,0x3b,0x1d,0x7f,0x48,0xaf,0x2c,
|
|
|
|
0x82,0x5d,0xc4,0x85,0x27,0x63,0x00,0x00,
|
|
|
|
0x00,0x00,0xa5,0xab,0x00,0x00,
|
|
|
|
};
|
|
|
|
|
2008-01-14 17:07:49 +00:00
|
|
|
/* url + friendly name + location */
|
|
|
|
static const unsigned char expected_hlink_data3[] =
|
|
|
|
{
|
|
|
|
0x02,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,
|
|
|
|
0x08,0x00,0x00,0x00,0x57,0x00,0x69,0x00,
|
|
|
|
0x6e,0x00,0x65,0x00,0x20,0x00,0x48,0x00,
|
|
|
|
0x51,0x00,0x00,0x00,0xe0,0xc9,0xea,0x79,
|
|
|
|
0xf9,0xba,0xce,0x11,0x8c,0x82,0x00,0xaa,
|
|
|
|
0x00,0x4b,0xa9,0x0b,0x26,0x00,0x00,0x00,
|
|
|
|
0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,
|
|
|
|
0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,
|
|
|
|
0x69,0x00,0x6e,0x00,0x65,0x00,0x68,0x00,
|
|
|
|
0x71,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,
|
|
|
|
0x67,0x00,0x2f,0x00,0x00,0x00,0x07,0x00,
|
|
|
|
0x00,0x00,0x5f,0x00,0x62,0x00,0x6c,0x00,
|
|
|
|
0x61,0x00,0x6e,0x00,0x6b,0x00,0x00,0x00,
|
|
|
|
};
|
|
|
|
|
2009-01-04 11:33:07 +00:00
|
|
|
/* url + friendly name + location (IE7) */
|
|
|
|
static const unsigned char expected_hlink_data3_ie7[] =
|
|
|
|
{
|
|
|
|
0x02,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,
|
|
|
|
0x08,0x00,0x00,0x00,0x57,0x00,0x69,0x00,
|
|
|
|
0x6e,0x00,0x65,0x00,0x20,0x00,0x48,0x00,
|
|
|
|
0x51,0x00,0x00,0x00,0xe0,0xc9,0xea,0x79,
|
|
|
|
0xf9,0xba,0xce,0x11,0x8c,0x82,0x00,0xaa,
|
|
|
|
0x00,0x4b,0xa9,0x0b,0x3e,0x00,0x00,0x00,
|
|
|
|
0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,
|
|
|
|
0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,
|
|
|
|
0x69,0x00,0x6e,0x00,0x65,0x00,0x68,0x00,
|
|
|
|
0x71,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,
|
|
|
|
0x67,0x00,0x2f,0x00,0x00,0x00,0x79,0x58,
|
|
|
|
0x81,0xf4,0x3b,0x1d,0x7f,0x48,0xaf,0x2c,
|
|
|
|
0x82,0x5d,0xc4,0x85,0x27,0x63,0x00,0x00,
|
|
|
|
0x00,0x00,0xa5,0xab,0x00,0x00,0x07,0x00,
|
|
|
|
0x00,0x00,0x5f,0x00,0x62,0x00,0x6c,0x00,
|
|
|
|
0x61,0x00,0x6e,0x00,0x6b,0x00,0x00,0x00,
|
|
|
|
};
|
|
|
|
|
2008-01-14 17:07:49 +00:00
|
|
|
/* relative url */
|
|
|
|
static const unsigned char expected_hlink_data4[] =
|
|
|
|
{
|
|
|
|
0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
|
|
|
|
0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,
|
|
|
|
0x00,0x00,0x0b,0x00,0x00,0x00,0x69,0x6e,
|
|
|
|
0x64,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,
|
|
|
|
0x00,0xff,0xff,0xad,0xde,0x00,0x00,0x00,
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
0x00,0x00,0x00,0x00,0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* url + target frame name */
|
|
|
|
static const unsigned char expected_hlink_data5[] =
|
|
|
|
{
|
|
|
|
0x02,0x00,0x00,0x00,0x83,0x00,0x00,0x00,
|
|
|
|
0x07,0x00,0x00,0x00,0x74,0x00,0x67,0x00,
|
|
|
|
0x74,0x00,0x66,0x00,0x72,0x00,0x6d,0x00,
|
|
|
|
0x00,0x00,0xe0,0xc9,0xea,0x79,0xf9,0xba,
|
|
|
|
0xce,0x11,0x8c,0x82,0x00,0xaa,0x00,0x4b,
|
|
|
|
0xa9,0x0b,0x26,0x00,0x00,0x00,0x68,0x00,
|
|
|
|
0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,
|
|
|
|
0x2f,0x00,0x2f,0x00,0x77,0x00,0x69,0x00,
|
|
|
|
0x6e,0x00,0x65,0x00,0x68,0x00,0x71,0x00,
|
|
|
|
0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,
|
|
|
|
0x2f,0x00,0x00,0x00,
|
|
|
|
};
|
|
|
|
|
2009-01-04 11:33:07 +00:00
|
|
|
/* url + target frame name (IE7) */
|
|
|
|
static const unsigned char expected_hlink_data5_ie7[] =
|
|
|
|
{
|
|
|
|
0x02,0x00,0x00,0x00,0x83,0x00,0x00,0x00,
|
|
|
|
0x07,0x00,0x00,0x00,0x74,0x00,0x67,0x00,
|
|
|
|
0x74,0x00,0x66,0x00,0x72,0x00,0x6d,0x00,
|
|
|
|
0x00,0x00,0xe0,0xc9,0xea,0x79,0xf9,0xba,
|
|
|
|
0xce,0x11,0x8c,0x82,0x00,0xaa,0x00,0x4b,
|
|
|
|
0xa9,0x0b,0x3e,0x00,0x00,0x00,0x68,0x00,
|
|
|
|
0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,
|
|
|
|
0x2f,0x00,0x2f,0x00,0x77,0x00,0x69,0x00,
|
|
|
|
0x6e,0x00,0x65,0x00,0x68,0x00,0x71,0x00,
|
|
|
|
0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,
|
|
|
|
0x2f,0x00,0x00,0x00,0x79,0x58,0x81,0xf4,
|
|
|
|
0x3b,0x1d,0x7f,0x48,0xaf,0x2c,0x82,0x5d,
|
|
|
|
0xc4,0x85,0x27,0x63,0x00,0x00,0x00,0x00,
|
|
|
|
0xa5,0xab,0x00,0x00,
|
|
|
|
};
|
|
|
|
|
2008-01-14 17:07:49 +00:00
|
|
|
/* filename */
|
|
|
|
static const unsigned char expected_hlink_data6[] =
|
|
|
|
{
|
|
|
|
0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
|
|
|
|
0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,
|
|
|
|
0x00,0x00,0x04,0x00,0x00,0x00,0x63,0x3a,
|
|
|
|
0x5c,0x00,0xff,0xff,0xad,0xde,0x00,0x00,
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
|
|
0x00,0x00,0x0c,0x00,0x00,0x00,0x06,0x00,
|
|
|
|
0x00,0x00,0x03,0x00,0x63,0x00,0x3a,0x00,
|
|
|
|
0x5c,0x00,
|
|
|
|
};
|
|
|
|
|
|
|
|
static void test_persist_save_data(const char *testname, IHlink *lnk,
|
|
|
|
const unsigned char *expected_data,
|
2009-01-04 11:33:07 +00:00
|
|
|
unsigned int expected_data_size,
|
|
|
|
const unsigned char *expected_data_alt,
|
|
|
|
unsigned int expected_data_alt_size)
|
2008-01-14 17:07:49 +00:00
|
|
|
{
|
|
|
|
HRESULT hr;
|
|
|
|
IStream *stream;
|
|
|
|
IPersistStream *ps;
|
|
|
|
HGLOBAL hglobal;
|
|
|
|
DWORD data_size;
|
|
|
|
const unsigned char *data;
|
|
|
|
DWORD i;
|
|
|
|
BOOL same;
|
|
|
|
|
|
|
|
hr = IHlink_QueryInterface(lnk, &IID_IPersistStream, (void **)&ps);
|
|
|
|
ok(hr == S_OK, "IHlink_QueryInterface failed with error 0x%08x\n", hr);
|
|
|
|
|
|
|
|
hr = CreateStreamOnHGlobal(NULL, TRUE, &stream);
|
|
|
|
ok(hr == S_OK, "CreateStreamOnHGlobal failed with error 0x%08x\n", hr);
|
|
|
|
|
|
|
|
hr = IPersistStream_Save(ps, stream, TRUE);
|
|
|
|
ok(hr == S_OK, "IPersistStream_Save failed with error 0x%08x\n", hr);
|
|
|
|
|
|
|
|
hr = GetHGlobalFromStream(stream, &hglobal);
|
|
|
|
ok(hr == S_OK, "GetHGlobalFromStream failed with error 0x%08x\n", hr);
|
|
|
|
|
|
|
|
data_size = GlobalSize(hglobal);
|
|
|
|
|
|
|
|
data = GlobalLock(hglobal);
|
|
|
|
|
|
|
|
/* first check we have the right amount of data */
|
2009-01-04 11:33:07 +00:00
|
|
|
ok((data_size == expected_data_size) ||
|
2012-01-27 12:14:09 +00:00
|
|
|
(data_size == expected_data_alt_size),
|
2009-01-04 11:33:07 +00:00
|
|
|
"%s: Size of saved data differs (expected %d or %d, actual %d)\n",
|
|
|
|
testname, expected_data_size, expected_data_alt_size, data_size);
|
2008-01-14 17:07:49 +00:00
|
|
|
|
|
|
|
same = TRUE;
|
|
|
|
/* then do a byte-by-byte comparison */
|
|
|
|
for (i = 0; i < min(data_size, expected_data_size); i++)
|
|
|
|
{
|
|
|
|
if ((expected_data[i] != data[i]) &&
|
|
|
|
(((expected_data != expected_hlink_data2) &&
|
|
|
|
(expected_data != expected_hlink_data3)) ||
|
|
|
|
((i < 52 || i >= 56) && (i < 80 || i >= 84))))
|
|
|
|
{
|
|
|
|
same = FALSE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-01-04 11:33:07 +00:00
|
|
|
if (!same && (expected_data_alt != expected_data))
|
|
|
|
{
|
|
|
|
/* then try the alternate data */
|
|
|
|
same = TRUE;
|
|
|
|
for (i = 0; i < min(data_size, expected_data_alt_size); i++)
|
|
|
|
{
|
|
|
|
if ((expected_data_alt[i] != data[i]) &&
|
|
|
|
(((expected_data_alt != expected_hlink_data2) &&
|
|
|
|
(expected_data_alt != expected_hlink_data3)) ||
|
|
|
|
((i < 52 || i >= 56) && (i < 80 || i >= 84))))
|
|
|
|
{
|
|
|
|
same = FALSE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-01-14 17:07:49 +00:00
|
|
|
ok(same, "%s: Saved data differs\n", testname);
|
|
|
|
if (!same)
|
|
|
|
{
|
|
|
|
for (i = 0; i < data_size; i++)
|
|
|
|
{
|
|
|
|
if (i % 8 == 0) printf(" ");
|
|
|
|
printf("0x%02x,", data[i]);
|
|
|
|
if (i % 8 == 7) printf("\n");
|
|
|
|
}
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
GlobalUnlock(hglobal);
|
|
|
|
|
|
|
|
IStream_Release(stream);
|
|
|
|
IPersistStream_Release(ps);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void test_persist(void)
|
|
|
|
{
|
|
|
|
static const WCHAR url[] = { 'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g',0 };
|
|
|
|
static const WCHAR rel_url[] = { 'i','n','d','e','x','.','h','t','m','l',0 };
|
|
|
|
static const WCHAR filename[] = { 'c',':','\\',0 };
|
|
|
|
static const WCHAR friendly_name[] = { 'W','i','n','e',' ','H','Q',0 };
|
|
|
|
static const WCHAR location[] = { '_','b','l','a','n','k',0 };
|
|
|
|
static const WCHAR target_frame_name[] = { 't','g','t','f','r','m',0 };
|
|
|
|
HRESULT hr;
|
|
|
|
IHlink *lnk;
|
|
|
|
|
|
|
|
hr = HlinkCreateFromString(url, NULL, NULL, NULL,
|
|
|
|
0, NULL, &IID_IHlink, (LPVOID*) &lnk);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr);
|
2008-04-04 16:43:16 +00:00
|
|
|
if (!lnk) {
|
2012-01-27 12:14:09 +00:00
|
|
|
skip("Can't create lnk, skipping test_persist.\n");
|
2008-04-04 16:43:16 +00:00
|
|
|
return;
|
|
|
|
}
|
2009-01-04 11:33:07 +00:00
|
|
|
test_persist_save_data("url only", lnk,
|
|
|
|
expected_hlink_data, sizeof(expected_hlink_data),
|
|
|
|
expected_hlink_data_ie7, sizeof(expected_hlink_data_ie7));
|
2008-01-14 17:07:49 +00:00
|
|
|
IHlink_Release(lnk);
|
|
|
|
|
|
|
|
hr = HlinkCreateFromString(url, NULL, friendly_name, NULL,
|
|
|
|
0, NULL, &IID_IHlink, (LPVOID*) &lnk);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr);
|
2009-01-04 11:33:07 +00:00
|
|
|
test_persist_save_data("url + friendly name", lnk,
|
|
|
|
expected_hlink_data2, sizeof(expected_hlink_data2),
|
|
|
|
expected_hlink_data2_ie7, sizeof(expected_hlink_data2_ie7));
|
2008-01-14 17:07:49 +00:00
|
|
|
IHlink_Release(lnk);
|
|
|
|
|
|
|
|
hr = HlinkCreateFromString(url, location, friendly_name, NULL,
|
|
|
|
0, NULL, &IID_IHlink, (LPVOID*) &lnk);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr);
|
2009-01-04 11:33:07 +00:00
|
|
|
test_persist_save_data("url + friendly_name + location", lnk,
|
|
|
|
expected_hlink_data3, sizeof(expected_hlink_data3),
|
|
|
|
expected_hlink_data3_ie7, sizeof(expected_hlink_data3_ie7));
|
2008-01-14 17:07:49 +00:00
|
|
|
IHlink_Release(lnk);
|
|
|
|
|
|
|
|
hr = HlinkCreateFromString(rel_url, NULL, NULL, NULL,
|
|
|
|
0, NULL, &IID_IHlink, (LPVOID*) &lnk);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr);
|
2009-01-04 11:33:07 +00:00
|
|
|
test_persist_save_data("relative url", lnk,
|
|
|
|
expected_hlink_data4, sizeof(expected_hlink_data4),
|
|
|
|
expected_hlink_data4, sizeof(expected_hlink_data4));
|
2008-01-14 17:07:49 +00:00
|
|
|
IHlink_Release(lnk);
|
|
|
|
|
|
|
|
hr = HlinkCreateFromString(url, NULL, NULL, NULL,
|
|
|
|
0, NULL, &IID_IHlink, (LPVOID*) &lnk);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr);
|
2008-01-14 17:07:49 +00:00
|
|
|
hr = IHlink_SetTargetFrameName(lnk, target_frame_name);
|
|
|
|
ok(hr == S_OK, "IHlink_SetTargetFrameName failed with error 0x%08x\n", hr);
|
2009-01-04 11:33:07 +00:00
|
|
|
test_persist_save_data("url + target frame name", lnk,
|
|
|
|
expected_hlink_data5, sizeof(expected_hlink_data5),
|
|
|
|
expected_hlink_data5_ie7, sizeof(expected_hlink_data5_ie7));
|
2008-01-14 17:07:49 +00:00
|
|
|
IHlink_Release(lnk);
|
|
|
|
|
|
|
|
hr = HlinkCreateFromString(filename, NULL, NULL, NULL,
|
|
|
|
0, NULL, &IID_IHlink, (LPVOID*) &lnk);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr);
|
2009-01-04 11:33:07 +00:00
|
|
|
test_persist_save_data("filename", lnk,
|
|
|
|
expected_hlink_data6, sizeof(expected_hlink_data6),
|
|
|
|
expected_hlink_data6, sizeof(expected_hlink_data6));
|
2008-01-14 17:07:49 +00:00
|
|
|
IHlink_Release(lnk);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void test_special_reference(void)
|
|
|
|
{
|
|
|
|
LPWSTR ref;
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
hres = HlinkGetSpecialReference(HLSR_HOME, &ref);
|
|
|
|
ok(hres == S_OK, "HlinkGetSpecialReference(HLSR_HOME) failed: %08x\n", hres);
|
|
|
|
ok(ref != NULL, "ref == NULL\n");
|
|
|
|
CoTaskMemFree(ref);
|
|
|
|
|
|
|
|
hres = HlinkGetSpecialReference(HLSR_SEARCHPAGE, &ref);
|
|
|
|
ok(hres == S_OK, "HlinkGetSpecialReference(HLSR_SEARCHPAGE) failed: %08x\n", hres);
|
|
|
|
ok(ref != NULL, "ref == NULL\n");
|
|
|
|
CoTaskMemFree(ref);
|
|
|
|
|
|
|
|
ref = (void*)0xdeadbeef;
|
|
|
|
hres = HlinkGetSpecialReference(HLSR_HISTORYFOLDER, &ref);
|
|
|
|
ok(hres == E_NOTIMPL, "HlinkGetSpecialReference(HLSR_HISTORYFOLDER) failed: %08x\n", hres);
|
|
|
|
ok(ref == NULL, "ref=%p\n", ref);
|
|
|
|
|
|
|
|
ref = (void*)0xdeadbeef;
|
|
|
|
hres = HlinkGetSpecialReference(4, &ref);
|
|
|
|
ok(hres == E_INVALIDARG, "HlinkGetSpecialReference(HLSR_HISTORYFOLDER) failed: %08x\n", hres);
|
|
|
|
ok(ref == NULL, "ref=%p\n", ref);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void test_HlinkCreateExtensionServices(void)
|
|
|
|
{
|
|
|
|
IAuthenticate *authenticate;
|
|
|
|
IHttpNegotiate *http_negotiate;
|
|
|
|
LPWSTR password, username, headers;
|
|
|
|
HWND hwnd;
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
static const WCHAR usernameW[] = {'u','s','e','r',0};
|
|
|
|
static const WCHAR passwordW[] = {'p','a','s','s',0};
|
|
|
|
static const WCHAR headersW[] = {'h','e','a','d','e','r','s',0};
|
|
|
|
static const WCHAR headersexW[] = {'h','e','a','d','e','r','s','\r','\n',0};
|
|
|
|
|
|
|
|
hres = HlinkCreateExtensionServices(NULL, NULL, NULL, NULL,
|
|
|
|
NULL, &IID_IAuthenticate, (void**)&authenticate);
|
|
|
|
ok(hres == S_OK, "HlinkCreateExtensionServices failed: %08x\n", hres);
|
|
|
|
ok(authenticate != NULL, "HlinkCreateExtensionServices returned NULL\n");
|
|
|
|
|
|
|
|
password = username = (void*)0xdeadbeef;
|
|
|
|
hwnd = (void*)0xdeadbeef;
|
|
|
|
hres = IAuthenticate_Authenticate(authenticate, &hwnd, &username, &password);
|
|
|
|
ok(hres == S_OK, "Authenticate failed: %08x\n", hres);
|
|
|
|
ok(!hwnd, "hwnd != NULL\n");
|
|
|
|
ok(!username, "username != NULL\n");
|
|
|
|
ok(!password, "password != NULL\n");
|
|
|
|
|
|
|
|
hres = IAuthenticate_QueryInterface(authenticate, &IID_IHttpNegotiate, (void**)&http_negotiate);
|
|
|
|
ok(hres == S_OK, "Could not get IHttpNegotiate interface: %08x\n", hres);
|
|
|
|
|
|
|
|
headers = (void*)0xdeadbeef;
|
|
|
|
hres = IHttpNegotiate_BeginningTransaction(http_negotiate, (void*)0xdeadbeef, (void*)0xdeadbeef,
|
|
|
|
0, &headers);
|
|
|
|
ok(hres == S_OK, "BeginningTransaction failed: %08x\n", hres);
|
|
|
|
ok(headers == NULL, "headers != NULL\n");
|
|
|
|
|
|
|
|
hres = IHttpNegotiate_BeginningTransaction(http_negotiate, (void*)0xdeadbeef, (void*)0xdeadbeef,
|
|
|
|
0, NULL);
|
|
|
|
ok(hres == E_INVALIDARG, "BeginningTransaction failed: %08x, expected E_INVALIDARG\n", hres);
|
|
|
|
|
|
|
|
headers = (void*)0xdeadbeef;
|
|
|
|
hres = IHttpNegotiate_OnResponse(http_negotiate, 200, (void*)0xdeadbeef, (void*)0xdeadbeef, &headers);
|
|
|
|
ok(hres == S_OK, "OnResponse failed: %08x\n", hres);
|
|
|
|
ok(headers == NULL, "headers != NULL\n");
|
|
|
|
|
|
|
|
IHttpNegotiate_Release(http_negotiate);
|
|
|
|
IAuthenticate_Release(authenticate);
|
|
|
|
|
|
|
|
|
|
|
|
hres = HlinkCreateExtensionServices(headersW, (HWND)0xfefefefe, usernameW, passwordW,
|
|
|
|
NULL, &IID_IAuthenticate, (void**)&authenticate);
|
|
|
|
ok(hres == S_OK, "HlinkCreateExtensionServices failed: %08x\n", hres);
|
|
|
|
ok(authenticate != NULL, "HlinkCreateExtensionServices returned NULL\n");
|
|
|
|
|
|
|
|
password = username = NULL;
|
|
|
|
hwnd = NULL;
|
|
|
|
hres = IAuthenticate_Authenticate(authenticate, &hwnd, &username, &password);
|
|
|
|
ok(hres == S_OK, "Authenticate failed: %08x\n", hres);
|
|
|
|
ok(hwnd == (HWND)0xfefefefe, "hwnd=%p\n", hwnd);
|
|
|
|
ok(!lstrcmpW(username, usernameW), "unexpected username\n");
|
|
|
|
ok(!lstrcmpW(password, passwordW), "unexpected password\n");
|
|
|
|
CoTaskMemFree(username);
|
|
|
|
CoTaskMemFree(password);
|
|
|
|
|
|
|
|
password = username = (void*)0xdeadbeef;
|
|
|
|
hwnd = (void*)0xdeadbeef;
|
|
|
|
hres = IAuthenticate_Authenticate(authenticate, &hwnd, NULL, &password);
|
|
|
|
ok(hres == E_INVALIDARG, "Authenticate failed: %08x\n", hres);
|
|
|
|
ok(password == (void*)0xdeadbeef, "password = %p\n", password);
|
|
|
|
ok(hwnd == (void*)0xdeadbeef, "hwnd = %p\n", hwnd);
|
|
|
|
|
|
|
|
hres = IAuthenticate_QueryInterface(authenticate, &IID_IHttpNegotiate, (void**)&http_negotiate);
|
|
|
|
ok(hres == S_OK, "Could not get IHttpNegotiate interface: %08x\n", hres);
|
|
|
|
|
|
|
|
headers = (void*)0xdeadbeef;
|
|
|
|
hres = IHttpNegotiate_BeginningTransaction(http_negotiate, (void*)0xdeadbeef, (void*)0xdeadbeef,
|
|
|
|
0, &headers);
|
|
|
|
ok(hres == S_OK, "BeginningTransaction failed: %08x\n", hres);
|
2009-12-22 11:40:11 +00:00
|
|
|
ok(!lstrcmpW(headers, headersexW), "unexpected headers %s\n", wine_dbgstr_w(headers));
|
2008-01-14 17:07:49 +00:00
|
|
|
CoTaskMemFree(headers);
|
|
|
|
|
|
|
|
headers = (void*)0xdeadbeef;
|
|
|
|
hres = IHttpNegotiate_OnResponse(http_negotiate, 200, (void*)0xdeadbeef, (void*)0xdeadbeef, &headers);
|
|
|
|
ok(hres == S_OK, "OnResponse failed: %08x\n", hres);
|
2009-12-22 11:40:11 +00:00
|
|
|
ok(headers == NULL, "unexpected headers %s\n", wine_dbgstr_w(headers));
|
2008-01-14 17:07:49 +00:00
|
|
|
|
|
|
|
IHttpNegotiate_Release(http_negotiate);
|
|
|
|
IAuthenticate_Release(authenticate);
|
|
|
|
}
|
|
|
|
|
2008-04-04 16:43:16 +00:00
|
|
|
static void test_HlinkParseDisplayName(void)
|
|
|
|
{
|
|
|
|
IMoniker *mon = NULL;
|
|
|
|
LPWSTR name;
|
|
|
|
DWORD issys;
|
|
|
|
ULONG eaten = 0;
|
|
|
|
IBindCtx *bctx;
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
static const WCHAR winehq_urlW[] =
|
|
|
|
{'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g',
|
|
|
|
'/','s','i','t','e','/','a','b','o','u','t',0};
|
|
|
|
static const WCHAR invalid_urlW[] = {'t','e','s','t',':','1','2','3','a','b','c',0};
|
|
|
|
static const WCHAR clsid_nameW[] = {'c','l','s','i','d',':',
|
|
|
|
'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};
|
2014-04-22 21:18:59 +00:00
|
|
|
static const WCHAR file_urlW[] =
|
|
|
|
{'f','i','l','e',':','/','/','/','c',':','\\','f','i','l','e','.','t','x','t',0};
|
2008-04-04 16:43:16 +00:00
|
|
|
|
|
|
|
CreateBindCtx(0, &bctx);
|
|
|
|
|
|
|
|
hres = HlinkParseDisplayName(bctx, winehq_urlW, FALSE, &eaten, &mon);
|
|
|
|
ok(hres == S_OK, "HlinkParseDisplayName failed: %08x\n", hres);
|
|
|
|
ok(eaten == sizeof(winehq_urlW)/sizeof(WCHAR)-1, "eaten=%d\n", eaten);
|
|
|
|
ok(mon != NULL, "mon == NULL\n");
|
|
|
|
|
|
|
|
hres = IMoniker_GetDisplayName(mon, bctx, 0, &name);
|
|
|
|
ok(hres == S_OK, "GetDiasplayName failed: %08x\n", hres);
|
2009-12-22 11:40:11 +00:00
|
|
|
ok(!lstrcmpW(name, winehq_urlW), "wrong display name %s\n", wine_dbgstr_w(name));
|
2008-04-04 16:43:16 +00:00
|
|
|
CoTaskMemFree(name);
|
|
|
|
|
|
|
|
hres = IMoniker_IsSystemMoniker(mon, &issys);
|
|
|
|
ok(hres == S_OK, "IsSystemMoniker failed: %08x\n", hres);
|
|
|
|
ok(issys == MKSYS_URLMONIKER, "issys=%x\n", issys);
|
|
|
|
|
|
|
|
IMoniker_Release(mon);
|
|
|
|
|
|
|
|
hres = HlinkParseDisplayName(bctx, clsid_nameW, FALSE, &eaten, &mon);
|
|
|
|
ok(hres == S_OK, "HlinkParseDisplayName failed: %08x\n", hres);
|
|
|
|
ok(eaten == sizeof(clsid_nameW)/sizeof(WCHAR)-1, "eaten=%d\n", eaten);
|
|
|
|
ok(mon != NULL, "mon == NULL\n");
|
|
|
|
|
|
|
|
hres = IMoniker_IsSystemMoniker(mon, &issys);
|
|
|
|
ok(hres == S_OK, "IsSystemMoniker failed: %08x\n", hres);
|
|
|
|
ok(issys == MKSYS_CLASSMONIKER, "issys=%x\n", issys);
|
|
|
|
|
|
|
|
IMoniker_Release(mon);
|
|
|
|
|
|
|
|
hres = HlinkParseDisplayName(bctx, invalid_urlW, FALSE, &eaten, &mon);
|
2014-04-22 21:18:59 +00:00
|
|
|
ok(hres == S_OK, "HlinkParseDisplayName failed: %08x\n", hres);
|
2008-04-04 16:43:16 +00:00
|
|
|
ok(eaten == sizeof(invalid_urlW)/sizeof(WCHAR)-1, "eaten=%d\n", eaten);
|
|
|
|
ok(mon != NULL, "mon == NULL\n");
|
|
|
|
|
|
|
|
hres = IMoniker_GetDisplayName(mon, bctx, 0, &name);
|
|
|
|
ok(hres == S_OK, "GetDiasplayName failed: %08x\n", hres);
|
2009-12-22 11:40:11 +00:00
|
|
|
ok(!lstrcmpW(name, invalid_urlW), "wrong display name %s\n", wine_dbgstr_w(name));
|
2008-04-04 16:43:16 +00:00
|
|
|
CoTaskMemFree(name);
|
|
|
|
|
|
|
|
hres = IMoniker_IsSystemMoniker(mon, &issys);
|
|
|
|
ok(hres == S_OK, "IsSystemMoniker failed: %08x\n", hres);
|
|
|
|
ok(issys == MKSYS_FILEMONIKER, "issys=%x\n", issys);
|
|
|
|
|
2014-04-22 21:18:59 +00:00
|
|
|
IMoniker_Release(mon);
|
|
|
|
|
|
|
|
hres = HlinkParseDisplayName(bctx, file_urlW, FALSE, &eaten, &mon);
|
|
|
|
ok(hres == S_OK, "HlinkParseDisplayName failed: %08x\n", hres);
|
|
|
|
ok(eaten == sizeof(file_urlW)/sizeof(WCHAR)-1, "eaten=%d\n", eaten);
|
|
|
|
ok(mon != NULL, "mon == NULL\n");
|
|
|
|
|
|
|
|
hres = IMoniker_GetDisplayName(mon, bctx, 0, &name);
|
|
|
|
ok(hres == S_OK, "GetDiasplayName failed: %08x\n", hres);
|
|
|
|
ok(!lstrcmpW(name, file_urlW+8), "wrong display name %s\n", wine_dbgstr_w(name));
|
|
|
|
CoTaskMemFree(name);
|
|
|
|
|
|
|
|
hres = IMoniker_IsSystemMoniker(mon, &issys);
|
|
|
|
ok(hres == S_OK, "IsSystemMoniker failed: %08x\n", hres);
|
|
|
|
ok(issys == MKSYS_FILEMONIKER, "issys=%x\n", issys);
|
|
|
|
|
2009-12-22 11:40:11 +00:00
|
|
|
IMoniker_Release(mon);
|
2008-04-04 16:43:16 +00:00
|
|
|
IBindCtx_Release(bctx);
|
|
|
|
}
|
|
|
|
|
|
|
|
static IBindCtx *_bctx;
|
|
|
|
|
|
|
|
static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOINTERFACE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
|
|
|
|
{
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface,
|
|
|
|
REFGUID guidService, REFIID riid, void **ppv)
|
|
|
|
{
|
2014-04-22 21:18:59 +00:00
|
|
|
ok(0, "unexpected service %s\n", wine_dbgstr_guid(guidService));
|
2008-04-04 16:43:16 +00:00
|
|
|
return E_NOINTERFACE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static IServiceProviderVtbl ServiceProviderVtbl = {
|
|
|
|
ServiceProvider_QueryInterface,
|
|
|
|
ServiceProvider_AddRef,
|
|
|
|
ServiceProvider_Release,
|
|
|
|
ServiceProvider_QueryService
|
|
|
|
};
|
|
|
|
|
|
|
|
static IServiceProvider ServiceProvider = { &ServiceProviderVtbl };
|
|
|
|
|
|
|
|
static HRESULT WINAPI BindStatusCallback_QueryInterface(IBindStatusCallback *iface, REFIID riid, void **ppv)
|
|
|
|
{
|
|
|
|
*ppv = NULL;
|
|
|
|
|
|
|
|
if(IsEqualGUID(riid, &IID_IServiceProvider)) {
|
|
|
|
*ppv = &ServiceProvider;
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2014-04-22 21:18:59 +00:00
|
|
|
ok(0, "unexpected interface %s\n", wine_dbgstr_guid(riid));
|
2008-04-04 16:43:16 +00:00
|
|
|
return E_NOINTERFACE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI BindStatusCallback_AddRef(IBindStatusCallback *iface)
|
|
|
|
{
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI BindStatusCallback_Release(IBindStatusCallback *iface)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI BindStatusCallback_OnStartBinding(IBindStatusCallback *iface, DWORD dwReserved,
|
|
|
|
IBinding *pib)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI BindStatusCallback_GetPriority(IBindStatusCallback *iface, LONG *pnPriority)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI BindStatusCallback_OnLowResource(IBindStatusCallback *iface, DWORD reserved)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI BindStatusCallback_OnProgress(IBindStatusCallback *iface, ULONG ulProgress,
|
|
|
|
ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *iface, HRESULT hresult, LPCWSTR szError)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI BindStatusCallback_GetBindInfo(IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI BindStatusCallback_OnDataAvailable(IBindStatusCallback *iface, DWORD grfBSCF,
|
|
|
|
DWORD dwSize, FORMATETC* pformatetc, STGMEDIUM* pstgmed)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI BindStatusCallback_OnObjectAvailable(IBindStatusCallback *iface, REFIID riid, IUnknown *punk)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static IBindStatusCallbackVtbl BindStatusCallbackVtbl = {
|
|
|
|
BindStatusCallback_QueryInterface,
|
|
|
|
BindStatusCallback_AddRef,
|
|
|
|
BindStatusCallback_Release,
|
|
|
|
BindStatusCallback_OnStartBinding,
|
|
|
|
BindStatusCallback_GetPriority,
|
|
|
|
BindStatusCallback_OnLowResource,
|
|
|
|
BindStatusCallback_OnProgress,
|
|
|
|
BindStatusCallback_OnStopBinding,
|
|
|
|
BindStatusCallback_GetBindInfo,
|
|
|
|
BindStatusCallback_OnDataAvailable,
|
|
|
|
BindStatusCallback_OnObjectAvailable
|
|
|
|
};
|
|
|
|
|
|
|
|
static IBindStatusCallback BindStatusCallback = { &BindStatusCallbackVtbl };
|
|
|
|
|
2013-09-19 16:12:38 +00:00
|
|
|
static HRESULT WINAPI HlinkBrowseContext_QueryInterface(
|
|
|
|
IHlinkBrowseContext *iface, REFIID riid, void **ppv)
|
|
|
|
{
|
|
|
|
*ppv = NULL;
|
|
|
|
|
|
|
|
if(IsEqualGUID(&IID_IHlinkHistory, riid)) {
|
|
|
|
CHECK_EXPECT(HBC_QueryInterface_IHlinkHistory);
|
|
|
|
return E_NOINTERFACE;
|
|
|
|
}
|
|
|
|
|
2014-04-22 21:18:59 +00:00
|
|
|
ok(0, "unexpected interface: %s\n", wine_dbgstr_guid(riid));
|
2013-09-19 16:12:38 +00:00
|
|
|
return E_NOINTERFACE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI HlinkBrowseContext_AddRef(IHlinkBrowseContext *iface)
|
|
|
|
{
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI HlinkBrowseContext_Release(IHlinkBrowseContext *iface)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_Register(IHlinkBrowseContext *iface,
|
|
|
|
DWORD reserved, IUnknown *piunk, IMoniker *pimk, DWORD *pdwRegister)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static IMoniker Moniker;
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_GetObject(IHlinkBrowseContext *iface,
|
|
|
|
IMoniker *pimk, BOOL fBindIfRootRegistered, IUnknown **ppiunk)
|
|
|
|
{
|
|
|
|
CHECK_EXPECT(HBC_GetObject);
|
|
|
|
|
|
|
|
ok(pimk == &Moniker, "pimk != &Moniker\n");
|
|
|
|
ok(fBindIfRootRegistered == 1, "fBindIfRootRegistered = %x\n", fBindIfRootRegistered);
|
|
|
|
*ppiunk = NULL;
|
|
|
|
return S_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_Revoke(IHlinkBrowseContext *iface, DWORD dwRegister)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_SetBrowseWindowInfo(
|
|
|
|
IHlinkBrowseContext *iface, HLBWINFO *phlbwi)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_GetBrowseWindowInfo(
|
|
|
|
IHlinkBrowseContext *iface, HLBWINFO *phlbwi)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_SetInitialHlink(IHlinkBrowseContext *iface,
|
|
|
|
IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_OnNavigateHlink(IHlinkBrowseContext *iface, DWORD grfHLNF,
|
|
|
|
IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName, ULONG *puHLID)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_UpdateHlink(IHlinkBrowseContext *iface, ULONG uHLID,
|
|
|
|
IMoniker *pimkTarget, LPCWSTR location, LPCWSTR friendly_name)
|
|
|
|
{
|
|
|
|
CHECK_EXPECT(HBC_UpdateHlink);
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_EnumNavigationStack(IHlinkBrowseContext *iface,
|
|
|
|
DWORD dwReserved, DWORD grfHLFNAMEF, IEnumHLITEM **ppienumhlitem)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_QueryHlink(IHlinkBrowseContext *iface,
|
|
|
|
DWORD grfHLQF, ULONG uHLID)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_GetHlink(IHlinkBrowseContext *iface,
|
|
|
|
ULONG uHLID, IHlink **ppihl)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_SetCurrentHlink(
|
|
|
|
IHlinkBrowseContext *iface, ULONG uHLID)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_Clone(IHlinkBrowseContext *iface,
|
|
|
|
IUnknown *piunkOuter, REFIID riid, IUnknown **ppiunkObj)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkBrowseContext_Close(IHlinkBrowseContext *iface, DWORD reserved)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static IHlinkBrowseContextVtbl HlinkBrowseContextVtbl = {
|
|
|
|
HlinkBrowseContext_QueryInterface,
|
|
|
|
HlinkBrowseContext_AddRef,
|
|
|
|
HlinkBrowseContext_Release,
|
|
|
|
HlinkBrowseContext_Register,
|
|
|
|
HlinkBrowseContext_GetObject,
|
|
|
|
HlinkBrowseContext_Revoke,
|
|
|
|
HlinkBrowseContext_SetBrowseWindowInfo,
|
|
|
|
HlinkBrowseContext_GetBrowseWindowInfo,
|
|
|
|
HlinkBrowseContext_SetInitialHlink,
|
|
|
|
HlinkBrowseContext_OnNavigateHlink,
|
|
|
|
HlinkBrowseContext_UpdateHlink,
|
|
|
|
HlinkBrowseContext_EnumNavigationStack,
|
|
|
|
HlinkBrowseContext_QueryHlink,
|
|
|
|
HlinkBrowseContext_GetHlink,
|
|
|
|
HlinkBrowseContext_SetCurrentHlink,
|
|
|
|
HlinkBrowseContext_Clone,
|
|
|
|
HlinkBrowseContext_Close
|
|
|
|
};
|
|
|
|
|
|
|
|
static IHlinkBrowseContext HlinkBrowseContext = { &HlinkBrowseContextVtbl };
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkTarget_QueryInterface(IHlinkTarget *iface, REFIID riid, void **ppv)
|
|
|
|
{
|
|
|
|
if(IsEqualGUID(&IID_IHlinkTarget, riid)) {
|
|
|
|
*ppv = iface;
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2014-04-22 21:18:59 +00:00
|
|
|
ok(0, "unexpected interface: %s\n", wine_dbgstr_guid(riid));
|
2013-09-19 16:12:38 +00:00
|
|
|
return E_NOINTERFACE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI HlinkTarget_AddRef(IHlinkTarget *iface)
|
|
|
|
{
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI HlinkTarget_Release(IHlinkTarget *iface)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkTarget_SetBrowseContext(IHlinkTarget *iface,
|
|
|
|
IHlinkBrowseContext *pihlbc)
|
|
|
|
{
|
|
|
|
CHECK_EXPECT(HT_SetBrowseContext);
|
|
|
|
|
|
|
|
ok(pihlbc == &HlinkBrowseContext, "pihlbc != &HlinkBrowseContext (%p)\n", pihlbc);
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkTarget_GetBrowseContext(IHlinkTarget *iface,
|
|
|
|
IHlinkBrowseContext **ppihlbc)
|
|
|
|
{
|
|
|
|
CHECK_EXPECT(HT_GetBrowseContext);
|
|
|
|
|
|
|
|
*ppihlbc = NULL;
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkTarget_Navigate(IHlinkTarget *iface,
|
|
|
|
DWORD grfHLNF, LPCWSTR pwzJumpLocation)
|
|
|
|
{
|
|
|
|
CHECK_EXPECT(HT_Navigate);
|
|
|
|
|
|
|
|
ok(grfHLNF == 0, "grfHLNF = %x\n", grfHLNF);
|
|
|
|
ok(pwzJumpLocation == NULL, "pwzJumpLocation = %s\n", wine_dbgstr_w(pwzJumpLocation));
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkTarget_GetMoniker(IHlinkTarget *iface,
|
|
|
|
LPCWSTR pwzLocation, DWORD dwAssign, IMoniker **ppimkLocation)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI HlinkTarget_GetFriendlyName(IHlinkTarget *iface,
|
|
|
|
LPCWSTR pwzLocation, LPWSTR *ppwzFriendlyName)
|
|
|
|
{
|
|
|
|
CHECK_EXPECT(HT_GetFriendlyName);
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static IHlinkTargetVtbl HlinkTargetVtbl = {
|
|
|
|
HlinkTarget_QueryInterface,
|
|
|
|
HlinkTarget_AddRef,
|
|
|
|
HlinkTarget_Release,
|
|
|
|
HlinkTarget_SetBrowseContext,
|
|
|
|
HlinkTarget_GetBrowseContext,
|
|
|
|
HlinkTarget_Navigate,
|
|
|
|
HlinkTarget_GetMoniker,
|
|
|
|
HlinkTarget_GetFriendlyName
|
|
|
|
};
|
|
|
|
|
|
|
|
static IHlinkTarget HlinkTarget = { &HlinkTargetVtbl };
|
|
|
|
|
2008-04-04 16:43:16 +00:00
|
|
|
static HRESULT WINAPI Moniker_QueryInterface(IMoniker *iface, REFIID riid, void **ppv)
|
|
|
|
{
|
|
|
|
*ppv = NULL;
|
|
|
|
|
2014-04-22 21:18:59 +00:00
|
|
|
ok(0, "unexpected riid: %s\n", wine_dbgstr_guid(riid));
|
2008-04-04 16:43:16 +00:00
|
|
|
return E_NOINTERFACE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI Moniker_AddRef(IMoniker *iface)
|
|
|
|
{
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI Moniker_Release(IMoniker *iface)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_GetClassID(IMoniker *iface, CLSID *pClassID)
|
|
|
|
{
|
2012-01-27 12:14:09 +00:00
|
|
|
CHECK_EXPECT(GetClassID);
|
|
|
|
*pClassID = IID_IUnknown; /* not a valid CLSID */
|
|
|
|
return S_OK;
|
2008-04-04 16:43:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_IsDirty(IMoniker *iface)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_Load(IMoniker *iface, IStream *pStm)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_Save(IMoniker *iface, IStream *pStm, BOOL fClearDirty)
|
|
|
|
{
|
2012-01-27 12:14:09 +00:00
|
|
|
CHECK_EXPECT(Save);
|
|
|
|
return S_OK;
|
2008-04-04 16:43:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_GetSizeMax(IMoniker *iface, ULARGE_INTEGER *pcbSize)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
2013-09-19 16:12:38 +00:00
|
|
|
static HRESULT WINAPI Moniker_BindToObject(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft,
|
|
|
|
REFIID riid, void **ppv)
|
2008-04-04 16:43:16 +00:00
|
|
|
{
|
2013-09-19 16:12:38 +00:00
|
|
|
CHECK_EXPECT(BindToObject);
|
|
|
|
|
|
|
|
ok(pbc != _bctx, "pbc != _bctx\n");
|
|
|
|
ok(pmkToLeft == NULL, "pmkToLeft = %p\n", pmkToLeft);
|
2014-04-22 21:18:59 +00:00
|
|
|
ok(IsEqualGUID(&IID_IUnknown, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid));
|
2013-09-19 16:12:38 +00:00
|
|
|
ok(ppv != NULL, "ppv == NULL\n");
|
|
|
|
ok(*ppv == NULL, "*ppv = %p\n", *ppv);
|
|
|
|
|
|
|
|
*ppv = &HlinkTarget;
|
|
|
|
return S_OK;
|
2008-04-04 16:43:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_BindToStorage(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft,
|
|
|
|
REFIID riid, void **ppv)
|
|
|
|
{
|
|
|
|
IUnknown *unk;
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
static OLECHAR BSCBHolder[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
|
|
|
|
|
|
|
|
CHECK_EXPECT(BindToStorage);
|
|
|
|
|
|
|
|
ok(pbc == _bctx, "pbc != _bctx\n");
|
|
|
|
ok(pmkToLeft == NULL, "pmkToLeft=%p\n", pmkToLeft);
|
2014-04-22 21:18:59 +00:00
|
|
|
ok(IsEqualGUID(&IID_IUnknown, riid), "unexpected riid %s\n", wine_dbgstr_guid(riid));
|
2008-04-04 16:43:16 +00:00
|
|
|
ok(ppv != NULL, "ppv == NULL\n");
|
|
|
|
ok(*ppv == NULL, "*ppv=%p\n", *ppv);
|
|
|
|
|
|
|
|
hres = IBindCtx_GetObjectParam(pbc, BSCBHolder, &unk);
|
|
|
|
ok(hres == S_OK, "GetObjectParam failed: %08x\n", hres);
|
|
|
|
ok(unk != NULL, "unk == NULL\n");
|
|
|
|
|
|
|
|
IUnknown_Release(unk);
|
|
|
|
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_Reduce(IMoniker *iface, IBindCtx *pbc, DWORD dwReduceHowFar,
|
|
|
|
IMoniker **ppmkToLeft, IMoniker **ppmkReduced)
|
|
|
|
{
|
2012-01-27 12:14:09 +00:00
|
|
|
CHECK_EXPECT(Reduce);
|
2008-04-04 16:43:16 +00:00
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_ComposeWith(IMoniker *iface, IMoniker *pmkRight,
|
|
|
|
BOOL fOnlyIfNotGeneric, IMoniker **ppnkComposite)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_Enum(IMoniker *iface, BOOL fForwrd, IEnumMoniker **ppenumMoniker)
|
|
|
|
{
|
2012-01-27 12:14:09 +00:00
|
|
|
CHECK_EXPECT(Enum);
|
2008-04-04 16:43:16 +00:00
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_IsEqual(IMoniker *iface, IMoniker *pmkOtherMoniker)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_Hash(IMoniker *iface, DWORD *pdwHash)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_IsRunning(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft,
|
|
|
|
IMoniker *pmkNewlyRunning)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_GetTimeOfLastChange(IMoniker *iface, IBindCtx *pbc,
|
|
|
|
IMoniker *pmkToLeft, FILETIME *pFileTime)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_Inverse(IMoniker *iface, IMoniker **ppmk)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_CommonPrefixWith(IMoniker *iface, IMoniker *pmkOther,
|
|
|
|
IMoniker **ppmkPrefix)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_RelativePathTo(IMoniker *iface, IMoniker *pmkOther,
|
|
|
|
IMoniker **pmkRelPath)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_GetDisplayName(IMoniker *iface, IBindCtx *pbc,
|
|
|
|
IMoniker *pmkToLeft, LPOLESTR *ppszDisplayName)
|
|
|
|
{
|
|
|
|
static const WCHAR winehq_urlW[] =
|
|
|
|
{'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g',
|
|
|
|
'/','s','i','t','e','/','a','b','o','u','t',0};
|
|
|
|
|
2013-09-19 16:12:38 +00:00
|
|
|
CHECK_EXPECT2(GetDisplayName);
|
2008-04-04 16:43:16 +00:00
|
|
|
|
|
|
|
ok(pbc != NULL, "pbc == NULL\n");
|
|
|
|
ok(pbc != _bctx, "pbc == _bctx\n");
|
|
|
|
ok(pmkToLeft == NULL, "pmkToLeft=%p\n", pmkToLeft);
|
|
|
|
|
|
|
|
*ppszDisplayName = CoTaskMemAlloc(sizeof(winehq_urlW));
|
|
|
|
memcpy(*ppszDisplayName, winehq_urlW, sizeof(winehq_urlW));
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_ParseDisplayName(IMoniker *iface, IBindCtx *pbc,
|
|
|
|
IMoniker *pmkToLeft, LPOLESTR pszDisplayName, ULONG *pchEaten, IMoniker **ppmkOut)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected call\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI Moniker_IsSystemMoniker(IMoniker *iface, DWORD *pdwMksys)
|
|
|
|
{
|
|
|
|
CHECK_EXPECT2(IsSystemMoniker);
|
|
|
|
|
|
|
|
*pdwMksys = MKSYS_URLMONIKER;
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static IMonikerVtbl MonikerVtbl = {
|
|
|
|
Moniker_QueryInterface,
|
|
|
|
Moniker_AddRef,
|
|
|
|
Moniker_Release,
|
|
|
|
Moniker_GetClassID,
|
|
|
|
Moniker_IsDirty,
|
|
|
|
Moniker_Load,
|
|
|
|
Moniker_Save,
|
|
|
|
Moniker_GetSizeMax,
|
|
|
|
Moniker_BindToObject,
|
|
|
|
Moniker_BindToStorage,
|
|
|
|
Moniker_Reduce,
|
|
|
|
Moniker_ComposeWith,
|
|
|
|
Moniker_Enum,
|
|
|
|
Moniker_IsEqual,
|
|
|
|
Moniker_Hash,
|
|
|
|
Moniker_IsRunning,
|
|
|
|
Moniker_GetTimeOfLastChange,
|
|
|
|
Moniker_Inverse,
|
|
|
|
Moniker_CommonPrefixWith,
|
|
|
|
Moniker_RelativePathTo,
|
|
|
|
Moniker_GetDisplayName,
|
|
|
|
Moniker_ParseDisplayName,
|
|
|
|
Moniker_IsSystemMoniker
|
|
|
|
};
|
|
|
|
|
|
|
|
static IMoniker Moniker = { &MonikerVtbl };
|
|
|
|
|
|
|
|
static void test_HlinkResolveMonikerForData(void)
|
|
|
|
{
|
|
|
|
IBindCtx *bctx;
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
CreateBindCtx(0, &bctx);
|
|
|
|
_bctx = bctx;
|
|
|
|
|
|
|
|
SET_EXPECT(IsSystemMoniker);
|
|
|
|
SET_EXPECT(GetDisplayName);
|
|
|
|
SET_EXPECT(BindToStorage);
|
|
|
|
|
|
|
|
hres = HlinkResolveMonikerForData(&Moniker, 0, bctx, 0, NULL, &BindStatusCallback, NULL);
|
|
|
|
ok(hres == S_OK, "HlinkResolveMonikerForData failed: %08x\n", hres);
|
|
|
|
|
|
|
|
CHECK_CALLED(IsSystemMoniker);
|
|
|
|
CHECK_CALLED(GetDisplayName);
|
|
|
|
CHECK_CALLED(BindToStorage);
|
|
|
|
|
|
|
|
IBindCtx_Release(bctx);
|
2012-05-19 10:13:05 +00:00
|
|
|
_bctx = NULL;
|
2008-04-04 16:43:16 +00:00
|
|
|
}
|
|
|
|
|
2009-12-22 11:40:11 +00:00
|
|
|
static void test_HlinkGetSetMonikerReference(void)
|
|
|
|
{
|
|
|
|
IMoniker *found_trgt, *dummy, *dummy2;
|
|
|
|
IHlink *hlink;
|
|
|
|
HRESULT hres;
|
|
|
|
const WCHAR one[] = {'1',0};
|
|
|
|
const WCHAR two[] = {'2',0};
|
|
|
|
const WCHAR name[] = {'a',0};
|
|
|
|
WCHAR *found_loc;
|
|
|
|
|
|
|
|
/* create two dummy monikers to use as targets */
|
|
|
|
hres = CreateItemMoniker(one, one, &dummy);
|
|
|
|
ok(hres == S_OK, "CreateItemMoniker failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
hres = CreateItemMoniker(two, two, &dummy2);
|
|
|
|
ok(hres == S_OK, "CreateItemMoniker failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
/* create a new hlink: target => dummy, location => one */
|
|
|
|
hres = HlinkCreateFromMoniker(dummy, one, name, NULL, 0, NULL, &IID_IHlink, (void**)&hlink);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromMoniker failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
/* validate the target and location */
|
|
|
|
hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc);
|
|
|
|
ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres);
|
|
|
|
ok(found_trgt == dummy, "Found target should've been %p, was: %p\n", dummy, found_trgt);
|
|
|
|
ok(lstrcmpW(found_loc, one) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(found_loc));
|
|
|
|
IMoniker_Release(found_trgt);
|
|
|
|
CoTaskMemFree(found_loc);
|
|
|
|
|
|
|
|
/* set location => two */
|
|
|
|
hres = IHlink_SetMonikerReference(hlink, HLINKSETF_LOCATION, dummy2, two);
|
|
|
|
ok(hres == S_OK, "IHlink_SetMonikerReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres);
|
2009-12-22 11:40:11 +00:00
|
|
|
ok(found_trgt == dummy, "Found target should've been %p, was: %p\n", dummy, found_trgt);
|
|
|
|
ok(lstrcmpW(found_loc, two) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(two), wine_dbgstr_w(found_loc));
|
|
|
|
IMoniker_Release(found_trgt);
|
|
|
|
CoTaskMemFree(found_loc);
|
|
|
|
|
|
|
|
/* set target => dummy2 */
|
|
|
|
hres = IHlink_SetMonikerReference(hlink, HLINKSETF_TARGET, dummy2, one);
|
|
|
|
ok(hres == S_OK, "IHlink_SetMonikerReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres);
|
2009-12-22 11:40:11 +00:00
|
|
|
ok(found_trgt == dummy2, "Found target should've been %p, was: %p\n", dummy2, found_trgt);
|
|
|
|
ok(lstrcmpW(found_loc, two) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(two), wine_dbgstr_w(found_loc));
|
|
|
|
IMoniker_Release(found_trgt);
|
|
|
|
CoTaskMemFree(found_loc);
|
|
|
|
|
|
|
|
/* set target => dummy, location => one */
|
|
|
|
hres = IHlink_SetMonikerReference(hlink, HLINKSETF_TARGET | HLINKSETF_LOCATION, dummy, one);
|
|
|
|
ok(hres == S_OK, "IHlink_SetMonikerReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres);
|
2009-12-22 11:40:11 +00:00
|
|
|
ok(found_trgt == dummy, "Found target should've been %p, was: %p\n", dummy, found_trgt);
|
|
|
|
ok(lstrcmpW(found_loc, one) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(found_loc));
|
|
|
|
IMoniker_Release(found_trgt);
|
|
|
|
CoTaskMemFree(found_loc);
|
|
|
|
|
|
|
|
/* no HLINKSETF flags */
|
|
|
|
hres = IHlink_SetMonikerReference(hlink, 0, dummy2, two);
|
|
|
|
ok(hres == E_INVALIDARG, "IHlink_SetMonikerReference should've failed with E_INVALIDARG (0x%08x), failed with 0x%08x\n", E_INVALIDARG, hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres);
|
2009-12-22 11:40:11 +00:00
|
|
|
ok(found_trgt == dummy, "Found target should've been %p, was: %p\n", dummy, found_trgt);
|
|
|
|
ok(lstrcmpW(found_loc, one) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(found_loc));
|
|
|
|
IMoniker_Release(found_trgt);
|
|
|
|
CoTaskMemFree(found_loc);
|
|
|
|
|
|
|
|
/* invalid HLINKSETF flags */
|
Sync advapi32, comctl32, crypt32, cryptui, cryptnet, fusion, gdi32, gdiplus, hlink, imm32, jscript, kernel32, localspl, msacm32, mscms, msi, mstask, msvcrtd, msxml3, ntdll, ole32, pdh, psapi, quartz, rasapi32, riched20 AND rsaenh Winetests.
TBD mshtml, shell32, oleaut32 which still fail to build here
svn path=/trunk/; revision=47931
2010-07-03 12:45:23 +00:00
|
|
|
/* Windows returns garbage; on 32-bit it returns the flags probably because the compiler happened to store them in %eax at some point */
|
2012-01-27 12:14:09 +00:00
|
|
|
if (0)
|
|
|
|
IHlink_SetMonikerReference(hlink, 12, dummy2, two);
|
2009-12-22 11:40:11 +00:00
|
|
|
|
|
|
|
hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres);
|
2009-12-22 11:40:11 +00:00
|
|
|
ok(found_trgt == dummy, "Found target should've been %p, was: %p\n", dummy, found_trgt);
|
|
|
|
ok(lstrcmpW(found_loc, one) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(found_loc));
|
|
|
|
IMoniker_Release(found_trgt);
|
|
|
|
CoTaskMemFree(found_loc);
|
|
|
|
|
|
|
|
/* valid & invalid HLINKSETF flags */
|
|
|
|
hres = IHlink_SetMonikerReference(hlink, 12 | HLINKSETF_TARGET, dummy2, two);
|
|
|
|
ok(hres == S_OK, "IHlink_SetMonikerReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres);
|
2009-12-22 11:40:11 +00:00
|
|
|
ok(found_trgt == dummy2, "Found target should've been %p, was: %p\n", dummy2, found_trgt);
|
|
|
|
ok(lstrcmpW(found_loc, one) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(found_loc));
|
|
|
|
IMoniker_Release(found_trgt);
|
|
|
|
CoTaskMemFree(found_loc);
|
|
|
|
|
|
|
|
/* NULL args */
|
|
|
|
hres = IHlink_SetMonikerReference(hlink, HLINKSETF_TARGET | HLINKSETF_LOCATION, NULL, NULL);
|
|
|
|
ok(hres == S_OK, "IHlink_SetMonikerReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres);
|
2009-12-22 11:40:11 +00:00
|
|
|
ok(found_trgt == NULL, "Found target should've been %p, was: %p\n", NULL, found_trgt);
|
|
|
|
ok(found_loc == NULL, "Found location should've been %s, was: %s\n", wine_dbgstr_w(NULL), wine_dbgstr_w(found_loc));
|
|
|
|
if(found_trgt)
|
|
|
|
IMoniker_Release(found_trgt);
|
|
|
|
|
|
|
|
IHlink_Release(hlink);
|
|
|
|
IMoniker_Release(dummy2);
|
|
|
|
IMoniker_Release(dummy);
|
2012-05-19 10:13:05 +00:00
|
|
|
|
|
|
|
SET_EXPECT(Reduce);
|
|
|
|
SET_EXPECT(Enum);
|
|
|
|
SET_EXPECT(IsSystemMoniker);
|
|
|
|
SET_EXPECT(GetDisplayName);
|
|
|
|
hres = HlinkCreateFromMoniker(&Moniker, NULL, NULL, NULL, 0, NULL,
|
|
|
|
&IID_IHlink, (void **)&hlink);
|
|
|
|
ok(hres == S_OK, "CreateFromMoniker failed: %08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_ABSOLUTE,
|
|
|
|
&found_trgt, &found_loc);
|
|
|
|
ok(hres == S_OK, "CreateFromMoniker failed: %08x\n", hres);
|
|
|
|
ok(found_trgt == &Moniker, "Got unexpected moniker: %p\n", found_trgt);
|
|
|
|
ok(found_loc == NULL, "Got unexpected location: %p\n", found_loc);
|
|
|
|
todo_wine CHECK_CALLED(Reduce);
|
|
|
|
todo_wine CHECK_CALLED(Enum);
|
|
|
|
CHECK_CALLED(IsSystemMoniker);
|
|
|
|
CHECK_CALLED(GetDisplayName);
|
|
|
|
|
|
|
|
IHlink_Release(hlink);
|
2009-12-22 11:40:11 +00:00
|
|
|
}
|
|
|
|
|
2010-03-03 19:44:02 +00:00
|
|
|
static void test_HlinkGetSetStringReference(void)
|
|
|
|
{
|
|
|
|
IHlink *link;
|
|
|
|
static const WCHAR one[] = {'1',0};
|
|
|
|
static const WCHAR two[] = {'2',0};
|
|
|
|
static const WCHAR three[] = {'3',0};
|
|
|
|
static const WCHAR empty[] = {0};
|
|
|
|
WCHAR *fnd_tgt, *fnd_loc;
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
/* create a new hlink: target => NULL, location => one */
|
|
|
|
hres = HlinkCreateFromMoniker(NULL, one, empty, NULL, 0, NULL, &IID_IHlink, (void**)&link);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromMoniker failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
/* test setting/getting location */
|
|
|
|
hres = IHlink_GetStringReference(link, HLINKGETREF_DEFAULT, &fnd_tgt, &fnd_loc);
|
|
|
|
ok(hres == S_OK, "IHlink_GetStringReference failed: 0x%08x\n", hres);
|
|
|
|
ok(fnd_tgt == NULL, "Found target should have been NULL, was: %s\n", wine_dbgstr_w(fnd_tgt));
|
|
|
|
ok(!lstrcmpW(fnd_loc, one), "Found location should have been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(fnd_loc));
|
|
|
|
CoTaskMemFree(fnd_tgt);
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
|
|
|
|
hres = IHlink_SetStringReference(link, HLINKSETF_LOCATION, one, two);
|
|
|
|
ok(hres == S_OK, "IHlink_SetStringReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetStringReference(link, HLINKGETREF_DEFAULT, &fnd_tgt, &fnd_loc);
|
|
|
|
ok(hres == S_OK, "IHlink_GetStringReference failed: 0x%08x\n", hres);
|
|
|
|
ok(fnd_tgt == NULL, "Found target should have been NULL, was: %s\n", wine_dbgstr_w(fnd_tgt));
|
|
|
|
ok(!lstrcmpW(fnd_loc, two), "Found location should have been %s, was: %s\n", wine_dbgstr_w(two), wine_dbgstr_w(fnd_loc));
|
|
|
|
CoTaskMemFree(fnd_tgt);
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
|
|
|
|
hres = IHlink_SetStringReference(link, -HLINKSETF_LOCATION, two, one);
|
|
|
|
ok(hres == S_OK, "IHlink_SetStringReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetStringReference(link, HLINKGETREF_DEFAULT, &fnd_tgt, &fnd_loc);
|
|
|
|
ok(hres == S_OK, "IHlink_GetStringReference failed: 0x%08x\n", hres);
|
|
|
|
ok(fnd_tgt == NULL, "Found target should have been NULL, was: %s\n", wine_dbgstr_w(fnd_tgt));
|
|
|
|
ok(!lstrcmpW(fnd_loc, one), "Found location should have been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(fnd_loc));
|
|
|
|
CoTaskMemFree(fnd_tgt);
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
|
|
|
|
/* test setting/getting target */
|
|
|
|
hres = IHlink_SetStringReference(link, HLINKSETF_TARGET, two, three);
|
|
|
|
ok(hres == S_OK, "IHlink_SetStringReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetStringReference(link, HLINKGETREF_DEFAULT, &fnd_tgt, &fnd_loc);
|
|
|
|
ok(hres == S_OK, "IHlink_GetStringReference failed: 0x%08x\n", hres);
|
|
|
|
ok(!lstrcmpW(fnd_tgt, two), "Found target should have been %s, was: %s\n", wine_dbgstr_w(two), wine_dbgstr_w(fnd_tgt));
|
|
|
|
ok(!lstrcmpW(fnd_loc, one), "Found location should have been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(fnd_loc));
|
|
|
|
CoTaskMemFree(fnd_tgt);
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
|
|
|
|
hres = IHlink_SetStringReference(link, -HLINKSETF_TARGET, three, two);
|
|
|
|
ok(hres == S_OK, "IHlink_SetStringReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetStringReference(link, HLINKGETREF_DEFAULT, &fnd_tgt, &fnd_loc);
|
|
|
|
ok(hres == S_OK, "IHlink_GetStringReference failed: 0x%08x\n", hres);
|
|
|
|
ok(!lstrcmpW(fnd_tgt, three), "Found target should have been %s, was: %s\n", wine_dbgstr_w(three), wine_dbgstr_w(fnd_tgt));
|
|
|
|
ok(!lstrcmpW(fnd_loc, two), "Found location should have been %s, was: %s\n", wine_dbgstr_w(two), wine_dbgstr_w(fnd_loc));
|
|
|
|
CoTaskMemFree(fnd_tgt);
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
|
|
|
|
/* test setting/getting both */
|
|
|
|
hres = IHlink_SetStringReference(link, HLINKSETF_TARGET | HLINKSETF_LOCATION, one, two);
|
|
|
|
ok(hres == S_OK, "IHlink_SetStringReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetStringReference(link, HLINKGETREF_DEFAULT, &fnd_tgt, &fnd_loc);
|
|
|
|
ok(hres == S_OK, "IHlink_GetStringReference failed: 0x%08x\n", hres);
|
|
|
|
ok(!lstrcmpW(fnd_tgt, one), "Found target should have been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(fnd_tgt));
|
|
|
|
ok(!lstrcmpW(fnd_loc, two), "Found location should have been %s, was: %s\n", wine_dbgstr_w(two), wine_dbgstr_w(fnd_loc));
|
|
|
|
CoTaskMemFree(fnd_tgt);
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
|
|
|
|
hres = IHlink_SetStringReference(link, -(HLINKSETF_TARGET | HLINKSETF_LOCATION), three, one);
|
|
|
|
ok(hres == S_OK, "IHlink_SetStringReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetStringReference(link, HLINKGETREF_DEFAULT, &fnd_tgt, &fnd_loc);
|
|
|
|
ok(hres == S_OK, "IHlink_GetStringReference failed: 0x%08x\n", hres);
|
|
|
|
ok(!lstrcmpW(fnd_tgt, three), "Found target should have been %s, was: %s\n", wine_dbgstr_w(three), wine_dbgstr_w(fnd_tgt));
|
|
|
|
ok(!lstrcmpW(fnd_loc, two), "Found location should have been %s, was: %s\n", wine_dbgstr_w(two), wine_dbgstr_w(fnd_loc));
|
|
|
|
CoTaskMemFree(fnd_tgt);
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
|
|
|
|
/* test invalid flags/params */
|
|
|
|
hres = IHlink_GetStringReference(link, 4, &fnd_tgt, &fnd_loc);
|
|
|
|
ok(hres == E_INVALIDARG, "IHlink_GetStringReference should have failed "
|
|
|
|
"with E_INVALIDARG (0x%08x), instead: 0x%08x\n", E_INVALIDARG, hres);
|
|
|
|
ok(fnd_tgt == NULL, "Found target should have been NULL, was: %s\n", wine_dbgstr_w(fnd_tgt));
|
|
|
|
ok(fnd_loc == NULL, "Found location should have been NULL, was: %s\n", wine_dbgstr_w(fnd_loc));
|
|
|
|
CoTaskMemFree(fnd_tgt);
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
|
2010-03-06 12:27:21 +00:00
|
|
|
hres = IHlink_GetStringReference(link, -1, &fnd_tgt, NULL);
|
|
|
|
todo_wine ok(hres == E_FAIL, "IHlink_GetStringReference should have failed "
|
|
|
|
"with E_FAIL (0x%08x), instead: 0x%08x\n", E_FAIL, hres);
|
|
|
|
CoTaskMemFree(fnd_tgt);
|
|
|
|
|
|
|
|
hres = IHlink_GetStringReference(link, -1, NULL, NULL);
|
|
|
|
ok(hres == S_OK, "failed, hres=%08x\n", hres);
|
|
|
|
|
|
|
|
hres = IHlink_GetStringReference(link, -1, NULL, &fnd_loc);
|
|
|
|
ok(hres == S_OK, "failed, hres=%08x\n", hres);
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
|
2010-03-03 19:44:02 +00:00
|
|
|
hres = IHlink_GetStringReference(link, -1, &fnd_tgt, &fnd_loc);
|
|
|
|
todo_wine ok(hres == E_FAIL, "IHlink_GetStringReference should have failed "
|
|
|
|
"with E_FAIL (0x%08x), instead: 0x%08x\n", E_FAIL, hres);
|
|
|
|
CoTaskMemFree(fnd_tgt);
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
|
|
|
|
hres = IHlink_GetStringReference(link, -2, &fnd_tgt, &fnd_loc);
|
|
|
|
ok(hres == E_INVALIDARG, "IHlink_GetStringReference should have failed "
|
|
|
|
"with E_INVALIDARG (0x%08x), instead: 0x%08x\n", E_INVALIDARG, hres);
|
|
|
|
CoTaskMemFree(fnd_tgt);
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
|
2012-01-27 12:14:09 +00:00
|
|
|
if (0)
|
|
|
|
{
|
|
|
|
/* Windows returns garbage; on 32-bit it returns the flags probably because the compiler happened to store them in %eax at some point */
|
|
|
|
IHlink_SetStringReference(link, 4, NULL, NULL);
|
|
|
|
IHlink_SetStringReference(link, -4, NULL, NULL);
|
|
|
|
}
|
2010-03-03 19:44:02 +00:00
|
|
|
|
|
|
|
IHlink_Release(link);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define setStringRef(h,f,t,l) r_setStringRef(__LINE__,h,f,t,l)
|
|
|
|
static void r_setStringRef(unsigned line, IHlink *hlink, DWORD flags, const WCHAR *tgt, const WCHAR *loc)
|
|
|
|
{
|
|
|
|
HRESULT hres;
|
|
|
|
hres = IHlink_SetStringReference(hlink, flags, tgt, loc);
|
|
|
|
ok_(__FILE__,line) (hres == S_OK, "IHlink_SetStringReference failed: 0x%08x\n", hres);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define getStringRef(h,t,l) r_getStringRef(__LINE__,h,t,l)
|
|
|
|
static void r_getStringRef(unsigned line, IHlink *hlink, const WCHAR *exp_tgt, const WCHAR *exp_loc)
|
|
|
|
{
|
|
|
|
HRESULT hres;
|
|
|
|
WCHAR *fnd_tgt, *fnd_loc;
|
|
|
|
|
|
|
|
hres = IHlink_GetStringReference(hlink, HLINKGETREF_DEFAULT, &fnd_tgt, &fnd_loc);
|
|
|
|
ok_(__FILE__,line) (hres == S_OK, "IHlink_GetStringReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
if(exp_tgt)
|
|
|
|
ok_(__FILE__,line) (!lstrcmpW(fnd_tgt, exp_tgt), "Found string target should have been %s, was: %s\n", wine_dbgstr_w(exp_tgt), wine_dbgstr_w(fnd_tgt));
|
|
|
|
else
|
Sync advapi32, comctl32, crypt32, cryptui, cryptnet, fusion, gdi32, gdiplus, hlink, imm32, jscript, kernel32, localspl, msacm32, mscms, msi, mstask, msvcrtd, msxml3, ntdll, ole32, pdh, psapi, quartz, rasapi32, riched20 AND rsaenh Winetests.
TBD mshtml, shell32, oleaut32 which still fail to build here
svn path=/trunk/; revision=47931
2010-07-03 12:45:23 +00:00
|
|
|
ok_(__FILE__,line) (fnd_tgt == NULL, "Found string target should have been NULL, was: %s\n", wine_dbgstr_w(fnd_tgt));
|
2010-03-03 19:44:02 +00:00
|
|
|
|
|
|
|
if(exp_loc)
|
|
|
|
ok_(__FILE__,line) (!lstrcmpW(fnd_loc, exp_loc), "Found string location should have been %s, was: %s\n", wine_dbgstr_w(exp_loc), wine_dbgstr_w(fnd_loc));
|
|
|
|
else
|
Sync advapi32, comctl32, crypt32, cryptui, cryptnet, fusion, gdi32, gdiplus, hlink, imm32, jscript, kernel32, localspl, msacm32, mscms, msi, mstask, msvcrtd, msxml3, ntdll, ole32, pdh, psapi, quartz, rasapi32, riched20 AND rsaenh Winetests.
TBD mshtml, shell32, oleaut32 which still fail to build here
svn path=/trunk/; revision=47931
2010-07-03 12:45:23 +00:00
|
|
|
ok_(__FILE__,line) (fnd_loc == NULL, "Found string location should have been NULL, was: %s\n", wine_dbgstr_w(fnd_loc));
|
2010-03-03 19:44:02 +00:00
|
|
|
|
|
|
|
CoTaskMemFree(fnd_tgt);
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
}
|
|
|
|
|
|
|
|
#define setMonikerRef(h,f,t,l) r_setMonikerRef(__LINE__,h,f,t,l)
|
|
|
|
static void r_setMonikerRef(unsigned line, IHlink *hlink, DWORD flags, IMoniker *tgt, const WCHAR *loc)
|
|
|
|
{
|
|
|
|
HRESULT hres;
|
|
|
|
hres = IHlink_SetMonikerReference(hlink, flags, tgt, loc);
|
|
|
|
ok_(__FILE__,line) (hres == S_OK, "IHlink_SetMonikerReference failed: 0x%08x\n", hres);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* passing 0xFFFFFFFF as exp_tgt will return the retrieved target & not test it */
|
2012-05-19 10:13:05 +00:00
|
|
|
#define getMonikerRef(h,t,l,r) r_getMonikerRef(__LINE__,h,t,l,r)
|
|
|
|
static IMoniker *r_getMonikerRef(unsigned line, IHlink *hlink, IMoniker *exp_tgt, const WCHAR *exp_loc, DWORD ref)
|
2010-03-03 19:44:02 +00:00
|
|
|
{
|
|
|
|
HRESULT hres;
|
|
|
|
IMoniker *fnd_tgt;
|
|
|
|
WCHAR *fnd_loc;
|
|
|
|
|
2012-05-19 10:13:05 +00:00
|
|
|
hres = IHlink_GetMonikerReference(hlink, ref, &fnd_tgt, &fnd_loc);
|
2010-03-03 19:44:02 +00:00
|
|
|
ok_(__FILE__,line) (hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
if(exp_loc)
|
|
|
|
ok_(__FILE__,line) (!lstrcmpW(fnd_loc, exp_loc), "Found string location should have been %s, was: %s\n", wine_dbgstr_w(exp_loc), wine_dbgstr_w(fnd_loc));
|
|
|
|
else
|
Sync advapi32, comctl32, crypt32, cryptui, cryptnet, fusion, gdi32, gdiplus, hlink, imm32, jscript, kernel32, localspl, msacm32, mscms, msi, mstask, msvcrtd, msxml3, ntdll, ole32, pdh, psapi, quartz, rasapi32, riched20 AND rsaenh Winetests.
TBD mshtml, shell32, oleaut32 which still fail to build here
svn path=/trunk/; revision=47931
2010-07-03 12:45:23 +00:00
|
|
|
ok_(__FILE__,line) (fnd_loc == NULL, "Found string location should have been NULL, was: %s\n", wine_dbgstr_w(fnd_loc));
|
2010-03-03 19:44:02 +00:00
|
|
|
|
|
|
|
CoTaskMemFree(fnd_loc);
|
|
|
|
|
|
|
|
if(exp_tgt == (IMoniker*)0xFFFFFFFF)
|
|
|
|
return fnd_tgt;
|
|
|
|
|
|
|
|
ok_(__FILE__,line) (fnd_tgt == exp_tgt, "Found moniker target should have been %p, was: %p\n", exp_tgt, fnd_tgt);
|
|
|
|
|
|
|
|
if(fnd_tgt)
|
|
|
|
IMoniker_Release(fnd_tgt);
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void test_HlinkMoniker(void)
|
|
|
|
{
|
|
|
|
IHlink *hlink;
|
|
|
|
IMoniker *aMon, *file_mon;
|
|
|
|
static const WCHAR emptyW[] = {0};
|
|
|
|
static const WCHAR wordsW[] = {'w','o','r','d','s',0};
|
|
|
|
static const WCHAR aW[] = {'a',0};
|
|
|
|
static const WCHAR bW[] = {'b',0};
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
hres = HlinkCreateFromString(NULL, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (void**)&hlink);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromString failed: 0x%08x\n", hres);
|
|
|
|
getStringRef(hlink, NULL, NULL);
|
2012-05-19 10:13:05 +00:00
|
|
|
getMonikerRef(hlink, NULL, NULL, HLINKGETREF_RELATIVE);
|
2010-03-03 19:44:02 +00:00
|
|
|
|
|
|
|
/* setting a string target creates a moniker reference */
|
|
|
|
setStringRef(hlink, HLINKSETF_TARGET | HLINKSETF_LOCATION, aW, wordsW);
|
|
|
|
getStringRef(hlink, aW, wordsW);
|
2012-05-19 10:13:05 +00:00
|
|
|
aMon = getMonikerRef(hlink, (IMoniker*)0xFFFFFFFF, wordsW, HLINKGETREF_RELATIVE);
|
2010-03-03 19:44:02 +00:00
|
|
|
ok(aMon != NULL, "Moniker from %s target should not be NULL\n", wine_dbgstr_w(aW));
|
|
|
|
if(aMon)
|
|
|
|
IMoniker_Release(aMon);
|
|
|
|
|
|
|
|
/* setting target & location to the empty string deletes the moniker
|
|
|
|
* reference */
|
|
|
|
setStringRef(hlink, HLINKSETF_TARGET | HLINKSETF_LOCATION, emptyW, emptyW);
|
|
|
|
getStringRef(hlink, NULL, NULL);
|
2012-05-19 10:13:05 +00:00
|
|
|
getMonikerRef(hlink, NULL, NULL, HLINKGETREF_RELATIVE);
|
2010-03-03 19:44:02 +00:00
|
|
|
|
|
|
|
/* setting a moniker target also sets the target string to that moniker's
|
|
|
|
* display name */
|
|
|
|
hres = CreateFileMoniker(bW, &file_mon);
|
|
|
|
ok(hres == S_OK, "CreateFileMoniker failed: 0x%08x\n", hres);
|
|
|
|
|
|
|
|
setMonikerRef(hlink, HLINKSETF_TARGET | HLINKSETF_LOCATION, file_mon, wordsW);
|
|
|
|
getStringRef(hlink, bW, wordsW);
|
2012-05-19 10:13:05 +00:00
|
|
|
getMonikerRef(hlink, file_mon, wordsW, HLINKGETREF_RELATIVE);
|
2010-03-03 19:44:02 +00:00
|
|
|
|
|
|
|
IMoniker_Release(file_mon);
|
|
|
|
|
|
|
|
IHlink_Release(hlink);
|
|
|
|
}
|
|
|
|
|
Sync advapi32, comctl32, crypt32, cryptui, cryptnet, fusion, gdi32, gdiplus, hlink, imm32, jscript, kernel32, localspl, msacm32, mscms, msi, mstask, msvcrtd, msxml3, ntdll, ole32, pdh, psapi, quartz, rasapi32, riched20 AND rsaenh Winetests.
TBD mshtml, shell32, oleaut32 which still fail to build here
svn path=/trunk/; revision=47931
2010-07-03 12:45:23 +00:00
|
|
|
static void test_HashLink(void)
|
|
|
|
{
|
|
|
|
IHlink *hlink;
|
|
|
|
IMoniker *pmk;
|
|
|
|
const WCHAR hash_targetW[] = {'a','f','i','l','e','#','a','n','a','n','c','h','o','r',0};
|
|
|
|
const WCHAR two_hash_targetW[] = {'a','f','i','l','e','#','a','n','a','n','c','h','o','r','#','a','n','o','t','h','e','r',0};
|
|
|
|
const WCHAR hash_no_tgtW[] = {'#','a','n','a','n','c','h','o','r',0};
|
|
|
|
const WCHAR tgt_partW[] = {'a','f','i','l','e',0};
|
|
|
|
const WCHAR loc_partW[] = {'a','n','a','n','c','h','o','r',0};
|
|
|
|
const WCHAR two_hash_loc_partW[] = {'a','n','a','n','c','h','o','r','#','a','n','o','t','h','e','r',0};
|
|
|
|
const WCHAR test_locW[] = {'t','e','s','t','l','o','c',0};
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
/* simple single hash test */
|
|
|
|
hres = HlinkCreateFromString(hash_targetW, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (void*)&hlink);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromString failed: 0x%08x\n", hres);
|
|
|
|
ok(hlink != NULL, "Didn't get an hlink\n");
|
|
|
|
|
|
|
|
if(hlink){
|
|
|
|
getStringRef(hlink, tgt_partW, loc_partW);
|
2012-05-19 10:13:05 +00:00
|
|
|
pmk = getMonikerRef(hlink, (IMoniker*)0xFFFFFFFF, loc_partW, HLINKGETREF_RELATIVE);
|
Sync advapi32, comctl32, crypt32, cryptui, cryptnet, fusion, gdi32, gdiplus, hlink, imm32, jscript, kernel32, localspl, msacm32, mscms, msi, mstask, msvcrtd, msxml3, ntdll, ole32, pdh, psapi, quartz, rasapi32, riched20 AND rsaenh Winetests.
TBD mshtml, shell32, oleaut32 which still fail to build here
svn path=/trunk/; revision=47931
2010-07-03 12:45:23 +00:00
|
|
|
ok(pmk != NULL, "Found moniker should not be NULL\n");
|
|
|
|
if(pmk)
|
|
|
|
IMoniker_Release(pmk);
|
|
|
|
|
|
|
|
setStringRef(hlink, HLINKSETF_TARGET, hash_targetW, NULL);
|
|
|
|
getStringRef(hlink, hash_targetW, loc_partW);
|
|
|
|
|
|
|
|
IHlink_Release(hlink);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* two hashes in the target */
|
|
|
|
hres = HlinkCreateFromString(two_hash_targetW, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (void*)&hlink);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromString failed: 0x%08x\n", hres);
|
|
|
|
ok(hlink != NULL, "Didn't get an hlink\n");
|
|
|
|
|
|
|
|
if(hlink){
|
|
|
|
getStringRef(hlink, tgt_partW, two_hash_loc_partW);
|
2012-05-19 10:13:05 +00:00
|
|
|
pmk = getMonikerRef(hlink, (IMoniker*)0xFFFFFFFF, two_hash_loc_partW, HLINKGETREF_RELATIVE);
|
Sync advapi32, comctl32, crypt32, cryptui, cryptnet, fusion, gdi32, gdiplus, hlink, imm32, jscript, kernel32, localspl, msacm32, mscms, msi, mstask, msvcrtd, msxml3, ntdll, ole32, pdh, psapi, quartz, rasapi32, riched20 AND rsaenh Winetests.
TBD mshtml, shell32, oleaut32 which still fail to build here
svn path=/trunk/; revision=47931
2010-07-03 12:45:23 +00:00
|
|
|
ok(pmk != NULL, "Found moniker should not be NULL\n");
|
|
|
|
if(pmk)
|
|
|
|
IMoniker_Release(pmk);
|
|
|
|
|
|
|
|
IHlink_Release(hlink);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* target with hash plus a location string */
|
|
|
|
hres = HlinkCreateFromString(hash_targetW, test_locW, NULL, NULL, 0, NULL, &IID_IHlink, (void*)&hlink);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromString failed: 0x%08x\n", hres);
|
|
|
|
ok(hlink != NULL, "Didn't get an hlink\n");
|
|
|
|
|
|
|
|
if(hlink){
|
|
|
|
getStringRef(hlink, tgt_partW, test_locW);
|
2012-05-19 10:13:05 +00:00
|
|
|
pmk = getMonikerRef(hlink, (IMoniker*)0xFFFFFFFF, test_locW, HLINKGETREF_RELATIVE);
|
Sync advapi32, comctl32, crypt32, cryptui, cryptnet, fusion, gdi32, gdiplus, hlink, imm32, jscript, kernel32, localspl, msacm32, mscms, msi, mstask, msvcrtd, msxml3, ntdll, ole32, pdh, psapi, quartz, rasapi32, riched20 AND rsaenh Winetests.
TBD mshtml, shell32, oleaut32 which still fail to build here
svn path=/trunk/; revision=47931
2010-07-03 12:45:23 +00:00
|
|
|
ok(pmk != NULL, "Found moniker should not be NULL\n");
|
|
|
|
if(pmk)
|
|
|
|
IMoniker_Release(pmk);
|
|
|
|
|
|
|
|
IHlink_Release(hlink);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* target with hash containing no "target part" */
|
|
|
|
hres = HlinkCreateFromString(hash_no_tgtW, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (void*)&hlink);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromString failed: 0x%08x\n", hres);
|
|
|
|
ok(hlink != NULL, "Didn't get an hlink\n");
|
|
|
|
|
|
|
|
if(hlink){
|
|
|
|
getStringRef(hlink, NULL, loc_partW);
|
2012-05-19 10:13:05 +00:00
|
|
|
pmk = getMonikerRef(hlink, (IMoniker*)0xFFFFFFFF, loc_partW, HLINKGETREF_RELATIVE);
|
Sync advapi32, comctl32, crypt32, cryptui, cryptnet, fusion, gdi32, gdiplus, hlink, imm32, jscript, kernel32, localspl, msacm32, mscms, msi, mstask, msvcrtd, msxml3, ntdll, ole32, pdh, psapi, quartz, rasapi32, riched20 AND rsaenh Winetests.
TBD mshtml, shell32, oleaut32 which still fail to build here
svn path=/trunk/; revision=47931
2010-07-03 12:45:23 +00:00
|
|
|
ok(pmk == NULL, "Found moniker should be NULL\n");
|
|
|
|
if(pmk)
|
|
|
|
IMoniker_Release(pmk);
|
|
|
|
|
|
|
|
IHlink_Release(hlink);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-22 21:18:59 +00:00
|
|
|
static const WCHAR site_monikerW[] = {'S','I','T','E','_','M','O','N','I','K','E','R',0};
|
|
|
|
static const WCHAR ref_monikerW[] = {'R','E','F','_','M','O','N','I','K','E','R',0};
|
2012-01-27 12:14:09 +00:00
|
|
|
|
|
|
|
static HRESULT WINAPI hls_test_Moniker_BindToStorage(IMoniker *iface,
|
|
|
|
IBindCtx *pbc, IMoniker *toLeft, REFIID riid, void **obj)
|
|
|
|
{
|
|
|
|
ok(0, "BTS: %p %p %p %p %p\n", iface, pbc, toLeft, riid, obj);
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hls_site_Moniker_ComposeWith(IMoniker *iface,
|
|
|
|
IMoniker *right, BOOL onlyIfNotGeneric, IMoniker **composite)
|
|
|
|
{
|
|
|
|
LPOLESTR rightName;
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
ok(onlyIfNotGeneric == 0, "Expected onlyIfNotGeneric to be FALSE\n");
|
|
|
|
|
|
|
|
CHECK_EXPECT(ComposeWith);
|
|
|
|
|
|
|
|
hres = IMoniker_GetDisplayName(right, NULL, NULL, &rightName);
|
|
|
|
ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres);
|
|
|
|
ok(!lstrcmpW(rightName, ref_monikerW),
|
|
|
|
"Expected to get moniker set via SetMonikerReference, instead got: %s\n",
|
|
|
|
wine_dbgstr_w(rightName));
|
|
|
|
CoTaskMemFree(rightName);
|
|
|
|
|
|
|
|
*composite = NULL;
|
|
|
|
|
|
|
|
/* unlikely error code to verify this return result is used */
|
|
|
|
return E_OUTOFMEMORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hls_site_Moniker_GetDisplayName(IMoniker *iface,
|
|
|
|
IBindCtx *pbc, IMoniker *toLeft, LPOLESTR *displayName)
|
|
|
|
{
|
|
|
|
*displayName = CoTaskMemAlloc(sizeof(site_monikerW));
|
|
|
|
memcpy(*displayName, site_monikerW, sizeof(site_monikerW));
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hls_ref_Moniker_GetDisplayName(IMoniker *iface,
|
|
|
|
IBindCtx *pbc, IMoniker *toLeft, LPOLESTR *displayName)
|
|
|
|
{
|
|
|
|
*displayName = CoTaskMemAlloc(sizeof(ref_monikerW));
|
|
|
|
memcpy(*displayName, ref_monikerW, sizeof(ref_monikerW));
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hls_test_Moniker_IsSystemMoniker(IMoniker *iface,
|
|
|
|
DWORD *mksys)
|
|
|
|
{
|
|
|
|
return S_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static IMonikerVtbl hls_site_MonikerVtbl = {
|
|
|
|
Moniker_QueryInterface,
|
|
|
|
Moniker_AddRef,
|
|
|
|
Moniker_Release,
|
|
|
|
Moniker_GetClassID,
|
|
|
|
Moniker_IsDirty,
|
|
|
|
Moniker_Load,
|
|
|
|
Moniker_Save,
|
|
|
|
Moniker_GetSizeMax,
|
|
|
|
Moniker_BindToObject,
|
|
|
|
hls_test_Moniker_BindToStorage,
|
|
|
|
Moniker_Reduce,
|
|
|
|
hls_site_Moniker_ComposeWith,
|
|
|
|
Moniker_Enum,
|
|
|
|
Moniker_IsEqual,
|
|
|
|
Moniker_Hash,
|
|
|
|
Moniker_IsRunning,
|
|
|
|
Moniker_GetTimeOfLastChange,
|
|
|
|
Moniker_Inverse,
|
|
|
|
Moniker_CommonPrefixWith,
|
|
|
|
Moniker_RelativePathTo,
|
|
|
|
hls_site_Moniker_GetDisplayName,
|
|
|
|
Moniker_ParseDisplayName,
|
|
|
|
hls_test_Moniker_IsSystemMoniker
|
|
|
|
};
|
|
|
|
|
|
|
|
static IMonikerVtbl hls_ref_MonikerVtbl = {
|
|
|
|
Moniker_QueryInterface,
|
|
|
|
Moniker_AddRef,
|
|
|
|
Moniker_Release,
|
|
|
|
Moniker_GetClassID,
|
|
|
|
Moniker_IsDirty,
|
|
|
|
Moniker_Load,
|
|
|
|
Moniker_Save,
|
|
|
|
Moniker_GetSizeMax,
|
|
|
|
Moniker_BindToObject,
|
|
|
|
hls_test_Moniker_BindToStorage,
|
|
|
|
Moniker_Reduce,
|
|
|
|
Moniker_ComposeWith,
|
|
|
|
Moniker_Enum,
|
|
|
|
Moniker_IsEqual,
|
|
|
|
Moniker_Hash,
|
|
|
|
Moniker_IsRunning,
|
|
|
|
Moniker_GetTimeOfLastChange,
|
|
|
|
Moniker_Inverse,
|
|
|
|
Moniker_CommonPrefixWith,
|
|
|
|
Moniker_RelativePathTo,
|
|
|
|
hls_ref_Moniker_GetDisplayName,
|
|
|
|
Moniker_ParseDisplayName,
|
|
|
|
hls_test_Moniker_IsSystemMoniker
|
|
|
|
};
|
|
|
|
|
|
|
|
static IMoniker hls_site_Moniker = { &hls_site_MonikerVtbl };
|
|
|
|
static IMoniker hls_ref_Moniker = { &hls_ref_MonikerVtbl };
|
|
|
|
|
|
|
|
static HRESULT WINAPI hls_QueryInterface(IHlinkSite *iface, REFGUID iid,
|
|
|
|
void **obj)
|
|
|
|
{
|
2014-04-22 21:18:59 +00:00
|
|
|
ok(0, "QI: %p %s %p\n", iface, wine_dbgstr_guid(iid), obj);
|
2012-01-27 12:14:09 +00:00
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI hls_AddRef(IHlinkSite *iface)
|
|
|
|
{
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI hls_Release(IHlinkSite *iface)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hls_QueryService(IHlinkSite *iface, DWORD siteData,
|
|
|
|
REFGUID service, REFIID riid, IUnknown **punk)
|
|
|
|
{
|
2014-04-22 21:18:59 +00:00
|
|
|
ok(0, "QS: %p %x %s %s %p\n", iface, siteData, wine_dbgstr_guid(service),
|
|
|
|
wine_dbgstr_guid(riid), punk);
|
2012-01-27 12:14:09 +00:00
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
2012-05-19 10:13:05 +00:00
|
|
|
#define SITEDATA_SUCCESS 1
|
|
|
|
#define SITEDATA_NOTIMPL 2
|
|
|
|
|
2012-01-27 12:14:09 +00:00
|
|
|
static HRESULT WINAPI hls_GetMoniker(IHlinkSite *iface, DWORD siteData,
|
|
|
|
DWORD assign, DWORD which, IMoniker **pmk)
|
|
|
|
{
|
2012-05-19 10:13:05 +00:00
|
|
|
ok(siteData == SITEDATA_NOTIMPL ||
|
|
|
|
siteData == SITEDATA_SUCCESS, "Unexpected site data: %u\n", siteData);
|
|
|
|
|
|
|
|
if(siteData == SITEDATA_SUCCESS){
|
|
|
|
*pmk = &hls_site_Moniker;
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
return E_NOTIMPL;
|
2012-01-27 12:14:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hls_ReadyToNavigate(IHlinkSite *iface, DWORD siteData,
|
|
|
|
DWORD reserved)
|
|
|
|
{
|
|
|
|
ok(0, "RTN: %p %x %x\n", iface, siteData, reserved);
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hls_OnNavigationComplete(IHlinkSite *iface,
|
|
|
|
DWORD siteData, DWORD reserved, HRESULT error, LPCWSTR errorStr)
|
|
|
|
{
|
|
|
|
CHECK_EXPECT(OnNavigationComplete);
|
2012-05-19 10:13:05 +00:00
|
|
|
ok(siteData == SITEDATA_SUCCESS, "Unexpected site data: %u\n", siteData);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(error == E_OUTOFMEMORY, "Expected E_OUTOFMEMORY, got: %08x\n", error);
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static IHlinkSiteVtbl HlinkSiteVtbl = {
|
|
|
|
hls_QueryInterface,
|
|
|
|
hls_AddRef,
|
|
|
|
hls_Release,
|
|
|
|
hls_QueryService,
|
|
|
|
hls_GetMoniker,
|
|
|
|
hls_ReadyToNavigate,
|
|
|
|
hls_OnNavigationComplete
|
|
|
|
};
|
|
|
|
|
|
|
|
static IHlinkSite HlinkSite = { &HlinkSiteVtbl };
|
|
|
|
|
|
|
|
static void test_HlinkSite(void)
|
|
|
|
{
|
|
|
|
IHlink *hl;
|
|
|
|
IMoniker *mon_ref;
|
|
|
|
IBindCtx *pbc;
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
hres = HlinkCreateFromString(NULL, NULL, NULL, NULL, 0, NULL,
|
|
|
|
&IID_IHlink, (LPVOID*)&hl);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromString failed: %08x\n", hres);
|
2012-05-19 10:13:05 +00:00
|
|
|
getMonikerRef(hl, NULL, NULL, HLINKGETREF_RELATIVE);
|
2012-01-27 12:14:09 +00:00
|
|
|
|
2012-05-19 10:13:05 +00:00
|
|
|
hres = IHlink_SetHlinkSite(hl, &HlinkSite, SITEDATA_SUCCESS);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hres == S_OK, "SetHlinkSite failed: %08x\n", hres);
|
2012-05-19 10:13:05 +00:00
|
|
|
getMonikerRef(hl, NULL, NULL, HLINKGETREF_RELATIVE);
|
2012-01-27 12:14:09 +00:00
|
|
|
getStringRef(hl, NULL, NULL);
|
|
|
|
|
|
|
|
hres = IHlink_GetMonikerReference(hl, HLINKGETREF_RELATIVE, &mon_ref, NULL);
|
|
|
|
ok(hres == S_OK, "GetMonikerReference failed: %08x\n", hres);
|
|
|
|
ok(mon_ref == NULL, "Didn't get expected moniker, instead: %p\n", mon_ref);
|
|
|
|
|
|
|
|
hres = IHlink_GetMonikerReference(hl, HLINKGETREF_ABSOLUTE, &mon_ref, NULL);
|
|
|
|
ok(hres == S_OK, "GetMonikerReference failed: %08x\n", hres);
|
|
|
|
ok(mon_ref == &hls_site_Moniker, "Didn't get expected moniker, instead: %p\n", mon_ref);
|
|
|
|
|
|
|
|
SET_EXPECT(Reduce);
|
|
|
|
SET_EXPECT(Enum);
|
|
|
|
hres = IHlink_SetMonikerReference(hl, HLINKSETF_TARGET, &hls_ref_Moniker, NULL);
|
|
|
|
ok(hres == S_OK, "SetMonikerReference failed: %08x\n", hres);
|
|
|
|
todo_wine CHECK_CALLED(Reduce);
|
|
|
|
todo_wine CHECK_CALLED(Enum);
|
|
|
|
|
2012-05-19 10:13:05 +00:00
|
|
|
getMonikerRef(hl, &hls_ref_Moniker, NULL, HLINKGETREF_RELATIVE);
|
2012-01-27 12:14:09 +00:00
|
|
|
|
|
|
|
SET_EXPECT(Enum);
|
|
|
|
getStringRef(hl, ref_monikerW, NULL);
|
|
|
|
todo_wine CHECK_CALLED(Enum);
|
|
|
|
|
|
|
|
hres = IHlink_GetMonikerReference(hl, HLINKGETREF_RELATIVE, &mon_ref, NULL);
|
|
|
|
ok(hres == S_OK, "GetMonikerReference failed: %08x\n", hres);
|
|
|
|
ok(mon_ref == &hls_ref_Moniker, "Didn't get expected moniker, instead: %p\n", mon_ref);
|
|
|
|
IMoniker_Release(mon_ref);
|
|
|
|
|
|
|
|
SET_EXPECT(ComposeWith);
|
|
|
|
hres = IHlink_GetMonikerReference(hl, HLINKGETREF_ABSOLUTE, &mon_ref, NULL);
|
|
|
|
ok(hres == E_OUTOFMEMORY, "Expected E_OUTOFMEMORY, got: %08x\n", hres);
|
|
|
|
ok(mon_ref == NULL, "Shouldn't have got a Moniker, got: %p\n", mon_ref);
|
|
|
|
CHECK_CALLED(ComposeWith);
|
|
|
|
|
|
|
|
hres = CreateBindCtx(0, &pbc);
|
|
|
|
ok(hres == S_OK, "CreateBindCtx failed: %08x\n", hres);
|
|
|
|
|
|
|
|
SET_EXPECT(ComposeWith);
|
|
|
|
SET_EXPECT(OnNavigationComplete);
|
|
|
|
hres = IHlink_Navigate(hl, 0, pbc, NULL, NULL);
|
|
|
|
ok(hres == E_OUTOFMEMORY, "Navigate should've failed: %08x\n", hres);
|
|
|
|
CHECK_CALLED(ComposeWith);
|
|
|
|
CHECK_CALLED(OnNavigationComplete);
|
|
|
|
|
|
|
|
IBindCtx_Release(pbc);
|
|
|
|
IHlink_Release(hl);
|
|
|
|
|
|
|
|
SET_EXPECT(Reduce);
|
|
|
|
SET_EXPECT(Enum);
|
2012-05-19 10:13:05 +00:00
|
|
|
hres = HlinkCreateFromMoniker(&hls_ref_Moniker, NULL, NULL, &HlinkSite, SITEDATA_SUCCESS,
|
2012-01-27 12:14:09 +00:00
|
|
|
NULL, &IID_IHlink, (LPVOID*)&hl);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromMoniker failed: %08x\n", hres);
|
|
|
|
todo_wine CHECK_CALLED(Reduce);
|
|
|
|
todo_wine CHECK_CALLED(Enum);
|
2012-05-19 10:13:05 +00:00
|
|
|
getMonikerRef(hl, &hls_ref_Moniker, NULL, HLINKGETREF_RELATIVE);
|
2012-01-27 12:14:09 +00:00
|
|
|
IHlink_Release(hl);
|
|
|
|
|
2012-05-19 10:13:05 +00:00
|
|
|
hres = HlinkCreateFromMoniker(NULL, NULL, NULL, &HlinkSite, SITEDATA_SUCCESS,
|
|
|
|
NULL, &IID_IHlink, (LPVOID*)&hl);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromMoniker failed: %08x\n", hres);
|
|
|
|
getMonikerRef(hl, NULL, NULL, HLINKGETREF_RELATIVE);
|
|
|
|
IHlink_Release(hl);
|
|
|
|
|
|
|
|
SET_EXPECT(Reduce);
|
|
|
|
SET_EXPECT(Enum);
|
|
|
|
SET_EXPECT(IsSystemMoniker);
|
|
|
|
SET_EXPECT(GetDisplayName);
|
|
|
|
hres = HlinkCreateFromMoniker(&Moniker, NULL, NULL, &HlinkSite, SITEDATA_NOTIMPL,
|
2012-01-27 12:14:09 +00:00
|
|
|
NULL, &IID_IHlink, (LPVOID*)&hl);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromMoniker failed: %08x\n", hres);
|
2012-05-19 10:13:05 +00:00
|
|
|
getMonikerRef(hl, &Moniker, NULL, HLINKGETREF_ABSOLUTE);
|
2012-01-27 12:14:09 +00:00
|
|
|
IHlink_Release(hl);
|
2012-05-19 10:13:05 +00:00
|
|
|
todo_wine CHECK_CALLED(Reduce);
|
|
|
|
todo_wine CHECK_CALLED(Enum);
|
|
|
|
CHECK_CALLED(IsSystemMoniker);
|
|
|
|
CHECK_CALLED(GetDisplayName);
|
2012-01-27 12:14:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void test_HlinkClone(void)
|
|
|
|
{
|
|
|
|
HRESULT hres;
|
|
|
|
IHlink *hl, *cloned = NULL;
|
|
|
|
IMoniker *dummy, *fnd_mk;
|
|
|
|
IHlinkSite *fnd_site;
|
|
|
|
WCHAR *fnd_name;
|
|
|
|
DWORD fnd_data;
|
|
|
|
const WCHAR one[] = {'1',0};
|
|
|
|
const WCHAR two[] = {'2',0};
|
|
|
|
const WCHAR name[] = {'a',0};
|
|
|
|
|
|
|
|
hres = HlinkClone(NULL, NULL, NULL, 0, NULL);
|
|
|
|
ok(hres == E_INVALIDARG, "Got wrong failure code: %08x\n", hres);
|
|
|
|
|
|
|
|
hres = HlinkCreateFromString(NULL, NULL, NULL, NULL, 0, NULL,
|
|
|
|
&IID_IHlink, (void**)&hl);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromString failed: %08x\n", hres);
|
|
|
|
|
|
|
|
hres = HlinkClone(hl, &IID_IHlink, NULL, 0, NULL);
|
|
|
|
ok(hres == E_INVALIDARG, "Got wrong failure code: %08x\n", hres);
|
|
|
|
|
|
|
|
if (0)
|
|
|
|
{
|
|
|
|
/* crash on Windows XP */
|
|
|
|
HlinkClone(hl, NULL, NULL, 0, NULL);
|
|
|
|
|
|
|
|
HlinkClone(hl, NULL, NULL, 0, (void**)&cloned);
|
|
|
|
}
|
|
|
|
|
|
|
|
hres = HlinkClone(hl, &IID_IHlink, NULL, 0, (void**)&cloned);
|
|
|
|
ok(hres == S_OK, "HlinkClone failed: %08x\n", hres);
|
|
|
|
ok(cloned != NULL, "Didn't get a clone\n");
|
2012-05-19 10:13:05 +00:00
|
|
|
getMonikerRef(cloned, NULL, NULL, HLINKGETREF_RELATIVE);
|
2012-01-27 12:14:09 +00:00
|
|
|
IHlink_Release(cloned);
|
|
|
|
|
|
|
|
IHlink_Release(hl);
|
|
|
|
|
|
|
|
SET_EXPECT(Reduce);
|
|
|
|
SET_EXPECT(Enum);
|
|
|
|
hres = HlinkCreateFromMoniker(&hls_ref_Moniker, two, NULL, NULL, 0, NULL, &IID_IHlink, (void**)&hl);
|
|
|
|
todo_wine CHECK_CALLED(Reduce);
|
|
|
|
todo_wine CHECK_CALLED(Enum);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromMoniker failed: 0x%08x\n", hres);
|
2012-05-19 10:13:05 +00:00
|
|
|
getMonikerRef(hl, &hls_ref_Moniker, two, HLINKGETREF_RELATIVE);
|
2012-01-27 12:14:09 +00:00
|
|
|
|
|
|
|
SET_EXPECT(Save);
|
|
|
|
SET_EXPECT(GetClassID);
|
|
|
|
cloned = (IHlink*)0xdeadbeef;
|
|
|
|
hres = HlinkClone(hl, &IID_IHlink, NULL, 0, (void**)&cloned);
|
|
|
|
/* fails because of invalid CLSID given by Moniker_GetClassID */
|
|
|
|
ok(hres == REGDB_E_CLASSNOTREG, "Wrong error code: %08x\n", hres);
|
|
|
|
ok(cloned == NULL, "Shouldn't have gotten a clone\n");
|
|
|
|
CHECK_CALLED(Save);
|
|
|
|
CHECK_CALLED(GetClassID);
|
|
|
|
|
|
|
|
IHlink_Release(hl);
|
|
|
|
|
|
|
|
hres = CreateItemMoniker(one, one, &dummy);
|
|
|
|
ok(hres == S_OK, "CreateItemMoniker failed: 0x%08x\n", hres);
|
|
|
|
|
2012-05-19 10:13:05 +00:00
|
|
|
hres = HlinkCreateFromMoniker(dummy, two, name, &HlinkSite, SITEDATA_SUCCESS, NULL, &IID_IHlink, (void**)&hl);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hres == S_OK, "HlinkCreateFromMoniker failed: 0x%08x\n", hres);
|
2012-05-19 10:13:05 +00:00
|
|
|
getMonikerRef(hl, dummy, two, HLINKGETREF_RELATIVE);
|
2012-01-27 12:14:09 +00:00
|
|
|
|
|
|
|
cloned = NULL;
|
|
|
|
hres = HlinkClone(hl, &IID_IHlink, NULL, 0, (void**)&cloned);
|
|
|
|
ok(hres == S_OK, "HlinkClone failed: %08x\n", hres);
|
|
|
|
ok(cloned != NULL, "Should have gotten a clone\n");
|
|
|
|
|
2012-05-19 10:13:05 +00:00
|
|
|
fnd_mk = getMonikerRef(cloned, (IMoniker*)0xFFFFFFFF, two, HLINKGETREF_RELATIVE);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(fnd_mk != NULL, "Expected non-null Moniker\n");
|
|
|
|
ok(fnd_mk != dummy, "Expected a new Moniker to be created\n");
|
|
|
|
|
|
|
|
fnd_name = NULL;
|
|
|
|
hres = IHlink_GetFriendlyName(cloned, HLFNAMEF_DEFAULT, &fnd_name);
|
|
|
|
ok(hres == S_OK, "GetFriendlyName failed: %08x\n", hres);
|
|
|
|
ok(fnd_name != NULL, "Expected friendly name to be non-NULL\n");
|
|
|
|
ok(lstrcmpW(fnd_name, name) == 0, "Expected friendly name to be %s, was %s\n",
|
|
|
|
wine_dbgstr_w(name), wine_dbgstr_w(fnd_name));
|
|
|
|
CoTaskMemFree(fnd_name);
|
|
|
|
|
|
|
|
fnd_site = (IHlinkSite*)0xdeadbeef;
|
|
|
|
fnd_data = 4;
|
|
|
|
hres = IHlink_GetHlinkSite(cloned, &fnd_site, &fnd_data);
|
|
|
|
ok(hres == S_OK, "GetHlinkSite failed: %08x\n", hres);
|
|
|
|
ok(fnd_site == NULL, "Expected NULL site\n");
|
|
|
|
ok(fnd_data == 4, "Expected site data to be 4, was: %d\n", fnd_data);
|
|
|
|
|
|
|
|
IHlink_Release(cloned);
|
|
|
|
IHlink_Release(hl);
|
|
|
|
|
|
|
|
hres = HlinkCreateFromMoniker(dummy, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (void**)&hl);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromMoniker failed: 0x%08x\n", hres);
|
2012-05-19 10:13:05 +00:00
|
|
|
getMonikerRef(hl, dummy, NULL, HLINKGETREF_RELATIVE);
|
2012-01-27 12:14:09 +00:00
|
|
|
|
|
|
|
cloned = NULL;
|
2012-05-19 10:13:05 +00:00
|
|
|
hres = HlinkClone(hl, &IID_IHlink, &HlinkSite, SITEDATA_SUCCESS, (void**)&cloned);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(hres == S_OK, "HlinkClone failed: %08x\n", hres);
|
|
|
|
ok(cloned != NULL, "Should have gotten a clone\n");
|
|
|
|
|
2012-05-19 10:13:05 +00:00
|
|
|
fnd_mk = getMonikerRef(cloned, (IMoniker*)0xFFFFFFFF, NULL, HLINKGETREF_RELATIVE);
|
2012-01-27 12:14:09 +00:00
|
|
|
ok(fnd_mk != NULL, "Expected non-null Moniker\n");
|
|
|
|
ok(fnd_mk != dummy, "Expected a new Moniker to be created\n");
|
|
|
|
|
|
|
|
fnd_site = (IHlinkSite*)0xdeadbeef;
|
|
|
|
fnd_data = 4;
|
|
|
|
hres = IHlink_GetHlinkSite(cloned, &fnd_site, &fnd_data);
|
|
|
|
ok(hres == S_OK, "GetHlinkSite failed: %08x\n", hres);
|
|
|
|
ok(fnd_site == &HlinkSite, "Expected found site to be HlinkSite, was: %p\n", fnd_site);
|
2012-05-19 10:13:05 +00:00
|
|
|
ok(fnd_data == SITEDATA_SUCCESS, "Unexpected site data: %u\n", fnd_data);
|
2012-01-27 12:14:09 +00:00
|
|
|
|
|
|
|
IHlink_Release(cloned);
|
|
|
|
IHlink_Release(hl);
|
|
|
|
|
|
|
|
IMoniker_Release(dummy);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void test_StdHlink(void)
|
|
|
|
{
|
|
|
|
IHlink *hlink;
|
|
|
|
WCHAR *str;
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
static const WCHAR testW[] = {'t','e','s','t',0};
|
|
|
|
|
|
|
|
hres = CoCreateInstance(&CLSID_StdHlink, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
|
|
|
|
&IID_IHlink, (void**)&hlink);
|
|
|
|
ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
|
|
|
|
|
|
|
|
str = (void*)0xdeadbeef;
|
|
|
|
hres = IHlink_GetTargetFrameName(hlink, &str);
|
|
|
|
ok(hres == S_FALSE, "GetTargetFrameName failed: %08x\n", hres);
|
|
|
|
ok(!str, "str = %s\n", wine_dbgstr_w(str));
|
|
|
|
|
|
|
|
hres = IHlink_SetTargetFrameName(hlink, testW);
|
|
|
|
ok(hres == S_OK, "SetTargetFrameName failed: %08x\n", hres);
|
|
|
|
|
|
|
|
str = (void*)0xdeadbeef;
|
|
|
|
hres = IHlink_GetTargetFrameName(hlink, &str);
|
|
|
|
ok(hres == S_OK, "GetTargetFrameName failed: %08x\n", hres);
|
|
|
|
ok(!lstrcmpW(str, testW), "str = %s\n", wine_dbgstr_w(str));
|
|
|
|
CoTaskMemFree(str);
|
|
|
|
|
|
|
|
hres = IHlink_SetTargetFrameName(hlink, NULL);
|
|
|
|
ok(hres == S_OK, "SetTargetFrameName failed: %08x\n", hres);
|
|
|
|
|
|
|
|
str = (void*)0xdeadbeef;
|
|
|
|
hres = IHlink_GetTargetFrameName(hlink, &str);
|
|
|
|
ok(hres == S_FALSE, "GetTargetFrameName failed: %08x\n", hres);
|
|
|
|
ok(!str, "str = %s\n", wine_dbgstr_w(str));
|
|
|
|
|
|
|
|
IHlink_Release(hlink);
|
|
|
|
}
|
|
|
|
|
2013-09-19 16:12:38 +00:00
|
|
|
static void test_Hlink_Navigate(void)
|
|
|
|
{
|
|
|
|
IHlink *hlink;
|
|
|
|
IBindCtx *pbc;
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
hres = CreateBindCtx(0, &pbc);
|
|
|
|
ok(hres == S_OK, "CreateBindCtx failed: %08x\n", hres);
|
|
|
|
_bctx = pbc;
|
|
|
|
|
|
|
|
SET_EXPECT(Reduce);
|
|
|
|
SET_EXPECT(Enum);
|
|
|
|
SET_EXPECT(IsSystemMoniker);
|
|
|
|
SET_EXPECT(GetDisplayName);
|
|
|
|
hres = HlinkCreateFromMoniker(&Moniker, NULL, NULL, NULL,
|
|
|
|
0, NULL, &IID_IHlink, (void**)&hlink);
|
|
|
|
ok(hres == S_OK, "HlinkCreateFromMoniker failed: %08x\n", hres);
|
|
|
|
todo_wine CHECK_CALLED(Reduce);
|
|
|
|
todo_wine CHECK_CALLED(Enum);
|
|
|
|
todo_wine CHECK_CALLED(IsSystemMoniker);
|
|
|
|
CHECK_CALLED(GetDisplayName);
|
|
|
|
|
|
|
|
SET_EXPECT(IsSystemMoniker);
|
|
|
|
SET_EXPECT(GetDisplayName);
|
|
|
|
SET_EXPECT(HBC_GetObject);
|
|
|
|
SET_EXPECT(Reduce);
|
|
|
|
SET_EXPECT(BindToObject);
|
|
|
|
SET_EXPECT(HT_GetBrowseContext);
|
|
|
|
SET_EXPECT(HT_SetBrowseContext);
|
|
|
|
SET_EXPECT(HBC_QueryInterface_IHlinkHistory);
|
|
|
|
SET_EXPECT(HT_Navigate);
|
|
|
|
SET_EXPECT(HT_GetFriendlyName);
|
|
|
|
hres = IHlink_Navigate(hlink, 0, pbc, NULL, &HlinkBrowseContext);
|
|
|
|
ok(hres == S_OK, "Navigate failed: %08x\n", hres);
|
|
|
|
CHECK_CALLED(IsSystemMoniker);
|
|
|
|
todo_wine CHECK_CALLED(GetDisplayName);
|
|
|
|
todo_wine CHECK_CALLED(HBC_GetObject);
|
|
|
|
todo_wine CHECK_CALLED(Reduce);
|
|
|
|
CHECK_CALLED(BindToObject);
|
|
|
|
todo_wine CHECK_CALLED(HT_GetBrowseContext);
|
|
|
|
CHECK_CALLED(HT_SetBrowseContext);
|
|
|
|
todo_wine CHECK_CALLED(HBC_QueryInterface_IHlinkHistory);
|
|
|
|
CHECK_CALLED(HT_Navigate);
|
|
|
|
todo_wine CHECK_CALLED(HT_GetFriendlyName);
|
|
|
|
|
|
|
|
IHlink_Release(hlink);
|
|
|
|
IBindCtx_Release(pbc);
|
|
|
|
_bctx = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hlinkframe_QueryInterface(IHlinkFrame *iface, REFIID riid, void **obj)
|
|
|
|
{
|
|
|
|
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IHlinkFrame))
|
|
|
|
{
|
|
|
|
*obj = iface;
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
*obj = NULL;
|
|
|
|
return E_NOINTERFACE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI hlinkframe_AddRef(IHlinkFrame *iface)
|
|
|
|
{
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI hlinkframe_Release(IHlinkFrame *iface)
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hlinkframe_SetBrowseContext(IHlinkFrame *iface, IHlinkBrowseContext *bc)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected %p\n", bc);
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hlinkframe_GetBrowseContext(IHlinkFrame *iface, IHlinkBrowseContext **bc)
|
|
|
|
{
|
|
|
|
*bc = NULL;
|
|
|
|
ok(0, "unexpected %p\n", bc);
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hlinkframe_Navigate(IHlinkFrame *iface, DWORD grfHLNF, LPBC pbc, IBindStatusCallback *bsc, IHlink *navigate)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hlinkframe_OnNavigate(IHlinkFrame *iface, DWORD grfHLNF, IMoniker *target, LPCWSTR location, LPCWSTR friendly_name,
|
|
|
|
DWORD reserved)
|
|
|
|
{
|
|
|
|
ok(0, "unexpected\n");
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI hlinkframe_UpdateHlink(IHlinkFrame *iface, ULONG uHLID, IMoniker *target, LPCWSTR location, LPCWSTR friendly_name)
|
|
|
|
{
|
|
|
|
CHECK_EXPECT(HLF_UpdateHlink);
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static IHlinkFrameVtbl hlinkframevtbl = {
|
|
|
|
hlinkframe_QueryInterface,
|
|
|
|
hlinkframe_AddRef,
|
|
|
|
hlinkframe_Release,
|
|
|
|
hlinkframe_SetBrowseContext,
|
|
|
|
hlinkframe_GetBrowseContext,
|
|
|
|
hlinkframe_Navigate,
|
|
|
|
hlinkframe_OnNavigate,
|
|
|
|
hlinkframe_UpdateHlink
|
|
|
|
};
|
|
|
|
|
|
|
|
static IHlinkFrame testframe = { &hlinkframevtbl };
|
|
|
|
|
|
|
|
static void test_HlinkUpdateStackItem(void)
|
|
|
|
{
|
|
|
|
static const WCHAR location[] = {'l','o','c','a','t','i','o','n',0};
|
|
|
|
HRESULT hr;
|
|
|
|
|
|
|
|
hr = HlinkUpdateStackItem(NULL, NULL, HLID_CURRENT, &Moniker, location, NULL);
|
|
|
|
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
|
|
|
|
|
|
|
|
SET_EXPECT(HBC_UpdateHlink);
|
|
|
|
hr = HlinkUpdateStackItem(NULL, &HlinkBrowseContext, HLID_CURRENT, &Moniker, location, NULL);
|
|
|
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
|
|
|
CHECK_CALLED(HBC_UpdateHlink);
|
|
|
|
|
|
|
|
SET_EXPECT(HLF_UpdateHlink);
|
|
|
|
hr = HlinkUpdateStackItem(&testframe, &HlinkBrowseContext, HLID_CURRENT, &Moniker, location, NULL);
|
|
|
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
|
|
|
CHECK_CALLED(HLF_UpdateHlink);
|
|
|
|
}
|
|
|
|
|
2008-01-14 17:07:49 +00:00
|
|
|
START_TEST(hlink)
|
|
|
|
{
|
|
|
|
CoInitialize(NULL);
|
|
|
|
|
|
|
|
test_HlinkIsShortcut();
|
|
|
|
test_reference();
|
|
|
|
test_persist();
|
|
|
|
test_special_reference();
|
|
|
|
test_HlinkCreateExtensionServices();
|
2008-04-04 16:43:16 +00:00
|
|
|
test_HlinkParseDisplayName();
|
|
|
|
test_HlinkResolveMonikerForData();
|
2009-12-22 11:40:11 +00:00
|
|
|
test_HlinkGetSetMonikerReference();
|
2010-03-03 19:44:02 +00:00
|
|
|
test_HlinkGetSetStringReference();
|
|
|
|
test_HlinkMoniker();
|
Sync advapi32, comctl32, crypt32, cryptui, cryptnet, fusion, gdi32, gdiplus, hlink, imm32, jscript, kernel32, localspl, msacm32, mscms, msi, mstask, msvcrtd, msxml3, ntdll, ole32, pdh, psapi, quartz, rasapi32, riched20 AND rsaenh Winetests.
TBD mshtml, shell32, oleaut32 which still fail to build here
svn path=/trunk/; revision=47931
2010-07-03 12:45:23 +00:00
|
|
|
test_HashLink();
|
2012-01-27 12:14:09 +00:00
|
|
|
test_HlinkSite();
|
|
|
|
test_HlinkClone();
|
|
|
|
test_StdHlink();
|
2013-09-19 16:12:38 +00:00
|
|
|
test_Hlink_Navigate();
|
|
|
|
test_HlinkUpdateStackItem();
|
2008-01-14 17:07:49 +00:00
|
|
|
|
|
|
|
CoUninitialize();
|
|
|
|
}
|