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