[ros-diffs] [janderwald] 35301: - implement deleting file using recyclebin api - play a sound on when requested using the user default for emptying recycle bin - rename shlfldr_mydocuments.c

janderwald at svn.reactos.org janderwald at svn.reactos.org
Wed Aug 13 10:45:21 CEST 2008


Author: janderwald
Date: Wed Aug 13 03:45:20 2008
New Revision: 35301

URL: http://svn.reactos.org/svn/reactos?rev=35301&view=rev
Log:
- implement deleting file using recyclebin api
- play a sound on when requested using the user default for emptying recycle bin
- rename shlfldr_mydocuments.c

Added:
    trunk/reactos/dll/win32/shell32/shfldr_mydocuments.c
      - copied unchanged from r35298, trunk/reactos/dll/win32/shell32/shlfldr_mydocuments.c
Removed:
    trunk/reactos/dll/win32/shell32/shlfldr_mydocuments.c
Modified:
    trunk/reactos/dll/win32/shell32/shell32.rbuild
    trunk/reactos/dll/win32/shell32/shellord.c
    trunk/reactos/dll/win32/shell32/shfldr_recyclebin.c

Modified: trunk/reactos/dll/win32/shell32/shell32.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shell32.rbuild?rev=35301&r1=35300&r2=35301&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/shell32.rbuild [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shell32.rbuild [iso-8859-1] Wed Aug 13 03:45:20 2008
@@ -24,6 +24,7 @@
 	<library>version</library>
 	<library>devmgr</library>
 	<library>winspool</library>
+	<library>winmm</library>
 	<file>authors.c</file>
 	<file>autocomplete.c</file>
 	<file>brsfolder.c</file>
@@ -54,7 +55,7 @@
 	<file>shfldr_desktop.c</file>
 	<file>shfldr_fs.c</file>
 	<file>shfldr_mycomp.c</file>
-	<file>shlfldr_mydocuments.c</file>
+	<file>shfldr_mydocuments.c</file>
 	<file>shfldr_printers.c</file>
 	<file>shlexec.c</file>
 	<file>shlfileop.c</file>

Modified: trunk/reactos/dll/win32/shell32/shellord.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shellord.c?rev=35301&r1=35300&r2=35301&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/shellord.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shellord.c [iso-8859-1] Wed Aug 13 03:45:20 2008
@@ -1962,14 +1962,18 @@
 
     return FALSE;
 }
-
+/*************************************************************************
+ *              SHStartNetConnectionDialog (SHELL32.@)
+ */
 HRESULT WINAPI SHStartNetConnectionDialog(HWND hwnd, LPCSTR pszRemoteName, DWORD dwType)
 {
     FIXME("%p, %s, 0x%08x - stub\n", hwnd, debugstr_a(pszRemoteName), dwType);
 
     return S_OK;
 }
-
+/*************************************************************************
+ *              SHEmptyRecycleBinA (SHELL32.@)
+ */
 HRESULT WINAPI SHEmptyRecycleBinA(HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags)
 {
     LPWSTR szRootPathW = NULL;
@@ -2001,16 +2005,55 @@
 
 HRESULT WINAPI SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags)
 {
-    BOOL ret;
+	WCHAR szPath[MAX_PATH] = {0};
+    DWORD dwSize, dwType;
+    LONG ret;
 
     TRACE("%p, %s, 0x%08x\n", hwnd, debugstr_w(pszRootPath), dwFlags);
-    FIXME("0x%08x flags ignored\n", dwFlags);
-
-    ret = EmptyRecycleBinW(pszRootPath);
+
+    if (!(dwFlags & SHERB_NOCONFIRMATION))
+    {
+        /* FIXME
+         * enumerate available files 
+         * show confirmation dialog 
+         */
+        FIXME("show confirmation dialog\n");
+    }
+
+    if (dwFlags & SHERB_NOPROGRESSUI)
+    {
+        ret = EmptyRecycleBinW(pszRootPath);
+    }
+    else
+    {
+       /* FIXME
+        * show a progress dialog
+        */
+        ret = EmptyRecycleBinW(pszRootPath);
+    }
+
     if (!ret)
         return HRESULT_FROM_WIN32(GetLastError());
 
-    /* FIXME: update icon? */
+    if (!(dwFlags & SHERB_NOSOUND))
+    {
+        dwSize = sizeof(szPath);
+        ret = RegGetValueW(HKEY_CURRENT_USER, 
+                           L"AppEvents\\Schemes\\Apps\\Explorer\\EmptyRecycleBin\\.Current",
+                           NULL,
+                           RRF_RT_REG_EXPAND_SZ,
+                           &dwType,
+                           (PVOID)szPath,
+                           &dwSize);
+        if (ret != ERROR_SUCCESS)
+            return S_OK;
+
+        if (dwType != REG_EXPAND_SZ) /* type dismatch */
+            return S_OK;
+
+        szPath[(sizeof(szPath)/sizeof(WCHAR))-1] = L'\0';
+        PlaySoundW(szPath, NULL, SND_FILENAME);
+    }
     return S_OK;
 }
 

