dlls/shell32/shfldr_unixfs.c: implementing IPersistFolder2

Michael Lin mlin at corvu.com.au
Wed May 11 19:47:04 CDT 2005


ChangeLog:
- Implementing IPersistFolder2
- Retrive the correct attributes in ParseDisplayName()


-------------- next part --------------
Index: dlls/shell32/shfldr_unixfs.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shfldr_unixfs.c,v
retrieving revision 1.12
diff -u -r1.12 shfldr_unixfs.c
--- dlls/shell32/shfldr_unixfs.c	9 May 2005 19:33:01 -0000	1.12
+++ dlls/shell32/shfldr_unixfs.c	12 May 2005 00:23:06 -0000
@@ -174,7 +174,7 @@
     int cSubDirs, cPidlLen, res;
     char *pSlash, *pCompletePath, *pNextPathElement;
 
-    TRACE("path=%s, ppidl=%p", debugstr_a(path), ppidl);
+    TRACE("path=%s, ppidl=%p\n", debugstr_a(path), ppidl);
     
     /* Fail, if base + path is not an absolute path */
     if (!ppidl || !path || (path[0] != '/' && (!base || base[0] != '/'))) return FALSE;
@@ -491,7 +491,7 @@
  */
 typedef struct _UnixFolder {
     const IShellFolder2Vtbl  *lpIShellFolder2Vtbl;
-    const IPersistFolderVtbl *lpIPersistFolderVtbl;
+    const IPersistFolder2Vtbl *lpIPersistFolder2Vtbl;
     ULONG m_cRef;
     CHAR *m_pszPath;
     LPITEMIDLIST m_pidlLocation;
@@ -526,8 +526,10 @@
         IsEqualIID(&IID_IShellFolder2, riid)) 
     {
         *ppv = &This->lpIShellFolder2Vtbl;
-    } else if (IsEqualIID(&IID_IPersistFolder, riid) || IsEqualIID(&IID_IPersist, riid)) {
-        *ppv = &This->lpIPersistFolderVtbl;
+    } else if (IsEqualIID(&IID_IPersistFolder2, riid) || IsEqualIID(&IID_IPersistFolder, riid) || 
+               IsEqualIID(&IID_IPersist, riid)) 
+    {
+        *ppv = &This->lpIPersistFolder2Vtbl;
     } else {
         *ppv = NULL;
         return E_NOINTERFACE;
@@ -571,14 +573,24 @@
     TRACE("(iface=%p, hwndOwner=%p, pbcReserved=%p, lpszDisplayName=%s, pchEaten=%p, ppidl=%p, "
           "pdwAttributes=%p) stub\n", iface, hwndOwner, pbcReserved, debugstr_w(lpszDisplayName), 
           pchEaten, ppidl, pdwAttributes);
-
+    pchEaten = NULL;
     cPathLen = lstrlenW(lpszDisplayName);
     pszAnsiPath = (char*)SHAlloc(cPathLen+1);
     WideCharToMultiByte(CP_ACP, 0, lpszDisplayName, -1, pszAnsiPath, cPathLen+1, NULL, NULL);
 
     result = UNIXFS_path_to_pidl(This->m_pszPath, pszAnsiPath, ppidl);
-    if (result && pdwAttributes) 
-        SHELL32_GetItemAttributes((IShellFolder*)iface, *ppidl, pdwAttributes);        
+    if (result && pdwAttributes)
+    {
+	// need to traverse to the last element for the attribute
+	LPCITEMIDLIST pidl, last_pidl;
+	pidl = last_pidl = *ppidl;
+	while(pidl && pidl->mkid.cb)
+	{
+	    last_pidl = pidl;
+	    pidl = ILGetNext(pidl);
+	}
+	SHELL32_GetItemAttributes((IShellFolder*)iface, last_pidl, pdwAttributes);
+    }
 
     SHFree(pszAnsiPath);
    
@@ -610,20 +622,20 @@
     LPBC pbcReserved, REFIID riid, void** ppvOut)
 {
     UnixFolder *This = ADJUST_THIS(UnixFolder, IShellFolder2, iface);
-    IPersistFolder *persistFolder;
+    IPersistFolder2 *persistFolder;
     LPITEMIDLIST pidlSubFolder;
     HRESULT hr;
         
     TRACE("(iface=%p, pidl=%p, pbcReserver=%p, riid=%p, ppvOut=%p)\n", 
             iface, pidl, pbcReserved, riid, ppvOut);
 
-    hr = UnixFolder_Constructor(NULL, &IID_IPersistFolder, (void**)&persistFolder);
+    hr = UnixFolder_Constructor(NULL, &IID_IPersistFolder2, (void**)&persistFolder);
     if (!SUCCEEDED(hr)) return hr;
     hr = IPersistFolder_QueryInterface(persistFolder, riid, (void**)ppvOut);
     
     pidlSubFolder = ILCombine(This->m_pidlLocation, pidl);
-    IPersistFolder_Initialize(persistFolder, pidlSubFolder);
-    IPersistFolder_Release(persistFolder);
+    IPersistFolder2_Initialize(persistFolder, pidlSubFolder);
+    IPersistFolder2_Release(persistFolder);
     ILFree(pidlSubFolder);
 
     return hr;
@@ -946,34 +958,34 @@
     UnixFolder_IShellFolder2_MapColumnToSCID
 };
 
