Changeset 6709 for trunk/src/shell32/shlfolder.c
- Timestamp:
- Sep 15, 2001, 11:26:26 AM (24 years ago)
- File:
-
- 1 edited
-
trunk/src/shell32/shlfolder.c (modified) (39 diffs)
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 $ */2 1 /* 3 * Shell Folder stuff2 * Shell Folder stuff 4 3 * 5 * Copyright 1997Marcus Meissner6 * Copyright 1998, 1999Juergen Schmied7 * 8 * IShellFolder2 and related interfaces4 * Copyright 1997 Marcus Meissner 5 * Copyright 1998, 1999 Juergen Schmied 6 * 7 * IShellFolder2 and related interfaces 9 8 * 10 9 */ 11 10 #ifdef __WIN32OS2__ 12 11 #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) 14 13 #endif 15 14 #include <stdlib.h> … … 51 50 typedef struct 52 51 { 53 intcolnameid;54 intpcsFlags;55 intfmt;56 intcxChar;57 52 int colnameid; 53 int pcsFlags; 54 int fmt; 55 int cxChar; 56 58 57 } shvheader; 59 58 … … 73 72 74 73 static 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 else93 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; 97 96 } 98 97 99 98 static HRESULT SHELL32_ParseNextElement( 100 HWND hwndOwner,101 IShellFolder2 * psf,102 LPITEMIDLIST * pidlInOut,103 LPOLESTR szNext,104 DWORD *pEaten,105 DWORD *pdwAttributes)106 { 107 HRESULThr = E_OUTOFMEMORY;108 LPITEMIDLISTpidlOut, 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; 133 132 } 134 133 135 134 /*********************************************************************** 136 * SHELL32_CoCreateInitSF135 * SHELL32_CoCreateInitSF 137 136 * 138 * creates a initialized shell folder137 * creates a initialized shell folder 139 138 */ 140 139 static HRESULT SHELL32_CoCreateInitSF ( 141 LPITEMIDLIST pidlRoot,142 LPITEMIDLIST pidlChild,143 REFCLSID clsid,144 REFIID iid,145 LPVOID * ppvOut)146 { 147 HRESULT hr;148 LPITEMIDLISTabsPidl;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; 173 172 } 174 173 175 174 static HRESULT SHELL32_GetDisplayNameOfChild( 176 IShellFolder2 * psf,177 LPCITEMIDLIST pidl,178 DWORD dwFlags,179 LPSTR szOut,180 DWORD dwOutLen)181 { 182 LPITEMIDLISTpidlFirst, pidlNext;183 IShellFolder2 *psfChild;184 HRESULThr = 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; 211 210 } 212 211 … … 216 215 * NOTES 217 216 * observerd values: 218 * folder: 0xE0000177FILESYSTEM | HASSUBFOLDER | FOLDER219 * file: 0x40000177FILESYSTEM220 * drive: 0xf0000144FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR221 * mycomputer: 0xb0000154HASSUBFOLDER | FOLDER | FILESYSANCESTOR217 * folder: 0xE0000177 FILESYSTEM | HASSUBFOLDER | FOLDER 218 * file: 0x40000177 FILESYSTEM 219 * drive: 0xf0000144 FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR 220 * mycomputer: 0xb0000154 HASSUBFOLDER | FOLDER | FILESYSANCESTOR 222 221 * (seems to be default for shell extensions if no registry entry exists) 223 222 * … … 225 224 */ 226 225 static HRESULT SHELL32_GetItemAttributes( 227 IShellFolder * psf,228 LPITEMIDLIST pidl,229 LPDWORD pdwAttributes)226 IShellFolder * psf, 227 LPITEMIDLIST pidl, 228 LPDWORD pdwAttributes) 230 229 { 231 230 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 else251 {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 else270 {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; 275 274 } 276 275 … … 279 278 */ 280 279 281 typedef struct 282 { 283 ICOM_VFIELD(IUnknown);284 DWORDref;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 LPSTRsMyPath;295 LPITEMIDLIST absPidl;/* complete pidl */296 297 UINT cfShellIDList;/* clipboardformat for IDropTarget */298 BOOL fAcceptFmt;/* flag for pending Drop */280 typedef struct 281 { 282 ICOM_VFIELD(IUnknown); 283 DWORD ref; 284 ICOM_VTABLE(IShellFolder2)* lpvtblShellFolder; 285 ICOM_VTABLE(IPersistFolder2)* lpvtblPersistFolder2; 286 ICOM_VTABLE(IDropTarget)* lpvtblDropTarget; 287 ICOM_VTABLE(ISFHelper)* lpvtblSFHelper; 288 289 IUnknown *pUnkOuter; /* used for aggregation */ 290 291 CLSID* pclsid; 292 293 LPSTR sMyPath; 294 LPITEMIDLIST absPidl; /* complete pidl */ 295 296 UINT cfShellIDList; /* clipboardformat for IDropTarget */ 297 BOOL fAcceptFmt; /* flag for pending Drop */ 299 298 } IGenericSFImpl; 300 299 … … 307 306 static IShellFolder * ISF_MyComputer_Constructor(void); 308 307 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); 320 319 /* 321 320 converts This to a interface pointer 322 321 */ 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 once322 #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 333 332 */ 334 333 static void SF_RegisterClipFmt (IGenericSFImpl * This) 335 334 { 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 aggregation346 * (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) 347 346 */ 348 347 static HRESULT WINAPI IUnknown_fnQueryInterface( 349 IUnknown * iface,350 REFIID riid,351 LPVOID *ppvObj)352 { 353 ICOM_THIS(IGenericSFImpl, iface);354 355 _CALL_TRACE356 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; 381 380 } 382 381 383 382 static ULONG WINAPI IUnknown_fnAddRef(IUnknown * iface) 384 383 { 385 ICOM_THIS(IGenericSFImpl, iface);386 387 _CALL_TRACE388 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_TRACE399 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_DummyRTTIVALUE422 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 393 static ULONG WINAPI IUnknown_fnRelease(IUnknown * iface) 394 { 395 ICOM_THIS(IGenericSFImpl, iface); 396 397 _CALL_TRACE 398 TRACE("(%p)->(count=%lu)\n",This,This->ref); 399 400 shell32_ObjCount--; 401 if (!--(This->ref)) 402 { 403 TRACE("-- destroying IShellFolder(%p)\n",This); 404 405 if (pdesktopfolder == _IShellFolder_(This)) 406 { 407 pdesktopfolder=NULL; 408 TRACE("-- destroyed IShellFolder(%p) was Desktopfolder\n",This); 409 } 410 if(This->absPidl) SHFree(This->absPidl); 411 if(This->sMyPath) SHFree(This->sMyPath); 412 HeapFree(GetProcessHeap(),0,This); 413 return 0; 414 } 415 return This->ref; 416 } 417 418 static ICOM_VTABLE(IUnknown) unkvt = 419 { 420 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 421 IUnknown_fnQueryInterface, 422 IUnknown_fnAddRef, 423 IUnknown_fnRelease, 425 424 }; 426 425 … … 436 435 437 436 /************************************************************************** 438 * IShellFolder_Constructor437 * IShellFolder_Constructor 439 438 * 440 439 * NOTES … … 443 442 * 444 443 * FIXME 445 * when pUnkOuter = 0 then rrid = IID_IShellFolder is returned444 * when pUnkOuter = 0 then rrid = IID_IShellFolder is returned 446 445 */ 447 446 HRESULT 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 else462 {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 else480 {481 hr = E_OUTOFMEMORY;482 }483 }484 return hr;485 } 486 /************************************************************************** 487 * IShellFolder_Constructor447 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 488 487 * 489 488 * NOTES 490 * THIS points to the parent folder489 * THIS points to the parent folder 491 490 */ 492 491 493 492 IShellFolder * IShellFolder_Constructor( 494 IShellFolder2 * iface,495 LPITEMIDLIST pidl)496 { 497 IGenericSFImpl *sf;498 DWORDdwSize=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); 554 553 } 555 554 … … 558 557 * 559 558 * PARAMETERS 560 * REFIID riid [in ] Requested InterfaceID561 * LPVOID* ppvObject [out] Interface* to hold the result559 * REFIID riid [in ] Requested InterfaceID 560 * LPVOID* ppvObject [out] Interface* to hold the result 562 561 */ 563 562 static HRESULT WINAPI IShellFolder_fnQueryInterface( 564 IShellFolder2 * iface,565 REFIID riid,566 LPVOID *ppvObj)567 { 568 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)569 570 _CALL_TRACE571 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); 574 573 } 575 574 … … 580 579 static ULONG WINAPI IShellFolder_fnAddRef(IShellFolder2 * iface) 581 580 { 582 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)583 584 _CALL_TRACE585 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); 588 587 } 589 588 … … 591 590 * IShellFolder_fnRelease 592 591 */ 593 static ULONG WINAPI IShellFolder_fnRelease(IShellFolder2 * iface) 594 { 595 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)596 597 _CALL_TRACE598 TRACE("(%p)->(count=%lu)\n",This,This->ref);599 600 return IUnknown_Release(This->pUnkOuter);601 } 602 603 /************************************************************************** 604 * IShellFolder_fnParseDisplayName592 static ULONG WINAPI IShellFolder_fnRelease(IShellFolder2 * iface) 593 { 594 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 595 596 _CALL_TRACE 597 TRACE("(%p)->(count=%lu)\n",This,This->ref); 598 599 return IUnknown_Release(This->pUnkOuter); 600 } 601 602 /************************************************************************** 603 * IShellFolder_fnParseDisplayName 605 604 * PARAMETERS 606 605 * HWND hwndOwner, //[in ] Parent window for any message's … … 612 611 * 613 612 * 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 615 614 * subfolder to evaluate the remaining parts 616 615 * now we can parse into namespaces implemented by shell extensions 617 616 * 618 * behaviour on win98: lpszDisplayName=NULL -> chrash619 * lpszDisplayName="" -> returns mycoputer-pidl617 * behaviour on win98: lpszDisplayName=NULL -> chrash 618 * lpszDisplayName="" -> returns mycoputer-pidl 620 619 * 621 * FIXME: 620 * FIXME: 622 621 * pdwAttributes: not set 623 622 * pchEaten: not set like in windows 624 623 */ 625 624 static 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 HRESULThr = E_OUTOFMEMORY;637 LPCWSTRszNext=NULL;638 WCHARszElement[MAX_PATH];639 CHARszTempA[MAX_PATH], szPath[MAX_PATH];640 LPITEMIDLISTpidlTemp=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 */ 656 655 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 else672 {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 } 688 687 689 688 if (!hr) 690 *ppidl = pidlTemp;691 else692 *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_fnEnumObjects689 *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 701 700 * PARAMETERS 702 701 * HWND hwndOwner, //[in ] Parent Window … … 705 704 */ 706 705 static 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_fnBindToObject706 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 728 727 * PARAMETERS 729 728 * LPCITEMIDLIST pidl, //[in ] relative pidl to open … … 733 732 */ 734 733 static HRESULT WINAPI IShellFolder_fnBindToObject( IShellFolder2 * iface, LPCITEMIDLIST pidl, 735 LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)736 { 737 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)738 GUIDconst * iid;739 IShellFolder*pShellFolder, *pSubFolder;740 IPersistFolder*pPersistFolder;741 LPITEMIDLISTabsPidl;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 else761 {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 else772 {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 else782 {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; 791 790 } 792 791 … … 796 795 * LPCITEMIDLIST pidl, //[in ] complex pidl to store 797 796 * LPBC pbc, //[in ] reserved 798 * REFIID riid, //[in ] Initial storage interface 797 * REFIID riid, //[in ] Initial storage interface 799 798 * LPVOID* ppvObject //[out] Interface* returned 800 799 */ 801 800 static 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", 811 810 This,pidl,pbcReserved,debugstr_guid(riid),ppvOut); 812 811 813 *ppvOut = NULL;814 return E_NOTIMPL;812 *ppvOut = NULL; 813 return E_NOTIMPL; 815 814 } 816 815 … … 827 826 * always make the Path come before the File. 828 827 * 829 * NOTES 828 * NOTES 830 829 * use SCODE_CODE() on the return value to get the result 831 830 */ 832 831 833 832 static 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 else866 {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 else904 {905 hr = ResultFromShort(nReturn);/* two equal simple pidls */906 }907 }908 else909 {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_fnCreateViewObject833 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 921 920 */ 922 921 static 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 LPSHELLVIEWpShellView;931 HRESULThr = 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; 960 959 } 961 960 … … 965 964 * PARAMETERS 966 965 * 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 969 968 * 970 969 */ 971 970 static 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; 997 996 } 998 997 /************************************************************************** … … 1004 1003 * LPCITEMIDLIST* apidl, //[in ] simple pidl array 1005 1004 * REFIID riid, //[in ] Requested Interface 1006 * UINT* prgfInOut, //[ ] reserved 1005 * UINT* prgfInOut, //[ ] reserved 1007 1006 * LPVOID* ppvObject) //[out] Resulting Interface 1008 1007 * … … 1017 1016 * and GetData's it if the drop is in another explorer window that needs the positions. 1018 1017 */ 1019 static HRESULT WINAPI IShellFolder_fnGetUIObjectOf( 1020 IShellFolder2 *iface,1021 HWNDhwndOwner,1022 UINTcidl,1023 LPCITEMIDLIST * apidl, 1024 REFIID riid, 1025 UINT *prgfInOut,1026 LPVOID *ppvOut)1027 { 1028 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)1029 1030 LPITEMIDLISTpidl;1031 IUnknown* pObj = NULL; 1032 HRESULThr = 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 else1063 { 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;1018 static HRESULT WINAPI IShellFolder_fnGetUIObjectOf( 1019 IShellFolder2 * iface, 1020 HWND hwndOwner, 1021 UINT cidl, 1022 LPCITEMIDLIST * apidl, 1023 REFIID riid, 1024 UINT * prgfInOut, 1025 LPVOID * ppvOut) 1026 { 1027 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1028 1029 LPITEMIDLIST pidl; 1030 IUnknown* pObj = NULL; 1031 HRESULT hr = E_INVALIDARG; 1032 1033 TRACE("(%p)->(0x%04x,%u,apidl=%p,\n\tIID:%s,%p,%p)\n", 1034 This,hwndOwner,cidl,apidl,debugstr_guid(riid),prgfInOut,ppvOut); 1035 1036 if (ppvOut) 1037 { 1038 *ppvOut = NULL; 1039 1040 if(IsEqualIID(riid, &IID_IContextMenu) && (cidl >= 1)) 1041 { 1042 pObj = (LPUNKNOWN)ISvItemCm_Constructor((IShellFolder*)iface, This->absPidl, apidl, cidl); 1043 hr = S_OK; 1044 } 1045 else if (IsEqualIID(riid, &IID_IDataObject) &&(cidl >= 1)) 1046 { 1047 pObj = (LPUNKNOWN)IDataObject_Constructor (hwndOwner, This->absPidl, apidl, cidl); 1048 hr = S_OK; 1049 } 1050 else if (IsEqualIID(riid, &IID_IExtractIconA) && (cidl == 1)) 1051 { 1052 pidl = ILCombine(This->absPidl,apidl[0]); 1053 pObj = (LPUNKNOWN)IExtractIconA_Constructor( pidl ); 1054 SHFree(pidl); 1055 hr = S_OK; 1056 } 1057 else if (IsEqualIID(riid, &IID_IDropTarget) && (cidl >= 1)) 1058 { 1059 hr = IShellFolder_QueryInterface(iface, &IID_IDropTarget, (LPVOID*)&pObj); 1060 } 1061 else 1062 { 1063 hr = E_NOINTERFACE; 1064 } 1065 1066 if(!pObj) 1067 hr = E_OUTOFMEMORY; 1068 1069 *ppvOut = pObj; 1070 } 1071 TRACE("(%p)->hr=0x%08lx\n",This, hr); 1072 return hr; 1074 1073 } 1075 1074 … … 1090 1089 1091 1090 static 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 CHARszPath[MAX_PATH]= "";1100 intlen = 0;1101 BOOLbSimplePidl;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 else1119 {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; 1142 1141 } 1143 1142 … … 1155 1154 */ 1156 1155 static 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); 1189 1188 WideCharToMultiByte( CP_ACP, 0, lpName, -1, szDest+len, MAX_PATH-len, NULL, NULL ); 1190 1189 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; 1199 1198 } 1200 1199 1201 1200 static 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 } 1209 1208 static 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 } 1217 1216 static 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 } 1232 1231 static 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 } 1247 1246 static 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 } 1258 1257 static 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 else1281 {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 } 1307 1306 static 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_DummyRTTIVALUE1320 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_fnMapNameToSCID1307 IShellFolder2 * iface, 1308 LPCWSTR pwszName, 1309 SHCOLUMNID *pscid) 1310 { 1311 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 1312 FIXME("(%p)\n",This); 1313 return E_NOTIMPL; 1314 } 1315 1316 static ICOM_VTABLE(IShellFolder2) sfvt = 1317 { 1318 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 1319 IShellFolder_fnQueryInterface, 1320 IShellFolder_fnAddRef, 1321 IShellFolder_fnRelease, 1322 IShellFolder_fnParseDisplayName, 1323 IShellFolder_fnEnumObjects, 1324 IShellFolder_fnBindToObject, 1325 IShellFolder_fnBindToStorage, 1326 IShellFolder_fnCompareIDs, 1327 IShellFolder_fnCreateViewObject, 1328 IShellFolder_fnGetAttributesOf, 1329 IShellFolder_fnGetUIObjectOf, 1330 IShellFolder_fnGetDisplayNameOf, 1331 IShellFolder_fnSetNameOf, 1332 1333 /* ShellFolder2 */ 1334 IShellFolder_fnGetDefaultSearchGUID, 1335 IShellFolder_fnEnumSearches, 1336 IShellFolder_fnGetDefaultColumn, 1337 IShellFolder_fnGetDefaultColumnState, 1338 IShellFolder_fnGetDetailsEx, 1339 IShellFolder_fnGetDetailsOf, 1340 IShellFolder_fnMapNameToSCID 1342 1341 }; 1343 1342 … … 1347 1346 1348 1347 static 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); 1358 1357 } 1359 1358 1360 1359 static 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); 1368 1367 } 1369 1368 1370 1369 static 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); 1378 1377 } 1379 1378 … … 1386 1385 1387 1386 static 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 1411 1410 next: 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 1432 1431 /**************************************************************************** 1433 1432 * ISFHelper_fnAddFolder … … 1437 1436 1438 1437 static 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 else1471 {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; 1484 1483 } 1485 1484 … … 1490 1489 */ 1491 1490 static 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]; 1499 1498 BOOL bConfirm = TRUE; 1500 1499 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]; 1507 1506 snprintf(tmp, sizeof(tmp), "%d", cidl); 1508 if(!SHELL_WarnItemDelete(ASK_DELETE_MULTIPLE_ITEM, tmp))1507 if(!SHELL_WarnItemDelete(ASK_DELETE_MULTIPLE_ITEM, tmp)) 1509 1508 return E_FAIL; 1510 1509 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 { 1525 1524 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 { 1539 1538 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; 1549 1548 } 1550 1549 … … 1555 1554 */ 1556 1555 static 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_DummyRTTIVALUE1596 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 1592 static ICOM_VTABLE(ISFHelper) shvt = 1593 { 1594 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 1595 ISFHelper_fnQueryInterface, 1596 ISFHelper_fnAddRef, 1597 ISFHelper_fnRelease, 1598 ISFHelper_fnGetUniqueName, 1599 ISFHelper_fnAddFolder, 1600 ISFHelper_fnDeleteItems, 1601 ISFHelper_fnCopyItems, 1603 1602 }; 1604 1603 1605 1604 /*********************************************************************** 1606 * [Desktopfolder]IShellFolder implementation1605 * [Desktopfolder] IShellFolder implementation 1607 1606 */ 1608 1607 static struct ICOM_VTABLE(IShellFolder2) sfdvt; … … 1619 1618 1620 1619 /************************************************************************** 1621 * ISF_Desktop_Constructor1620 * ISF_Desktop_Constructor 1622 1621 * 1623 1622 */ 1624 1623 IShellFolder * ISF_Desktop_Constructor() 1625 1624 { 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_fnQueryInterface1625 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 1643 1642 * 1644 1643 * NOTES supports not IPersist/IPersistFolder 1645 1644 */ 1646 1645 static 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_fnParseDisplayName1646 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 1682 1681 * 1683 1682 * NOTES 1684 * "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds1685 * to MyComputer1683 * "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds 1684 * to MyComputer 1686 1685 */ 1687 1686 static 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 LPCWSTRszNext=NULL;1699 LPITEMIDLISTpidlTemp=NULL;1700 HRESULThr=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 else1718 {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_fnEnumObjects1687 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 1736 1735 */ 1737 1736 static 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_fnBindToObject1737 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 1759 1758 */ 1760 1759 static 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 GUIDconst * 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", 1768 1767 This,pidl,pbcReserved,debugstr_guid(riid),ppvOut); 1769 1768 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 else1788 {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_fnCreateViewObject1769 *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 1827 1826 */ 1828 1827 static HRESULT WINAPI ISF_Desktop_fnCreateViewObject( IShellFolder2 * iface, 1829 HWND hwndOwner, REFIID riid, LPVOID *ppvOut)1830 { 1831 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)1832 1833 LPSHELLVIEWpShellView;1834 HRESULThr = 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; 1864 1863 } 1865 1864 … … 1868 1867 */ 1869 1868 static 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 HRESULThr = 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_fnGetDisplayNameOf1869 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 1899 1898 * 1900 1899 * NOTES 1901 * special case: pidl = null gives desktop-name back1900 * special case: pidl = null gives desktop-name back 1902 1901 */ 1903 1902 static 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 CHARszPath[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 else1927 { 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; 1937 1936 } 1938 1937 1939 1938 static 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 } 1947 1946 static 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 } 1955 1954 static 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 } 1970 1969 static 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 } 1985 1984 static 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 } 1996 1995 static 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 else2018 {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 } 2044 2043 static 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_DummyRTTIVALUE2057 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_fnMapNameToSCID2044 IShellFolder2 * iface, 2045 LPCWSTR pwszName, 2046 SHCOLUMNID *pscid) 2047 { 2048 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 2049 FIXME("(%p)\n",This); 2050 return E_NOTIMPL; 2051 } 2052 2053 static ICOM_VTABLE(IShellFolder2) sfdvt = 2054 { 2055 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 2056 ISF_Desktop_fnQueryInterface, 2057 IShellFolder_fnAddRef, 2058 IShellFolder_fnRelease, 2059 ISF_Desktop_fnParseDisplayName, 2060 ISF_Desktop_fnEnumObjects, 2061 ISF_Desktop_fnBindToObject, 2062 IShellFolder_fnBindToStorage, 2063 IShellFolder_fnCompareIDs, 2064 ISF_Desktop_fnCreateViewObject, 2065 ISF_Desktop_fnGetAttributesOf, 2066 IShellFolder_fnGetUIObjectOf, 2067 ISF_Desktop_fnGetDisplayNameOf, 2068 IShellFolder_fnSetNameOf, 2069 2070 /* ShellFolder2 */ 2071 ISF_Desktop_fnGetDefaultSearchGUID, 2072 ISF_Desktop_fnEnumSearches, 2073 ISF_Desktop_fnGetDefaultColumn, 2074 ISF_Desktop_fnGetDefaultColumnState, 2075 ISF_Desktop_fnGetDetailsEx, 2076 ISF_Desktop_fnGetDetailsOf, 2077 ISF_Desktop_fnMapNameToSCID 2079 2078 }; 2080 2079 … … 2096 2095 2097 2096 /************************************************************************** 2098 * ISF_MyComputer_Constructor2097 * ISF_MyComputer_Constructor 2099 2098 */ 2100 2099 static IShellFolder * ISF_MyComputer_Constructor(void) 2101 2100 { 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_fnParseDisplayName2101 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 2122 2121 */ 2123 2122 static 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 HRESULThr = E_OUTOFMEMORY;2135 LPCWSTRszNext=NULL;2136 WCHARszElement[MAX_PATH];2137 CHARszTempA[MAX_PATH];2138 LPITEMIDLISTpidlTemp;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); 2152 2151 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 else2160 {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_fnEnumObjects2152 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 2177 2176 */ 2178 2177 static 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_fnBindToObject2178 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 2200 2199 */ 2201 2200 static 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 GUIDconst * clsid;2206 IShellFolder*pShellFolder, *pSubFolder;2207 LPITEMIDLISTpidltemp;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", 2210 2209 This,pidl,pbcReserved,debugstr_guid(riid),ppvOut); 2211 2210 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 else2224 {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_fnCreateViewObject2211 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 2250 2249 */ 2251 2250 static HRESULT WINAPI ISF_MyComputer_fnCreateViewObject( IShellFolder2 * iface, 2252 HWND hwndOwner, REFIID riid, LPVOID *ppvOut)2253 { 2254 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface)2255 2256 LPSHELLVIEWpShellView;2257 HRESULThr = 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; 2287 2286 } 2288 2287 … … 2291 2290 */ 2292 2291 static 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 HRESULThr = 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_fnGetDisplayNameOf2292 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 2321 2320 * 2322 2321 * 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. 2325 2324 */ 2326 2325 static 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 charszPath[MAX_PATH], szDrive[18];2335 intlen = 0;2336 BOOLbSimplePidl;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 else2357 {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; 2370 2369 2371 2370 #ifdef __WIN32OS2__ … … 2390 2389 } 2391 2390 #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); 2397 2396 #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; 2415 2414 } 2416 2415 2417 2416 static 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 } 2425 2424 static 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 } 2433 2432 static 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 } 2448 2447 static 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 } 2463 2462 static 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 } 2474 2473 2475 2474 /* fixme: drive size >4GB is rolling over */ 2476 2475 static 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 else2498 {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 } 2534 2533 static 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_DummyRTTIVALUE2547 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_fnMapNameToSCID2534 IShellFolder2 * iface, 2535 LPCWSTR pwszName, 2536 SHCOLUMNID *pscid) 2537 { 2538 _ICOM_THIS_From_IShellFolder2(IGenericSFImpl, iface) 2539 FIXME("(%p)\n",This); 2540 return E_NOTIMPL; 2541 } 2542 2543 static ICOM_VTABLE(IShellFolder2) sfmcvt = 2544 { 2545 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 2546 IShellFolder_fnQueryInterface, 2547 IShellFolder_fnAddRef, 2548 IShellFolder_fnRelease, 2549 ISF_MyComputer_fnParseDisplayName, 2550 ISF_MyComputer_fnEnumObjects, 2551 ISF_MyComputer_fnBindToObject, 2552 IShellFolder_fnBindToStorage, 2553 IShellFolder_fnCompareIDs, 2554 ISF_MyComputer_fnCreateViewObject, 2555 ISF_MyComputer_fnGetAttributesOf, 2556 IShellFolder_fnGetUIObjectOf, 2557 ISF_MyComputer_fnGetDisplayNameOf, 2558 IShellFolder_fnSetNameOf, 2559 2560 /* ShellFolder2 */ 2561 ISF_MyComputer_fnGetDefaultSearchGUID, 2562 ISF_MyComputer_fnEnumSearches, 2563 ISF_MyComputer_fnGetDefaultColumn, 2564 ISF_MyComputer_fnGetDefaultColumnState, 2565 ISF_MyComputer_fnGetDetailsEx, 2566 ISF_MyComputer_fnGetDetailsOf, 2567 ISF_MyComputer_fnMapNameToSCID 2569 2568 }; 2570 2569 … … 2575 2574 */ 2576 2575 static HRESULT WINAPI ISFPersistFolder2_QueryInterface( 2577 IPersistFolder2 *iface,2578 REFIIDiid,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); 2586 2585 } 2587 2586 … … 2591 2590 */ 2592 2591 static 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); 2600 2599 } 2601 2600 … … 2605 2604 */ 2606 2605 static 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); 2614 2613 } 2615 2614 … … 2618 2617 */ 2619 2618 static 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; 2631 2630 } 2632 2631 … … 2638 2637 */ 2639 2638 static HRESULT WINAPI ISFPersistFolder2_Initialize( 2640 IPersistFolder2 *iface,2641 LPCITEMIDLISTpidl)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; 2673 2672 } 2674 2673 … … 2677 2676 */ 2678 2677 static 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_DummyRTTIVALUE2696 ISFPersistFolder2_QueryInterface,2697 ISFPersistFolder2_AddRef,2698 ISFPersistFolder2_Release,2699 ISFPersistFolder2_GetClassID,2700 ISFPersistFolder2_Initialize,2701 ISFPersistFolder2_fnGetCurFolder2678 IPersistFolder2 * iface, 2679 LPITEMIDLIST * pidl) 2680 { 2681 _ICOM_THIS_From_IPersistFolder2(IGenericSFImpl, iface); 2682 2683 TRACE("(%p)->(%p)\n",This, pidl); 2684 2685 if (!pidl) return E_POINTER; 2686 2687 *pidl = ILClone(This->absPidl); 2688 2689 return S_OK; 2690 } 2691 2692 static ICOM_VTABLE(IPersistFolder2) psfvt = 2693 { 2694 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 2695 ISFPersistFolder2_QueryInterface, 2696 ISFPersistFolder2_AddRef, 2697 ISFPersistFolder2_Release, 2698 ISFPersistFolder2_GetClassID, 2699 ISFPersistFolder2_Initialize, 2700 ISFPersistFolder2_fnGetCurFolder 2702 2701 }; 2703 2702 … … 2706 2705 */ 2707 2706 static 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; 2729 2728 } 2730 2729 2731 2730 static 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); 2741 2740 } 2742 2741 2743 2742 static ULONG WINAPI ISFDropTarget_AddRef( IDropTarget *iface) 2744 2743 { 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); 2750 2749 } 2751 2750 2752 2751 static ULONG WINAPI ISFDropTarget_Release( IDropTarget *iface) 2753 2752 { 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); 2759 2758 } 2760 2759 2761 2760 static HRESULT WINAPI ISFDropTarget_DragEnter( 2762 IDropTarget*iface,2763 IDataObject*pDataObject,2764 DWORDdwKeyState,2765 POINTLpt,2766 DWORD*pdwEffect)2767 { 2768 FORMATETCfmt;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; 2781 2780 } 2782 2781 2783 2782 static HRESULT WINAPI ISFDropTarget_DragOver( 2784 IDropTarget*iface,2785 DWORDdwKeyState,2786 POINTLpt,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; 2798 2797 } 2799 2798 2800 2799 static 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; 2810 2809 } 2811 2810 2812 2811 static HRESULT WINAPI ISFDropTarget_Drop( 2813 IDropTarget*iface,2814 IDataObject*pDataObject,2815 DWORDdwKeyState,2816 POINTLpt,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_DummyRTTIVALUE2829 ISFDropTarget_QueryInterface,2830 ISFDropTarget_AddRef,2831 ISFDropTarget_Release,2832 ISFDropTarget_DragEnter,2833 ISFDropTarget_DragOver,2834 ISFDropTarget_DragLeave,2835 ISFDropTarget_Drop2812 IDropTarget *iface, 2813 IDataObject* pDataObject, 2814 DWORD dwKeyState, 2815 POINTL pt, 2816 DWORD *pdwEffect) 2817 { 2818 _ICOM_THIS_From_IDropTarget(IGenericSFImpl,iface); 2819 2820 FIXME("(%p) object dropped\n",This); 2821 2822 return E_NOTIMPL; 2823 } 2824 2825 static struct ICOM_VTABLE(IDropTarget) dtvt = 2826 { 2827 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 2828 ISFDropTarget_QueryInterface, 2829 ISFDropTarget_AddRef, 2830 ISFDropTarget_Release, 2831 ISFDropTarget_DragEnter, 2832 ISFDropTarget_DragOver, 2833 ISFDropTarget_DragLeave, 2834 ISFDropTarget_Drop 2836 2835 };
Note:
See TracChangeset
for help on using the changeset viewer.
