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