Changeset 6709 for trunk/src/shell32/pidl.c
- Timestamp:
- Sep 15, 2001, 11:26:26 AM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/shell32/pidl.c
r6650 r6709 1 /* $Id: pidl.c,v 1.4 2001-09-05 13:46:56 bird Exp $ */2 1 /* 3 * 4 * 5 * Copyright 1998Juergen Schmied2 * pidl Handling 3 * 4 * Copyright 1998 Juergen Schmied 6 5 * 7 6 * NOTES … … 31 30 void pdump (LPCITEMIDLIST pidl) 32 31 { 33 34 35 36 37 38 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 32 BOOL bIsShellDebug; 33 34 LPITEMIDLIST pidltemp = pidl; 35 if (!TRACE_ON(pidl)) 36 return; 37 38 /* silence the sub-functions */ 39 bIsShellDebug = TRACE_ON(shell); 40 __SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_shell, FALSE); 41 __SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_pidl, FALSE); 42 43 if (! pidltemp) 44 { 45 MESSAGE ("-------- pidl=NULL (Desktop)\n"); 46 } 47 else 48 { 49 MESSAGE ("-------- pidl=%p\n", pidl); 50 if (pidltemp->mkid.cb) 51 { 52 do 53 { 54 DWORD dwAttrib = 0; 55 LPPIDLDATA pData = _ILGetDataPointer(pidltemp); 56 DWORD type = pData->type; 57 LPSTR szLongName = _ILGetTextPointer(pidltemp); 58 LPSTR szShortName = _ILGetSTextPointer(pidltemp); 59 char szName[MAX_PATH]; 60 61 _ILSimpleGetText(pidltemp, szName, MAX_PATH); 62 if( PT_FOLDER == type) 63 dwAttrib = pData->u.folder.uFileAttribs; 64 else if( PT_VALUE == type) 65 dwAttrib = pData->u.file.uFileAttribs; 66 67 MESSAGE ("-- pidl=%p size=%u type=%lx attr=0x%08lx name=%s (%s,%s)\n", 68 pidltemp, pidltemp->mkid.cb,type,dwAttrib,szName,debugstr_a(szLongName), debugstr_a(szShortName)); 69 70 pidltemp = ILGetNext(pidltemp); 71 72 } while (pidltemp->mkid.cb); 73 } 74 else 75 { 76 MESSAGE ("empty pidl (Desktop)\n"); 77 } 78 pcheck(pidl); 79 } 80 81 __SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_shell, bIsShellDebug); 82 __SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_pidl, TRUE); 84 83 85 84 } … … 88 87 BOOL pcheck (LPCITEMIDLIST pidl) 89 88 { DWORD type, ret=TRUE; 90 89 BOOL bIsPidlDebug; 91 90 92 91 LPITEMIDLIST pidltemp = pidl; 93 92 94 95 93 bIsPidlDebug = TRACE_ON(shell); 94 __SET_DEBUGGING(__DBCL_TRACE, __wine_dbch_pidl, FALSE); 96 95 97 96 if (pidltemp && pidltemp->mkid.cb) … … 99 98 { type = _ILGetDataPointer(pidltemp)->type; 100 99 switch (type) 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 } 145 146 /************************************************************************* 147 * ILGetDisplayName 100 { case PT_DESKTOP: 101 case PT_MYCOMP: 102 case PT_SPECIAL: 103 case PT_DRIVE: 104 case PT_DRIVE1: 105 case PT_DRIVE2: 106 case PT_DRIVE3: 107 case PT_FOLDER: 108 case PT_VALUE: 109 case PT_FOLDER1: 110 case PT_WORKGRP: 111 case PT_COMP: 112 case PT_NETWORK: 113 case PT_IESPECIAL1: 114 case PT_IESPECIAL2: 115 case PT_SHARE: 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("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, __wine_dbch_pidl, bIsPidlDebug); 142 return ret; 143 } 144 145 /************************************************************************* 146 * ILGetDisplayName [SHELL32.15] 148 147 */ 149 148 BOOL WINAPI ILGetDisplayName(LPCITEMIDLIST pidl,LPSTR path) 150 149 { 151 152 150 TRACE_(shell)("pidl=%p %p semi-stub\n",pidl,path); 151 return SHGetPathFromIDListA(pidl, path); 153 152 } 154 153 /************************************************************************* … … 158 157 * observed: pidl=Desktop return=pidl 159 158 */ 160 LPITEMIDLIST WINAPI ILFindLastID(LPITEMIDLIST pidl) 161 { 162 163 164 165 166 167 168 169 170 return pidlLast; 159 LPITEMIDLIST WINAPI ILFindLastID(LPITEMIDLIST pidl) 160 { LPITEMIDLIST pidlLast = pidl; 161 162 TRACE("(pidl=%p)\n",pidl); 163 164 while (pidl->mkid.cb) 165 { 166 pidlLast = pidl; 167 pidl = ILGetNext(pidl); 168 } 169 return pidlLast; 171 170 } 172 171 /************************************************************************* … … 178 177 BOOL WINAPI ILRemoveLastID(LPCITEMIDLIST pidl) 179 178 { 180 181 182 183 184 185 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; 186 185 } 187 186 … … 198 197 if (!pidl) 199 198 return NULL; 200 199 201 200 len = ILGetSize(pidl); 202 201 newpidl = (LPITEMIDLIST)SHAlloc(len); … … 216 215 */ 217 216 LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl) 218 { 219 220 221 222 223 224 225 226 len = pidl->mkid.cb; 227 228 229 230 memcpy(pidlNew,pidl,len+2);/* 2 -> mind a desktop pidl */231 232 233 234 235 236 237 238 217 { DWORD len; 218 LPITEMIDLIST pidlNew = NULL; 219 220 TRACE("pidl=%p \n",pidl); 221 pdump(pidl); 222 223 if (pidl) 224 { 225 len = pidl->mkid.cb; 226 pidlNew = (LPITEMIDLIST) SHAlloc (len+2); 227 if (pidlNew) 228 { 229 memcpy(pidlNew,pidl,len+2); /* 2 -> mind a desktop pidl */ 230 231 if (len) 232 ILGetNext(pidlNew)->mkid.cb = 0x00; 233 } 234 } 235 TRACE("-- newpidl=%p\n",pidlNew); 236 237 return pidlNew; 239 238 } 240 239 … … 246 245 */ 247 246 HRESULT WINAPI ILLoadFromStream (IStream * pStream, LPITEMIDLIST * ppPidl) 248 { WORDwLen = 0;249 DWORDdwBytesRead;250 HRESULTret = E_FAIL;251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 247 { WORD wLen = 0; 248 DWORD dwBytesRead; 249 HRESULT ret = E_FAIL; 250 251 252 TRACE_(shell)("%p %p\n", pStream , ppPidl); 253 254 if (*ppPidl) 255 { SHFree(*ppPidl); 256 *ppPidl = NULL; 257 } 258 259 IStream_AddRef (pStream); 260 261 if (SUCCEEDED(IStream_Read(pStream, (LPVOID)&wLen, 2, &dwBytesRead))) 262 { *ppPidl = SHAlloc (wLen); 263 if (SUCCEEDED(IStream_Read(pStream, *ppPidl , wLen, &dwBytesRead))) 264 { ret = S_OK; 265 } 266 else 267 { SHFree(*ppPidl); 268 *ppPidl = NULL; 269 } 270 } 271 272 /* we are not yet fully compatible */ 273 if (!pcheck(*ppPidl)) 274 { SHFree(*ppPidl); 275 *ppPidl = NULL; 276 } 277 278 279 IStream_Release (pStream); 280 281 return ret; 283 282 } 284 283 … … 291 290 HRESULT WINAPI ILSaveToStream (IStream * pStream, LPCITEMIDLIST pPidl) 292 291 { 293 LPITEMIDLISTpidl;294 WORDwLen = 0;295 HRESULTret = E_FAIL;296 297 298 299 300 301 292 LPITEMIDLIST pidl; 293 WORD wLen = 0; 294 HRESULT ret = E_FAIL; 295 296 TRACE_(shell)("%p %p\n", pStream, pPidl); 297 298 IStream_AddRef (pStream); 299 300 pidl = pPidl; 302 301 while (pidl->mkid.cb) 303 302 { … … 306 305 } 307 306 308 309 310 311 312 313 314 315 316 317 318 319 } 320 321 /************************************************************************* 322 * SHILCreateFromPath 307 if (SUCCEEDED(IStream_Write(pStream, (LPVOID)&wLen, 2, NULL))) 308 { 309 if (SUCCEEDED(IStream_Write(pStream, pPidl, wLen, NULL))) 310 { ret = S_OK; 311 } 312 } 313 314 315 IStream_Release (pStream); 316 317 return ret; 318 } 319 320 /************************************************************************* 321 * SHILCreateFromPath [SHELL32.28] 323 322 * 324 323 * NOTES … … 326 325 */ 327 326 HRESULT WINAPI SHILCreateFromPathA (LPCSTR path, LPITEMIDLIST * ppidl, DWORD * attributes) 328 { 329 330 331 332 333 327 { LPSHELLFOLDER sf; 328 WCHAR lpszDisplayName[MAX_PATH]; 329 DWORD pchEaten; 330 HRESULT ret = E_FAIL; 331 332 TRACE_(shell)("%s %p 0x%08lx\n",path,ppidl,attributes?*attributes:0); 334 333 335 334 if (!MultiByteToWideChar( CP_ACP, 0, path, -1, lpszDisplayName, MAX_PATH )) 336 335 lpszDisplayName[MAX_PATH-1] = 0; 337 336 338 339 340 341 342 343 337 if (SUCCEEDED (SHGetDesktopFolder(&sf))) 338 { 339 ret = IShellFolder_ParseDisplayName(sf,0, NULL,lpszDisplayName,&pchEaten,ppidl,attributes); 340 IShellFolder_Release(sf); 341 } 342 return ret; 344 343 } 345 344 HRESULT WINAPI SHILCreateFromPathW (LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * attributes) 346 { 347 348 349 350 351 352 353 354 355 356 357 345 { LPSHELLFOLDER sf; 346 DWORD pchEaten; 347 HRESULT ret = E_FAIL; 348 349 TRACE_(shell)("%s %p 0x%08lx\n",debugstr_w(path),ppidl,attributes?*attributes:0); 350 351 if (SUCCEEDED (SHGetDesktopFolder(&sf))) 352 { 353 ret = IShellFolder_ParseDisplayName(sf,0, NULL, (LPWSTR) path, &pchEaten, ppidl, attributes); 354 IShellFolder_Release(sf); 355 } 356 return ret; 358 357 } 359 358 HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * ppidl, DWORD * attributes) 360 359 { 361 362 363 360 if ( SHELL_OsIsUnicode()) 361 return SHILCreateFromPathW (path, ppidl, attributes); 362 return SHILCreateFromPathA (path, ppidl, attributes); 364 363 } 365 364 366 365 /************************************************************************* 367 366 * SHCloneSpecialIDList [SHELL32.89] 368 * 367 * 369 368 * PARAMETERS 370 * hwndOwner [in]371 * nFolder [in]CSIDL_xxxxx ??369 * hwndOwner [in] 370 * nFolder [in] CSIDL_xxxxx ?? 372 371 * 373 372 * RETURNS … … 377 376 */ 378 377 LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner,DWORD nFolder,DWORD x3) 379 { 380 381 382 383 384 385 378 { LPITEMIDLIST ppidl; 379 WARN_(shell)("(hwnd=0x%x,csidl=0x%lx,0x%lx):semi-stub.\n", 380 hwndOwner,nFolder,x3); 381 382 SHGetSpecialFolderLocation(hwndOwner, nFolder, &ppidl); 383 384 return ppidl; 386 385 } 387 386 … … 391 390 */ 392 391 LPITEMIDLIST WINAPI ILGlobalClone(LPCITEMIDLIST pidl) 393 { 394 395 396 397 398 399 400 401 402 403 404 405 406 407 392 { DWORD len; 393 LPITEMIDLIST newpidl; 394 395 if (!pidl) 396 return NULL; 397 398 len = ILGetSize(pidl); 399 newpidl = (LPITEMIDLIST)pCOMCTL32_Alloc(len); 400 if (newpidl) 401 memcpy(newpidl,pidl,len); 402 403 TRACE("pidl=%p newpidl=%p\n",pidl, newpidl); 404 pdump(pidl); 405 406 return newpidl; 408 407 } 409 408 … … 414 413 BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) 415 414 { 416 charszData1[MAX_PATH];417 charszData2[MAX_PATH];418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 } 444 445 446 447 448 449 450 415 char szData1[MAX_PATH]; 416 char szData2[MAX_PATH]; 417 418 LPITEMIDLIST pidltemp1 = pidl1; 419 LPITEMIDLIST pidltemp2 = pidl2; 420 421 TRACE("pidl1=%p pidl2=%p\n",pidl1, pidl2); 422 423 /* explorer reads from registry directly (StreamMRU), 424 so we can only check here */ 425 if ((!pcheck (pidl1)) || (!pcheck (pidl2))) return FALSE; 426 427 pdump (pidl1); 428 pdump (pidl2); 429 430 if ( (!pidl1) || (!pidl2) ) return FALSE; 431 432 while (pidltemp1->mkid.cb && pidltemp2->mkid.cb) 433 { 434 _ILSimpleGetText(pidltemp1, szData1, MAX_PATH); 435 _ILSimpleGetText(pidltemp2, szData2, MAX_PATH); 436 437 if (strcasecmp ( szData1, szData2 )!=0 ) 438 return FALSE; 439 440 pidltemp1 = ILGetNext(pidltemp1); 441 pidltemp2 = ILGetNext(pidltemp2); 442 } 443 444 if (!pidltemp1->mkid.cb && !pidltemp2->mkid.cb) 445 { 446 return TRUE; 447 } 448 449 return FALSE; 451 450 } 452 451 /************************************************************************* 453 452 * ILIsParent [SHELL32.23] 454 453 * 455 * parent=a/b 456 * 457 * 454 * parent=a/b child=a/b/c -> true, c is in folder a/b 455 * child=a/b/c/d -> false if bImmediate is true, d is not in folder a/b 456 * child=a/b/c/d -> true if bImmediate is false, d is in a subfolder of a/b 458 457 */ 459 458 BOOL WINAPI ILIsParent( LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild, BOOL bImmediate) 460 459 { 461 charszData1[MAX_PATH];462 charszData2[MAX_PATH];463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 } 480 481 if ( pParent->mkid.cb || ! pChild->mkid.cb)/* child shorter or has equal length to parent */482 483 484 if ( ILGetNext(pChild)->mkid.cb && bImmediate)/* not immediate descent */485 486 487 460 char szData1[MAX_PATH]; 461 char szData2[MAX_PATH]; 462 463 LPITEMIDLIST pParent = pidlParent; 464 LPITEMIDLIST pChild = pidlChild; 465 466 TRACE("%p %p %x\n", pidlParent, pidlChild, bImmediate); 467 468 while (pParent->mkid.cb && pChild->mkid.cb) 469 { 470 _ILSimpleGetText(pParent, szData1, MAX_PATH); 471 _ILSimpleGetText(pChild, szData2, MAX_PATH); 472 473 if (strcasecmp ( szData1, szData2 )!=0 ) 474 return FALSE; 475 476 pParent = ILGetNext(pParent); 477 pChild = ILGetNext(pChild); 478 } 479 480 if ( pParent->mkid.cb || ! pChild->mkid.cb) /* child shorter or has equal length to parent */ 481 return FALSE; 482 483 if ( ILGetNext(pChild)->mkid.cb && bImmediate) /* not immediate descent */ 484 return FALSE; 485 486 return TRUE; 488 487 } 489 488 … … 494 493 * Compares elements from pidl1 and pidl2. 495 494 * 496 * pidl1 is desktop 497 * pidl1 shorter pidl2 498 * 499 * pidl2 shorter pidl1 500 * pidl2 equal pidl1 495 * pidl1 is desktop pidl2 496 * pidl1 shorter pidl2 pointer to first different element of pidl2 497 * if there was at least one equal element 498 * pidl2 shorter pidl1 0 499 * pidl2 equal pidl1 pointer to last 0x00-element of pidl2 501 500 */ 502 501 LPITEMIDLIST WINAPI ILFindChild(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2) 503 502 { 504 charszData1[MAX_PATH];505 charszData2[MAX_PATH];506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 ret = pidltemp2; 538 539 540 541 542 543 544 545 546 503 char szData1[MAX_PATH]; 504 char szData2[MAX_PATH]; 505 506 LPITEMIDLIST pidltemp1 = pidl1; 507 LPITEMIDLIST pidltemp2 = pidl2; 508 LPITEMIDLIST ret=NULL; 509 510 TRACE("pidl1=%p pidl2=%p\n",pidl1, pidl2); 511 512 /* explorer reads from registry directly (StreamMRU), 513 so we can only check here */ 514 if ((!pcheck (pidl1)) || (!pcheck (pidl2))) 515 return FALSE; 516 517 pdump (pidl1); 518 pdump (pidl2); 519 520 if ( _ILIsDesktop(pidl1) ) 521 { 522 ret = pidl2; 523 } 524 else 525 { 526 while (pidltemp1->mkid.cb && pidltemp2->mkid.cb) 527 { 528 _ILSimpleGetText(pidltemp1, szData1, MAX_PATH); 529 _ILSimpleGetText(pidltemp2, szData2, MAX_PATH); 530 531 if (strcasecmp(szData1,szData2)) 532 break; 533 534 pidltemp1 = ILGetNext(pidltemp1); 535 pidltemp2 = ILGetNext(pidltemp2); 536 ret = pidltemp2; 537 } 538 539 if (pidltemp1->mkid.cb) 540 { 541 ret = NULL; /* elements of pidl1 left*/ 542 } 543 } 544 TRACE_(shell)("--- %p\n", ret); 545 return ret; /* pidl 1 is shorter */ 547 546 } 548 547 … … 557 556 LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2) 558 557 { 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 558 DWORD len1,len2; 559 LPITEMIDLIST pidlNew; 560 561 TRACE("pidl=%p pidl=%p\n",pidl1,pidl2); 562 563 if(!pidl1 && !pidl2) return NULL; 564 565 pdump (pidl1); 566 pdump (pidl2); 567 568 if(!pidl1) 569 { 570 pidlNew = ILClone(pidl2); 571 return pidlNew; 572 } 573 574 if(!pidl2) 575 { 576 pidlNew = ILClone(pidl1); 577 return pidlNew; 578 } 579 580 len1 = ILGetSize(pidl1)-2; 581 len2 = ILGetSize(pidl2); 582 pidlNew = SHAlloc(len1+len2); 583 584 if (pidlNew) 585 { 586 memcpy(pidlNew,pidl1,len1); 587 memcpy(((BYTE *)pidlNew)+len1,pidl2,len2); 588 } 589 590 /* TRACE(pidl,"--new pidl=%p\n",pidlNew);*/ 591 return pidlNew; 593 592 } 594 593 /************************************************************************* … … 599 598 LPITEMIDLIST WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPITEMIDLIST pidl, DWORD z) 600 599 { 601 602 603 604 600 FIXME("sf=%p pidl=%p 0x%04lx\n",lpsf,pidl,z); 601 602 pdump (pidl); 603 return 0; 605 604 } 606 605 … … 609 608 * 610 609 * NOTES 611 * pild = CSIDL_DESKTOP 612 * pild = CSIDL_DRIVES 610 * pild = CSIDL_DESKTOP ret = 0 611 * pild = CSIDL_DRIVES ret = 0 613 612 */ 614 613 LPITEMIDLIST WINAPI SHLogILFromFSIL(LPITEMIDLIST pidl) 615 614 { 616 617 618 619 620 615 FIXME("(pidl=%p)\n",pidl); 616 617 pdump(pidl); 618 619 return 0; 621 620 } 622 621 … … 636 635 DWORD WINAPI ILGetSize(LPITEMIDLIST pidl) 637 636 { 638 639 640 641 642 { while (si->cb) 643 644 645 646 647 648 649 637 LPSHITEMID si = &(pidl->mkid); 638 DWORD len=0; 639 640 if (pidl) 641 { while (si->cb) 642 { len += si->cb; 643 si = (LPSHITEMID)(((LPBYTE)si)+si->cb); 644 } 645 len += 2; 646 } 647 TRACE("pidl=%p size=%lu\n",pidl, len); 648 return len; 650 649 } 651 650 … … 662 661 LPITEMIDLIST WINAPI ILGetNext(LPITEMIDLIST pidl) 663 662 { 664 665 666 667 668 669 670 671 672 673 674 675 676 677 663 WORD len; 664 665 TRACE("(pidl=%p)\n",pidl); 666 667 if(pidl) 668 { 669 len = pidl->mkid.cb; 670 if (len) 671 { 672 pidl = (LPITEMIDLIST) (((LPBYTE)pidl)+len); 673 return pidl; 674 } 675 } 676 return NULL; 678 677 } 679 678 /************************************************************************* … … 688 687 LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl,LPCITEMIDLIST item,BOOL bEnd) 689 688 { 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 689 LPITEMIDLIST idlRet; 690 691 WARN("(pidl=%p,pidl=%p,%08u)semi-stub\n",pidl,item,bEnd); 692 693 pdump (pidl); 694 pdump (item); 695 696 if (_ILIsDesktop(pidl)) 697 { 698 idlRet = ILClone(item); 699 if (pidl) 700 SHFree (pidl); 701 return idlRet; 702 } 703 704 if (bEnd) 705 { 706 idlRet=ILCombine(pidl,item); 707 } 708 else 709 { 710 idlRet=ILCombine(item,pidl); 711 } 712 713 SHFree(pidl); 714 return idlRet; 716 715 } 717 716 /************************************************************************* … … 723 722 * exported by ordinal 724 723 */ 725 DWORD WINAPI ILFree(LPITEMIDLIST pidl) 726 { 727 728 729 730 731 724 DWORD WINAPI ILFree(LPITEMIDLIST pidl) 725 { 726 TRACE("(pidl=0x%08lx)\n",(DWORD)pidl); 727 728 if(!pidl) return FALSE; 729 SHFree(pidl); 730 return TRUE; 732 731 } 733 732 /************************************************************************* … … 737 736 void WINAPI ILGlobalFree( LPCITEMIDLIST pidl) 738 737 { 739 740 741 742 738 TRACE("%p\n",pidl); 739 740 if(!pidl) return; 741 pCOMCTL32_Free(pidl); 743 742 } 744 743 /************************************************************************* … … 746 745 * 747 746 */ 748 LPITEMIDLIST WINAPI ILCreateFromPathA (LPCSTR path) 749 { 750 751 752 753 754 755 756 757 758 } 759 LPITEMIDLIST WINAPI ILCreateFromPathW (LPCWSTR path) 760 { 761 762 763 764 765 766 767 768 769 } 770 LPITEMIDLIST WINAPI ILCreateFromPathAW (LPCVOID path) 771 { 772 773 774 747 LPITEMIDLIST WINAPI 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 LPITEMIDLIST WINAPI ILCreateFromPathW (LPCWSTR path) 759 { 760 LPITEMIDLIST pidlnew; 761 DWORD attributes = 0; 762 763 TRACE_(shell)("%s\n",debugstr_w(path)); 764 765 if (SUCCEEDED (SHILCreateFromPathW (path, &pidlnew, &attributes))) 766 return pidlnew; 767 return FALSE; 768 } 769 LPITEMIDLIST WINAPI ILCreateFromPathAW (LPCVOID path) 770 { 771 if ( SHELL_OsIsUnicode()) 772 return ILCreateFromPathW (path); 773 return ILCreateFromPathA (path); 775 774 } 776 775 /************************************************************************* … … 779 778 LPITEMIDLIST WINAPI SHSimpleIDListFromPathA (LPCSTR lpszPath) 780 779 { 781 LPITEMIDLISTpidl=NULL;782 HANDLEhFile;783 WIN32_FIND_DATAAstffile;784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 780 LPITEMIDLIST pidl=NULL; 781 HANDLE hFile; 782 WIN32_FIND_DATAA stffile; 783 784 TRACE("path=%s\n", lpszPath); 785 786 if (!lpszPath) return NULL; 787 788 hFile = FindFirstFileA(lpszPath, &stffile); 789 790 if ( hFile != INVALID_HANDLE_VALUE ) 791 { 792 if (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 793 { 794 pidl = _ILCreateFolder (&stffile); 795 } 796 else 797 { 798 pidl = _ILCreateValue (&stffile); 799 } 800 FindClose (hFile); 801 } 802 return pidl; 804 803 } 805 804 LPITEMIDLIST WINAPI SHSimpleIDListFromPathW (LPCWSTR lpszPath) 806 805 { 807 charlpszTemp[MAX_PATH];808 806 char lpszTemp[MAX_PATH]; 807 TRACE("path=%s\n",debugstr_w(lpszPath)); 809 808 810 809 if (!WideCharToMultiByte( CP_ACP, 0, lpszPath, -1, lpszTemp, sizeof(lpszTemp), NULL, NULL )) 811 810 lpszTemp[sizeof(lpszTemp)-1] = 0; 812 811 813 812 return SHSimpleIDListFromPathA (lpszTemp); 814 813 } 815 814 816 815 LPITEMIDLIST WINAPI SHSimpleIDListFromPathAW (LPCVOID lpszPath) 817 816 { 818 819 820 821 } 822 823 /************************************************************************* 824 * SHGetSpecialFolderLocation 817 if ( SHELL_OsIsUnicode()) 818 return SHSimpleIDListFromPathW (lpszPath); 819 return SHSimpleIDListFromPathA (lpszPath); 820 } 821 822 /************************************************************************* 823 * SHGetSpecialFolderLocation [SHELL32.223] 825 824 * 826 825 * gets the folder locations from the registry and creates a pidl 827 826 * creates missing reg keys and directorys 828 * 827 * 829 828 * PARAMS 830 829 * hwndOwner [I] … … 834 833 */ 835 834 HRESULT WINAPI SHGetSpecialFolderLocation( 836 837 838 839 { 840 CHARszPath[MAX_PATH];841 HRESULThr = E_INVALIDARG;842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 835 HWND hwndOwner, 836 INT nFolder, 837 LPITEMIDLIST * ppidl) 838 { 839 CHAR szPath[MAX_PATH]; 840 HRESULT hr = E_INVALIDARG; 841 842 TRACE_(shell)("(%04x,0x%x,%p)\n", hwndOwner,nFolder,ppidl); 843 844 if (ppidl) 845 { 846 *ppidl = NULL; 847 switch (nFolder) 848 { 849 case CSIDL_DESKTOP: 850 *ppidl = _ILCreateDesktop(); 851 break; 852 853 case CSIDL_DRIVES: 854 *ppidl = _ILCreateMyComputer(); 855 break; 856 857 case CSIDL_NETWORK: 858 *ppidl = _ILCreateNetwork (); 859 break; 860 861 case CSIDL_CONTROLS: 862 *ppidl = _ILCreateControl (); 863 break; 864 865 case CSIDL_PRINTERS: 866 *ppidl = _ILCreatePrinter (); 867 break; 868 869 case CSIDL_BITBUCKET: 870 *ppidl = _ILCreateBitBucket (); 871 break; 872 873 default: 874 if (SHGetSpecialFolderPathA(hwndOwner, szPath, nFolder, TRUE)) 875 { 876 DWORD attributes=0; 877 TRACE_(shell)("Value=%s\n",szPath); 878 hr = SHILCreateFromPathA(szPath, ppidl, &attributes); 879 } 880 } 881 if(*ppidl) hr = NOERROR; 882 } 883 884 TRACE_(shell)("-- (new pidl %p)\n",*ppidl); 885 return hr; 887 886 } 888 887 … … 895 894 */ 896 895 HRESULT WINAPI SHGetFolderLocation( 897 898 899 900 901 902 { 903 904 905 896 HWND hwnd, 897 int csidl, 898 HANDLE hToken, 899 DWORD dwFlags, 900 LPITEMIDLIST *ppidl) 901 { 902 FIXME("0x%04x 0x%08x 0x%08x 0x%08lx %p\n", 903 hwnd, csidl, hToken, dwFlags, ppidl); 904 return SHGetSpecialFolderLocation(hwnd, csidl, ppidl); 906 905 } 907 906 … … 915 914 HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID dest, int len) 916 915 { 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 916 TRACE_(shell)("sf=%p pidl=%p 0x%04x %p 0x%04x stub\n",psf,pidl,nFormat,dest,len); 917 918 pdump(pidl); 919 if (!psf || !dest ) return E_INVALIDARG; 920 921 switch (nFormat) 922 { 923 case SHGDFIL_FINDDATA: 924 { 925 WIN32_FIND_DATAA * pfd = dest; 926 927 if ( len < sizeof (WIN32_FIND_DATAA)) return E_INVALIDARG; 928 929 ZeroMemory(pfd, sizeof (WIN32_FIND_DATAA)); 930 _ILGetFileDateTime( pidl, &(pfd->ftLastWriteTime)); 931 pfd->dwFileAttributes = _ILGetFileAttributes(pidl, NULL, 0); 932 pfd->nFileSizeLow = _ILGetFileSize ( pidl, NULL, 0); 933 lstrcpynA(pfd->cFileName,_ILGetTextPointer(pidl), MAX_PATH); 934 lstrcpynA(pfd->cAlternateFileName,_ILGetSTextPointer(pidl), 14); 935 } 936 return NOERROR; 937 938 case SHGDFIL_NETRESOURCE: 939 case SHGDFIL_DESCRIPTIONID: 940 FIXME_(shell)("SHGDFIL %i stub\n", nFormat); 941 break; 942 943 default: 944 ERR_(shell)("Unknown SHGDFIL %i, please report\n", nFormat); 945 } 946 947 return E_INVALIDARG; 949 948 } 950 949 /************************************************************************* … … 954 953 HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID dest, int len) 955 954 { 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 955 TRACE_(shell)("sf=%p pidl=%p 0x%04x %p 0x%04x stub\n",psf,pidl,nFormat,dest,len); 956 957 pdump(pidl); 958 959 if (! psf || !dest ) return E_INVALIDARG; 960 961 switch (nFormat) 962 { 963 case SHGDFIL_FINDDATA: 964 { 965 WIN32_FIND_DATAW * pfd = dest; 966 967 if ( len < sizeof (WIN32_FIND_DATAW)) return E_INVALIDARG; 968 969 ZeroMemory(pfd, sizeof (WIN32_FIND_DATAA)); 970 _ILGetFileDateTime( pidl, &(pfd->ftLastWriteTime)); 971 pfd->dwFileAttributes = _ILGetFileAttributes(pidl, NULL, 0); 972 pfd->nFileSizeLow = _ILGetFileSize ( pidl, NULL, 0); 974 973 if (!MultiByteToWideChar( CP_ACP, 0, _ILGetTextPointer(pidl), -1, 975 974 pfd->cFileName, MAX_PATH )) … … 978 977 pfd->cAlternateFileName, 14 )) 979 978 pfd->cFileName[13] = 0; 980 981 982 983 984 985 986 987 988 989 990 991 992 } 993 994 /************************************************************************* 995 * SHGetPathFromIDListA 979 } 980 return NOERROR; 981 case SHGDFIL_NETRESOURCE: 982 case SHGDFIL_DESCRIPTIONID: 983 FIXME_(shell)("SHGDFIL %i stub\n", nFormat); 984 break; 985 986 default: 987 ERR_(shell)("Unknown SHGDFIL %i, please report\n", nFormat); 988 } 989 990 return E_INVALIDARG; 991 } 992 993 /************************************************************************* 994 * SHGetPathFromIDListA [SHELL32.261][NT 4.0: SHELL32.220] 996 995 * 997 996 * PARAMETERS 998 * pidl, [IN] pidl 997 * pidl, [IN] pidl 999 998 * pszPath [OUT] path 1000 999 * 1001 * RETURNS 1000 * RETURNS 1002 1001 * path from a passed PIDL. 1003 1002 * 1004 1003 * NOTES 1005 * 1006 * 1007 * 1004 * NULL returns FALSE 1005 * desktop pidl gives path to desktopdirectory back 1006 * special pidls returning FALSE 1008 1007 * 1009 1008 * FIXME … … 1011 1010 */ 1012 1011 BOOL WINAPI SHGetPathFromIDListA (LPCITEMIDLIST pidl,LPSTR pszPath) 1013 { 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOPDIRECTORY, FALSE); 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 } 1044 /************************************************************************* 1045 * SHGetPathFromIDListW 1012 { STRRET str; 1013 LPSHELLFOLDER shellfolder; 1014 1015 TRACE_(shell)("(pidl=%p,%p)\n",pidl,pszPath); 1016 1017 if (!pidl) return FALSE; 1018 1019 pdump(pidl); 1020 1021 if(_ILIsDesktop(pidl)) 1022 { 1023 SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOPDIRECTORY, FALSE); 1024 } 1025 else if (_ILIsSpecialFolder(ILFindLastID(pidl))) 1026 { 1027 /* we are somewhere in a special folder */ 1028 return FALSE; 1029 } 1030 else 1031 { 1032 if (SHGetDesktopFolder(&shellfolder)==S_OK) 1033 { 1034 IShellFolder_GetDisplayNameOf(shellfolder,pidl,SHGDN_FORPARSING,&str); 1035 StrRetToStrNA (pszPath, MAX_PATH, &str, pidl); 1036 IShellFolder_Release(shellfolder); 1037 } 1038 } 1039 TRACE_(shell)("-- (%s)\n",pszPath); 1040 1041 return TRUE; 1042 } 1043 /************************************************************************* 1044 * SHGetPathFromIDListW [SHELL32.262] 1046 1045 */ 1047 1046 BOOL WINAPI SHGetPathFromIDListW (LPCITEMIDLIST pidl,LPWSTR pszPath) 1048 { 1049 1050 1051 1052 1047 { char sTemp[MAX_PATH]; 1048 1049 TRACE_(shell)("(pidl=%p)\n", pidl); 1050 1051 SHGetPathFromIDListA (pidl, sTemp); 1053 1052 MultiByteToWideChar( CP_ACP, 0, sTemp, -1, pszPath, MAX_PATH ); 1054 1053 1055 1056 1057 1058 } 1059 1060 /************************************************************************* 1061 * SHBindToParent[shell version 5.0]1054 TRACE_(shell)("-- (%s)\n",debugstr_w(pszPath)); 1055 1056 return TRUE; 1057 } 1058 1059 /************************************************************************* 1060 * SHBindToParent [shell version 5.0] 1062 1061 */ 1063 1062 HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast) 1064 1063 { 1065 IShellFolder* psf;1066 LPITEMIDLISTpidlChild, pidlParent;1067 HRESULThr=E_FAIL;1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 if (ppidlLast) 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 } 1106 1107 /************************************************************************* 1108 * SHGetPathFromIDListAW 1064 IShellFolder * psf; 1065 LPITEMIDLIST pidlChild, pidlParent; 1066 HRESULT hr=E_FAIL; 1067 1068 TRACE_(shell)("pidl=%p\n", pidl); 1069 pdump(pidl); 1070 1071 *ppv = NULL; 1072 if (ppidlLast) *ppidlLast = NULL; 1073 1074 if (_ILIsPidlSimple(pidl)) 1075 { 1076 /* we are on desktop level */ 1077 if (ppidlLast) 1078 *ppidlLast = ILClone(pidl); 1079 hr = SHGetDesktopFolder((IShellFolder**)ppv); 1080 } 1081 else 1082 { 1083 pidlChild = ILClone(ILFindLastID(pidl)); 1084 pidlParent = ILClone(pidl); 1085 ILRemoveLastID(pidlParent); 1086 1087 hr = SHGetDesktopFolder(&psf); 1088 1089 if (SUCCEEDED(hr)) 1090 hr = IShellFolder_BindToObject(psf, pidlParent, NULL, riid, ppv); 1091 1092 if (SUCCEEDED(hr) && ppidlLast) 1093 *ppidlLast = pidlChild; 1094 else 1095 ILFree (pidlChild); 1096 1097 SHFree (pidlParent); 1098 if (psf) IShellFolder_Release(psf); 1099 } 1100 1101 1102 TRACE_(shell)("-- psf=%p pidl=%p ret=0x%08lx\n", *ppv, (ppidlLast)?*ppidlLast:NULL, hr); 1103 return hr; 1104 } 1105 1106 /************************************************************************* 1107 * SHGetPathFromIDListAW [SHELL32.221][NT 4.0: SHELL32.219] 1109 1108 */ 1110 1109 BOOL WINAPI SHGetPathFromIDListAW(LPCITEMIDLIST pidl,LPVOID pszPath) 1111 1110 { 1112 1113 1114 1115 1116 1111 TRACE_(shell)("(pidl=%p,%p)\n",pidl,pszPath); 1112 1113 if (SHELL_OsIsUnicode()) 1114 return SHGetPathFromIDListW(pidl,pszPath); 1115 return SHGetPathFromIDListA(pidl,pszPath); 1117 1116 } 1118 1117 1119 1118 /************************************************************************** 1120 1119 * 1121 * 1122 * 1123 * 1120 * internal functions 1121 * 1122 * ### 1. section creating pidls ### 1124 1123 * 1125 1124 ************************************************************************* … … 1128 1127 * _ILCreateMyComputer() 1129 1128 * _ILCreateDrive() 1130 * _ILCreateFolder() 1129 * _ILCreateFolder() 1131 1130 * _ILCreateValue() 1132 1131 */ 1133 1132 LPITEMIDLIST _ILCreateDesktop() 1134 { 1135 1133 { TRACE("()\n"); 1134 return _ILCreate(PT_DESKTOP, NULL, 0); 1136 1135 } 1137 1136 1138 1137 LPITEMIDLIST _ILCreateMyComputer() 1139 { 1140 1138 { TRACE("()\n"); 1139 return _ILCreate(PT_MYCOMP, &CLSID_MyComputer, sizeof(GUID)); 1141 1140 } 1142 1141 1143 1142 LPITEMIDLIST _ILCreateIExplore() 1144 { 1145 1143 { TRACE("()\n"); 1144 return _ILCreate(PT_MYCOMP, &CLSID_Internet, sizeof(GUID)); 1146 1145 } 1147 1146 1148 1147 LPITEMIDLIST _ILCreateControl() 1149 { 1150 1148 { TRACE("()\n"); 1149 return _ILCreate(PT_SPECIAL, &CLSID_ControlPanel, sizeof(GUID)); 1151 1150 } 1152 1151 1153 1152 LPITEMIDLIST _ILCreatePrinter() 1154 { 1155 1153 { TRACE("()\n"); 1154 return _ILCreate(PT_SPECIAL, &CLSID_Printers, sizeof(GUID)); 1156 1155 } 1157 1156 1158 1157 LPITEMIDLIST _ILCreateNetwork() 1159 { 1160 1158 { TRACE("()\n"); 1159 return _ILCreate(PT_MYCOMP, &CLSID_NetworkPlaces, sizeof(GUID)); 1161 1160 } 1162 1161 1163 1162 LPITEMIDLIST _ILCreateBitBucket() 1164 { 1165 1163 { TRACE("()\n"); 1164 return _ILCreate(PT_MYCOMP, &CLSID_RecycleBin, sizeof(GUID)); 1166 1165 } 1167 1166 1168 1167 LPITEMIDLIST _ILCreateDrive( LPCSTR lpszNew) 1169 { 1170 1171 1172 1173 1174 1168 { char sTemp[4]; 1169 lstrcpynA (sTemp,lpszNew,4); 1170 sTemp[2]='\\'; 1171 sTemp[3]=0x00; 1172 TRACE("(%s)\n",sTemp); 1173 return _ILCreate(PT_DRIVE,(LPVOID)&sTemp[0],4); 1175 1174 } 1176 1175 1177 1176 LPITEMIDLIST _ILCreateFolder( WIN32_FIND_DATAA * stffile ) 1178 1177 { 1179 charbuff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */1180 char *pbuff = buff;1181 ULONGlen, len1;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 1178 char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ 1179 char * pbuff = buff; 1180 ULONG len, len1; 1181 LPITEMIDLIST pidl; 1182 1183 TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); 1184 1185 /* prepare buffer with both names */ 1186 len = strlen (stffile->cFileName) + 1; 1187 memcpy (pbuff, stffile->cFileName, len); 1188 pbuff += len; 1189 1190 if (stffile->cAlternateFileName) 1191 { 1192 len1 = strlen (stffile->cAlternateFileName)+1; 1193 memcpy (pbuff, stffile->cAlternateFileName, len1); 1194 } 1195 else 1196 { 1197 len1 = 1; 1198 *pbuff = 0x00; 1199 } 1200 1201 pidl = _ILCreate(PT_FOLDER, (LPVOID)buff, len + len1); 1202 1203 /* set attributes */ 1204 if (pidl) 1205 { 1206 LPPIDLDATA pData; 1207 pData = _ILGetDataPointer(pidl); 1208 FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.folder.uFileDate,&pData->u.folder.uFileTime); 1209 pData->u.folder.dwFileSize = stffile->nFileSizeLow; 1210 pData->u.folder.uFileAttribs=stffile->dwFileAttributes; 1211 } 1212 1213 return pidl; 1215 1214 } 1216 1215 1217 1216 LPITEMIDLIST _ILCreateValue(WIN32_FIND_DATAA * stffile) 1218 1217 { 1219 charbuff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */1220 char *pbuff = buff;1221 ULONGlen, len1;1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1218 char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ 1219 char * pbuff = buff; 1220 ULONG len, len1; 1221 LPITEMIDLIST pidl; 1222 1223 TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); 1224 1225 /* prepare buffer with both names */ 1226 len = strlen (stffile->cFileName) + 1; 1227 memcpy (pbuff, stffile->cFileName, len); 1228 pbuff += len; 1229 1230 if (stffile->cAlternateFileName) 1231 { 1232 len1 = strlen (stffile->cAlternateFileName)+1; 1233 memcpy (pbuff, stffile->cAlternateFileName, len1); 1234 } 1235 else 1236 { 1237 len1 = 1; 1238 *pbuff = 0x00; 1239 } 1240 1241 pidl = _ILCreate(PT_VALUE, (LPVOID)buff, len + len1); 1242 1243 /* set attributes */ 1244 if (pidl) 1245 { 1246 LPPIDLDATA pData; 1247 pData = _ILGetDataPointer(pidl); 1248 FileTimeToDosDateTime(&(stffile->ftLastWriteTime),&pData->u.folder.uFileDate,&pData->u.folder.uFileTime); 1249 pData->u.folder.dwFileSize = stffile->nFileSizeLow; 1250 pData->u.folder.uFileAttribs=stffile->dwFileAttributes; 1251 } 1252 1253 return pidl; 1255 1254 } 1256 1255 … … 1276 1275 LPITEMIDLIST _ILCreate(PIDLTYPE type, LPCVOID pIn, UINT uInSize) 1277 1276 { 1278 1279 1280 1281 LPSTRpszDest;1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 case PT_VALUE: 1299 1300 1301 1302 FIXME("can't create type: 0x%08x\n",type); 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 case PT_VALUE: 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1277 LPITEMIDLIST pidlOut = NULL, pidlTemp = NULL; 1278 LPPIDLDATA pData; 1279 UINT uSize = 0; 1280 LPSTR pszDest; 1281 1282 TRACE("(0x%02x %p %i)\n",type,pIn,uInSize); 1283 1284 switch (type) 1285 { 1286 case PT_DESKTOP: 1287 uSize = 0; 1288 break; 1289 case PT_SPECIAL: 1290 case PT_MYCOMP: 1291 uSize = 2 + 2 + sizeof(GUID); 1292 break; 1293 case PT_DRIVE: 1294 uSize = 2 + 23; 1295 break; 1296 case PT_FOLDER: 1297 case PT_VALUE: 1298 uSize = 2 + 12 + uInSize; 1299 break; 1300 default: 1301 FIXME("can't create type: 0x%08x\n",type); 1302 return NULL; 1303 } 1304 1305 if(!(pidlOut = SHAlloc(uSize + 2))) return NULL; 1306 ZeroMemory(pidlOut, uSize + 2); 1307 pidlOut->mkid.cb = uSize; 1308 1309 switch (type) 1310 { 1311 case PT_DESKTOP: 1312 TRACE("- create Desktop\n"); 1313 break; 1314 1315 case PT_SPECIAL: 1316 case PT_MYCOMP: 1317 pData =_ILGetDataPointer(pidlOut); 1318 pData->type = type; 1319 memcpy(&(pData->u.mycomp.guid), pIn, uInSize); 1320 TRACE("- create GUID-pidl\n"); 1321 break; 1322 1323 case PT_DRIVE: 1324 pData =_ILGetDataPointer(pidlOut); 1325 pData->type = type; 1326 pszDest = _ILGetTextPointer(pidlOut); 1327 memcpy(pszDest, pIn, uInSize); 1328 TRACE("- create Drive: %s\n",debugstr_a(pszDest)); 1329 break; 1330 1331 case PT_FOLDER: 1332 case PT_VALUE: 1333 pData =_ILGetDataPointer(pidlOut); 1334 pData->type = type; 1335 pszDest = _ILGetTextPointer(pidlOut); 1336 memcpy(pszDest, pIn, uInSize); 1337 TRACE("- create Value: %s\n",debugstr_a(pszDest)); 1338 break; 1339 } 1340 1341 pidlTemp = ILGetNext(pidlOut); 1342 if (pidlTemp) 1343 pidlTemp->mkid.cb = 0x00; 1344 1345 TRACE("-- (pidl=%p, size=%u)\n", pidlOut, uSize); 1346 return pidlOut; 1348 1347 } 1349 1348 … … 1357 1356 */ 1358 1357 DWORD _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT uSize) 1359 { 1360 1361 1362 1363 1364 1365 1366 1367 1358 { TRACE("(%p,%p,%u)\n",pidl,pOut,uSize); 1359 1360 if(_ILIsMyComputer(pidl)) 1361 pidl = ILGetNext(pidl); 1362 1363 if (pidl && _ILIsDrive(pidl)) 1364 return _ILSimpleGetText(pidl, pOut, uSize); 1365 1366 return 0; 1368 1367 } 1369 1368 1370 1369 /************************************************************************** 1371 1370 * 1372 * 1371 * ### 2. section testing pidls ### 1373 1372 * 1374 1373 ************************************************************************** … … 1382 1381 */ 1383 1382 BOOL _ILIsDesktop(LPCITEMIDLIST pidl) 1384 { 1385 1383 { TRACE("(%p)\n",pidl); 1384 return ( !pidl || (pidl && pidl->mkid.cb == 0x00) ); 1386 1385 } 1387 1386 1388 1387 BOOL _ILIsMyComputer(LPCITEMIDLIST pidl) 1389 1388 { 1390 1391 1392 1393 1394 1395 1396 1389 REFIID iid = _ILGetGUIDPointer(pidl); 1390 1391 TRACE("(%p)\n",pidl); 1392 1393 if (iid) 1394 return IsEqualIID(iid, &CLSID_MyComputer); 1395 return FALSE; 1397 1396 } 1398 1397 1399 1398 BOOL _ILIsSpecialFolder (LPCITEMIDLIST pidl) 1400 1399 { 1401 1402 1403 return (pidl && ( (lpPData && (PT_MYCOMP== lpPData->type || PT_SPECIAL== lpPData->type)) || 1404 1405 1400 LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1401 TRACE("(%p)\n",pidl); 1402 return (pidl && ( (lpPData && (PT_MYCOMP== lpPData->type || PT_SPECIAL== lpPData->type)) || 1403 (pidl && pidl->mkid.cb == 0x00) 1404 )); 1406 1405 } 1407 1406 1408 1407 BOOL _ILIsDrive(LPCITEMIDLIST pidl) 1409 { 1410 1411 1412 1413 1414 1408 { LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1409 TRACE("(%p)\n",pidl); 1410 return (pidl && lpPData && (PT_DRIVE == lpPData->type || 1411 PT_DRIVE1 == lpPData->type || 1412 PT_DRIVE2 == lpPData->type || 1413 PT_DRIVE3 == lpPData->type)); 1415 1414 } 1416 1415 1417 1416 BOOL _ILIsFolder(LPCITEMIDLIST pidl) 1418 { 1419 1420 1417 { LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1418 TRACE("(%p)\n",pidl); 1419 return (pidl && lpPData && (PT_FOLDER == lpPData->type || PT_FOLDER1 == lpPData->type)); 1421 1420 } 1422 1421 1423 1422 BOOL _ILIsValue(LPCITEMIDLIST pidl) 1424 { 1425 1426 1423 { LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1424 TRACE("(%p)\n",pidl); 1425 return (pidl && lpPData && PT_VALUE == lpPData->type); 1427 1426 } 1428 1427 1429 1428 /************************************************************************** 1430 * 1429 * _ILIsPidlSimple 1431 1430 */ 1432 1431 BOOL _ILIsPidlSimple ( LPCITEMIDLIST pidl) 1433 1432 { 1434 1435 1436 if(! _ILIsDesktop(pidl))/* pidl=NULL or mkid.cb=0 */1437 1438 1439 1440 1441 1442 1443 1444 1445 1433 BOOL ret = TRUE; 1434 1435 if(! _ILIsDesktop(pidl)) /* pidl=NULL or mkid.cb=0 */ 1436 { 1437 WORD len = pidl->mkid.cb; 1438 LPCITEMIDLIST pidlnext = (LPCITEMIDLIST) (((LPBYTE)pidl) + len ); 1439 if (pidlnext->mkid.cb) 1440 ret = FALSE; 1441 } 1442 1443 TRACE("%s\n", ret ? "Yes" : "No"); 1444 return ret; 1446 1445 } 1447 1446 1448 1447 /************************************************************************** 1449 1448 * 1450 * 1449 * ### 3. section getting values from pidls ### 1451 1450 */ 1452 1451 … … 1460 1459 DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize) 1461 1460 { 1462 DWORD dwReturn=0; 1463 LPSTRszSrc;1464 GUID const *riid;1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 if (_ILIsDesktop(pidl)) 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1461 DWORD dwReturn=0; 1462 LPSTR szSrc; 1463 GUID const * riid; 1464 char szTemp[MAX_PATH]; 1465 1466 TRACE("(%p %p %x)\n",pidl,szOut,uOutSize); 1467 1468 if (!pidl) return 0; 1469 1470 if (szOut) 1471 *szOut = 0; 1472 1473 if (_ILIsDesktop(pidl)) 1474 { 1475 /* desktop */ 1476 if (HCR_GetClassName(&CLSID_ShellDesktop, szTemp, MAX_PATH)) 1477 { 1478 if (szOut) 1479 lstrcpynA(szOut, szTemp, uOutSize); 1480 1481 dwReturn = strlen (szTemp); 1482 } 1483 } 1484 else if (( szSrc = _ILGetTextPointer(pidl) )) 1485 { 1486 /* filesystem */ 1487 if (szOut) 1488 lstrcpynA(szOut, szSrc, uOutSize); 1489 1490 dwReturn = strlen(szSrc); 1491 } 1492 else if (( riid = _ILGetGUIDPointer(pidl) )) 1493 { 1494 /* special folder */ 1495 if ( HCR_GetClassName(riid, szTemp, MAX_PATH) ) 1496 { 1497 if (szOut) 1498 lstrcpynA(szOut, szTemp, uOutSize); 1499 1500 dwReturn = strlen (szTemp); 1501 } 1502 } 1503 else 1504 { 1505 ERR("-- no text\n"); 1506 } 1507 1508 TRACE("-- (%p=%s 0x%08lx)\n",szOut,(char*)szOut,dwReturn); 1509 return dwReturn; 1511 1510 } 1512 1511 1513 1512 /************************************************************************** 1514 1513 * 1515 * 1514 * ### 4. getting pointers to parts of pidls ### 1516 1515 * 1517 1516 ************************************************************************** … … 1520 1519 LPPIDLDATA _ILGetDataPointer(LPITEMIDLIST pidl) 1521 1520 { 1522 1523 1524 1521 if(pidl && pidl->mkid.cb != 0x00) 1522 return (LPPIDLDATA) &(pidl->mkid.abID); 1523 return NULL; 1525 1524 } 1526 1525 … … 1530 1529 */ 1531 1530 LPSTR _ILGetTextPointer(LPCITEMIDLIST pidl) 1532 {/* 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1531 {/* TRACE(pidl,"(pidl%p)\n", pidl);*/ 1532 1533 LPPIDLDATA pdata =_ILGetDataPointer(pidl); 1534 1535 if (pdata) 1536 { 1537 switch (pdata->type) 1538 { 1539 case PT_MYCOMP: 1540 case PT_SPECIAL: 1541 return NULL; 1542 1543 case PT_DRIVE: 1544 case PT_DRIVE1: 1545 case PT_DRIVE2: 1546 case PT_DRIVE3: 1547 return (LPSTR)&(pdata->u.drive.szDriveName); 1548 1549 case PT_FOLDER: 1550 case PT_FOLDER1: 1551 case PT_VALUE: 1552 case PT_IESPECIAL1: 1553 case PT_IESPECIAL2: 1554 return (LPSTR)&(pdata->u.file.szNames); 1555 1556 case PT_WORKGRP: 1557 case PT_COMP: 1558 case PT_NETWORK: 1559 case PT_SHARE: 1560 return (LPSTR)&(pdata->u.network.szNames); 1561 } 1562 } 1563 return NULL; 1565 1564 } 1566 1565 … … 1570 1569 */ 1571 1570 LPSTR _ILGetSTextPointer(LPCITEMIDLIST pidl) 1572 {/* 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1571 {/* TRACE(pidl,"(pidl%p)\n", pidl);*/ 1572 1573 LPPIDLDATA pdata =_ILGetDataPointer(pidl); 1574 1575 if (pdata) 1576 { 1577 switch (pdata->type) 1578 { 1579 case PT_FOLDER: 1580 case PT_VALUE: 1581 case PT_IESPECIAL1: 1582 case PT_IESPECIAL2: 1583 return (LPSTR)(pdata->u.file.szNames + strlen (pdata->u.file.szNames) + 1); 1584 1585 case PT_WORKGRP: 1586 return (LPSTR)(pdata->u.network.szNames + strlen (pdata->u.network.szNames) + 1); 1587 } 1588 } 1589 return NULL; 1591 1590 } 1592 1591 … … 1598 1597 REFIID _ILGetGUIDPointer(LPCITEMIDLIST pidl) 1599 1598 { 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1599 LPPIDLDATA pdata =_ILGetDataPointer(pidl); 1600 1601 if (pdata) 1602 { 1603 switch (pdata->type) 1604 { 1605 case PT_SPECIAL: 1606 case PT_MYCOMP: 1607 return (REFIID) &(pdata->u.mycomp.guid); 1608 } 1609 } 1610 return NULL; 1612 1611 } 1613 1612 … … 1625 1624 * 1626 1625 * NOTES 1627 * 1626 * 1628 1627 */ 1629 1628 BOOL _ILGetFileDateTime(LPCITEMIDLIST pidl, FILETIME *pFt) … … 1634 1633 1635 1634 switch (pdata->type) 1636 { 1635 { 1637 1636 case PT_FOLDER: 1638 1637 DosDateTimeToFileTime(pdata->u.folder.uFileDate, pdata->u.folder.uFileTime, pFt); 1639 break; 1638 break; 1640 1639 case PT_VALUE: 1641 1640 DosDateTimeToFileTime(pdata->u.file.uFileDate, pdata->u.file.uFileTime, pFt); … … 1648 1647 1649 1648 BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) 1650 { 1651 1652 1653 1654 1655 1656 1657 1658 1649 { 1650 FILETIME ft,lft; 1651 SYSTEMTIME time; 1652 1653 if (! _ILGetFileDateTime( pidl, &ft )) return FALSE; 1654 1655 FileTimeToLocalFileTime(&ft, &lft); 1656 FileTimeToSystemTime (&lft, &time); 1657 return GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL, pOut, uOutSize); 1659 1658 } 1660 1659 … … 1666 1665 * PARAMS 1667 1666 * pidl [I] The ItemIDList 1668 * pOut[I] The buffer to save the result1667 * pOut [I] The buffer to save the result 1669 1668 * uOutsize [I] The size of the buffer 1670 1669 * … … 1673 1672 * 1674 1673 * NOTES 1675 * 1676 * 1674 * pOut can be null when no string is needed 1675 * 1677 1676 */ 1678 1677 DWORD _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) 1679 1678 { 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1679 LPPIDLDATA pdata =_ILGetDataPointer(pidl); 1680 DWORD dwSize; 1681 1682 if(! pdata) return 0; 1683 1684 switch (pdata->type) 1685 { 1686 case PT_VALUE: 1687 dwSize = pdata->u.file.dwFileSize; 1688 if (pOut) StrFormatByteSizeA(dwSize, pOut, uOutSize); 1689 return dwSize; 1690 } 1691 if (pOut) *pOut = 0x00; 1692 return 0; 1694 1693 } 1695 1694 1696 1695 BOOL _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) 1697 1696 { 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1697 char szTemp[MAX_PATH]; 1698 const char * pPoint; 1699 LPITEMIDLIST pidlTemp=pidl; 1700 1701 TRACE("pidl=%p\n",pidl); 1702 1703 if (!pidl) return FALSE; 1704 1705 pidlTemp = ILFindLastID(pidl); 1706 1707 if (!_ILIsValue(pidlTemp)) return FALSE; 1708 if (!_ILSimpleGetText(pidlTemp, szTemp, MAX_PATH)) return FALSE; 1709 1710 pPoint = PathFindExtensionA(szTemp); 1711 1712 if (! *pPoint) return FALSE; 1713 1714 pPoint++; 1715 lstrcpynA(pOut, pPoint, uOutSize); 1716 TRACE("%s\n",pOut); 1717 1718 return TRUE; 1720 1719 } 1721 1720 … … 1731 1730 * 1732 1731 * RETURNS 1733 * 1734 * 1735 * NOTES 1736 * This function copies as much as possible into the buffer.1732 * nothing 1733 * 1734 * NOTES 1735 * This function copies as much as possible into the buffer. 1737 1736 */ 1738 1737 void _ILGetFileType(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) 1739 1738 { 1740 1741 1742 1739 if(_ILIsValue(pidl)) 1740 { 1741 char sTemp[64]; 1743 1742 if(uOutSize > 0) 1744 1743 { 1745 1744 pOut[0] = 0; 1746 1745 } 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1746 if (_ILGetExtension (pidl, sTemp, 64)) 1747 { 1748 if (!( HCR_MapTypeToValue(sTemp, sTemp, 64, TRUE) 1749 && HCR_MapTypeToValue(sTemp, pOut, uOutSize, FALSE ))) 1750 { 1751 lstrcpynA (pOut, sTemp, uOutSize - 6); 1752 strcat (pOut, "-file"); 1753 } 1754 } 1755 } 1756 else 1757 { 1758 lstrcpynA(pOut, "Folder", uOutSize); 1759 } 1761 1760 } 1762 1761 … … 1776 1775 * FIXME 1777 1776 * return value 0 in case of error is a valid return value 1778 * 1777 * 1779 1778 */ 1780 1779 DWORD _ILGetFileAttributes(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) 1781 1780 { 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1781 LPPIDLDATA pData =_ILGetDataPointer(pidl); 1782 WORD wAttrib = 0; 1783 int i; 1784 1785 if(! pData) return 0; 1786 1787 switch(pData->type) 1788 { 1789 case PT_FOLDER: 1790 wAttrib = pData->u.folder.uFileAttribs; 1791 break; 1792 case PT_VALUE: 1793 wAttrib = pData->u.file.uFileAttribs; 1794 break; 1795 } 1796 1797 if(uOutSize >= 6) 1798 { 1799 i=0; 1800 if(wAttrib & FILE_ATTRIBUTE_READONLY) 1801 { 1802 pOut[i++] = 'R'; 1803 } 1804 if(wAttrib & FILE_ATTRIBUTE_HIDDEN) 1805 { 1806 pOut[i++] = 'H'; 1807 } 1808 if(wAttrib & FILE_ATTRIBUTE_SYSTEM) 1809 { 1810 pOut[i++] = 'S'; 1811 } 1812 if(wAttrib & FILE_ATTRIBUTE_ARCHIVE) 1813 { 1814 pOut[i++] = 'A'; 1815 } 1816 if(wAttrib & FILE_ATTRIBUTE_COMPRESSED) 1817 { 1818 pOut[i++] = 'C'; 1819 } 1820 pOut[i] = 0x00; 1821 } 1822 return wAttrib; 1824 1823 } 1825 1824 … … 1831 1830 void _ILFreeaPidl(LPITEMIDLIST * apidl, UINT cidl) 1832 1831 { 1833 1834 1835 1836 1837 1838 1839 1832 int i; 1833 1834 if(apidl) 1835 { 1836 for(i = 0; i < cidl; i++) SHFree(apidl[i]); 1837 SHFree(apidl); 1838 } 1840 1839 } 1841 1840 … … 1847 1846 LPITEMIDLIST * _ILCopyaPidl(LPITEMIDLIST * apidlsrc, UINT cidl) 1848 1847 { 1849 1850 1851 1852 1853 1854 1855 1856 1848 int i; 1849 LPITEMIDLIST * apidldest = (LPITEMIDLIST*)SHAlloc(cidl * sizeof(LPITEMIDLIST)); 1850 if(!apidlsrc) return NULL; 1851 1852 for(i = 0; i < cidl; i++) 1853 apidldest[i] = ILClone(apidlsrc[i]); 1854 1855 return apidldest; 1857 1856 } 1858 1857 … … 1864 1863 LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, LPCIDA cida) 1865 1864 { 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 } 1865 int i; 1866 LPITEMIDLIST * dst = (LPITEMIDLIST*)SHAlloc(cida->cidl * sizeof(LPITEMIDLIST)); 1867 1868 if(!dst) return NULL; 1869 1870 if (pidl) 1871 *pidl = ILClone((LPITEMIDLIST)(&((LPBYTE)cida)[cida->aoffset[0]])); 1872 1873 for(i = 0; i < cida->cidl; i++) 1874 dst[i] = ILClone((LPITEMIDLIST)(&((LPBYTE)cida)[cida->aoffset[i + 1]])); 1875 1876 return dst; 1877 }
Note:
See TracChangeset
for help on using the changeset viewer.