[PATCH] Add ::GetDefaultColumnState() and partial ::GetDetailsOf() for printers folder

Nikolay Sivov nsivov at codeweavers.com
Sun Apr 18 09:00:31 CDT 2010


---
 dlls/shell32/regsvr.c               |    7 ++++
 dlls/shell32/shell32_En.rc          |    4 ++
 dlls/shell32/shfldr_printers.c      |   51 ++++++++++++++++++++++++++---
 dlls/shell32/shresdef.h             |    4 ++
 dlls/shell32/tests/shfldr_special.c |   59 +++++++++++++++++++++++++++++++++++
 5 files changed, 119 insertions(+), 6 deletions(-)

diff --git a/dlls/shell32/regsvr.c b/dlls/shell32/regsvr.c
index 8ae513f..b02c2ce 100644
--- a/dlls/shell32/regsvr.c
+++ b/dlls/shell32/regsvr.c
@@ -674,6 +674,13 @@ static struct regsvr_coclass const coclass_list[] = {
 	SHELLFOLDER_WANTSFORDISPLAY|SHELLFOLDER_ATTRIBUTES|SHELLFOLDER_HIDEASDELETE,
         SFGAO_FOLDER|SFGAO_HASSUBFOLDER,
     },
+    {   &CLSID_Printers,
+        "Printers and Faxes",
+        0,
+        NULL,
+        "shell32.dll",
+        "Apartment"
+    },
     { NULL }			/* list terminator */
 };
 
diff --git a/dlls/shell32/shell32_En.rc b/dlls/shell32/shell32_En.rc
index 6d68083..5ec5191 100644
--- a/dlls/shell32/shell32_En.rc
+++ b/dlls/shell32/shell32_En.rc
@@ -205,6 +205,10 @@ STRINGTABLE
 	IDS_SHV_COLUMN11	"Group"
 	IDS_SHV_COLUMN_DELFROM	"Original location"
 	IDS_SHV_COLUMN_DELDATE	"Date deleted"
+	IDS_SHV_COL_DOCS	"Documents"
+	IDS_SHV_COL_STATUS	"Status"
+	IDS_SHV_COL_LOCATION	"Location"
+	IDS_SHV_COL_MODEL	"Model"
 
         /* special folders */
 	IDS_DESKTOP		"Desktop"
diff --git a/dlls/shell32/shfldr_printers.c b/dlls/shell32/shfldr_printers.c
index 77e2439..b1d5939 100644
--- a/dlls/shell32/shfldr_printers.c
+++ b/dlls/shell32/shfldr_printers.c
@@ -19,6 +19,7 @@
  */
 
 #include <stdarg.h>
+#include <stdio.h>
 
 #define COBJMACROS
 #define NONAMELESSUNION
@@ -32,6 +33,9 @@
 #include "wine/debug.h"
 #include "debughlp.h"
 
