Ignore:
Timestamp:
Sep 15, 2001, 11:26:26 AM (24 years ago)
Author:
sandervl
Message:

restored old version

File:
1 edited

Legend:

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

    r6650 r6709  
    1 /* $Id: shlfolder.c,v 1.3 2001-09-05 13:46:59 bird Exp $ */
    21/*
    3  *  Shell Folder stuff
     2 *      Shell Folder stuff
    43 *
    5  *  Copyright 1997  Marcus Meissner
    6  *  Copyright 1998, 1999    Juergen Schmied
    7  *
    8  *  IShellFolder2 and related interfaces
     4 *      Copyright 1997  Marcus Meissner
     5 *      Copyright 1998, 1999    Juergen Schmied
     6 *     
     7 *      IShellFolder2 and related interfaces
    98 *
    109 */
    1110#ifdef __WIN32OS2__
    1211#define WINE_LARGE_INTEGER
    13 #define snprintf(a,b,c,d)   sprintf(a,c,d)
     12#define snprintf(a,b,c,d)       sprintf(a,c,d)
    1413#endif
    1514#include <stdlib.h>
     
    5150typedef struct
    5251{
    53     int     colnameid;
    54     int pcsFlags;
    55     int fmt;
    56     int cxChar;
    57 
     52        int     colnameid;
     53        int     pcsFlags;
     54        int     fmt;
     55        int     cxChar;
     56       
    5857} shvheader;
    5958
     
    7372
    7473static LPCWSTR GetNextElementW(LPCWSTR pszNext,LPWSTR pszOut,DWORD dwOut)
    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;
     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;
    9796}
    9897
    9998static HRESULT SHELL32_ParseNextElement(
    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;
     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;     
    133132}
    134133
    135134/***********************************************************************
    136  *  SHELL32_CoCreateInitSF
     135 *      SHELL32_CoCreateInitSF
    137136 *
    138  *  creates a initialized shell folder
     137 *      creates a initialized shell folder
    139138 */
    140139static HRESULT SHELL32_CoCreateInitSF (
    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;
     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;
    173172}
    174173
    175174static HRESULT SHELL32_GetDisplayNameOfChild(
    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;
     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;
    211210}
    212211
     
    216215 * NOTES
    217216 * observerd values:
    218  *  folder: 0xE0000177  FILESYSTEM | HASSUBFOLDER | FOLDER
    219  *  file:   0x40000177  FILESYSTEM
    220  *  drive:  0xf0000144  FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR
    221  *  mycomputer: 0xb0000154  HASSUBFOLDER | FOLDER | FILESYSANCESTOR
     217 *  folder:     0xE0000177      FILESYSTEM | HASSUBFOLDER | FOLDER
     218 *  file:       0x40000177      FILESYSTEM
     219 *  drive:      0xf0000144      FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR
     220 *  mycomputer: 0xb0000154      HASSUBFOLDER | FOLDER | FILESYSANCESTOR
    222221 *  (seems to be default for shell extensions if no registry entry exists)
    223222 *
     
    225224 */
    226225static HRESULT SHELL32_GetItemAttributes(
    227     IShellFolder * psf,
    228     LPITEMIDLIST pidl,
    229     LPDWORD pdwAttributes)
     226        IShellFolder * psf,
     227        LPITEMIDLIST pidl,
     228        LPDWORD pdwAttributes)
    230229{
    231230        GUID const * clsid;
    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;
     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;
    275274}
    276275
     
    279278*/
    280279
    281 typedef 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 */
     280typedef 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 */
    299298} IGenericSFImpl;
    300299
     
    307306static IShellFolder * ISF_MyComputer_Constructor(void);
    308307
    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);
     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); 
    320319/*
    321320  converts This to a interface pointer
    322321*/
    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
     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
    333332*/
    334333static void SF_RegisterClipFmt (IGenericSFImpl * This)
    335334{
    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)
     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)
    347346*/
    348347static HRESULT WINAPI IUnknown_fnQueryInterface(
    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;
     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;
    381380}
    382381
    383382static ULONG WINAPI IUnknown_fnAddRef(IUnknown * iface)
    384383{
    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 
    394 static 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 
    419 static ICOM_VTABLE(IUnknown) unkvt =
    420 {
    421     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    422     IUnknown_fnQueryInterface,
    423     IUnknown_fnAddRef,
    424     IUnknown_fnRelease,
     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
     393static 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
     418static ICOM_VTABLE(IUnknown) unkvt = 
     419{       
     420        ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     421        IUnknown_fnQueryInterface,
     422        IUnknown_fnAddRef,
     423        IUnknown_fnRelease,
    425424};
    426425
     
    436435
    437436/**************************************************************************
    438 *   IShellFolder_Constructor
     437*       IShellFolder_Constructor
    439438*
    440439* NOTES
     
    443442*
    444443* FIXME
    445 *   when pUnkOuter = 0 then rrid = IID_IShellFolder is returned
     444*       when pUnkOuter = 0 then rrid = IID_IShellFolder is returned
    446445*/
    447446HRESULT IFSFolder_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
     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
    488487*
    489488* NOTES
    490 *   THIS points to the parent folder
     489*       THIS points to the parent folder
    491490*/
    492491
    493492IShellFolder * IShellFolder_Constructor(
    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);
     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);
    554553}
    555554
     
    558557 *
    559558 * PARAMETERS
    560  *  REFIID riid     [in ] Requested InterfaceID
    561  *  LPVOID* ppvObject   [out] Interface* to hold the result
     559 *  REFIID riid         [in ] Requested InterfaceID
     560 *  LPVOID* ppvObject   [out] Interface* to hold the result
    562561 */
    563562static HRESULT WINAPI IShellFolder_fnQueryInterface(
    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);
     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);
    574573}
    575574
     
    580579static ULONG WINAPI IShellFolder_fnAddRef(IShellFolder2 * iface)
    581580{
    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);
     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);
    588587}
    589588
     
    591590 *  IShellFolder_fnRelease
    592591 */
    593 static 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
     592static 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
    605604* PARAMETERS
    606605*  HWND          hwndOwner,      //[in ] Parent window for any message's
     
    612611*
    613612* NOTES
    614 *  every folder tries to parse only its own (the leftmost) pidl and creates a
     613*  every folder tries to parse only its own (the leftmost) pidl and creates a 
    615614*  subfolder to evaluate the remaining parts
    616615*  now we can parse into namespaces implemented by shell extensions
    617616*
    618 *  behaviour on win98:  lpszDisplayName=NULL -> chrash
    619 *           lpszDisplayName="" -> returns mycoputer-pidl
     617*  behaviour on win98:  lpszDisplayName=NULL -> chrash
     618*                       lpszDisplayName="" -> returns mycoputer-pidl
    620619*
    621 * FIXME:
     620* FIXME: 
    622621*    pdwAttributes: not set
    623622*    pchEaten: not set like in windows
    624623*/
    625624static HRESULT WINAPI IShellFolder_fnParseDisplayName(
    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 */
     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 */
    656655          WideCharToMultiByte( CP_ACP, 0, szElement, -1, szTempA, MAX_PATH, NULL, NULL );
    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     }
     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        }
    688687
    689688        if (!hr)
    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
     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
    701700* PARAMETERS
    702701*  HWND          hwndOwner,    //[in ] Parent Window
     
    705704*/
    706705static HRESULT WINAPI IShellFolder_fnEnumObjects(
    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
     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
    728727* PARAMETERS
    729728*  LPCITEMIDLIST pidl,       //[in ] relative pidl to open
     
    733732*/
    734733static HRESULT WINAPI IShellFolder_fnBindToObject( IShellFolder2 * iface, LPCITEMIDLIST pidl,
    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;
     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;
    791790}
    792791
     
    796795*  LPCITEMIDLIST pidl,       //[in ] complex pidl to store
    797796*  LPBC          pbc,        //[in ] reserved
    798 *  REFIID        riid,       //[in ] Initial storage interface
     797*  REFIID        riid,       //[in ] Initial storage interface 
    799798*  LPVOID*       ppvObject   //[out] Interface* returned
    800799*/
    801800static HRESULT WINAPI IShellFolder_fnBindToStorage(
    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",
     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",
    811810              This,pidl,pbcReserved,debugstr_guid(riid),ppvOut);
    812811
    813     *ppvOut = NULL;
    814     return E_NOTIMPL;
     812        *ppvOut = NULL;
     813        return E_NOTIMPL;
    815814}
    816815
     
    827826*   always make the Path come before the File.
    828827*
    829 * NOTES
     828* NOTES 
    830829*  use SCODE_CODE() on the return value to get the result
    831830*/
    832831
    833832static HRESULT WINAPI  IShellFolder_fnCompareIDs(
    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
     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
    921920*/
    922921static HRESULT WINAPI IShellFolder_fnCreateViewObject(
    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;
     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;
    960959}
    961960
     
    965964* PARAMETERS
    966965*  UINT            cidl,     //[in ] num elements in pidl array
    967 *  LPCITEMIDLIST*  apidl,    //[in ] simple pidl array
    968 *  ULONG*          rgfInOut) //[out] result array
     966*  LPCITEMIDLIST*  apidl,    //[in ] simple pidl array 
     967*  ULONG*          rgfInOut) //[out] result array 
    969968*
    970969*/
    971970static HRESULT WINAPI IShellFolder_fnGetAttributesOf(
    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;
     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;
    997996}
    998997/**************************************************************************
     
    10041003*  LPCITEMIDLIST* apidl,     //[in ] simple pidl array
    10051004*  REFIID         riid,      //[in ] Requested Interface
    1006 *  UINT*          prgfInOut, //[   ] reserved
     1005*  UINT*          prgfInOut, //[   ] reserved 
    10071006*  LPVOID*        ppvObject) //[out] Resulting Interface
    10081007*
     
    10171016*  and GetData's it if the drop is in another explorer window that needs the positions.
    10181017*/
    1019 static 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;
     1018static 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;
    10741073}
    10751074
     
    10901089
    10911090static HRESULT WINAPI IShellFolder_fnGetDisplayNameOf(
    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;
     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;
    11421141}
    11431142
     
    11551154*/
    11561155static HRESULT WINAPI IShellFolder_fnSetNameOf(
    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);
     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);
    11891188        WideCharToMultiByte( CP_ACP, 0, lpName, -1, szDest+len, MAX_PATH-len, NULL, NULL );
    11901189        szDest[MAX_PATH-1] = 0;
    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;
     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;
    11991198}
    12001199
    12011200static HRESULT WINAPI IShellFolder_fnGetDefaultSearchGUID(
    1202     IShellFolder2 * iface,
    1203     GUID *pguid)
    1204 {
    1205     _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1206     FIXME("(%p)\n",This);
    1207     return E_NOTIMPL;
    1208 }
     1201        IShellFolder2 * iface,
     1202        GUID *pguid)
     1203{
     1204        _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1205        FIXME("(%p)\n",This);
     1206        return E_NOTIMPL;
     1207}       
    12091208static HRESULT WINAPI IShellFolder_fnEnumSearches(
    1210     IShellFolder2 * iface,
    1211     IEnumExtraSearch **ppenum)
    1212 {
    1213     _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1214     FIXME("(%p)\n",This);
    1215     return E_NOTIMPL;
    1216 }
     1209        IShellFolder2 * iface,
     1210        IEnumExtraSearch **ppenum)
     1211{
     1212        _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1213        FIXME("(%p)\n",This);
     1214        return E_NOTIMPL;
     1215}       
    12171216static HRESULT WINAPI IShellFolder_fnGetDefaultColumn(
    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 }
     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}       
    12321231static HRESULT WINAPI IShellFolder_fnGetDefaultColumnState(
    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 }
     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}       
    12471246static HRESULT WINAPI IShellFolder_fnGetDetailsEx(
    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 }
     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}       
    12581257static HRESULT WINAPI IShellFolder_fnGetDetailsOf(
    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 }
     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}       
    13071306static HRESULT WINAPI 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 
    1317 static 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
     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
     1316static 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
    13421341};
    13431342
     
    13471346
    13481347static HRESULT WINAPI ISFHelper_fnQueryInterface(
    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);
     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);
    13581357}
    13591358
    13601359static ULONG WINAPI ISFHelper_fnAddRef(
    1361     ISFHelper *iface)
    1362 {
    1363     _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface);
    1364 
    1365     TRACE("(%p)\n", This);
    1366 
    1367     return IUnknown_AddRef(This->pUnkOuter);
     1360        ISFHelper *iface)
     1361{
     1362        _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface);
     1363
     1364        TRACE("(%p)\n", This);
     1365
     1366        return IUnknown_AddRef(This->pUnkOuter);
    13681367}
    13691368
    13701369static ULONG WINAPI ISFHelper_fnRelease(
    1371     ISFHelper *iface)
    1372 {
    1373     _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface);
    1374 
    1375     TRACE("(%p)\n", This);
    1376 
    1377     return IUnknown_Release(This->pUnkOuter);
     1370        ISFHelper *iface)
     1371{
     1372        _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface);
     1373
     1374        TRACE("(%p)\n", This);
     1375
     1376        return IUnknown_Release(This->pUnkOuter);
    13781377}
    13791378
     
    13861385
    13871386static HRESULT WINAPI ISFHelper_fnGetUniqueName(
    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 
     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         
    14111410next:     IEnumIDList_Reset(penum);
    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 
     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       
    14321431/****************************************************************************
    14331432 * ISFHelper_fnAddFolder
     
    14371436
    14381437static HRESULT WINAPI ISFHelper_fnAddFolder(
    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;
     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;
    14841483}
    14851484
     
    14901489 */
    14911490static HRESULT WINAPI ISFHelper_fnDeleteItems(
    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];
     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];
    14991498        BOOL bConfirm = TRUE;
    15001499
    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];
     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]; 
    15071506          snprintf(tmp, sizeof(tmp), "%d", cidl);
    1508       if(!SHELL_WarnItemDelete(ASK_DELETE_MULTIPLE_ITEM, tmp))
     1507          if(!SHELL_WarnItemDelete(ASK_DELETE_MULTIPLE_ITEM, tmp))
    15091508            return E_FAIL;
    15101509          bConfirm = FALSE;
    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         {
     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            {
    15251524              TRACE("delete %s failed, bConfirm=%d", szPath, bConfirm);
    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         {
     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            {
    15391538              TRACE("delete %s failed, bConfirm=%d", szPath, bConfirm);
    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;
     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;
    15491548}
    15501549
     
    15551554 */
    15561555static HRESULT WINAPI 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 
    1593 static 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,
     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
     1592static 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,
    16031602};
    16041603
    16051604/***********************************************************************
    1606 *   [Desktopfolder] IShellFolder implementation
     1605*       [Desktopfolder] IShellFolder implementation
    16071606*/
    16081607static struct ICOM_VTABLE(IShellFolder2) sfdvt;
     
    16191618
    16201619/**************************************************************************
    1621 *   ISF_Desktop_Constructor
     1620*       ISF_Desktop_Constructor
    16221621*
    16231622*/
    16241623IShellFolder * ISF_Desktop_Constructor()
    16251624{
    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
     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
    16431642 *
    16441643 * NOTES supports not IPersist/IPersistFolder
    16451644 */
    16461645static HRESULT WINAPI ISF_Desktop_fnQueryInterface(
    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
     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
    16821681*
    16831682* NOTES
    1684 *   "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds
    1685 *   to MyComputer
     1683*       "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds
     1684*       to MyComputer
    16861685*/
    16871686static HRESULT WINAPI ISF_Desktop_fnParseDisplayName(
    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
     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
    17361735*/
    17371736static HRESULT WINAPI ISF_Desktop_fnEnumObjects(
    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
     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
    17591758*/
    17601759static HRESULT WINAPI ISF_Desktop_fnBindToObject( IShellFolder2 * iface, LPCITEMIDLIST pidl,
    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",
     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",
    17681767              This,pidl,pbcReserved,debugstr_guid(riid),ppvOut);
    17691768
    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
     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
    18271826*/
    18281827static HRESULT WINAPI ISF_Desktop_fnCreateViewObject( IShellFolder2 * iface,
    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;
     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;
    18641863}
    18651864
     
    18681867*/
    18691868static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf(
    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
     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
    18991898*
    19001899* NOTES
    1901 *   special case: pidl = null gives desktop-name back
     1900*       special case: pidl = null gives desktop-name back
    19021901*/
    19031902static HRESULT WINAPI ISF_Desktop_fnGetDisplayNameOf(
    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;
     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;
    19371936}
    19381937
    19391938static HRESULT WINAPI ISF_Desktop_fnGetDefaultSearchGUID(
    1940     IShellFolder2 * iface,
    1941     GUID *pguid)
    1942 {
    1943     _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1944     FIXME("(%p)\n",This);
    1945     return E_NOTIMPL;
    1946 }
     1939        IShellFolder2 * iface,
     1940        GUID *pguid)
     1941{
     1942        _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1943        FIXME("(%p)\n",This);
     1944        return E_NOTIMPL;
     1945}       
    19471946static HRESULT WINAPI ISF_Desktop_fnEnumSearches(
    1948     IShellFolder2 * iface,
    1949     IEnumExtraSearch **ppenum)
    1950 {
    1951     _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    1952     FIXME("(%p)\n",This);
    1953     return E_NOTIMPL;
    1954 }
     1947        IShellFolder2 * iface,
     1948        IEnumExtraSearch **ppenum)
     1949{
     1950        _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     1951        FIXME("(%p)\n",This);
     1952        return E_NOTIMPL;
     1953}       
    19551954static HRESULT WINAPI ISF_Desktop_fnGetDefaultColumn(
    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 }
     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}       
    19701969static HRESULT WINAPI ISF_Desktop_fnGetDefaultColumnState(
    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 }
     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}       
    19851984static HRESULT WINAPI ISF_Desktop_fnGetDetailsEx(
    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 }
     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}       
    19961995static HRESULT WINAPI ISF_Desktop_fnGetDetailsOf(
    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 }
     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}       
    20442043static HRESULT WINAPI 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 
    2054 static 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
     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
     2053static 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
    20792078};
    20802079
     
    20962095
    20972096/**************************************************************************
    2098 *   ISF_MyComputer_Constructor
     2097*       ISF_MyComputer_Constructor
    20992098*/
    21002099static IShellFolder * ISF_MyComputer_Constructor(void)
    21012100{
    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
     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
    21222121*/
    21232122static HRESULT WINAPI ISF_MyComputer_fnParseDisplayName(
    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);
     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);
    21522151          WideCharToMultiByte( CP_ACP, 0, szElement, -1, szTempA, MAX_PATH, NULL, NULL );
    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
     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
    21772176*/
    21782177static HRESULT WINAPI ISF_MyComputer_fnEnumObjects(
    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
     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
    22002199*/
    22012200static HRESULT WINAPI ISF_MyComputer_fnBindToObject( IShellFolder2 * iface, LPCITEMIDLIST pidl,
    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",
     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",
    22102209              This,pidl,pbcReserved,debugstr_guid(riid),ppvOut);
    22112210
    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
     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
    22502249*/
    22512250static HRESULT WINAPI ISF_MyComputer_fnCreateViewObject( IShellFolder2 * iface,
    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;
     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;
    22872286}
    22882287
     
    22912290*/
    22922291static HRESULT WINAPI ISF_MyComputer_fnGetAttributesOf(
    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
     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
    23212320*
    23222321* NOTES
    2323 *   The desktopfolder creates only complete paths (SHGDN_FORPARSING).
    2324 *   SHGDN_INFOLDER makes no sense.
     2322*       The desktopfolder creates only complete paths (SHGDN_FORPARSING).
     2323*       SHGDN_INFOLDER makes no sense.
    23252324*/
    23262325static HRESULT WINAPI ISF_MyComputer_fnGetDisplayNameOf(
    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;
     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;
    23702369
    23712370#ifdef __WIN32OS2__
     
    23902389            }
    23912390#else
    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);
     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);
    23972396#endif
    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;
     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;
    24152414}
    24162415
    24172416static HRESULT WINAPI ISF_MyComputer_fnGetDefaultSearchGUID(
    2418     IShellFolder2 * iface,
    2419     GUID *pguid)
    2420 {
    2421     _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2422     FIXME("(%p)\n",This);
    2423     return E_NOTIMPL;
    2424 }
     2417        IShellFolder2 * iface,
     2418        GUID *pguid)
     2419{
     2420        _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2421        FIXME("(%p)\n",This);
     2422        return E_NOTIMPL;
     2423}       
    24252424static HRESULT WINAPI ISF_MyComputer_fnEnumSearches(
    2426     IShellFolder2 * iface,
    2427     IEnumExtraSearch **ppenum)
    2428 {
    2429     _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
    2430     FIXME("(%p)\n",This);
    2431     return E_NOTIMPL;
    2432 }
     2425        IShellFolder2 * iface,
     2426        IEnumExtraSearch **ppenum)
     2427{
     2428        _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)
     2429        FIXME("(%p)\n",This);
     2430        return E_NOTIMPL;
     2431}       
    24332432static HRESULT WINAPI ISF_MyComputer_fnGetDefaultColumn(
    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 }
     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}       
    24482447static HRESULT WINAPI ISF_MyComputer_fnGetDefaultColumnState(
    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 }
     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}       
    24632462static HRESULT WINAPI ISF_MyComputer_fnGetDetailsEx(
    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 }
     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}       
    24742473
    24752474/* fixme: drive size >4GB is rolling over */
    24762475static HRESULT WINAPI ISF_MyComputer_fnGetDetailsOf(
    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 }
     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}       
    25342533static HRESULT WINAPI 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 
    2544 static 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
     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
     2543static 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
    25692568};
    25702569
     
    25752574 */
    25762575static HRESULT WINAPI ISFPersistFolder2_QueryInterface(
    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);
     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);
    25862585}
    25872586
     
    25912590 */
    25922591static ULONG WINAPI ISFPersistFolder2_AddRef(
    2593     IPersistFolder2 *   iface)
    2594 {
    2595     _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
    2596 
    2597     TRACE("(%p)\n", This);
    2598 
    2599     return IUnknown_AddRef(This->pUnkOuter);
     2592        IPersistFolder2 *       iface)
     2593{
     2594        _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
     2595
     2596        TRACE("(%p)\n", This);
     2597
     2598        return IUnknown_AddRef(This->pUnkOuter);
    26002599}
    26012600
     
    26052604 */
    26062605static ULONG WINAPI ISFPersistFolder2_Release(
    2607     IPersistFolder2 *   iface)
    2608 {
    2609     _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
    2610 
    2611     TRACE("(%p)\n", This);
    2612 
    2613     return IUnknown_Release(This->pUnkOuter);
     2606        IPersistFolder2 *       iface)
     2607{
     2608        _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface);
     2609
     2610        TRACE("(%p)\n", This);
     2611
     2612        return IUnknown_Release(This->pUnkOuter);
    26142613}
    26152614
     
    26182617 */
    26192618static HRESULT WINAPI ISFPersistFolder2_GetClassID(
    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;
     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;
    26312630}
    26322631
     
    26382637 */
    26392638static HRESULT WINAPI ISFPersistFolder2_Initialize(
    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;
     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;
    26732672}
    26742673
     
    26772676*/
    26782677static HRESULT WINAPI 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 
    2693 static 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
     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
     2692static 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
    27022701};
    27032702
     
    27062705 */
    27072706static BOOL ISFDropTarget_QueryDrop(
    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;
     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;
    27292728}
    27302729
    27312730static HRESULT WINAPI ISFDropTarget_QueryInterface(
    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);
     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);
    27412740}
    27422741
    27432742static ULONG WINAPI ISFDropTarget_AddRef( IDropTarget *iface)
    27442743{
    2745     _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    2746 
    2747     TRACE("(%p)\n", This);
    2748 
    2749     return IUnknown_AddRef(This->pUnkOuter);
     2744        _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     2745
     2746        TRACE("(%p)\n", This);
     2747
     2748        return IUnknown_AddRef(This->pUnkOuter);
    27502749}
    27512750
    27522751static ULONG WINAPI ISFDropTarget_Release( IDropTarget *iface)
    27532752{
    2754     _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
    2755 
    2756     TRACE("(%p)\n", This);
    2757 
    2758     return IUnknown_Release(This->pUnkOuter);
     2753        _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface);
     2754
     2755        TRACE("(%p)\n", This);
     2756
     2757        return IUnknown_Release(This->pUnkOuter);
    27592758}
    27602759
    27612760static HRESULT WINAPI ISFDropTarget_DragEnter(
    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;
     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;
    27812780}
    27822781
    27832782static HRESULT WINAPI ISFDropTarget_DragOver(
    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;
     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;
    27982797}
    27992798
    28002799static HRESULT WINAPI ISFDropTarget_DragLeave(
    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;
     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;
    28102809}
    28112810
    28122811static HRESULT WINAPI 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 
    2826 static 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
     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
     2825static 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
    28362835};
Note: See TracChangeset for help on using the changeset viewer.