wine/dlls/shell32 shfldr_unixfs.c
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Nov 28 04:58:58 CST 2005
ChangeSet ID: 21441
CVSROOT: /opt/cvs-commit
Module name: wine
Changes by: julliard at winehq.org 2005/11/28 04:58:58
Modified files:
dlls/shell32 : shfldr_unixfs.c
Log message:
Michael Jung <mjung at iss.tu-darmstadt.de>
Initial stubbed implementation of UnixFolder's IDropTarget interface.
Patch: http://cvs.winehq.org/patch.py?id=21441
Old revision New revision Changes Path
1.61 1.62 +89 -12 wine/dlls/shell32/shfldr_unixfs.c
Index: wine/dlls/shell32/shfldr_unixfs.c
diff -u -p wine/dlls/shell32/shfldr_unixfs.c:1.61 wine/dlls/shell32/shfldr_unixfs.c:1.62
--- wine/dlls/shell32/shfldr_unixfs.c:1.61 28 Nov 2005 10:58:58 -0000
+++ wine/dlls/shell32/shfldr_unixfs.c 28 Nov 2005 10:58:58 -0000
@@ -185,10 +185,11 @@ const GUID CLSID_UnixDosFolder = {0x9d20
/* UnixFolder object layout and typedef.
*/
typedef struct _UnixFolder {
- const IShellFolder2Vtbl *lpIShellFolder2Vtbl;
- const IPersistFolder3Vtbl *lpIPersistFolder3Vtbl;
+ const IShellFolder2Vtbl *lpIShellFolder2Vtbl;
+ const IPersistFolder3Vtbl *lpIPersistFolder3Vtbl;
const IPersistPropertyBagVtbl *lpIPersistPropertyBagVtbl;
- const ISFHelperVtbl *lpISFHelperVtbl;
+ const IDropTargetVtbl *lpIDropTargetVtbl;
+ const ISFHelperVtbl *lpISFHelperVtbl;
LONG m_cRef;
CHAR *m_pszPath; /* Target path of the shell folder */
LPITEMIDLIST m_pidlLocation; /* Location in the shell namespace */
@@ -672,15 +673,17 @@ static HRESULT WINAPI UnixFolder_IShellF
if (IsEqualIID(&IID_IUnknown, riid) || IsEqualIID(&IID_IShellFolder, riid) ||
IsEqualIID(&IID_IShellFolder2, riid))
{
- *ppv = &This->lpIShellFolder2Vtbl;
+ *ppv = STATIC_CAST(IShellFolder2, This);
} else if (IsEqualIID(&IID_IPersistFolder3, riid) || IsEqualIID(&IID_IPersistFolder2, riid) ||
IsEqualIID(&IID_IPersistFolder, riid) || IsEqualIID(&IID_IPersist, riid))
{
- *ppv = &This->lpIPersistFolder3Vtbl;
+ *ppv = STATIC_CAST(IPersistFolder3, This);
} else if (IsEqualIID(&IID_IPersistPropertyBag, riid)) {
- *ppv = &This->lpIPersistPropertyBagVtbl;
+ *ppv = STATIC_CAST(IPersistPropertyBag, This);
} else if (IsEqualIID(&IID_ISFHelper, riid)) {
- *ppv = &This->lpISFHelperVtbl;
+ *ppv = STATIC_CAST(ISFHelper, This);
+ } else if (IsEqualIID(&IID_IDropTarget, riid)) {
+ *ppv = STATIC_CAST(IDropTarget, This);
} else {
*ppv = NULL;
return E_NOINTERFACE;
@@ -881,7 +884,9 @@ static HRESULT WINAPI UnixFolder_IShellF
hr = IShellView_QueryInterface(pShellView, riid, ppv);
IShellView_Release(pShellView);
}
- }
+ } else if (IsEqualIID(&IID_IDropTarget, riid)) {
+ hr = IShellFolder2_QueryInterface(iface, &IID_IDropTarget, ppv);
+ }
return hr;
}
@@ -928,10 +933,18 @@ static HRESULT WINAPI UnixFolder_IShellF
UINT cidl, LPCITEMIDLIST* apidl, REFIID riid, UINT* prgfInOut, void** ppvOut)
{
UnixFolder *This = ADJUST_THIS(UnixFolder, IShellFolder2, iface);
+ UINT i;
TRACE("(iface=%p, hwndOwner=%p, cidl=%d, apidl=%p, riid=%s, prgfInOut=%p, ppv=%p)\n",
iface, hwndOwner, cidl, apidl, debugstr_guid(riid), prgfInOut, ppvOut);
+ if (!cidl || !apidl || !riid || !ppvOut)
+ return E_INVALIDARG;
+
+ for (i=0; i<cidl; i++)
+ if (!apidl[i])
+ return E_INVALIDARG;
+
if (IsEqualIID(&IID_IContextMenu, riid)) {
*ppvOut = ISvItemCm_Constructor((IShellFolder*)iface, This->m_pidlLocation, apidl, cidl);
return S_OK;
@@ -940,21 +953,21 @@ static HRESULT WINAPI UnixFolder_IShellF
return S_OK;
} else if (IsEqualIID(&IID_IExtractIconA, riid)) {
LPITEMIDLIST pidl;
- if (cidl != 1) return E_FAIL;
+ if (cidl != 1) return E_INVALIDARG;
pidl = ILCombine(This->m_pidlLocation, apidl[0]);
*ppvOut = (LPVOID)IExtractIconA_Constructor(pidl);
SHFree(pidl);
return S_OK;
} else if (IsEqualIID(&IID_IExtractIconW, riid)) {
LPITEMIDLIST pidl;
- if (cidl != 1) return E_FAIL;
+ if (cidl != 1) return E_INVALIDARG;
pidl = ILCombine(This->m_pidlLocation, apidl[0]);
*ppvOut = (LPVOID)IExtractIconW_Constructor(pidl);
SHFree(pidl);
return S_OK;
} else if (IsEqualIID(&IID_IDropTarget, riid)) {
- FIXME("IDropTarget\n");
- return E_FAIL;
+ if (cidl != 1) return E_INVALIDARG;
+ return IShellFolder2_BindToObject(iface, apidl[0], NULL, &IID_IDropTarget, ppvOut);
} else if (IsEqualIID(&IID_IShellLinkW, riid)) {
FIXME("IShellLinkW\n");
return E_FAIL;
@@ -1694,6 +1707,69 @@ static const ISFHelperVtbl UnixFolder_IS
UnixFolder_ISFHelper_CopyItems
};
+static HRESULT WINAPI UnixFolder_IDropTarget_QueryInterface(IDropTarget* iface, REFIID riid,
+ void** ppvObject)
+{
+ return UnixFolder_IShellFolder2_QueryInterface(
+ (IShellFolder2*)ADJUST_THIS(UnixFolder, IDropTarget, iface), riid, ppvObject);
+}
+
+static ULONG WINAPI UnixFolder_IDropTarget_AddRef(IDropTarget* iface)
+{
+ return UnixFolder_IShellFolder2_AddRef(
+ (IShellFolder2*)ADJUST_THIS(UnixFolder, IDropTarget, iface));
+}
+
+static ULONG WINAPI UnixFolder_IDropTarget_Release(IDropTarget* iface)
+{
+ return UnixFolder_IShellFolder2_Release(
+ (IShellFolder2*)ADJUST_THIS(UnixFolder, IDropTarget, iface));
+}
+
+static HRESULT WINAPI UnixFolder_IDropTarget_DragEnter(IDropTarget *iface, IDataObject *pDataObject,
+ DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
+{
+ FIXME("(iface=%p, pDataObject=%p, dwKeyState=%08lx, pt={.x=%ld, .y=%ld}, pdwEffect=%p) stub\n",
+ iface, pDataObject, dwKeyState, pt.x, pt.y, pdwEffect);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UnixFolder_IDropTarget_DragOver(IDropTarget *iface, DWORD dwKeyState,
+ POINTL pt, DWORD *pdwEffect)
+{
+ FIXME("(iface=%p, dwKeyState=%08lx, pt={.x=%ld, .y=%ld}, pdwEffect=%p) stub\n", iface,
+ dwKeyState, pt.x, pt.y, pdwEffect);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UnixFolder_IDropTarget_DragLeave(IDropTarget *iface) {
+ FIXME("(iface=%p) stub\n", iface);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI UnixFolder_IDropTarget_Drop(IDropTarget *iface, IDataObject *pDataObject,
+ DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
+{
+ FIXME("(iface=%p, pDataObject=%p, dwKeyState=%ld, pt={.x=%ld, .y=%ld}, pdwEffect=%p) stub\n",
+ iface, pDataObject, dwKeyState, pt.x, pt.y, pdwEffect);
+
+ return E_NOTIMPL;
+}
+
+/* VTable for UnixFolder's IDropTarget interface
+ */
+static const IDropTargetVtbl UnixFolder_IDropTarget_Vtbl = {
+ UnixFolder_IDropTarget_QueryInterface,
+ UnixFolder_IDropTarget_AddRef,
+ UnixFolder_IDropTarget_Release,
+ UnixFolder_IDropTarget_DragEnter,
+ UnixFolder_IDropTarget_DragOver,
+ UnixFolder_IDropTarget_DragLeave,
+ UnixFolder_IDropTarget_Drop
+};
+
/******************************************************************************
* Unix[Dos]Folder_Constructor [Internal]
*
@@ -1725,6 +1801,7 @@ static HRESULT CreateUnixFolder(IUnknown
pUnixFolder->lpIPersistFolder3Vtbl = &UnixFolder_IPersistFolder3_Vtbl;
pUnixFolder->lpIPersistPropertyBagVtbl = &UnixFolder_IPersistPropertyBag_Vtbl;
pUnixFolder->lpISFHelperVtbl = &UnixFolder_ISFHelper_Vtbl;
+ pUnixFolder->lpIDropTargetVtbl = &UnixFolder_IDropTarget_Vtbl;
pUnixFolder->m_cRef = 0;
pUnixFolder->m_pszPath = NULL;
pUnixFolder->m_pidlLocation = NULL;
More information about the wine-cvs
mailing list