-static HRESULT WINAPI UnixFolder_IPersistFolder_QueryInterface(IPersistFolder* This, REFIID riid, 
+static HRESULT WINAPI UnixFolder_IPersistFolder2_QueryInterface(IPersistFolder2* This, REFIID riid, 
     void** ppvObject)
 {
     return UnixFolder_IShellFolder2_QueryInterface(
-                (IShellFolder2*)ADJUST_THIS(UnixFolder, IPersistFolder, This), riid, ppvObject);
+                (IShellFolder2*)ADJUST_THIS(UnixFolder, IPersistFolder2, This), riid, ppvObject);
 }
 
-static ULONG WINAPI UnixFolder_IPersistFolder_AddRef(IPersistFolder* This)
+static ULONG WINAPI UnixFolder_IPersistFolder2_AddRef(IPersistFolder2* This)
 {
     return UnixFolder_IShellFolder2_AddRef(
-                (IShellFolder2*)ADJUST_THIS(UnixFolder, IPersistFolder, This));
+                (IShellFolder2*)ADJUST_THIS(UnixFolder, IPersistFolder2, This));
 }
 
-static ULONG WINAPI UnixFolder_IPersistFolder_Release(IPersistFolder* This)
+static ULONG WINAPI UnixFolder_IPersistFolder2_Release(IPersistFolder2* This)
 {
     return UnixFolder_IShellFolder2_Release(
-                (IShellFolder2*)ADJUST_THIS(UnixFolder, IPersistFolder, This));
+                (IShellFolder2*)ADJUST_THIS(UnixFolder, IPersistFolder2, This));
 }
 
-static HRESULT WINAPI UnixFolder_IPersistFolder_GetClassID(IPersistFolder* This, CLSID* pClassID)
+static HRESULT WINAPI UnixFolder_IPersistFolder2_GetClassID(IPersistFolder2* This, CLSID* pClassID)
 {
     TRACE("stub\n");
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI UnixFolder_IPersistFolder_Initialize(IPersistFolder* iface, LPCITEMIDLIST pidl)
+static HRESULT WINAPI UnixFolder_IPersistFolder2_Initialize(IPersistFolder2* iface, LPCITEMIDLIST pidl)
 {
-    UnixFolder *This = ADJUST_THIS(UnixFolder, IPersistFolder, iface);
+    UnixFolder *This = ADJUST_THIS(UnixFolder, IPersistFolder2, iface);
     
     TRACE("(iface=%p, pidl=%p)\n", iface, pidl);
 
@@ -984,14 +996,26 @@
     return S_OK;
 }
 
+static HRESULT WINAPI UnixFolder_IPersistFolder2_GetCurFolder(IPersistFolder2* iface, LPITEMIDLIST* ppidl)
+{
+    UnixFolder *This = ADJUST_THIS(UnixFolder, IPersistFolder2, iface);
+    TRACE ("(%p)->(%p)\n", This, ppidl);
+
+    if (!ppidl)
+        return E_POINTER;
+    *ppidl = ILClone (This->m_pidlLocation);
+    return S_OK;
+}
+	
 /* VTable for UnixFolder's IPersistFolder interface.
  */
-static const IPersistFolderVtbl UnixFolder_IPersistFolder_Vtbl = {
-    UnixFolder_IPersistFolder_QueryInterface,
-    UnixFolder_IPersistFolder_AddRef,
-    UnixFolder_IPersistFolder_Release,
-    UnixFolder_IPersistFolder_GetClassID,
-    UnixFolder_IPersistFolder_Initialize
+static const IPersistFolder2Vtbl UnixFolder_IPersistFolder2_Vtbl = {
+    UnixFolder_IPersistFolder2_QueryInterface,
+    UnixFolder_IPersistFolder2_AddRef,
+    UnixFolder_IPersistFolder2_Release,
+    UnixFolder_IPersistFolder2_GetClassID,
+    UnixFolder_IPersistFolder2_Initialize,
+    UnixFolder_IPersistFolder2_GetCurFolder
 };
 
 /******************************************************************************
@@ -1015,7 +1039,7 @@
 
     pUnixFolder = SHAlloc((ULONG)sizeof(UnixFolder));
     pUnixFolder->lpIShellFolder2Vtbl = &UnixFolder_IShellFolder2_Vtbl;
-    pUnixFolder->lpIPersistFolderVtbl = &UnixFolder_IPersistFolder_Vtbl;
+    pUnixFolder->lpIPersistFolder2Vtbl = &UnixFolder_IPersistFolder2_Vtbl;
     pUnixFolder->m_cRef = 0;
     pUnixFolder->m_pszPath = NULL;
     pUnixFolder->m_apidlSubDirs = NULL;


More information about the wine-patches mailing list