- Timestamp:
- Oct 27, 1999, 11:03:31 AM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/shell32/pidl.cpp
r1215 r1469 1 /* $Id: pidl.cpp,v 1.2 1999-10-09 11:17:00 sandervl Exp $ */ 1 /* $Id: pidl.cpp,v 1.3 1999-10-27 09:03:31 phaller Exp $ */ 2 2 3 /* 3 * pidl Handling 4 * 5 * Copyright 1998 Juergen Schmied 4 * Win32 SHELL32 for OS/2 5 * 6 * Copyright 1999 Patrick Haller (haller@zebra.fh-weingarten.de) 7 * Project Odin Software License can be found in LICENSE.TXT 8 * 9 * pidl Handling 10 * 11 * Copyright 1998 Juergen Schmied 6 12 * 7 13 * NOTES … … 9 15 * 10 16 */ 17 18 /***************************************************************************** 19 * Includes * 20 *****************************************************************************/ 21 22 #include <odin.h> 23 #include <odinwrap.h> 24 #include <os2sel.h> 11 25 12 26 #include <ctype.h> … … 14 28 #include <string.h> 15 29 #include <assert.h> 16 #include <odin.h>17 30 18 31 #define ICOM_CINTERFACE 1 … … 33 46 #include <misc.h> 34 47 35 DECLARE_DEBUG_CHANNEL(pidl) 36 DECLARE_DEBUG_CHANNEL(shell)48 49 ODINDEBUGCHANNEL(SHELL32-PIDL) 37 50 38 51 void pdump (LPCITEMIDLIST pidl) 39 { 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 52 { DWORD type; 53 char * szData; 54 char * szShortName; 55 char szName[MAX_PATH]; 56 BOOL bIsShellDebug; 57 58 LPITEMIDLIST pidltemp = pidl; 59 if (!TRACE_ON(pidl)) 60 return; 61 62 /* silence the sub-functions */ 63 bIsShellDebug = TRACE_ON(shell); 64 __SET_DEBUGGING(__DBCL_TRACE, dbch_shell, FALSE); 65 __SET_DEBUGGING(__DBCL_TRACE, dbch_pidl, FALSE); 66 67 if (! pidltemp) 68 { 69 MESSAGE ("-------- pidl=NULL (Desktop)\n"); 70 } 71 else 72 { 73 MESSAGE ("-------- pidl=%p\n", pidl); 74 if (pidltemp->mkid.cb) 75 { 76 do 77 { 78 type = _ILGetDataPointer(pidltemp)->type; 79 szData = _ILGetTextPointer(type, _ILGetDataPointer(pidltemp)); 80 szShortName = _ILGetSTextPointer(type, _ILGetDataPointer(pidltemp)); 81 _ILSimpleGetText(pidltemp, szName, MAX_PATH); 82 83 MESSAGE ("-- pidl=%p size=%u type=%lx name=%s (%s,%s)\n", 84 pidltemp, pidltemp->mkid.cb,type,szName,debugstr_a(szData), debugstr_a(szShortName)); 85 86 pidltemp = ILGetNext(pidltemp); 87 88 } while (pidltemp->mkid.cb); 89 } 90 else 91 { 92 MESSAGE ("empty pidl (Desktop)\n"); 93 } 94 } 95 96 __SET_DEBUGGING(__DBCL_TRACE, dbch_shell, bIsShellDebug); 97 __SET_DEBUGGING(__DBCL_TRACE, dbch_pidl, TRUE); 85 98 86 99 } … … 88 101 BOOL pcheck (LPCITEMIDLIST pidl) 89 102 { DWORD type, ret=TRUE; 90 103 BOOL bIsPidlDebug; 91 104 92 105 LPITEMIDLIST pidltemp = pidl; 93 106 94 95 107 bIsPidlDebug = TRACE_ON(shell); 108 __SET_DEBUGGING(__DBCL_TRACE, dbch_pidl, FALSE); 96 109 97 110 if (pidltemp && pidltemp->mkid.cb) … … 99 112 { type = _ILGetDataPointer(pidltemp)->type; 100 113 switch (type) 101 { case PT_DESKTOP: 102 case PT_MYCOMP: 103 case PT_SPECIAL: 104 case PT_DRIVE: 105 case PT_DRIVE1: 106 case PT_DRIVE2: 107 case PT_DRIVE3: 108 case PT_FOLDER: 109 case PT_VALUE: 110 case PT_FOLDER1: 111 case PT_WORKGRP: 112 case PT_COMP: 113 case PT_NETWORK: 114 case PT_SHARE: 115 case PT_IESPECIAL: 116 break; 117 default: 118 { 119 char szTemp[BYTES_PRINTED*4 + 1]; 120 int i; 121 unsigned char c; 122 123 memset(szTemp, ' ', BYTES_PRINTED*4 + 1); 124 for ( i = 0; (i<pidltemp->mkid.cb) && (i<BYTES_PRINTED); i++) 125 { 126 c = ((unsigned char *)pidltemp)[i]; 127 128 szTemp[i*3+0] = ((c>>4)>9)? (c>>4)+55 : (c>>4)+48; 129 szTemp[i*3+1] = ((0x0F&c)>9)? (0x0F&c)+55 : (0x0F&c)+48; 130 szTemp[i*3+2] = ' '; 131 szTemp[i+BYTES_PRINTED*3] = (c>=0x20 && c <=0x80) ? c : '.'; 132 } 133 szTemp[BYTES_PRINTED*4] = 0x00; 134 ERR_(pidl)("unknown IDLIST type size=%u type=%lx\n%s\n",pidltemp->mkid.cb,type, szTemp); 135 ret = FALSE; 136 } 137 } 138 pidltemp = ILGetNext(pidltemp); 139 } while (pidltemp->mkid.cb); 140 } 141 __SET_DEBUGGING(__DBCL_TRACE, dbch_pidl, bIsPidlDebug); 142 return ret; 143 } 144 145 /************************************************************************* 146 * ILGetDisplayName [SHELL32.15] 147 */ 148 BOOL WINAPI ILGetDisplayName(LPCITEMIDLIST pidl,LPSTR path) 149 { 150 TRACE_(shell)("pidl=%p %p semi-stub\n",pidl,path); 151 return SHGetPathFromIDListA(pidl, path); 152 } 114 { case PT_DESKTOP: 115 case PT_MYCOMP: 116 case PT_SPECIAL: 117 case PT_DRIVE: 118 case PT_DRIVE1: 119 case PT_DRIVE2: 120 case PT_DRIVE3: 121 case PT_FOLDER: 122 case PT_VALUE: 123 case PT_FOLDER1: 124 case PT_WORKGRP: 125 case PT_COMP: 126 case PT_NETWORK: 127 case PT_SHARE: 128 case PT_IESPECIAL: 129 break; 130 default: 131 { 132 char szTemp[BYTES_PRINTED*4 + 1]; 133 int i; 134 unsigned char c; 135 136 memset(szTemp, ' ', BYTES_PRINTED*4 + 1); 137 for ( i = 0; (i<pidltemp->mkid.cb) && (i<BYTES_PRINTED); i++) 138 { 139 c = ((unsigned char *)pidltemp)[i]; 140 141 szTemp[i*3+0] = ((c>>4)>9)? (c>>4)+55 : (c>>4)+48; 142 szTemp[i*3+1] = ((0x0F&c)>9)? (0x0F&c)+55 : (0x0F&c)+48; 143 szTemp[i*3+2] = ' '; 144 szTemp[i+BYTES_PRINTED*3] = (c>=0x20 && c <=0x80) ? c : '.'; 145 } 146 szTemp[BYTES_PRINTED*4] = 0x00; 147 ERR_(pidl)("unknown IDLIST type size=%u type=%lx\n%s\n",pidltemp->mkid.cb,type, szTemp); 148 ret = FALSE; 149 } 150 } 151 pidltemp = ILGetNext(pidltemp); 152 } while (pidltemp->mkid.cb); 153 } 154 __SET_DEBUGGING(__DBCL_TRACE, dbch_pidl, bIsPidlDebug); 155 return ret; 156 } 157 158 /************************************************************************* 159 * ILGetDisplayName [SHELL32.15] 160 */ 161 162 ODINFUNCTION2(BOOL,ILGetDisplayName,LPCITEMIDLIST, pidl, 163 LPSTR, path) 164 { 165 TRACE_(shell)("pidl=%p %p semi-stub\n",pidl,path); 166 return SHGetPathFromIDListA(pidl, path); 167 } 168 169 153 170 /************************************************************************* 154 171 * ILFindLastID [SHELL32.16] … … 157 174 * observed: pidl=Desktop return=pidl 158 175 */ 159 LPITEMIDLIST WINAPI ILFindLastID(LPITEMIDLIST pidl) 160 { LPITEMIDLIST pidlLast = pidl; 161 162 TRACE_(pidl)("(pidl=%p)\n",pidl); 163 164 while (pidl->mkid.cb) 165 { 166 pidlLast = pidl; 167 pidl = ILGetNext(pidl); 168 } 169 return pidlLast; 176 177 ODINFUNCTION1(LPITEMIDLIST,ILFindLastID,LPITEMIDLIST, pidl) 178 { LPITEMIDLIST pidlLast = pidl; 179 180 while (pidl->mkid.cb) 181 { 182 pidlLast = pidl; 183 pidl = ILGetNext(pidl); 184 } 185 return pidlLast; 170 186 } 171 187 /************************************************************************* … … 175 191 * when pidl=Desktop return=FALSE 176 192 */ 177 BOOL WINAPI ILRemoveLastID(LPCITEMIDLIST pidl) 178 { 179 TRACE_(shell)("pidl=%p\n",pidl); 180 181 if (!pidl || !pidl->mkid.cb) 182 return 0; 183 ILFindLastID(pidl)->mkid.cb = 0; 184 return 1; 193 194 ODINFUNCTION1(BOOL,ILRemoveLastID,LPCITEMIDLIST, pidl) 195 { 196 if (!pidl || !pidl->mkid.cb) 197 return 0; 198 ILFindLastID(pidl)->mkid.cb = 0; 199 return 1; 185 200 } 186 201 … … 191 206 * dupicate an idlist 192 207 */ 193 LPITEMIDLIST WINAPI ILClone (LPCITEMIDLIST pidl) 208 209 ODINFUNCTION1(LPITEMIDLIST,ILClone,LPCITEMIDLIST,pidl) 194 210 { DWORD len; 195 211 LPITEMIDLIST newpidl; … … 208 224 return newpidl; 209 225 } 226 227 210 228 /************************************************************************* 211 229 * ILCloneFirst [SHELL32.19] … … 214 232 * duplicates the first idlist of a complex pidl 215 233 */ 216 LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl) 217 { DWORD len; 218 LPITEMIDLIST pidlNew = NULL;219 220 TRACE_(pidl)("pidl=%p \n",pidl); 221 222 223 224 225 len = pidl->mkid.cb; 226 227 228 229 memcpy(pidlNew,pidl,len+2);/* 2 -> mind a desktop pidl */230 231 232 233 234 235 236 237 234 235 ODINFUNCTION1(LPITEMIDLIST,ILCloneFirst,LPCITEMIDLIST,pidl) 236 { DWORD len; 237 LPITEMIDLIST pidlNew = NULL; 238 239 pdump(pidl); 240 241 if (pidl) 242 { 243 len = pidl->mkid.cb; 244 pidlNew = (LPITEMIDLIST) SHAlloc (len+2); 245 if (pidlNew) 246 { 247 memcpy(pidlNew,pidl,len+2); /* 2 -> mind a desktop pidl */ 248 249 if (len) 250 ILGetNext(pidlNew)->mkid.cb = 0x00; 251 } 252 } 253 TRACE_(pidl)("-- newpidl=%p\n",pidlNew); 254 255 return pidlNew; 238 256 } 239 257 /************************************************************************* … … 243 261 * the first two bytes are the len, the pidl is following then 244 262 */ 245 HRESULT WINAPI ILLoadFromStream (IStream * pStream, LPITEMIDLIST * ppPidl) 246 { WORD wLen = 0; 247 DWORD dwBytesRead; 248 HRESULT ret = E_FAIL; 249 250 251 TRACE_(shell)("%p %p\n", pStream , ppPidl); 252 253 if (*ppPidl) 254 { SHFree(*ppPidl); 255 *ppPidl = NULL; 256 } 257 258 IStream_AddRef (pStream); 259 260 if (SUCCEEDED(IStream_Read(pStream, (LPVOID)&wLen, 2, &dwBytesRead))) 261 { *ppPidl = (ITEMIDLIST*)SHAlloc (wLen); 262 if (SUCCEEDED(IStream_Read(pStream, *ppPidl , wLen, &dwBytesRead))) 263 { ret = S_OK; 264 } 265 else 266 { SHFree(*ppPidl); 267 *ppPidl = NULL; 268 } 269 } 270 271 /* we are not jet fully compatible */ 272 if (!pcheck(*ppPidl)) 273 { SHFree(*ppPidl); 274 *ppPidl = NULL; 275 } 276 277 278 IStream_Release (pStream); 279 280 return ret; 281 } 282 /************************************************************************* 283 * SHILCreateFromPath [SHELL32.28] 263 264 ODINFUNCTION2(HRESULT,ILLoadFromStream,IStream*, pStream, 265 LPITEMIDLIST*, ppPidl) 266 { WORD wLen = 0; 267 DWORD dwBytesRead; 268 HRESULT ret = E_FAIL; 269 270 if (*ppPidl) 271 { SHFree(*ppPidl); 272 *ppPidl = NULL; 273 } 274 275 IStream_AddRef (pStream); 276 277 if (SUCCEEDED(IStream_Read(pStream, (LPVOID)&wLen, 2, &dwBytesRead))) 278 { *ppPidl = (ITEMIDLIST*)SHAlloc (wLen); 279 if (SUCCEEDED(IStream_Read(pStream, *ppPidl , wLen, &dwBytesRead))) 280 { ret = S_OK; 281 } 282 else 283 { SHFree(*ppPidl); 284 *ppPidl = NULL; 285 } 286 } 287 288 /* we are not jet fully compatible */ 289 if (!pcheck(*ppPidl)) 290 { SHFree(*ppPidl); 291 *ppPidl = NULL; 292 } 293 294 295 IStream_Release (pStream); 296 297 return ret; 298 } 299 /************************************************************************* 300 * SHILCreateFromPath [SHELL32.28] 284 301 * 285 302 * NOTES 286 303 * wraper for IShellFolder::ParseDisplayName() 287 304 */ 288 HRESULT WINAPI SHILCreateFromPathA (LPCSTR path, LPITEMIDLIST * ppidl, DWORD * attributes) 289 { LPSHELLFOLDER sf; 290 WCHAR lpszDisplayName[MAX_PATH]; 291 DWORD pchEaten; 292 HRESULT ret = E_FAIL; 293 294 TRACE_(shell)("%s %p 0x%08lx\n",path,ppidl,attributes?*attributes:0); 295 296 LocalToWideChar(lpszDisplayName, (LPSTR)path, MAX_PATH); 297 298 if (SUCCEEDED (SHGetDesktopFolder(&sf))) 299 { 300 ret = IShellFolder_ParseDisplayName(sf,0, NULL,lpszDisplayName,&pchEaten,ppidl,attributes); 301 IShellFolder_Release(sf); 302 } 303 return ret; 304 } 305 HRESULT WINAPI SHILCreateFromPathW (LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * attributes) 306 { LPSHELLFOLDER sf; 307 DWORD pchEaten; 308 HRESULT ret = E_FAIL; 309 310 TRACE_(shell)("%s %p 0x%08lx\n",debugstr_w(path),ppidl,attributes?*attributes:0); 311 312 if (SUCCEEDED (SHGetDesktopFolder(&sf))) 313 { 314 ret = IShellFolder_ParseDisplayName(sf,0, NULL, (LPOLESTR)path, &pchEaten, ppidl, attributes); 315 IShellFolder_Release(sf); 316 } 317 return ret; 318 } 319 HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * ppidl, DWORD * attributes) 320 { 321 if ( VERSION_OsIsUnicode()) 322 return SHILCreateFromPathW ((LPCWSTR)path, ppidl, attributes); 323 return SHILCreateFromPathA ((LPCSTR)path, ppidl, attributes); 305 306 ODINFUNCTION3(HRESULT,SHILCreateFromPathA,LPCSTR, path, 307 LPITEMIDLIST*, ppidl, 308 DWORD*, attributes) 309 { LPSHELLFOLDER sf; 310 WCHAR lpszDisplayName[MAX_PATH]; 311 DWORD pchEaten; 312 HRESULT ret = E_FAIL; 313 314 LocalToWideChar(lpszDisplayName, (LPSTR)path, MAX_PATH); 315 316 if (SUCCEEDED (SHGetDesktopFolder(&sf))) 317 { 318 ret = IShellFolder_ParseDisplayName(sf,0, NULL,lpszDisplayName,&pchEaten,ppidl,attributes); 319 IShellFolder_Release(sf); 320 } 321 return ret; 322 } 323 324 ODINFUNCTION3(HRESULT,SHILCreateFromPathW,LPCWSTR, path, 325 LPITEMIDLIST*, ppidl, 326 DWORD*, attributes) 327 { LPSHELLFOLDER sf; 328 DWORD pchEaten; 329 HRESULT ret = E_FAIL; 330 331 if (SUCCEEDED (SHGetDesktopFolder(&sf))) 332 { 333 ret = IShellFolder_ParseDisplayName(sf,0, NULL, (LPOLESTR)path, &pchEaten, ppidl, attributes); 334 IShellFolder_Release(sf); 335 } 336 return ret; 337 } 338 339 ODINFUNCTION3(HRESULT,SHILCreateFromPathAW,LPCVOID, path, 340 LPITEMIDLIST*, ppidl, 341 DWORD*, attributes) 342 { 343 if ( VERSION_OsIsUnicode()) 344 return SHILCreateFromPathW ((LPCWSTR)path, ppidl, attributes); 345 return SHILCreateFromPathA ((LPCSTR)path, ppidl, attributes); 324 346 } 325 347 … … 328 350 * 329 351 * PARAMETERS 330 * hwndOwner 331 * nFolder [in]CSIDL_xxxxx ??352 * hwndOwner [in] 353 * nFolder [in] CSIDL_xxxxx ?? 332 354 * 333 355 * RETURNS … … 336 358 * exported by ordinal 337 359 */ 338 LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner,DWORD nFolder,DWORD x3) 339 { LPITEMIDLIST ppidl; 340 WARN_(shell)("(hwnd=0x%x,csidl=0x%lx,0x%lx):semi-stub.\n", 341 hwndOwner,nFolder,x3); 342 343 SHGetSpecialFolderLocation(hwndOwner, nFolder, &ppidl); 344 345 return ppidl; 360 361 ODINFUNCTION3(LPITEMIDLIST,SHCloneSpecialIDList,HWND, hwndOwner, 362 DWORD, nFolder, 363 DWORD, x3) 364 { LPITEMIDLIST ppidl; 365 WARN_(shell)("(hwnd=0x%x,csidl=0x%lx,0x%lx):semi-stub.\n", 366 hwndOwner,nFolder,x3); 367 368 SHGetSpecialFolderLocation(hwndOwner, nFolder, &ppidl); 369 370 return ppidl; 346 371 } 347 372 … … 350 375 * 351 376 */ 352 LPITEMIDLIST WINAPI ILGlobalClone(LPCITEMIDLIST pidl) 353 { DWORD len; 354 LPITEMIDLIST newpidl; 355 356 if (!pidl) 357 return NULL; 358 359 len = ILGetSize(pidl); 360 newpidl = (LPITEMIDLIST)pCOMCTL32_Alloc(len); 361 if (newpidl) 362 memcpy(newpidl,pidl,len); 363 364 TRACE_(pidl)("pidl=%p newpidl=%p\n",pidl, newpidl); 365 pdump(pidl); 366 367 return newpidl; 377 378 ODINFUNCTION1(LPITEMIDLIST,ILGlobalClone,LPCITEMIDLIST, pidl) 379 { DWORD len; 380 LPITEMIDLIST newpidl; 381 382 if (!pidl) 383 return NULL; 384 385 len = ILGetSize(pidl); 386 newpidl = (LPITEMIDLIST)pCOMCTL32_Alloc(len); 387 if (newpidl) 388 memcpy(newpidl,pidl,len); 389 390 TRACE_(pidl)("pidl=%p newpidl=%p\n",pidl, newpidl); 391 pdump(pidl); 392 393 return newpidl; 368 394 } 369 395 … … 372 398 * 373 399 */ 374 BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) 375 { 376 char szData1[MAX_PATH]; 377 char szData2[MAX_PATH]; 378 379 LPITEMIDLIST pidltemp1 = pidl1;380 LPITEMIDLIST pidltemp2 = pidl2; 381 382 TRACE_(pidl)("pidl1=%p pidl2=%p\n",pidl1, pidl2);383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 } 404 405 406 407 408 409 410 400 401 ODINFUNCTION2(BOOL,ILIsEqual,LPCITEMIDLIST, pidl1, 402 LPCITEMIDLIST, pidl2) 403 { 404 char szData1[MAX_PATH]; 405 char szData2[MAX_PATH]; 406 407 LPITEMIDLIST pidltemp1 = pidl1; 408 LPITEMIDLIST pidltemp2 = pidl2; 409 410 /* explorer reads from registry directly (StreamMRU), 411 so we can only check here */ 412 if ((!pcheck (pidl1)) || (!pcheck (pidl2))) return FALSE; 413 414 pdump (pidl1); 415 pdump (pidl2); 416 417 if ( (!pidl1) || (!pidl2) ) return FALSE; 418 419 while (pidltemp1->mkid.cb && pidltemp2->mkid.cb) 420 { 421 _ILSimpleGetText(pidltemp1, szData1, MAX_PATH); 422 _ILSimpleGetText(pidltemp2, szData2, MAX_PATH); 423 424 if (strcmp ( szData1, szData2 )!=0 ) 425 return FALSE; 426 427 pidltemp1 = ILGetNext(pidltemp1); 428 pidltemp2 = ILGetNext(pidltemp2); 429 } 430 431 if (!pidltemp1->mkid.cb && !pidltemp2->mkid.cb) 432 { 433 return TRUE; 434 } 435 436 return FALSE; 411 437 } 412 438 /************************************************************************* 413 439 * ILIsParent [SHELL32.23] 414 440 * 415 * parent=a/b child=a/b/c -> true, c is in folder a/b 416 * child=a/b/c/d -> false if bImmediate is true, d is not in folder a/b 417 * child=a/b/c/d -> true if bImmediate is false, d is in a subfolder of a/b 418 */ 419 BOOL WINAPI ILIsParent( LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL bImmediate) 420 { 421 char szData1[MAX_PATH]; 422 char szData2[MAX_PATH]; 423 424 LPITEMIDLIST pParent = pidlParent; 425 LPITEMIDLIST pChild = pidlChild; 426 427 TRACE_(pidl)("%p %p %x\n", pidlParent, pidlChild, bImmediate); 428 429 while (pParent->mkid.cb && pChild->mkid.cb) 430 { 431 _ILSimpleGetText(pParent, szData1, MAX_PATH); 432 _ILSimpleGetText(pChild, szData2, MAX_PATH); 433 434 if (strcmp ( szData1, szData2 )!=0 ) 435 return FALSE; 436 437 pParent = ILGetNext(pParent); 438 pChild = ILGetNext(pChild); 439 } 440 441 if ( pParent->mkid.cb || ! pChild->mkid.cb) /* child shorter or has equal length to parent */ 442 return FALSE; 443 444 if ( ILGetNext(pChild)->mkid.cb && bImmediate) /* not immediate descent */ 445 return FALSE; 446 447 return TRUE; 441 * parent=a/b child=a/b/c -> true, c is in folder a/b 442 * child=a/b/c/d -> false if bImmediate is true, d is not in folder a/b 443 * child=a/b/c/d -> true if bImmediate is false, d is in a subfolder of a/b 444 */ 445 446 ODINFUNCTION3(BOOL,ILIsParent,LPCITEMIDLIST, pidlParent, 447 LPCITEMIDLIST, pidlChild, 448 BOOL, bImmediate) 449 { 450 char szData1[MAX_PATH]; 451 char szData2[MAX_PATH]; 452 453 LPITEMIDLIST pParent = pidlParent; 454 LPITEMIDLIST pChild = pidlChild; 455 456 while (pParent->mkid.cb && pChild->mkid.cb) 457 { 458 _ILSimpleGetText(pParent, szData1, MAX_PATH); 459 _ILSimpleGetText(pChild, szData2, MAX_PATH); 460 461 if (strcmp ( szData1, szData2 )!=0 ) 462 return FALSE; 463 464 pParent = ILGetNext(pParent); 465 pChild = ILGetNext(pChild); 466 } 467 468 if ( pParent->mkid.cb || ! pChild->mkid.cb) /* child shorter or has equal length to parent */ 469 return FALSE; 470 471 if ( ILGetNext(pChild)->mkid.cb && bImmediate) /* not immediate descent */ 472 return FALSE; 473 474 return TRUE; 448 475 } 449 476 … … 454 481 * Compares elements from pidl1 and pidl2. 455 482 * 456 * pidl1 is desktop 457 * pidl1 shorter pidl2 458 * 459 * pidl2 shorter pidl1 460 * pidl2 equal pidl1 461 */ 462 LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2) 463 { 464 char szData1[MAX_PATH]; 465 char szData2[MAX_PATH]; 466 467 LPITEMIDLIST pidltemp1 = pidl1;468 LPITEMIDLIST pidltemp2 = pidl2; 469 LPITEMIDLIST ret=NULL;470 471 TRACE_(pidl)("pidl1=%p pidl2=%p\n",pidl1, pidl2);472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 ret = pidltemp2; 498 499 500 501 502 503 504 505 506 483 * pidl1 is desktop pidl2 484 * pidl1 shorter pidl2 pointer to first different element of pidl2 485 * if there was at least one equal element 486 * pidl2 shorter pidl1 0 487 * pidl2 equal pidl1 pointer to last 0x00-element of pidl2 488 */ 489 490 ODINFUNCTION2(LPITEMIDLIST,ILFindChild,LPCITEMIDLIST, pidl1, 491 LPCITEMIDLIST, pidl2) 492 { 493 char szData1[MAX_PATH]; 494 char szData2[MAX_PATH]; 495 496 LPITEMIDLIST pidltemp1 = pidl1; 497 LPITEMIDLIST pidltemp2 = pidl2; 498 LPITEMIDLIST ret=NULL; 499 500 /* explorer reads from registry directly (StreamMRU), 501 so we can only check here */ 502 if ((!pcheck (pidl1)) || (!pcheck (pidl2))) 503 return FALSE; 504 505 pdump (pidl1); 506 pdump (pidl2); 507 508 if ( _ILIsDesktop(pidl1) ) 509 { 510 ret = pidl2; 511 } 512 else 513 { 514 while (pidltemp1->mkid.cb && pidltemp2->mkid.cb) 515 { 516 _ILSimpleGetText(pidltemp1, szData1, MAX_PATH); 517 _ILSimpleGetText(pidltemp2, szData2, MAX_PATH); 518 519 if (strcmp(szData1,szData2)) 520 break; 521 522 pidltemp1 = ILGetNext(pidltemp1); 523 pidltemp2 = ILGetNext(pidltemp2); 524 ret = pidltemp2; 525 } 526 527 if (pidltemp1->mkid.cb) 528 { 529 ret = NULL; /* elements of pidl1 left*/ 530 } 531 } 532 TRACE_(shell)("--- %p\n", ret); 533 return ret; /* pidl 1 is shorter */ 507 534 } 508 535 … … 515 542 * Does not destroy the passed in idlists! 516 543 */ 517 LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2) 518 { 519 DWORD len1,len2; 520 LPITEMIDLIST pidlNew; 521 522 TRACE_(pidl)("pidl=%p pidl=%p\n",pidl1,pidl2);523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 544 545 ODINFUNCTION2(LPITEMIDLIST, ILCombine, LPCITEMIDLIST, pidl1, 546 LPCITEMIDLIST, pidl2) 547 { 548 DWORD len1,len2; 549 LPITEMIDLIST pidlNew; 550 551 if(!pidl1 && !pidl2) return NULL; 552 553 pdump (pidl1); 554 pdump (pidl2); 555 556 if(!pidl1) 557 { 558 pidlNew = ILClone(pidl2); 559 return pidlNew; 560 } 561 562 if(!pidl2) 563 { 564 pidlNew = ILClone(pidl1); 565 return pidlNew; 566 } 567 568 len1 = ILGetSize(pidl1)-2; 569 len2 = ILGetSize(pidl2); 570 pidlNew = (ITEMIDLIST*)SHAlloc(len1+len2); 571 572 if (pidlNew) 573 { 574 memcpy(pidlNew,pidl1,len1); 575 memcpy(((BYTE *)pidlNew)+len1,pidl2,len2); 576 } 577 578 /* TRACE(pidl,"--new pidl=%p\n",pidlNew);*/ 579 return pidlNew; 553 580 } 554 581 /************************************************************************* … … 557 584 * NOTES 558 585 */ 559 LPITEMIDLIST WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPITEMIDLIST pidl, DWORD z) 560 { 561 FIXME_(pidl)("sf=%p pidl=%p 0x%04lx\n",lpsf,pidl,z); 562 563 pdump (pidl); 564 return 0; 586 587 ODINFUNCTION3(LPITEMIDLIST, SHGetRealIDL, LPSHELLFOLDER, lpsf, 588 LPITEMIDLIST, pidl, 589 DWORD, z) 590 { 591 FIXME_(pidl)("sf=%p pidl=%p 0x%04lx\n",lpsf,pidl,z); 592 593 pdump (pidl); 594 return 0; 565 595 } 566 596 … … 569 599 * 570 600 * NOTES 571 * pild = CSIDL_DESKTOP ret = 0 572 * pild = CSIDL_DRIVES ret = 0 573 */ 574 LPITEMIDLIST WINAPI SHLogILFromFSIL(LPITEMIDLIST pidl) 575 { 576 FIXME_(pidl)("(pidl=%p)\n",pidl); 577 578 pdump(pidl); 579 580 return 0; 601 * pild = CSIDL_DESKTOP ret = 0 602 * pild = CSIDL_DRIVES ret = 0 603 */ 604 605 ODINFUNCTION1(LPITEMIDLIST,SHLogILFromFSIL,LPITEMIDLIST,pidl) 606 { 607 FIXME_(pidl)("(pidl=%p)\n",pidl); 608 609 pdump(pidl); 610 611 return 0; 581 612 } 582 613 … … 594 625 * exported by ordinal 595 626 */ 596 DWORD WINAPI ILGetSize(LPITEMIDLIST pidl) 597 { 598 LPSHITEMID si = &(pidl->mkid); 599 DWORD len=0; 600 601 if (pidl) 602 { while (si->cb) 603 { len += si->cb; 604 si = (LPSHITEMID)(((LPBYTE)si)+si->cb); 605 } 606 len += 2; 607 } 608 TRACE_(pidl)("pidl=%p size=%lu\n",pidl, len); 609 return len; 627 628 ODINFUNCTION1(DWORD,ILGetSize,LPITEMIDLIST,pidl) 629 { 630 LPSHITEMID si = &(pidl->mkid); 631 DWORD len=0; 632 633 if (pidl) 634 { while (si->cb) 635 { len += si->cb; 636 si = (LPSHITEMID)(((LPBYTE)si)+si->cb); 637 } 638 len += 2; 639 } 640 TRACE_(pidl)("pidl=%p size=%lu\n",pidl, len); 641 return len; 610 642 } 611 643 … … 620 652 * 621 653 */ 622 LPITEMIDLIST WINAPI ILGetNext(LPITEMIDLIST pidl) 623 { 624 WORD len; 625 626 TRACE_(pidl)("(pidl=%p)\n",pidl); 627 628 if(pidl) 629 { 630 len = pidl->mkid.cb; 631 if (len) 632 { 633 pidl = (LPITEMIDLIST) (((LPBYTE)pidl)+len); 634 return pidl; 635 } 636 } 637 return NULL; 654 655 ODINFUNCTION1(LPITEMIDLIST,ILGetNext,LPITEMIDLIST,pidl) 656 { 657 WORD len; 658 659 if(pidl) 660 { 661 len = pidl->mkid.cb; 662 if (len) 663 { 664 pidl = (LPITEMIDLIST) (((LPBYTE)pidl)+len); 665 return pidl; 666 } 667 } 668 return NULL; 638 669 } 639 670 /************************************************************************* … … 646 677 * Destroys the passed in idlist! (???) 647 678 */ 648 LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl,LPCITEMIDLIST item,BOOL bEnd) 649 { 650 LPITEMIDLIST idlRet; 651 652 WARN_(pidl)("(pidl=%p,pidl=%p,%08u)semi-stub\n",pidl,item,bEnd); 653 654 pdump (pidl); 655 pdump (item); 656 657 if (_ILIsDesktop(pidl)) 658 { 659 idlRet = ILClone(item); 660 if (pidl) 661 SHFree (pidl); 662 return idlRet; 663 } 664 665 if (bEnd) 666 { 667 idlRet=ILCombine(pidl,item); 668 } 669 else 670 { 671 idlRet=ILCombine(item,pidl); 672 } 673 674 SHFree(pidl); 675 return idlRet; 679 680 ODINFUNCTION3(LPITEMIDLIST,ILAppend,LPITEMIDLIST, pidl, 681 LPCITEMIDLIST, item, 682 BOOL, bEnd) 683 { 684 LPITEMIDLIST idlRet; 685 686 WARN_(pidl)("(pidl=%p,pidl=%p,%08u)semi-stub\n",pidl,item,bEnd); 687 688 pdump (pidl); 689 pdump (item); 690 691 if (_ILIsDesktop(pidl)) 692 { 693 idlRet = ILClone(item); 694 if (pidl) 695 SHFree (pidl); 696 return idlRet; 697 } 698 699 if (bEnd) 700 { 701 idlRet=ILCombine(pidl,item); 702 } 703 else 704 { 705 idlRet=ILCombine(item,pidl); 706 } 707 708 SHFree(pidl); 709 return idlRet; 676 710 } 677 711 /************************************************************************* … … 683 717 * exported by ordinal 684 718 */ 685 DWORD WINAPI ILFree(LPITEMIDLIST pidl) 686 { TRACE_(pidl)("(pidl=0x%08lx)\n",(DWORD)pidl); 687 688 if (!pidl) 689 return FALSE; 690 691 return SHFree(pidl); 719 720 ODINFUNCTION1(DWORD,ILFree,LPITEMIDLIST, pidl) 721 { TRACE_(pidl)("(pidl=0x%08lx)\n",(DWORD)pidl); 722 723 if (!pidl) 724 return FALSE; 725 726 return SHFree(pidl); 692 727 } 693 728 /************************************************************************* … … 695 730 * 696 731 */ 697 DWORD WINAPI ILGlobalFree( LPITEMIDLIST pidl) 698 { 699 TRACE_(pidl)("%p\n",pidl); 700 701 if (!pidl) 702 return FALSE; 703 704 return pCOMCTL32_Free (pidl); 732 733 ODINFUNCTION1(DWORD,ILGlobalFree,LPITEMIDLIST, pidl) 734 { 735 TRACE_(pidl)("%p\n",pidl); 736 737 if (!pidl) 738 return FALSE; 739 740 return pCOMCTL32_Free (pidl); 705 741 } 706 742 /************************************************************************* … … 708 744 * 709 745 */ 710 LPITEMIDLIST WINAPI ILCreateFromPathA (LPCSTR path) 711 { 712 LPITEMIDLIST pidlnew; 713 DWORD attributes = 0; 714 715 TRACE_(shell)("%s\n",path); 716 717 if (SUCCEEDED (SHILCreateFromPathA (path, &pidlnew, &attributes))) 718 return pidlnew; 719 return FALSE; 720 } 721 LPITEMIDLIST WINAPI ILCreateFromPathW (LPCWSTR path) 722 { 723 LPITEMIDLIST pidlnew; 724 DWORD attributes = 0; 725 726 TRACE_(shell)("%s\n",debugstr_w(path)); 727 728 if (SUCCEEDED (SHILCreateFromPathW (path, &pidlnew, &attributes))) 729 return pidlnew; 730 return FALSE; 731 } 732 LPITEMIDLIST WINAPI ILCreateFromPathAW (LPCVOID path) 733 { 734 if ( VERSION_OsIsUnicode()) 735 return ILCreateFromPathW ((LPCWSTR)path); 736 return ILCreateFromPathA ((LPCSTR)path); 746 747 ODINFUNCTION1(LPITEMIDLIST,ILCreateFromPathA,LPCSTR,path) 748 { 749 LPITEMIDLIST pidlnew; 750 DWORD attributes = 0; 751 752 TRACE_(shell)("%s\n",path); 753 754 if (SUCCEEDED (SHILCreateFromPathA (path, &pidlnew, &attributes))) 755 return pidlnew; 756 return FALSE; 757 } 758 759 ODINFUNCTION1(LPITEMIDLIST,ILCreateFromPathW,LPCWSTR,path) 760 { 761 LPITEMIDLIST pidlnew; 762 DWORD attributes = 0; 763 764 TRACE_(shell)("%s\n",debugstr_w(path)); 765 766 if (SUCCEEDED (SHILCreateFromPathW (path, &pidlnew, &attributes))) 767 return pidlnew; 768 return FALSE; 769 } 770 771 ODINFUNCTION1(LPITEMIDLIST,ILCreateFromPathAW,LPCVOID,path) 772 { 773 if ( VERSION_OsIsUnicode()) 774 return ILCreateFromPathW ((LPCWSTR)path); 775 return ILCreateFromPathA ((LPCSTR)path); 737 776 } 738 777 /************************************************************************* 739 778 * SHSimpleIDListFromPath [SHELL32.162] 740 779 */ 741 LPITEMIDLIST WINAPI SHSimpleIDListFromPathA (LPSTR lpszPath) 742 { 743 LPITEMIDLIST pidl=NULL; 744 HANDLE hFile; 745 WIN32_FIND_DATAA stffile; 746 747 TRACE_(pidl)("path=%s\n", lpszPath); 748 749 if (!lpszPath) return NULL; 750 751 hFile = FindFirstFileA(lpszPath, &stffile); 752 753 if ( hFile != INVALID_HANDLE_VALUE ) 754 { 755 if (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 756 { 757 pidl = _ILCreateFolder (&stffile); 758 } 759 else 760 { 761 pidl = _ILCreateValue (&stffile); 762 } 763 FindClose (hFile); 764 } 765 return pidl; 766 } 767 LPITEMIDLIST WINAPI SHSimpleIDListFromPathW (LPWSTR lpszPath) 768 { 769 char lpszTemp[MAX_PATH]; 770 TRACE_(pidl)("path=L%s\n",debugstr_w(lpszPath)); 771 772 WideCharToLocal(lpszTemp, lpszPath, MAX_PATH); 773 774 return SHSimpleIDListFromPathA (lpszTemp); 775 } 776 777 LPITEMIDLIST WINAPI SHSimpleIDListFromPathAW (LPVOID lpszPath) 778 { 779 if ( VERSION_OsIsUnicode()) 780 return SHSimpleIDListFromPathW ((LPWSTR)lpszPath); 781 return SHSimpleIDListFromPathA ((LPSTR)lpszPath); 782 } 783 784 /************************************************************************* 785 * SHGetSpecialFolderLocation [SHELL32.223] 780 781 ODINFUNCTION1(LPITEMIDLIST,SHSimpleIDListFromPathA,LPSTR, lpszPath) 782 { 783 LPITEMIDLIST pidl=NULL; 784 HANDLE hFile; 785 WIN32_FIND_DATAA stffile; 786 787 if (!lpszPath) return NULL; 788 789 hFile = FindFirstFileA(lpszPath, &stffile); 790 791 if ( hFile != INVALID_HANDLE_VALUE ) 792 { 793 if (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 794 { 795 pidl = _ILCreateFolder (&stffile); 796 } 797 else 798 { 799 pidl = _ILCreateValue (&stffile); 800 } 801 FindClose (hFile); 802 } 803 return pidl; 804 } 805 806 ODINFUNCTION1(LPITEMIDLIST,SHSimpleIDListFromPathW,LPWSTR, lpszPath) 807 { 808 char lpszTemp[MAX_PATH]; 809 810 WideCharToLocal(lpszTemp, lpszPath, MAX_PATH); 811 812 return SHSimpleIDListFromPathA (lpszTemp); 813 } 814 815 ODINFUNCTION1(LPITEMIDLIST,SHSimpleIDListFromPathAW,LPVOID, lpszPath) 816 { 817 if ( VERSION_OsIsUnicode()) 818 return SHSimpleIDListFromPathW ((LPWSTR)lpszPath); 819 return SHSimpleIDListFromPathA ((LPSTR)lpszPath); 820 } 821 822 /************************************************************************* 823 * SHGetSpecialFolderLocation [SHELL32.223] 786 824 * 787 825 * gets the folder locations from the registry and creates a pidl … … 794 832 * 795 833 */ 796 HRESULT WINAPI SHGetSpecialFolderLocation( 797 HWND hwndOwner, 798 INT nFolder, 799 LPITEMIDLIST * ppidl) 800 { 801 CHAR szPath[256]; 802 HRESULT hr = E_INVALIDARG; 803 804 TRACE_(shell)("(%04x,0x%x,%p)\n", hwndOwner,nFolder,ppidl); 805 806 *ppidl = NULL; 807 808 if (ppidl) 809 { 810 switch (nFolder) 811 { 812 case CSIDL_DESKTOP: 813 *ppidl = _ILCreateDesktop(); 814 hr = NOERROR; 815 break; 816 817 case CSIDL_DRIVES: 818 *ppidl = _ILCreateMyComputer(); 819 hr = NOERROR; 820 break; 821 822 default: 823 if (SHGetSpecialFolderPathA(hwndOwner, szPath, nFolder, TRUE)) 824 { 825 DWORD attributes=0; 826 TRACE_(shell)("Value=%s\n",szPath); 827 hr = SHILCreateFromPathA(szPath, ppidl, &attributes); 828 } 829 } 830 } 831 832 TRACE_(shell)("-- (new pidl %p)\n",*ppidl); 833 return hr; 834 ODINFUNCTION3(HRESULT,SHGetSpecialFolderLocation,HWND, hwndOwner, 835 INT, nFolder, 836 LPITEMIDLIST*, ppidl) 837 { 838 CHAR szPath[256]; 839 HRESULT hr = E_INVALIDARG; 840 841 *ppidl = NULL; 842 843 if (ppidl) 844 { 845 switch (nFolder) 846 { 847 case CSIDL_DESKTOP: 848 *ppidl = _ILCreateDesktop(); 849 hr = NOERROR; 850 break; 851 852 case CSIDL_DRIVES: 853 *ppidl = _ILCreateMyComputer(); 854 hr = NOERROR; 855 break; 856 857 default: 858 if (SHGetSpecialFolderPathA(hwndOwner, szPath, nFolder, TRUE)) 859 { 860 DWORD attributes=0; 861 TRACE_(shell)("Value=%s\n",szPath); 862 hr = SHILCreateFromPathA(szPath, ppidl, &attributes); 863 } 864 } 865 } 866 867 TRACE_(shell)("-- (new pidl %p)\n",*ppidl); 868 return hr; 834 869 } 835 870 … … 838 873 * 839 874 */ 840 HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID dest, int len) 841 { 842 TRACE_(shell)("sf=%p pidl=%p 0x%04x %p 0x%04x stub\n",psf,pidl,nFormat,dest,len); 843 844 if (! psf || !dest ) return E_INVALIDARG; 845 846 switch (nFormat) 847 { 848 case SHGDFIL_FINDDATA: 849 { 850 WIN32_FIND_DATAA * pfd = (WIN32_FIND_DATAA*)dest; 851 CHAR pszPath[MAX_PATH]; 852 HANDLE handle; 853 854 if ( len < sizeof (WIN32_FIND_DATAA)) { 855 ERR_(shell)("%d does not find sizeof(finddata)\n",len); 856 return E_INVALIDARG; 857 } 858 859 SHGetPathFromIDListA(pidl, pszPath); 860 861 if ((handle = FindFirstFileA ( pszPath, pfd))) 862 FindClose (handle); 863 } 864 return NOERROR; 865 866 case SHGDFIL_NETRESOURCE: 867 case SHGDFIL_DESCRIPTIONID: 868 FIXME_(shell)("SHGDFIL %i stub\n", nFormat); 869 break; 870 871 default: 872 ERR_(shell)("Unknown SHGDFIL %i, please report\n", nFormat); 873 } 874 875 return E_INVALIDARG; 875 876 ODINFUNCTION5(HRESULT,SHGetDataFromIDListA,LPSHELLFOLDER, psf, 877 LPCITEMIDLIST, pidl, 878 int, nFormat, 879 LPVOID, dest, 880 int, len) 881 { 882 TRACE_(shell)("sf=%p pidl=%p 0x%04x %p 0x%04x stub\n",psf,pidl,nFormat,dest,len); 883 884 if (! psf || !dest ) return E_INVALIDARG; 885 886 switch (nFormat) 887 { 888 case SHGDFIL_FINDDATA: 889 { 890 WIN32_FIND_DATAA * pfd = (WIN32_FIND_DATAA*)dest; 891 CHAR pszPath[MAX_PATH]; 892 HANDLE handle; 893 894 if ( len < sizeof (WIN32_FIND_DATAA)) { 895 ERR_(shell)("%d does not find sizeof(finddata)\n",len); 896 return E_INVALIDARG; 897 } 898 899 SHGetPathFromIDListA(pidl, pszPath); 900 901 if ((handle = FindFirstFileA ( pszPath, pfd))) 902 FindClose (handle); 903 } 904 return NOERROR; 905 906 case SHGDFIL_NETRESOURCE: 907 case SHGDFIL_DESCRIPTIONID: 908 FIXME_(shell)("SHGDFIL %i stub\n", nFormat); 909 break; 910 911 default: 912 ERR_(shell)("Unknown SHGDFIL %i, please report\n", nFormat); 913 } 914 915 return E_INVALIDARG; 876 916 } 877 917 /************************************************************************* … … 879 919 * 880 920 */ 881 HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID dest, int len) 882 { 883 if (! psf || !dest ) return E_INVALIDARG; 884 885 switch (nFormat) 886 { 887 case SHGDFIL_FINDDATA: 888 { 889 WIN32_FIND_DATAW * pfd = (WIN32_FIND_DATAW*)dest; 890 WCHAR pszPath[MAX_PATH]; 891 HANDLE handle; 892 893 if ( len < sizeof (WIN32_FIND_DATAW)) { 894 ERR_(shell)("%d does not find sizeof(finddata)\n",len); 895 return E_INVALIDARG; 896 } 897 SHGetPathFromIDListW(pidl, pszPath); 898 if ((handle = FindFirstFileW ( pszPath, pfd))) 899 FindClose (handle); 900 } 901 return NOERROR; 902 default: /* fallthrough */ 903 break; 904 } 905 FIXME_(shell)("(sf=%p pidl=%p nFormat=0x%04x %p 0x%04x), unhandled.\n",psf,pidl,nFormat,dest,len); 906 return SHGetDataFromIDListA( psf, pidl, nFormat, dest, len); 907 } 908 909 /************************************************************************* 910 * SHGetPathFromIDListA [SHELL32.261][NT 4.0: SHELL32.220] 921 922 ODINFUNCTION5(HRESULT,SHGetDataFromIDListW,LPSHELLFOLDER, psf, 923 LPCITEMIDLIST, pidl, 924 int, nFormat, 925 LPVOID, dest, 926 int, len) 927 { 928 if (! psf || !dest ) return E_INVALIDARG; 929 930 switch (nFormat) 931 { 932 case SHGDFIL_FINDDATA: 933 { 934 WIN32_FIND_DATAW * pfd = (WIN32_FIND_DATAW*)dest; 935 WCHAR pszPath[MAX_PATH]; 936 HANDLE handle; 937 938 if ( len < sizeof (WIN32_FIND_DATAW)) { 939 ERR_(shell)("%d does not find sizeof(finddata)\n",len); 940 return E_INVALIDARG; 941 } 942 SHGetPathFromIDListW(pidl, pszPath); 943 if ((handle = FindFirstFileW ( pszPath, pfd))) 944 FindClose (handle); 945 } 946 return NOERROR; 947 default: /* fallthrough */ 948 break; 949 } 950 FIXME_(shell)("(sf=%p pidl=%p nFormat=0x%04x %p 0x%04x), unhandled.\n",psf,pidl,nFormat,dest,len); 951 return SHGetDataFromIDListA( psf, pidl, nFormat, dest, len); 952 } 953 954 /************************************************************************* 955 * SHGetPathFromIDListA [SHELL32.261][NT 4.0: SHELL32.220] 911 956 * 912 957 * PARAMETERS … … 918 963 * 919 964 * NOTES 920 * 921 * 922 * 965 * NULL returns FALSE 966 * desktop pidl gives path to desktopdirectory back 967 * special pidls returning FALSE 923 968 * 924 969 * FIXME 925 970 * fnGetDisplayNameOf can return different types of OLEString 926 971 */ 927 BOOL WINAPI SHGetPathFromIDListA (LPCITEMIDLIST pidl,LPSTR pszPath) 928 { STRRET str; 929 LPSHELLFOLDER shellfolder; 930 931 TRACE_(shell)("(pidl=%p,%p)\n",pidl,pszPath); 932 933 if (!pidl) return FALSE; 934 935 pdump(pidl); 936 937 if(_ILIsDesktop(pidl)) 938 { 939 SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOPDIRECTORY, FALSE); 940 } 941 else 942 { 943 if (SHGetDesktopFolder(&shellfolder)==S_OK) 944 { 945 IShellFolder_GetDisplayNameOf(shellfolder,pidl,SHGDN_FORPARSING,&str); 946 StrRetToStrNA (pszPath, MAX_PATH, &str, pidl); 947 IShellFolder_Release(shellfolder); 948 } 949 } 950 TRACE_(shell)("-- (%s)\n",pszPath); 951 952 return TRUE; 953 } 954 /************************************************************************* 955 * SHGetPathFromIDListW [SHELL32.262] 956 */ 957 BOOL WINAPI SHGetPathFromIDListW (LPCITEMIDLIST pidl,LPWSTR pszPath) 958 { char sTemp[MAX_PATH]; 959 960 TRACE_(shell)("(pidl=%p)\n", pidl); 961 962 SHGetPathFromIDListA (pidl, sTemp); 963 lstrcpyAtoW(pszPath, sTemp); 964 965 TRACE_(shell)("-- (%s)\n",debugstr_w(pszPath)); 966 967 return TRUE; 968 } 969 970 /************************************************************************* 971 * SHBindToParent [shell version 5.0] 972 */ 973 HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast) 974 { 975 IShellFolder * psf; 976 LPITEMIDLIST pidlChild, pidlParent; 977 HRESULT hr=E_FAIL; 978 979 TRACE_(shell)("pidl=%p\n", pidl); 980 pdump(pidl); 981 982 *ppv = NULL; 983 if (ppidlLast) *ppidlLast = NULL; 984 985 if (_ILIsPidlSimple(pidl)) 986 { 987 /* we are on desktop level */ 988 if (ppidlLast) 989 *ppidlLast = ILClone(pidl); 990 hr = SHGetDesktopFolder((IShellFolder**)ppv); 991 } 992 else 993 { 994 pidlChild = ILClone(ILFindLastID(pidl)); 995 pidlParent = ILClone(pidl); 996 ILRemoveLastID(pidlParent); 997 998 hr = SHGetDesktopFolder(&psf); 999 1000 if (SUCCEEDED(hr)) 1001 hr = IShellFolder_BindToObject(psf, pidlParent, NULL, riid, ppv); 1002 1003 if (SUCCEEDED(hr) && ppidlLast) 1004 *ppidlLast = pidlChild; 1005 else 1006 ILFree (pidlChild); 1007 1008 SHFree (pidlParent); 1009 } 1010 1011 1012 TRACE_(shell)("-- psf=%p pidl=%p ret=0x%08lx\n", *ppv, (ppidlLast)?*ppidlLast:NULL, hr); 1013 return hr; 1014 } 1015 1016 /************************************************************************* 1017 * SHGetPathFromIDListAW [SHELL32.221][NT 4.0: SHELL32.219] 1018 */ 1019 BOOL WINAPI SHGetPathFromIDListAW(LPCITEMIDLIST pidl,LPVOID pszPath) 1020 { 1021 TRACE_(shell)("(pidl=%p,%p)\n",pidl,pszPath); 1022 1023 if (VERSION_OsIsUnicode()) 1024 return SHGetPathFromIDListW(pidl,(LPWSTR)pszPath); 1025 return SHGetPathFromIDListA(pidl,(LPSTR)pszPath); 972 973 ODINFUNCTION2(BOOL,SHGetPathFromIDListA,LPCITEMIDLIST, pidl, 974 LPSTR, pszPath) 975 { STRRET str; 976 LPSHELLFOLDER shellfolder; 977 978 if (!pidl) return FALSE; 979 980 pdump(pidl); 981 982 if(_ILIsDesktop(pidl)) 983 { 984 SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOPDIRECTORY, FALSE); 985 } 986 else 987 { 988 if (SHGetDesktopFolder(&shellfolder)==S_OK) 989 { 990 IShellFolder_GetDisplayNameOf(shellfolder,pidl,SHGDN_FORPARSING,&str); 991 StrRetToStrNA (pszPath, MAX_PATH, &str, pidl); 992 IShellFolder_Release(shellfolder); 993 } 994 } 995 TRACE_(shell)("-- (%s)\n",pszPath); 996 997 return TRUE; 998 } 999 /************************************************************************* 1000 * SHGetPathFromIDListW [SHELL32.262] 1001 */ 1002 1003 ODINFUNCTION2(BOOL,SHGetPathFromIDListW,LPCITEMIDLIST, pidl, 1004 LPWSTR, pszPath) 1005 { char sTemp[MAX_PATH]; 1006 1007 SHGetPathFromIDListA (pidl, sTemp); 1008 lstrcpyAtoW(pszPath, sTemp); 1009 1010 TRACE_(shell)("-- (%s)\n",debugstr_w(pszPath)); 1011 1012 return TRUE; 1013 } 1014 1015 /************************************************************************* 1016 * SHBindToParent [shell version 5.0] 1017 */ 1018 1019 ODINFUNCTION4(HRESULT,SHBindToParent,LPCITEMIDLIST, pidl, 1020 REFIID, riid, 1021 LPVOID*, ppv, 1022 LPCITEMIDLIST*,ppidlLast) 1023 { 1024 IShellFolder * psf; 1025 LPITEMIDLIST pidlChild, pidlParent; 1026 HRESULT hr=E_FAIL; 1027 1028 pdump(pidl); 1029 1030 *ppv = NULL; 1031 if (ppidlLast) *ppidlLast = NULL; 1032 1033 if (_ILIsPidlSimple(pidl)) 1034 { 1035 /* we are on desktop level */ 1036 if (ppidlLast) 1037 *ppidlLast = ILClone(pidl); 1038 hr = SHGetDesktopFolder((IShellFolder**)ppv); 1039 } 1040 else 1041 { 1042 pidlChild = ILClone(ILFindLastID(pidl)); 1043 pidlParent = ILClone(pidl); 1044 ILRemoveLastID(pidlParent); 1045 1046 hr = SHGetDesktopFolder(&psf); 1047 1048 if (SUCCEEDED(hr)) 1049 hr = IShellFolder_BindToObject(psf, pidlParent, NULL, riid, ppv); 1050 1051 if (SUCCEEDED(hr) && ppidlLast) 1052 *ppidlLast = pidlChild; 1053 else 1054 ILFree (pidlChild); 1055 1056 SHFree (pidlParent); 1057 } 1058 1059 1060 TRACE_(shell)("-- psf=%p pidl=%p ret=0x%08lx\n", *ppv, (ppidlLast)?*ppidlLast:NULL, hr); 1061 return hr; 1062 } 1063 1064 /************************************************************************* 1065 * SHGetPathFromIDListAW [SHELL32.221][NT 4.0: SHELL32.219] 1066 */ 1067 1068 ODINFUNCTION2(BOOL,SHGetPathFromIDListAW,LPCITEMIDLIST, pidl, 1069 LPVOID, pszPath) 1070 { 1071 if (VERSION_OsIsUnicode()) 1072 return SHGetPathFromIDListW(pidl,(LPWSTR)pszPath); 1073 return SHGetPathFromIDListA(pidl,(LPSTR)pszPath); 1026 1074 } 1027 1075 1028 1076 /************************************************************************** 1029 1077 * 1030 * 1031 * 1032 * 1078 * internal functions 1079 * 1080 * ### 1. section creating pidls ### 1033 1081 * 1034 1082 ************************************************************************* … … 1040 1088 * _ILCreateValue() 1041 1089 */ 1042 LPITEMIDLIST WINAPI _ILCreateDesktop() 1043 { TRACE_(pidl)("()\n"); 1044 return _ILCreate(PT_DESKTOP, NULL, 0); 1045 } 1046 1047 LPITEMIDLIST WINAPI _ILCreateMyComputer() 1048 { TRACE_(pidl)("()\n"); 1049 return _ILCreate(PT_MYCOMP, &IID_MyComputer, sizeof(GUID)); 1050 } 1051 1052 LPITEMIDLIST WINAPI _ILCreateIExplore() 1053 { TRACE_(pidl)("()\n"); 1054 return _ILCreate(PT_MYCOMP, &IID_IExplore, sizeof(GUID)); 1055 } 1056 1057 LPITEMIDLIST WINAPI _ILCreateDrive( LPCSTR lpszNew) 1058 { char sTemp[4]; 1059 lstrcpynA (sTemp,lpszNew,4); 1060 sTemp[2]='\\'; 1061 sTemp[3]=0x00; 1062 TRACE_(pidl)("(%s)\n",sTemp); 1063 return _ILCreate(PT_DRIVE,(LPVOID)&sTemp[0],4); 1064 } 1065 1066 LPITEMIDLIST WINAPI _ILCreateFolder( WIN32_FIND_DATAA * stffile ) 1067 { 1068 char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ 1069 char * pbuff = buff; 1070 ULONG len, len1; 1071 LPITEMIDLIST pidl; 1072 1073 TRACE_(pidl)("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); 1074 1075 /* prepare buffer with both names */ 1076 len = strlen (stffile->cFileName) + 1; 1077 memcpy (pbuff, stffile->cFileName, len); 1078 pbuff += len; 1079 1080 if (stffile->cAlternateFileName) 1081 { 1082 len1 = strlen (stffile->cAlternateFileName)+1; 1083 memcpy (pbuff, stffile->cAlternateFileName, len1); 1084 } 1085 else 1086 { 1087 len1 = 1; 1088 *pbuff = 0x00; 1089 } 1090 1091 pidl = _ILCreate(PT_FOLDER, (LPVOID)buff, len + len1); 1092 1093 /* set attributes */ 1094 if (pidl) 1095 { 1096 LPPIDLDATA pData; 1097 pData = _ILGetDataPointer(pidl); 1098 FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.folder.uFileDate,&pData->u.folder.uFileTime); 1099 pData->u.folder.dwFileSize = stffile->nFileSizeLow; 1100 pData->u.folder.uFileAttribs=stffile->dwFileAttributes; 1101 } 1102 1103 return pidl; 1104 } 1105 1106 LPITEMIDLIST WINAPI _ILCreateValue(WIN32_FIND_DATAA * stffile) 1107 { 1108 char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ 1109 char * pbuff = buff; 1110 ULONG len, len1; 1111 LPITEMIDLIST pidl; 1112 1113 TRACE_(pidl)("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); 1114 1115 /* prepare buffer with both names */ 1116 len = strlen (stffile->cFileName) + 1; 1117 memcpy (pbuff, stffile->cFileName, len); 1118 pbuff += len; 1119 1120 if (stffile->cAlternateFileName) 1121 { 1122 len1 = strlen (stffile->cAlternateFileName)+1; 1123 memcpy (pbuff, stffile->cAlternateFileName, len1); 1124 } 1125 else 1126 { 1127 len1 = 1; 1128 *pbuff = 0x00; 1129 } 1130 1131 pidl = _ILCreate(PT_VALUE, (LPVOID)buff, len + len1); 1132 1133 /* set attributes */ 1134 if (pidl) 1135 { 1136 LPPIDLDATA pData; 1137 pData = _ILGetDataPointer(pidl); 1138 FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.folder.uFileDate,&pData->u.folder.uFileTime); 1139 pData->u.folder.dwFileSize = stffile->nFileSizeLow; 1140 pData->u.folder.uFileAttribs=stffile->dwFileAttributes; 1141 } 1142 1143 return pidl; 1144 } 1145 1146 LPITEMIDLIST WINAPI _ILCreateSpecial(LPCSTR szGUID) 1147 { 1148 IID iid; 1149 CLSIDFromStringA(szGUID,&iid); 1150 return _ILCreate(PT_MYCOMP, &iid, sizeof(IID)); 1090 1091 ODINFUNCTION0(LPITEMIDLIST,_ILCreateDesktop) 1092 { 1093 return _ILCreate(PT_DESKTOP, NULL, 0); 1094 } 1095 1096 ODINFUNCTION0(LPITEMIDLIST,_ILCreateMyComputer) 1097 { 1098 return _ILCreate(PT_MYCOMP, &IID_MyComputer, sizeof(GUID)); 1099 } 1100 1101 ODINFUNCTION0(LPITEMIDLIST,_ILCreateIExplore) 1102 { 1103 return _ILCreate(PT_MYCOMP, &IID_IExplore, sizeof(GUID)); 1104 } 1105 1106 ODINFUNCTION1(LPITEMIDLIST,_ILCreateDrive,LPCSTR,lpszNew) 1107 { char sTemp[4]; 1108 lstrcpynA (sTemp,lpszNew,4); 1109 sTemp[2]='\\'; 1110 sTemp[3]=0x00; 1111 TRACE_(pidl)("(%s)\n",sTemp); 1112 return _ILCreate(PT_DRIVE,(LPVOID)&sTemp[0],4); 1113 } 1114 1115 ODINFUNCTION1(LPITEMIDLIST,_ILCreateFolder,WIN32_FIND_DATAA*, stffile ) 1116 { 1117 char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ 1118 char * pbuff = buff; 1119 ULONG len, len1; 1120 LPITEMIDLIST pidl; 1121 1122 TRACE_(pidl)("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); 1123 1124 /* prepare buffer with both names */ 1125 len = strlen (stffile->cFileName) + 1; 1126 memcpy (pbuff, stffile->cFileName, len); 1127 pbuff += len; 1128 1129 if (stffile->cAlternateFileName) 1130 { 1131 len1 = strlen (stffile->cAlternateFileName)+1; 1132 memcpy (pbuff, stffile->cAlternateFileName, len1); 1133 } 1134 else 1135 { 1136 len1 = 1; 1137 *pbuff = 0x00; 1138 } 1139 1140 pidl = _ILCreate(PT_FOLDER, (LPVOID)buff, len + len1); 1141 1142 /* set attributes */ 1143 if (pidl) 1144 { 1145 LPPIDLDATA pData; 1146 pData = _ILGetDataPointer(pidl); 1147 FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.folder.uFileDate,&pData->u.folder.uFileTime); 1148 pData->u.folder.dwFileSize = stffile->nFileSizeLow; 1149 pData->u.folder.uFileAttribs=stffile->dwFileAttributes; 1150 } 1151 1152 return pidl; 1153 } 1154 1155 ODINFUNCTION1(LPITEMIDLIST,_ILCreateValue,WIN32_FIND_DATAA*, stffile) 1156 { 1157 char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ 1158 char * pbuff = buff; 1159 ULONG len, len1; 1160 LPITEMIDLIST pidl; 1161 1162 TRACE_(pidl)("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); 1163 1164 /* prepare buffer with both names */ 1165 len = strlen (stffile->cFileName) + 1; 1166 memcpy (pbuff, stffile->cFileName, len); 1167 pbuff += len; 1168 1169 if (stffile->cAlternateFileName) 1170 { 1171 len1 = strlen (stffile->cAlternateFileName)+1; 1172 memcpy (pbuff, stffile->cAlternateFileName, len1); 1173 } 1174 else 1175 { 1176 len1 = 1; 1177 *pbuff = 0x00; 1178 } 1179 1180 pidl = _ILCreate(PT_VALUE, (LPVOID)buff, len + len1); 1181 1182 /* set attributes */ 1183 if (pidl) 1184 { 1185 LPPIDLDATA pData; 1186 pData = _ILGetDataPointer(pidl); 1187 FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.folder.uFileDate,&pData->u.folder.uFileTime); 1188 pData->u.folder.dwFileSize = stffile->nFileSizeLow; 1189 pData->u.folder.uFileAttribs=stffile->dwFileAttributes; 1190 } 1191 1192 return pidl; 1193 } 1194 1195 ODINFUNCTION1(LPITEMIDLIST,_ILCreateSpecial,LPCSTR,szGUID) 1196 { 1197 IID iid; 1198 CLSIDFromStringA(szGUID,&iid); 1199 return _ILCreate(PT_MYCOMP, &iid, sizeof(IID)); 1151 1200 } 1152 1201 … … 1159 1208 */ 1160 1209 1161 LPITEMIDLIST WINAPI _ILCreate(PIDLTYPE type, LPCVOID pIn, UINT16 uInSize) 1162 { LPITEMIDLIST pidlOut = NULL, pidlTemp = NULL; 1163 LPPIDLDATA pData; 1164 UINT16 uSize = 0;1165 LPSTR pszDest;1166 1167 TRACE_(pidl)("(0x%02x %p %i)\n",type,pIn,uInSize);1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1210 ODINFUNCTION3(LPITEMIDLIST,_ILCreate,PIDLTYPE,type, 1211 LPCVOID, pIn, 1212 UINT16, uInSize) 1213 { LPITEMIDLIST pidlOut = NULL, pidlTemp = NULL; 1214 LPPIDLDATA pData; 1215 UINT16 uSize = 0; 1216 LPSTR pszDest; 1217 1218 switch (type) 1219 { case PT_DESKTOP: 1220 uSize = 0; 1221 pidlOut = (ITEMIDLIST*)SHAlloc(uSize + 2); 1222 pidlOut->mkid.cb = uSize; 1223 TRACE_(pidl)("- create Desktop\n"); 1224 break; 1225 1226 case PT_MYCOMP: 1227 uSize = 2 + 2 + sizeof(GUID); 1228 pidlOut = (ITEMIDLIST*)SHAlloc(uSize + 2); 1229 ZeroMemory(pidlOut, uSize + 2); 1230 pidlOut->mkid.cb = uSize; 1231 pData =_ILGetDataPointer(pidlOut); 1232 pData->type = type; 1233 memcpy(&(pData->u.mycomp.guid), pIn, uInSize); 1234 TRACE_(pidl)("- create GUID-pidl\n"); 1235 break; 1236 1237 case PT_DRIVE: 1238 uSize = 2 + 23; 1239 pidlOut = (ITEMIDLIST*)SHAlloc(uSize + 2); 1240 ZeroMemory(pidlOut, uSize + 2); 1241 pidlOut->mkid.cb = uSize; 1242 pData =_ILGetDataPointer(pidlOut); 1243 pData->type = type; 1244 pszDest = _ILGetTextPointer(type, pData); 1245 memcpy(pszDest, pIn, uInSize); 1246 TRACE_(pidl)("- create Drive: %s\n",debugstr_a(pszDest)); 1247 break; 1248 1249 case PT_FOLDER: 1250 case PT_VALUE: 1251 uSize = 2 + 12 + uInSize; 1252 pidlOut = (ITEMIDLIST*)SHAlloc(uSize + 2); 1253 ZeroMemory(pidlOut, uSize + 2); 1254 pidlOut->mkid.cb = uSize; 1255 pData =_ILGetDataPointer(pidlOut); 1256 pData->type = type; 1257 pszDest = _ILGetTextPointer(type, pData); 1258 memcpy(pszDest, pIn, uInSize); 1259 TRACE_(pidl)("- create Value: %s\n",debugstr_a(pszDest)); 1260 break; 1261 } 1262 1263 pidlTemp = ILGetNext(pidlOut); 1264 if (pidlTemp) 1265 pidlTemp->mkid.cb = 0x00; 1266 1267 TRACE_(pidl)("-- (pidl=%p, size=%u)\n", pidlOut, uSize); 1268 return pidlOut; 1220 1269 } 1221 1270 … … 1228 1277 * strlen (lpszText) 1229 1278 */ 1230 DWORD WINAPI _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT16 uSize) 1231 { TRACE_(pidl)("(%p,%p,%u)\n",pidl,pOut,uSize); 1232 1233 if(_ILIsMyComputer(pidl)) 1234 pidl = ILGetNext(pidl); 1235 1236 if (pidl && _ILIsDrive(pidl)) 1237 return _ILSimpleGetText(pidl, pOut, uSize); 1238 1239 return 0; 1279 1280 ODINFUNCTION3(DWORD,_ILGetDrive,LPCITEMIDLIST, pidl, 1281 LPSTR, pOut, 1282 UINT16, uSize) 1283 { 1284 if(_ILIsMyComputer(pidl)) 1285 pidl = ILGetNext(pidl); 1286 1287 if (pidl && _ILIsDrive(pidl)) 1288 return _ILSimpleGetText(pidl, pOut, uSize); 1289 1290 return 0; 1240 1291 } 1241 1292 1242 1293 /************************************************************************** 1243 1294 * 1244 * 1295 * ### 2. section testing pidls ### 1245 1296 * 1246 1297 ************************************************************************** … … 1253 1304 * _ILIsPidlSimple() 1254 1305 */ 1255 BOOL WINAPI _ILIsDesktop(LPCITEMIDLIST pidl) 1256 { TRACE_(pidl)("(%p)\n",pidl); 1257 return ( !pidl || (pidl && pidl->mkid.cb == 0x00) ); 1258 } 1259 1260 BOOL WINAPI _ILIsMyComputer(LPCITEMIDLIST pidl) 1261 { 1262 REFIID iid = _ILGetGUIDPointer(pidl); 1263 1264 TRACE_(pidl)("(%p)\n",pidl); 1265 1266 if (iid) 1267 return IsEqualIID(iid, &IID_MyComputer); 1268 return FALSE; 1269 } 1270 1271 BOOL WINAPI _ILIsSpecialFolder (LPCITEMIDLIST pidl) 1272 { 1273 LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1274 TRACE_(pidl)("(%p)\n",pidl); 1275 return (pidl && ( (lpPData && (PT_MYCOMP== lpPData->type || PT_SPECIAL== lpPData->type)) || 1276 (pidl && pidl->mkid.cb == 0x00) 1277 )); 1278 } 1279 1280 BOOL WINAPI _ILIsDrive(LPCITEMIDLIST pidl) 1281 { LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1282 TRACE_(pidl)("(%p)\n",pidl); 1283 return (pidl && lpPData && (PT_DRIVE == lpPData->type || 1284 PT_DRIVE1 == lpPData->type || 1285 PT_DRIVE2 == lpPData->type || 1286 PT_DRIVE3 == lpPData->type)); 1287 } 1288 1289 BOOL WINAPI _ILIsFolder(LPCITEMIDLIST pidl) 1290 { LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1291 TRACE_(pidl)("(%p)\n",pidl); 1292 return (pidl && lpPData && (PT_FOLDER == lpPData->type || PT_FOLDER1 == lpPData->type)); 1293 } 1294 1295 BOOL WINAPI _ILIsValue(LPCITEMIDLIST pidl) 1296 { LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1297 TRACE_(pidl)("(%p)\n",pidl); 1298 return (pidl && lpPData && PT_VALUE == lpPData->type); 1306 1307 ODINFUNCTION1(BOOL,_ILIsDesktop,LPCITEMIDLIST, pidl) 1308 { 1309 return ( !pidl || (pidl && pidl->mkid.cb == 0x00) ); 1310 } 1311 1312 ODINFUNCTION1(BOOL,_ILIsMyComputer,LPCITEMIDLIST, pidl) 1313 { 1314 REFIID iid = _ILGetGUIDPointer(pidl); 1315 1316 TRACE_(pidl)("(%p)\n",pidl); 1317 1318 if (iid) 1319 return IsEqualIID(iid, &IID_MyComputer); 1320 return FALSE; 1321 } 1322 1323 ODINFUNCTION1(BOOL,_ILIsSpecialFolder,LPCITEMIDLIST, pidl) 1324 { 1325 LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1326 TRACE_(pidl)("(%p)\n",pidl); 1327 return (pidl && ( (lpPData && (PT_MYCOMP== lpPData->type || PT_SPECIAL== lpPData->type)) || 1328 (pidl && pidl->mkid.cb == 0x00) 1329 )); 1330 } 1331 1332 ODINFUNCTION1(BOOL,_ILIsDrive,LPCITEMIDLIST, pidl) 1333 { LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1334 TRACE_(pidl)("(%p)\n",pidl); 1335 return (pidl && lpPData && (PT_DRIVE == lpPData->type || 1336 PT_DRIVE1 == lpPData->type || 1337 PT_DRIVE2 == lpPData->type || 1338 PT_DRIVE3 == lpPData->type)); 1339 } 1340 1341 ODINFUNCTION1(BOOL,_ILIsFolder,LPCITEMIDLIST, pidl) 1342 { LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1343 TRACE_(pidl)("(%p)\n",pidl); 1344 return (pidl && lpPData && (PT_FOLDER == lpPData->type || PT_FOLDER1 == lpPData->type)); 1345 } 1346 1347 ODINFUNCTION1(BOOL,_ILIsValue,LPCITEMIDLIST, pidl) 1348 { LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1349 TRACE_(pidl)("(%p)\n",pidl); 1350 return (pidl && lpPData && PT_VALUE == lpPData->type); 1299 1351 } 1300 1352 1301 1353 /************************************************************************** 1302 * 1303 */ 1304 BOOL WINAPI _ILIsPidlSimple ( LPCITEMIDLISTpidl)1305 { 1306 1307 1308 if(! _ILIsDesktop(pidl))/* pidl=NULL or mkid.cb=0 */1309 1310 1311 1312 1313 1314 1315 1316 1317 1354 * _ILIsPidlSimple 1355 */ 1356 ODINFUNCTION1(BOOL,_ILIsPidlSimple,LPCITEMIDLIST, pidl) 1357 { 1358 BOOL ret = TRUE; 1359 1360 if(! _ILIsDesktop(pidl)) /* pidl=NULL or mkid.cb=0 */ 1361 { 1362 WORD len = pidl->mkid.cb; 1363 LPCITEMIDLIST pidlnext = (LPCITEMIDLIST) (((LPBYTE)pidl) + len ); 1364 if (pidlnext->mkid.cb) 1365 ret = FALSE; 1366 } 1367 1368 TRACE_(pidl)("%s\n", ret ? "Yes" : "No"); 1369 return ret; 1318 1370 } 1319 1371 1320 1372 /************************************************************************** 1321 1373 * 1322 * 1374 * ### 3. section getting values from pidls ### 1323 1375 */ 1324 1376 … … 1330 1382 * returns the lenght of the string 1331 1383 */ 1332 DWORD WINAPI _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize) 1333 { 1334 LPPIDLDATA pData; 1335 DWORD dwReturn=0; 1336 LPSTR szSrc; 1337 GUID const * riid; 1338 char szTemp[MAX_PATH]; 1339 1340 TRACE_(pidl)("(%p %p %x)\n",pidl,szOut,uOutSize); 1341 1342 if (!pidl) return 0; 1343 1344 if (szOut) 1345 *szOut = 0; 1346 1347 pData = _ILGetDataPointer(pidl); 1348 1349 if (!pData) 1350 { 1351 /* desktop */ 1352 if (HCR_GetClassName(&CLSID_ShellDesktop, szTemp, MAX_PATH)) 1353 { 1354 if (szOut) 1355 lstrcpynA(szOut, szTemp, uOutSize); 1356 1357 dwReturn = strlen (szTemp); 1358 } 1359 } 1360 else if (( szSrc = _ILGetTextPointer(pData->type, pData) )) 1361 { 1362 /* filesystem */ 1363 if (szOut) 1364 lstrcpynA(szOut, szSrc, MAX_PATH); 1365 1366 dwReturn = strlen(szSrc); 1367 } 1368 else if (( riid = _ILGetGUIDPointer(pidl) )) 1369 { 1370 /* special folder */ 1371 if ( HCR_GetClassName(riid, szTemp, MAX_PATH) ) 1372 { 1373 if (szOut) 1374 lstrcpynA(szOut, szTemp, uOutSize); 1375 1376 dwReturn = strlen (szTemp); 1377 } 1378 } 1379 else 1380 { 1381 ERR_(pidl)("-- no text\n"); 1382 } 1383 1384 TRACE_(pidl)("-- (%p=%s 0x%08lx)\n",szOut,(char*)szOut,dwReturn); 1385 return dwReturn; 1384 1385 ODINFUNCTION3(DWORD, _ILSimpleGetText, LPCITEMIDLIST, pidl, 1386 LPSTR, szOut, 1387 UINT, uOutSize) 1388 { 1389 LPPIDLDATA pData; 1390 DWORD dwReturn=0; 1391 LPSTR szSrc; 1392 GUID const * riid; 1393 char szTemp[MAX_PATH]; 1394 1395 if (!pidl) return 0; 1396 1397 if (szOut) 1398 *szOut = 0; 1399 1400 pData = _ILGetDataPointer(pidl); 1401 1402 if (!pData) 1403 { 1404 /* desktop */ 1405 if (HCR_GetClassName(&CLSID_ShellDesktop, szTemp, MAX_PATH)) 1406 { 1407 if (szOut) 1408 lstrcpynA(szOut, szTemp, uOutSize); 1409 1410 dwReturn = strlen (szTemp); 1411 } 1412 } 1413 else if (( szSrc = _ILGetTextPointer(pData->type, pData) )) 1414 { 1415 /* filesystem */ 1416 if (szOut) 1417 lstrcpynA(szOut, szSrc, MAX_PATH); 1418 1419 dwReturn = strlen(szSrc); 1420 } 1421 else if (( riid = _ILGetGUIDPointer(pidl) )) 1422 { 1423 /* special folder */ 1424 if ( HCR_GetClassName(riid, szTemp, MAX_PATH) ) 1425 { 1426 if (szOut) 1427 lstrcpynA(szOut, szTemp, uOutSize); 1428 1429 dwReturn = strlen (szTemp); 1430 } 1431 } 1432 else 1433 { 1434 ERR_(pidl)("-- no text\n"); 1435 } 1436 1437 TRACE_(pidl)("-- (%p=%s 0x%08lx)\n",szOut,(char*)szOut,dwReturn); 1438 return dwReturn; 1386 1439 } 1387 1440 1388 1441 /************************************************************************** 1389 1442 * 1390 * 1443 * ### 4. getting pointers to parts of pidls ### 1391 1444 * 1392 1445 ************************************************************************** 1393 1446 * _ILGetDataPointer() 1394 1447 */ 1395 LPPIDLDATA WINAPI _ILGetDataPointer(LPITEMIDLIST pidl) 1396 { 1397 if(pidl && pidl->mkid.cb != 0x00) 1398 return (LPPIDLDATA) &(pidl->mkid.abID); 1399 return NULL; 1448 1449 ODINFUNCTION1(LPPIDLDATA,_ILGetDataPointer,LPITEMIDLIST, pidl) 1450 { 1451 if(pidl && pidl->mkid.cb != 0x00) 1452 return (LPPIDLDATA) &(pidl->mkid.abID); 1453 return NULL; 1400 1454 } 1401 1455 … … 1404 1458 * gets a pointer to the long filename string stored in the pidl 1405 1459 */ 1406 LPSTR WINAPI _ILGetTextPointer(PIDLTYPE type, LPPIDLDATA pidldata) 1407 {/* TRACE(pidl,"(type=%x data=%p)\n", type, pidldata);*/ 1408 1409 if(!pidldata) 1410 { return NULL; 1411 } 1412 1413 switch (type) 1414 { 1415 case PT_MYCOMP: 1416 case PT_SPECIAL: 1417 return NULL; 1418 1419 case PT_DRIVE: 1420 case PT_DRIVE1: 1421 case PT_DRIVE2: 1422 case PT_DRIVE3: 1423 return (LPSTR)&(pidldata->u.drive.szDriveName); 1424 1425 case PT_FOLDER: 1426 case PT_FOLDER1: 1427 case PT_VALUE: 1428 case PT_IESPECIAL: 1429 return (LPSTR)&(pidldata->u.file.szNames); 1430 1431 case PT_WORKGRP: 1432 case PT_COMP: 1433 case PT_NETWORK: 1434 case PT_SHARE: 1435 return (LPSTR)&(pidldata->u.network.szNames); 1436 } 1437 return NULL; 1460 1461 ODINFUNCTION2(LPSTR,_ILGetTextPointer,PIDLTYPE, type, 1462 LPPIDLDATA, pidldata) 1463 {/* TRACE(pidl,"(type=%x data=%p)\n", type, pidldata);*/ 1464 1465 if(!pidldata) 1466 { return NULL; 1467 } 1468 1469 switch (type) 1470 { 1471 case PT_MYCOMP: 1472 case PT_SPECIAL: 1473 return NULL; 1474 1475 case PT_DRIVE: 1476 case PT_DRIVE1: 1477 case PT_DRIVE2: 1478 case PT_DRIVE3: 1479 return (LPSTR)&(pidldata->u.drive.szDriveName); 1480 1481 case PT_FOLDER: 1482 case PT_FOLDER1: 1483 case PT_VALUE: 1484 case PT_IESPECIAL: 1485 return (LPSTR)&(pidldata->u.file.szNames); 1486 1487 case PT_WORKGRP: 1488 case PT_COMP: 1489 case PT_NETWORK: 1490 case PT_SHARE: 1491 return (LPSTR)&(pidldata->u.network.szNames); 1492 } 1493 return NULL; 1438 1494 } 1439 1495 … … 1442 1498 * gets a pointer to the short filename string stored in the pidl 1443 1499 */ 1444 LPSTR WINAPI _ILGetSTextPointer(PIDLTYPE type, LPPIDLDATA pidldata) 1445 {/* TRACE(pidl,"(type=%x data=%p)\n", type, pidldata);*/ 1446 1447 if(!pidldata) 1448 return NULL; 1449 1450 switch (type) 1451 { 1452 case PT_FOLDER: 1453 case PT_VALUE: 1454 case PT_IESPECIAL: 1455 return (LPSTR)(pidldata->u.file.szNames + strlen (pidldata->u.file.szNames) + 1); 1456 1457 case PT_WORKGRP: 1458 return (LPSTR)(pidldata->u.network.szNames + strlen (pidldata->u.network.szNames) + 1); 1459 } 1460 return NULL; 1500 1501 ODINFUNCTION2(LPSTR,_ILGetSTextPointer,PIDLTYPE, type, 1502 LPPIDLDATA, pidldata) 1503 {/* TRACE(pidl,"(type=%x data=%p)\n", type, pidldata);*/ 1504 1505 if(!pidldata) 1506 return NULL; 1507 1508 switch (type) 1509 { 1510 case PT_FOLDER: 1511 case PT_VALUE: 1512 case PT_IESPECIAL: 1513 return (LPSTR)(pidldata->u.file.szNames + strlen (pidldata->u.file.szNames) + 1); 1514 1515 case PT_WORKGRP: 1516 return (LPSTR)(pidldata->u.network.szNames + strlen (pidldata->u.network.szNames) + 1); 1517 } 1518 return NULL; 1461 1519 } 1462 1520 … … 1466 1524 * returns reference to guid stored in some pidls 1467 1525 */ 1468 REFIID WINAPI _ILGetGUIDPointer(LPCITEMIDLIST pidl) 1469 { 1470 LPPIDLDATA pdata =_ILGetDataPointer(pidl); 1471 1472 if (pdata) 1473 { 1474 switch (pdata->type) 1475 { 1476 case PT_SPECIAL: 1477 case PT_MYCOMP: 1478 return (REFIID) &(pdata->u.mycomp.guid); 1479 } 1480 } 1481 return NULL; 1482 } 1483 1484 BOOL WINAPI _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) 1485 { LPPIDLDATA pdata =_ILGetDataPointer(pidl); 1486 FILETIME ft; 1487 SYSTEMTIME time; 1488 1489 switch (pdata->type) 1490 { case PT_FOLDER: 1491 DosDateTimeToFileTime(pdata->u.folder.uFileDate, pdata->u.folder.uFileTime, &ft); 1492 break; 1493 case PT_VALUE: 1494 DosDateTimeToFileTime(pdata->u.file.uFileDate, pdata->u.file.uFileTime, &ft); 1495 break; 1496 default: 1497 return FALSE; 1498 } 1499 FileTimeToSystemTime (&ft, &time); 1500 return GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL, pOut, uOutSize); 1501 } 1502 1503 BOOL WINAPI _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) 1504 { LPPIDLDATA pdata =_ILGetDataPointer(pidl); 1505 1506 switch (pdata->type) 1507 { case PT_VALUE: 1508 break; 1509 default: 1510 return FALSE; 1511 } 1512 StrFormatByteSizeA(pdata->u.file.dwFileSize, pOut, uOutSize); 1513 return TRUE; 1514 } 1515 1516 BOOL WINAPI _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) 1517 { 1518 char szTemp[MAX_PATH]; 1519 const char * pPoint; 1520 LPITEMIDLIST pidlTemp=pidl; 1521 1522 TRACE_(pidl)("pidl=%p\n",pidl); 1523 1524 if (!pidl) return FALSE; 1525 1526 pidlTemp = ILFindLastID(pidl); 1527 1528 if (!_ILIsValue(pidlTemp)) return FALSE; 1529 if (!_ILSimpleGetText(pidlTemp, szTemp, MAX_PATH)) return FALSE; 1530 1531 pPoint = PathFindExtensionA(szTemp); 1532 1533 if (! *pPoint) return FALSE; 1534 1535 pPoint++; 1536 lstrcpynA(pOut, pPoint, uOutSize); 1537 TRACE_(pidl)("%s\n",pOut); 1538 1539 return TRUE; 1540 } 1541 1526 1527 ODINFUNCTION1(REFIID,_ILGetGUIDPointer,LPCITEMIDLIST, pidl) 1528 { 1529 LPPIDLDATA pdata =_ILGetDataPointer(pidl); 1530 1531 if (pdata) 1532 { 1533 switch (pdata->type) 1534 { 1535 case PT_SPECIAL: 1536 case PT_MYCOMP: 1537 return (REFIID) &(pdata->u.mycomp.guid); 1538 } 1539 } 1540 return NULL; 1541 } 1542 1543 ODINFUNCTION3(BOOL, _ILGetFileDate, LPCITEMIDLIST, pidl, 1544 LPSTR, pOut, 1545 UINT, uOutSize) 1546 { LPPIDLDATA pdata =_ILGetDataPointer(pidl); 1547 FILETIME ft; 1548 SYSTEMTIME time; 1549 1550 switch (pdata->type) 1551 { case PT_FOLDER: 1552 DosDateTimeToFileTime(pdata->u.folder.uFileDate, pdata->u.folder.uFileTime, &ft); 1553 break; 1554 case PT_VALUE: 1555 DosDateTimeToFileTime(pdata->u.file.uFileDate, pdata->u.file.uFileTime, &ft); 1556 break; 1557 default: 1558 return FALSE; 1559 } 1560 FileTimeToSystemTime (&ft, &time); 1561 return GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL, pOut, uOutSize); 1562 } 1563 1564 1565 ODINFUNCTION3(BOOL,_ILGetFileSize,LPCITEMIDLIST, pidl, 1566 LPSTR, pOut, 1567 UINT, uOutSize) 1568 { LPPIDLDATA pdata =_ILGetDataPointer(pidl); 1569 1570 switch (pdata->type) 1571 { case PT_VALUE: 1572 break; 1573 default: 1574 return FALSE; 1575 } 1576 StrFormatByteSizeA(pdata->u.file.dwFileSize, pOut, uOutSize); 1577 return TRUE; 1578 } 1579 1580 1581 ODINFUNCTION3(BOOL,_ILGetExtension,LPCITEMIDLIST, pidl, 1582 LPSTR, pOut, 1583 UINT, uOutSize) 1584 { 1585 char szTemp[MAX_PATH]; 1586 const char * pPoint; 1587 LPITEMIDLIST pidlTemp=pidl; 1588 1589 if (!pidl) return FALSE; 1590 1591 pidlTemp = ILFindLastID(pidl); 1592 1593 if (!_ILIsValue(pidlTemp)) return FALSE; 1594 if (!_ILSimpleGetText(pidlTemp, szTemp, MAX_PATH)) return FALSE; 1595 1596 pPoint = PathFindExtensionA(szTemp); 1597 1598 if (! *pPoint) return FALSE; 1599 1600 pPoint++; 1601 lstrcpynA(pOut, pPoint, uOutSize); 1602 TRACE_(pidl)("%s\n",pOut); 1603 1604 return TRUE; 1605 } 1606
Note:
See TracChangeset
for help on using the changeset viewer.