Nikolay Sivov : shell32/shellview: Implement IFolderView::GetFolder() for IID_IShellFolder.

Alexandre Julliard julliard at winehq.org
Mon Mar 15 12:19:37 CDT 2010


Module: wine
Branch: master
Commit: b8220e727c54181750d904d90c677dad744df9db
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b8220e727c54181750d904d90c677dad744df9db

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Mar  6 23:55:55 2010 +0300

shell32/shellview: Implement IFolderView::GetFolder() for IID_IShellFolder.

---

 dlls/shell32/shlview.c       |   16 +++++++++++++---
 dlls/shell32/tests/shlview.c |   23 ++++++++++++++++++++++-
 2 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c
index f718c2b..af14604 100644
--- a/dlls/shell32/shlview.c
+++ b/dlls/shell32/shlview.c
@@ -2711,9 +2711,19 @@ static HRESULT WINAPI IFView_SetCurrentViewMode(IFolderView *iface, UINT mode)
 
 static HRESULT WINAPI IFView_GetFolder(IFolderView *iface, REFIID riid, void **ppv)
 {
-	IShellViewImpl *This = impl_from_IFolderView(iface);
-	FIXME("(%p)->(%s, %p), stub\n", This, debugstr_guid(riid), ppv);
-	return E_NOTIMPL;
+    IShellViewImpl *This = impl_from_IFolderView(iface);
+
+    TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv);
+
+    if (!ppv) return E_POINTER;
+
+    if (IsEqualIID(riid, &IID_IShellFolder))
+    {
+        *ppv = This->pSFParent;
+        return S_OK;
+    }
+
+    return E_NOINTERFACE;
 }
 
 static HRESULT WINAPI IFView_Item(IFolderView *iface, int index, PITEMID_CHILD *ppidl)
diff --git a/dlls/shell32/tests/shlview.c b/dlls/shell32/tests/shlview.c
index 2cd4c4b..c8cd4cf 100644
--- a/dlls/shell32/tests/shlview.c
+++ b/dlls/shell32/tests/shlview.c
@@ -347,7 +347,7 @@ if (0)
 
 static void test_IFolderView(void)
 {
-    IShellFolder *desktop;
+    IShellFolder *desktop, *folder;
     FOLDERSETTINGS settings;
     IShellView *view;
     IShellBrowser *browser;
@@ -356,6 +356,7 @@ static void test_IFolderView(void)
     HRESULT hr;
     INT ret;
     POINT pt;
+    LONG ref1, ref2;
     RECT r;
 
     hr = SHGetDesktopFolder(&desktop);
@@ -448,6 +449,26 @@ if (0)
     ok_sequence(sequences, LISTVIEW_SEQ_INDEX, folderview_getfocused_seq,
                                   "IFolderView::GetFocusedItem", FALSE);
 
+    /* IFolderView::GetFolder, just return pointer */
+if (0)
+{
+    /* crashes on XP */
+    hr = IFolderView_GetFolder(fv, NULL, (void**)&folder);
+    hr = IFolderView_GetFolder(fv, NULL, NULL);
+}
+
+    hr = IFolderView_GetFolder(fv, &IID_IShellFolder, NULL);
+    ok(hr == E_POINTER, "got (0x%08x)\n", hr);
+
+    ref1 = IShellFolder_AddRef(desktop);
+    IShellFolder_Release(desktop);
+    hr = IFolderView_GetFolder(fv, &IID_IShellFolder, (void**)&folder);
+    ok(hr == S_OK, "got (0x%08x)\n", hr);
+    ref2 = IShellFolder_AddRef(desktop);
+    IShellFolder_Release(desktop);
+    ok(ref1 == ref2, "expected same refcount, got %d\n", ref2);
+    ok(desktop == folder, "\n");
+
     IShellBrowser_Release(browser);
     IFolderView_Release(fv);
     IShellView_Release(view);




More information about the wine-cvs mailing list