- Timestamp:
- Oct 27, 1999, 11:03:31 AM (26 years ago)
- File:
-
- 1 edited
-
trunk/src/shell32/pidl.cpp (modified) (38 diffs)
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 { DWORD type;40 char * szData;41 char * szShortName;42 char szName[MAX_PATH];43 BOOL bIsShellDebug;44 45 LPITEMIDLIST pidltemp = pidl;46 if (!TRACE_ON(pidl))47 return;48 49 /* silence the sub-functions */50 bIsShellDebug = TRACE_ON(shell);51 __SET_DEBUGGING(__DBCL_TRACE, dbch_shell, FALSE);52 __SET_DEBUGGING(__DBCL_TRACE, dbch_pidl, FALSE);53 54 if (! pidltemp)55 {56 MESSAGE ("-------- pidl=NULL (Desktop)\n");57 }58 else59 {60 MESSAGE ("-------- pidl=%p\n", pidl);61 if (pidltemp->mkid.cb)62 {63 do64 {65 type = _ILGetDataPointer(pidltemp)->type;66 szData = _ILGetTextPointer(type, _ILGetDataPointer(pidltemp));67 szShortName = _ILGetSTextPointer(type, _ILGetDataPointer(pidltemp));68 _ILSimpleGetText(pidltemp, szName, MAX_PATH);69 70 MESSAGE ("-- pidl=%p size=%u type=%lx name=%s (%s,%s)\n",71 pidltemp, pidltemp->mkid.cb,type,szName,debugstr_a(szData), debugstr_a(szShortName));72 73 pidltemp = ILGetNext(pidltemp);74 75 } while (pidltemp->mkid.cb);76 }77 else78 {79 MESSAGE ("empty pidl (Desktop)\n");80 }81 }82 83 __SET_DEBUGGING(__DBCL_TRACE, dbch_shell, bIsShellDebug);84 __SET_DEBUGGING(__DBCL_TRACE, dbch_pidl, TRUE);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 BOOL bIsPidlDebug;103 BOOL bIsPidlDebug; 91 104 92 105 LPITEMIDLIST pidltemp = pidl; 93 106 94 bIsPidlDebug = TRACE_ON(shell);95 __SET_DEBUGGING(__DBCL_TRACE, dbch_pidl, FALSE);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 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_(pidl)("-- newpidl=%p\n",pidlNew);236 237 return pidlNew;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 [in]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 /* explorer reads from registry directly (StreamMRU),385 so we can only check here */386 if ((!pcheck (pidl1)) || (!pcheck (pidl2))) return FALSE;387 388 pdump (pidl1);389 pdump (pidl2);390 391 if ( (!pidl1) || (!pidl2) ) return FALSE;392 393 while (pidltemp1->mkid.cb && pidltemp2->mkid.cb)394 {395 _ILSimpleGetText(pidltemp1, szData1, MAX_PATH);396 _ILSimpleGetText(pidltemp2, szData2, MAX_PATH);397 398 if (strcmp ( szData1, szData2 )!=0 )399 return FALSE;400 401 pidltemp1 = ILGetNext(pidltemp1);402 pidltemp2 = ILGetNext(pidltemp2);403 } 404 405 if (!pidltemp1->mkid.cb && !pidltemp2->mkid.cb)406 {407 return TRUE;408 }409 410 return FALSE;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 pidl2457 * pidl1 shorter pidl2 pointer to first different element of pidl2458 * if there was at least one equal element459 * pidl2 shorter pidl1 0460 * pidl2 equal pidl1 pointer to last 0x00-element of pidl2461 */ 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 /* explorer reads from registry directly (StreamMRU),474 so we can only check here */475 if ((!pcheck (pidl1)) || (!pcheck (pidl2)))476 return FALSE;477 478 pdump (pidl1);479 pdump (pidl2);480 481 if ( _ILIsDesktop(pidl1) )482 {483 ret = pidl2;484 }485 else486 {487 while (pidltemp1->mkid.cb && pidltemp2->mkid.cb)488 {489 _ILSimpleGetText(pidltemp1, szData1, MAX_PATH);490 _ILSimpleGetText(pidltemp2, szData2, MAX_PATH);491 492 if (strcmp(szData1,szData2))493 break;494 495 pidltemp1 = ILGetNext(pidltemp1);496 pidltemp2 = ILGetNext(pidltemp2);497 ret = pidltemp2; 498 }499 500 if (pidltemp1->mkid.cb)501 {502 ret = NULL; /* elements of pidl1 left*/503 }504 }505 TRACE_(shell)("--- %p\n", ret);506 return ret; /* pidl 1 is shorter */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 if(!pidl1 && !pidl2) return NULL;525 526 pdump (pidl1);527 pdump (pidl2);528 529 if(!pidl1)530 {531 pidlNew = ILClone(pidl2);532 return pidlNew;533 }534 535 if(!pidl2)536 {537 pidlNew = ILClone(pidl1);538 return pidlNew;539 }540 541 len1 = ILGetSize(pidl1)-2;542 len2 = ILGetSize(pidl2);543 pidlNew = (ITEMIDLIST*)SHAlloc(len1+len2);544 545 if (pidlNew)546 {547 memcpy(pidlNew,pidl1,len1);548 memcpy(((BYTE *)pidlNew)+len1,pidl2,len2);549 }550 551 /* TRACE(pidl,"--new pidl=%p\n",pidlNew);*/552 return pidlNew;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 * NULL returns FALSE921 * desktop pidl gives path to desktopdirectory back922 * special pidls returning FALSE965 * 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 * internal functions1031 * 1032 * ### 1. section creating pidls ###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 switch (type)1170 { case PT_DESKTOP:1171 uSize = 0;1172 pidlOut = (ITEMIDLIST*)SHAlloc(uSize + 2);1173 pidlOut->mkid.cb = uSize;1174 TRACE_(pidl)("- create Desktop\n");1175 break;1176 1177 case PT_MYCOMP:1178 uSize = 2 + 2 + sizeof(GUID);1179 pidlOut = (ITEMIDLIST*)SHAlloc(uSize + 2);1180 ZeroMemory(pidlOut, uSize + 2);1181 pidlOut->mkid.cb = uSize;1182 pData =_ILGetDataPointer(pidlOut);1183 pData->type = type;1184 memcpy(&(pData->u.mycomp.guid), pIn, uInSize);1185 TRACE_(pidl)("- create GUID-pidl\n");1186 break;1187 1188 case PT_DRIVE:1189 uSize = 2 + 23;1190 pidlOut = (ITEMIDLIST*)SHAlloc(uSize + 2);1191 ZeroMemory(pidlOut, uSize + 2);1192 pidlOut->mkid.cb = uSize;1193 pData =_ILGetDataPointer(pidlOut);1194 pData->type = type;1195 pszDest = _ILGetTextPointer(type, pData);1196 memcpy(pszDest, pIn, uInSize);1197 TRACE_(pidl)("- create Drive: %s\n",debugstr_a(pszDest));1198 break;1199 1200 case PT_FOLDER:1201 case PT_VALUE:1202 uSize = 2 + 12 + uInSize;1203 pidlOut = (ITEMIDLIST*)SHAlloc(uSize + 2);1204 ZeroMemory(pidlOut, uSize + 2);1205 pidlOut->mkid.cb = uSize;1206 pData =_ILGetDataPointer(pidlOut);1207 pData->type = type;1208 pszDest = _ILGetTextPointer(type, pData);1209 memcpy(pszDest, pIn, uInSize);1210 TRACE_(pidl)("- create Value: %s\n",debugstr_a(pszDest));1211 break;1212 }1213 1214 pidlTemp = ILGetNext(pidlOut);1215 if (pidlTemp)1216 pidlTemp->mkid.cb = 0x00;1217 1218 TRACE_(pidl)("-- (pidl=%p, size=%u)\n", pidlOut, uSize);1219 return pidlOut;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 * ### 2. section testing pidls ###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 * _ILIsPidlSimple1303 */ 1304 BOOL WINAPI _ILIsPidlSimple ( LPCITEMIDLISTpidl)1305 { 1306 BOOL ret = TRUE;1307 1308 if(! _ILIsDesktop(pidl))/* pidl=NULL or mkid.cb=0 */1309 {1310 WORD len = pidl->mkid.cb;1311 LPCITEMIDLIST pidlnext = (LPCITEMIDLIST) (((LPBYTE)pidl) + len );1312 if (pidlnext->mkid.cb)1313 ret = FALSE;1314 }1315 1316 TRACE_(pidl)("%s\n", ret ? "Yes" : "No");1317 return ret;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 * ### 3. section getting values from pidls ###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 * ### 4. getting pointers to parts of pidls ###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.
