[PATCH 2/4] comdlg32: Add stub implementation of the Common Item dialogs.

David Hedberg david.hedberg at gmail.com
Mon Mar 21 08:37:02 CDT 2011


---
 dlls/comdlg32/Makefile.in |    1 +
 dlls/comdlg32/cdlg.h      |    4 +
 dlls/comdlg32/cdlg32.c    |    9 +
 dlls/comdlg32/itemdlg.c   |  835 +++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 849 insertions(+), 0 deletions(-)
 create mode 100644 dlls/comdlg32/itemdlg.c

diff --git a/dlls/comdlg32/Makefile.in b/dlls/comdlg32/Makefile.in
index efab504..6bf1c1a 100644
--- a/dlls/comdlg32/Makefile.in
+++ b/dlls/comdlg32/Makefile.in
@@ -11,6 +11,7 @@ C_SRCS = \
 	filedlgbrowser.c \
 	finddlg.c \
 	fontdlg.c \
+	itemdlg.c \
 	printdlg.c
 
 RC_SRCS = \
diff --git a/dlls/comdlg32/cdlg.h b/dlls/comdlg32/cdlg.h
index 686baea..17492a3 100644
--- a/dlls/comdlg32/cdlg.h
+++ b/dlls/comdlg32/cdlg.h
@@ -169,6 +169,10 @@ typedef struct {
 #include "shlobj.h"
 #include "shellapi.h"
 
+/* Constructors */
+HRESULT FileOpenDialog_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv);
+HRESULT FileSaveDialog_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv);
+
 /* ITEMIDLIST */
 
 extern LPITEMIDLIST (WINAPI *COMDLG32_PIDL_ILClone) (LPCITEMIDLIST);
