Rob Shearman : shell32: Implement ParseDisplayName for EntireNetwork in the Network Places shell folder .
Alexandre Julliard
julliard at winehq.org
Fri Apr 11 06:27:48 CDT 2008
Module: wine
Branch: master
Commit: 21b9a50e085f6de21476a5340c95ab2dbf0c28a7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=21b9a50e085f6de21476a5340c95ab2dbf0c28a7
Author: Rob Shearman <rob at codeweavers.com>
Date: Thu Apr 10 12:01:38 2008 +0100
shell32: Implement ParseDisplayName for EntireNetwork in the Network Places shell folder.
Add a test for this behaviour.
---
dlls/shell32/pidl.c | 17 +++++++++
dlls/shell32/pidl.h | 1 +
dlls/shell32/shfldr_netplaces.c | 47 ++++++++++++++++++++++---
dlls/shell32/tests/Makefile.in | 1 +
dlls/shell32/tests/shfldr_netplaces.c | 63 +++++++++++++++++++++++++++++++++
5 files changed, 124 insertions(+), 5 deletions(-)
diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c
index 25602ae..cfab61f 100644
--- a/dlls/shell32/pidl.c
+++ b/dlls/shell32/pidl.c
@@ -1570,6 +1570,23 @@ LPITEMIDLIST _ILCreateDrive(LPCWSTR lpszNew)
return pidlOut;
}
+LPITEMIDLIST _ILCreateEntireNetwork(void)
+{
+ LPITEMIDLIST pidlOut;
+
+ TRACE("\n");
+
+ pidlOut = _ILAlloc(PT_NETWORK, FIELD_OFFSET(PIDLDATA, u.network.szNames[sizeof("Entire Network")]));
+ if (pidlOut)
+ {
+ LPPIDLDATA pData = _ILGetDataPointer(pidlOut);
+
+ pData->u.network.dummy = 0;
+ strcpy(pData->u.network.szNames, "Entire Network");
+ }
+ return pidlOut;
+}
+
/**************************************************************************
* _ILGetDrive()
*
diff --git a/dlls/shell32/pidl.h b/dlls/shell32/pidl.h
index 18935e8..18adb7d 100644
--- a/dlls/shell32/pidl.h
+++ b/dlls/shell32/pidl.h
@@ -255,6 +255,7 @@ LPITEMIDLIST _ILCreateNetwork (void);
LPITEMIDLIST _ILCreateNetHood (void);
LPITEMIDLIST _ILCreateBitBucket (void);
LPITEMIDLIST _ILCreateDrive (LPCWSTR);
+LPITEMIDLIST _ILCreateEntireNetwork (void);
/*
* helper functions (getting struct-pointer)
diff --git a/dlls/shell32/shfldr_netplaces.c b/dlls/shell32/shfldr_netplaces.c
index 4e4a753..a4acfba 100644
--- a/dlls/shell32/shfldr_netplaces.c
+++ b/dlls/shell32/shfldr_netplaces.c
@@ -43,6 +43,7 @@
#include "shell32_main.h"
#include "shresdef.h"
#include "wine/debug.h"
+#include "wine/unicode.h"
#include "debughlp.h"
#include "shfldr.h"
@@ -181,17 +182,53 @@ static HRESULT WINAPI ISF_NetworkPlaces_fnParseDisplayName (IShellFolder2 * ifac
HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName,
DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes)
{
+ static const WCHAR wszEntireNetwork[] = {'E','n','t','i','r','e','N','e','t','w','o','r','k'}; /* not nul-terminated */
IGenericSFImpl *This = (IGenericSFImpl *)iface;
-
- HRESULT hr = E_UNEXPECTED;
+ HRESULT hr = E_INVALIDARG;
+ LPCWSTR szNext = NULL;
+ WCHAR szElement[MAX_PATH];
+ LPITEMIDLIST pidlTemp = NULL;
+ int len;
TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", This,
hwndOwner, pbcReserved, lpszDisplayName, debugstr_w (lpszDisplayName),
pchEaten, ppidl, pdwAttributes);
- *ppidl = 0;
- if (pchEaten)
- *pchEaten = 0; /* strange but like the original */
+ *ppidl = NULL;
+
+ szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH);
+ len = strlenW(szElement);
+ if (len == sizeof(wszEntireNetwork)/sizeof(wszEntireNetwork[0]) &&
+ !strncmpiW(szElement, wszEntireNetwork, sizeof(wszEntireNetwork)/sizeof(wszEntireNetwork[0])))
+ {
+ pidlTemp = _ILCreateEntireNetwork();
+ if (pidlTemp)
+ hr = S_OK;
+ else
+ hr = E_OUTOFMEMORY;
+ }
+ else
+ FIXME("not implemented for %s\n", debugstr_w(lpszDisplayName));
+
+ if (SUCCEEDED(hr) && pidlTemp)
+ {
+ if (szNext && *szNext)
+ {
+ hr = SHELL32_ParseNextElement(iface, hwndOwner, pbcReserved,
+ &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes);
+ }
+ else
+ {
+ if (pdwAttributes && *pdwAttributes)
+ hr = SHELL32_GetItemAttributes(_IShellFolder_ (This),
+ pidlTemp, pdwAttributes);
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ *ppidl = pidlTemp;
+ else
+ ILFree(pidlTemp);
TRACE ("(%p)->(-- ret=0x%08x)\n", This, hr);
diff --git a/dlls/shell32/tests/Makefile.in b/dlls/shell32/tests/Makefile.in
index 364bb3d..374f746 100644
--- a/dlls/shell32/tests/Makefile.in
+++ b/dlls/shell32/tests/Makefile.in
@@ -10,6 +10,7 @@ CTESTS = \
generated.c \
shelllink.c \
shellpath.c \
+ shfldr_netplaces.c \
shlexec.c \
shlfileop.c \
shlfolder.c \
diff --git a/dlls/shell32/tests/shfldr_netplaces.c b/dlls/shell32/tests/shfldr_netplaces.c
new file mode 100644
index 0000000..a2619f0
--- /dev/null
+++ b/dlls/shell32/tests/shfldr_netplaces.c
@@ -0,0 +1,63 @@
+/*
+ * Tests for My Network Places shell folder
+ *
+ * Copyright 2008 Robert Shearman for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#define COBJMACROS
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include "shellapi.h"
+#include "shlobj.h"
+
+#include "wine/test.h"
+
+static void test_parse_for_entire_network(void)
+{
+ static const WCHAR entire_network_path[] = {
+ ':',':','{','2','0','8','D','2','C','6','0','-','3','A','E','A','-',
+ '1','0','6','9','-','A','2','D','7','-','0','8','0','0','2','B','3','0','3','0','9','D',
+ '}','\\','E','n','t','i','r','e','N','e','t','w','o','r','k',0 };
+ IShellFolder *psfDesktop;
+ HRESULT hr;
+ DWORD eaten = 0xdeadbeef;
+ LPITEMIDLIST pidl;
+ DWORD attr = ~0;
+ DWORD expected_attr;
+
+ hr = SHGetDesktopFolder(&psfDesktop);
+ ok(hr == S_OK, "SHGetDesktopFolder failed with error 0x%x\n", hr);
+
+ hr = IShellFolder_ParseDisplayName(psfDesktop, NULL, NULL, (LPWSTR)entire_network_path, &eaten, &pidl, &attr);
+ ok(hr == S_OK, "IShellFolder_ParseDisplayName failed with error 0x%x\n", hr);
+ todo_wine
+ ok(eaten == 0xdeadbeef, "eaten should not have been set to %u\n", eaten);
+ expected_attr = SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|SFGAO_STORAGEANCESTOR|SFGAO_HASPROPSHEET|SFGAO_CANLINK;
+ todo_wine
+ ok(attr == expected_attr, "attr should be 0x%x, not 0x%x\n", expected_attr, attr);
+
+ ILFree(pidl);
+}
+
+
+START_TEST(shfldr_netplaces)
+{
+ test_parse_for_entire_network();
+}
More information about the wine-cvs
mailing list