+#include "shresdef.h"
+#include "shfldr.h"
+
 WINE_DEFAULT_DEBUG_CHANNEL (shell);
 
 typedef struct {
@@ -45,6 +49,17 @@ static inline IPrintersFolderImpl *impl_from_IPersistFolder2(IPersistFolder2 *if
     return (IPrintersFolderImpl *)((char*)iface - FIELD_OFFSET(IPrintersFolderImpl, lpvtblPersistFolder2));
 }
 
+static const shvheader printers_header[] = {
+    { IDS_SHV_COLUMN8,      SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 20 },
+    { IDS_SHV_COL_DOCS,     SHCOLSTATE_TYPE_INT | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 12 },
+    { IDS_SHV_COL_STATUS,   SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 12 },
+    { IDS_SHV_COLUMN9,      SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 30 },
+    { IDS_SHV_COL_LOCATION, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 20 },
+    { IDS_SHV_COL_MODEL,    SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 20 }
+};
+
+#define PRINTERS_FOLDER_COL_NUM sizeof(printers_header)/sizeof(shvheader)
+
 static HRESULT WINAPI IShellFolder_Printers_fnQueryInterface(IShellFolder2 *iface,
                REFIID riid, LPVOID *ppvObj)
 {
@@ -255,11 +270,18 @@ static HRESULT WINAPI IShellFolder_Printers_fnGetDefaultColumn (
 }
 
 static HRESULT WINAPI IShellFolder_Printers_fnGetDefaultColumnState (
-               IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags)
+               IShellFolder2 *iface, UINT iColumn, DWORD *pcsFlags)
 {
     IPrintersFolderImpl *This = (IPrintersFolderImpl *)iface;
-    FIXME("(%p) stub\n", This);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%d %p)\n", This, iColumn, pcsFlags);
+
+    if (iColumn >= PRINTERS_FOLDER_COL_NUM)
+        return E_INVALIDARG;
+
+    *pcsFlags = printers_header[iColumn].pcsFlags;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI IShellFolder_Printers_fnGetDetailsEx (IShellFolder2 * iface,
@@ -270,11 +292,28 @@ static HRESULT WINAPI IShellFolder_Printers_fnGetDetailsEx (IShellFolder2 * ifac
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI IShellFolder_Printers_fnGetDetailsOf (IShellFolder2 * iface,
-               LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd)
+static HRESULT WINAPI IShellFolder_Printers_fnGetDetailsOf (IShellFolder2 *iface,
+               LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd)
 {
     IPrintersFolderImpl *This = (IPrintersFolderImpl *)iface;
-    FIXME("(%p)->(%p %i %p) stub\n", This, pidl, iColumn, psd);
+
+    TRACE("(%p)->(%p %i %p)\n", This, pidl, iColumn, psd);
+
+    if (iColumn >= PRINTERS_FOLDER_COL_NUM)
+        return E_NOTIMPL;
+
+    if (!pidl)
+    {
+        psd->fmt = printers_header[iColumn].fmt;
+        psd->cxChar = printers_header[iColumn].cxChar;
+        psd->str.uType = STRRET_CSTR;
+        LoadStringA (shell32_hInstance, printers_header[iColumn].colnameid,
+                     psd->str.u.cStr, MAX_PATH);
+        return S_OK;
+    }
+
+    FIXME("unimplemented for supplied pidl\n");
+
     return E_NOTIMPL;
 }
 
diff --git a/dlls/shell32/shresdef.h b/dlls/shell32/shresdef.h
index 2880135..88c93c8 100644
--- a/dlls/shell32/shresdef.h
+++ b/dlls/shell32/shresdef.h
@@ -42,6 +42,10 @@
 #define IDS_SHV_COLUMN11	17
 #define IDS_SHV_COLUMN_DELFROM  18
 #define IDS_SHV_COLUMN_DELDATE  19
+#define IDS_SHV_COL_DOCS        80
+#define IDS_SHV_COL_STATUS      81
+#define IDS_SHV_COL_LOCATION    82
+#define IDS_SHV_COL_MODEL       83
 
 #define IDS_DESKTOP		20
 #define IDS_MYCOMPUTER		21
diff --git a/dlls/shell32/tests/shfldr_special.c b/dlls/shell32/tests/shfldr_special.c
index 06533ba..e971270 100644
--- a/dlls/shell32/tests/shfldr_special.c
+++ b/dlls/shell32/tests/shfldr_special.c
@@ -23,6 +23,9 @@
 #include <stdio.h>
 
 #define COBJMACROS
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include "shellapi.h"
@@ -119,9 +122,65 @@ static void test_parse_for_control_panel(void)
     ILFree(pidl);
 }
 
+static void test_printers_folder(void)
+{
+    IShellFolder2 *folder;
+    SHELLDETAILS details;
+    SHCOLSTATEF state;
+    INT i;
+    HRESULT hr;
+
+    CoInitialize( NULL );
+
+    hr = CoCreateInstance(&CLSID_Printers, NULL, CLSCTX_INPROC_SERVER, &IID_IShellFolder2, (void**)&folder);
+    if (hr != S_OK)
+    {
+        win_skip("Failed to created IShellFolder2 for Printers folder\n");
+        CoUninitialize();
+        return;
+    }
+
+if (0)
+{
+    /* crashes on XP */
+    hr = IShellFolder2_GetDetailsOf(folder, NULL, 0, NULL);
+    hr = IShellFolder2_GetDefaultColumnState(folder, 0, NULL);
+}
+
+    /* 5 columns defined */
+    hr = IShellFolder2_GetDetailsOf(folder, NULL, 6, &details);
+    ok(hr == E_NOTIMPL, "got 0x%08x\n", hr);
+
+    hr = IShellFolder2_GetDefaultColumnState(folder, 6, &state);
+    ok(broken(hr == E_NOTIMPL) || hr == E_INVALIDARG /* Win7 */, "got 0x%08x\n", hr);
+
+    for(i = 0; i < 6; i++)
+    {
+        hr = IShellFolder2_GetDetailsOf(folder, NULL, i, &details);
+        /* doesn't work on W2K */
+        if (hr == E_NOTIMPL) break;
+
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+        /* all columns are left-aligned */
+        ok(details.fmt == LVCFMT_LEFT, "got 0x%x\n", details.fmt);
+
+        hr = IShellFolder2_GetDefaultColumnState(folder, i, &state);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+        /* all columns are string except document count */
+        if (i == 1)
+            ok(state == (SHCOLSTATE_TYPE_INT | SHCOLSTATE_ONBYDEFAULT), "got 0x%x\n", state);
+        else
+            ok(state == (SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT), "got 0x%x\n", state);
+    }
+
+    IShellFolder2_Release(folder);
+
+    CoUninitialize();
+}
 
 START_TEST(shfldr_special)
 {
     test_parse_for_entire_network();
     test_parse_for_control_panel();
+    test_printers_folder();
 }
-- 
1.5.6.5


--=-x/uXOG4wIkIv9MLGxa87--




More information about the wine-patches mailing list