Modified: trunk/reactos/dll/win32/shell32/shfldr_recyclebin.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shfldr_recyclebin.c?rev=35301&r1=35300&r2=35301&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/shfldr_recyclebin.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shfldr_recyclebin.c [iso-8859-1] Wed Aug 13 03:45:20 2008
@@ -1109,8 +1109,7 @@
         }
         else
         {
-            FIXME("implement delete\n");
-            CloseRecycleBinHandle(Context.hDeletedFile);
+            DeleteFileHandleToRecycleBin(Context.hDeletedFile);
             return E_NOTIMPL;
         }
     }
@@ -1647,5 +1646,8 @@
 HRESULT WINAPI SHUpdateRecycleBinIcon(void)
 {
     FIXME("stub\n");
+
+
+
     return S_OK;
 }

Removed: trunk/reactos/dll/win32/shell32/shlfldr_mydocuments.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shlfldr_mydocuments.c?rev=35300&view=auto
==============================================================================
--- trunk/reactos/dll/win32/shell32/shlfldr_mydocuments.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shlfldr_mydocuments.c (removed)
@@ -1,920 +1,0 @@
-
-/*
- *    Virtual MyDocuments Folder
- *
- *    Copyright 2007    Johannes Anderwald
- *
- * 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 "config.h"
-#include "wine/port.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <stdio.h>
-
-#define COBJMACROS
-#define NONAMELESSUNION
-#define NONAMELESSSTRUCT
-
-#include "winerror.h"
-#include "windef.h"
-#include "winbase.h"
-#include "winreg.h"
-#include "wingdi.h"
-#include "winuser.h"
-
-#include "ole2.h"
-#include "shlguid.h"
-
-#include "enumidlist.h"
-#include "pidl.h"
-#include "undocshell.h"
-#include "shell32_main.h"
-#include "shresdef.h"
-#include "shlwapi.h"
-#include "shellfolder.h"
-#include "wine/debug.h"
-#include "debughlp.h"
-#include "shfldr.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL (mydocs);
-
-/***********************************************************************
-*     MyDocumentsfolder implementation
-*/
-
-typedef struct {
-    const IShellFolder2Vtbl *lpVtbl;
-    const IPersistFolder2Vtbl *lpPF2;
-    LONG ref;
-
-    /* both paths are parsible from the MyDocuments */
-    LPWSTR sPathTarget;     /* complete path to target used for enumeration and ChangeNotify */
-    LPITEMIDLIST pidlRoot;  /* absolute pidl */
-
-    UINT cfShellIDList;        /* clipboardformat for IDropTarget */
-    BOOL fAcceptFmt;        /* flag for pending Drop */
-} IGenericSFImpl;
-
-#define _IUnknown_(This)    (IShellFolder*)&(This->lpVtbl)
-#define _IShellFolder_(This)    (IShellFolder*)&(This->lpVtbl)
-
-static const shvheader MyDocumentsSFHeader[] = {
-    {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15},
-    {IDS_SHV_COLUMN2, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
-    {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
-    {IDS_SHV_COLUMN4, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12},
-    {IDS_SHV_COLUMN5, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 5}
-};
-
-#define MYDOCUMENTSSHELLVIEWCOLUMNS 5
-
-/**************************************************************************
- *    ISF_MyDocuments_fnQueryInterface
- *
- * NOTES supports not IPersist/IPersistFolder
- */
-static HRESULT WINAPI ISF_MyDocuments_fnQueryInterface(
-                IShellFolder2 * iface, REFIID riid, LPVOID * ppvObj)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-
-    TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj);
-
-    *ppvObj = NULL;
-
-    if (IsEqualIID (riid, &IID_IUnknown) ||
-        IsEqualIID (riid, &IID_IShellFolder) ||
-        IsEqualIID (riid, &IID_IShellFolder2))
-    {
-        *ppvObj = This;
-    }
-    else if (IsEqualIID (riid, &IID_IPersistFolder) ||
-             IsEqualIID (riid, &IID_IPersistFolder2))
-    {
-        *ppvObj = &This->lpPF2;
-    }
-    if (*ppvObj)
-    {
-        IUnknown_AddRef ((IUnknown *) (*ppvObj));
-        TRACE ("-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj);
-        return S_OK;
-    }
-    TRACE ("-- Interface: E_NOINTERFACE\n");
-    return E_NOINTERFACE;
-}
-
-static ULONG WINAPI ISF_MyDocuments_fnAddRef (IShellFolder2 * iface)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-    ULONG refCount = InterlockedIncrement(&This->ref);
-
-    TRACE ("(%p)->(count=%u)\n", This, refCount - 1);
-
-    return refCount;
-}
-
-static ULONG WINAPI ISF_MyDocuments_fnRelease (IShellFolder2 * iface)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-    ULONG refCount = InterlockedDecrement(&This->ref);
-
-    TRACE ("(%p)->(count=%u)\n", This, refCount + 1);
-
-    if (!refCount)
-    {
-        TRACE ("-- destroying IShellFolder(%p)\n", This);
-        SHFree (This->pidlRoot);
-        HeapFree(GetProcessHeap(), 0, This->sPathTarget);
-        HeapFree(GetProcessHeap(), 0, This);
-    }
-    return refCount;
-}
-
-static
-HRESULT
-WINAPI ISF_MyDocuments_fnParseDisplayName (IShellFolder2 * iface,
-                HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName,
-                DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-    WCHAR szElement[MAX_PATH];
-    LPCWSTR szNext = NULL;
-    LPITEMIDLIST pidlTemp = NULL;
-    HRESULT hr = S_OK;
-    CLSID clsid;
-
-    TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
-           This, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName),
-           pchEaten, ppidl, pdwAttributes);
-
-    if (!lpszDisplayName || !ppidl)
-        return E_INVALIDARG;
-
-    *ppidl = 0;
-
-    if (pchEaten)
-        *pchEaten = 0;        /* strange but like the original */
-
-    if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':')
-    {
-        szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH);
-        TRACE ("-- element: %s\n", debugstr_w (szElement));
-        SHCLSIDFromStringW (szElement + 2, &clsid);
-        pidlTemp = _ILCreateGuid (PT_GUID, &clsid);
-    }
-    else if( (pidlTemp = SHELL32_CreatePidlFromBindCtx(pbc, lpszDisplayName)) )
-    {
-        *ppidl = pidlTemp;
-        return S_OK;
-    }
-    else
-    {
-        /* it's a filesystem path on the desktop. Let a FSFolder parse it */
-
-        if (*lpszDisplayName)
-        {
-            WCHAR szPath[MAX_PATH];
-            LPWSTR pathPtr;
-
-            /* build a complete path to create a simple pidl */
-            lstrcpynW(szPath, This->sPathTarget, MAX_PATH);
-            pathPtr = PathAddBackslashW(szPath);
-            if (pathPtr)
-            {
-                lstrcpynW(pathPtr, lpszDisplayName, MAX_PATH - (pathPtr - szPath));
-                hr = _ILCreateFromPathW(szPath, &pidlTemp);
-            }
-            else
-            {
-                /* should never reach here, but for completeness */
-                hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
-            }
-        }
-        else
-            pidlTemp = _ILCreateMyDocuments();
-
-        szNext = NULL;
-    }
-
-    if (SUCCEEDED(hr) && pidlTemp)
-    {
-        if (szNext && *szNext)
-        {
-            hr = SHELL32_ParseNextElement(iface, hwndOwner, pbc,
-                    &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes);
-        }
-        else
-        {
-            if (pdwAttributes && *pdwAttributes)
-                hr = SHELL32_GetItemAttributes(_IShellFolder_ (This),
-                                               pidlTemp, pdwAttributes);
-        }
-    }
-
-    *ppidl = pidlTemp;
-
-    TRACE ("(%p)->(-- ret=0x%08x)\n", This, hr);
-
-    return hr;
-}
-
-/**************************************************************************
- *  CreateMyDocumentsEnumList()
- */
-static BOOL CreateMyDocumentsEnumList(IEnumIDList *list, DWORD dwFlags)
-{
-    BOOL ret = TRUE;
-    WCHAR szPath[MAX_PATH] = {0};
-
-    TRACE("(%p)->(flags=0x%08x)\n", list, dwFlags);
-
-   /* enumerate the elements in %windir%\desktop */
-    ret = SHGetSpecialFolderPathW(0, szPath, CSIDL_PERSONAL, FALSE);
-    ret = ret && CreateFolderEnumList(list, szPath, dwFlags);
-
-    return ret;
-}
-
-/**************************************************************************
- *        ISF_MyDocuments_fnEnumObjects
- */
-static HRESULT WINAPI ISF_MyDocuments_fnEnumObjects (IShellFolder2 * iface,
-                HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-
-    TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n",
-           This, hwndOwner, dwFlags, ppEnumIDList);
-
-    *ppEnumIDList = IEnumIDList_Constructor();
-    if (*ppEnumIDList)
-        CreateMyDocumentsEnumList(*ppEnumIDList, dwFlags);
-
-    TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
-
-    return *ppEnumIDList ? S_OK : E_OUTOFMEMORY;
-}
-
-/**************************************************************************
- *        ISF_MyDocuments_fnBindToObject
- */
-static HRESULT WINAPI ISF_MyDocuments_fnBindToObject (IShellFolder2 * iface,
-                LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-
-    TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n",
-           This, pidl, pbcReserved, shdebugstr_guid (riid), ppvOut);
-
-    return SHELL32_BindToChild( This->pidlRoot, This->sPathTarget, pidl, riid, ppvOut );
-}
-
-/**************************************************************************
- *    ISF_MyDocuments_fnBindToStorage
- */
-static
-HRESULT
-WINAPI
-ISF_MyDocuments_fnBindToStorage (IShellFolder2 * iface,
-                LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-
-    FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n",
-           This, pidl, pbcReserved, shdebugstr_guid (riid), ppvOut);
-
-    *ppvOut = NULL;
-    return E_NOTIMPL;
-}
-
-/**************************************************************************
- *     ISF_MyDocuments_fnCompareIDs
- */
-static HRESULT WINAPI ISF_MyDocuments_fnCompareIDs (IShellFolder2 * iface,
-                        LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-    int nReturn;
-
-    TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", This, lParam, pidl1, pidl2);
-    nReturn = SHELL32_CompareIDs (_IShellFolder_ (This), lParam, pidl1, pidl2);
-    TRACE ("-- %i\n", nReturn);
-    return nReturn;
-}
-
-/**************************************************************************
- *    ISF_MyDocuments_fnCreateViewObject
- */
-static HRESULT WINAPI ISF_MyDocuments_fnCreateViewObject (IShellFolder2 * iface,
-                              HWND hwndOwner, REFIID riid, LPVOID * ppvOut)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-    LPSHELLVIEW pShellView;
-    HRESULT hr = E_INVALIDARG;
-
-    TRACE ("(%p)->(hwnd=%p,%s,%p)\n",
-           This, hwndOwner, shdebugstr_guid (riid), ppvOut);
-
-    if (!ppvOut)
-        return hr;
-
-    *ppvOut = NULL;
-
-    if (IsEqualIID (riid, &IID_IDropTarget))
-    {
-        WARN ("IDropTarget not implemented\n");
-        hr = E_NOTIMPL;
-    }
-    else if (IsEqualIID (riid, &IID_IContextMenu))
-    {
-        WARN ("IContextMenu not implemented\n");
-        hr = E_NOTIMPL;
-    }
-    else if (IsEqualIID (riid, &IID_IShellView))
-    {
-        pShellView = IShellView_Constructor ((IShellFolder *) iface);
-        if (pShellView)
-        {
-            hr = IShellView_QueryInterface (pShellView, riid, ppvOut);
-            IShellView_Release (pShellView);
-        }
-    }
-    TRACE ("-- (%p)->(interface=%p)\n", This, ppvOut);
-    return hr;
-}
-
-/**************************************************************************
- *  ISF_MyDocuments_fnGetAttributesOf
- */
-static HRESULT WINAPI ISF_MyDocuments_fnGetAttributesOf (IShellFolder2 * iface,
-                UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-    HRESULT hr = S_OK;
-    static const DWORD dwMyDocumentsAttributes =
-        SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR |
-        SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER;
-
-    TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
-           This, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
-
-    if (!rgfInOut)
-        return E_INVALIDARG;
-    if (cidl && !apidl)
-        return E_INVALIDARG;
-
-    if (*rgfInOut == 0)
-        *rgfInOut = ~0;
-
-    if(cidl == 0) {
-        *rgfInOut &= dwMyDocumentsAttributes;
-    } else {
-        while (cidl > 0 && *apidl) {
-            pdump (*apidl);
-            if (_ILIsMyDocuments(*apidl)) {
-                *rgfInOut &= dwMyDocumentsAttributes;
-            } else {
-                SHELL32_GetItemAttributes (_IShellFolder_ (This), *apidl, rgfInOut);
-            }
-            apidl++;
-            cidl--;
-        }
-    }
-    /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
-    *rgfInOut &= ~SFGAO_VALIDATE;
-
-    TRACE ("-- result=0x%08x\n", *rgfInOut);
-
-    return hr;
-}
-
-/**************************************************************************
- *    ISF_MyDocuments_fnGetUIObjectOf
- *
- * PARAMETERS
- *  HWND           hwndOwner, //[in ] Parent window for any output
- *  UINT           cidl,      //[in ] array size
- *  LPCITEMIDLIST* apidl,     //[in ] simple pidl array
- *  REFIID         riid,      //[in ] Requested Interface
- *  UINT*          prgfInOut, //[   ] reserved
- *  LPVOID*        ppvObject) //[out] Resulting Interface
- *
- */
-static HRESULT WINAPI ISF_MyDocuments_fnGetUIObjectOf (IShellFolder2 * iface,
-                HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl,
-                REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-
-    LPITEMIDLIST pidl;
-    IUnknown *pObj = NULL;
-    HRESULT hr = E_INVALIDARG;
-
-    TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
-       This, hwndOwner, cidl, apidl, shdebugstr_guid (riid), prgfInOut, ppvOut);
-
-    if (!ppvOut)
-        return hr;
-
-    *ppvOut = NULL;
-
-    if (IsEqualIID (riid, &IID_IContextMenu))
-    {
-        hr = CDefFolderMenu_Create2(This->pidlRoot, hwndOwner, cidl, apidl, (IShellFolder*)iface, NULL, 0, NULL, (IContextMenu**)&pObj);
-    }
-    else if (IsEqualIID (riid, &IID_IDataObject) && (cidl >= 1))
-    {
-        pObj = (LPUNKNOWN) IDataObject_Constructor( hwndOwner,
-                                                  This->pidlRoot, apidl, cidl);
-        hr = S_OK;
-    }
-    else if (IsEqualIID (riid, &IID_IExtractIconA) && (cidl == 1))
-    {
-        pidl = ILCombine (This->pidlRoot, apidl[0]);
-        pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl);
-        SHFree (pidl);
-        hr = S_OK;
-    }
-    else if (IsEqualIID (riid, &IID_IExtractIconW) && (cidl == 1))
-    {
-        pidl = ILCombine (This->pidlRoot, apidl[0]);
-        pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl);
-        SHFree (pidl);
-        hr = S_OK;
-    }
-    else if (IsEqualIID (riid, &IID_IDropTarget) && (cidl >= 1))
-    {
-        hr = IShellFolder_QueryInterface (iface,
-                                          &IID_IDropTarget, (LPVOID *) & pObj);
-    }
-    else if ((IsEqualIID(riid,&IID_IShellLinkW) ||
-              IsEqualIID(riid,&IID_IShellLinkA)) && (cidl == 1))
-    {
-        pidl = ILCombine (This->pidlRoot, apidl[0]);
-        hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj);
-        SHFree (pidl);
-    }
-    else
-        hr = E_NOINTERFACE;
-
-    if (SUCCEEDED(hr) && !pObj)
-        hr = E_OUTOFMEMORY;
-
-    *ppvOut = pObj;
-    TRACE ("(%p)->hr=0x%08x\n", This, hr);
-    return hr;
-}
-
-static
-HRESULT
-WINAPI ISF_MyDocuments_fnGetDisplayNameOf (IShellFolder2 * iface,
-                LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-    HRESULT hr = S_OK;
-    LPWSTR pszPath;
-
-    TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", This, pidl, dwFlags, strRet);
-    pdump (pidl);
-
-    if (!strRet)
-        return E_INVALIDARG;
-
-    pszPath = CoTaskMemAlloc((MAX_PATH +1) * sizeof(WCHAR));
-    if (!pszPath)
-        return E_OUTOFMEMORY;
-
-    ZeroMemory(pszPath, (MAX_PATH +1) * sizeof(WCHAR));
-
-    if (_ILIsMyDocuments (pidl))
-    {
-        if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
-            (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
-            strcpyW(pszPath, This->sPathTarget);
-        else
-            HCR_GetClassNameW(&CLSID_MyDocuments, pszPath, MAX_PATH);
-        TRACE("CP\n");
-    }
-    else if (_ILIsPidlSimple (pidl))
-    {
-        GUID const *clsid;
-
-        if ((clsid = _ILGetGUIDPointer (pidl)))
-        {
-            if (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING)
-            {
-                int bWantsForParsing;
-
-                /*
-                 * We can only get a filesystem path from a shellfolder if the
-                 *  value WantsFORPARSING in CLSID\\{...}\\shellfolder exists.
-                 *
-                 * Exception: The MyComputer folder doesn't have this key,
-                 *   but any other filesystem backed folder it needs it.
-                 */
-                if (IsEqualIID (clsid, &CLSID_MyDocuments))
-                {
-                    bWantsForParsing = TRUE;
-                }
-                else
-                {
-                    /* get the "WantsFORPARSING" flag from the registry */
-                    static const WCHAR clsidW[] =
-                     { 'C','L','S','I','D','\\',0 };
-                    static const WCHAR shellfolderW[] =
-                     { '\\','s','h','e','l','l','f','o','l','d','e','r',0 };
-                    static const WCHAR wantsForParsingW[] =
-                     { 'W','a','n','t','s','F','o','r','P','a','r','s','i','n',
-                     'g',0 };
-                    WCHAR szRegPath[100];
-                    LONG r;
-
-                    lstrcpyW (szRegPath, clsidW);
-                    SHELL32_GUIDToStringW (clsid, &szRegPath[6]);
-                    lstrcatW (szRegPath, shellfolderW);
-                    r = SHGetValueW(HKEY_CLASSES_ROOT, szRegPath,
-                                    wantsForParsingW, NULL, NULL, NULL);
-                    if (r == ERROR_SUCCESS)
-                        bWantsForParsing = TRUE;
-                    else
-                        bWantsForParsing = FALSE;
-                }
-
-                if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
-                     bWantsForParsing)
-                {
-                    /*
-                     * we need the filesystem path to the destination folder.
-                     * Only the folder itself can know it
-                     */
-                    hr = SHELL32_GetDisplayNameOfChild (iface, pidl, dwFlags,
-                                                        pszPath,
-                                                        MAX_PATH);
-                            TRACE("CP\n");
-                }
-                else
-                {
-                    /* parsing name like ::{...} */
-                    pszPath[0] = ':';
-                    pszPath[1] = ':';
-                    SHELL32_GUIDToStringW (clsid, &pszPath[2]);
-                            TRACE("CP\n");
-                }
-            }
-            else
-            {
-                /* user friendly name */
-                HCR_GetClassNameW (clsid, pszPath, MAX_PATH);
-                        TRACE("CP\n");
-            }
-        }
-        else
-        {
-            int cLen = 0;
-
-            /* file system folder or file rooted at the desktop */
-            if ((GET_SHGDN_FOR(dwFlags) == SHGDN_FORPARSING) &&
-                (GET_SHGDN_RELATION(dwFlags) != SHGDN_INFOLDER))
-            {
-                lstrcpynW(pszPath, This->sPathTarget, MAX_PATH - 1);
-                TRACE("CP %s\n", debugstr_w(pszPath));
-            }
-
-            if (!_ILIsDesktop(pidl))
-            {
-                PathAddBackslashW(pszPath);
-                cLen = lstrlenW(pszPath);
-                _ILSimpleGetTextW(pidl, pszPath + cLen, MAX_PATH - cLen);
-                if (!_ILIsFolder(pidl))
-                {
-                    SHELL_FS_ProcessDisplayFilename(pszPath, dwFlags);
-                            TRACE("CP\n");
-                }
-            }
-        }
-    }
-    else
-    {
-        /* a complex pidl, let the subfolder do the work */
-        hr = SHELL32_GetDisplayNameOfChild (iface, pidl, dwFlags,
-                                            pszPath, MAX_PATH);
-                        TRACE("CP\n");                                
-    }
-
-    if (SUCCEEDED(hr))
-    {
-        strRet->uType = STRRET_WSTR;
-        strRet->u.pOleStr = pszPath;
-    }
-    else
-        CoTaskMemFree(pszPath);
-
-    TRACE ("-- (%p)->(%s,0x%08x)\n", This, debugstr_w(strRet->u.pOleStr), hr);
-    return hr;
-}
-
-static HRESULT WINAPI ISF_MyDocuments_fnSetNameOf (IShellFolder2 * iface,
-                HWND hwndOwner, LPCITEMIDLIST pidl,    /* simple pidl */
-                LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-
-    FIXME ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", This, hwndOwner, pidl,
-           debugstr_w (lpName), dwFlags, pPidlOut);
-
-    return E_FAIL;
-}
-
-static HRESULT WINAPI ISF_MyDocuments_fnGetDefaultSearchGUID(IShellFolder2 *iface,
-                GUID * pguid)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-
-    FIXME ("(%p)\n", This);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI ISF_MyDocuments_fnEnumSearches (IShellFolder2 *iface,
-                IEnumExtraSearch ** ppenum)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-    FIXME ("(%p)\n", This);
-    return E_NOTIMPL;
-}
-
-static
-HRESULT
-WINAPI
-ISF_MyDocuments_fnGetDefaultColumn (IShellFolder2 * iface,
-                DWORD dwRes, ULONG * pSort, ULONG * pDisplay)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-
-    TRACE ("(%p)\n", This);
-
-    if (pSort)
-        *pSort = 0;
-    if (pDisplay)
-        *pDisplay = 0;
-
-    return S_OK;
-}
-static
-HRESULT
-WINAPI
-ISF_MyDocuments_fnGetDefaultColumnState (IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-
-    TRACE ("(%p)\n", This);
-
-    if (!pcsFlags || iColumn >= MYDOCUMENTSSHELLVIEWCOLUMNS)
-    return E_INVALIDARG;
-
-    *pcsFlags = MyDocumentsSFHeader[iColumn].pcsFlags;
-
-    return S_OK;
-}
-
-static
-HRESULT
-WINAPI
-ISF_MyDocuments_fnGetDetailsEx (IShellFolder2 * iface, LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-    FIXME ("(%p)\n", This);
-
-    return E_NOTIMPL;
-}
-
-static 
-HRESULT
-WINAPI
-ISF_MyDocuments_fnGetDetailsOf (IShellFolder2 * iface, LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-
-    HRESULT hr = S_OK;
-
-    TRACE ("(%p)->(%p %i %p)\n", This, pidl, iColumn, psd);
-
-    if (!psd || iColumn >= MYDOCUMENTSSHELLVIEWCOLUMNS)
-        return E_INVALIDARG;
-
-    if (!pidl)
-    {
-        psd->fmt = MyDocumentsSFHeader[iColumn].fmt;
-        psd->cxChar = MyDocumentsSFHeader[iColumn].cxChar;
-        psd->str.uType = STRRET_CSTR;
-        LoadStringA (shell32_hInstance, MyDocumentsSFHeader[iColumn].colnameid,
-                     psd->str.u.cStr, MAX_PATH);
-        return S_OK;
-    }
-
-    /* the data from the pidl */
-    psd->str.uType = STRRET_CSTR;
-    switch (iColumn)
-    {
-    case 0:        /* name */
-        hr = IShellFolder_GetDisplayNameOf(iface, pidl,
-                   SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
-        break;
-    case 1:        /* size */
-        _ILGetFileSize (pidl, psd->str.u.cStr, MAX_PATH);
-        break;
-    case 2:        /* type */
-        _ILGetFileType (pidl, psd->str.u.cStr, MAX_PATH);
-        break;
-    case 3:        /* date */
-        _ILGetFileDate (pidl, psd->str.u.cStr, MAX_PATH);
-        break;
-    case 4:        /* attributes */
-        _ILGetFileAttributes (pidl, psd->str.u.cStr, MAX_PATH);
-        break;
-    }
-
-    return hr;
-}
-
-static 
-HRESULT
-WINAPI
-ISF_MyDocuments_fnMapColumnToSCID (IShellFolder2 * iface, UINT column, SHCOLUMNID * pscid)
-{
-    IGenericSFImpl *This = (IGenericSFImpl *)iface;
-    FIXME ("(%p)\n", This);
-    return E_NOTIMPL;
-}
-
-static const IShellFolder2Vtbl vt_MCFldr_ShellFolder2 =
-{
-    ISF_MyDocuments_fnQueryInterface,
-    ISF_MyDocuments_fnAddRef,
-    ISF_MyDocuments_fnRelease,
-    ISF_MyDocuments_fnParseDisplayName,
-    ISF_MyDocuments_fnEnumObjects,
-    ISF_MyDocuments_fnBindToObject,
-    ISF_MyDocuments_fnBindToStorage,
-    ISF_MyDocuments_fnCompareIDs,
-    ISF_MyDocuments_fnCreateViewObject,
-    ISF_MyDocuments_fnGetAttributesOf,
-    ISF_MyDocuments_fnGetUIObjectOf,
-    ISF_MyDocuments_fnGetDisplayNameOf,
-    ISF_MyDocuments_fnSetNameOf,
-    /* ShellFolder2 */
-    ISF_MyDocuments_fnGetDefaultSearchGUID,
-    ISF_MyDocuments_fnEnumSearches,
-    ISF_MyDocuments_fnGetDefaultColumn,
-    ISF_MyDocuments_fnGetDefaultColumnState,
-    ISF_MyDocuments_fnGetDetailsEx,
-    ISF_MyDocuments_fnGetDetailsOf,
-    ISF_MyDocuments_fnMapColumnToSCID
-};
-
-static inline IGenericSFImpl *impl_from_IPersistFolder2( IPersistFolder2 *iface )
-{
-    return (IGenericSFImpl *)((char*)iface - FIELD_OFFSET(IGenericSFImpl, lpPF2));
-}
-
-static HRESULT WINAPI
-ISF_MyDocuments_PersistFolder2_fnQueryInterface (IPersistFolder2 * iface, REFIID iid, LPVOID * ppvObj)
-{
-    IGenericSFImpl *This = impl_from_IPersistFolder2(iface);
-
-    TRACE ("(%p)\n", This);
-
-    return ISF_MyDocuments_fnQueryInterface ((IShellFolder2*)This, iid, ppvObj);
-}
-
-static ULONG WINAPI
-ISF_MyDocuments_PersistFolder2_fnAddRef (IPersistFolder2 * iface)
-{
-    IGenericSFImpl *This = impl_from_IPersistFolder2(iface);
-
-    TRACE ("(%p)->(count=%u)\n", This, This->ref);
-
-    return ISF_MyDocuments_fnAddRef((IShellFolder2*)This);
-}
-
-static ULONG WINAPI
-ISF_MyDocuments_PersistFolder2_fnRelease (IPersistFolder2 * iface)
-{
-    IGenericSFImpl *This = impl_from_IPersistFolder2(iface);
-
-    TRACE ("(%p)->(count=%u)\n", This, This->ref);
-
-    return ISF_MyDocuments_fnRelease ((IShellFolder2*)This);
-}
-
-static HRESULT WINAPI
-ISF_MyDocuments_PersistFolder2_fnGetClassID (IPersistFolder2 * iface, CLSID * lpClassId)
-{
-    IGenericSFImpl *This = impl_from_IPersistFolder2(iface);
-
-    static GUID const CLSID_MyDocuments = 
-    { 0x450d8fba, 0xad25, 0x11d0, {0x98,0xa8,0x08,0x00,0x36,0x1b,0x11,0x03} };
-
-    TRACE ("(%p)\n", This);
-
-    if (!lpClassId)
-        return E_POINTER;
-
-    memcpy(lpClassId, &CLSID_MyDocuments, sizeof(GUID));
-
-    return S_OK;
-}
-static HRESULT WINAPI
-ISF_MyDocuments_PersistFolder2_fnInitialize (IPersistFolder2 * iface, LPCITEMIDLIST pidl)
-{
-    IGenericSFImpl *This = impl_from_IPersistFolder2(iface);
-
-    TRACE ("(%p)->(%p)\n", This, pidl);
-
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI
-ISF_MyDocuments_PersistFolder2_fnGetCurFolder (IPersistFolder2 * iface,
-                                       LPITEMIDLIST * pidl)
-{
-    IGenericSFImpl *This = impl_from_IPersistFolder2(iface);
-
-    TRACE ("(%p)->(%p)\n", This, pidl);
-
-    if (!pidl) return E_POINTER;
-    *pidl = ILClone (This->pidlRoot);
-    return S_OK;
-}
-
-static const IPersistFolder2Vtbl vt_FSFldr_PersistFolder2 =
-{
-    ISF_MyDocuments_PersistFolder2_fnQueryInterface,
-    ISF_MyDocuments_PersistFolder2_fnAddRef,
-    ISF_MyDocuments_PersistFolder2_fnRelease,
-    ISF_MyDocuments_PersistFolder2_fnGetClassID,
-    ISF_MyDocuments_PersistFolder2_fnInitialize,
-    ISF_MyDocuments_PersistFolder2_fnGetCurFolder,
-};
-
-
-/**************************************************************************
- *    ISF_MyDocuments_Constructor
- */
-HRESULT WINAPI ISF_MyDocuments_Constructor (
-                IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv)
-{
-    static IGenericSFImpl *cached_sf;
-    WCHAR szMyPath[MAX_PATH];
-
-    TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid));
-
-    if (!ppv)
-        return E_POINTER;
-    if (pUnkOuter)
-        return CLASS_E_NOAGGREGATION;
-
-    if (!cached_sf)
-    {
-        IGenericSFImpl *sf;
-
-        if (!SHGetSpecialFolderPathW( 0, szMyPath, CSIDL_PERSONAL, TRUE ))
-            return E_UNEXPECTED;
-
-        sf = LocalAlloc( LMEM_ZEROINIT, sizeof (IGenericSFImpl) );
-        if (!sf)
-            return E_OUTOFMEMORY;
-
-        sf->ref = 1;
-        sf->lpVtbl = &vt_MCFldr_ShellFolder2;
-        sf->lpPF2 = &vt_FSFldr_PersistFolder2;
-        sf->pidlRoot = _ILCreateMyDocuments();    /* my qualified pidl */
-        sf->sPathTarget = SHAlloc( (lstrlenW(szMyPath) + 1)*sizeof(WCHAR) );
-        lstrcpyW( sf->sPathTarget, szMyPath );
-
-        if (InterlockedCompareExchangePointer((void *)&cached_sf, sf, NULL) != NULL)
-        {
-            /* some other thread already been here */
-            SHFree( sf->pidlRoot );
-            SHFree( sf->sPathTarget );
-            LocalFree( sf );
-        }
-    }
-
-    return IUnknown_QueryInterface( _IUnknown_(cached_sf), riid, ppv );
-}



More information about the Ros-diffs mailing list