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