wine/dlls/shell32 tests/shelllink.c shelllink.c
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Nov 4 05:40:58 CST 2005
ChangeSet ID: 21112
CVSROOT: /opt/cvs-commit
Module name: wine
Changes by: julliard at winehq.org 2005/11/04 05:40:58
Modified files:
dlls/shell32/tests: shelllink.c
dlls/shell32 : shelllink.c
Log message:
Mike McCormack <mike at codeweavers.com>
Partially implement and test the shelllink object's
IShellLinkDataList::CopyDataBlock and GetFlags methods.
Patch: http://cvs.winehq.org/patch.py?id=21112
Old revision New revision Changes Path
1.8 1.9 +73 -0 wine/dlls/shell32/tests/shelllink.c
1.111 1.112 +62 -11 wine/dlls/shell32/shelllink.c
Index: wine/dlls/shell32/tests/shelllink.c
diff -u -p wine/dlls/shell32/tests/shelllink.c:1.8 wine/dlls/shell32/tests/shelllink.c:1.9
--- wine/dlls/shell32/tests/shelllink.c:1.8 4 Nov 2005 11:40:58 -0000
+++ wine/dlls/shell32/tests/shelllink.c 4 Nov 2005 11:40:58 -0000
@@ -511,6 +511,78 @@ static void test_load_save(void)
ok(r, "failed to delete link (%ld)\n", GetLastError());
}
+static void test_datalink(void)
+{
+ static const WCHAR lnk[] = {
+ ':',':','{','9','d','b','1','1','8','6','f','-','4','0','d','f','-','1',
+ '1','d','1','-','a','a','8','c','-','0','0','c','0','4','f','b','6','7',
+ '8','6','3','}',':','{','0','0','0','1','0','4','0','9','-','7','8','E',
+ '1','-','1','1','D','2','-','B','6','0','F','-','0','0','6','0','9','7',
+ 'C','9','9','8','E','7','}',':',':','{','9','d','b','1','1','8','6','e',
+ '-','4','0','d','f','-','1','1','d','1','-','a','a','8','c','-','0','0',
+ 'c','0','4','f','b','6','7','8','6','3','}',':','2','6',',','!','!','g',
+ 'x','s','f','(','N','g',']','q','F','`','H','{','L','s','A','C','C','E',
+ 'S','S','F','i','l','e','s','>','p','l','T',']','j','I','{','j','f','(',
+ '=','1','&','L','[','-','8','1','-',']',':',':',0 };
+ static const WCHAR comp[] = {
+ '2','6',',','!','!','g','x','s','f','(','N','g',']','q','F','`','H','{',
+ 'L','s','A','C','C','E','S','S','F','i','l','e','s','>','p','l','T',']',
+ 'j','I','{','j','f','(','=','1','&','L','[','-','8','1','-',']',0 };
+ IShellLinkDataList *dl = NULL;
+ IShellLinkW *sl = NULL;
+ HRESULT r;
+ DWORD flags = 0;
+ EXP_DARWIN_LINK *dar;
+
+ r = CoCreateInstance( &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IShellLinkW, (LPVOID*)&sl );
+ ok( r == S_OK, "no shelllink\n");
+ if (!sl)
+ return;
+
+ r = IShellLinkW_QueryInterface( sl, &IID_IShellLinkDataList, (LPVOID*) &dl );
+ ok(r == S_OK, "no datalink interface\n");
+
+ if (!dl)
+ return;
+
+ flags = 0;
+ r = dl->lpVtbl->GetFlags( dl, &flags );
+ ok( r == S_OK, "GetFlags failed\n");
+ ok( flags == 0, "GetFlags returned wrong flags\n");
+
+ dar = (void*)-1;
+ r = dl->lpVtbl->CopyDataBlock( dl, EXP_DARWIN_ID_SIG, (LPVOID*) &dar );
+ ok( r == E_FAIL, "CopyDataBlock failed\n");
+ ok( dar == NULL, "should be null\n");
+
+ r = IShellLinkW_SetPath(sl, lnk);
+ ok(r == S_OK, "set path failed\n");
+
+ /*
+ * The following crashes:
+ * r = dl->lpVtbl->GetFlags( dl, NULL );
+ */
+
+ flags = 0;
+ r = dl->lpVtbl->GetFlags( dl, &flags );
+ ok( r == S_OK, "GetFlags failed\n");
+ ok( flags == (SLDF_HAS_DARWINID|SLDF_HAS_LOGO3ID),
+ "GetFlags returned wrong flags\n");
+
+ dar = NULL;
+ r = dl->lpVtbl->CopyDataBlock( dl, EXP_DARWIN_ID_SIG, (LPVOID*) &dar );
+ ok( r == S_OK, "CopyDataBlock failed\n");
+
+ ok( dar && dar->dbh.dwSignature == EXP_DARWIN_ID_SIG, "signature wrong\n");
+ ok( dar && 0==lstrcmpW(dar->szwDarwinID, comp ), "signature wrong\n");
+
+ LocalFree( dar );
+
+ IUnknown_Release( dl );
+ IShellLinkW_Release( sl );
+}
+
START_TEST(shelllink)
{
HRESULT r;
@@ -522,6 +594,7 @@ START_TEST(shelllink)
test_get_set();
test_load_save();
+ test_datalink();
CoUninitialize();
}
Index: wine/dlls/shell32/shelllink.c
diff -u -p wine/dlls/shell32/shelllink.c:1.111 wine/dlls/shell32/shelllink.c:1.112
--- wine/dlls/shell32/shelllink.c:1.111 4 Nov 2005 11:40:58 -0000
+++ wine/dlls/shell32/shelllink.c 4 Nov 2005 11:40:58 -0000
@@ -1014,20 +1014,29 @@ static HRESULT Stream_WriteLocationInfo(
return IStream_Write( stm, loc, total_size, &count );
}
+static EXP_DARWIN_LINK* shelllink_build_darwinid( LPCWSTR string, DWORD magic )
+{
+ EXP_DARWIN_LINK *buffer;
+
+ buffer = LocalAlloc( LMEM_ZEROINIT, sizeof *buffer );
+ buffer->dbh.cbSize = sizeof buffer;
+ buffer->dbh.dwSignature = magic;
+ lstrcpynW( buffer->szwDarwinID, string, MAX_PATH );
+ WideCharToMultiByte(CP_ACP, 0, string, -1, buffer->szDarwinID, MAX_PATH, NULL, NULL );
+
+ return buffer;
+}
+
static HRESULT Stream_WriteAdvertiseInfo( IStream* stm, LPCWSTR string, DWORD magic )
{
+ EXP_DARWIN_LINK *buffer;
ULONG count;
- EXP_DARWIN_LINK buffer;
TRACE("%p\n",stm);
- memset( &buffer, 0, sizeof buffer );
- buffer.dbh.cbSize = sizeof buffer;
- buffer.dbh.dwSignature = magic;
- lstrcpynW( buffer.szwDarwinID, string, MAX_PATH );
- WideCharToMultiByte(CP_ACP, 0, string, -1, buffer.szDarwinID, MAX_PATH, NULL, NULL );
+ buffer = shelllink_build_darwinid( string, magic );
- return IStream_Write( stm, &buffer, buffer.dbh.cbSize, &count );
+ return IStream_Write( stm, &buffer, buffer->dbh.cbSize, &count );
}
/************************************************************************
@@ -2246,8 +2255,32 @@ ShellLink_AddDataBlock( IShellLinkDataLi
static HRESULT WINAPI
ShellLink_CopyDataBlock( IShellLinkDataList* iface, DWORD dwSig, void** ppDataBlock )
{
- FIXME("\n");
- return E_NOTIMPL;
+ IShellLinkImpl *This = impl_from_IShellLinkDataList(iface);
+ LPVOID block = NULL;
+ HRESULT r = E_FAIL;
+
+ TRACE("%p %08lx %p\n", iface, dwSig, ppDataBlock );
+
+ switch (dwSig)
+ {
+ case EXP_DARWIN_ID_SIG:
+ if (!This->sComponent)
+ break;
+ block = shelllink_build_darwinid( This->sComponent, dwSig );
+ r = S_OK;
+ break;
+ case EXP_SZ_LINK_SIG:
+ case NT_CONSOLE_PROPS_SIG:
+ case NT_FE_CONSOLE_PROPS_SIG:
+ case EXP_SPECIAL_FOLDER_SIG:
+ case EXP_SZ_ICON_SIG:
+ FIXME("valid but unhandled datablock %08lx\n", dwSig);
+ break;
+ default:
+ ERR("unknown datablock %08lx\n", dwSig);
+ }
+ *ppDataBlock = block;
+ return r;
}
static HRESULT WINAPI
@@ -2260,8 +2293,26 @@ ShellLink_RemoveDataBlock( IShellLinkDat
static HRESULT WINAPI
ShellLink_GetFlags( IShellLinkDataList* iface, DWORD* pdwFlags )
{
- FIXME("\n");
- return E_NOTIMPL;
+ IShellLinkImpl *This = impl_from_IShellLinkDataList(iface);
+ DWORD flags = 0;
+
+ FIXME("%p %p\n", This, pdwFlags );
+
+ /* FIXME: add more */
+ if (This->sArgs)
+ flags |= SLDF_HAS_ARGS;
+ if (This->sComponent)
+ flags |= SLDF_HAS_DARWINID;
+ if (This->sIcoPath)
+ flags |= SLDF_HAS_ICONLOCATION;
+ if (This->sProduct)
+ flags |= SLDF_HAS_LOGO3ID;
+ if (This->pPidl)
+ flags |= SLDF_HAS_ID_LIST;
+
+ *pdwFlags = flags;
+
+ return S_OK;
}
static HRESULT WINAPI
More information about the wine-cvs
mailing list