Nikolay Sivov : shell32: Implement FolderItemVerbs_get_Count().

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 11 07:49:04 CDT 2015


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun May 10 21:34:58 2015 +0300

shell32: Implement FolderItemVerbs_get_Count().

---

 dlls/shell32/shelldispatch.c       | 62 ++++++++++++++++++++++++++++++++++----
 dlls/shell32/tests/shelldispatch.c |  2 --
 2 files changed, 56 insertions(+), 8 deletions(-)

diff --git a/dlls/shell32/shelldispatch.c b/dlls/shell32/shelldispatch.c
index 2b4342f..66603ad 100644
--- a/dlls/shell32/shelldispatch.c
+++ b/dlls/shell32/shelldispatch.c
@@ -72,6 +72,9 @@ typedef struct {
 typedef struct {
     FolderItemVerbs FolderItemVerbs_iface;
     LONG ref;
+
+    IContextMenu *menu;
+    LONG count;
 } FolderItemVerbsImpl;
 
 static inline ShellDispatch *impl_from_IShellDispatch6(IShellDispatch6 *iface)
@@ -195,7 +198,10 @@ static ULONG WINAPI FolderItemVerbsImpl_Release(FolderItemVerbs *iface)
     TRACE("(%p), new refcount=%i\n", iface, ref);
 
     if (!ref)
+    {
+        IContextMenu_Release(This->menu);
         HeapFree(GetProcessHeap(), 0, This);
+    }
 
     return ref;
 }
@@ -254,8 +260,12 @@ static HRESULT WINAPI FolderItemVerbsImpl_Invoke(FolderItemVerbs *iface,
 
 static HRESULT WINAPI FolderItemVerbsImpl_get_Count(FolderItemVerbs *iface, LONG *count)
 {
-    FIXME("(%p, %p)\n", iface, count);
-    return E_NOTIMPL;
+    FolderItemVerbsImpl *This = impl_from_FolderItemVerbs(iface);
+
+    TRACE("(%p, %p)\n", iface, count);
+
+    *count = This->count;
+    return S_OK;
 }
 
 static HRESULT WINAPI FolderItemVerbsImpl_get_Application(FolderItemVerbs *iface, IDispatch **disp)
@@ -297,11 +307,14 @@ static FolderItemVerbsVtbl folderitemverbsvtbl = {
     FolderItemVerbsImpl__NewEnum
 };
 
-static HRESULT FolderItemVerbs_Constructor(FolderItemVerbs **verbs)
+static HRESULT FolderItemVerbs_Constructor(BSTR path, FolderItemVerbs **verbs)
 {
     FolderItemVerbsImpl *This;
-
-    *verbs = NULL;
+    IShellFolder *folder;
+    LPCITEMIDLIST child;
+    LPITEMIDLIST pidl;
+    HRESULT hr;
+    HMENU menu;
 
     This = HeapAlloc(GetProcessHeap(), 0, sizeof(FolderItemVerbsImpl));
     if (!This)
@@ -309,9 +322,35 @@ static HRESULT FolderItemVerbs_Constructor(FolderItemVerbs **verbs)
 
     This->FolderItemVerbs_iface.lpVtbl = &folderitemverbsvtbl;
     This->ref = 1;
+    This->count = 0;
+
+    /* build context menu for this path */
+    hr = SHParseDisplayName(path, NULL, &pidl, 0, NULL);
+    if (FAILED(hr))
+        goto failed;
+
+    hr = SHBindToParent(pidl, &IID_IShellFolder, (void**)&folder, &child);
+    CoTaskMemFree(pidl);
+    if (FAILED(hr))
+        goto failed;
+
+    hr = IShellFolder_GetUIObjectOf(folder, NULL, 1, &child, &IID_IContextMenu, NULL, (void**)&This->menu);
+    IShellFolder_Release(folder);
+    if (FAILED(hr))
+        goto failed;
+
+    menu = CreatePopupMenu();
+    hr = IContextMenu_QueryContextMenu(This->menu, menu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL);
+    if (SUCCEEDED(hr))
+        This->count = GetMenuItemCount(menu);
+    DestroyMenu(menu);
 
     *verbs = &This->FolderItemVerbs_iface;
     return S_OK;
+
+failed:
+    HeapFree(GetProcessHeap(), 0, This);
+    return hr;
 }
 
 static HRESULT WINAPI FolderItemImpl_QueryInterface(FolderItem2 *iface,
@@ -570,12 +609,23 @@ static HRESULT WINAPI FolderItemImpl_get_Type(FolderItem2 *iface, BSTR *pbs)
 
 static HRESULT WINAPI FolderItemImpl_Verbs(FolderItem2 *iface, FolderItemVerbs **verbs)
 {
+    HRESULT hr;
+    BSTR path;
+
     TRACE("(%p, %p)\n", iface, verbs);
 
     if (!verbs)
         return E_INVALIDARG;
 
-    return FolderItemVerbs_Constructor(verbs);
+    *verbs = NULL;
+
+    hr = FolderItem2_get_Path(iface, &path);
+    if (FAILED(hr))
+        return hr;
+
+    hr = FolderItemVerbs_Constructor(path, verbs);
+    SysFreeString(path);
+    return hr;
 }
 
 static HRESULT WINAPI FolderItemImpl_InvokeVerb(FolderItem2 *iface,
diff --git a/dlls/shell32/tests/shelldispatch.c b/dlls/shell32/tests/shelldispatch.c
index 4295311..167972b 100644
--- a/dlls/shell32/tests/shelldispatch.c
+++ b/dlls/shell32/tests/shelldispatch.c
@@ -784,10 +784,8 @@ if (0) { /* crashes on some systems */
 
     count = 0;
     hr = FolderItemVerbs_get_Count(verbs, &count);
-todo_wine {
     ok(hr == S_OK, "got 0x%08x\n", hr);
     ok(count > 0, "got count %d\n", count);
-}
 
     FolderItem_Release(item);
     IShellDispatch_Release(sd);




More information about the wine-cvs mailing list