diff --git a/dlls/comdlg32/cdlg32.c b/dlls/comdlg32/cdlg32.c
index 25b1dbf..a2388d1 100644
--- a/dlls/comdlg32/cdlg32.c
+++ b/dlls/comdlg32/cdlg32.c
@@ -261,7 +261,16 @@ static const IClassFactoryVtbl CDLGCF_Vtbl =
  */
 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
 {
+    static IClassFactoryImpl FileOpenDlgClassFactory = {{&CDLGCF_Vtbl}, FileOpenDialog_Constructor};
+    static IClassFactoryImpl FileSaveDlgClassFactory = {{&CDLGCF_Vtbl}, FileSaveDialog_Constructor};
+
     TRACE("%s, %s, %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
 
+    if(IsEqualGUID(&CLSID_FileOpenDialog, rclsid))
+        return IClassFactory_QueryInterface(&FileOpenDlgClassFactory.IClassFactory_iface, riid, ppv);
+
+    if(IsEqualGUID(&CLSID_FileSaveDialog, rclsid))
+        return IClassFactory_QueryInterface(&FileSaveDlgClassFactory.IClassFactory_iface, riid, ppv);
+
     return CLASS_E_CLASSNOTAVAILABLE;
 }
diff --git a/dlls/comdlg32/itemdlg.c b/dlls/comdlg32/itemdlg.c
new file mode 100644
index 0000000..9ea086b
--- /dev/null
+++ b/dlls/comdlg32/itemdlg.c
@@ -0,0 +1,835 @@
+/*
+ * Common Item Dialog
+ *
+ * Copyright 2010,2011 David Hedberg
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#define COBJMACROS
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "wingdi.h"
+
+#include "commdlg.h"
+#include "cdlg.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
+
+typedef struct FileDialogImpl {
+    IFileDialog2 IFileDialog2_iface;
+    IFileOpenDialog IFileOpenDialog_iface;
+    IFileSaveDialog IFileSaveDialog_iface;
+    LONG ref;
+} FileDialogImpl;
+
+/**************************************************************************
+ * IFileDialog implementation
+ */
+static inline FileDialogImpl *impl_from_IFileDialog2(IFileDialog2 *iface)
+{
+    return (FileDialogImpl *)((char*)iface - FIELD_OFFSET(FileDialogImpl, IFileDialog2_iface));
+}
+
+static HRESULT WINAPI IFileDialog2_fnQueryInterface(IFileDialog2 *iface,
+                                                    REFIID riid,
+                                                    void **ppvObject)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    TRACE("%p (%s, %p)\n", This, debugstr_guid(riid), ppvObject);
+
+    *ppvObject = NULL;
+    if(IsEqualGUID(riid, &IID_IUnknown) ||
+       IsEqualGUID(riid, &IID_IFileDialog) ||
+       IsEqualGUID(riid, &IID_IFileDialog2))
+    {
+        *ppvObject = iface;
+    }
+    else if(IsEqualGUID(riid, &IID_IFileOpenDialog) && This->IFileOpenDialog_iface.lpVtbl)
+    {
+        *ppvObject = &This->IFileOpenDialog_iface;
+    }
+    else if(IsEqualGUID(riid, &IID_IFileSaveDialog) && This->IFileSaveDialog_iface.lpVtbl)
+    {
+        *ppvObject = &This->IFileSaveDialog_iface;
+    }
+    else
+        FIXME("Unknown interface requested.\n");
+
+    if(*ppvObject)
+    {
+        IUnknown_AddRef((IUnknown*)*ppvObject);
+        return S_OK;
+    }
+
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI IFileDialog2_fnAddRef(IFileDialog2 *iface)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+    TRACE("%p - ref %d\n", This, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI IFileDialog2_fnRelease(IFileDialog2 *iface)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+    TRACE("%p - ref %d\n", This, ref);
+
+    if(!ref)
+    {
+        TRACE("Freeing object.\n");
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+
+    return ref;
+}
+
+static HRESULT WINAPI IFileDialog2_fnShow(IFileDialog2 *iface, HWND hwndOwner)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, hwndOwner);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetFileTypes(IFileDialog2 *iface, UINT cFileTypes,
+                                                  const COMDLG_FILTERSPEC *rgFilterSpec)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%d, %p)\n", This, cFileTypes, rgFilterSpec);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetFileTypeIndex(IFileDialog2 *iface, UINT iFileType)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%d)\n", This, iFileType);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnGetFileTypeIndex(IFileDialog2 *iface, UINT *piFileType)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, piFileType);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnAdvise(IFileDialog2 *iface, IFileDialogEvents *pfde, DWORD *pdwCookie)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p, %p)\n", This, pfde, pdwCookie);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnUnadvise(IFileDialog2 *iface, DWORD dwCookie)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%d)\n", This, dwCookie);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetOptions(IFileDialog2 *iface, FILEOPENDIALOGOPTIONS fos)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (0x%x)\n", This, fos);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnGetOptions(IFileDialog2 *iface, FILEOPENDIALOGOPTIONS *pfos)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetDefaultFolder(IFileDialog2 *iface, IShellItem *psi)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, psi);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetFolder(IFileDialog2 *iface, IShellItem *psi)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, psi);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnGetFolder(IFileDialog2 *iface, IShellItem **ppsi)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, ppsi);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnGetCurrentSelection(IFileDialog2 *iface, IShellItem **ppsi)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, ppsi);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetFileName(IFileDialog2 *iface, LPCWSTR pszName)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, pszName);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnGetFileName(IFileDialog2 *iface, LPWSTR *pszName)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, pszName);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetTitle(IFileDialog2 *iface, LPCWSTR pszTitle)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, pszTitle);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetOkButtonLabel(IFileDialog2 *iface, LPCWSTR pszText)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, pszText);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetFileNameLabel(IFileDialog2 *iface, LPCWSTR pszLabel)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, pszLabel);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnGetResult(IFileDialog2 *iface, IShellItem **ppsi)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, ppsi);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnAddPlace(IFileDialog2 *iface, IShellItem *psi, FDAP fdap)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p, %d)\n", This, psi, fdap);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetDefaultExtension(IFileDialog2 *iface, LPCWSTR pszDefaultExtension)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%s)\n", This, debugstr_w(pszDefaultExtension));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnClose(IFileDialog2 *iface, HRESULT hr)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (0x%08x)\n", This, hr);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetClientGuid(IFileDialog2 *iface, REFGUID guid)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%s)\n", This, debugstr_guid(guid));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnClearClientData(IFileDialog2 *iface)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetFilter(IFileDialog2 *iface, IShellItemFilter *pFilter)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, pFilter);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetCancelButtonLabel(IFileDialog2 *iface, LPCWSTR pszLabel)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%s)\n", This, debugstr_w(pszLabel));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileDialog2_fnSetNavigationRoot(IFileDialog2 *iface, IShellItem *psi)
+{
+    FileDialogImpl *This = impl_from_IFileDialog2(iface);
+    FIXME("stub - %p (%p)\n", This, psi);
+    return E_NOTIMPL;
+}
+
+static const IFileDialog2Vtbl vt_IFileDialog2 = {
+    IFileDialog2_fnQueryInterface,
+    IFileDialog2_fnAddRef,
+    IFileDialog2_fnRelease,
+    IFileDialog2_fnShow,
+    IFileDialog2_fnSetFileTypes,
+    IFileDialog2_fnSetFileTypeIndex,
+    IFileDialog2_fnGetFileTypeIndex,
+    IFileDialog2_fnAdvise,
+    IFileDialog2_fnUnadvise,
+    IFileDialog2_fnSetOptions,
+    IFileDialog2_fnGetOptions,
+    IFileDialog2_fnSetDefaultFolder,
+    IFileDialog2_fnSetFolder,
+    IFileDialog2_fnGetFolder,
+    IFileDialog2_fnGetCurrentSelection,
+    IFileDialog2_fnSetFileName,
+    IFileDialog2_fnGetFileName,
+    IFileDialog2_fnSetTitle,
+    IFileDialog2_fnSetOkButtonLabel,
+    IFileDialog2_fnSetFileNameLabel,
+    IFileDialog2_fnGetResult,
+    IFileDialog2_fnAddPlace,
+    IFileDialog2_fnSetDefaultExtension,
+    IFileDialog2_fnClose,
+    IFileDialog2_fnSetClientGuid,
+    IFileDialog2_fnClearClientData,
+    IFileDialog2_fnSetFilter,
+    IFileDialog2_fnSetCancelButtonLabel,
+    IFileDialog2_fnSetNavigationRoot
+};
+
+/**************************************************************************
+ * IFileOpenDialog
+ */
+static inline FileDialogImpl *impl_from_IFileOpenDialog(IFileOpenDialog *iface)
+{
+    return (FileDialogImpl *)((char*)iface - FIELD_OFFSET(FileDialogImpl, IFileOpenDialog_iface));
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnQueryInterface(IFileOpenDialog *iface,
+                                                       REFIID riid, void **ppvObject)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_QueryInterface((IFileDialog2*)This, riid, ppvObject);
+}
+
+static ULONG WINAPI IFileOpenDialog_fnAddRef(IFileOpenDialog *iface)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_AddRef((IFileDialog2*)This);
+}
+
+static ULONG WINAPI IFileOpenDialog_fnRelease(IFileOpenDialog *iface)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_Release((IFileDialog2*)This);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnShow(IFileOpenDialog *iface, HWND hwndOwner)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_Show((IFileDialog2*)This, hwndOwner);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnSetFileTypes(IFileOpenDialog *iface, UINT cFileTypes,
+                                                     const COMDLG_FILTERSPEC *rgFilterSpec)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_SetFileTypes((IFileDialog2*)This, cFileTypes, rgFilterSpec);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnSetFileTypeIndex(IFileOpenDialog *iface, UINT iFileType)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_SetFileTypeIndex((IFileDialog2*)This, iFileType);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnGetFileTypeIndex(IFileOpenDialog *iface, UINT *piFileType)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_GetFileTypeIndex((IFileDialog2*)This, piFileType);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnAdvise(IFileOpenDialog *iface, IFileDialogEvents *pfde,
+                                               DWORD *pdwCookie)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_Advise((IFileDialog2*)This, pfde, pdwCookie);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnUnadvise(IFileOpenDialog *iface, DWORD dwCookie)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_Unadvise((IFileDialog2*)This, dwCookie);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnSetOptions(IFileOpenDialog *iface, FILEOPENDIALOGOPTIONS fos)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_SetOptions((IFileDialog2*)This, fos);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnGetOptions(IFileOpenDialog *iface, FILEOPENDIALOGOPTIONS *pfos)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_GetOptions((IFileDialog2*)This, pfos);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnSetDefaultFolder(IFileOpenDialog *iface, IShellItem *psi)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_SetDefaultFolder((IFileDialog2*)This, psi);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnSetFolder(IFileOpenDialog *iface, IShellItem *psi)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_SetFolder((IFileDialog2*)This, psi);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnGetFolder(IFileOpenDialog *iface, IShellItem **ppsi)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_GetFolder((IFileDialog2*)This, ppsi);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnGetCurrentSelection(IFileOpenDialog *iface, IShellItem **ppsi)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_GetCurrentSelection((IFileDialog2*)This, ppsi);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnSetFileName(IFileOpenDialog *iface, LPCWSTR pszName)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_SetFileName((IFileDialog2*)This, pszName);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnGetFileName(IFileOpenDialog *iface, LPWSTR *pszName)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_GetFileName((IFileDialog2*)This, pszName);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnSetTitle(IFileOpenDialog *iface, LPCWSTR pszTitle)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_SetTitle((IFileDialog2*)This, pszTitle);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnSetOkButtonLabel(IFileOpenDialog *iface, LPCWSTR pszText)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_SetOkButtonLabel((IFileDialog2*)This, pszText);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnSetFileNameLabel(IFileOpenDialog *iface, LPCWSTR pszLabel)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_SetFileNameLabel((IFileDialog2*)This, pszLabel);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnGetResult(IFileOpenDialog *iface, IShellItem **ppsi)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_GetResult((IFileDialog2*)This, ppsi);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnAddPlace(IFileOpenDialog *iface, IShellItem *psi, FDAP fdap)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_AddPlace((IFileDialog2*)This, psi, fdap);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnSetDefaultExtension(IFileOpenDialog *iface,
+                                                            LPCWSTR pszDefaultExtension)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_SetDefaultExtension((IFileDialog2*)This, pszDefaultExtension);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnClose(IFileOpenDialog *iface, HRESULT hr)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_Close((IFileDialog2*)This, hr);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnSetClientGuid(IFileOpenDialog *iface, REFGUID guid)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_SetClientGuid((IFileDialog2*)This, guid);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnClearClientData(IFileOpenDialog *iface)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_ClearClientData((IFileDialog2*)This);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnSetFilter(IFileOpenDialog *iface, IShellItemFilter *pFilter)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    return IFileDialog2_SetFilter((IFileDialog2*)This, pFilter);
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnGetResults(IFileOpenDialog *iface, IShellItemArray **ppenum)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    FIXME("stub - %p (%p)\n", This, ppenum);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileOpenDialog_fnGetSelectedItems(IFileOpenDialog *iface, IShellItemArray **ppsai)
+{
+    FileDialogImpl *This = impl_from_IFileOpenDialog(iface);
+    FIXME("stub - %p (%p)\n", This, ppsai);
+    return E_NOTIMPL;
+}
+
+static const IFileOpenDialogVtbl vt_IFileOpenDialog = {
+    IFileOpenDialog_fnQueryInterface,
+    IFileOpenDialog_fnAddRef,
+    IFileOpenDialog_fnRelease,
+    IFileOpenDialog_fnShow,
+    IFileOpenDialog_fnSetFileTypes,
+    IFileOpenDialog_fnSetFileTypeIndex,
+    IFileOpenDialog_fnGetFileTypeIndex,
+    IFileOpenDialog_fnAdvise,
+    IFileOpenDialog_fnUnadvise,
+    IFileOpenDialog_fnSetOptions,
+    IFileOpenDialog_fnGetOptions,
+    IFileOpenDialog_fnSetDefaultFolder,
+    IFileOpenDialog_fnSetFolder,
+    IFileOpenDialog_fnGetFolder,
+    IFileOpenDialog_fnGetCurrentSelection,
+    IFileOpenDialog_fnSetFileName,
+    IFileOpenDialog_fnGetFileName,
+    IFileOpenDialog_fnSetTitle,
+    IFileOpenDialog_fnSetOkButtonLabel,
+    IFileOpenDialog_fnSetFileNameLabel,
+    IFileOpenDialog_fnGetResult,
+    IFileOpenDialog_fnAddPlace,
+    IFileOpenDialog_fnSetDefaultExtension,
+    IFileOpenDialog_fnClose,
+    IFileOpenDialog_fnSetClientGuid,
+    IFileOpenDialog_fnClearClientData,
+    IFileOpenDialog_fnSetFilter,
+    IFileOpenDialog_fnGetResults,
+    IFileOpenDialog_fnGetSelectedItems
+};
+
+/**************************************************************************
+ * IFileSaveDialog
+ */
+static inline FileDialogImpl *impl_from_IFileSaveDialog(IFileSaveDialog *iface)
+{
+    return (FileDialogImpl *)((char*)iface - FIELD_OFFSET(FileDialogImpl, IFileSaveDialog_iface));
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnQueryInterface(IFileSaveDialog *iface,
+                                                       REFIID riid,
+                                                       void **ppvObject)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_QueryInterface((IFileDialog2*)This, riid, ppvObject);
+}
+
+static ULONG WINAPI IFileSaveDialog_fnAddRef(IFileSaveDialog *iface)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_AddRef((IFileDialog2*)This);
+}
+
+static ULONG WINAPI IFileSaveDialog_fnRelease(IFileSaveDialog *iface)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_Release((IFileDialog2*)This);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnShow(IFileSaveDialog *iface, HWND hwndOwner)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_Show((IFileDialog2*)This, hwndOwner);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetFileTypes(IFileSaveDialog *iface, UINT cFileTypes,
+                                                     const COMDLG_FILTERSPEC *rgFilterSpec)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_SetFileTypes((IFileDialog2*)This, cFileTypes, rgFilterSpec);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetFileTypeIndex(IFileSaveDialog *iface, UINT iFileType)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_SetFileTypeIndex((IFileDialog2*)This, iFileType);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnGetFileTypeIndex(IFileSaveDialog *iface, UINT *piFileType)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_GetFileTypeIndex((IFileDialog2*)This, piFileType);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnAdvise(IFileSaveDialog *iface, IFileDialogEvents *pfde,
+                                               DWORD *pdwCookie)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_Advise((IFileDialog2*)This, pfde, pdwCookie);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnUnadvise(IFileSaveDialog *iface, DWORD dwCookie)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_Unadvise((IFileDialog2*)This, dwCookie);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetOptions(IFileSaveDialog *iface, FILEOPENDIALOGOPTIONS fos)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_SetOptions((IFileDialog2*)This, fos);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnGetOptions(IFileSaveDialog *iface, FILEOPENDIALOGOPTIONS *pfos)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_GetOptions((IFileDialog2*)This, pfos);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetDefaultFolder(IFileSaveDialog *iface, IShellItem *psi)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_SetDefaultFolder((IFileDialog2*)This, psi);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetFolder(IFileSaveDialog *iface, IShellItem *psi)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_SetFolder((IFileDialog2*)This, psi);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnGetFolder(IFileSaveDialog *iface, IShellItem **ppsi)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_GetFolder((IFileDialog2*)This, ppsi);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnGetCurrentSelection(IFileSaveDialog *iface, IShellItem **ppsi)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_GetCurrentSelection((IFileDialog2*)This, ppsi);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetFileName(IFileSaveDialog *iface, LPCWSTR pszName)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_SetFileName((IFileDialog2*)This, pszName);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnGetFileName(IFileSaveDialog *iface, LPWSTR *pszName)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_GetFileName((IFileDialog2*)This, pszName);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetTitle(IFileSaveDialog *iface, LPCWSTR pszTitle)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_SetTitle((IFileDialog2*)This, pszTitle);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetOkButtonLabel(IFileSaveDialog *iface, LPCWSTR pszText)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_SetOkButtonLabel((IFileDialog2*)This, pszText);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetFileNameLabel(IFileSaveDialog *iface, LPCWSTR pszLabel)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_SetFileNameLabel((IFileDialog2*)This, pszLabel);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnGetResult(IFileSaveDialog *iface, IShellItem **ppsi)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_GetResult((IFileDialog2*)This, ppsi);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnAddPlace(IFileSaveDialog *iface, IShellItem *psi, FDAP fdap)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_AddPlace((IFileDialog2*)This, psi, fdap);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetDefaultExtension(IFileSaveDialog *iface,
+                                                            LPCWSTR pszDefaultExtension)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_SetDefaultExtension((IFileDialog2*)This, pszDefaultExtension);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnClose(IFileSaveDialog *iface, HRESULT hr)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_Close((IFileDialog2*)This, hr);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetClientGuid(IFileSaveDialog *iface, REFGUID guid)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_SetClientGuid((IFileDialog2*)This, guid);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnClearClientData(IFileSaveDialog *iface)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_ClearClientData((IFileDialog2*)This);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetFilter(IFileSaveDialog *iface, IShellItemFilter *pFilter)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    return IFileDialog2_SetFilter((IFileDialog2*)This, pFilter);
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetSaveAsItem(IFileSaveDialog* iface, IShellItem *psi)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    FIXME("stub - %p (%p)\n", This, psi);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetProperties(IFileSaveDialog* iface, IPropertyStore *pStore)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    FIXME("stub - %p (%p)\n", This, pStore);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnSetCollectedProperties(IFileSaveDialog* iface,
+                                                               IPropertyDescriptionList *pList,
+                                                               BOOL fAppendDefault)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    FIXME("stub - %p (%p, %d)\n", This, pList, fAppendDefault);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnGetProperties(IFileSaveDialog* iface, IPropertyStore **ppStore)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    FIXME("stub - %p (%p)\n", This, ppStore);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IFileSaveDialog_fnApplyProperties(IFileSaveDialog* iface,
+                                                        IShellItem *psi,
+                                                        IPropertyStore *pStore,
+                                                        HWND hwnd,
+                                                        IFileOperationProgressSink *pSink)
+{
+    FileDialogImpl *This = impl_from_IFileSaveDialog(iface);
+    FIXME("%p (%p, %p, %p, %p)\n", This, psi, pStore, hwnd, pSink);
+    return E_NOTIMPL;
+}
+
+static const IFileSaveDialogVtbl vt_IFileSaveDialog = {
+    IFileSaveDialog_fnQueryInterface,
+    IFileSaveDialog_fnAddRef,
+    IFileSaveDialog_fnRelease,
+    IFileSaveDialog_fnShow,
+    IFileSaveDialog_fnSetFileTypes,
+    IFileSaveDialog_fnSetFileTypeIndex,
+    IFileSaveDialog_fnGetFileTypeIndex,
+    IFileSaveDialog_fnAdvise,
+    IFileSaveDialog_fnUnadvise,
+    IFileSaveDialog_fnSetOptions,
+    IFileSaveDialog_fnGetOptions,
+    IFileSaveDialog_fnSetDefaultFolder,
+    IFileSaveDialog_fnSetFolder,
+    IFileSaveDialog_fnGetFolder,
+    IFileSaveDialog_fnGetCurrentSelection,
+    IFileSaveDialog_fnSetFileName,
+    IFileSaveDialog_fnGetFileName,
+    IFileSaveDialog_fnSetTitle,
+    IFileSaveDialog_fnSetOkButtonLabel,
+    IFileSaveDialog_fnSetFileNameLabel,
+    IFileSaveDialog_fnGetResult,
+    IFileSaveDialog_fnAddPlace,
+    IFileSaveDialog_fnSetDefaultExtension,
+    IFileSaveDialog_fnClose,
+    IFileSaveDialog_fnSetClientGuid,
+    IFileSaveDialog_fnClearClientData,
+    IFileSaveDialog_fnSetFilter,
+    IFileSaveDialog_fnSetSaveAsItem,
+    IFileSaveDialog_fnSetProperties,
+    IFileSaveDialog_fnSetCollectedProperties,
+    IFileSaveDialog_fnGetProperties,
+    IFileSaveDialog_fnApplyProperties
+};
+
+static HRESULT FileDialog_constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv, REFCLSID type)
+{
+    FileDialogImpl *fdimpl;
+    HRESULT hr;
+    TRACE("%p, %s, %p\n", pUnkOuter, debugstr_guid(riid), ppv);
+
+    if(!ppv)
+        return E_POINTER;
+    if(pUnkOuter)
+        return CLASS_E_NOAGGREGATION;
+
+    fdimpl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FileDialogImpl));
+    if(!fdimpl)
+        return E_OUTOFMEMORY;
+
+    fdimpl->IFileDialog2_iface.lpVtbl = &vt_IFileDialog2;
+
+    if(IsEqualCLSID(type, &CLSID_FileOpenDialog))
+        fdimpl->IFileOpenDialog_iface.lpVtbl = &vt_IFileOpenDialog;
+    else
+        fdimpl->IFileSaveDialog_iface.lpVtbl = &vt_IFileSaveDialog;
+
+    IUnknown_AddRef((IUnknown*)fdimpl);
+    hr = IUnknown_QueryInterface((IUnknown*)fdimpl, riid, ppv);
+    IUnknown_Release((IUnknown*)fdimpl);
+
+    return hr;
+}
+
+HRESULT FileOpenDialog_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv)
+{
+    return FileDialog_constructor(pUnkOuter, riid, ppv, &CLSID_FileOpenDialog);
+}
+
+HRESULT FileSaveDialog_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv)
+{
+    return FileDialog_constructor(pUnkOuter, riid, ppv, &CLSID_FileSaveDialog);
+}
-- 
1.7.4.1




More information about the wine-patches mailing list