Nikolay Sivov : shell32: Add ::GetDefaultColumnState() and partial :: GetDetailsOf() for printers folder.
Alexandre Julliard
julliard at winehq.org
Mon Apr 19 11:51:18 CDT 2010
Module: wine
Branch: master
Commit: 506264becd71041ef96a9d26b56ae8ebd107f7e2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=506264becd71041ef96a9d26b56ae8ebd107f7e2
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sun Apr 18 18:00:31 2010 +0400
shell32: Add ::GetDefaultColumnState() and partial ::GetDetailsOf() for printers folder.
---
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();
}
More information about the wine-cvs
mailing list