Changeset 3243 for trunk/src/shell32/enumidlist.cpp
- Timestamp:
- Mar 26, 2000, 6:34:57 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/shell32/enumidlist.cpp
r1214 r3243 1 /* $Id: enumidlist.cpp,v 1. 1 1999-10-09 11:13:18 sandervlExp $ */1 /* $Id: enumidlist.cpp,v 1.2 2000-03-26 16:34:40 cbratschi Exp $ */ 2 2 3 3 /* … … 7 7 * Project Odin Software License can be found in LICENSE.TXT 8 8 * 9 * Corel WINE 20000324 level 9 10 */ 10 11 11 12 /* 12 * 13 * IEnumIDList 13 14 * 14 * Copyright 1998Juergen Schmied <juergen.schmied@metronet.de>15 * Copyright 1998 Juergen Schmied <juergen.schmied@metronet.de> 15 16 */ 16 17 … … 47 48 typedef struct tagENUMLIST 48 49 { 49 struct tagENUMLIST*pNext;50 LPITEMIDLISTpidl;50 struct tagENUMLIST *pNext; 51 LPITEMIDLIST pidl; 51 52 52 53 } ENUMLIST, *LPENUMLIST; … … 54 55 typedef struct 55 56 { 56 ICOM_VTABLE(IEnumIDList)*lpvtbl;57 DWORDref;58 LPENUMLISTmpFirst;59 LPENUMLISTmpLast;60 LPENUMLISTmpCurrent;57 ICOM_VTABLE(IEnumIDList)* lpvtbl; 58 DWORD ref; 59 LPENUMLIST mpFirst; 60 LPENUMLIST mpLast; 61 LPENUMLIST mpCurrent; 61 62 62 63 } IEnumIDListImpl; … … 68 69 */ 69 70 static BOOL AddToEnumList( 70 71 72 { 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 71 IEnumIDList * iface, 72 LPITEMIDLIST pidl) 73 { 74 ICOM_THIS(IEnumIDListImpl,iface); 75 76 LPENUMLIST pNew; 77 78 TRACE("(%p)->(pidl=%p)\n",This,pidl); 79 pNew = (LPENUMLIST)SHAlloc(sizeof(ENUMLIST)); 80 if(pNew) 81 { 82 /*set the next pointer */ 83 pNew->pNext = NULL; 84 pNew->pidl = pidl; 85 86 /*is This the first item in the list? */ 87 if(!This->mpFirst) 88 { 89 This->mpFirst = pNew; 90 This->mpCurrent = pNew; 91 } 92 93 if(This->mpLast) 94 { 95 /*add the new item to the end of the list */ 96 This->mpLast->pNext = pNew; 97 } 98 99 /*update the last item pointer */ 100 This->mpLast = pNew; 101 TRACE("-- (%p)->(first=%p, last=%p)\n",This,This->mpFirst,This->mpLast); 102 return TRUE; 103 } 104 return FALSE; 104 105 } 105 106 … … 108 109 */ 109 110 static BOOL CreateFolderEnumList( 110 111 112 113 { 114 115 116 LPITEMIDLISTpidl=NULL;117 WIN32_FIND_DATAA stffile; 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 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 111 IEnumIDList * iface, 112 LPCSTR lpszPath, 113 DWORD dwFlags) 114 { 115 ICOM_THIS(IEnumIDListImpl,iface); 116 117 LPITEMIDLIST pidl=NULL; 118 WIN32_FIND_DATAA stffile; 119 HANDLE hFile; 120 CHAR szPath[MAX_PATH]; 121 122 TRACE("(%p)->(path=%s flags=0x%08lx) \n",This,debugstr_a(lpszPath),dwFlags); 123 124 if(!lpszPath || !lpszPath[0]) return FALSE; 125 126 strcpy(szPath, lpszPath); 127 PathAddBackslashA(szPath); 128 strcat(szPath,"*.*"); 129 130 /*enumerate the folders*/ 131 if(dwFlags & SHCONTF_FOLDERS) 132 { 133 TRACE("-- (%p)-> enumerate SHCONTF_FOLDERS of %s\n",This,debugstr_a(szPath)); 134 hFile = FindFirstFileA(szPath,&stffile); 135 if ( hFile != INVALID_HANDLE_VALUE ) 136 { 137 do 138 { 139 if ( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, "..")) 140 { 141 pidl = _ILCreateFolder (&stffile); 142 if(pidl && AddToEnumList((IEnumIDList*)This, pidl)) 143 { 144 continue; 145 } 146 return FALSE; 147 } 148 } while( FindNextFileA(hFile,&stffile)); 149 FindClose (hFile); 150 } 151 } 152 153 /*enumerate the non-folder items (values) */ 154 if(dwFlags & SHCONTF_NONFOLDERS) 155 { 156 TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",This,debugstr_a(szPath)); 157 hFile = FindFirstFileA(szPath,&stffile); 158 if ( hFile != INVALID_HANDLE_VALUE ) 159 { 160 do 161 { 162 if (! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) 163 { 164 pidl = _ILCreateValue(&stffile); 165 if(pidl && AddToEnumList((IEnumIDList*)This, pidl)) 166 { 167 continue; 168 } 169 return FALSE; 170 } 171 } while( FindNextFileA(hFile,&stffile)); 172 FindClose (hFile); 173 } 174 } 175 return TRUE; 175 176 } 176 177 … … 179 180 */ 180 181 static BOOL CreateDesktopEnumList( 181 182 183 { 184 185 186 LPITEMIDLISTpidl=NULL;187 188 charszPath[MAX_PATH];189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 182 IEnumIDList * iface, 183 DWORD dwFlags) 184 { 185 ICOM_THIS(IEnumIDListImpl,iface); 186 187 LPITEMIDLIST pidl=NULL; 188 HKEY hkey; 189 char szPath[MAX_PATH]; 190 191 TRACE("(%p)->(flags=0x%08lx) \n",This,dwFlags); 192 193 /*enumerate the root folders */ 194 if(dwFlags & SHCONTF_FOLDERS) 195 { 196 /*create the pidl for This item */ 197 pidl = _ILCreateMyComputer(); 198 if(pidl) 199 { 200 if(!AddToEnumList((IEnumIDList*)This, pidl)) 201 return FALSE; 202 } 203 204 if (! RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\desktop\\NameSpace", 0, KEY_READ, &hkey)) 205 { 206 char iid[50]; 207 int i=0; 208 209 while (1) 210 { 211 DWORD size = sizeof (iid); 212 213 if (ERROR_SUCCESS!=RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, NULL)) 214 break; 215 216 pidl = _ILCreateSpecial(iid); 217 218 if(pidl) 219 AddToEnumList((IEnumIDList*)This, pidl); 220 221 i++; 222 } 223 RegCloseKey(hkey); 224 } 225 } 226 #ifndef SHELL_NO_DESKTOP 227 /*enumerate the elements in %windir%\desktop */ 228 SHGetSpecialFolderPathA(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE); 229 CreateFolderEnumList( (IEnumIDList*)This, szPath, dwFlags); 230 #endif 231 return TRUE; 231 232 } 232 233 … … 235 236 */ 236 237 static BOOL CreateMyCompEnumList( 237 238 239 { 240 241 242 LPITEMIDLISTpidl=NULL;243 DWORDdwDrivemap;244 CHARszDriveName[4];245 HKEYhkey;246 247 248 249 250 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 283 284 285 286 287 288 289 290 291 292 238 IEnumIDList * iface, 239 DWORD dwFlags) 240 { 241 ICOM_THIS(IEnumIDListImpl,iface); 242 243 LPITEMIDLIST pidl=NULL; 244 DWORD dwDrivemap; 245 CHAR szDriveName[4]; 246 HKEY hkey; 247 248 TRACE("(%p)->(flags=0x%08lx) \n",This,dwFlags); 249 250 /*enumerate the folders*/ 251 if(dwFlags & SHCONTF_FOLDERS) 252 { 253 dwDrivemap = GetLogicalDrives(); 254 strcpy (szDriveName,"A:\\"); 255 while (szDriveName[0]<='Z') 256 { 257 if(dwDrivemap & 0x00000001L) 258 { 259 pidl = _ILCreateDrive(szDriveName); 260 if(pidl) 261 { 262 if(!AddToEnumList((IEnumIDList*)This, pidl)) 263 return FALSE; 264 } 265 } 266 szDriveName[0]++; 267 dwDrivemap = dwDrivemap >> 1; 268 } 269 270 TRACE("-- (%p)-> enumerate (mycomputer shell extensions)\n",This); 271 if (! RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\explorer\\mycomputer\\NameSpace", 0, KEY_READ, &hkey)) 272 { 273 char iid[50]; 274 int i=0; 275 276 while (1) 277 { 278 DWORD size = sizeof (iid); 279 280 if (ERROR_SUCCESS!=RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, NULL)) 281 break; 282 283 pidl = _ILCreateSpecial(iid); 284 285 if(pidl) 286 AddToEnumList((IEnumIDList*)This, pidl); 287 288 i++; 289 } 290 RegCloseKey(hkey); 291 } 292 } 293 return TRUE; 293 294 } 294 295 … … 297 298 */ 298 299 static BOOL DeleteList( 299 300 { 301 302 303 304 305 306 307 308 309 310 311 312 313 314 300 IEnumIDList * iface) 301 { 302 ICOM_THIS(IEnumIDListImpl,iface); 303 304 LPENUMLIST pDelete; 305 306 TRACE("(%p)->()\n",This); 307 308 while(This->mpFirst) 309 { pDelete = This->mpFirst; 310 This->mpFirst = pDelete->pNext; 311 SHFree(pDelete->pidl); 312 SHFree(pDelete); 313 } 314 This->mpFirst = This->mpLast = This->mpCurrent = NULL; 315 return TRUE; 315 316 } 316 317 … … 320 321 */ 321 322 static HRESULT WINAPI IEnumIDList_fnQueryInterface( 322 323 324 325 { 326 327 328 charxriid[50];329 323 IEnumIDList * iface, 324 REFIID riid, 325 LPVOID *ppvObj) 326 { 327 ICOM_THIS(IEnumIDListImpl,iface); 328 329 char xriid[50]; 330 WINE_StringFromCLSID((LPCLSID)riid,xriid); 330 331 331 332 dprintf(("SHELL32:enumidlist: IEnumIDList_fnQueryInterface((%p)->(\n\tIID:\t%s,%p)\n", … … 334 335 ppvObj)); 335 336 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 337 *ppvObj = NULL; 338 339 if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ 340 { *ppvObj = This; 341 } 342 else if(IsEqualIID(riid, &IID_IEnumIDList)) /*IEnumIDList*/ 343 { *ppvObj = (IEnumIDList*)This; 344 } 345 346 if(*ppvObj) 347 { IEnumIDList_AddRef((IEnumIDList*)*ppvObj); 348 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); 349 return S_OK; 350 } 351 352 TRACE("-- Interface: E_NOINTERFACE\n"); 353 return E_NOINTERFACE; 353 354 } 354 355 … … 357 358 */ 358 359 static ULONG WINAPI IEnumIDList_fnAddRef( 359 360 { 361 360 IEnumIDList * iface) 361 { 362 ICOM_THIS(IEnumIDListImpl,iface); 362 363 363 364 dprintf(("SHELL32:enumidlist: IEnumIDList_fnAddRef((%p)->(%lu)\n", … … 365 366 This->ref)); 366 367 367 368 368 shell32_ObjCount++; 369 return ++(This->ref); 369 370 } 370 371 /****************************************************************************** … … 372 373 */ 373 374 static ULONG WINAPI IEnumIDList_fnRelease( 374 375 { 376 375 IEnumIDList * iface) 376 { 377 ICOM_THIS(IEnumIDListImpl,iface); 377 378 378 379 dprintf(("SHELL32:enumidlist: IEnumIDList_fnRelease((%p)->(%lu)\n", … … 380 381 This->ref)); 381 382 382 383 384 385 386 387 388 389 390 383 shell32_ObjCount--; 384 385 if (!--(This->ref)) 386 { TRACE(" destroying IEnumIDList(%p)\n",This); 387 DeleteList((IEnumIDList*)This); 388 HeapFree(GetProcessHeap(),0,This); 389 return 0; 390 } 391 return This->ref; 391 392 } 392 393 … … 396 397 397 398 static HRESULT WINAPI IEnumIDList_fnNext( 398 399 400 401 402 { 403 404 405 406 407 399 IEnumIDList * iface, 400 ULONG celt, 401 LPITEMIDLIST * rgelt, 402 ULONG *pceltFetched) 403 { 404 ICOM_THIS(IEnumIDListImpl,iface); 405 406 ULONG i; 407 HRESULT hr = S_OK; 408 LPITEMIDLIST temp; 408 409 409 410 dprintf(("SHELL32:enumidlist: IEnumIDList_fnNext((%p)->(%ld,%p, %p)\n", … … 416 417 * subsystems actually use it (and so may a third party browser) 417 418 */ 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 419 if(pceltFetched) 420 *pceltFetched = 0; 421 422 *rgelt=0; 423 424 if(celt > 1 && !pceltFetched) 425 { return E_INVALIDARG; 426 } 427 428 for(i = 0; i < celt; i++) 429 { if(!(This->mpCurrent)) 430 { hr = S_FALSE; 431 break; 432 } 433 temp = ILClone(This->mpCurrent->pidl); 434 rgelt[i] = temp; 435 This->mpCurrent = This->mpCurrent->pNext; 436 } 437 if(pceltFetched) 438 { *pceltFetched = i; 439 } 440 441 return hr; 441 442 } 442 443 … … 445 446 */ 446 447 static HRESULT WINAPI IEnumIDList_fnSkip( 447 448 { 449 450 451 452 448 IEnumIDList * iface,ULONG celt) 449 { 450 ICOM_THIS(IEnumIDListImpl,iface); 451 452 DWORD dwIndex; 453 HRESULT hr = S_OK; 453 454 454 455 dprintf(("SHELL32:enumidlist: IEnumIDList_fnSkip((%p)->(%lu)\n", … … 456 457 celt)); 457 458 458 459 460 461 462 463 464 465 459 for(dwIndex = 0; dwIndex < celt; dwIndex++) 460 { if(!This->mpCurrent) 461 { hr = S_FALSE; 462 break; 463 } 464 This->mpCurrent = This->mpCurrent->pNext; 465 } 466 return hr; 466 467 } 467 468 … … 471 472 */ 472 473 static HRESULT WINAPI IEnumIDList_fnReset( 473 474 { 475 474 IEnumIDList * iface) 475 { 476 ICOM_THIS(IEnumIDListImpl,iface); 476 477 477 478 dprintf(("SHELL32:enumidlist: IEnumIDList_fnReset((%p)\n", 478 479 This)); 479 480 480 481 481 This->mpCurrent = This->mpFirst; 482 return S_OK; 482 483 } 483 484 /************************************************************************** … … 485 486 */ 486 487 static HRESULT WINAPI IEnumIDList_fnClone( 487 488 { 489 488 IEnumIDList * iface,LPENUMIDLIST * ppenum) 489 { 490 ICOM_THIS(IEnumIDListImpl,iface); 490 491 491 492 dprintf(("SHELL32:enumidlist: IEnumIDList_fnClone((%p)->() to (%p)->() not implemented\n", … … 493 494 ppenum)); 494 495 495 496 return E_NOTIMPL; 496 497 } 497 498 … … 501 502 static ICOM_VTABLE (IEnumIDList) eidlvt = 502 503 { 503 504 505 506 507 508 509 510 504 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE 505 IEnumIDList_fnQueryInterface, 506 IEnumIDList_fnAddRef, 507 IEnumIDList_fnRelease, 508 IEnumIDList_fnNext, 509 IEnumIDList_fnSkip, 510 IEnumIDList_fnReset, 511 IEnumIDList_fnClone, 511 512 }; 512 513 … … 517 518 518 519 IEnumIDList * IEnumIDList_Constructor( 519 520 521 522 { 523 IEnumIDListImpl*lpeidl;524 BOOL ret = FALSE; 525 526 520 LPCSTR lpszPath, 521 DWORD dwFlags, 522 DWORD dwKind) 523 { 524 IEnumIDListImpl* lpeidl; 525 BOOL ret = FALSE; 526 527 lpeidl = (IEnumIDListImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IEnumIDListImpl)); 527 528 528 529 dprintf(("SHELL32:enumidlist: IEnumIDList_Constructor((%p)->(%08xh flags=0x%08lx kind=0x%08lx)\n", … … 532 533 dwKind)); 533 534 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 } 571 535 if (lpeidl) 536 { 537 lpeidl->ref = 1; 538 lpeidl->lpvtbl = &eidlvt; 539 540 switch (dwKind) 541 { 542 case EIDL_DESK: 543 ret = CreateDesktopEnumList((IEnumIDList*)lpeidl, dwFlags); 544 break; 545 546 case EIDL_MYCOMP: 547 ret = CreateMyCompEnumList((IEnumIDList*)lpeidl, dwFlags); 548 break; 549 550 case EIDL_FILE: 551 ret = CreateFolderEnumList((IEnumIDList*)lpeidl, lpszPath, dwFlags); 552 break; 553 } 554 555 if(ret) 556 { 557 shell32_ObjCount++; 558 } 559 else 560 { 561 if (lpeidl) 562 { 563 HeapFree(GetProcessHeap(),0,lpeidl); 564 } 565 } 566 } 567 568 TRACE("-- (%p)->()\n",lpeidl); 569 570 return (IEnumIDList*)lpeidl; 571 } 572
Note:
See TracChangeset
for help on using the changeset viewer.