source: trunk/src/shell32/folders.c@ 4705

Last change on this file since 4705 was 4705, checked in by sandervl, 25 years ago

* empty log message *

File size: 16.4 KB
Line 
1/* $Id: folders.c,v 1.6 2000-11-27 10:21:59 sandervl Exp $ */
2/*
3 * Copyright 1997 Marcus Meissner
4 * Copyright 1998 Juergen Schmied
5 *
6 */
7#ifdef __WIN32OS2__
8#define ICOM_CINTERFACE 1
9#include <odin.h>
10#include "shellicon.h"
11#endif
12
13#include <stdlib.h>
14#include <stdio.h>
15#include <string.h>
16
17#include "wine/obj_base.h"
18#include "wine/obj_extracticon.h"
19#include "wine/undocshell.h"
20#include "shlguid.h"
21
22#include "debugtools.h"
23#include "winerror.h"
24
25#include "pidl.h"
26#include "shell32_main.h"
27
28DEFAULT_DEBUG_CHANNEL(shell)
29
30
31/***********************************************************************
32* IExtractIconA implementation
33*/
34
35typedef struct
36{ ICOM_VFIELD(IExtractIconA);
37 DWORD ref;
38 ICOM_VTABLE(IPersistFile)* lpvtblPersistFile;
39 LPITEMIDLIST pidl;
40} IExtractIconAImpl;
41
42static struct ICOM_VTABLE(IExtractIconA) eivt;
43static struct ICOM_VTABLE(IPersistFile) pfvt;
44
45#define _IPersistFile_Offset ((int)(&(((IExtractIconAImpl*)0)->lpvtblPersistFile)))
46#define _ICOM_THIS_From_IPersistFile(class, name) class* This = (class*)(((char*)name)-_IPersistFile_Offset);
47
48/**************************************************************************
49* IExtractIconA_Constructor
50*/
51IExtractIconA* IExtractIconA_Constructor(LPCITEMIDLIST pidl)
52{
53 IExtractIconAImpl* ei;
54
55 ei=(IExtractIconAImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IExtractIconAImpl));
56 ei->ref=1;
57 ICOM_VTBL(ei) = &eivt;
58 ei->lpvtblPersistFile = &pfvt;
59 ei->pidl=ILClone(pidl);
60
61 pdump(pidl);
62
63 TRACE("(%p)\n",ei);
64 shell32_ObjCount++;
65 return (IExtractIconA *)ei;
66}
67/**************************************************************************
68 * IExtractIconA_QueryInterface
69 */
70static HRESULT WINAPI IExtractIconA_fnQueryInterface( IExtractIconA * iface, REFIID riid, LPVOID *ppvObj)
71{
72 ICOM_THIS(IExtractIconAImpl,iface);
73
74 TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
75
76 *ppvObj = NULL;
77
78 if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/
79 { *ppvObj = This;
80 }
81 else if(IsEqualIID(riid, &IID_IPersistFile)) /*IExtractIcon*/
82 { *ppvObj = (IPersistFile*)&(This->lpvtblPersistFile);
83 }
84 else if(IsEqualIID(riid, &IID_IExtractIconA)) /*IExtractIcon*/
85 { *ppvObj = (IExtractIconA*)This;
86 }
87
88 if(*ppvObj)
89 { IExtractIconA_AddRef((IExtractIconA*) *ppvObj);
90 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
91 return S_OK;
92 }
93 TRACE("-- Interface: E_NOINTERFACE\n");
94 return E_NOINTERFACE;
95}
96
97/**************************************************************************
98* IExtractIconA_AddRef
99*/
100static ULONG WINAPI IExtractIconA_fnAddRef(IExtractIconA * iface)
101{
102 ICOM_THIS(IExtractIconAImpl,iface);
103
104 TRACE("(%p)->(count=%lu)\n",This, This->ref );
105
106 shell32_ObjCount++;
107
108 return ++(This->ref);
109}
110/**************************************************************************
111* IExtractIconA_Release
112*/
113static ULONG WINAPI IExtractIconA_fnRelease(IExtractIconA * iface)
114{
115 ICOM_THIS(IExtractIconAImpl,iface);
116
117 TRACE("(%p)->()\n",This);
118
119 shell32_ObjCount--;
120
121 if (!--(This->ref))
122 { TRACE(" destroying IExtractIcon(%p)\n",This);
123 SHFree(This->pidl);
124 HeapFree(GetProcessHeap(),0,This);
125 return 0;
126 }
127 return This->ref;
128}
129/**************************************************************************
130* IExtractIconA_GetIconLocation
131*
132* mapping filetype to icon
133*/
134static HRESULT WINAPI IExtractIconA_fnGetIconLocation(
135 IExtractIconA * iface,
136 UINT uFlags,
137 LPSTR szIconFile,
138 UINT cchMax,
139 int * piIndex,
140 UINT * pwFlags)
141{
142 ICOM_THIS(IExtractIconAImpl,iface);
143
144 char sTemp[MAX_PATH];
145 DWORD dwNr;
146 GUID const * riid;
147 LPITEMIDLIST pSimplePidl = ILFindLastID(This->pidl);
148
149 TRACE("(%p) (flags=%u %p %u %p %p)\n", This, uFlags, szIconFile, cchMax, piIndex, pwFlags);
150
151 if (pwFlags)
152 *pwFlags = 0;
153
154 if (_ILIsDesktop(pSimplePidl))
155 {
156 lstrcpynA(szIconFile, "shell32.dll", cchMax);
157#ifdef __WIN32OS2__
158 *piIndex = SHLICON_DESKTOP - 1;
159#else
160 *piIndex = 34;
161#endif
162 }
163
164 /* my computer and other shell extensions */
165 else if ( (riid = _ILGetGUIDPointer(pSimplePidl)) )
166 {
167 char xriid[50];
168 sprintf( xriid, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
169 riid->Data1, riid->Data2, riid->Data3,
170 riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
171 riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7] );
172
173 if (HCR_GetDefaultIcon(xriid, sTemp, MAX_PATH, &dwNr))
174 {
175 lstrcpynA(szIconFile, sTemp, cchMax);
176 *piIndex = dwNr;
177 }
178 else
179 {
180#ifdef __WIN32OS2__
181 /* Not correct. Originally location is explorer.exe, index 1 */
182 lstrcpynA(szIconFile, "shell32.dll", cchMax);
183 *piIndex = -SHLICON_MYCOMPUTER;
184
185 /* 15 is absolutely wrong! ( Another computer in the network ) */
186#else
187 lstrcpynA(szIconFile, "shell32.dll", cchMax);
188 *piIndex = 15;
189#endif
190 }
191 }
192 else if (_ILIsDrive (pSimplePidl))
193 {
194#ifdef __WIN32OS2__
195 lstrcpynA(szIconFile, "shell32.dll", cchMax);
196 *piIndex = SHLICON_HARDDISK - 1;
197
198 if ( _ILGetDrive( pSimplePidl, sTemp, cchMax ) )
199 {
200 if ( ( sTemp[ 0 ] == 'A' ) || ( sTemp[ 0 ] == 'a' ) ||
201 ( sTemp[ 0 ] == 'B' ) || ( sTemp[ 0 ] == 'b' ) )
202 {
203 /* FIXME determine 5.25 Floppy */
204 *piIndex = SHLICON_FLOPPY35 - 1;
205 }
206 else
207 {
208 UINT nType = GetDriveTypeA( sTemp );
209 switch ( nType )
210 {
211 case DRIVE_REMOVABLE:
212 *piIndex = SHLICON_REMOVABLE_DISK - 1;
213 break;
214
215 case DRIVE_FIXED:
216 *piIndex = SHLICON_HARDDISK - 1;
217 break;
218
219 case DRIVE_REMOTE:
220 {
221 /* FIXME: connected / disconnected state */
222 BOOL connected = TRUE;
223 if ( connected )
224 *piIndex = SHLICON_NETDRIVE_CONN - 1;
225 else
226 *piIndex = SHLICON_NETDRIVE_DISCON - 1;
227 break;
228 }
229 case DRIVE_CDROM:
230 *piIndex = SHLICON_CDROM_DRIVE - 1;
231 break;
232
233 case DRIVE_RAMDISK:
234 *piIndex = SHLICON_RAMDRIVE - 1;
235 break;
236
237 case DRIVE_UNKNOWN:
238 case DRIVE_NO_ROOT_DIR:
239 default:
240 *piIndex = SHLICON_HARDDISK - 1;
241 break;
242 }
243 }
244 }
245
246 if ( ( *piIndex == ( SHLICON_HARDDISK - 1 ) ) &&
247 HCR_GetDefaultIcon( "Drive", sTemp, MAX_PATH, &dwNr ) )
248 {
249 /* kso: Are there special registry keys for particular drives? */
250 lstrcpynA(szIconFile, sTemp, cchMax);
251 *piIndex = dwNr;
252 }
253#else
254 if (HCR_GetDefaultIcon("Drive", sTemp, MAX_PATH, &dwNr))
255 {
256 lstrcpynA(szIconFile, sTemp, cchMax);
257 *piIndex = dwNr;
258 }
259 else
260 {
261 lstrcpynA(szIconFile, "shell32.dll", cchMax);
262 *piIndex = 8;
263 }
264#endif
265 }
266 else if (_ILIsFolder (pSimplePidl))
267 {
268 if (HCR_GetDefaultIcon("Folder", sTemp, MAX_PATH, &dwNr))
269 {
270 lstrcpynA(szIconFile, sTemp, cchMax);
271 *piIndex = dwNr;
272 }
273 else
274 {
275 lstrcpynA(szIconFile, "shell32.dll", cchMax);
276#ifdef __WIN32OS2__
277 *piIndex = (uFlags & GIL_OPENICON)
278 ? SHLICON_FOLDER_OPEN - 1 : SHLICON_FOLDER_CLOSED - 1;
279#else
280 *piIndex = (uFlags & GIL_OPENICON)? 4 : 3;
281#endif
282 }
283 }
284 else /* object is file */
285 {
286#ifdef __WIN32OS2__
287 if (_ILGetExtension (pSimplePidl, sTemp, MAX_PATH))
288 {
289 if (HCR_MapTypeToValue(sTemp, sTemp, MAX_PATH, TRUE)
290 && HCR_GetDefaultIcon(sTemp, sTemp, MAX_PATH, &dwNr))
291 {
292 if (!strcmp("%1",sTemp)) /* icon is in the file */
293 {
294 SHGetPathFromIDListA(This->pidl, sTemp);
295 dwNr = 0;
296 }
297 lstrcpynA(szIconFile, sTemp, cchMax);
298 *piIndex = dwNr;
299 } else
300 {
301 //icon is in the file/file is icon
302 if ((stricmp(sTemp,"EXE") == 0) ||
303 (stricmp(sTemp,"ICO") == 0))
304 {
305 SHGetPathFromIDListA(This->pidl, sTemp);
306 lstrcpynA(szIconFile, sTemp, cchMax);
307 *piIndex = 0;
308 }
309 else if (stricmp(sTemp,"FND") == 0)
310 {
311 SHGetPathFromIDListA(This->pidl, sTemp);
312 lstrcpynA(szIconFile, "shell32.dll", cchMax);
313 *piIndex = SHLICON_COMPUTERS - 1;
314 }
315 else if (stricmp(sTemp,"COM") == 0)
316 {
317 SHGetPathFromIDListA(This->pidl, sTemp);
318 lstrcpynA(szIconFile, "shell32.dll", cchMax);
319 *piIndex = SHLICON_APPLICATION - 1;
320 }
321#if 0
322 // icons not yet in resources
323
324 else if ((stricmp(sTemp,"INI") == 0) ||
325 (stricmp(sTemp,"INF") == 0))
326 {
327 SHGetPathFromIDListA(This->pidl, sTemp);
328 lstrcpynA(szIconFile, "shell32.dll", cchMax);
329 *piIndex = -151;
330 }
331 else if (stricmp(sTemp,"TXT") == 0)
332 {
333 SHGetPathFromIDListA(This->pidl, sTemp);
334 lstrcpynA(szIconFile, "shell32.dll", cchMax);
335 *piIndex = -152;
336 }
337 else if ((stricmp(sTemp,"BAT") == 0) ||
338 (stricmp(sTemp,"CMD") == 0))
339 {
340 SHGetPathFromIDListA(This->pidl, sTemp);
341 lstrcpynA(szIconFile, "shell32.dll", cchMax);
342 *piIndex = -153;
343 }
344 else if ((stricmp(sTemp,"DLL") == 0) ||
345 (stricmp(sTemp,"SYS") == 0) ||
346 (stricmp(sTemp,"VXD") == 0) ||
347 (stricmp(sTemp,"DRV") == 0) ||
348 (stricmp(sTemp,"CPL") == 0))
349 {
350 SHGetPathFromIDListA(This->pidl, sTemp);
351 lstrcpynA(szIconFile, "shell32.dll", cchMax);
352 *piIndex = -154;
353 }
354 else if (stricmp(sTemp,"FON") == 0)
355 {
356 SHGetPathFromIDListA(This->pidl, sTemp);
357 lstrcpynA(szIconFile, "shell32.dll", cchMax);
358 *piIndex = -155;
359 }
360 else if (stricmp(sTemp,"TTF") == 0)
361 {
362 SHGetPathFromIDListA(This->pidl, sTemp);
363 lstrcpynA(szIconFile,"shell32.dll", cchMax);
364 *piIndex = -156;
365 }
366#endif
367 else //default icon
368 {
369 lstrcpynA(szIconFile, "shell32.dll", cchMax);
370 *piIndex = 0;
371 }
372 }
373 } else /* default icon */
374 {
375 lstrcpynA(szIconFile, "shell32.dll", cchMax);
376 *piIndex = 0;
377 }
378 }
379#else
380 if (_ILGetExtension (pSimplePidl, sTemp, MAX_PATH)
381 && HCR_MapTypeToValue(sTemp, sTemp, MAX_PATH, TRUE)
382 && HCR_GetDefaultIcon(sTemp, sTemp, MAX_PATH, &dwNr))
383 {
384 if (!strcmp("%1",sTemp)) /* icon is in the file */
385 {
386 SHGetPathFromIDListA(This->pidl, sTemp);
387 dwNr = 0;
388 }
389 lstrcpynA(szIconFile, sTemp, cchMax);
390 *piIndex = dwNr;
391 }
392 else /* default icon */
393 {
394 lstrcpynA(szIconFile, "shell32.dll", cchMax);
395 *piIndex = 0;
396 }
397 }
398#endif
399 TRACE("-- %s %x\n", szIconFile, *piIndex);
400 return NOERROR;
401}
402/**************************************************************************
403* IExtractIconA_Extract
404*/
405static HRESULT WINAPI IExtractIconA_fnExtract(IExtractIconA * iface, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize)
406{
407 ICOM_THIS(IExtractIconAImpl,iface);
408
409 FIXME("(%p) (file=%p index=%u %p %p size=%u) semi-stub\n", This, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
410
411 if (phiconLarge)
412 *phiconLarge = pImageList_GetIcon(ShellBigIconList, nIconIndex, ILD_TRANSPARENT);
413
414 if (phiconSmall)
415 *phiconSmall = pImageList_GetIcon(ShellSmallIconList, nIconIndex, ILD_TRANSPARENT);
416
417 return S_OK;
418}
419
420static struct ICOM_VTABLE(IExtractIconA) eivt =
421{
422 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
423 IExtractIconA_fnQueryInterface,
424 IExtractIconA_fnAddRef,
425 IExtractIconA_fnRelease,
426 IExtractIconA_fnGetIconLocation,
427 IExtractIconA_fnExtract
428};
429
430/************************************************************************
431 * IEIPersistFile_QueryInterface (IUnknown)
432 */
433static HRESULT WINAPI IEIPersistFile_fnQueryInterface(
434 IPersistFile *iface,
435 REFIID iid,
436 LPVOID *ppvObj)
437{
438 _ICOM_THIS_From_IPersistFile(IExtractIconA, iface);
439
440 return IShellFolder_QueryInterface((IExtractIconA*)This, iid, ppvObj);
441}
442
443/************************************************************************
444 * IEIPersistFile_AddRef (IUnknown)
445 */
446static ULONG WINAPI IEIPersistFile_fnAddRef(
447 IPersistFile *iface)
448{
449 _ICOM_THIS_From_IPersistFile(IExtractIconA, iface);
450
451 return IExtractIconA_AddRef((IExtractIconA*)This);
452}
453
454/************************************************************************
455 * IEIPersistFile_Release (IUnknown)
456 */
457static ULONG WINAPI IEIPersistFile_fnRelease(
458 IPersistFile *iface)
459{
460 _ICOM_THIS_From_IPersistFile(IExtractIconA, iface);
461
462 return IExtractIconA_Release((IExtractIconA*)This);
463}
464
465/************************************************************************
466 * IEIPersistFile_GetClassID (IPersist)
467 */
468static HRESULT WINAPI IEIPersistFile_fnGetClassID(
469 IPersistFile *iface,
470 LPCLSID lpClassId)
471{
472 CLSID StdFolderID = { 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} };
473
474 if (lpClassId==NULL)
475 return E_POINTER;
476
477 memcpy(lpClassId, &StdFolderID, sizeof(StdFolderID));
478
479 return S_OK;
480}
481
482/************************************************************************
483 * IEIPersistFile_Load (IPersistFile)
484 */
485static HRESULT WINAPI IEIPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR pszFileName, DWORD dwMode)
486{
487 _ICOM_THIS_From_IPersistFile(IExtractIconA, iface);
488 FIXME("%p\n", This);
489 return E_NOTIMPL;
490
491}
492
493#ifdef __WIN32OS2__
494/************************************************************************
495 * IEIPersistFile_IsDirty (IPersistFile)
496 */
497static HRESULT WINAPI IEIPersistFile_fnIsDirty(IPersistFile* iface)
498{
499 dprintf(("SHELL32: Folders: IEIPersistFile_fnIsDirty not implemented.\n"));
500 return E_NOTIMPL;
501}
502
503/************************************************************************
504 * IEIPersistFile_Save (IPersistFile)
505 */
506static HRESULT WINAPI IEIPersistFile_fnSave(IPersistFile* iface, LPCOLESTR pszFileName, DWORD dwMode)
507{
508 dprintf(("SHELL32: Folders: IEIPersistFile_fnSave not implemented.\n"));
509 return E_NOTIMPL;
510}
511
512
513/************************************************************************
514 * IEIPersistFile_SaveCompleted (IPersistFile)
515 */
516static HRESULT WINAPI IEIPersistFile_fnSaveCompleted(IPersistFile* iface, LPCOLESTR pszFileName)
517{
518 dprintf(("SHELL32: Folders: IEIPersistFile_fnSaveCompleted not implemented.\n"));
519 return E_NOTIMPL;
520}
521
522
523/************************************************************************
524 * IEIPersistFile_GetCurFile (IPersistFile)
525 */
526static HRESULT WINAPI IEIPersistFile_fnGetCurFile(IPersistFile* iface, LPOLESTR* pszFileName)
527{
528 dprintf(("SHELL32: Folders: IEIPersistFile_fnGetCurFile not implemented.\n"));
529 return E_NOTIMPL;
530}
531#endif
532
533static struct ICOM_VTABLE(IPersistFile) pfvt =
534{
535 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
536 IEIPersistFile_fnQueryInterface,
537 IEIPersistFile_fnAddRef,
538 IEIPersistFile_fnRelease,
539 IEIPersistFile_fnGetClassID,
540#ifdef __WIN32OS2__
541 IEIPersistFile_fnIsDirty, /* IEIPersistFile_fnIsDirty */
542#else
543 (void *) 0xdeadbeef /* IEIPersistFile_fnIsDirty */,
544#endif
545 IEIPersistFile_fnLoad,
546#ifdef __WIN32OS2__
547 IEIPersistFile_fnSave, /* IEIPersistFile_fnSave */
548 IEIPersistFile_fnSaveCompleted, /* IEIPersistFile_fnSaveCompleted */
549 IEIPersistFile_fnGetCurFile /* IEIPersistFile_fnGetCurFile */
550#else
551 (void *) 0xdeadbeef /* IEIPersistFile_fnSave */,
552 (void *) 0xdeadbeef /* IEIPersistFile_fnSaveCompleted */,
553 (void *) 0xdeadbeef /* IEIPersistFile_fnGetCurFile */
554#endif
555};
556
Note: See TracBrowser for help on using the repository browser.