Ignore:
Timestamp:
Sep 5, 2001, 3:54:53 PM (24 years ago)
Author:
bird
Message:

Added $Id:$ keyword.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/shell32/shlfolder.c

    r5618 r6650  
     1/* $Id: shlfolder.c,v 1.3 2001-09-05 13:46:59 bird Exp $ */
    12/*
    2  *      Shell Folder stuff
     3 *  Shell Folder stuff
    34 *
    4  *      Copyright 1997  Marcus Meissner
    5  *      Copyright 1998, 1999    Juergen Schmied
    6  *     
    7  *      IShellFolder2 and related interfaces
     5 *  Copyright 1997  Marcus Meissner
     6 *  Copyright 1998, 1999    Juergen Schmied
     7 *
     8 *  IShellFolder2 and related interfaces
    89 *
    910 */
    1011#ifdef __WIN32OS2__
    1112#define WINE_LARGE_INTEGER
    12 #define snprintf(a,b,c,d)       sprintf(a,c,d)
     13#define snprintf(a,b,c,d)   sprintf(a,c,d)
    1314#endif
    1415#include <stdlib.h>
     
    5051typedef struct
    5152{
    52         int     colnameid;
    53         int     pcsFlags;
    54         int     fmt;
    55         int     cxChar;
    56        
     53    int     colnameid;
     54    int pcsFlags;
     55    int fmt;
     56    int cxChar;
     57
    5758} shvheader;
    5859
     
    7273
    7374static LPCWSTR GetNextElementW(LPCWSTR pszNext,LPWSTR pszOut,DWORD dwOut)
    74 {       LPCWSTR   pszTail = pszNext;
    75         DWORD dwCopy;
    76         TRACE("(%s %p 0x%08lx)\n",debugstr_w(pszNext),pszOut,dwOut);
    77 
    78         *pszOut=0x0000;
    79        
    80         if(!pszNext || !*pszNext)
    81           return NULL;
    82 
    83         while(*pszTail && (*pszTail != (WCHAR)'\\'))
    84           pszTail++;
    85 
    86         dwCopy = (WCHAR*)pszTail - (WCHAR*)pszNext + 1;
    87         lstrcpynW(pszOut, pszNext, (dwOut<dwCopy)? dwOut : dwCopy);
    88 
    89         if(*pszTail)
    90            pszTail++;
    91         else
    92            pszTail = NULL;
    93 
    94         TRACE("--(%s %s 0x%08lx %p)\n",debugstr_w(pszNext),debugstr_w(pszOut),dwOut,pszTail);
    95         return pszTail;
     75{   LPCWSTR   pszTail = pszNext;
     76    DWORD dwCopy;
     77    TRACE("(%s %p 0x%08lx)\n",debugstr_w(pszNext),pszOut,dwOut);
     78
     79    *pszOut=0x0000;
     80
     81    if(!pszNext || !*pszNext)
     82      return NULL;
     83
     84    while(*pszTail && (*pszTail != (WCHAR)'\\'))
     85      pszTail++;
     86
     87    dwCopy = (WCHAR*)pszTail - (WCHAR*)pszNext + 1;
     88    lstrcpynW(pszOut, pszNext, (dwOut<dwCopy)? dwOut : dwCopy);
     89
     90    if(*pszTail)
     91       pszTail++;
     92    else
     93       pszTail = NULL;
     94
     95    TRACE("--(%s %s 0x%08lx %p)\n",debugstr_w(pszNext),debugstr_w(pszOut),dwOut,pszTail);
     96    return pszTail;
    9697}
    9798
    9899static HRESULT SHELL32_ParseNextElement(
    99         HWND hwndOwner,
    100         IShellFolder2 * psf,
    101         LPITEMIDLIST * pidlInOut,
    102         LPOLESTR szNext,
    103         DWORD *pEaten,
    104         DWORD *pdwAttributes)
    105 {
    106         HRESULT         hr = E_OUTOFMEMORY;
    107         LPITEMIDLIST    pidlOut, pidlTemp = NULL;
    108         IShellFolder    *psfChild;
    109        
    110         TRACE("(%p, %p, %s)\n",psf, pidlInOut ? *pidlInOut : NULL, debugstr_w(szNext));
    111 
    112 
    113         /* get the shellfolder for the child pidl and let it analyse further */
    114         hr = IShellFolder_BindToObject(psf, *pidlInOut, NULL, &IID_IShellFolder, (LPVOID*)&psfChild);
    115 
    116         if (psfChild)
    117         {
    118           hr = IShellFolder_ParseDisplayName(psfChild, hwndOwner, NULL, szNext, pEaten, &pidlOut, pdwAttributes);
    119           IShellFolder_Release(psfChild);
    120 
    121           pidlTemp = ILCombine(*pidlInOut, pidlOut);
    122 
    123           if (pidlOut)
    124             ILFree(pidlOut);
    125         }
    126 
    127         ILFree(*pidlInOut);
    128         *pidlInOut = pidlTemp;
    129 
    130         TRACE("-- pidl=%p ret=0x%08lx\n", pidlInOut? *pidlInOut: NULL, hr);
    131         return hr;     
     100    HWND hwndOwner,
     101    IShellFolder2 * psf,
     102    LPITEMIDLIST * pidlInOut,
     103    LPOLESTR szNext,
     104    DWORD *pEaten,
     105    DWORD *pdwAttributes)
     106{
     107    HRESULT     hr = E_OUTOFMEMORY;
     108    LPITEMIDLIST    pidlOut, pidlTemp = NULL;
     109    IShellFolder    *psfChild;
     110
     111    TRACE("(%p, %p, %s)\n",psf, pidlInOut ? *pidlInOut : NULL, debugstr_w(szNext));
     112
     113
     114    /* get the shellfolder for the child pidl and let it analyse further */
     115    hr = IShellFolder_BindToObject(psf, *pidlInOut, NULL, &IID_IShellFolder, (LPVOID*)&psfChild);
     116
     117    if (psfChild)
     118    {
     119      hr = IShellFolder_ParseDisplayName(psfChild, hwndOwner, NULL, szNext, pEaten, &pidlOut, pdwAttributes);
     120      IShellFolder_Release(psfChild);
     121
     122      pidlTemp = ILCombine(*pidlInOut, pidlOut);
     123
     124      if (pidlOut)
     125        ILFree(pidlOut);
     126    }
     127
     128    ILFree(*pidlInOut);
     129    *pidlInOut = pidlTemp;
     130
     131    TRACE("-- pidl=%p ret=0x%08lx\n", pidlInOut? *pidlInOut: NULL, hr);
     132    return hr;
    132133}
    133134
    134135/***********************************************************************
    135  *      SHELL32_CoCreateInitSF
     136 *  SHELL32_CoCreateInitSF
    136137 *
    137  *      creates a initialized shell folder
     138 *  creates a initialized shell folder
    138139 */
    139140static HRESULT SHELL32_CoCreateInitSF (
    140         LPITEMIDLIST pidlRoot,
    141         LPITEMIDLIST pidlChild,
    142         REFCLSID clsid,
    143         REFIID iid,
    144         LPVOID * ppvOut)
    145 {
    146         HRESULT hr;
    147         LPITEMIDLIST    absPidl;
    148         IShellFolder2   *pShellFolder;
    149         IPersistFolder  *pPersistFolder;
    150 
    151         TRACE("%p %p\n", pidlRoot, pidlChild);
    152 
    153         *ppvOut = NULL;
    154        
    155         /* we have to ask first for IPersistFolder, some special folders are expecting this */
    156         hr = SHCoCreateInstance(NULL, clsid, NULL, &IID_IPersistFolder, (LPVOID*)&pPersistFolder);
    157         if (SUCCEEDED(hr))
    158         {
    159           hr = IPersistFolder_QueryInterface(pPersistFolder, iid, (LPVOID*)&pShellFolder);
    160           if (SUCCEEDED(hr))
    161           {
    162             absPidl = ILCombine (pidlRoot, pidlChild);
    163             hr = IPersistFolder_Initialize(pPersistFolder, absPidl);
    164             IPersistFolder_Release(pPersistFolder);
    165             SHFree(absPidl);
    166             *ppvOut = pShellFolder;
    167           }
    168         }
    169 
    170         TRACE("-- ret=0x%08lx\n", hr);
    171         return hr;
     141    LPITEMIDLIST pidlRoot,
     142    LPITEMIDLIST pidlChild,
     143    REFCLSID clsid,
     144    REFIID iid,
     145    LPVOID * ppvOut)
     146{
     147    HRESULT hr;
     148    LPITEMIDLIST    absPidl;
     149    IShellFolder2   *pShellFolder;
     150    IPersistFolder  *pPersistFolder;
     151
     152    TRACE("%p %p\n", pidlRoot, pidlChild);
     153
     154    *ppvOut = NULL;
     155
     156    /* we have to ask first for IPersistFolder, some special folders are expecting this */
     157    hr = SHCoCreateInstance(NULL, clsid, NULL, &IID_IPersistFolder, (LPVOID*)&pPersistFolder);
     158    if (SUCCEEDED(hr))
     159    {
     160      hr = IPersistFolder_QueryInterface(pPersistFolder, iid, (LPVOID*)&pShellFolder);
     161      if (SUCCEEDED(hr))
     162      {
     163        absPidl = ILCombine (pidlRoot, pidlChild);
     164        hr = IPersistFolder_Initialize(pPersistFolder, absPidl);
     165        IPersistFolder_Release(pPersistFolder);
     166        SHFree(absPidl);
     167        *ppvOut = pShellFolder;
     168      }
     169    }
     170
     171    TRACE("-- ret=0x%08lx\n", hr);
     172    return hr;
    172173}
    173174
    174175static HRESULT SHELL32_GetDisplayNameOfChild(
    175         IShellFolder2 * psf,
    176         LPCITEMIDLIST pidl,
    177         DWORD dwFlags,
    178         LPSTR szOut,
    179         DWORD dwOutLen)
    180 {
    181         LPITEMIDLIST    pidlFirst, pidlNext;
    182         IShellFolder2 * psfChild;
    183         HRESULT         hr = E_OUTOFMEMORY;
    184         STRRET strTemp;
    185        
    186         TRACE("(%p)->(pidl=%p 0x%08lx %p 0x%08lx)\n",psf,pidl,dwFlags,szOut, dwOutLen);
    187         pdump(pidl);
    188        
    189         if ((pidlFirst = ILCloneFirst(pidl)))
    190         {
    191           hr = IShellFolder_BindToObject(psf, pidlFirst, NULL, &IID_IShellFolder, (LPVOID*)&psfChild);
    192           if (SUCCEEDED(hr))
    193           {
    194             pidlNext = ILGetNext(pidl);
    195 
    196             hr = IShellFolder_GetDisplayNameOf(psfChild, pidlNext, dwFlags | SHGDN_INFOLDER, &strTemp);
    197             if (SUCCEEDED(hr))
    198             {
    199               hr = StrRetToStrNA(szOut, dwOutLen, &strTemp, pidlNext);
    200             }
    201 
    202             IShellFolder_Release(psfChild);
    203           }
    204           ILFree(pidlFirst);
    205         }
    206 
    207         TRACE("-- ret=0x%08lx %s\n", hr, szOut);
    208 
    209         return hr;
     176    IShellFolder2 * psf,
     177    LPCITEMIDLIST pidl,
     178    DWORD dwFlags,
     179    LPSTR szOut,
     180    DWORD dwOutLen)
     181{
     182    LPITEMIDLIST    pidlFirst, pidlNext;
     183    IShellFolder2 * psfChild;
     184    HRESULT     hr = E_OUTOFMEMORY;
     185    STRRET strTemp;
     186
     187    TRACE("(%p)->(pidl=%p 0x%08lx %p 0x%08lx)\n",psf,pidl,dwFlags,szOut, dwOutLen);
     188    pdump(pidl);
     189
     190    if ((pidlFirst = ILCloneFirst(pidl)))
     191    {
     192      hr = IShellFolder_BindToObject(psf, pidlFirst, NULL, &IID_IShellFolder, (LPVOID*)&psfChild);
     193      if (SUCCEEDED(hr))
     194      {
     195        pidlNext = ILGetNext(pidl);
     196
     197        hr = IShellFolder_GetDisplayNameOf(psfChild, pidlNext, dwFlags | SHGDN_INFOLDER, &strTemp);
     198        if (SUCCEEDED(hr))
     199        {
     200          hr = StrRetToStrNA(szOut, dwOutLen, &strTemp, pidlNext);
     201        }
     202
     203        IShellFolder_Release(psfChild);
     204      }
     205      ILFree(pidlFirst);
     206    }
     207
     208    TRACE("-- ret=0x%08lx %s\n", hr, szOut);
     209
     210    return hr;
    210211}
    211212
     
    215216 * NOTES
    216217 * observerd values:
    217  *  folder:     0xE0000177      FILESYSTEM | HASSUBFOLDER | FOLDER
    218  *  file:       0x40000177      FILESYSTEM
    219  *  drive:      0xf0000144      FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR
    220  *  mycomputer: 0xb0000154      HASSUBFOLDER | FOLDER | FILESYSANCESTOR
     218 *  folder: 0xE0000177  FILESYSTEM | HASSUBFOLDER | FOLDER
     219 *  file:   0x40000177  FILESYSTEM
     220 *  drive:  0xf0000144  FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR
     221 *  mycomputer: 0xb0000154  HASSUBFOLDER | FOLDER | FILESYSANCESTOR
    221222 *  (seems to be default for shell extensions if no registry entry exists)
    222223 *
     
    224225 */
    225226static HRESULT SHELL32_GetItemAttributes(
    226         IShellFolder * psf,
    227         LPITEMIDLIST pidl,
    228         LPDWORD pdwAttributes)
     227    IShellFolder * psf,
     228    LPITEMIDLIST pidl,
     229    LPDWORD pdwAttributes)
    229230{
    230231        GUID const * clsid;
    231         DWORD dwAttributes;
    232        
    233         TRACE("0x%08lx\n", *pdwAttributes);
    234 
    235         if (*pdwAttributes & (0xcff3fe88))
    236           WARN("attribute 0x%08lx not implemented\n", *pdwAttributes);
    237         *pdwAttributes &= ~SFGAO_LINK; /* FIXME: for native filedialogs */
    238 
    239         if (_ILIsDrive(pidl))
    240         {
    241           *pdwAttributes &= 0xf0000144;
    242         }
    243         else if ((clsid=_ILGetGUIDPointer(pidl)))
    244         {
    245           if (HCR_GetFolderAttributes(clsid, &dwAttributes))
    246           {
    247             *pdwAttributes &= dwAttributes;
    248           }
    249           else
    250           {
    251             *pdwAttributes &= 0xb0000154;
    252           }       
    253         }
    254         else if (_ILGetDataPointer(pidl))
    255         {
    256           dwAttributes = _ILGetFileAttributes(pidl, NULL, 0);
    257           *pdwAttributes &= ~SFGAO_FILESYSANCESTOR;
    258 
    259           if(( SFGAO_FOLDER & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_DIRECTORY))
    260               *pdwAttributes &= ~(SFGAO_FOLDER|SFGAO_HASSUBFOLDER);
    261 
    262           if(( SFGAO_HIDDEN & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_HIDDEN))
    263               *pdwAttributes &= ~SFGAO_HIDDEN;
    264 
    265           if(( SFGAO_READONLY & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_READONLY))
    266               *pdwAttributes &= ~SFGAO_READONLY;
    267         }
    268         else
    269         {
    270           *pdwAttributes &= 0xb0000154;
    271         }
    272         TRACE("-- 0x%08lx\n", *pdwAttributes);
    273         return S_OK;
     232    DWORD dwAttributes;
     233
     234    TRACE("0x%08lx\n", *pdwAttributes);
     235
     236    if (*pdwAttributes & (0xcff3fe88))
     237      WARN("attribute 0x%08lx not implemented\n", *pdwAttributes);
     238    *pdwAttributes &= ~SFGAO_LINK; /* FIXME: for native filedialogs */
     239
     240    if (_ILIsDrive(pidl))
     241    {
     242      *pdwAttributes &= 0xf0000144;
     243    }
     244    else if ((clsid=_ILGetGUIDPointer(pidl)))
     245    {
     246      if (HCR_GetFolderAttributes(clsid, &dwAttributes))
     247      {
     248        *pdwAttributes &= dwAttributes;
     249      }
     250      else
     251      {
     252        *pdwAttributes &= 0xb0000154;
     253      }
     254    }
     255    else if (_ILGetDataPointer(pidl))
     256    {
     257      dwAttributes = _ILGetFileAttributes(pidl, NULL, 0);
     258      *pdwAttributes &= ~SFGAO_FILESYSANCESTOR;
     259
     260      if(( SFGAO_FOLDER & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_DIRECTORY))
     261          *pdwAttributes &= ~(SFGAO_FOLDER|SFGAO_HASSUBFOLDER);
     262
     263      if(( SFGAO_HIDDEN & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_HIDDEN))
     264          *pdwAttributes &= ~SFGAO_HIDDEN;
     265
     266      if(( SFGAO_READONLY & *pdwAttributes) && !(dwAttributes & FILE_ATTRIBUTE_READONLY))
     267          *pdwAttributes &= ~SFGAO_READONLY;
     268    }
     269    else
     270    {
     271      *pdwAttributes &= 0xb0000154;
     272    }
     273    TRACE("-- 0x%08lx\n", *pdwAttributes);
     274    return S_OK;
    274275}
    275276
     
    278279*/
    279280
    280 typedef struct 
    281 {
    282         ICOM_VFIELD(IUnknown);
    283         DWORD                           ref;
    284         ICOM_VTABLE(IShellFolder2)*     lpvtblShellFolder;
    285         ICOM_VTABLE(IPersistFolder2)*   lpvtblPersistFolder2;
    286         ICOM_VTABLE(IDropTarget)*       lpvtblDropTarget;
    287         ICOM_VTABLE(ISFHelper)*         lpvtblSFHelper;
    288 
    289         IUnknown                        *pUnkOuter;     /* used for aggregation */
    290 
    291         CLSID*                          pclsid;
    292 
    293         LPSTR                           sMyPath;
    294         LPITEMIDLIST                    absPidl;        /* complete pidl */
    295 
    296         UINT            cfShellIDList;                  /* clipboardformat for IDropTarget */
    297         BOOL            fAcceptFmt;                     /* flag for pending Drop */
     281typedef struct
     282{
     283    ICOM_VFIELD(IUnknown);
     284    DWORD               ref;
     285    ICOM_VTABLE(IShellFolder2)* lpvtblShellFolder;
     286    ICOM_VTABLE(IPersistFolder2)*   lpvtblPersistFolder2;
     287    ICOM_VTABLE(IDropTarget)*   lpvtblDropTarget;
     288    ICOM_VTABLE(ISFHelper)*     lpvtblSFHelper;
     289
     290    IUnknown            *pUnkOuter; /* used for aggregation */
     291
     292    CLSID*              pclsid;
     293
     294    LPSTR               sMyPath;
     295    LPITEMIDLIST            absPidl;    /* complete pidl */
     296
     297    UINT        cfShellIDList;          /* clipboardformat for IDropTarget */
     298    BOOL        fAcceptFmt;         /* flag for pending Drop */
    298299} IGenericSFImpl;
    299300
     
    306307static IShellFolder * ISF_MyComputer_Constructor(void);
    307308
    308 #define _IShellFolder2_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblShellFolder))) 
    309 #define _ICOM_THIS_From_IShellFolder2(class, name) class* This = (class*)(((char*)name)-_IShellFolder2_Offset); 
    310        
    311 #define _IPersistFolder_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblPersistFolder2))) 
    312 #define _ICOM_THIS_From_IPersistFolder2(class, name) class* This = (class*)(((char*)name)-_IPersistFolder_Offset); 
    313        
    314 #define _IDropTarget_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblDropTarget))) 
    315 #define _ICOM_THIS_From_IDropTarget(class, name) class* This = (class*)(((char*)name)-_IDropTarget_Offset); 
    316 
    317 #define _ISFHelper_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblSFHelper))) 
    318 #define _ICOM_THIS_From_ISFHelper(class, name) class* This = (class*)(((char*)name)-_ISFHelper_Offset); 
     309#define _IShellFolder2_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblShellFolder)))
     310#define _ICOM_THIS_From_IShellFolder2(class, name) class* This = (class*)(((char*)name)-_IShellFolder2_Offset);
     311
     312#define _IPersistFolder_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblPersistFolder2)))
     313#define _ICOM_THIS_From_IPersistFolder2(class, name) class* This = (class*)(((char*)name)-_IPersistFolder_Offset);
     314
     315#define _IDropTarget_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblDropTarget)))
     316#define _ICOM_THIS_From_IDropTarget(class, name) class* This = (class*)(((char*)name)-_IDropTarget_Offset);
     317
     318#define _ISFHelper_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblSFHelper)))
     319#define _ICOM_THIS_From_ISFHelper(class, name) class* This = (class*)(((char*)name)-_ISFHelper_Offset);
    319320/*
    320321  converts This to a interface pointer
    321322*/
    322 #define _IUnknown_(This)        (IUnknown*)&(This->lpVtbl)
    323 #define _IShellFolder_(This)    (IShellFolder*)&(This->lpvtblShellFolder)
    324 #define _IShellFolder2_(This)   (IShellFolder2*)&(This->lpvtblShellFolder)
    325 #define _IPersist_(This)        (IPersist*)&(This->lpvtblPersistFolder2)
    326 #define _IPersistFolder_(This)  (IPersistFolder*)&(This->lpvtblPersistFolder2)
    327 #define _IPersistFolder2_(This) (IPersistFolder2*)&(This->lpvtblPersistFolder2)
    328 #define _IDropTarget_(This)     (IDropTarget*)&(This->lpvtblDropTarget)
    329 #define _ISFHelper_(This)       (ISFHelper*)&(This->lpvtblSFHelper)
    330 /**************************************************************************
    331 *       registers clipboardformat once
     323#define _IUnknown_(This)    (IUnknown*)&(This->lpVtbl)
     324#define _IShellFolder_(This)    (IShellFolder*)&(This->lpvtblShellFolder)
     325#define _IShellFolder2_(This)   (IShellFolder2*)&(This->lpvtblShellFolder)
     326#define _IPersist_(This)    (IPersist*)&(This->lpvtblPersistFolder2)
     327#define _IPersistFolder_(This)  (IPersistFolder*)&(This->lpvtblPersistFolder2)
     328#define _IPersistFolder2_(This) (IPersistFolder2*)&(This->lpvtblPersistFolder2)
     329#define _IDropTarget_(This) (IDropTarget*)&(This->lpvtblDropTarget)
     330#define _ISFHelper_(This)   (ISFHelper*)&(This->lpvtblSFHelper)
     331/**************************************************************************
     332*   registers clipboardformat once
    332333*/
    333334static void SF_RegisterClipFmt (IGenericSFImpl * This)
    334335{
    335         TRACE("(%p)\n", This);
    336 
    337         if (!This->cfShellIDList)
    338         {
    339           This->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST);
    340         }
    341 }
    342 
    343 /**************************************************************************
    344 *       we need a separate IUnknown to handle aggregation
    345 *       (inner IUnknown)
     336    TRACE("(%p)\n", This);
     337
     338    if (!This->cfShellIDList)
     339    {
     340      This->cfShellIDList = RegisterClipboardFormatA(CFSTR_SHELLIDLIST);
     341    }
     342}
     343
     344/**************************************************************************
     345*   we need a separate IUnknown to handle aggregation
     346*   (inner IUnknown)
    346347*/
    347348static HRESULT WINAPI IUnknown_fnQueryInterface(
    348         IUnknown * iface,
    349         REFIID riid,
    350         LPVOID *ppvObj)
    351 {
    352         ICOM_THIS(IGenericSFImpl, iface);
    353 
    354         _CALL_TRACE
    355         TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
    356 
    357         *ppvObj = NULL;
    358 
    359         if(IsEqualIID(riid, &IID_IUnknown))             *ppvObj = _IUnknown_(This);
    360         else if(IsEqualIID(riid, &IID_IShellFolder))    *ppvObj = _IShellFolder_(This);
    361         else if(IsEqualIID(riid, &IID_IShellFolder2))   *ppvObj = _IShellFolder_(This);
    362         else if(IsEqualIID(riid, &IID_IPersist))        *ppvObj = _IPersist_(This);
    363         else if(IsEqualIID(riid, &IID_IPersistFolder))  *ppvObj = _IPersistFolder_(This);
    364         else if(IsEqualIID(riid, &IID_IPersistFolder2)) *ppvObj = _IPersistFolder2_(This);
    365         else if(IsEqualIID(riid, &IID_ISFHelper))       *ppvObj = _ISFHelper_(This);
    366         else if(IsEqualIID(riid, &IID_IDropTarget))
    367         {
    368           *ppvObj = _IDropTarget_(This);
    369           SF_RegisterClipFmt(This);
    370         }
    371 
    372         if(*ppvObj)
    373         {
    374           IUnknown_AddRef((IUnknown*)(*ppvObj));
    375           TRACE("-- Interface = %p\n", *ppvObj);
    376           return S_OK;
    377         }
    378         TRACE("-- Interface: E_NOINTERFACE\n");
    379         return E_NOINTERFACE;
     349    IUnknown * iface,
     350    REFIID riid,
     351    LPVOID *ppvObj)
     352{
     353    ICOM_THIS(IGenericSFImpl, iface);
     354
     355    _CALL_TRACE
     356    TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
     357
     358    *ppvObj = NULL;
     359
     360    if(IsEqualIID(riid, &IID_IUnknown))     *ppvObj = _IUnknown_(This);
     361    else if(IsEqualIID(riid, &IID_IShellFolder))    *ppvObj = _IShellFolder_(This);
     362    else if(IsEqualIID(riid, &IID_IShellFolder2))   *ppvObj = _IShellFolder_(This);
     363    else if(IsEqualIID(riid, &IID_IPersist))    *ppvObj = _IPersist_(This);
     364    else if(IsEqualIID(riid, &IID_IPersistFolder))  *ppvObj = _IPersistFolder_(This);
     365    else if(IsEqualIID(riid, &IID_IPersistFolder2)) *ppvObj = _IPersistFolder2_(This);
     366    else if(IsEqualIID(riid, &IID_ISFHelper))   *ppvObj = _ISFHelper_(This);
     367    else if(IsEqualIID(riid, &IID_IDropTarget))
     368    {
     369      *ppvObj = _IDropTarget_(This);
     370      SF_RegisterClipFmt(This);
     371    }
     372
     373    if(*ppvObj)
     374    {
     375      IUnknown_AddRef((IUnknown*)(*ppvObj));
     376      TRACE("-- Interface = %p\n", *ppvObj);
     377      return S_OK;
     378    }
     379    TRACE("-- Interface: E_NOINTERFACE\n");
     380    return E_NOINTERFACE;
    380381}
    381382
    382383static ULONG WINAPI IUnknown_fnAddRef(IUnknown * iface)
    383384{
    384         ICOM_THIS(IGenericSFImpl, iface);
    385 
    386         _CALL_TRACE
    387         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    388 
    389         shell32_ObjCount++;
    390         return ++(This->ref);
    391 }
    392 
    393 static ULONG WINAPI IUnknown_fnRelease(IUnknown * iface) 
    394 {
    395         ICOM_THIS(IGenericSFImpl, iface);
    396 
    397         _CALL_TRACE
    398         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    399 
    400         shell32_ObjCount--;
    401         if (!--(This->ref))
    402         {
    403           TRACE("-- destroying IShellFolder(%p)\n",This);
    404 
    405           if (pdesktopfolder == _IShellFolder_(This))
    406           {
    407             pdesktopfolder=NULL;
    408             TRACE("-- destroyed IShellFolder(%p) was Desktopfolder\n",This);
    409           }
    410           if(This->absPidl) SHFree(This->absPidl);
    411           if(This->sMyPath) SHFree(This->sMyPath);
    412           HeapFree(GetProcessHeap(),0,This);
    413           return 0;
    414         }
    415         return This->ref;
    416 }
    417 
    418 static ICOM_VTABLE(IUnknown) unkvt = 
    419 {       
    420         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    421         IUnknown_fnQueryInterface,
    422         IUnknown_fnAddRef,
    423         IUnknown_fnRelease,
     385    ICOM_THIS(IGenericSFImpl, iface);
     386
     387    _CALL_TRACE
     388    TRACE("(%p)->(count=%lu)\n",This,This->ref);
     389
     390    shell32_ObjCount++;
     391    return ++(This->ref);
     392}
     393
     394static ULONG WINAPI IUnknown_fnRelease(IUnknown * iface)
     395{
     396    ICOM_THIS(IGenericSFImpl, iface);
     397
     398    _CALL_TRACE
     399    TRACE("(%p)->(count=%lu)\n",This,This->ref);
     400
     401    shell32_ObjCount--;
     402    if (!--(This->ref))
     403    {
     404      TRACE("-- destroying IShellFolder(%p)\n",This);
     405
     406      if (pdesktopfolder == _IShellFolder_(This))
     407      {
     408        pdesktopfolder=NULL;
     409        TRACE("-- destroyed IShellFolder(%p) was Desktopfolder\n",This);
     410      }
     411      if(This->absPidl) SHFree(This->absPidl);
     412      if(This->sMyPath) SHFree(This->sMyPath);
     413      HeapFree(GetProcessHeap(),0,This);
     414      return 0;
     415    }
     416    return This->ref;
     417}
     418
     419static ICOM_VTABLE(IUnknown) unkvt =
     420{
     421    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     422    IUnknown_fnQueryInterface,
     423    IUnknown_fnAddRef,
     424    IUnknown_fnRelease,
    424425};
    425426
     
    435436
    436437/**************************************************************************
    437 *       IShellFolder_Constructor
     438*   IShellFolder_Constructor
    438439*
    439440* NOTES
     
    442443*
    443444* FIXME
    444 *       when pUnkOuter = 0 then rrid = IID_IShellFolder is returned
     445*   when pUnkOuter = 0 then rrid = IID_IShellFolder is returned
    445446*/
    446447HRESULT IFSFolder_Constructor(
    447         IUnknown * pUnkOuter,
    448         REFIID riid,
    449         LPVOID * ppv)
    450 {
    451         IGenericSFImpl *        sf;
    452         HRESULT hr = S_OK;
    453 
    454         TRACE("unkOut=%p riid=%s\n",pUnkOuter, debugstr_guid(riid));
    455 
    456         if(pUnkOuter && ! IsEqualIID(riid, &IID_IUnknown))
    457         {
    458           hr = CLASS_E_NOAGGREGATION;   /* forbidden by definition */
    459         }
    460         else
    461         {
    462           sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
    463           if (sf)
    464           {
    465             sf->ref=1;
    466             ICOM_VTBL(sf)=&unkvt;
    467             sf->lpvtblShellFolder=&sfvt;
    468             sf->lpvtblPersistFolder2=&psfvt;
    469             sf->lpvtblDropTarget=&dtvt;
    470             sf->lpvtblSFHelper=&shvt;
    471            
    472             sf->pclsid = (CLSID*)&CLSID_SFFile;
    473             sf->pUnkOuter = pUnkOuter ? pUnkOuter : _IUnknown_(sf);
    474             *ppv = _IUnknown_(sf);
    475             hr = S_OK;
    476             shell32_ObjCount++;
    477           }
    478           else
    479           {
    480             hr = E_OUTOFMEMORY;
    481           }
    482         }
    483         return hr;
    484 }
    485 /**************************************************************************
    486 *         IShellFolder_Constructor
     448    IUnknown * pUnkOuter,
     449    REFIID riid,
     450    LPVOID * ppv)
     451{
     452    IGenericSFImpl *    sf;
     453    HRESULT hr = S_OK;
     454
     455    TRACE("unkOut=%p riid=%s\n",pUnkOuter, debugstr_guid(riid));
     456
     457    if(pUnkOuter && ! IsEqualIID(riid, &IID_IUnknown))
     458    {
     459      hr = CLASS_E_NOAGGREGATION;   /* forbidden by definition */
     460    }
     461    else
     462    {
     463      sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
     464      if (sf)
     465      {
     466        sf->ref=1;
     467        ICOM_VTBL(sf)=&unkvt;
     468        sf->lpvtblShellFolder=&sfvt;
     469        sf->lpvtblPersistFolder2=&psfvt;
     470        sf->lpvtblDropTarget=&dtvt;
     471        sf->lpvtblSFHelper=&shvt;
     472
     473        sf->pclsid = (CLSID*)&CLSID_SFFile;
     474        sf->pUnkOuter = pUnkOuter ? pUnkOuter : _IUnknown_(sf);
     475        *ppv = _IUnknown_(sf);
     476        hr = S_OK;
     477        shell32_ObjCount++;
     478      }
     479      else
     480      {
     481        hr = E_OUTOFMEMORY;
     482      }
     483    }
     484    return hr;
     485}
     486/**************************************************************************
     487*     IShellFolder_Constructor
    487488*
    488489* NOTES
    489 *       THIS points to the parent folder
     490*   THIS points to the parent folder
    490491*/
    491492
    492493IShellFolder * IShellFolder_Constructor(
    493         IShellFolder2 * iface,
    494         LPITEMIDLIST pidl)
    495 {
    496         IGenericSFImpl *        sf;
    497         DWORD                   dwSize=0;
    498 
    499         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    500 
    501         sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
    502         sf->ref=1;
    503 
    504         ICOM_VTBL(sf)=&unkvt;
    505         sf->lpvtblShellFolder=&sfvt;
    506         sf->lpvtblPersistFolder2=&psfvt;
    507         sf->lpvtblDropTarget=&dtvt;
    508         sf->lpvtblSFHelper=&shvt;
    509 
    510         sf->pclsid = (CLSID*)&CLSID_SFFile;
    511         sf->pUnkOuter = _IUnknown_(sf);
    512 
    513         TRACE("(%p)->(parent=%p, pidl=%p)\n",sf,This, pidl);
    514         pdump(pidl);
    515                
    516         if(pidl && iface)                               /* do we have a pidl? */
    517         {
    518           int len;
    519 
    520           sf->absPidl = ILCombine(This->absPidl, pidl); /* build a absolute pidl */
    521 
    522           if (!_ILIsSpecialFolder(pidl))                                /* only file system paths */
    523           {
    524             if(This->sMyPath)                           /* get the size of the parents path */
    525             {
    526               dwSize += strlen(This->sMyPath) ;
    527               TRACE("-- (%p)->(parent's path=%s)\n",sf, debugstr_a(This->sMyPath));
    528             }   
    529 
    530             dwSize += _ILSimpleGetText(pidl,NULL,0);            /* add the size of our name*/
    531             sf->sMyPath = SHAlloc(dwSize + 2);                  /* '\0' and backslash */
    532 
    533             if(!sf->sMyPath) return NULL;
    534             *(sf->sMyPath)=0x00;
    535 
    536             if(This->sMyPath)                           /* if the parent has a path, get it*/
    537             {
    538               strcpy(sf->sMyPath, This->sMyPath);
    539               PathAddBackslashA (sf->sMyPath);
    540             }
    541 
    542             len = strlen(sf->sMyPath);
    543             _ILSimpleGetText(pidl, sf->sMyPath + len, dwSize+2 - len);
    544           }
    545 
    546           TRACE("-- (%p)->(my pidl=%p, my path=%s)\n",sf, sf->absPidl,debugstr_a(sf->sMyPath));
    547 
    548           pdump (sf->absPidl);
    549         }
    550 
    551         shell32_ObjCount++;
    552         return _IShellFolder_(sf);
     494    IShellFolder2 * iface,
     495    LPITEMIDLIST pidl)
     496{
     497    IGenericSFImpl *    sf;
     498    DWORD           dwSize=0;
     499
     500    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     501
     502    sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
     503    sf->ref=1;
     504
     505    ICOM_VTBL(sf)=&unkvt;
     506    sf->lpvtblShellFolder=&sfvt;
     507    sf->lpvtblPersistFolder2=&psfvt;
     508    sf->lpvtblDropTarget=&dtvt;
     509    sf->lpvtblSFHelper=&shvt;
     510
     511    sf->pclsid = (CLSID*)&CLSID_SFFile;
     512    sf->pUnkOuter = _IUnknown_(sf);
     513
     514    TRACE("(%p)->(parent=%p, pidl=%p)\n",sf,This, pidl);
     515    pdump(pidl);
     516
     517    if(pidl && iface)               /* do we have a pidl? */
     518    {
     519      int len;
     520
     521      sf->absPidl = ILCombine(This->absPidl, pidl); /* build a absolute pidl */
     522
     523      if (!_ILIsSpecialFolder(pidl))                /* only file system paths */
     524      {
     525        if(This->sMyPath)               /* get the size of the parents path */
     526        {
     527          dwSize += strlen(This->sMyPath) ;
     528          TRACE("-- (%p)->(parent's path=%s)\n",sf, debugstr_a(This->sMyPath));
     529        }
     530
     531        dwSize += _ILSimpleGetText(pidl,NULL,0);        /* add the size of our name*/
     532        sf->sMyPath = SHAlloc(dwSize + 2);          /* '\0' and backslash */
     533
     534        if(!sf->sMyPath) return NULL;
     535        *(sf->sMyPath)=0x00;
     536
     537        if(This->sMyPath)               /* if the parent has a path, get it*/
     538        {
     539          strcpy(sf->sMyPath, This->sMyPath);
     540          PathAddBackslashA (sf->sMyPath);
     541        }
     542
     543        len = strlen(sf->sMyPath);
     544        _ILSimpleGetText(pidl, sf->sMyPath + len, dwSize+2 - len);
     545      }
     546
     547      TRACE("-- (%p)->(my pidl=%p, my path=%s)\n",sf, sf->absPidl,debugstr_a(sf->sMyPath));
     548
     549      pdump (sf->absPidl);
     550    }
     551
     552    shell32_ObjCount++;
     553    return _IShellFolder_(sf);
    553554}
    554555
     
    557558 *
    558559 * PARAMETERS
    559  *  REFIID riid         [in ] Requested InterfaceID
    560  *  LPVOID* ppvObject   [out] Interface* to hold the result
     560 *  REFIID riid     [in ] Requested InterfaceID
     561 *  LPVOID* ppvObject   [out] Interface* to hold the result
    561562 */
    562563static HRESULT WINAPI IShellFolder_fnQueryInterface(
    563         IShellFolder2 * iface,
    564         REFIID riid,
    565         LPVOID *ppvObj)
    566 {
    567         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    568 
    569         _CALL_TRACE
    570         TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
    571 
    572         return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObj);
     564    IShellFolder2 * iface,
     565    REFIID riid,
     566    LPVOID *ppvObj)
     567{
     568    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     569
     570    _CALL_TRACE
     571    TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
     572
     573    return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObj);
    573574}
    574575
     
    579580static ULONG WINAPI IShellFolder_fnAddRef(IShellFolder2 * iface)
    580581{
    581         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    582 
    583         _CALL_TRACE
    584         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    585 
    586         return IUnknown_AddRef(This->pUnkOuter);
     582    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     583
     584    _CALL_TRACE
     585    TRACE("(%p)->(count=%lu)\n",This,This->ref);
     586
     587    return IUnknown_AddRef(This->pUnkOuter);
    587588}
    588589
     
    590591 *  IShellFolder_fnRelease
    591592 */
    592 static ULONG WINAPI IShellFolder_fnRelease(IShellFolder2 * iface) 
    593 {
    594         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    595 
    596         _CALL_TRACE
    597         TRACE("(%p)->(count=%lu)\n",This,This->ref);
    598 
    599         return IUnknown_Release(This->pUnkOuter);
    600 }
    601 
    602 /**************************************************************************
    603 *               IShellFolder_fnParseDisplayName
     593static ULONG WINAPI IShellFolder_fnRelease(IShellFolder2 * iface)
     594{
     595    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     596
     597    _CALL_TRACE
     598    TRACE("(%p)->(count=%lu)\n",This,This->ref);
     599
     600    return IUnknown_Release(This->pUnkOuter);
     601}
     602
     603/**************************************************************************
     604*       IShellFolder_fnParseDisplayName
    604605* PARAMETERS
    605606*  HWND          hwndOwner,      //[in ] Parent window for any message's
     
    611612*
    612613* NOTES
    613 *  every folder tries to parse only its own (the leftmost) pidl and creates a 
     614*  every folder tries to parse only its own (the leftmost) pidl and creates a
    614615*  subfolder to evaluate the remaining parts
    615616*  now we can parse into namespaces implemented by shell extensions
    616617*
    617 *  behaviour on win98:  lpszDisplayName=NULL -> chrash
    618 *                       lpszDisplayName="" -> returns mycoputer-pidl
     618*  behaviour on win98:  lpszDisplayName=NULL -> chrash
     619*           lpszDisplayName="" -> returns mycoputer-pidl
    619620*
    620 * FIXME: 
     621* FIXME:
    621622*    pdwAttributes: not set
    622623*    pchEaten: not set like in windows
    623624*/
    624625static HRESULT WINAPI IShellFolder_fnParseDisplayName(
    625         IShellFolder2 * iface,
    626         HWND hwndOwner,
    627         LPBC pbcReserved,
    628         LPOLESTR lpszDisplayName,
    629         DWORD *pchEaten,
    630         LPITEMIDLIST *ppidl,
    631         DWORD *pdwAttributes)
    632 {
    633         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    634 
    635         HRESULT         hr = E_OUTOFMEMORY;
    636         LPCWSTR         szNext=NULL;
    637         WCHAR           szElement[MAX_PATH];
    638         CHAR            szTempA[MAX_PATH], szPath[MAX_PATH];
    639         LPITEMIDLIST    pidlTemp=NULL;
    640        
    641         TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
    642         This,hwndOwner,pbcReserved,lpszDisplayName,
    643         debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
    644 
    645         if (!lpszDisplayName || !ppidl) return E_INVALIDARG;
    646 
    647         if (pchEaten) *pchEaten = 0;    /* strange but like the original */
    648        
    649         if (*lpszDisplayName)
    650         {       
    651           /* get the next element */
    652           szNext = GetNextElementW(lpszDisplayName, szElement, MAX_PATH);
    653 
    654           /* build the full pathname to the element */
     626    IShellFolder2 * iface,
     627    HWND hwndOwner,
     628    LPBC pbcReserved,
     629    LPOLESTR lpszDisplayName,
     630    DWORD *pchEaten,
     631    LPITEMIDLIST *ppidl,
     632    DWORD *pdwAttributes)
     633{
     634    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     635
     636    HRESULT     hr = E_OUTOFMEMORY;
     637    LPCWSTR     szNext=NULL;
     638    WCHAR       szElement[MAX_PATH];
     639    CHAR        szTempA[MAX_PATH], szPath[MAX_PATH];
     640    LPITEMIDLIST    pidlTemp=NULL;
     641
     642    TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
     643    This,hwndOwner,pbcReserved,lpszDisplayName,
     644    debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
     645
     646    if (!lpszDisplayName || !ppidl) return E_INVALIDARG;
     647
     648    if (pchEaten) *pchEaten = 0;    /* strange but like the original */
     649
     650    if (*lpszDisplayName)
     651    {
     652      /* get the next element */
     653      szNext = GetNextElementW(lpszDisplayName, szElement, MAX_PATH);
     654
     655      /* build the full pathname to the element */
    655656          WideCharToMultiByte( CP_ACP, 0, szElement, -1, szTempA, MAX_PATH, NULL, NULL );
    656           strcpy(szPath, This->sMyPath);
    657           PathAddBackslashA(szPath);
    658           strcat(szPath, szTempA);
    659 
    660           /* get the pidl */
    661           pidlTemp = SHSimpleIDListFromPathA(szPath);
    662 
    663           if (pidlTemp)
    664           {
    665             /* try to analyse the next element */
    666             if (szNext && *szNext)
    667             {
    668               hr = SHELL32_ParseNextElement(hwndOwner, iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
    669             }
    670             else
    671             {
    672                if (pdwAttributes && *pdwAttributes)
    673                {
    674                  SHELL32_GetItemAttributes(_IShellFolder_(This), pidlTemp, pdwAttributes);
    675 /*               WIN32_FIND_DATAA fd;
    676                  SHGetDataFromIDListA(_IShellFolder_(This), pidlTemp, SHGDFIL_FINDDATA, &fd, sizeof(fd));
    677                 if (!(FILE_ATTRIBUTE_DIRECTORY & fd.dwFileAttributes))
    678                    *pdwAttributes &= ~SFGAO_FOLDER;
    679                 if (FILE_ATTRIBUTE_READONLY  & fd.dwFileAttributes)
    680                    *pdwAttributes &= ~(SFGAO_CANDELETE|SFGAO_CANMOVE|SFGAO_CANRENAME );
    681 */
    682                }
    683                hr = S_OK;
    684             }
    685           }
    686         }
     657      strcpy(szPath, This->sMyPath);
     658      PathAddBackslashA(szPath);
     659      strcat(szPath, szTempA);
     660
     661      /* get the pidl */
     662      pidlTemp = SHSimpleIDListFromPathA(szPath);
     663
     664      if (pidlTemp)
     665      {
     666        /* try to analyse the next element */
     667        if (szNext && *szNext)
     668        {
     669          hr = SHELL32_ParseNextElement(hwndOwner, iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
     670        }
     671        else
     672        {
     673           if (pdwAttributes && *pdwAttributes)
     674           {
     675             SHELL32_GetItemAttributes(_IShellFolder_(This), pidlTemp, pdwAttributes);
     676/*           WIN32_FIND_DATAA fd;
     677             SHGetDataFromIDListA(_IShellFolder_(This), pidlTemp, SHGDFIL_FINDDATA, &fd, sizeof(fd));
     678        if (!(FILE_ATTRIBUTE_DIRECTORY & fd.dwFileAttributes))
     679           *pdwAttributes &= ~SFGAO_FOLDER;
     680        if (FILE_ATTRIBUTE_READONLY  & fd.dwFileAttributes)
     681           *pdwAttributes &= ~(SFGAO_CANDELETE|SFGAO_CANMOVE|SFGAO_CANRENAME );
     682*/
     683           }
     684           hr = S_OK;
     685        }
     686      }
     687    }
    687688
    688689        if (!hr)
    689           *ppidl = pidlTemp;
    690         else
    691           *ppidl = NULL;
    692 
    693         TRACE("(%p)->(-- pidl=%p ret=0x%08lx)\n", This, ppidl? *ppidl:0, hr);
    694 
    695         return hr;     
    696 }
    697 
    698 /**************************************************************************
    699 *               IShellFolder_fnEnumObjects
     690      *ppidl = pidlTemp;
     691    else
     692      *ppidl = NULL;
     693
     694    TRACE("(%p)->(-- pidl=%p ret=0x%08lx)\n", This, ppidl? *ppidl:0, hr);
     695
     696    return hr;
     697}
     698
     699/**************************************************************************
     700*       IShellFolder_fnEnumObjects
    700701* PARAMETERS
    701702*  HWND          hwndOwner,    //[in ] Parent Window
     
    704705*/
    705706static HRESULT WINAPI IShellFolder_fnEnumObjects(
    706         IShellFolder2 * iface,
    707         HWND hwndOwner,
    708         DWORD dwFlags,
    709         LPENUMIDLIST* ppEnumIDList)
    710 {
    711         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    712 
    713         TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
    714 
    715         *ppEnumIDList = NULL;
    716         *ppEnumIDList = IEnumIDList_Constructor (This->sMyPath, dwFlags, EIDL_FILE);
    717 
    718         TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
    719 
    720         if(!*ppEnumIDList) return E_OUTOFMEMORY;
    721 
    722         return S_OK;           
    723 }
    724 
    725 /**************************************************************************
    726 *               IShellFolder_fnBindToObject
     707    IShellFolder2 * iface,
     708    HWND hwndOwner,
     709    DWORD dwFlags,
     710    LPENUMIDLIST* ppEnumIDList)
     711{
     712    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     713
     714    TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
     715
     716    *ppEnumIDList = NULL;
     717    *ppEnumIDList = IEnumIDList_Constructor (This->sMyPath, dwFlags, EIDL_FILE);
     718
     719    TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
     720
     721    if(!*ppEnumIDList) return E_OUTOFMEMORY;
     722
     723    return S_OK;
     724}
     725
     726/**************************************************************************
     727*       IShellFolder_fnBindToObject
    727728* PARAMETERS
    728729*  LPCITEMIDLIST pidl,       //[in ] relative pidl to open
     
    732733*/
    733734static HRESULT WINAPI IShellFolder_fnBindToObject( IShellFolder2 * iface, LPCITEMIDLIST pidl,
    734                         LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
    735 {
    736         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    737         GUID            const * iid;
    738         IShellFolder    *pShellFolder, *pSubFolder;
    739         IPersistFolder  *pPersistFolder;
    740         LPITEMIDLIST    absPidl;
    741        
    742         TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",This,pidl,pbcReserved,debugstr_guid(riid),ppvOut);
    743 
    744         if(!pidl || !ppvOut) return E_INVALIDARG;
    745 
    746         *ppvOut = NULL;
    747 
    748         if ((iid=_ILGetGUIDPointer(pidl)))
    749         {
    750           /* we have to create a alien folder */
    751           if (  SUCCEEDED(SHCoCreateInstance(NULL, iid, NULL, riid, (LPVOID*)&pShellFolder))
    752              && SUCCEEDED(IShellFolder_QueryInterface(pShellFolder, &IID_IPersistFolder, (LPVOID*)&pPersistFolder)))
    753             {
    754               absPidl = ILCombine (This->absPidl, pidl);
    755               IPersistFolder_Initialize(pPersistFolder, absPidl);
    756               IPersistFolder_Release(pPersistFolder);
    757               SHFree(absPidl);
    758             }
    759             else
    760             {
    761               return E_FAIL;
    762             }
    763         }
    764         else if(_ILIsFolder(pidl))
    765         {
    766           LPITEMIDLIST pidltemp = ILCloneFirst(pidl);
    767           pShellFolder = IShellFolder_Constructor(iface, pidltemp);
    768           ILFree(pidltemp);
    769         }
    770         else
    771         {
    772           ERR("can't bind to a file\n");
    773           return E_FAIL;
    774         }
    775        
    776         if (_ILIsPidlSimple(pidl))
    777         {
    778           *ppvOut = pShellFolder;
    779         }
    780         else
    781         {
    782           IShellFolder_BindToObject(pShellFolder, ILGetNext(pidl), NULL, &IID_IShellFolder, (LPVOID)&pSubFolder);
    783           IShellFolder_Release(pShellFolder);
    784           *ppvOut = pSubFolder;
    785         }
    786 
    787         TRACE("-- (%p) returning (%p)\n",This, *ppvOut);
    788 
    789         return S_OK;
     735            LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
     736{
     737    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     738    GUID        const * iid;
     739    IShellFolder    *pShellFolder, *pSubFolder;
     740    IPersistFolder  *pPersistFolder;
     741    LPITEMIDLIST    absPidl;
     742
     743    TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",This,pidl,pbcReserved,debugstr_guid(riid),ppvOut);
     744
     745    if(!pidl || !ppvOut) return E_INVALIDARG;
     746
     747    *ppvOut = NULL;
     748
     749    if ((iid=_ILGetGUIDPointer(pidl)))
     750    {
     751      /* we have to create a alien folder */
     752      if (  SUCCEEDED(SHCoCreateInstance(NULL, iid, NULL, riid, (LPVOID*)&pShellFolder))
     753         && SUCCEEDED(IShellFolder_QueryInterface(pShellFolder, &IID_IPersistFolder, (LPVOID*)&pPersistFolder)))
     754        {
     755          absPidl = ILCombine (This->absPidl, pidl);
     756          IPersistFolder_Initialize(pPersistFolder, absPidl);
     757          IPersistFolder_Release(pPersistFolder);
     758          SHFree(absPidl);
     759        }
     760        else
     761        {
     762          return E_FAIL;
     763        }
     764    }
     765    else if(_ILIsFolder(pidl))
     766    {
     767      LPITEMIDLIST pidltemp = ILCloneFirst(pidl);
     768      pShellFolder = IShellFolder_Constructor(iface, pidltemp);
     769      ILFree(pidltemp);
     770    }
     771    else
     772    {
     773      ERR("can't bind to a file\n");
     774      return E_FAIL;
     775    }
     776
     777    if (_ILIsPidlSimple(pidl))
     778    {
     779      *ppvOut = pShellFolder;
     780    }
     781    else
     782    {
     783      IShellFolder_BindToObject(pShellFolder, ILGetNext(pidl), NULL, &IID_IShellFolder, (LPVOID)&pSubFolder);
     784      IShellFolder_Release(pShellFolder);
     785      *ppvOut = pSubFolder;
     786    }
     787
     788    TRACE("-- (%p) returning (%p)\n",This, *ppvOut);
     789
     790    return S_OK;
    790791}
    791792
     
    795796*  LPCITEMIDLIST pidl,       //[in ] complex pidl to store
    796797*  LPBC          pbc,        //[in ] reserved
    797 *  REFIID        riid,       //[in ] Initial storage interface 
     798*  REFIID        riid,       //[in ] Initial storage interface
    798799*  LPVOID*       ppvObject   //[out] Interface* returned
    799800*/
    800801static HRESULT WINAPI IShellFolder_fnBindToStorage(
    801         IShellFolder2 * iface,
    802         LPCITEMIDLIST pidl,
    803         LPBC pbcReserved,
    804         REFIID riid,
    805         LPVOID *ppvOut)
    806 {
    807         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    808 
    809         FIXME("(%p)->(pidl=%p,%p,\n\tIID:%s,%p) stub\n",
     802    IShellFolder2 * iface,
     803    LPCITEMIDLIST pidl,
     804    LPBC pbcReserved,
     805    REFIID riid,
     806    LPVOID *ppvOut)
     807{
     808    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     809
     810    FIXME("(%p)->(pidl=%p,%p,\n\tIID:%s,%p) stub\n",
    810811              This,pidl,pbcReserved,debugstr_guid(riid),ppvOut);
    811812
    812         *ppvOut = NULL;
    813         return E_NOTIMPL;
     813    *ppvOut = NULL;
     814    return E_NOTIMPL;
    814815}
    815816
     
    826827*   always make the Path come before the File.
    827828*
    828 * NOTES 
     829* NOTES
    829830*  use SCODE_CODE() on the return value to get the result
    830831*/
    831832
    832833static HRESULT WINAPI  IShellFolder_fnCompareIDs(
    833         IShellFolder2 * iface,
    834         LPARAM lParam,
    835         LPCITEMIDLIST pidl1,
    836         LPCITEMIDLIST pidl2)
    837 {
    838         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    839 
    840         CHAR szTemp1[MAX_PATH];
    841         CHAR szTemp2[MAX_PATH];
    842         int   nReturn;
    843         IShellFolder * psf;
    844         HRESULT hr = E_OUTOFMEMORY;
    845         LPCITEMIDLIST  pidlTemp;
    846         PIDLTYPE pt1, pt2;
    847 
    848         TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n",This,lParam,pidl1,pidl2);
    849         pdump (pidl1);
    850         pdump (pidl2);
    851        
    852         if (!pidl1 && !pidl2)
    853         {
    854           hr = ResultFromShort(0);
    855         }
    856         else if (!pidl1)
    857         {
    858           hr = ResultFromShort(-1);
    859         }
    860         else if (!pidl2)
    861         {
    862           hr = ResultFromShort(1);
    863         }
    864         else
    865         {
    866           LPPIDLDATA pd1, pd2;
    867           pd1 = _ILGetDataPointer(pidl1);
    868           pd2 = _ILGetDataPointer(pidl2);
    869        
    870           /* compate the types. sort order is the PT_* constant */
    871           pt1 = ( pd1 ? pd1->type: PT_DESKTOP);
    872           pt2 = ( pd2 ? pd2->type: PT_DESKTOP);
    873 
    874           if (pt1 != pt2)
    875           {
    876             hr = ResultFromShort(pt1-pt2);
    877           }
    878           else                                          /* same type of pidl */
    879           {
    880             _ILSimpleGetText(pidl1, szTemp1, MAX_PATH);
    881             _ILSimpleGetText(pidl2, szTemp2, MAX_PATH);
    882             nReturn = strcasecmp(szTemp1, szTemp2);
    883        
    884             if (nReturn == 0)                           /* first pidl different ? */
    885             {
    886               pidl1 = ILGetNext(pidl1);
    887 
    888               if (pidl1 && pidl1->mkid.cb)              /* go deeper? */       
    889               {
    890                 pidlTemp = ILCloneFirst(pidl1);
    891                 pidl2 = ILGetNext(pidl2);
    892        
    893                 hr = IShellFolder_BindToObject(iface, pidlTemp, NULL, &IID_IShellFolder, (LPVOID*)&psf);
    894                 if (SUCCEEDED(hr))
    895                 {
    896                   nReturn = IShellFolder_CompareIDs(psf, 0, pidl1, pidl2);
    897                   IShellFolder_Release(psf);
    898                   hr = ResultFromShort(nReturn);
    899                 }
    900                 ILFree(pidlTemp);
    901               }
    902               else
    903               {
    904                 hr = ResultFromShort(nReturn);          /* two equal simple pidls */
    905               }
    906             }
    907             else
    908             {
    909               hr = ResultFromShort(nReturn);            /* two different simple pidls */
    910             }
    911           }
    912         }
    913        
    914         TRACE("-- res=0x%08lx\n", hr);
    915         return hr;
    916 }
    917 
    918 /**************************************************************************
    919 *       IShellFolder_fnCreateViewObject
     834    IShellFolder2 * iface,
     835    LPARAM lParam,
     836    LPCITEMIDLIST pidl1,
     837    LPCITEMIDLIST pidl2)
     838{
     839    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     840
     841    CHAR szTemp1[MAX_PATH];
     842    CHAR szTemp2[MAX_PATH];
     843    int   nReturn;
     844    IShellFolder * psf;
     845    HRESULT hr = E_OUTOFMEMORY;
     846    LPCITEMIDLIST  pidlTemp;
     847    PIDLTYPE pt1, pt2;
     848
     849    TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n",This,lParam,pidl1,pidl2);
     850    pdump (pidl1);
     851    pdump (pidl2);
     852
     853    if (!pidl1 && !pidl2)
     854    {
     855      hr = ResultFromShort(0);
     856    }
     857    else if (!pidl1)
     858    {
     859      hr = ResultFromShort(-1);
     860    }
     861    else if (!pidl2)
     862    {
     863      hr = ResultFromShort(1);
     864    }
     865    else
     866    {
     867      LPPIDLDATA pd1, pd2;
     868      pd1 = _ILGetDataPointer(pidl1);
     869      pd2 = _ILGetDataPointer(pidl2);
     870
     871      /* compate the types. sort order is the PT_* constant */
     872      pt1 = ( pd1 ? pd1->type: PT_DESKTOP);
     873      pt2 = ( pd2 ? pd2->type: PT_DESKTOP);
     874
     875      if (pt1 != pt2)
     876      {
     877        hr = ResultFromShort(pt1-pt2);
     878      }
     879      else                      /* same type of pidl */
     880      {
     881        _ILSimpleGetText(pidl1, szTemp1, MAX_PATH);
     882        _ILSimpleGetText(pidl2, szTemp2, MAX_PATH);
     883        nReturn = strcasecmp(szTemp1, szTemp2);
     884
     885        if (nReturn == 0)               /* first pidl different ? */
     886        {
     887          pidl1 = ILGetNext(pidl1);
     888
     889          if (pidl1 && pidl1->mkid.cb)      /* go deeper? */
     890          {
     891            pidlTemp = ILCloneFirst(pidl1);
     892            pidl2 = ILGetNext(pidl2);
     893
     894            hr = IShellFolder_BindToObject(iface, pidlTemp, NULL, &IID_IShellFolder, (LPVOID*)&psf);
     895            if (SUCCEEDED(hr))
     896            {
     897              nReturn = IShellFolder_CompareIDs(psf, 0, pidl1, pidl2);
     898              IShellFolder_Release(psf);
     899              hr = ResultFromShort(nReturn);
     900            }
     901            ILFree(pidlTemp);
     902          }
     903          else
     904          {
     905            hr = ResultFromShort(nReturn);      /* two equal simple pidls */
     906          }
     907        }
     908        else
     909        {
     910          hr = ResultFromShort(nReturn);        /* two different simple pidls */
     911        }
     912      }
     913    }
     914
     915    TRACE("-- res=0x%08lx\n", hr);
     916    return hr;
     917}
     918
     919/**************************************************************************
     920*   IShellFolder_fnCreateViewObject
    920921*/
    921922static HRESULT WINAPI IShellFolder_fnCreateViewObject(
    922         IShellFolder2 * iface,
    923         HWND hwndOwner,
    924         REFIID riid,
    925         LPVOID *ppvOut)
    926 {
    927         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    928 
    929         LPSHELLVIEW     pShellView;
    930         HRESULT         hr = E_INVALIDARG;
    931 
    932         TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,debugstr_guid(riid),ppvOut);
    933        
    934         if(ppvOut)
    935         {
    936           *ppvOut = NULL;
    937 
    938           if(IsEqualIID(riid, &IID_IDropTarget))
    939           {
    940             hr = IShellFolder_QueryInterface(iface, &IID_IDropTarget, ppvOut);
    941           }
    942           else if(IsEqualIID(riid, &IID_IContextMenu))
    943           {
    944             FIXME("IContextMenu not implemented\n");
    945             hr = E_NOTIMPL;
    946           }
    947           else if(IsEqualIID(riid, &IID_IShellView))
    948           {
    949             pShellView = IShellView_Constructor((IShellFolder*)iface);
    950             if(pShellView)
    951             {
    952               hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
    953               IShellView_Release(pShellView);
    954             }
    955           }
    956         }
    957         TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
    958         return hr;
     923    IShellFolder2 * iface,
     924    HWND hwndOwner,
     925    REFIID riid,
     926    LPVOID *ppvOut)
     927{
     928    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     929
     930    LPSHELLVIEW pShellView;
     931    HRESULT     hr = E_INVALIDARG;
     932
     933    TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,debugstr_guid(riid),ppvOut);
     934
     935    if(ppvOut)
     936    {
     937      *ppvOut = NULL;
     938
     939      if(IsEqualIID(riid, &IID_IDropTarget))
     940      {
     941        hr = IShellFolder_QueryInterface(iface, &IID_IDropTarget, ppvOut);
     942      }
     943      else if(IsEqualIID(riid, &IID_IContextMenu))
     944      {
     945        FIXME("IContextMenu not implemented\n");
     946        hr = E_NOTIMPL;
     947      }
     948      else if(IsEqualIID(riid, &IID_IShellView))
     949      {
     950        pShellView = IShellView_Constructor((IShellFolder*)iface);
     951        if(pShellView)
     952        {
     953          hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
     954          IShellView_Release(pShellView);
     955        }
     956      }
     957    }
     958    TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
     959    return hr;
    959960}
    960961
     
    964965* PARAMETERS
    965966*  UINT            cidl,     //[in ] num elements in pidl array
    966 *  LPCITEMIDLIST*  apidl,    //[in ] simple pidl array 
    967 *  ULONG*          rgfInOut) //[out] result array 
     967*  LPCITEMIDLIST*  apidl,    //[in ] simple pidl array
     968*  ULONG*          rgfInOut) //[out] result array
    968969*
    969970*/
    970971static HRESULT WINAPI IShellFolder_fnGetAttributesOf(
    971         IShellFolder2 * iface,
    972         UINT cidl,
    973         LPCITEMIDLIST *apidl,
    974         DWORD *rgfInOut)
    975 {
    976         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    977 
    978         HRESULT hr = S_OK;
    979 
    980         TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl,*rgfInOut);
    981 
    982         if ( (!cidl) || (!apidl) || (!rgfInOut))
    983           return E_INVALIDARG;
    984 
    985         while (cidl > 0 && *apidl)
    986         {
    987           pdump (*apidl);
    988           SHELL32_GetItemAttributes(_IShellFolder_(This), *apidl, rgfInOut);
    989           apidl++;
    990           cidl--;
    991         }
    992 
    993         TRACE("-- result=0x%08lx\n",*rgfInOut);
    994 
    995         return hr;
     972    IShellFolder2 * iface,
     973    UINT cidl,
     974    LPCITEMIDLIST *apidl,
     975    DWORD *rgfInOut)
     976{
     977    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     978
     979    HRESULT hr = S_OK;
     980
     981    TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl,*rgfInOut);
     982
     983    if ( (!cidl) || (!apidl) || (!rgfInOut))
     984      return E_INVALIDARG;
     985
     986    while (cidl > 0 && *apidl)
     987    {
     988      pdump (*apidl);
     989      SHELL32_GetItemAttributes(_IShellFolder_(This), *apidl, rgfInOut);
     990      apidl++;
     991      cidl--;
     992    }
     993
     994    TRACE("-- result=0x%08lx\n",*rgfInOut);
     995
     996    return hr;
    996997}
    997998/**************************************************************************
     
    10031004*  LPCITEMIDLIST* apidl,     //[in ] simple pidl array
    10041005*  REFIID         riid,      //[in ] Requested Interface
    1005 *  UINT*          prgfInOut, //[   ] reserved 
     1006*  UINT*          prgfInOut, //[   ] reserved
    10061007*  LPVOID*        ppvObject) //[out] Resulting Interface
    10071008*
     
    10161017*  and GetData's it if the drop is in another explorer window that needs the positions.
    10171018*/
    1018 static HRESULT WINAPI IShellFolder_fnGetUIObjectOf( 
    1019         IShellFolder2 * iface,
    1020         HWND            hwndOwner,
    1021         UINT            cidl,
    1022         LPCITEMIDLIST * apidl,
    1023         REFIID          riid,
    1024         UINT *          prgfInOut,
    1025         LPVOID *        ppvOut)
    1026 {       
    1027         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1028 
    1029         LPITEMIDLIST    pidl;
    1030         IUnknown*       pObj = NULL;
    1031         HRESULT         hr = E_INVALIDARG;
    1032        
    1033         TRACE("(%p)->(0x%04x,%u,apidl=%p,\n\tIID:%s,%p,%p)\n",
    1034           This,hwndOwner,cidl,apidl,debugstr_guid(riid),prgfInOut,ppvOut);
    1035 
    1036         if (ppvOut)
    1037         {
    1038           *ppvOut = NULL;
    1039 
    1040           if(IsEqualIID(riid, &IID_IContextMenu) && (cidl >= 1))
    1041           {
    1042             pObj  = (LPUNKNOWN)ISvItemCm_Constructor((IShellFolder*)iface, This->absPidl, apidl, cidl);
    1043             hr = S_OK;
    1044           }
    1045           else if (IsEqualIID(riid, &IID_IDataObject) &&(cidl >= 1))
    1046           {
    1047             pObj = (LPUNKNOWN)IDataObject_Constructor (hwndOwner, This->absPidl, apidl, cidl);
    1048             hr = S_OK;
    1049           }
    1050           else if (IsEqualIID(riid, &IID_IExtractIconA) && (cidl == 1))
    1051           {
    1052             pidl = ILCombine(This->absPidl,apidl[0]);
    1053             pObj = (LPUNKNOWN)IExtractIconA_Constructor( pidl );
    1054             SHFree(pidl);
    1055             hr = S_OK;
    1056           }
    1057           else if (IsEqualIID(riid, &IID_IDropTarget) && (cidl >= 1))
    1058           {
    1059             hr = IShellFolder_QueryInterface(iface, &IID_IDropTarget, (LPVOID*)&pObj);
    1060           }
    1061           else
    1062           {
    1063             hr = E_NOINTERFACE;
    1064           }
    1065 
    1066           if(!pObj)
    1067             hr = E_OUTOFMEMORY;
    1068 
    1069           *ppvOut = pObj;
    1070         }
    1071         TRACE("(%p)->hr=0x%08lx\n",This, hr);
    1072         return hr;
     1019static HRESULT WINAPI IShellFolder_fnGetUIObjectOf(
     1020    IShellFolder2 * iface,
     1021    HWND        hwndOwner,
     1022    UINT        cidl,
     1023    LPCITEMIDLIST * apidl,
     1024    REFIID      riid,
     1025    UINT *      prgfInOut,
     1026    LPVOID *    ppvOut)
     1027{
     1028    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1029
     1030    LPITEMIDLIST    pidl;
     1031    IUnknown*   pObj = NULL;
     1032    HRESULT     hr = E_INVALIDARG;
     1033
     1034    TRACE("(%p)->(0x%04x,%u,apidl=%p,\n\tIID:%s,%p,%p)\n",
     1035      This,hwndOwner,cidl,apidl,debugstr_guid(riid),prgfInOut,ppvOut);
     1036
     1037    if (ppvOut)
     1038    {
     1039      *ppvOut = NULL;
     1040
     1041      if(IsEqualIID(riid, &IID_IContextMenu) && (cidl >= 1))
     1042      {
     1043        pObj  = (LPUNKNOWN)ISvItemCm_Constructor((IShellFolder*)iface, This->absPidl, apidl, cidl);
     1044        hr = S_OK;
     1045      }
     1046      else if (IsEqualIID(riid, &IID_IDataObject) &&(cidl >= 1))
     1047      {
     1048        pObj = (LPUNKNOWN)IDataObject_Constructor (hwndOwner, This->absPidl, apidl, cidl);
     1049        hr = S_OK;
     1050      }
     1051      else if (IsEqualIID(riid, &IID_IExtractIconA) && (cidl == 1))
     1052      {
     1053        pidl = ILCombine(This->absPidl,apidl[0]);
     1054        pObj = (LPUNKNOWN)IExtractIconA_Constructor( pidl );
     1055        SHFree(pidl);
     1056        hr = S_OK;
     1057      }
     1058      else if (IsEqualIID(riid, &IID_IDropTarget) && (cidl >= 1))
     1059      {
     1060        hr = IShellFolder_QueryInterface(iface, &IID_IDropTarget, (LPVOID*)&pObj);
     1061      }
     1062      else
     1063      {
     1064        hr = E_NOINTERFACE;
     1065      }
     1066
     1067      if(!pObj)
     1068        hr = E_OUTOFMEMORY;
     1069
     1070      *ppvOut = pObj;
     1071    }
     1072    TRACE("(%p)->hr=0x%08lx\n",This, hr);
     1073    return hr;
    10731074}
    10741075
     
    10891090
    10901091static HRESULT WINAPI IShellFolder_fnGetDisplayNameOf(
    1091         IShellFolder2 * iface,
    1092         LPCITEMIDLIST pidl,
    1093         DWORD dwFlags,
    1094         LPSTRRET strRet)
    1095 {
    1096         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1097 
    1098         CHAR            szPath[MAX_PATH]= "";
    1099         int             len = 0;
    1100         BOOL            bSimplePidl;
    1101                
    1102         TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,strRet);
    1103         pdump(pidl);
    1104        
    1105         if(!pidl || !strRet) return E_INVALIDARG;
    1106        
    1107         bSimplePidl = _ILIsPidlSimple(pidl);
    1108 
    1109         /* take names of special folders only if its only this folder */
    1110         if (_ILIsSpecialFolder(pidl))
    1111         {
    1112           if ( bSimplePidl)
    1113           {
    1114             _ILSimpleGetText(pidl, szPath, MAX_PATH); /* append my own path */
    1115           }
    1116         }
    1117         else
    1118         {
    1119           if (!(dwFlags & SHGDN_INFOLDER) && (dwFlags & SHGDN_FORPARSING) && This->sMyPath)
    1120           {
    1121             strcpy (szPath, This->sMyPath);                     /* get path to root*/
    1122             PathAddBackslashA(szPath);
    1123             len = strlen(szPath);
    1124           }
    1125           _ILSimpleGetText(pidl, szPath + len, MAX_PATH - len); /* append my own path */
    1126         }
    1127        
    1128         if ( (dwFlags & SHGDN_FORPARSING) && !bSimplePidl)      /* go deeper if needed */
    1129         {
    1130           PathAddBackslashA(szPath);
    1131           len = strlen(szPath);
    1132 
    1133           if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags, szPath + len, MAX_PATH - len)))
    1134             return E_OUTOFMEMORY;
    1135         }
    1136         strRet->uType = STRRET_CSTRA;
    1137         lstrcpynA(strRet->u.cStr, szPath, MAX_PATH);
    1138 
    1139         TRACE("-- (%p)->(%s)\n", This, szPath);
    1140         return S_OK;
     1092    IShellFolder2 * iface,
     1093    LPCITEMIDLIST pidl,
     1094    DWORD dwFlags,
     1095    LPSTRRET strRet)
     1096{
     1097    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1098
     1099    CHAR        szPath[MAX_PATH]= "";
     1100    int     len = 0;
     1101    BOOL        bSimplePidl;
     1102
     1103    TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,strRet);
     1104    pdump(pidl);
     1105
     1106    if(!pidl || !strRet) return E_INVALIDARG;
     1107
     1108    bSimplePidl = _ILIsPidlSimple(pidl);
     1109
     1110    /* take names of special folders only if its only this folder */
     1111    if (_ILIsSpecialFolder(pidl))
     1112    {
     1113      if ( bSimplePidl)
     1114      {
     1115        _ILSimpleGetText(pidl, szPath, MAX_PATH); /* append my own path */
     1116      }
     1117    }
     1118    else
     1119    {
     1120      if (!(dwFlags & SHGDN_INFOLDER) && (dwFlags & SHGDN_FORPARSING) && This->sMyPath)
     1121      {
     1122        strcpy (szPath, This->sMyPath);         /* get path to root*/
     1123        PathAddBackslashA(szPath);
     1124        len = strlen(szPath);
     1125      }
     1126      _ILSimpleGetText(pidl, szPath + len, MAX_PATH - len); /* append my own path */
     1127    }
     1128
     1129    if ( (dwFlags & SHGDN_FORPARSING) && !bSimplePidl)  /* go deeper if needed */
     1130    {
     1131      PathAddBackslashA(szPath);
     1132      len = strlen(szPath);
     1133
     1134      if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags, szPath + len, MAX_PATH - len)))
     1135        return E_OUTOFMEMORY;
     1136    }
     1137    strRet->uType = STRRET_CSTRA;
     1138    lstrcpynA(strRet->u.cStr, szPath, MAX_PATH);
     1139
     1140    TRACE("-- (%p)->(%s)\n", This, szPath);
     1141    return S_OK;
    11411142}
    11421143
     
    11541155*/
    11551156static HRESULT WINAPI IShellFolder_fnSetNameOf(
    1156         IShellFolder2 * iface,
    1157         HWND hwndOwner,
    1158         LPCITEMIDLIST pidl, /*simple pidl*/
    1159         LPCOLESTR lpName,
    1160         DWORD dwFlags,
    1161         LPITEMIDLIST *pPidlOut)
    1162 {
    1163         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1164         char szSrc[MAX_PATH], szDest[MAX_PATH];
    1165         int len;
    1166         BOOL bIsFolder = _ILIsFolder(ILFindLastID(pidl));
    1167 
    1168         TRACE("(%p)->(%u,pidl=%p,%s,%lu,%p)\n",
    1169           This,hwndOwner,pidl,debugstr_w(lpName),dwFlags,pPidlOut);
    1170 
    1171         /* build source path */
    1172         if (dwFlags & SHGDN_INFOLDER)
    1173         {
    1174           strcpy(szSrc, This->sMyPath);
    1175           PathAddBackslashA(szSrc);
    1176           len = strlen (szSrc);
    1177           _ILSimpleGetText(pidl, szSrc+len, MAX_PATH-len);
    1178         }
    1179         else
    1180         {
    1181           SHGetPathFromIDListA(pidl, szSrc);
    1182         }
    1183 
    1184         /* build destination path */
    1185         strcpy(szDest, This->sMyPath);
    1186         PathAddBackslashA(szDest);
    1187         len = strlen (szDest);
     1157    IShellFolder2 * iface,
     1158    HWND hwndOwner,
     1159    LPCITEMIDLIST pidl, /*simple pidl*/
     1160    LPCOLESTR lpName,
     1161    DWORD dwFlags,
     1162    LPITEMIDLIST *pPidlOut)
     1163{
     1164    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1165    char szSrc[MAX_PATH], szDest[MAX_PATH];
     1166    int len;
     1167    BOOL bIsFolder = _ILIsFolder(ILFindLastID(pidl));
     1168
     1169    TRACE("(%p)->(%u,pidl=%p,%s,%lu,%p)\n",
     1170      This,hwndOwner,pidl,debugstr_w(lpName),dwFlags,pPidlOut);
     1171
     1172    /* build source path */
     1173    if (dwFlags & SHGDN_INFOLDER)
     1174    {
     1175      strcpy(szSrc, This->sMyPath);
     1176      PathAddBackslashA(szSrc);
     1177      len = strlen (szSrc);
     1178      _ILSimpleGetText(pidl, szSrc+len, MAX_PATH-len);
     1179    }
     1180    else
     1181    {
     1182      SHGetPathFromIDListA(pidl, szSrc);
     1183    }
     1184
     1185    /* build destination path */
     1186    strcpy(szDest, This->sMyPath);
     1187    PathAddBackslashA(szDest);
     1188    len = strlen (szDest);
    11881189        WideCharToMultiByte( CP_ACP, 0, lpName, -1, szDest+len, MAX_PATH-len, NULL, NULL );
    11891190        szDest[MAX_PATH-1] = 0;
    1190         TRACE("src=%s dest=%s\n", szSrc, szDest);
    1191         if ( MoveFileA(szSrc, szDest) )
    1192         {
    1193           if (pPidlOut) *pPidlOut = SHSimpleIDListFromPathA(szDest);
    1194           SHChangeNotifyA( bIsFolder?SHCNE_RENAMEFOLDER:SHCNE_RENAMEITEM, SHCNF_PATHA, szSrc, szDest);
    1195           return S_OK;
    1196         }
    1197         return E_FAIL;
     1191    TRACE("src=%s dest=%s\n", szSrc, szDest);
     1192    if ( MoveFileA(szSrc, szDest) )
     1193    {
     1194      if (pPidlOut) *pPidlOut = SHSimpleIDListFromPathA(szDest);
     1195      SHChangeNotifyA( bIsFolder?SHCNE_RENAMEFOLDER:SHCNE_RENAMEITEM, SHCNF_PATHA, szSrc, szDest);
     1196      return S_OK;
     1197    }
     1198    return E_FAIL;
    11981199}
    11991200
    12001201static HRESULT WINAPI IShellFolder_fnGetDefaultSearchGUID(
    1201         IShellFolder2 * iface,
    1202         GUID *pguid)
    1203 {
    1204         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1205         FIXME("(%p)\n",This);
    1206         return E_NOTIMPL;
    1207 }       
     1202    IShellFolder2 * iface,
     1203    GUID *pguid)
     1204{
     1205    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1206    FIXME("(%p)\n",This);
     1207    return E_NOTIMPL;
     1208}
    12081209static HRESULT WINAPI IShellFolder_fnEnumSearches(
    1209         IShellFolder2 * iface,
    1210         IEnumExtraSearch **ppenum)
    1211 {
    1212         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1213         FIXME("(%p)\n",This);
    1214         return E_NOTIMPL;
    1215 }       
     1210    IShellFolder2 * iface,
     1211    IEnumExtraSearch **ppenum)
     1212{
     1213    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1214    FIXME("(%p)\n",This);
     1215    return E_NOTIMPL;
     1216}
    12161217static HRESULT WINAPI IShellFolder_fnGetDefaultColumn(
    1217         IShellFolder2 * iface,
    1218         DWORD dwRes,
    1219         ULONG *pSort,
    1220         ULONG *pDisplay)
    1221 {
    1222         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1223 
    1224         TRACE("(%p)\n",This);
    1225 
    1226         if (pSort) *pSort = 0;
    1227         if (pDisplay) *pDisplay = 0;
    1228 
    1229         return S_OK;
    1230 }       
     1218    IShellFolder2 * iface,
     1219    DWORD dwRes,
     1220    ULONG *pSort,
     1221    ULONG *pDisplay)
     1222{
     1223    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1224
     1225    TRACE("(%p)\n",This);
     1226
     1227    if (pSort) *pSort = 0;
     1228    if (pDisplay) *pDisplay = 0;
     1229
     1230    return S_OK;
     1231}
    12311232static HRESULT WINAPI IShellFolder_fnGetDefaultColumnState(
    1232         IShellFolder2 * iface,
    1233         UINT iColumn,
    1234         DWORD *pcsFlags)
    1235 {
    1236         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1237        
    1238         TRACE("(%p)\n",This);
    1239 
    1240         if (!pcsFlags || iColumn >= GENERICSHELLVIEWCOLUMNS ) return E_INVALIDARG;
    1241 
    1242         *pcsFlags = GenericSFHeader[iColumn].pcsFlags;
    1243 
    1244         return S_OK;
    1245 }       
     1233    IShellFolder2 * iface,
     1234    UINT iColumn,
     1235    DWORD *pcsFlags)
     1236{
     1237    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1238
     1239    TRACE("(%p)\n",This);
     1240
     1241    if (!pcsFlags || iColumn >= GENERICSHELLVIEWCOLUMNS ) return E_INVALIDARG;
     1242
     1243    *pcsFlags = GenericSFHeader[iColumn].pcsFlags;
     1244
     1245    return S_OK;
     1246}
    12461247static HRESULT WINAPI IShellFolder_fnGetDetailsEx(
    1247         IShellFolder2 * iface,
    1248         LPCITEMIDLIST pidl,
    1249         const SHCOLUMNID *pscid,
    1250         VARIANT *pv)
    1251 {
    1252         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1253         FIXME("(%p)\n",This);
    1254 
    1255         return E_NOTIMPL;
    1256 }       
     1248    IShellFolder2 * iface,
     1249    LPCITEMIDLIST pidl,
     1250    const SHCOLUMNID *pscid,
     1251    VARIANT *pv)
     1252{
     1253    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1254    FIXME("(%p)\n",This);
     1255
     1256    return E_NOTIMPL;
     1257}
    12571258static HRESULT WINAPI IShellFolder_fnGetDetailsOf(
    1258         IShellFolder2 * iface,
    1259         LPCITEMIDLIST pidl,
    1260         UINT iColumn,
    1261         SHELLDETAILS *psd)
    1262 {
    1263         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1264         HRESULT hr = E_FAIL;
    1265 
    1266         TRACE("(%p)->(%p %i %p)\n",This, pidl, iColumn, psd);
    1267 
    1268         if (!psd || iColumn >= GENERICSHELLVIEWCOLUMNS ) return E_INVALIDARG;
    1269        
    1270         if (!pidl)
    1271         {
    1272           /* the header titles */
    1273           psd->fmt = GenericSFHeader[iColumn].fmt;
    1274           psd->cxChar = GenericSFHeader[iColumn].cxChar;
    1275           psd->str.uType = STRRET_CSTRA;
    1276           LoadStringA(shell32_hInstance, GenericSFHeader[iColumn].colnameid, psd->str.u.cStr, MAX_PATH);
    1277           return S_OK;
    1278         }
    1279         else
    1280         {
    1281           /* the data from the pidl */
    1282           switch(iColumn)
    1283           {
    1284             case 0:     /* name */
    1285               hr = IShellFolder_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
    1286               break;
    1287             case 1:     /* size */
    1288               _ILGetFileSize (pidl, psd->str.u.cStr, MAX_PATH);
    1289               break;
    1290             case 2:     /* type */
    1291               _ILGetFileType(pidl, psd->str.u.cStr, MAX_PATH);
    1292               break;
    1293             case 3:     /* date */
    1294               _ILGetFileDate(pidl, psd->str.u.cStr, MAX_PATH);
    1295               break;
    1296             case 4:     /* attributes */
    1297               _ILGetFileAttributes(pidl, psd->str.u.cStr, MAX_PATH);
    1298               break;
    1299           }
    1300           hr = S_OK;
    1301           psd->str.uType = STRRET_CSTRA;
    1302         }
    1303 
    1304         return hr;
    1305 }       
     1259    IShellFolder2 * iface,
     1260    LPCITEMIDLIST pidl,
     1261    UINT iColumn,
     1262    SHELLDETAILS *psd)
     1263{
     1264    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1265    HRESULT hr = E_FAIL;
     1266
     1267    TRACE("(%p)->(%p %i %p)\n",This, pidl, iColumn, psd);
     1268
     1269    if (!psd || iColumn >= GENERICSHELLVIEWCOLUMNS ) return E_INVALIDARG;
     1270
     1271    if (!pidl)
     1272    {
     1273      /* the header titles */
     1274      psd->fmt = GenericSFHeader[iColumn].fmt;
     1275      psd->cxChar = GenericSFHeader[iColumn].cxChar;
     1276      psd->str.uType = STRRET_CSTRA;
     1277      LoadStringA(shell32_hInstance, GenericSFHeader[iColumn].colnameid, psd->str.u.cStr, MAX_PATH);
     1278      return S_OK;
     1279    }
     1280    else
     1281    {
     1282      /* the data from the pidl */
     1283      switch(iColumn)
     1284      {
     1285        case 0: /* name */
     1286          hr = IShellFolder_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
     1287          break;
     1288        case 1: /* size */
     1289          _ILGetFileSize (pidl, psd->str.u.cStr, MAX_PATH);
     1290          break;
     1291        case 2: /* type */
     1292          _ILGetFileType(pidl, psd->str.u.cStr, MAX_PATH);
     1293          break;
     1294        case 3: /* date */
     1295          _ILGetFileDate(pidl, psd->str.u.cStr, MAX_PATH);
     1296          break;
     1297        case 4: /* attributes */
     1298          _ILGetFileAttributes(pidl, psd->str.u.cStr, MAX_PATH);
     1299          break;
     1300      }
     1301      hr = S_OK;
     1302      psd->str.uType = STRRET_CSTRA;
     1303    }
     1304
     1305    return hr;
     1306}
    13061307static HRESULT WINAPI IShellFolder_fnMapNameToSCID(
    1307         IShellFolder2 * iface,
    1308         LPCWSTR pwszName,
    1309         SHCOLUMNID *pscid)
    1310 {
    1311         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1312         FIXME("(%p)\n",This);
    1313         return E_NOTIMPL;
    1314 }       
    1315 
    1316 static ICOM_VTABLE(IShellFolder2) sfvt = 
    1317 {       
    1318         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    1319         IShellFolder_fnQueryInterface,
    1320         IShellFolder_fnAddRef,
    1321         IShellFolder_fnRelease,
    1322         IShellFolder_fnParseDisplayName,
    1323         IShellFolder_fnEnumObjects,
    1324         IShellFolder_fnBindToObject,
    1325         IShellFolder_fnBindToStorage,
    1326         IShellFolder_fnCompareIDs,
    1327         IShellFolder_fnCreateViewObject,
    1328         IShellFolder_fnGetAttributesOf,
    1329         IShellFolder_fnGetUIObjectOf,
    1330         IShellFolder_fnGetDisplayNameOf,
    1331         IShellFolder_fnSetNameOf,
    1332 
    1333         /* ShellFolder2 */
    1334         IShellFolder_fnGetDefaultSearchGUID,
    1335         IShellFolder_fnEnumSearches,
    1336         IShellFolder_fnGetDefaultColumn,
    1337         IShellFolder_fnGetDefaultColumnState,
    1338         IShellFolder_fnGetDetailsEx,
    1339         IShellFolder_fnGetDetailsOf,
    1340         IShellFolder_fnMapNameToSCID
     1308    IShellFolder2 * iface,
     1309    LPCWSTR pwszName,
     1310    SHCOLUMNID *pscid)
     1311{
     1312    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1313    FIXME("(%p)\n",This);
     1314    return E_NOTIMPL;
     1315}
     1316
     1317static ICOM_VTABLE(IShellFolder2) sfvt =
     1318{
     1319    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1320    IShellFolder_fnQueryInterface,
     1321    IShellFolder_fnAddRef,
     1322    IShellFolder_fnRelease,
     1323    IShellFolder_fnParseDisplayName,
     1324    IShellFolder_fnEnumObjects,
     1325    IShellFolder_fnBindToObject,
     1326    IShellFolder_fnBindToStorage,
     1327    IShellFolder_fnCompareIDs,
     1328    IShellFolder_fnCreateViewObject,
     1329    IShellFolder_fnGetAttributesOf,
     1330    IShellFolder_fnGetUIObjectOf,
     1331    IShellFolder_fnGetDisplayNameOf,
     1332    IShellFolder_fnSetNameOf,
     1333
     1334    /* ShellFolder2 */
     1335    IShellFolder_fnGetDefaultSearchGUID,
     1336    IShellFolder_fnEnumSearches,
     1337    IShellFolder_fnGetDefaultColumn,
     1338    IShellFolder_fnGetDefaultColumnState,
     1339    IShellFolder_fnGetDetailsEx,
     1340    IShellFolder_fnGetDetailsOf,
     1341    IShellFolder_fnMapNameToSCID
    13411342};
    13421343
     
    13461347
    13471348static HRESULT WINAPI ISFHelper_fnQueryInterface(
    1348         ISFHelper *iface,
    1349         REFIID riid,
    1350         LPVOID *ppvObj)
    1351 {
    1352         _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface);
    1353 
    1354         TRACE("(%p)\n", This);
    1355 
    1356         return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObj);
     1349    ISFHelper *iface,
     1350    REFIID riid,
     1351    LPVOID *ppvObj)
     1352{
     1353    _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface);
     1354
     1355    TRACE("(%p)\n", This);
     1356
     1357    return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObj);
    13571358}
    13581359
    13591360static ULONG WINAPI ISFHelper_fnAddRef(
    1360         ISFHelper *iface)
    1361 {
    1362         _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface);
    1363 
    1364         TRACE("(%p)\n", This);
    1365 
    1366         return IUnknown_AddRef(This->pUnkOuter);
     1361    ISFHelper *iface)
     1362{
     1363    _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface);
     1364
     1365    TRACE("(%p)\n", This);
     1366
     1367    return IUnknown_AddRef(This->pUnkOuter);
    13671368}
    13681369
    13691370static ULONG WINAPI ISFHelper_fnRelease(
    1370         ISFHelper *iface)
    1371 {
    1372         _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface);
    1373 
    1374         TRACE("(%p)\n", This);
    1375 
    1376         return IUnknown_Release(This->pUnkOuter);
     1371    ISFHelper *iface)
     1372{
     1373    _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface);
     1374
     1375    TRACE("(%p)\n", This);
     1376
     1377    return IUnknown_Release(This->pUnkOuter);
    13771378}
    13781379
     
    13851386
    13861387static HRESULT WINAPI ISFHelper_fnGetUniqueName(
    1387         ISFHelper *iface,
    1388         LPSTR lpName,
    1389         UINT uLen)
    1390 {
    1391         _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface)
    1392         IEnumIDList * penum;
    1393         HRESULT hr;
    1394         char szText[MAX_PATH];
    1395         char * szNewFolder = "New Folder";
    1396        
    1397         TRACE("(%p)(%s %u)\n", This, lpName, uLen);
    1398 
    1399         if (uLen < strlen(szNewFolder) + 4) return E_POINTER;
    1400        
    1401         strcpy(lpName, szNewFolder);
    1402        
    1403         hr = IShellFolder_fnEnumObjects(_IShellFolder2_(This), 0, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &penum);
    1404         if (penum)
    1405         {
    1406           LPITEMIDLIST pidl;
    1407           DWORD dwFetched;
    1408           int i=1;
    1409          
     1388    ISFHelper *iface,
     1389    LPSTR lpName,
     1390    UINT uLen)
     1391{
     1392    _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface)
     1393    IEnumIDList * penum;
     1394    HRESULT hr;
     1395    char szText[MAX_PATH];
     1396    char * szNewFolder = "New Folder";
     1397
     1398    TRACE("(%p)(%s %u)\n", This, lpName, uLen);
     1399
     1400    if (uLen < strlen(szNewFolder) + 4) return E_POINTER;
     1401
     1402    strcpy(lpName, szNewFolder);
     1403
     1404    hr = IShellFolder_fnEnumObjects(_IShellFolder2_(This), 0, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &penum);
     1405    if (penum)
     1406    {
     1407      LPITEMIDLIST pidl;
     1408      DWORD dwFetched;
     1409      int i=1;
     1410
    14101411next:     IEnumIDList_Reset(penum);
    1411           while(S_OK == IEnumIDList_Next(penum, 1, &pidl, &dwFetched) && dwFetched)
    1412           {
    1413             _ILSimpleGetText(pidl, szText, MAX_PATH);
    1414             if (0 == strcasecmp(szText, lpName))
    1415             {
    1416               sprintf(lpName, "%s %d", szNewFolder, i++);
    1417               if (i > 99)
    1418               {
    1419                 hr = E_FAIL;
    1420                 break;
    1421               }
    1422               goto next;
    1423             }
    1424           }
    1425 
    1426           IEnumIDList_Release(penum);
    1427         }
    1428         return hr;
    1429 }
    1430        
     1412      while(S_OK == IEnumIDList_Next(penum, 1, &pidl, &dwFetched) && dwFetched)
     1413      {
     1414        _ILSimpleGetText(pidl, szText, MAX_PATH);
     1415        if (0 == strcasecmp(szText, lpName))
     1416        {
     1417          sprintf(lpName, "%s %d", szNewFolder, i++);
     1418          if (i > 99)
     1419          {
     1420            hr = E_FAIL;
     1421            break;
     1422          }
     1423          goto next;
     1424        }
     1425      }
     1426
     1427      IEnumIDList_Release(penum);
     1428    }
     1429    return hr;
     1430}
     1431
    14311432/****************************************************************************
    14321433 * ISFHelper_fnAddFolder
     
    14361437
    14371438static HRESULT WINAPI ISFHelper_fnAddFolder(
    1438         ISFHelper *iface,
    1439         HWND hwnd,
    1440         LPCSTR lpName,
    1441         LPITEMIDLIST* ppidlOut)
    1442 {
    1443         _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface)
    1444         char lpstrNewDir[MAX_PATH];
    1445         DWORD bRes;
    1446         HRESULT hres = E_FAIL;
    1447        
    1448         TRACE("(%p)(%s %p)\n", This, lpName, ppidlOut);
    1449 
    1450         strcpy(lpstrNewDir, This->sMyPath);
    1451         PathAddBackslashA(lpstrNewDir);
    1452         strcat(lpstrNewDir, lpName);
    1453 
    1454         bRes = CreateDirectoryA(lpstrNewDir, NULL);
    1455 
    1456         if (bRes)
    1457         {
    1458           LPITEMIDLIST pidl, pidlitem;
    1459 
    1460           pidlitem = SHSimpleIDListFromPathA(lpstrNewDir);
    1461 
    1462           pidl = ILCombine(This->absPidl, pidlitem);
    1463           SHChangeNotifyA(SHCNE_MKDIR, SHCNF_IDLIST, pidl, NULL);
    1464           SHFree(pidl);
    1465 
    1466           if (ppidlOut) *ppidlOut = pidlitem;
    1467           hres = S_OK;
    1468         }
    1469         else
    1470         {
    1471           char lpstrText[128+MAX_PATH];
    1472           char lpstrTempText[128];
    1473           char lpstrCaption[256];
    1474 
    1475           /* Cannot Create folder because of permissions */
    1476           LoadStringA(shell32_hInstance, IDS_CREATEFOLDER_DENIED, lpstrTempText, sizeof(lpstrTempText));
    1477           LoadStringA(shell32_hInstance, IDS_CREATEFOLDER_CAPTION, lpstrCaption, sizeof(lpstrCaption));
    1478           sprintf(lpstrText,lpstrTempText, lpstrNewDir);
    1479           MessageBoxA(hwnd,lpstrText, lpstrCaption, MB_OK | MB_ICONEXCLAMATION);
    1480         }
    1481 
    1482         return hres;
     1439    ISFHelper *iface,
     1440    HWND hwnd,
     1441    LPCSTR lpName,
     1442    LPITEMIDLIST* ppidlOut)
     1443{
     1444    _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface)
     1445    char lpstrNewDir[MAX_PATH];
     1446    DWORD bRes;
     1447    HRESULT hres = E_FAIL;
     1448
     1449    TRACE("(%p)(%s %p)\n", This, lpName, ppidlOut);
     1450
     1451    strcpy(lpstrNewDir, This->sMyPath);
     1452    PathAddBackslashA(lpstrNewDir);
     1453    strcat(lpstrNewDir, lpName);
     1454
     1455    bRes = CreateDirectoryA(lpstrNewDir, NULL);
     1456
     1457    if (bRes)
     1458    {
     1459      LPITEMIDLIST pidl, pidlitem;
     1460
     1461      pidlitem = SHSimpleIDListFromPathA(lpstrNewDir);
     1462
     1463      pidl = ILCombine(This->absPidl, pidlitem);
     1464      SHChangeNotifyA(SHCNE_MKDIR, SHCNF_IDLIST, pidl, NULL);
     1465      SHFree(pidl);
     1466
     1467      if (ppidlOut) *ppidlOut = pidlitem;
     1468      hres = S_OK;
     1469    }
     1470    else
     1471    {
     1472      char lpstrText[128+MAX_PATH];
     1473      char lpstrTempText[128];
     1474      char lpstrCaption[256];
     1475
     1476      /* Cannot Create folder because of permissions */
     1477      LoadStringA(shell32_hInstance, IDS_CREATEFOLDER_DENIED, lpstrTempText, sizeof(lpstrTempText));
     1478      LoadStringA(shell32_hInstance, IDS_CREATEFOLDER_CAPTION, lpstrCaption, sizeof(lpstrCaption));
     1479      sprintf(lpstrText,lpstrTempText, lpstrNewDir);
     1480      MessageBoxA(hwnd,lpstrText, lpstrCaption, MB_OK | MB_ICONEXCLAMATION);
     1481    }
     1482
     1483    return hres;
    14831484}
    14841485
     
    14891490 */
    14901491static HRESULT WINAPI ISFHelper_fnDeleteItems(
    1491         ISFHelper *iface,
    1492         UINT cidl,
    1493         LPCITEMIDLIST* apidl)
    1494 {
    1495         _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface)
    1496         int i;
    1497         char szPath[MAX_PATH];
     1492    ISFHelper *iface,
     1493    UINT cidl,
     1494    LPCITEMIDLIST* apidl)
     1495{
     1496    _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface)
     1497    int i;
     1498    char szPath[MAX_PATH];
    14981499        BOOL bConfirm = TRUE;
    14991500
    1500         TRACE("(%p)(%u %p)\n", This, cidl, apidl);
    1501        
    1502         /* deleting multiple items so give a slightly different warning */
    1503         if(cidl != 1)
    1504         {
    1505           char tmp[8]; 
     1501    TRACE("(%p)(%u %p)\n", This, cidl, apidl);
     1502
     1503    /* deleting multiple items so give a slightly different warning */
     1504    if(cidl != 1)
     1505    {
     1506          char tmp[8];
    15061507          snprintf(tmp, sizeof(tmp), "%d", cidl);
    1507           if(!SHELL_WarnItemDelete(ASK_DELETE_MULTIPLE_ITEM, tmp))
     1508      if(!SHELL_WarnItemDelete(ASK_DELETE_MULTIPLE_ITEM, tmp))
    15081509            return E_FAIL;
    15091510          bConfirm = FALSE;
    1510         }
    1511 
    1512         for(i=0; i< cidl; i++)
    1513         {
    1514           strcpy(szPath, This->sMyPath);
    1515           PathAddBackslashA(szPath);
    1516           _ILSimpleGetText(apidl[i], szPath+strlen(szPath), MAX_PATH);
    1517 
    1518           if (_ILIsFolder(apidl[i]))
    1519           {
    1520             LPITEMIDLIST pidl;
    1521             TRACE("delete %s\n", szPath);
    1522             if (! SHELL_DeleteDirectoryA(szPath, bConfirm))
    1523             {
     1511    }
     1512
     1513    for(i=0; i< cidl; i++)
     1514    {
     1515      strcpy(szPath, This->sMyPath);
     1516      PathAddBackslashA(szPath);
     1517      _ILSimpleGetText(apidl[i], szPath+strlen(szPath), MAX_PATH);
     1518
     1519      if (_ILIsFolder(apidl[i]))
     1520      {
     1521        LPITEMIDLIST pidl;
     1522        TRACE("delete %s\n", szPath);
     1523        if (! SHELL_DeleteDirectoryA(szPath, bConfirm))
     1524        {
    15241525              TRACE("delete %s failed, bConfirm=%d", szPath, bConfirm);
    1525               return E_FAIL;
    1526             }
    1527             pidl = ILCombine(This->absPidl, apidl[i]);
    1528             SHChangeNotifyA(SHCNE_RMDIR, SHCNF_IDLIST, pidl, NULL);
    1529             SHFree(pidl);
    1530           }
    1531           else if (_ILIsValue(apidl[i]))
    1532           {
    1533             LPITEMIDLIST pidl;
    1534 
    1535             TRACE("delete %s\n", szPath);
    1536             if (! SHELL_DeleteFileA(szPath, bConfirm))
    1537             {
     1526          return E_FAIL;
     1527        }
     1528        pidl = ILCombine(This->absPidl, apidl[i]);
     1529        SHChangeNotifyA(SHCNE_RMDIR, SHCNF_IDLIST, pidl, NULL);
     1530        SHFree(pidl);
     1531      }
     1532      else if (_ILIsValue(apidl[i]))
     1533      {
     1534        LPITEMIDLIST pidl;
     1535
     1536        TRACE("delete %s\n", szPath);
     1537        if (! SHELL_DeleteFileA(szPath, bConfirm))
     1538        {
    15381539              TRACE("delete %s failed, bConfirm=%d", szPath, bConfirm);
    1539               return E_FAIL;
    1540             }
    1541             pidl = ILCombine(This->absPidl, apidl[i]);
    1542             SHChangeNotifyA(SHCNE_DELETE, SHCNF_IDLIST, pidl, NULL);
    1543             SHFree(pidl);
    1544           }
    1545 
    1546         }
    1547         return S_OK;
     1540          return E_FAIL;
     1541        }
     1542        pidl = ILCombine(This->absPidl, apidl[i]);
     1543        SHChangeNotifyA(SHCNE_DELETE, SHCNF_IDLIST, pidl, NULL);
     1544        SHFree(pidl);
     1545      }
     1546
     1547    }
     1548    return S_OK;
    15481549}
    15491550
     
    15541555 */
    15551556static HRESULT WINAPI ISFHelper_fnCopyItems(
    1556         ISFHelper *iface,
    1557         IShellFolder* pSFFrom,
    1558         UINT cidl,
    1559         LPCITEMIDLIST *apidl)
    1560 {
    1561         int i;
    1562         IPersistFolder2 * ppf2=NULL;
    1563         char szSrcPath[MAX_PATH], szDstPath[MAX_PATH];
    1564         _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface);
    1565 
    1566         TRACE("(%p)->(%p,%u,%p)\n", This, pSFFrom, cidl, apidl);
    1567 
    1568         IShellFolder_QueryInterface(pSFFrom, &IID_IPersistFolder2, (LPVOID*)&ppf2);
    1569         if (ppf2)
    1570         {
    1571           LPITEMIDLIST pidl;
    1572           if (SUCCEEDED(IPersistFolder2_GetCurFolder(ppf2, &pidl)))
    1573           {
    1574             for (i=0; i<cidl; i++)
    1575             {
    1576               SHGetPathFromIDListA(pidl, szSrcPath);
    1577               PathAddBackslashA(szSrcPath);
    1578               _ILSimpleGetText(apidl[i], szSrcPath+strlen(szSrcPath), MAX_PATH);
    1579 
    1580               strcpy(szDstPath, This->sMyPath);
    1581               PathAddBackslashA(szDstPath);
    1582               _ILSimpleGetText(apidl[i], szDstPath+strlen(szDstPath), MAX_PATH);
    1583               MESSAGE("would copy %s to %s\n", szSrcPath, szDstPath);
    1584             }
    1585             SHFree(pidl);
    1586           }
    1587           IPersistFolder2_Release(ppf2);
    1588         }
    1589         return S_OK;
    1590 }
    1591 
    1592 static ICOM_VTABLE(ISFHelper) shvt = 
    1593 {
    1594         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    1595         ISFHelper_fnQueryInterface,
    1596         ISFHelper_fnAddRef,
    1597         ISFHelper_fnRelease,
    1598         ISFHelper_fnGetUniqueName,
    1599         ISFHelper_fnAddFolder,
    1600         ISFHelper_fnDeleteItems,
    1601         ISFHelper_fnCopyItems,
     1557    ISFHelper *iface,
     1558    IShellFolder* pSFFrom,
     1559    UINT cidl,
     1560    LPCITEMIDLIST *apidl)
     1561{
     1562    int i;
     1563    IPersistFolder2 * ppf2=NULL;
     1564    char szSrcPath[MAX_PATH], szDstPath[MAX_PATH];
     1565    _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface);
     1566
     1567    TRACE("(%p)->(%p,%u,%p)\n", This, pSFFrom, cidl, apidl);
     1568
     1569    IShellFolder_QueryInterface(pSFFrom, &IID_IPersistFolder2, (LPVOID*)&ppf2);
     1570    if (ppf2)
     1571    {
     1572      LPITEMIDLIST pidl;
     1573      if (SUCCEEDED(IPersistFolder2_GetCurFolder(ppf2, &pidl)))
     1574      {
     1575        for (i=0; i<cidl; i++)
     1576        {
     1577          SHGetPathFromIDListA(pidl, szSrcPath);
     1578          PathAddBackslashA(szSrcPath);
     1579          _ILSimpleGetText(apidl[i], szSrcPath+strlen(szSrcPath), MAX_PATH);
     1580
     1581          strcpy(szDstPath, This->sMyPath);
     1582          PathAddBackslashA(szDstPath);
     1583          _ILSimpleGetText(apidl[i], szDstPath+strlen(szDstPath), MAX_PATH);
     1584          MESSAGE("would copy %s to %s\n", szSrcPath, szDstPath);
     1585        }
     1586        SHFree(pidl);
     1587      }
     1588      IPersistFolder2_Release(ppf2);
     1589    }
     1590    return S_OK;
     1591}
     1592
     1593static ICOM_VTABLE(ISFHelper) shvt =
     1594{
     1595    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1596    ISFHelper_fnQueryInterface,
     1597    ISFHelper_fnAddRef,
     1598    ISFHelper_fnRelease,
     1599    ISFHelper_fnGetUniqueName,
     1600    ISFHelper_fnAddFolder,
     1601    ISFHelper_fnDeleteItems,
     1602    ISFHelper_fnCopyItems,
    16021603};
    16031604
    16041605/***********************************************************************
    1605 *       [Desktopfolder] IShellFolder implementation
     1606*   [Desktopfolder] IShellFolder implementation
    16061607*/
    16071608static struct ICOM_VTABLE(IShellFolder2) sfdvt;
     
    16181619
    16191620/**************************************************************************
    1620 *       ISF_Desktop_Constructor
     1621*   ISF_Desktop_Constructor
    16211622*
    16221623*/
    16231624IShellFolder * ISF_Desktop_Constructor()
    16241625{
    1625         IGenericSFImpl *        sf;
    1626 
    1627         sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
    1628         sf->ref=1;
    1629         ICOM_VTBL(sf)=&unkvt;
    1630         sf->lpvtblShellFolder=&sfdvt;
    1631         sf->absPidl=_ILCreateDesktop(); /* my qualified pidl */
    1632         sf->pUnkOuter = (IUnknown *) &sf->lpVtbl;
    1633 
    1634         TRACE("(%p)\n",sf);
    1635 
    1636         shell32_ObjCount++;
    1637         return _IShellFolder_(sf);
    1638 }
    1639 
    1640 /**************************************************************************
    1641  *      ISF_Desktop_fnQueryInterface
     1626    IGenericSFImpl *    sf;
     1627
     1628    sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
     1629    sf->ref=1;
     1630    ICOM_VTBL(sf)=&unkvt;
     1631    sf->lpvtblShellFolder=&sfdvt;
     1632    sf->absPidl=_ILCreateDesktop(); /* my qualified pidl */
     1633    sf->pUnkOuter = (IUnknown *) &sf->lpVtbl;
     1634
     1635    TRACE("(%p)\n",sf);
     1636
     1637    shell32_ObjCount++;
     1638    return _IShellFolder_(sf);
     1639}
     1640
     1641/**************************************************************************
     1642 *  ISF_Desktop_fnQueryInterface
    16421643 *
    16431644 * NOTES supports not IPersist/IPersistFolder
    16441645 */
    16451646static HRESULT WINAPI ISF_Desktop_fnQueryInterface(
    1646         IShellFolder2 * iface,
    1647         REFIID riid,
    1648         LPVOID *ppvObj)
    1649 {
    1650         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1651 
    1652         TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
    1653 
    1654         *ppvObj = NULL;
    1655 
    1656         if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
    1657         {
    1658           *ppvObj = _IUnknown_(This);
    1659         }
    1660         else if(IsEqualIID(riid, &IID_IShellFolder))  /*IShellFolder*/
    1661         {
    1662           *ppvObj = _IShellFolder_(This);
    1663         }   
    1664         else if(IsEqualIID(riid, &IID_IShellFolder2))  /*IShellFolder2*/
    1665         {
    1666           *ppvObj = _IShellFolder_(This);
    1667         }   
    1668 
    1669         if(*ppvObj)
    1670         {
    1671           IUnknown_AddRef((IUnknown*)(*ppvObj));
    1672           TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
    1673           return S_OK;
    1674         }
    1675         TRACE("-- Interface: E_NOINTERFACE\n");
    1676         return E_NOINTERFACE;
    1677 }
    1678 
    1679 /**************************************************************************
    1680 *       ISF_Desktop_fnParseDisplayName
     1647    IShellFolder2 * iface,
     1648    REFIID riid,
     1649    LPVOID *ppvObj)
     1650{
     1651    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1652
     1653    TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
     1654
     1655    *ppvObj = NULL;
     1656
     1657    if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
     1658    {
     1659      *ppvObj = _IUnknown_(This);
     1660    }
     1661    else if(IsEqualIID(riid, &IID_IShellFolder))  /*IShellFolder*/
     1662    {
     1663      *ppvObj = _IShellFolder_(This);
     1664    }
     1665    else if(IsEqualIID(riid, &IID_IShellFolder2))  /*IShellFolder2*/
     1666    {
     1667      *ppvObj = _IShellFolder_(This);
     1668    }
     1669
     1670    if(*ppvObj)
     1671    {
     1672      IUnknown_AddRef((IUnknown*)(*ppvObj));
     1673      TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
     1674      return S_OK;
     1675    }
     1676    TRACE("-- Interface: E_NOINTERFACE\n");
     1677    return E_NOINTERFACE;
     1678}
     1679
     1680/**************************************************************************
     1681*   ISF_Desktop_fnParseDisplayName
    16811682*
    16821683* NOTES
    1683 *       "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds
    1684 *       to MyComputer
     1684*   "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds
     1685*   to MyComputer
    16851686*/
    16861687static HRESULT WINAPI ISF_Desktop_fnParseDisplayName(
    1687         IShellFolder2 * iface,
    1688         HWND hwndOwner,
    1689         LPBC pbcReserved,
    1690         LPOLESTR lpszDisplayName,
    1691         DWORD *pchEaten,
    1692         LPITEMIDLIST *ppidl,
    1693         DWORD *pdwAttributes)
    1694 {
    1695         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1696 
    1697         LPCWSTR         szNext=NULL;
    1698         LPITEMIDLIST    pidlTemp=NULL;
    1699         HRESULT         hr=E_OUTOFMEMORY;
    1700        
    1701         TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
    1702         This,hwndOwner,pbcReserved,lpszDisplayName,
    1703         debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
    1704 
    1705         *ppidl = 0;
    1706         if (pchEaten) *pchEaten = 0;    /* strange but like the original */
    1707        
    1708         /* fixme no real parsing implemented */
    1709         pidlTemp = _ILCreateMyComputer();
    1710         szNext = lpszDisplayName;
    1711 
    1712         if (szNext && *szNext)
    1713         {
    1714           hr = SHELL32_ParseNextElement(hwndOwner, iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
    1715         }
    1716         else
    1717         {
    1718           hr = S_OK;
    1719 
    1720           if (pdwAttributes && *pdwAttributes)
    1721           {
    1722             SHELL32_GetItemAttributes(_IShellFolder_(This), pidlTemp, pdwAttributes);
    1723           }
    1724         }
    1725 
    1726         *ppidl = pidlTemp;
    1727 
    1728         TRACE("(%p)->(-- ret=0x%08lx)\n", This, hr);
    1729 
    1730         return hr;     
    1731 }
    1732 
    1733 /**************************************************************************
    1734 *               ISF_Desktop_fnEnumObjects
     1688    IShellFolder2 * iface,
     1689    HWND hwndOwner,
     1690    LPBC pbcReserved,
     1691    LPOLESTR lpszDisplayName,
     1692    DWORD *pchEaten,
     1693    LPITEMIDLIST *ppidl,
     1694    DWORD *pdwAttributes)
     1695{
     1696    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1697
     1698    LPCWSTR     szNext=NULL;
     1699    LPITEMIDLIST    pidlTemp=NULL;
     1700    HRESULT     hr=E_OUTOFMEMORY;
     1701
     1702    TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
     1703    This,hwndOwner,pbcReserved,lpszDisplayName,
     1704    debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
     1705
     1706    *ppidl = 0;
     1707    if (pchEaten) *pchEaten = 0;    /* strange but like the original */
     1708
     1709    /* fixme no real parsing implemented */
     1710    pidlTemp = _ILCreateMyComputer();
     1711    szNext = lpszDisplayName;
     1712
     1713    if (szNext && *szNext)
     1714    {
     1715      hr = SHELL32_ParseNextElement(hwndOwner, iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
     1716    }
     1717    else
     1718    {
     1719      hr = S_OK;
     1720
     1721      if (pdwAttributes && *pdwAttributes)
     1722      {
     1723        SHELL32_GetItemAttributes(_IShellFolder_(This), pidlTemp, pdwAttributes);
     1724      }
     1725    }
     1726
     1727    *ppidl = pidlTemp;
     1728
     1729    TRACE("(%p)->(-- ret=0x%08lx)\n", This, hr);
     1730
     1731    return hr;
     1732}
     1733
     1734/**************************************************************************
     1735*       ISF_Desktop_fnEnumObjects
    17351736*/
    17361737static HRESULT WINAPI ISF_Desktop_fnEnumObjects(
    1737         IShellFolder2 * iface,
    1738         HWND hwndOwner,
    1739         DWORD dwFlags,
    1740         LPENUMIDLIST* ppEnumIDList)
    1741 {
    1742         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1743 
    1744         TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
    1745 
    1746         *ppEnumIDList = NULL;
    1747         *ppEnumIDList = IEnumIDList_Constructor (NULL, dwFlags, EIDL_DESK);
    1748 
    1749         TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
    1750 
    1751         if(!*ppEnumIDList) return E_OUTOFMEMORY;
    1752 
    1753         return S_OK;           
    1754 }
    1755 
    1756 /**************************************************************************
    1757 *               ISF_Desktop_fnBindToObject
     1738    IShellFolder2 * iface,
     1739    HWND hwndOwner,
     1740    DWORD dwFlags,
     1741    LPENUMIDLIST* ppEnumIDList)
     1742{
     1743    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1744
     1745    TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
     1746
     1747    *ppEnumIDList = NULL;
     1748    *ppEnumIDList = IEnumIDList_Constructor (NULL, dwFlags, EIDL_DESK);
     1749
     1750    TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
     1751
     1752    if(!*ppEnumIDList) return E_OUTOFMEMORY;
     1753
     1754    return S_OK;
     1755}
     1756
     1757/**************************************************************************
     1758*       ISF_Desktop_fnBindToObject
    17581759*/
    17591760static HRESULT WINAPI ISF_Desktop_fnBindToObject( IShellFolder2 * iface, LPCITEMIDLIST pidl,
    1760                         LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
    1761 {
    1762         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1763         GUID            const * clsid;
    1764         IShellFolder    *pShellFolder, *pSubFolder;
    1765        
    1766         TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",
     1761            LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
     1762{
     1763    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1764    GUID        const * clsid;
     1765    IShellFolder    *pShellFolder, *pSubFolder;
     1766
     1767    TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",
    17671768              This,pidl,pbcReserved,debugstr_guid(riid),ppvOut);
    17681769
    1769         *ppvOut = NULL;
    1770 
    1771         if ((clsid=_ILGetGUIDPointer(pidl)))
    1772         {
    1773           if ( IsEqualIID(clsid, &CLSID_MyComputer))
    1774           {
    1775             pShellFolder = ISF_MyComputer_Constructor();
    1776           }
    1777           else
    1778           {
    1779              /* shell extension */
    1780              if (!SUCCEEDED(SHELL32_CoCreateInitSF (This->absPidl, pidl, clsid, riid, (LPVOID*)&pShellFolder)))
    1781              {
    1782                return E_INVALIDARG;
    1783              }
    1784           }
    1785         }
    1786         else
    1787         {
    1788           /* file system folder on the desktop */
    1789           LPITEMIDLIST deskpidl, firstpidl, completepidl;
    1790           IPersistFolder * ppf;
    1791 
    1792           /* combine pidls */
    1793           SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &deskpidl);
    1794           firstpidl = ILCloneFirst(pidl);
    1795           completepidl = ILCombine(deskpidl, firstpidl);
    1796 
    1797           pShellFolder = IShellFolder_Constructor(NULL, NULL);
    1798           if (SUCCEEDED(IShellFolder_QueryInterface(pShellFolder, &IID_IPersistFolder, (LPVOID*)&ppf)))
    1799           {
    1800             IPersistFolder_Initialize(ppf, completepidl);
    1801             IPersistFolder_Release(ppf);
    1802           }
    1803           ILFree(completepidl);
    1804           ILFree(deskpidl);
    1805           ILFree(firstpidl);
    1806         }
    1807        
    1808         if (_ILIsPidlSimple(pidl))      /* no sub folders */
    1809         {
    1810           *ppvOut = pShellFolder;
    1811         }
    1812         else                            /* go deeper */
    1813         {
    1814           IShellFolder_BindToObject(pShellFolder, ILGetNext(pidl), NULL, riid, (LPVOID)&pSubFolder);
    1815           IShellFolder_Release(pShellFolder);
    1816           *ppvOut = pSubFolder;
    1817         }
    1818 
    1819         TRACE("-- (%p) returning (%p)\n",This, *ppvOut);
    1820 
    1821         return S_OK;
    1822 }
    1823 
    1824 /**************************************************************************
    1825 *       ISF_Desktop_fnCreateViewObject
     1770    *ppvOut = NULL;
     1771
     1772    if ((clsid=_ILGetGUIDPointer(pidl)))
     1773    {
     1774      if ( IsEqualIID(clsid, &CLSID_MyComputer))
     1775      {
     1776        pShellFolder = ISF_MyComputer_Constructor();
     1777      }
     1778      else
     1779      {
     1780         /* shell extension */
     1781         if (!SUCCEEDED(SHELL32_CoCreateInitSF (This->absPidl, pidl, clsid, riid, (LPVOID*)&pShellFolder)))
     1782         {
     1783           return E_INVALIDARG;
     1784         }
     1785      }
     1786    }
     1787    else
     1788    {
     1789      /* file system folder on the desktop */
     1790      LPITEMIDLIST deskpidl, firstpidl, completepidl;
     1791      IPersistFolder * ppf;
     1792
     1793      /* combine pidls */
     1794      SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &deskpidl);
     1795      firstpidl = ILCloneFirst(pidl);
     1796      completepidl = ILCombine(deskpidl, firstpidl);
     1797
     1798      pShellFolder = IShellFolder_Constructor(NULL, NULL);
     1799      if (SUCCEEDED(IShellFolder_QueryInterface(pShellFolder, &IID_IPersistFolder, (LPVOID*)&ppf)))
     1800      {
     1801        IPersistFolder_Initialize(ppf, completepidl);
     1802        IPersistFolder_Release(ppf);
     1803      }
     1804      ILFree(completepidl);
     1805      ILFree(deskpidl);
     1806      ILFree(firstpidl);
     1807    }
     1808
     1809    if (_ILIsPidlSimple(pidl))  /* no sub folders */
     1810    {
     1811      *ppvOut = pShellFolder;
     1812    }
     1813    else                /* go deeper */
     1814    {
     1815      IShellFolder_BindToObject(pShellFolder, ILGetNext(pidl), NULL, riid, (LPVOID)&pSubFolder);
     1816      IShellFolder_Release(pShellFolder);
     1817      *ppvOut = pSubFolder;
     1818    }
     1819
     1820    TRACE("-- (%p) returning (%p)\n",This, *ppvOut);
     1821
     1822    return S_OK;
     1823}
     1824
     1825/**************************************************************************
     1826*   ISF_Desktop_fnCreateViewObject
    18261827*/
    18271828static HRESULT WINAPI ISF_Desktop_fnCreateViewObject( IShellFolder2 * iface,
    1828                 HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
    1829 {
    1830         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1831 
    1832         LPSHELLVIEW     pShellView;
    1833         HRESULT         hr = E_INVALIDARG;
    1834 
    1835         TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,debugstr_guid(riid),ppvOut);
    1836        
    1837         if(ppvOut)
    1838         {
    1839           *ppvOut = NULL;
    1840 
    1841           if(IsEqualIID(riid, &IID_IDropTarget))
    1842           {
    1843             WARN("IDropTarget not implemented\n");
    1844             hr = E_NOTIMPL;
    1845           }
    1846           else if(IsEqualIID(riid, &IID_IContextMenu))
    1847           {
    1848             WARN("IContextMenu not implemented\n");
    1849             hr = E_NOTIMPL;
    1850           }
    1851           else if(IsEqualIID(riid, &IID_IShellView))
    1852           {
    1853             pShellView = IShellView_Constructor((IShellFolder*)iface);
    1854             if(pShellView)
    1855             {
    1856               hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
    1857               IShellView_Release(pShellView);
    1858             }
    1859           }
    1860         }
    1861         TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
    1862         return hr;
     1829        HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
     1830{
     1831    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1832
     1833    LPSHELLVIEW pShellView;
     1834    HRESULT     hr = E_INVALIDARG;
     1835
     1836    TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,debugstr_guid(riid),ppvOut);
     1837
     1838    if(ppvOut)
     1839    {
     1840      *ppvOut = NULL;
     1841
     1842      if(IsEqualIID(riid, &IID_IDropTarget))
     1843      {
     1844        WARN("IDropTarget not implemented\n");
     1845        hr = E_NOTIMPL;
     1846      }
     1847      else if(IsEqualIID(riid, &IID_IContextMenu))
     1848      {
     1849        WARN("IContextMenu not implemented\n");
     1850        hr = E_NOTIMPL;
     1851      }
     1852      else if(IsEqualIID(riid, &IID_IShellView))
     1853      {
     1854        pShellView = IShellView_Constructor((IShellFolder*)iface);
     1855        if(pShellView)
     1856        {
     1857          hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
     1858          IShellView_Release(pShellView);
     1859        }
     1860      }
     1861    }
     1862    TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
     1863    return hr;
    18631864}
    18641865
     
    18671868*/
    18681869static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf(
    1869         IShellFolder2 * iface,
    1870         UINT cidl,
    1871         LPCITEMIDLIST *apidl,
    1872         DWORD *rgfInOut)
    1873 {
    1874         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1875 
    1876         HRESULT         hr = S_OK;
    1877 
    1878         TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl, *rgfInOut);
    1879 
    1880         if ( (!cidl) || (!apidl) || (!rgfInOut))
    1881           return E_INVALIDARG;
    1882 
    1883         while (cidl > 0 && *apidl)
    1884         {
    1885           pdump (*apidl);
    1886           SHELL32_GetItemAttributes(_IShellFolder_(This), *apidl, rgfInOut);
    1887           apidl++;
    1888           cidl--;
    1889         }
    1890 
    1891         TRACE("-- result=0x%08lx\n",*rgfInOut);
    1892 
    1893         return hr;
    1894 }
    1895 
    1896 /**************************************************************************
    1897 *       ISF_Desktop_fnGetDisplayNameOf
     1870    IShellFolder2 * iface,
     1871    UINT cidl,
     1872    LPCITEMIDLIST *apidl,
     1873    DWORD *rgfInOut)
     1874{
     1875    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1876
     1877    HRESULT     hr = S_OK;
     1878
     1879    TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl, *rgfInOut);
     1880
     1881    if ( (!cidl) || (!apidl) || (!rgfInOut))
     1882      return E_INVALIDARG;
     1883
     1884    while (cidl > 0 && *apidl)
     1885    {
     1886      pdump (*apidl);
     1887      SHELL32_GetItemAttributes(_IShellFolder_(This), *apidl, rgfInOut);
     1888      apidl++;
     1889      cidl--;
     1890    }
     1891
     1892    TRACE("-- result=0x%08lx\n",*rgfInOut);
     1893
     1894    return hr;
     1895}
     1896
     1897/**************************************************************************
     1898*   ISF_Desktop_fnGetDisplayNameOf
    18981899*
    18991900* NOTES
    1900 *       special case: pidl = null gives desktop-name back
     1901*   special case: pidl = null gives desktop-name back
    19011902*/
    19021903static HRESULT WINAPI ISF_Desktop_fnGetDisplayNameOf(
    1903         IShellFolder2 * iface,
    1904         LPCITEMIDLIST pidl,
    1905         DWORD dwFlags,
    1906         LPSTRRET strRet)
    1907 {
    1908         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1909 
    1910         CHAR            szPath[MAX_PATH]= "";
    1911                
    1912         TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,strRet);
    1913         pdump(pidl);
    1914        
    1915         if(!strRet) return E_INVALIDARG;
    1916        
    1917         if(!pidl)
    1918         {
    1919           HCR_GetClassName(&CLSID_ShellDesktop, szPath, MAX_PATH);
    1920         }
    1921         else if ( _ILIsPidlSimple(pidl) )
    1922         {
    1923           _ILSimpleGetText(pidl, szPath, MAX_PATH);
    1924         }
    1925         else
    1926         {
    1927           if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags, szPath, MAX_PATH)))
    1928             return E_OUTOFMEMORY;
    1929         }
    1930         strRet->uType = STRRET_CSTRA;
    1931         lstrcpynA(strRet->u.cStr, szPath, MAX_PATH);
    1932 
    1933 
    1934         TRACE("-- (%p)->(%s)\n", This, szPath);
    1935         return S_OK;
     1904    IShellFolder2 * iface,
     1905    LPCITEMIDLIST pidl,
     1906    DWORD dwFlags,
     1907    LPSTRRET strRet)
     1908{
     1909    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1910
     1911    CHAR        szPath[MAX_PATH]= "";
     1912
     1913    TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,strRet);
     1914    pdump(pidl);
     1915
     1916    if(!strRet) return E_INVALIDARG;
     1917
     1918    if(!pidl)
     1919    {
     1920      HCR_GetClassName(&CLSID_ShellDesktop, szPath, MAX_PATH);
     1921    }
     1922    else if ( _ILIsPidlSimple(pidl) )
     1923    {
     1924      _ILSimpleGetText(pidl, szPath, MAX_PATH);
     1925    }
     1926    else
     1927    {
     1928      if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags, szPath, MAX_PATH)))
     1929        return E_OUTOFMEMORY;
     1930    }
     1931    strRet->uType = STRRET_CSTRA;
     1932    lstrcpynA(strRet->u.cStr, szPath, MAX_PATH);
     1933
     1934
     1935    TRACE("-- (%p)->(%s)\n", This, szPath);
     1936    return S_OK;
    19361937}
    19371938
    19381939static HRESULT WINAPI ISF_Desktop_fnGetDefaultSearchGUID(
    1939         IShellFolder2 * iface,
    1940         GUID *pguid)
    1941 {
    1942         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1943         FIXME("(%p)\n",This);
    1944         return E_NOTIMPL;
    1945 }       
     1940    IShellFolder2 * iface,
     1941    GUID *pguid)
     1942{
     1943    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1944    FIXME("(%p)\n",This);
     1945    return E_NOTIMPL;
     1946}
    19461947static HRESULT WINAPI ISF_Desktop_fnEnumSearches(
    1947         IShellFolder2 * iface,
    1948         IEnumExtraSearch **ppenum)
    1949 {
    1950         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1951         FIXME("(%p)\n",This);
    1952         return E_NOTIMPL;
    1953 }       
     1948    IShellFolder2 * iface,
     1949    IEnumExtraSearch **ppenum)
     1950{
     1951    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1952    FIXME("(%p)\n",This);
     1953    return E_NOTIMPL;
     1954}
    19541955static HRESULT WINAPI ISF_Desktop_fnGetDefaultColumn(
    1955         IShellFolder2 * iface,
    1956         DWORD dwRes,
    1957         ULONG *pSort,
    1958         ULONG *pDisplay)
    1959 {
    1960         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1961 
    1962         TRACE("(%p)\n",This);
    1963 
    1964         if (pSort) *pSort = 0;
    1965         if (pDisplay) *pDisplay = 0;
    1966 
    1967         return S_OK;
    1968 }       
     1956    IShellFolder2 * iface,
     1957    DWORD dwRes,
     1958    ULONG *pSort,
     1959    ULONG *pDisplay)
     1960{
     1961    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1962
     1963    TRACE("(%p)\n",This);
     1964
     1965    if (pSort) *pSort = 0;
     1966    if (pDisplay) *pDisplay = 0;
     1967
     1968    return S_OK;
     1969}
    19691970static HRESULT WINAPI ISF_Desktop_fnGetDefaultColumnState(
    1970         IShellFolder2 * iface,
    1971         UINT iColumn,
    1972         DWORD *pcsFlags)
    1973 {
    1974         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1975        
    1976         TRACE("(%p)\n",This);
    1977 
    1978         if (!pcsFlags || iColumn >= DESKTOPSHELLVIEWCOLUMNS ) return E_INVALIDARG;
    1979 
    1980         *pcsFlags = DesktopSFHeader[iColumn].pcsFlags;
    1981 
    1982         return S_OK;
    1983 }       
     1971    IShellFolder2 * iface,
     1972    UINT iColumn,
     1973    DWORD *pcsFlags)
     1974{
     1975    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1976
     1977    TRACE("(%p)\n",This);
     1978
     1979    if (!pcsFlags || iColumn >= DESKTOPSHELLVIEWCOLUMNS ) return E_INVALIDARG;
     1980
     1981    *pcsFlags = DesktopSFHeader[iColumn].pcsFlags;
     1982
     1983    return S_OK;
     1984}
    19841985static HRESULT WINAPI ISF_Desktop_fnGetDetailsEx(
    1985         IShellFolder2 * iface,
    1986         LPCITEMIDLIST pidl,
    1987         const SHCOLUMNID *pscid,
    1988         VARIANT *pv)
    1989 {
    1990         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1991         FIXME("(%p)\n",This);
    1992 
    1993         return E_NOTIMPL;
    1994 }       
     1986    IShellFolder2 * iface,
     1987    LPCITEMIDLIST pidl,
     1988    const SHCOLUMNID *pscid,
     1989    VARIANT *pv)
     1990{
     1991    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1992    FIXME("(%p)\n",This);
     1993
     1994    return E_NOTIMPL;
     1995}
    19951996static HRESULT WINAPI ISF_Desktop_fnGetDetailsOf(
    1996         IShellFolder2 * iface,
    1997         LPCITEMIDLIST pidl,
    1998         UINT iColumn,
    1999         SHELLDETAILS *psd)
    2000 {
    2001         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2002         HRESULT hr = E_FAIL;;
    2003 
    2004         TRACE("(%p)->(%p %i %p)\n",This, pidl, iColumn, psd);
    2005 
    2006         if (!psd || iColumn >= DESKTOPSHELLVIEWCOLUMNS ) return E_INVALIDARG;
    2007        
    2008         if (!pidl)
    2009         {
    2010           psd->fmt = DesktopSFHeader[iColumn].fmt;
    2011           psd->cxChar = DesktopSFHeader[iColumn].cxChar;
    2012           psd->str.uType = STRRET_CSTRA;
    2013           LoadStringA(shell32_hInstance, DesktopSFHeader[iColumn].colnameid, psd->str.u.cStr, MAX_PATH);
    2014           return S_OK;
    2015         }
    2016         else
    2017         {
    2018           /* the data from the pidl */
    2019           switch(iColumn)
    2020           {
    2021             case 0:     /* name */
    2022               hr = IShellFolder_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
    2023               break;
    2024             case 1:     /* size */
    2025               _ILGetFileSize (pidl, psd->str.u.cStr, MAX_PATH);
    2026               break;
    2027             case 2:     /* type */
    2028               _ILGetFileType(pidl, psd->str.u.cStr, MAX_PATH);
    2029               break;
    2030             case 3:     /* date */
    2031               _ILGetFileDate(pidl, psd->str.u.cStr, MAX_PATH);
    2032               break;
    2033             case 4:     /* attributes */
    2034               _ILGetFileAttributes(pidl, psd->str.u.cStr, MAX_PATH);
    2035               break;
    2036           }
    2037           hr = S_OK;
    2038           psd->str.uType = STRRET_CSTRA;
    2039         }
    2040 
    2041         return hr;
    2042 }       
     1997    IShellFolder2 * iface,
     1998    LPCITEMIDLIST pidl,
     1999    UINT iColumn,
     2000    SHELLDETAILS *psd)
     2001{
     2002    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2003    HRESULT hr = E_FAIL;;
     2004
     2005    TRACE("(%p)->(%p %i %p)\n",This, pidl, iColumn, psd);
     2006
     2007    if (!psd || iColumn >= DESKTOPSHELLVIEWCOLUMNS ) return E_INVALIDARG;
     2008
     2009    if (!pidl)
     2010    {
     2011      psd->fmt = DesktopSFHeader[iColumn].fmt;
     2012      psd->cxChar = DesktopSFHeader[iColumn].cxChar;
     2013      psd->str.uType = STRRET_CSTRA;
     2014      LoadStringA(shell32_hInstance, DesktopSFHeader[iColumn].colnameid, psd->str.u.cStr, MAX_PATH);
     2015      return S_OK;
     2016    }
     2017    else
     2018    {
     2019      /* the data from the pidl */
     2020      switch(iColumn)
     2021      {
     2022        case 0: /* name */
     2023          hr = IShellFolder_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
     2024          break;
     2025        case 1: /* size */
     2026          _ILGetFileSize (pidl, psd->str.u.cStr, MAX_PATH);
     2027          break;
     2028        case 2: /* type */
     2029          _ILGetFileType(pidl, psd->str.u.cStr, MAX_PATH);
     2030          break;
     2031        case 3: /* date */
     2032          _ILGetFileDate(pidl, psd->str.u.cStr, MAX_PATH);
     2033          break;
     2034        case 4: /* attributes */
     2035          _ILGetFileAttributes(pidl, psd->str.u.cStr, MAX_PATH);
     2036          break;
     2037      }
     2038      hr = S_OK;
     2039      psd->str.uType = STRRET_CSTRA;
     2040    }
     2041
     2042    return hr;
     2043}
    20432044static HRESULT WINAPI ISF_Desktop_fnMapNameToSCID(
    2044         IShellFolder2 * iface,
    2045         LPCWSTR pwszName,
    2046         SHCOLUMNID *pscid)
    2047 {
    2048         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2049         FIXME("(%p)\n",This);
    2050         return E_NOTIMPL;
    2051 }       
    2052 
    2053 static ICOM_VTABLE(IShellFolder2) sfdvt = 
    2054 {       
    2055         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    2056         ISF_Desktop_fnQueryInterface,
    2057         IShellFolder_fnAddRef,
    2058         IShellFolder_fnRelease,
    2059         ISF_Desktop_fnParseDisplayName,
    2060         ISF_Desktop_fnEnumObjects,
    2061         ISF_Desktop_fnBindToObject,
    2062         IShellFolder_fnBindToStorage,
    2063         IShellFolder_fnCompareIDs,
    2064         ISF_Desktop_fnCreateViewObject,
    2065         ISF_Desktop_fnGetAttributesOf,
    2066         IShellFolder_fnGetUIObjectOf,
    2067         ISF_Desktop_fnGetDisplayNameOf,
    2068         IShellFolder_fnSetNameOf,
    2069 
    2070         /* ShellFolder2 */
    2071         ISF_Desktop_fnGetDefaultSearchGUID,
    2072         ISF_Desktop_fnEnumSearches,
    2073         ISF_Desktop_fnGetDefaultColumn,
    2074         ISF_Desktop_fnGetDefaultColumnState,
    2075         ISF_Desktop_fnGetDetailsEx,
    2076         ISF_Desktop_fnGetDetailsOf,
    2077         ISF_Desktop_fnMapNameToSCID
     2045    IShellFolder2 * iface,
     2046    LPCWSTR pwszName,
     2047    SHCOLUMNID *pscid)
     2048{
     2049    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2050    FIXME("(%p)\n",This);
     2051    return E_NOTIMPL;
     2052}
     2053
     2054static ICOM_VTABLE(IShellFolder2) sfdvt =
     2055{
     2056    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     2057    ISF_Desktop_fnQueryInterface,
     2058    IShellFolder_fnAddRef,
     2059    IShellFolder_fnRelease,
     2060    ISF_Desktop_fnParseDisplayName,
     2061    ISF_Desktop_fnEnumObjects,
     2062    ISF_Desktop_fnBindToObject,
     2063    IShellFolder_fnBindToStorage,
     2064    IShellFolder_fnCompareIDs,
     2065    ISF_Desktop_fnCreateViewObject,
     2066    ISF_Desktop_fnGetAttributesOf,
     2067    IShellFolder_fnGetUIObjectOf,
     2068    ISF_Desktop_fnGetDisplayNameOf,
     2069    IShellFolder_fnSetNameOf,
     2070
     2071    /* ShellFolder2 */
     2072    ISF_Desktop_fnGetDefaultSearchGUID,
     2073    ISF_Desktop_fnEnumSearches,
     2074    ISF_Desktop_fnGetDefaultColumn,
     2075    ISF_Desktop_fnGetDefaultColumnState,
     2076    ISF_Desktop_fnGetDetailsEx,
     2077    ISF_Desktop_fnGetDetailsOf,
     2078    ISF_Desktop_fnMapNameToSCID
    20782079};
    20792080
     
    20952096
    20962097/**************************************************************************
    2097 *       ISF_MyComputer_Constructor
     2098*   ISF_MyComputer_Constructor
    20982099*/
    20992100static IShellFolder * ISF_MyComputer_Constructor(void)
    21002101{
    2101         IGenericSFImpl *        sf;
    2102 
    2103         sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
    2104         sf->ref=1;
    2105 
    2106         ICOM_VTBL(sf)=&unkvt;
    2107         sf->lpvtblShellFolder=&sfmcvt;
    2108         sf->lpvtblPersistFolder2 = &psfvt;
    2109         sf->pclsid = (CLSID*)&CLSID_SFMyComp;
    2110         sf->absPidl=_ILCreateMyComputer();      /* my qualified pidl */
    2111         sf->pUnkOuter = (IUnknown *) &sf->lpVtbl;
    2112 
    2113         TRACE("(%p)\n",sf);
    2114 
    2115         shell32_ObjCount++;
    2116         return _IShellFolder_(sf);
    2117 }
    2118 
    2119 /**************************************************************************
    2120 *       ISF_MyComputer_fnParseDisplayName
     2102    IGenericSFImpl *    sf;
     2103
     2104    sf=(IGenericSFImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IGenericSFImpl));
     2105    sf->ref=1;
     2106
     2107    ICOM_VTBL(sf)=&unkvt;
     2108    sf->lpvtblShellFolder=&sfmcvt;
     2109    sf->lpvtblPersistFolder2 = &psfvt;
     2110    sf->pclsid = (CLSID*)&CLSID_SFMyComp;
     2111    sf->absPidl=_ILCreateMyComputer();  /* my qualified pidl */
     2112    sf->pUnkOuter = (IUnknown *) &sf->lpVtbl;
     2113
     2114    TRACE("(%p)\n",sf);
     2115
     2116    shell32_ObjCount++;
     2117    return _IShellFolder_(sf);
     2118}
     2119
     2120/**************************************************************************
     2121*   ISF_MyComputer_fnParseDisplayName
    21212122*/
    21222123static HRESULT WINAPI ISF_MyComputer_fnParseDisplayName(
    2123         IShellFolder2 * iface,
    2124         HWND hwndOwner,
    2125         LPBC pbcReserved,
    2126         LPOLESTR lpszDisplayName,
    2127         DWORD *pchEaten,
    2128         LPITEMIDLIST *ppidl,
    2129         DWORD *pdwAttributes)
    2130 {
    2131         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2132 
    2133         HRESULT         hr = E_OUTOFMEMORY;
    2134         LPCWSTR         szNext=NULL;
    2135         WCHAR           szElement[MAX_PATH];
    2136         CHAR            szTempA[MAX_PATH];
    2137         LPITEMIDLIST    pidlTemp;
    2138        
    2139         TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
    2140         This,hwndOwner,pbcReserved,lpszDisplayName,
    2141         debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
    2142 
    2143         *ppidl = 0;
    2144         if (pchEaten) *pchEaten = 0;    /* strange but like the original */
    2145 
    2146         /* do we have an absolute path name ? */
    2147         if (PathGetDriveNumberW(lpszDisplayName) >= 0 &&
    2148             lpszDisplayName[2] == (WCHAR)'\\')
    2149         {
    2150           szNext = GetNextElementW(lpszDisplayName, szElement, MAX_PATH);
     2124    IShellFolder2 * iface,
     2125    HWND hwndOwner,
     2126    LPBC pbcReserved,
     2127    LPOLESTR lpszDisplayName,
     2128    DWORD *pchEaten,
     2129    LPITEMIDLIST *ppidl,
     2130    DWORD *pdwAttributes)
     2131{
     2132    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2133
     2134    HRESULT     hr = E_OUTOFMEMORY;
     2135    LPCWSTR     szNext=NULL;
     2136    WCHAR       szElement[MAX_PATH];
     2137    CHAR        szTempA[MAX_PATH];
     2138    LPITEMIDLIST    pidlTemp;
     2139
     2140    TRACE("(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n",
     2141    This,hwndOwner,pbcReserved,lpszDisplayName,
     2142    debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes);
     2143
     2144    *ppidl = 0;
     2145    if (pchEaten) *pchEaten = 0;    /* strange but like the original */
     2146
     2147    /* do we have an absolute path name ? */
     2148    if (PathGetDriveNumberW(lpszDisplayName) >= 0 &&
     2149        lpszDisplayName[2] == (WCHAR)'\\')
     2150    {
     2151      szNext = GetNextElementW(lpszDisplayName, szElement, MAX_PATH);
    21512152          WideCharToMultiByte( CP_ACP, 0, szElement, -1, szTempA, MAX_PATH, NULL, NULL );
    2152           pidlTemp = _ILCreateDrive(szTempA);
    2153 
    2154           if (szNext && *szNext)
    2155           {
    2156             hr = SHELL32_ParseNextElement(hwndOwner, iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
    2157           }
    2158           else
    2159           {
    2160             if (pdwAttributes && *pdwAttributes)
    2161             {
    2162               SHELL32_GetItemAttributes(_IShellFolder_(This), pidlTemp, pdwAttributes);
    2163             }
    2164             hr = S_OK;
    2165           }
    2166           *ppidl = pidlTemp;
    2167         }
    2168 
    2169         TRACE("(%p)->(-- ret=0x%08lx)\n", This, hr);
    2170 
    2171         return hr;     
    2172 }
    2173 
    2174 /**************************************************************************
    2175 *               ISF_MyComputer_fnEnumObjects
     2153      pidlTemp = _ILCreateDrive(szTempA);
     2154
     2155      if (szNext && *szNext)
     2156      {
     2157        hr = SHELL32_ParseNextElement(hwndOwner, iface, &pidlTemp, (LPOLESTR)szNext, pchEaten, pdwAttributes);
     2158      }
     2159      else
     2160      {
     2161        if (pdwAttributes && *pdwAttributes)
     2162        {
     2163          SHELL32_GetItemAttributes(_IShellFolder_(This), pidlTemp, pdwAttributes);
     2164        }
     2165        hr = S_OK;
     2166      }
     2167      *ppidl = pidlTemp;
     2168    }
     2169
     2170    TRACE("(%p)->(-- ret=0x%08lx)\n", This, hr);
     2171
     2172    return hr;
     2173}
     2174
     2175/**************************************************************************
     2176*       ISF_MyComputer_fnEnumObjects
    21762177*/
    21772178static HRESULT WINAPI ISF_MyComputer_fnEnumObjects(
    2178         IShellFolder2 * iface,
    2179         HWND hwndOwner,
    2180         DWORD dwFlags,
    2181         LPENUMIDLIST* ppEnumIDList)
    2182 {
    2183         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2184 
    2185         TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
    2186 
    2187         *ppEnumIDList = NULL;
    2188         *ppEnumIDList = IEnumIDList_Constructor (NULL, dwFlags, EIDL_MYCOMP);
    2189 
    2190         TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
    2191 
    2192         if(!*ppEnumIDList) return E_OUTOFMEMORY;
    2193 
    2194         return S_OK;           
    2195 }
    2196 
    2197 /**************************************************************************
    2198 *               ISF_MyComputer_fnBindToObject
     2179    IShellFolder2 * iface,
     2180    HWND hwndOwner,
     2181    DWORD dwFlags,
     2182    LPENUMIDLIST* ppEnumIDList)
     2183{
     2184    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2185
     2186    TRACE("(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",This,hwndOwner,dwFlags,ppEnumIDList);
     2187
     2188    *ppEnumIDList = NULL;
     2189    *ppEnumIDList = IEnumIDList_Constructor (NULL, dwFlags, EIDL_MYCOMP);
     2190
     2191    TRACE("-- (%p)->(new ID List: %p)\n",This,*ppEnumIDList);
     2192
     2193    if(!*ppEnumIDList) return E_OUTOFMEMORY;
     2194
     2195    return S_OK;
     2196}
     2197
     2198/**************************************************************************
     2199*       ISF_MyComputer_fnBindToObject
    21992200*/
    22002201static HRESULT WINAPI ISF_MyComputer_fnBindToObject( IShellFolder2 * iface, LPCITEMIDLIST pidl,
    2201                         LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
    2202 {
    2203         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2204         GUID            const * clsid;
    2205         IShellFolder    *pShellFolder, *pSubFolder;
    2206         LPITEMIDLIST    pidltemp;
    2207        
    2208         TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",
     2202            LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
     2203{
     2204    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2205    GUID        const * clsid;
     2206    IShellFolder    *pShellFolder, *pSubFolder;
     2207    LPITEMIDLIST    pidltemp;
     2208
     2209    TRACE("(%p)->(pidl=%p,%p,\n\tIID:\t%s,%p)\n",
    22092210              This,pidl,pbcReserved,debugstr_guid(riid),ppvOut);
    22102211
    2211         if(!pidl || !ppvOut) return E_INVALIDARG;
    2212 
    2213         *ppvOut = NULL;
    2214 
    2215         if ((clsid=_ILGetGUIDPointer(pidl)) && !IsEqualIID(clsid, &CLSID_MyComputer))
    2216         {
    2217            if (!SUCCEEDED(SHELL32_CoCreateInitSF (This->absPidl, pidl, clsid, riid, (LPVOID*)&pShellFolder)))
    2218            {
    2219              return E_FAIL;
    2220            }
    2221         }
    2222         else
    2223         {
    2224           if (!_ILIsDrive(pidl)) return E_INVALIDARG;
    2225 
    2226           pidltemp = ILCloneFirst(pidl);
    2227           pShellFolder = IShellFolder_Constructor(iface, pidltemp);
    2228           ILFree(pidltemp);
    2229         }
    2230 
    2231         if (_ILIsPidlSimple(pidl))      /* no sub folders */
    2232         {
    2233           *ppvOut = pShellFolder;
    2234         }
    2235         else                            /* go deeper */
    2236         {
    2237           IShellFolder_BindToObject(pShellFolder, ILGetNext(pidl), NULL, &IID_IShellFolder, (LPVOID)&pSubFolder);
    2238           IShellFolder_Release(pShellFolder);
    2239           *ppvOut = pSubFolder;
    2240         }
    2241 
    2242         TRACE("-- (%p) returning (%p)\n",This, *ppvOut);
    2243 
    2244         return S_OK;
    2245 }
    2246 
    2247 /**************************************************************************
    2248 *       ISF_MyComputer_fnCreateViewObject
     2212    if(!pidl || !ppvOut) return E_INVALIDARG;
     2213
     2214    *ppvOut = NULL;
     2215
     2216    if ((clsid=_ILGetGUIDPointer(pidl)) && !IsEqualIID(clsid, &CLSID_MyComputer))
     2217    {
     2218       if (!SUCCEEDED(SHELL32_CoCreateInitSF (This->absPidl, pidl, clsid, riid, (LPVOID*)&pShellFolder)))
     2219       {
     2220         return E_FAIL;
     2221       }
     2222    }
     2223    else
     2224    {
     2225      if (!_ILIsDrive(pidl)) return E_INVALIDARG;
     2226
     2227      pidltemp = ILCloneFirst(pidl);
     2228      pShellFolder = IShellFolder_Constructor(iface, pidltemp);
     2229      ILFree(pidltemp);
     2230    }
     2231
     2232    if (_ILIsPidlSimple(pidl))  /* no sub folders */
     2233    {
     2234      *ppvOut = pShellFolder;
     2235    }
     2236    else                /* go deeper */
     2237    {
     2238      IShellFolder_BindToObject(pShellFolder, ILGetNext(pidl), NULL, &IID_IShellFolder, (LPVOID)&pSubFolder);
     2239      IShellFolder_Release(pShellFolder);
     2240      *ppvOut = pSubFolder;
     2241    }
     2242
     2243    TRACE("-- (%p) returning (%p)\n",This, *ppvOut);
     2244
     2245    return S_OK;
     2246}
     2247
     2248/**************************************************************************
     2249*   ISF_MyComputer_fnCreateViewObject
    22492250*/
    22502251static HRESULT WINAPI ISF_MyComputer_fnCreateViewObject( IShellFolder2 * iface,
    2251                 HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
    2252 {
    2253         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2254 
    2255         LPSHELLVIEW     pShellView;
    2256         HRESULT         hr = E_INVALIDARG;
    2257 
    2258         TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,debugstr_guid(riid),ppvOut);
    2259        
    2260         if(ppvOut)
    2261         {
    2262           *ppvOut = NULL;
    2263 
    2264           if(IsEqualIID(riid, &IID_IDropTarget))
    2265           {
    2266             WARN("IDropTarget not implemented\n");
    2267             hr = E_NOTIMPL;
    2268           }
    2269           else if(IsEqualIID(riid, &IID_IContextMenu))
    2270           {
    2271             WARN("IContextMenu not implemented\n");
    2272             hr = E_NOTIMPL;
    2273           }
    2274           else if(IsEqualIID(riid, &IID_IShellView))
    2275           {
    2276             pShellView = IShellView_Constructor((IShellFolder*)iface);
    2277             if(pShellView)
    2278             {
    2279               hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
    2280               IShellView_Release(pShellView);
    2281             }
    2282           }
    2283         }
    2284         TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
    2285         return hr;
     2252        HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
     2253{
     2254    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2255
     2256    LPSHELLVIEW pShellView;
     2257    HRESULT     hr = E_INVALIDARG;
     2258
     2259    TRACE("(%p)->(hwnd=0x%x,\n\tIID:\t%s,%p)\n",This,hwndOwner,debugstr_guid(riid),ppvOut);
     2260
     2261    if(ppvOut)
     2262    {
     2263      *ppvOut = NULL;
     2264
     2265      if(IsEqualIID(riid, &IID_IDropTarget))
     2266      {
     2267        WARN("IDropTarget not implemented\n");
     2268        hr = E_NOTIMPL;
     2269      }
     2270      else if(IsEqualIID(riid, &IID_IContextMenu))
     2271      {
     2272        WARN("IContextMenu not implemented\n");
     2273        hr = E_NOTIMPL;
     2274      }
     2275      else if(IsEqualIID(riid, &IID_IShellView))
     2276      {
     2277        pShellView = IShellView_Constructor((IShellFolder*)iface);
     2278        if(pShellView)
     2279        {
     2280          hr = IShellView_QueryInterface(pShellView, riid, ppvOut);
     2281          IShellView_Release(pShellView);
     2282        }
     2283      }
     2284    }
     2285    TRACE("-- (%p)->(interface=%p)\n",This, ppvOut);
     2286    return hr;
    22862287}
    22872288
     
    22902291*/
    22912292static HRESULT WINAPI ISF_MyComputer_fnGetAttributesOf(
    2292         IShellFolder2 * iface,
    2293         UINT cidl,
    2294         LPCITEMIDLIST *apidl,
    2295         DWORD *rgfInOut)
    2296 {
    2297         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2298 
    2299         HRESULT         hr = S_OK;
    2300 
    2301         TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl,*rgfInOut);
    2302 
    2303         if ( (!cidl) || (!apidl) || (!rgfInOut))
    2304           return E_INVALIDARG;
    2305 
    2306         while (cidl > 0 && *apidl)
    2307         {
    2308           pdump (*apidl);
    2309           SHELL32_GetItemAttributes(_IShellFolder_(This), *apidl, rgfInOut);
    2310           apidl++;
    2311           cidl--;
    2312         }
    2313 
    2314         TRACE("-- result=0x%08lx\n",*rgfInOut);
    2315         return hr;
    2316 }
    2317 
    2318 /**************************************************************************
    2319 *       ISF_MyComputer_fnGetDisplayNameOf
     2293    IShellFolder2 * iface,
     2294    UINT cidl,
     2295    LPCITEMIDLIST *apidl,
     2296    DWORD *rgfInOut)
     2297{
     2298    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2299
     2300    HRESULT     hr = S_OK;
     2301
     2302    TRACE("(%p)->(cidl=%d apidl=%p mask=0x%08lx)\n",This,cidl,apidl,*rgfInOut);
     2303
     2304    if ( (!cidl) || (!apidl) || (!rgfInOut))
     2305      return E_INVALIDARG;
     2306
     2307    while (cidl > 0 && *apidl)
     2308    {
     2309      pdump (*apidl);
     2310      SHELL32_GetItemAttributes(_IShellFolder_(This), *apidl, rgfInOut);
     2311      apidl++;
     2312      cidl--;
     2313    }
     2314
     2315    TRACE("-- result=0x%08lx\n",*rgfInOut);
     2316    return hr;
     2317}
     2318
     2319/**************************************************************************
     2320*   ISF_MyComputer_fnGetDisplayNameOf
    23202321*
    23212322* NOTES
    2322 *       The desktopfolder creates only complete paths (SHGDN_FORPARSING).
    2323 *       SHGDN_INFOLDER makes no sense.
     2323*   The desktopfolder creates only complete paths (SHGDN_FORPARSING).
     2324*   SHGDN_INFOLDER makes no sense.
    23242325*/
    23252326static HRESULT WINAPI ISF_MyComputer_fnGetDisplayNameOf(
    2326         IShellFolder2 * iface,
    2327         LPCITEMIDLIST pidl,
    2328         DWORD dwFlags,
    2329         LPSTRRET strRet)
    2330 {
    2331         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2332 
    2333         char            szPath[MAX_PATH], szDrive[18];
    2334         int             len = 0;
    2335         BOOL            bSimplePidl;
    2336                
    2337         TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,strRet);
    2338         pdump(pidl);
    2339        
    2340         if(!strRet) return E_INVALIDARG;
    2341        
    2342         szPath[0]=0x00; szDrive[0]=0x00;
    2343        
    2344        
    2345         bSimplePidl = _ILIsPidlSimple(pidl);
    2346        
    2347         if (_ILIsSpecialFolder(pidl))
    2348         {
    2349           /* take names of special folders only if its only this folder */
    2350           if ( bSimplePidl )
    2351           {
    2352             _ILSimpleGetText(pidl, szPath, MAX_PATH); /* append my own path */
    2353           }
    2354         }
    2355         else
    2356         {
    2357           if (!_ILIsDrive(pidl))
    2358           {
    2359             ERR("Wrong pidl type\n");
    2360             return E_INVALIDARG;
    2361           }
    2362 
    2363           _ILSimpleGetText(pidl, szPath, MAX_PATH);     /* append my own path */
    2364 
    2365           /* long view "lw_name (C:)" */
    2366           if ( bSimplePidl && !(dwFlags & SHGDN_FORPARSING))
    2367           {
    2368             DWORD dwVolumeSerialNumber,dwMaximumComponetLength,dwFileSystemFlags;
     2327    IShellFolder2 * iface,
     2328    LPCITEMIDLIST pidl,
     2329    DWORD dwFlags,
     2330    LPSTRRET strRet)
     2331{
     2332    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2333
     2334    char        szPath[MAX_PATH], szDrive[18];
     2335    int     len = 0;
     2336    BOOL        bSimplePidl;
     2337
     2338    TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n",This,pidl,dwFlags,strRet);
     2339    pdump(pidl);
     2340
     2341    if(!strRet) return E_INVALIDARG;
     2342
     2343    szPath[0]=0x00; szDrive[0]=0x00;
     2344
     2345
     2346    bSimplePidl = _ILIsPidlSimple(pidl);
     2347
     2348    if (_ILIsSpecialFolder(pidl))
     2349    {
     2350      /* take names of special folders only if its only this folder */
     2351      if ( bSimplePidl )
     2352      {
     2353        _ILSimpleGetText(pidl, szPath, MAX_PATH); /* append my own path */
     2354      }
     2355    }
     2356    else
     2357    {
     2358      if (!_ILIsDrive(pidl))
     2359      {
     2360        ERR("Wrong pidl type\n");
     2361        return E_INVALIDARG;
     2362      }
     2363
     2364      _ILSimpleGetText(pidl, szPath, MAX_PATH); /* append my own path */
     2365
     2366      /* long view "lw_name (C:)" */
     2367      if ( bSimplePidl && !(dwFlags & SHGDN_FORPARSING))
     2368      {
     2369        DWORD dwVolumeSerialNumber,dwMaximumComponetLength,dwFileSystemFlags;
    23692370
    23702371#ifdef __WIN32OS2__
     
    23892390            }
    23902391#else
    2391             GetVolumeInformationA(szPath,szDrive,12,&dwVolumeSerialNumber,&dwMaximumComponetLength,&dwFileSystemFlags,NULL,0);
    2392             strcat (szDrive," (");
    2393             strncat (szDrive, szPath, 2);
    2394             strcat (szDrive,")");
    2395             strcpy (szPath, szDrive);
     2392        GetVolumeInformationA(szPath,szDrive,12,&dwVolumeSerialNumber,&dwMaximumComponetLength,&dwFileSystemFlags,NULL,0);
     2393        strcat (szDrive," (");
     2394        strncat (szDrive, szPath, 2);
     2395        strcat (szDrive,")");
     2396        strcpy (szPath, szDrive);
    23962397#endif
    2397           }
    2398         }
    2399        
    2400         if (!bSimplePidl)       /* go deeper if needed */
    2401         {
    2402           PathAddBackslashA(szPath);
    2403           len = strlen(szPath);
    2404 
    2405           if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags | SHGDN_FORPARSING, szPath + len, MAX_PATH - len)))
    2406             return E_OUTOFMEMORY;
    2407         }
    2408         strRet->uType = STRRET_CSTRA;
    2409         lstrcpynA(strRet->u.cStr, szPath, MAX_PATH);
    2410 
    2411 
    2412         TRACE("-- (%p)->(%s)\n", This, szPath);
    2413         return S_OK;
     2398      }
     2399    }
     2400
     2401    if (!bSimplePidl)   /* go deeper if needed */
     2402    {
     2403      PathAddBackslashA(szPath);
     2404      len = strlen(szPath);
     2405
     2406      if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags | SHGDN_FORPARSING, szPath + len, MAX_PATH - len)))
     2407        return E_OUTOFMEMORY;
     2408    }
     2409    strRet->uType = STRRET_CSTRA;
     2410    lstrcpynA(strRet->u.cStr, szPath, MAX_PATH);
     2411
     2412
     2413    TRACE("-- (%p)->(%s)\n", This, szPath);
     2414    return S_OK;
    24142415}
    24152416
    24162417static HRESULT WINAPI ISF_MyComputer_fnGetDefaultSearchGUID(
    2417         IShellFolder2 * iface,
    2418         GUID *pguid)
    2419 {
    2420         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2421         FIXME("(%p)\n",This);
    2422         return E_NOTIMPL;
    2423 }       
     2418    IShellFolder2 * iface,
     2419    GUID *pguid)
     2420{
     2421    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2422    FIXME("(%p)\n",This);
     2423    return E_NOTIMPL;
     2424}
    24242425static HRESULT WINAPI ISF_MyComputer_fnEnumSearches(
    2425         IShellFolder2 * iface,
    2426         IEnumExtraSearch **ppenum)
    2427 {
    2428         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2429         FIXME("(%p)\n",This);
    2430         return E_NOTIMPL;
    2431 }       
     2426    IShellFolder2 * iface,
     2427    IEnumExtraSearch **ppenum)
     2428{
     2429    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2430    FIXME("(%p)\n",This);
     2431    return E_NOTIMPL;
     2432}
    24322433static HRESULT WINAPI ISF_MyComputer_fnGetDefaultColumn(
    2433         IShellFolder2 * iface,
    2434         DWORD dwRes,
    2435         ULONG *pSort,
    2436         ULONG *pDisplay)
    2437 {
    2438         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2439 
    2440         TRACE("(%p)\n",This);
    2441 
    2442         if (pSort) *pSort = 0;
    2443         if (pDisplay) *pDisplay = 0;
    2444 
    2445         return S_OK;
    2446 }       
     2434    IShellFolder2 * iface,
     2435    DWORD dwRes,
     2436    ULONG *pSort,
     2437    ULONG *pDisplay)
     2438{
     2439    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2440
     2441    TRACE("(%p)\n",This);
     2442
     2443    if (pSort) *pSort = 0;
     2444    if (pDisplay) *pDisplay = 0;
     2445
     2446    return S_OK;
     2447}
    24472448static HRESULT WINAPI ISF_MyComputer_fnGetDefaultColumnState(
    2448         IShellFolder2 * iface,
    2449         UINT iColumn,
    2450         DWORD *pcsFlags)
    2451 {
    2452         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2453        
    2454         TRACE("(%p)\n",This);
    2455 
    2456         if (!pcsFlags || iColumn >= MYCOMPUTERSHELLVIEWCOLUMNS ) return E_INVALIDARG;
    2457 
    2458         *pcsFlags = MyComputerSFHeader[iColumn].pcsFlags;
    2459 
    2460         return S_OK;
    2461 }       
     2449    IShellFolder2 * iface,
     2450    UINT iColumn,
     2451    DWORD *pcsFlags)
     2452{
     2453    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2454
     2455    TRACE("(%p)\n",This);
     2456
     2457    if (!pcsFlags || iColumn >= MYCOMPUTERSHELLVIEWCOLUMNS ) return E_INVALIDARG;
     2458
     2459    *pcsFlags = MyComputerSFHeader[iColumn].pcsFlags;
     2460
     2461    return S_OK;
     2462}
    24622463static HRESULT WINAPI ISF_MyComputer_fnGetDetailsEx(
    2463         IShellFolder2 * iface,
    2464         LPCITEMIDLIST pidl,
    2465         const SHCOLUMNID *pscid,
    2466         VARIANT *pv)
    2467 {
    2468         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2469         FIXME("(%p)\n",This);
    2470 
    2471         return E_NOTIMPL;
    2472 }       
     2464    IShellFolder2 * iface,
     2465    LPCITEMIDLIST pidl,
     2466    const SHCOLUMNID *pscid,
     2467    VARIANT *pv)
     2468{
     2469    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2470    FIXME("(%p)\n",This);
     2471
     2472    return E_NOTIMPL;
     2473}
    24732474
    24742475/* fixme: drive size >4GB is rolling over */
    24752476static HRESULT WINAPI ISF_MyComputer_fnGetDetailsOf(
    2476         IShellFolder2 * iface,
    2477         LPCITEMIDLIST pidl,
    2478         UINT iColumn,
    2479         SHELLDETAILS *psd)
    2480 {
    2481         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2482         HRESULT hr;
    2483 
    2484         TRACE("(%p)->(%p %i %p)\n",This, pidl, iColumn, psd);
    2485 
    2486         if (!psd || iColumn >= MYCOMPUTERSHELLVIEWCOLUMNS ) return E_INVALIDARG;
    2487        
    2488         if (!pidl)
    2489         {
    2490           psd->fmt = MyComputerSFHeader[iColumn].fmt;
    2491           psd->cxChar = MyComputerSFHeader[iColumn].cxChar;
    2492           psd->str.uType = STRRET_CSTRA;
    2493           LoadStringA(shell32_hInstance, MyComputerSFHeader[iColumn].colnameid, psd->str.u.cStr, MAX_PATH);
    2494           return S_OK;
    2495         }
    2496         else
    2497         {
    2498           char szPath[MAX_PATH];
    2499           ULARGE_INTEGER ulBytes;
    2500 
    2501           psd->str.u.cStr[0] = 0x00;
    2502           psd->str.uType = STRRET_CSTRA;
    2503           switch(iColumn)
    2504           {
    2505             case 0:     /* name */
    2506               hr = IShellFolder_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
    2507               break;
    2508             case 1:     /* type */
    2509               _ILGetFileType(pidl, psd->str.u.cStr, MAX_PATH);
    2510               break;
    2511             case 2:     /* total size */
    2512               if (_ILIsDrive(pidl))
    2513               {
    2514                 _ILSimpleGetText(pidl, szPath, MAX_PATH);
    2515                 GetDiskFreeSpaceExA(szPath, NULL, &ulBytes, NULL);
    2516                 StrFormatByteSizeA(ulBytes.s.LowPart, psd->str.u.cStr, MAX_PATH);
    2517               }
    2518               break;
    2519             case 3:     /* free size */
    2520               if (_ILIsDrive(pidl))
    2521               {
    2522                 _ILSimpleGetText(pidl, szPath, MAX_PATH);
    2523                 GetDiskFreeSpaceExA(szPath, &ulBytes, NULL, NULL);
    2524                 StrFormatByteSizeA(ulBytes.s.LowPart, psd->str.u.cStr, MAX_PATH);
    2525               }
    2526               break;
    2527           }
    2528           hr = S_OK;
    2529         }
    2530 
    2531         return hr;
    2532 }       
     2477    IShellFolder2 * iface,
     2478    LPCITEMIDLIST pidl,
     2479    UINT iColumn,
     2480    SHELLDETAILS *psd)
     2481{
     2482    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2483    HRESULT hr;
     2484
     2485    TRACE("(%p)->(%p %i %p)\n",This, pidl, iColumn, psd);
     2486
     2487    if (!psd || iColumn >= MYCOMPUTERSHELLVIEWCOLUMNS ) return E_INVALIDARG;
     2488
     2489    if (!pidl)
     2490    {
     2491      psd->fmt = MyComputerSFHeader[iColumn].fmt;
     2492      psd->cxChar = MyComputerSFHeader[iColumn].cxChar;
     2493      psd->str.uType = STRRET_CSTRA;
     2494      LoadStringA(shell32_hInstance, MyComputerSFHeader[iColumn].colnameid, psd->str.u.cStr, MAX_PATH);
     2495      return S_OK;
     2496    }
     2497    else
     2498    {
     2499      char szPath[MAX_PATH];
     2500      ULARGE_INTEGER ulBytes;
     2501
     2502      psd->str.u.cStr[0] = 0x00;
     2503      psd->str.uType = STRRET_CSTRA;
     2504      switch(iColumn)
     2505      {
     2506        case 0: /* name */
     2507          hr = IShellFolder_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
     2508          break;
     2509        case 1: /* type */
     2510          _ILGetFileType(pidl, psd->str.u.cStr, MAX_PATH);
     2511          break;
     2512        case 2: /* total size */
     2513          if (_ILIsDrive(pidl))
     2514          {
     2515            _ILSimpleGetText(pidl, szPath, MAX_PATH);
     2516            GetDiskFreeSpaceExA(szPath, NULL, &ulBytes, NULL);
     2517            StrFormatByteSizeA(ulBytes.s.LowPart, psd->str.u.cStr, MAX_PATH);
     2518          }
     2519          break;
     2520        case 3: /* free size */
     2521          if (_ILIsDrive(pidl))
     2522          {
     2523            _ILSimpleGetText(pidl, szPath, MAX_PATH);
     2524            GetDiskFreeSpaceExA(szPath, &ulBytes, NULL, NULL);
     2525            StrFormatByteSizeA(ulBytes.s.LowPart, psd->str.u.cStr, MAX_PATH);
     2526          }
     2527          break;
     2528      }
     2529      hr = S_OK;
     2530    }
     2531
     2532    return hr;
     2533}
    25332534static HRESULT WINAPI ISF_MyComputer_fnMapNameToSCID(
    2534         IShellFolder2 * iface,
    2535         LPCWSTR pwszName,
    2536         SHCOLUMNID *pscid)
    2537 {
    2538         _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2539         FIXME("(%p)\n",This);
    2540         return E_NOTIMPL;
    2541 }       
    2542 
    2543 static ICOM_VTABLE(IShellFolder2) sfmcvt = 
    2544 {       
    2545         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    2546         IShellFolder_fnQueryInterface,
    2547         IShellFolder_fnAddRef,
    2548         IShellFolder_fnRelease,
    2549         ISF_MyComputer_fnParseDisplayName,
    2550         ISF_MyComputer_fnEnumObjects,
    2551         ISF_MyComputer_fnBindToObject,
    2552         IShellFolder_fnBindToStorage,
    2553         IShellFolder_fnCompareIDs,
    2554         ISF_MyComputer_fnCreateViewObject,
    2555         ISF_MyComputer_fnGetAttributesOf,
    2556         IShellFolder_fnGetUIObjectOf,
    2557         ISF_MyComputer_fnGetDisplayNameOf,
    2558         IShellFolder_fnSetNameOf,
    2559 
    2560         /* ShellFolder2 */
    2561         ISF_MyComputer_fnGetDefaultSearchGUID,
    2562         ISF_MyComputer_fnEnumSearches,
    2563         ISF_MyComputer_fnGetDefaultColumn,
    2564         ISF_MyComputer_fnGetDefaultColumnState,
    2565         ISF_MyComputer_fnGetDetailsEx,
    2566         ISF_MyComputer_fnGetDetailsOf,
    2567         ISF_MyComputer_fnMapNameToSCID
     2535    IShellFolder2 * iface,
     2536    LPCWSTR pwszName,
     2537    SHCOLUMNID *pscid)
     2538{
     2539    _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2540    FIXME("(%p)\n",This);
     2541    return E_NOTIMPL;
     2542}
     2543
     2544static ICOM_VTABLE(IShellFolder2) sfmcvt =
     2545{
     2546    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     2547    IShellFolder_fnQueryInterface,
     2548    IShellFolder_fnAddRef,
     2549    IShellFolder_fnRelease,
     2550    ISF_MyComputer_fnParseDisplayName,
     2551    ISF_MyComputer_fnEnumObjects,
     2552    ISF_MyComputer_fnBindToObject,
     2553    IShellFolder_fnBindToStorage,
     2554    IShellFolder_fnCompareIDs,
     2555    ISF_MyComputer_fnCreateViewObject,
     2556    ISF_MyComputer_fnGetAttributesOf,
     2557    IShellFolder_fnGetUIObjectOf,
     2558    ISF_MyComputer_fnGetDisplayNameOf,
     2559    IShellFolder_fnSetNameOf,
     2560
     2561    /* ShellFolder2 */
     2562    ISF_MyComputer_fnGetDefaultSearchGUID,
     2563    ISF_MyComputer_fnEnumSearches,
     2564    ISF_MyComputer_fnGetDefaultColumn,
     2565    ISF_MyComputer_fnGetDefaultColumnState,
     2566    ISF_MyComputer_fnGetDetailsEx,
     2567    ISF_MyComputer_fnGetDetailsOf,
     2568    ISF_MyComputer_fnMapNameToSCID
    25682569};
    25692570
     
    25742575 */
    25752576static HRESULT WINAPI ISFPersistFolder2_QueryInterface(
    2576         IPersistFolder2 *       iface,
    2577         REFIID                  iid,
    2578         LPVOID*                 ppvObj)
    2579 {
    2580         _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
    2581 
    2582         TRACE("(%p)\n", This);
    2583 
    2584         return IUnknown_QueryInterface(This->pUnkOuter, iid, ppvObj);
     2577    IPersistFolder2 *   iface,
     2578    REFIID          iid,
     2579    LPVOID*         ppvObj)
     2580{
     2581    _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
     2582
     2583    TRACE("(%p)\n", This);
     2584
     2585    return IUnknown_QueryInterface(This->pUnkOuter, iid, ppvObj);
    25852586}
    25862587
     
    25902591 */
    25912592static ULONG WINAPI ISFPersistFolder2_AddRef(
    2592         IPersistFolder2 *       iface)
    2593 {
    2594         _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
    2595 
    2596         TRACE("(%p)\n", This);
    2597 
    2598         return IUnknown_AddRef(This->pUnkOuter);
     2593    IPersistFolder2 *   iface)
     2594{
     2595    _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
     2596
     2597    TRACE("(%p)\n", This);
     2598
     2599    return IUnknown_AddRef(This->pUnkOuter);
    25992600}
    26002601
     
    26042605 */
    26052606static ULONG WINAPI ISFPersistFolder2_Release(
    2606         IPersistFolder2 *       iface)
    2607 {
    2608         _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
    2609 
    2610         TRACE("(%p)\n", This);
    2611 
    2612         return IUnknown_Release(This->pUnkOuter);
     2607    IPersistFolder2 *   iface)
     2608{
     2609    _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
     2610
     2611    TRACE("(%p)\n", This);
     2612
     2613    return IUnknown_Release(This->pUnkOuter);
    26132614}
    26142615
     
    26172618 */
    26182619static HRESULT WINAPI ISFPersistFolder2_GetClassID(
    2619         IPersistFolder2 *       iface,
    2620         CLSID *                 lpClassId)
    2621 {
    2622         _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
    2623 
    2624         TRACE("(%p)\n", This);
    2625 
    2626         if (!lpClassId) return E_POINTER;
    2627         *lpClassId = *This->pclsid;
    2628 
    2629         return S_OK;
     2620    IPersistFolder2 *   iface,
     2621    CLSID *         lpClassId)
     2622{
     2623    _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
     2624
     2625    TRACE("(%p)\n", This);
     2626
     2627    if (!lpClassId) return E_POINTER;
     2628    *lpClassId = *This->pclsid;
     2629
     2630    return S_OK;
    26302631}
    26312632
     
    26372638 */
    26382639static HRESULT WINAPI ISFPersistFolder2_Initialize(
    2639         IPersistFolder2 *       iface,
    2640         LPCITEMIDLIST           pidl)
    2641 {
    2642         char sTemp[MAX_PATH];
    2643         _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
    2644 
    2645         TRACE("(%p)->(%p)\n", This, pidl);
    2646 
    2647         /* free the old stuff */
    2648         if(This->absPidl)
    2649         {
    2650           SHFree(This->absPidl);
    2651           This->absPidl = NULL;
    2652         }
    2653         if(This->sMyPath)
    2654         {
    2655           SHFree(This->sMyPath);
    2656           This->sMyPath = NULL;
    2657         }
    2658 
    2659         /* set my pidl */
    2660         This->absPidl = ILClone(pidl);
    2661 
    2662         /* set my path */
    2663         if (SHGetPathFromIDListA(pidl, sTemp))
    2664         {
    2665           This->sMyPath = SHAlloc(strlen(sTemp)+1);
    2666           strcpy(This->sMyPath, sTemp);
    2667         }
    2668 
    2669         TRACE("--(%p)->(%s)\n", This, This->sMyPath);
    2670 
    2671         return S_OK;
     2640    IPersistFolder2 *   iface,
     2641    LPCITEMIDLIST       pidl)
     2642{
     2643    char sTemp[MAX_PATH];
     2644    _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
     2645
     2646    TRACE("(%p)->(%p)\n", This, pidl);
     2647
     2648    /* free the old stuff */
     2649    if(This->absPidl)
     2650    {
     2651      SHFree(This->absPidl);
     2652      This->absPidl = NULL;
     2653    }
     2654    if(This->sMyPath)
     2655    {
     2656      SHFree(This->sMyPath);
     2657      This->sMyPath = NULL;
     2658    }
     2659
     2660    /* set my pidl */
     2661    This->absPidl = ILClone(pidl);
     2662
     2663    /* set my path */
     2664    if (SHGetPathFromIDListA(pidl, sTemp))
     2665    {
     2666      This->sMyPath = SHAlloc(strlen(sTemp)+1);
     2667      strcpy(This->sMyPath, sTemp);
     2668    }
     2669
     2670    TRACE("--(%p)->(%s)\n", This, This->sMyPath);
     2671
     2672    return S_OK;
    26722673}
    26732674
     
    26762677*/
    26772678static HRESULT WINAPI ISFPersistFolder2_fnGetCurFolder(
    2678         IPersistFolder2 *       iface,
    2679         LPITEMIDLIST * pidl)
    2680 {
    2681         _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
    2682        
    2683         TRACE("(%p)->(%p)\n",This, pidl);
    2684 
    2685         if (!pidl) return E_POINTER;
    2686 
    2687         *pidl = ILClone(This->absPidl);
    2688 
    2689         return S_OK;
    2690 }
    2691 
    2692 static ICOM_VTABLE(IPersistFolder2) psfvt = 
    2693 {
    2694         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    2695         ISFPersistFolder2_QueryInterface,
    2696         ISFPersistFolder2_AddRef,
    2697         ISFPersistFolder2_Release,
    2698         ISFPersistFolder2_GetClassID,
    2699         ISFPersistFolder2_Initialize,
    2700         ISFPersistFolder2_fnGetCurFolder
     2679    IPersistFolder2 *   iface,
     2680    LPITEMIDLIST * pidl)
     2681{
     2682    _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
     2683
     2684    TRACE("(%p)->(%p)\n",This, pidl);
     2685
     2686    if (!pidl) return E_POINTER;
     2687
     2688    *pidl = ILClone(This->absPidl);
     2689
     2690    return S_OK;
     2691}
     2692
     2693static ICOM_VTABLE(IPersistFolder2) psfvt =
     2694{
     2695    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     2696    ISFPersistFolder2_QueryInterface,
     2697    ISFPersistFolder2_AddRef,
     2698    ISFPersistFolder2_Release,
     2699    ISFPersistFolder2_GetClassID,
     2700    ISFPersistFolder2_Initialize,
     2701    ISFPersistFolder2_fnGetCurFolder
    27012702};
    27022703
     
    27052706 */
    27062707static BOOL ISFDropTarget_QueryDrop(
    2707         IDropTarget *iface,
    2708         DWORD dwKeyState,
    2709         LPDWORD pdwEffect)
    2710 {
    2711         DWORD dwEffect = *pdwEffect;
    2712 
    2713         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    2714        
    2715         *pdwEffect = DROPEFFECT_NONE;
    2716 
    2717         if (This->fAcceptFmt)
    2718         { /* Does our interpretation of the keystate ... */
    2719           *pdwEffect = KeyStateToDropEffect(dwKeyState);
    2720          
    2721           /* ... matches the desired effect ? */
    2722           if (dwEffect & *pdwEffect)
    2723           {
    2724             return TRUE;
    2725           }
    2726         }
    2727         return FALSE;
     2708    IDropTarget *iface,
     2709    DWORD dwKeyState,
     2710    LPDWORD pdwEffect)
     2711{
     2712    DWORD dwEffect = *pdwEffect;
     2713
     2714    _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     2715
     2716    *pdwEffect = DROPEFFECT_NONE;
     2717
     2718    if (This->fAcceptFmt)
     2719    { /* Does our interpretation of the keystate ... */
     2720      *pdwEffect = KeyStateToDropEffect(dwKeyState);
     2721
     2722      /* ... matches the desired effect ? */
     2723      if (dwEffect & *pdwEffect)
     2724      {
     2725        return TRUE;
     2726      }
     2727    }
     2728    return FALSE;
    27282729}
    27292730
    27302731static HRESULT WINAPI ISFDropTarget_QueryInterface(
    2731         IDropTarget *iface,
    2732         REFIID riid,
    2733         LPVOID *ppvObj)
    2734 {
    2735         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    2736 
    2737         TRACE("(%p)\n", This);
    2738 
    2739         return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObj);
     2732    IDropTarget *iface,
     2733    REFIID riid,
     2734    LPVOID *ppvObj)
     2735{
     2736    _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     2737
     2738    TRACE("(%p)\n", This);
     2739
     2740    return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObj);
    27402741}
    27412742
    27422743static ULONG WINAPI ISFDropTarget_AddRef( IDropTarget *iface)
    27432744{
    2744         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    2745 
    2746         TRACE("(%p)\n", This);
    2747 
    2748         return IUnknown_AddRef(This->pUnkOuter);
     2745    _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     2746
     2747    TRACE("(%p)\n", This);
     2748
     2749    return IUnknown_AddRef(This->pUnkOuter);
    27492750}
    27502751
    27512752static ULONG WINAPI ISFDropTarget_Release( IDropTarget *iface)
    27522753{
    2753         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    2754 
    2755         TRACE("(%p)\n", This);
    2756 
    2757         return IUnknown_Release(This->pUnkOuter);
     2754    _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     2755
     2756    TRACE("(%p)\n", This);
     2757
     2758    return IUnknown_Release(This->pUnkOuter);
    27582759}
    27592760
    27602761static HRESULT WINAPI ISFDropTarget_DragEnter(
    2761         IDropTarget     *iface,
    2762         IDataObject     *pDataObject,
    2763         DWORD           dwKeyState,
    2764         POINTL          pt,
    2765         DWORD           *pdwEffect)
    2766 {       
    2767         FORMATETC       fmt;
    2768        
    2769         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    2770 
    2771         TRACE("(%p)->(DataObject=%p)\n",This,pDataObject);
    2772 
    2773         InitFormatEtc(fmt, This->cfShellIDList, TYMED_HGLOBAL);
    2774 
    2775         This->fAcceptFmt = (S_OK == IDataObject_QueryGetData(pDataObject, &fmt)) ? TRUE : FALSE;
    2776 
    2777         ISFDropTarget_QueryDrop(iface, dwKeyState, pdwEffect);
    2778 
    2779         return S_OK;
     2762    IDropTarget     *iface,
     2763    IDataObject *pDataObject,
     2764    DWORD       dwKeyState,
     2765    POINTL      pt,
     2766    DWORD       *pdwEffect)
     2767{
     2768    FORMATETC   fmt;
     2769
     2770    _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     2771
     2772    TRACE("(%p)->(DataObject=%p)\n",This,pDataObject);
     2773
     2774    InitFormatEtc(fmt, This->cfShellIDList, TYMED_HGLOBAL);
     2775
     2776    This->fAcceptFmt = (S_OK == IDataObject_QueryGetData(pDataObject, &fmt)) ? TRUE : FALSE;
     2777
     2778    ISFDropTarget_QueryDrop(iface, dwKeyState, pdwEffect);
     2779
     2780    return S_OK;
    27802781}
    27812782
    27822783static HRESULT WINAPI ISFDropTarget_DragOver(
    2783         IDropTarget     *iface,
    2784         DWORD           dwKeyState,
    2785         POINTL          pt,
    2786         DWORD           *pdwEffect)
    2787 {
    2788         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    2789 
    2790         TRACE("(%p)\n",This);
    2791        
    2792         if(!pdwEffect) return E_INVALIDARG;
    2793 
    2794         ISFDropTarget_QueryDrop(iface, dwKeyState, pdwEffect);
    2795 
    2796         return S_OK;
     2784    IDropTarget *iface,
     2785    DWORD       dwKeyState,
     2786    POINTL      pt,
     2787    DWORD       *pdwEffect)
     2788{
     2789    _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     2790
     2791    TRACE("(%p)\n",This);
     2792
     2793    if(!pdwEffect) return E_INVALIDARG;
     2794
     2795    ISFDropTarget_QueryDrop(iface, dwKeyState, pdwEffect);
     2796
     2797    return S_OK;
    27972798}
    27982799
    27992800static HRESULT WINAPI ISFDropTarget_DragLeave(
    2800         IDropTarget     *iface)
    2801 {
    2802         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    2803 
    2804         TRACE("(%p)\n",This);
    2805 
    2806         This->fAcceptFmt = FALSE;
    2807        
    2808         return S_OK;
     2801    IDropTarget *iface)
     2802{
     2803    _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     2804
     2805    TRACE("(%p)\n",This);
     2806
     2807    This->fAcceptFmt = FALSE;
     2808
     2809    return S_OK;
    28092810}
    28102811
    28112812static HRESULT WINAPI ISFDropTarget_Drop(
    2812         IDropTarget     *iface,
    2813         IDataObject*    pDataObject,
    2814         DWORD           dwKeyState,
    2815         POINTL          pt,
    2816         DWORD           *pdwEffect)
    2817 {
    2818         _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    2819 
    2820         FIXME("(%p) object dropped\n",This);
    2821 
    2822         return E_NOTIMPL;
    2823 }
    2824 
    2825 static struct ICOM_VTABLE(IDropTarget) dtvt = 
    2826 {
    2827         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    2828         ISFDropTarget_QueryInterface,
    2829         ISFDropTarget_AddRef,
    2830         ISFDropTarget_Release,
    2831         ISFDropTarget_DragEnter,
    2832         ISFDropTarget_DragOver,
    2833         ISFDropTarget_DragLeave,
    2834         ISFDropTarget_Drop
     2813    IDropTarget *iface,
     2814    IDataObject*    pDataObject,
     2815    DWORD       dwKeyState,
     2816    POINTL      pt,
     2817    DWORD       *pdwEffect)
     2818{
     2819    _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     2820
     2821    FIXME("(%p) object dropped\n",This);
     2822
     2823    return E_NOTIMPL;
     2824}
     2825
     2826static struct ICOM_VTABLE(IDropTarget) dtvt =
     2827{
     2828    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     2829    ISFDropTarget_QueryInterface,
     2830    ISFDropTarget_AddRef,
     2831    ISFDropTarget_Release,
     2832    ISFDropTarget_DragEnter,
     2833    ISFDropTarget_DragOver,
     2834    ISFDropTarget_DragLeave,
     2835    ISFDropTarget_Drop
    28352836};
Note: See TracChangeset for help on using the changeset viewer.