Nikolay Sivov : shell32: Implement FolderItem attributes properties.

Alexandre Julliard julliard at winehq.org
Tue Sep 26 14:56:16 CDT 2017


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Sep 26 12:57:51 2017 +0300

shell32: Implement FolderItem attributes properties.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/shell32/shelldispatch.c       | 49 +++++++++++++++++++++++++-------------
 dlls/shell32/tests/shelldispatch.c |  7 ++++++
 2 files changed, 40 insertions(+), 16 deletions(-)

diff --git a/dlls/shell32/shelldispatch.c b/dlls/shell32/shelldispatch.c
index 82c62ae..57170ee 100644
--- a/dlls/shell32/shelldispatch.c
+++ b/dlls/shell32/shelldispatch.c
@@ -83,6 +83,7 @@ typedef struct {
     LONG ref;
     FolderImpl *folder;
     WCHAR *path; /* if NULL, folder path is used */
+    DWORD attributes;
 } FolderItemImpl;
 
 typedef struct {
@@ -788,36 +789,48 @@ static HRESULT WINAPI FolderItemImpl_get_GetFolder(FolderItem2 *iface,
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI FolderItemImpl_get_IsLink(FolderItem2 *iface,
-        VARIANT_BOOL *pb)
+static HRESULT WINAPI FolderItemImpl_get_IsLink(FolderItem2 *iface, VARIANT_BOOL *b)
 {
-    FIXME("(%p,%p)\n", iface, pb);
+    FolderItemImpl *This = impl_from_FolderItem(iface);
 
-    return E_NOTIMPL;
+    TRACE("(%p,%p)\n", iface, b);
+
+    *b = This->attributes & SFGAO_LINK ? VARIANT_TRUE : VARIANT_FALSE;
+
+    return S_OK;
 }
 
-static HRESULT WINAPI FolderItemImpl_get_IsFolder(FolderItem2 *iface,
-        VARIANT_BOOL *pb)
+static HRESULT WINAPI FolderItemImpl_get_IsFolder(FolderItem2 *iface, VARIANT_BOOL *b)
 {
-    FIXME("(%p,%p)\n", iface, pb);
+    FolderItemImpl *This = impl_from_FolderItem(iface);
 
-    return E_NOTIMPL;
+    TRACE("(%p,%p)\n", iface, b);
+
+    *b = This->attributes & SFGAO_FOLDER ? VARIANT_TRUE : VARIANT_FALSE;
+
+    return S_OK;
 }
 
-static HRESULT WINAPI FolderItemImpl_get_IsFileSystem(FolderItem2 *iface,
-        VARIANT_BOOL *pb)
+static HRESULT WINAPI FolderItemImpl_get_IsFileSystem(FolderItem2 *iface, VARIANT_BOOL *b)
 {
-    FIXME("(%p,%p)\n", iface, pb);
+    FolderItemImpl *This = impl_from_FolderItem(iface);
 
-    return E_NOTIMPL;
+    TRACE("(%p,%p)\n", iface, b);
+
+    *b = This->attributes & SFGAO_FILESYSTEM ? VARIANT_TRUE : VARIANT_FALSE;
+
+    return S_OK;
 }
 
-static HRESULT WINAPI FolderItemImpl_get_IsBrowsable(FolderItem2 *iface,
-        VARIANT_BOOL *pb)
+static HRESULT WINAPI FolderItemImpl_get_IsBrowsable(FolderItem2 *iface, VARIANT_BOOL *b)
 {
-    FIXME("(%p,%p)\n", iface, pb);
+    FolderItemImpl *This = impl_from_FolderItem(iface);
 
-    return E_NOTIMPL;
+    TRACE("(%p,%p)\n", iface, b);
+
+    *b = This->attributes & SFGAO_BROWSABLE ? VARIANT_TRUE : VARIANT_FALSE;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI FolderItemImpl_get_ModifyDate(FolderItem2 *iface,
@@ -924,6 +937,7 @@ static const FolderItem2Vtbl FolderItemImpl_Vtbl = {
 
 static HRESULT FolderItem_Constructor(FolderImpl *folder, const WCHAR *path, FolderItem **item)
 {
+    PIDLIST_ABSOLUTE pidl;
     FolderItemImpl *This;
 
     TRACE("%s\n", debugstr_w(path));
@@ -942,6 +956,9 @@ static HRESULT FolderItem_Constructor(FolderImpl *folder, const WCHAR *path, Fol
     This->folder = folder;
     Folder3_AddRef(&folder->Folder3_iface);
 
+    if (SHParseDisplayName(This->path, NULL, &pidl, ~0u, &This->attributes) == S_OK)
+        ILFree(pidl);
+
     *item = (FolderItem *)&This->FolderItem2_iface;
     return S_OK;
 }
diff --git a/dlls/shell32/tests/shelldispatch.c b/dlls/shell32/tests/shelldispatch.c
index 06e73dd..462be18 100644
--- a/dlls/shell32/tests/shelldispatch.c
+++ b/dlls/shell32/tests/shelldispatch.c
@@ -594,6 +594,8 @@ static void test_items(void)
     /* test the folder item corresponding to each file */
     for (i = 0; i < sizeof(file_defs)/sizeof(file_defs[0]); i++)
     {
+        VARIANT_BOOL b;
+
         V_I4(&int_index) = i;
         variant_set_string(&str_index, file_defs[i].name);
 
@@ -629,6 +631,11 @@ static void test_items(void)
            "file_defs[%d]: expected %s, got %s\n", i, wine_dbgstr_w(path), wine_dbgstr_w(bstr));
         SysFreeString(bstr);
 
+        b = 0xdead;
+        r = FolderItem_get_IsFolder(item, &b);
+        ok(r == S_OK, "Failed to get IsFolder property, %#x.\n", r);
+        ok(file_defs[i].type == DIRECTORY ? b == VARIANT_TRUE : b == VARIANT_FALSE, "Unexpected prop value %#x.\n", b);
+
         FolderItem_Release(item);
 
         if (file_defs[i].type == DIRECTORY)




More information about the wine-cvs mailing list