- Timestamp:
- Jun 20, 2011, 7:19:48 PM (14 years ago)
- Location:
- trunk/src/shell32
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/shell32/pidl.c
r8614 r21639 52 52 { 53 53 BOOL bIsShellDebug; 54 54 55 55 LPITEMIDLIST pidltemp = pidl; 56 56 if (!TRACE_ON(pidl)) … … 70 70 MESSAGE ("PIDL: -------- pidl=%p\n", pidl); 71 71 if (pidltemp->mkid.cb) 72 { 72 { 73 73 do 74 74 { … … 189 189 pidl = ODIN_ILGETNEXT(pidl); 190 190 } 191 return pidlLast; 191 return pidlLast; 192 192 } 193 193 /************************************************************************* … … 219 219 if (!pidl) 220 220 return NULL; 221 221 222 222 len = ILGetSize(pidl); 223 223 newpidl = (LPITEMIDLIST)SHAlloc(len); … … 239 239 { DWORD len; 240 240 LPITEMIDLIST pidlNew = NULL; 241 241 242 242 TRACE("pidl=%p \n",pidl); 243 243 pdump(pidl); 244 244 245 245 if (pidl) 246 246 { 247 len = pidl->mkid.cb; 247 len = pidl->mkid.cb; 248 248 pidlNew = (LPITEMIDLIST) SHAlloc (len+2); 249 249 if (pidlNew) … … 270 270 DWORD dwBytesRead; 271 271 HRESULT ret = E_FAIL; 272 272 273 273 274 274 TRACE_(shell)("%p %p\n", pStream , ppPidl); … … 278 278 *ppPidl = NULL; 279 279 } 280 280 281 281 IStream_AddRef (pStream); 282 282 … … 291 291 } 292 292 } 293 293 294 294 /* we are not yet fully compatible */ 295 295 if (!pcheck(*ppPidl)) … … 297 297 *ppPidl = NULL; 298 298 } 299 299 300 300 301 301 IStream_Release (pStream); … … 315 315 WORD wLen = 0; 316 316 HRESULT ret = E_FAIL; 317 317 318 318 TRACE_(shell)("%p %p\n", pStream, pPidl); 319 319 … … 333 333 } 334 334 } 335 335 336 336 337 337 IStream_Release (pStream); … … 346 346 * wraper for IShellFolder::ParseDisplayName() 347 347 */ 348 HRESULT WIN32API SHILCreateFromPathA(LPCSTR path, LPITEMIDLIST *ppidl, 348 HRESULT WIN32API SHILCreateFromPathA(LPCSTR path, LPITEMIDLIST *ppidl, 349 349 DWORD *attributes) 350 350 { LPSHELLFOLDER sf; … … 352 352 DWORD pchEaten; 353 353 HRESULT ret = E_FAIL; 354 354 355 355 TRACE_(shell)("%s %p 0x%08lx\n",path,ppidl,attributes?*attributes:0); 356 356 … … 367 367 368 368 369 HRESULT WIN32API SHILCreateFromPathW(LPCWSTR path, 370 LPITEMIDLIST * ppidl, 369 HRESULT WIN32API SHILCreateFromPathW(LPCWSTR path, 370 LPITEMIDLIST * ppidl, 371 371 DWORD * attributes) 372 372 { LPSHELLFOLDER sf; 373 373 DWORD pchEaten; 374 374 HRESULT ret = E_FAIL; 375 375 376 376 TRACE_(shell)("%s %p 0x%08lx\n",debugstr_w(path),ppidl,attributes?*attributes:0); 377 377 … … 392 392 /************************************************************************* 393 393 * SHCloneSpecialIDList [SHELL32.89] 394 * 394 * 395 395 * PARAMETERS 396 * hwndOwner [in] 396 * hwndOwner [in] 397 397 * nFolder [in] CSIDL_xxxxx ?? 398 398 * … … 425 425 if (!pidl) 426 426 return NULL; 427 427 428 428 len = ILGetSize(pidl); 429 429 newpidl = (LPITEMIDLIST)pCOMCTL32_Alloc(len); … … 459 459 460 460 if ( (!pidl1) || (!pidl2) ) return FALSE; 461 461 462 462 while (pidl1->mkid.cb && pidl2->mkid.cb) 463 463 { … … 465 465 if (pidl1->mkid.cb != pidl2->mkid.cb) 466 466 return FALSE; 467 467 468 468 // _ILSimpleGetText(pidltemp1, szData1, MAX_PATH); 469 469 // _ILSimpleGetText(pidltemp2, szData2, MAX_PATH); … … 476 476 pidl2 = ODIN_ILGETNEXT(pidl2); 477 477 } 478 478 479 479 if (!pidl1->mkid.cb && !pidl2->mkid.cb) 480 480 { … … 499 499 LPITEMIDLIST pParent = pidlParent; 500 500 LPITEMIDLIST pChild = pidlChild; 501 501 502 502 TRACE("%p %p %x\n", pidlParent, pidlChild, bImmediate); 503 503 … … 513 513 pParent = ODIN_ILGETNEXT(pParent); 514 514 pChild = ODIN_ILGETNEXT(pChild); 515 } 516 515 } 516 517 517 if ( pParent->mkid.cb || ! pChild->mkid.cb) /* child shorter or has equal length to parent */ 518 518 return FALSE; 519 519 520 520 if ( ODIN_ILGETNEXT(pChild)->mkid.cb && bImmediate) /* not immediate descent */ 521 521 return FALSE; 522 522 523 523 return TRUE; 524 524 } … … 572 572 pidltemp1 = ODIN_ILGETNEXT(pidltemp1); 573 573 pidltemp2 = ODIN_ILGETNEXT(pidltemp2); 574 ret = pidltemp2; 574 ret = pidltemp2; 575 575 } 576 576 … … 596 596 DWORD len1,len2; 597 597 LPITEMIDLIST pidlNew; 598 598 599 599 600 600 if(!pidl1 && !pidl2) return NULL; … … 637 637 { 638 638 dprintf(("not yet implemented")); 639 639 640 640 FIXME("sf=%p pidl=%p 0x%04lx\n",lpsf,pidl,z); 641 641 … … 654 654 { 655 655 dprintf(("not yet implemented")); 656 656 657 657 FIXME("(pidl=%p)\n",pidl); 658 658 … … 679 679 LPSHITEMID si = &(pidl->mkid); 680 680 DWORD len=0; 681 681 682 682 // @@@PH this cannot be correct: pidl==NULL would crash! 683 683 if (pidl) 684 { 684 { 685 685 while (si->cb) 686 { 686 { 687 687 len += si->cb; 688 688 si = (LPSHITEMID)(((LPBYTE)si)+si->cb); … … 740 740 pdump (pidl); 741 741 pdump (item); 742 742 743 743 if (_ILIsDesktop(pidl)) 744 744 { … … 771 771 DWORD ILFree(LPITEMIDLIST pidl) 772 772 { 773 if(!pidl) 773 if(!pidl) 774 774 return FALSE; 775 775 SHFree(pidl); … … 815 815 return FALSE; 816 816 } 817 LPITEMIDLIST WINAPI ILCreateFromPathAW (LPCVOID path) 817 LPITEMIDLIST WINAPI ILCreateFromPathAW (LPCVOID path) 818 818 { 819 819 if ( SHELL_OsIsUnicode()) … … 875 875 * gets the folder locations from the registry and creates a pidl 876 876 * creates missing reg keys and directorys 877 * 877 * 878 878 * PARAMS 879 879 * hwndOwner [I] … … 966 966 { 967 967 TRACE_(shell)("sf=%p pidl=%p 0x%04x %p 0x%04x stub\n",psf,pidl,nFormat,dest,len); 968 968 969 969 pdump(pidl); 970 970 if (!psf || !dest ) return E_INVALIDARG; … … 1051 1051 * 1052 1052 * PARAMETERS 1053 * pidl, [IN] pidl 1053 * pidl, [IN] pidl 1054 1054 * pszPath [OUT] path 1055 1055 * 1056 * RETURNS 1056 * RETURNS 1057 1057 * path from a passed PIDL. 1058 1058 * … … 1079 1079 if(_ILIsDesktop(pidl)) 1080 1080 { 1081 SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOPDIRECTORY, FALSE); 1081 SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOPDIRECTORY, FALSE); 1082 1082 } 1083 1083 else if (_ILIsSpecialFolder(ILFindLastID(pidl))) … … 1129 1129 LPITEMIDLIST pidlChild, pidlParent; 1130 1130 HRESULT hr=E_FAIL; 1131 1131 1132 1132 TRACE_(shell)("pidl=%p\n", pidl); 1133 1133 pdump(pidl); 1134 1134 1135 1135 *ppv = NULL; 1136 1136 if (ppidlLast) *ppidlLast = NULL; … … 1139 1139 { 1140 1140 /* we are on desktop level */ 1141 if (ppidlLast) 1141 if (ppidlLast) 1142 1142 *ppidlLast = ILClone(pidl); 1143 1143 hr = SHGetDesktopFolder((IShellFolder**)ppv); … … 1192 1192 * _ILCreateMyComputer() 1193 1193 * _ILCreateDrive() 1194 * _ILCreateFolder() 1194 * _ILCreateFolder() 1195 1195 * _ILCreateValue() 1196 1196 */ … … 1245 1245 ULONG len, len1; 1246 1246 LPITEMIDLIST pidl; 1247 1247 1248 1248 TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); 1249 1249 … … 1265 1265 1266 1266 pidl = _ILCreate(PT_FOLDER, (LPVOID)buff, len + len1); 1267 1267 1268 1268 /* set attributes */ 1269 1269 if (pidl) … … 1285 1285 ULONG len, len1; 1286 1286 LPITEMIDLIST pidl; 1287 1287 1288 1288 TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); 1289 1289 … … 1305 1305 1306 1306 pidl = _ILCreate(PT_VALUE, (LPVOID)buff, len + len1); 1307 1307 1308 1308 /* set attributes */ 1309 1309 if (pidl) … … 1344 1344 UINT uSize = 0; 1345 1345 LPSTR pszDest; 1346 1346 1347 1347 TRACE("(0x%02x %p %i)\n",type,pIn,uInSize); 1348 1348 … … 1360 1360 break; 1361 1361 case PT_FOLDER: 1362 case PT_VALUE: 1362 case PT_VALUE: 1363 1363 uSize = 2 + 12 + uInSize; 1364 1364 break; 1365 1365 default: 1366 FIXME("can't create type: 0x%08x\n",type); 1366 FIXME("can't create type: 0x%08x\n",type); 1367 1367 return NULL; 1368 1368 } … … 1395 1395 1396 1396 case PT_FOLDER: 1397 case PT_VALUE: 1397 case PT_VALUE: 1398 1398 pData =_ILGetDataPointer(pidlOut); 1399 1399 pData->type = type; … … 1403 1403 break; 1404 1404 } 1405 1405 1406 1406 pidlTemp = ODIN_ILGETNEXT(pidlOut); 1407 1407 if (pidlTemp) … … 1465 1465 LPPIDLDATA lpPData = _ILGetDataPointer(pidl); 1466 1466 TRACE("(%p)\n",pidl); 1467 return (pidl && ( (lpPData && (PT_MYCOMP== lpPData->type || PT_SPECIAL== lpPData->type)) || 1467 return (pidl && ( (lpPData && (PT_MYCOMP== lpPData->type || PT_SPECIAL== lpPData->type)) || 1468 1468 (pidl && pidl->mkid.cb == 0x00) 1469 1469 )); … … 1524 1524 DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize) 1525 1525 { 1526 DWORD dwReturn=0; 1526 DWORD dwReturn=0; 1527 1527 LPSTR szSrc; 1528 1528 GUID const * riid; 1529 1529 char szTemp[MAX_PATH]; 1530 1530 1531 1531 TRACE("(%p %p %x)\n",pidl,szOut,uOutSize); 1532 1532 1533 1533 if (!pidl) return 0; 1534 1534 … … 1536 1536 *szOut = 0; 1537 1537 1538 if (_ILIsDesktop(pidl)) 1538 if (_ILIsDesktop(pidl)) 1539 1539 { 1540 1540 /* desktop */ … … 1588 1588 LPSTR lpText1; 1589 1589 LPSTR lpText2; 1590 1590 1591 1591 char szTemp1[MAX_PATH]; 1592 1592 char szTemp2[MAX_PATH]; 1593 1593 GUID const * riid; 1594 1594 1595 1595 1596 1596 if (!pidl1 && !pidl2) 1597 1597 return 0; 1598 1598 1599 1599 if (!pidl1 && pidl2) 1600 1600 return -1; 1601 1601 1602 1602 if (pidl1 && !pidl2) 1603 1603 return 1; 1604 1605 1604 1605 1606 1606 // ------------- 1607 1607 // examine pidl1 … … 1626 1626 else 1627 1627 lpText1 = "undetermined"; 1628 1628 1629 1629 // ------------- 1630 1630 // examine pidl2 … … 1649 1649 else 1650 1650 lpText2 = "undetermined"; 1651 1652 1651 1652 1653 1653 // now finally compare the texts 1654 1654 return strcasecmp(lpText1, lpText2); … … 1770 1770 * 1771 1771 * NOTES 1772 * 1772 * 1773 1773 */ 1774 1774 BOOL _ILGetFileDateTime(LPCITEMIDLIST pidl, FILETIME *pFt) … … 1779 1779 1780 1780 switch (pdata->type) 1781 { 1781 { 1782 1782 case PT_FOLDER: 1783 1783 DosDateTimeToFileTime(pdata->u.folder.uFileDate, pdata->u.folder.uFileTime, pFt); 1784 break; 1784 break; 1785 1785 case PT_VALUE: 1786 1786 DosDateTimeToFileTime(pdata->u.file.uFileDate, pdata->u.file.uFileTime, pFt); … … 1793 1793 1794 1794 BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) 1795 { 1795 { 1796 1796 FILETIME ft,lft; 1797 1797 SYSTEMTIME time; 1798 1798 1799 1799 if (! _ILGetFileDateTime( pidl, &ft )) return FALSE; 1800 1800 1801 1801 FileTimeToLocalFileTime(&ft, &lft); 1802 1802 FileTimeToSystemTime (&lft, &time); … … 1819 1819 * NOTES 1820 1820 * pOut can be null when no string is needed 1821 * 1821 * 1822 1822 */ 1823 1823 DWORD _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) … … 1825 1825 LPPIDLDATA pdata =_ILGetDataPointer(pidl); 1826 1826 DWORD dwSize; 1827 1827 1828 1828 if(! pdata) return 0; 1829 1829 … … 1844 1844 const char * pPoint; 1845 1845 LPITEMIDLIST pidlTemp=pidl; 1846 1846 1847 1847 TRACE("pidl=%p\n",pidl); 1848 1848 1849 1849 if (!pidl) return FALSE; 1850 1850 1851 1851 pidlTemp = ILFindLastID(pidl); 1852 1852 1853 1853 if (!_ILIsValue(pidlTemp)) return FALSE; 1854 1854 if (!_ILSimpleGetText(pidlTemp, szTemp, MAX_PATH)) return FALSE; … … 1879 1879 * 1880 1880 * NOTES 1881 * This function copies as much as possible into the buffer. 1881 * This function copies as much as possible into the buffer. 1882 1882 */ 1883 1883 void _ILGetFileType(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) … … 1885 1885 if(_ILIsValue(pidl)) 1886 1886 { 1887 char sTemp[64]; 1888 if(uOutSize > 0) 1889 { 1890 pOut[0] = 0; 1891 } 1892 if (_ILGetExtension (pidl, sTemp, 64)) 1893 { 1894 if (!( HCR_MapTypeToValue(sTemp, sTemp, 64, TRUE) 1895 && HCR_MapTypeToValue(sTemp, pOut, uOutSize, FALSE ))) 1896 { 1897 lstrcpynA (pOut, sTemp, uOutSize - 6); 1898 strcat (pOut, "-file"); 1899 } 1900 } 1887 char sTemp[64]; 1888 if(uOutSize > 0) 1889 { 1890 pOut[0] = 0; 1891 } 1892 if (_ILGetExtension (pidl, sTemp, 64)) 1893 { 1894 if (!( HCR_MapTypeToValue(sTemp, sTemp, 64, TRUE) 1895 && HCR_MapTypeToValue(sTemp, pOut, uOutSize, FALSE ))) 1896 { 1897 lstrcpynA (pOut, sTemp, uOutSize - 6); 1898 strupr (pOut); 1899 strcat (pOut, " File"); 1900 } 1901 } 1901 1902 } 1902 1903 else 1903 1904 { 1904 lstrcpynA(pOut, "Folder", uOutSize); 1905 LPPIDLDATA pdata =_ILGetDataPointer(pidl); 1906 1907 if (pdata) 1908 { 1909 switch (pdata->type) 1910 { 1911 case PT_DRIVE: 1912 case PT_DRIVE1: 1913 case PT_DRIVE2: 1914 case PT_DRIVE3: 1915 { 1916 UINT type = 1917 GetDriveTypeA((LPSTR)&(pdata->u.drive.szDriveName)); 1918 GetDriveTypeA(_ILGetTextPointer(pidl)); 1919 switch (type) 1920 { 1921 case DRIVE_REMOVABLE: 1922 lstrcpynA(pOut, "Removable Disk", uOutSize); return; 1923 case DRIVE_FIXED: 1924 lstrcpynA(pOut, "Local Disk", uOutSize); return; 1925 case DRIVE_REMOTE: 1926 lstrcpynA(pOut, "Network Drive", uOutSize); return; 1927 case DRIVE_CDROM: 1928 lstrcpynA(pOut, "CD Disk", uOutSize); return; 1929 default: 1930 break; 1931 } 1932 } 1933 default: 1934 break; 1935 } 1936 } 1937 1938 lstrcpynA(pOut, "File Folder", uOutSize); 1905 1939 } 1906 1940 } … … 1921 1955 * FIXME 1922 1956 * return value 0 in case of error is a valid return value 1923 * 1957 * 1924 1958 */ 1925 1959 DWORD _ILGetFileAttributes(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) … … 1940 1974 break; 1941 1975 } 1942 1976 1943 1977 if(uOutSize >= 6) 1944 1978 { -
trunk/src/shell32/shell32_main.c
r21637 r21639 202 202 { 203 203 lstrcpynA (psfi->szTypeName, sTemp, 80 - 6); 204 strcat (psfi->szTypeName, "-file"); 204 strupr (pOut); 205 strcat (psfi->szTypeName, " File"); 205 206 } 206 207 }
Note:
See TracChangeset
for help on using the changeset viewer.