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

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

return resource id as negative number

File size: 16.4 KB
Line 
1/* $Id: folders.c,v 1.4 2000-11-24 15:23:30 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;
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; /* hard disk */
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;
205 }
206 else
207 {
208 UINT nType = GetDriveTypeA( sTemp );
209 switch ( nType )
210 {
211 case DRIVE_REMOVABLE:
212 *piIndex = -SHLICON_REMOVABLE_DISK;
213 break;
214
215 case DRIVE_FIXED:
216 *piIndex = -SHLICON_HARDDISK;
217 break;
218
219 case DRIVE_REMOTE:
220 {
221 /* FIXME: connected (9) / disconnected (10)state */
222 BOOL connected = TRUE;
223 if ( connected )
224 *piIndex = -SHLICON_NETDRIVE_CONN;
225 else
226 *piIndex = -SHLICON_NETDRIVE_DISCON;
227 break;
228 }
229 case DRIVE_CDROM:
230 *piIndex = -SHLICON_CDROM_DRIVE;
231 break;
232
233 case DRIVE_RAMDISK:
234 *piIndex = -SHLICON_RAMDRIVE;
235 break;
236
237 case DRIVE_UNKNOWN:
238 case DRIVE_NO_ROOT_DIR:
239 default:
240 *piIndex = -SHLICON_HARDDISK;
241 break;
242 }
243 }
244 }
245
246 if ( ( *piIndex == 8 ) &&
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 *piIndex = (uFlags & GIL_OPENICON)? 4 : 3;
277 }
278 }
279 else /* object is file */
280 {
281#ifdef __WIN32OS2__
282 if (_ILGetExtension (pSimplePidl, sTemp, MAX_PATH))
283 {
284 if (HCR_MapTypeToValue(sTemp, sTemp, MAX_PATH, TRUE)
285 && HCR_GetDefaultIcon(sTemp, sTemp, MAX_PATH, &dwNr))
286 {
287 if (!strcmp("%1",sTemp)) /* icon is in the file */
288 {
289 SHGetPathFromIDListA(This->pidl, sTemp);
290 dwNr = 0;
291 }
292 lstrcpynA(szIconFile, sTemp, cchMax);
293 *piIndex = dwNr;
294 } else
295 {
296 //icon is in the file/file is icon
297 if ((stricmp(sTemp,"EXE") == 0) ||
298 (stricmp(sTemp,"ICO") == 0))
299 {
300 SHGetPathFromIDListA(This->pidl, sTemp);
301 lstrcpynA(szIconFile, sTemp, cchMax);
302 *piIndex = 0;
303 }
304 else if (stricmp(sTemp,"FND") == 0)
305 {
306 SHGetPathFromIDListA(This->pidl, sTemp);
307 lstrcpynA(szIconFile, "shell32.dll", cchMax);
308#ifdef __WIN32OS2__
309 *piIndex = -SHLICON_TREE; //???
310#else
311 *piIndex = 42;
312#endif
313 }
314 else if (stricmp(sTemp,"COM") == 0)
315 {
316 SHGetPathFromIDListA(This->pidl, sTemp);
317 lstrcpynA(szIconFile, "shell32.dll", cchMax);
318#ifdef __WIN32OS2__
319 *piIndex = -SHLICON_APPLICATION;
320#else
321 *piIndex = 2;
322#endif
323 }
324#if 0
325 // icons not yet in resources
326
327 else if ((stricmp(sTemp,"INI") == 0) ||
328 (stricmp(sTemp,"INF") == 0))
329 {
330 SHGetPathFromIDListA(This->pidl, sTemp);
331 lstrcpynA(szIconFile, "shell32.dll", cchMax);
332 *piIndex = -151;
333 }
334 else if (stricmp(sTemp,"TXT") == 0)
335 {
336 SHGetPathFromIDListA(This->pidl, sTemp);
337 lstrcpynA(szIconFile, "shell32.dll", cchMax);
338 *piIndex = -152;
339 }
340 else if ((stricmp(sTemp,"BAT") == 0) ||
341 (stricmp(sTemp,"CMD") == 0))
342 {
343 SHGetPathFromIDListA(This->pidl, sTemp);
344 lstrcpynA(szIconFile, "shell32.dll", cchMax);
345 *piIndex = -153;
346 }
347 else if ((stricmp(sTemp,"DLL") == 0) ||
348 (stricmp(sTemp,"SYS") == 0) ||
349 (stricmp(sTemp,"VXD") == 0) ||
350 (stricmp(sTemp,"DRV") == 0) ||
351 (stricmp(sTemp,"CPL") == 0))
352 {
353 SHGetPathFromIDListA(This->pidl, sTemp);
354 lstrcpynA(szIconFile, "shell32.dll", cchMax);
355 *piIndex = -154;
356 }
357 else if (stricmp(sTemp,"FON") == 0)
358 {
359 SHGetPathFromIDListA(This->pidl, sTemp);
360 lstrcpynA(szIconFile, "shell32.dll", cchMax);
361 *piIndex = -155;
362 }
363 else if (stricmp(sTemp,"TTF") == 0)
364 {
365 SHGetPathFromIDListA(This->pidl, sTemp);
366 lstrcpynA(szIconFile,"shell32.dll", cchMax);
367 *piIndex = -156;
368 }
369#endif
370 else //default icon
371 {
372 lstrcpynA(szIconFile, "shell32.dll", cchMax);
373 *piIndex = 0;
374 }
375 }
376 } else /* default icon */
377 {
378 lstrcpynA(szIconFile, "shell32.dll", cchMax);
379 *piIndex = 0;
380 }
381 }
382#else
383 if (_ILGetExtension (pSimplePidl, sTemp, MAX_PATH)
384 && HCR_MapTypeToValue(sTemp, sTemp, MAX_PATH, TRUE)
385 && HCR_GetDefaultIcon(sTemp, sTemp, MAX_PATH, &dwNr))
386 {
387 if (!strcmp("%1",sTemp)) /* icon is in the file */
388 {
389 SHGetPathFromIDListA(This->pidl, sTemp);
390 dwNr = 0;
391 }
392 lstrcpynA(szIconFile, sTemp, cchMax);
393 *piIndex = dwNr;
394 }
395 else /* default icon */
396 {
397 lstrcpynA(szIconFile, "shell32.dll", cchMax);
398 *piIndex = 0;
399 }
400 }
401#endif
402 TRACE("-- %s %x\n", szIconFile, *piIndex);
403 return NOERROR;
404}
405/**************************************************************************
406* IExtractIconA_Extract
407*/
408static HRESULT WINAPI IExtractIconA_fnExtract(IExtractIconA * iface, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize)
409{
410 ICOM_THIS(IExtractIconAImpl,iface);
411
412 FIXME("(%p) (file=%p index=%u %p %p size=%u) semi-stub\n", This, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
413
414 if (phiconLarge)
415 *phiconLarge = pImageList_GetIcon(ShellBigIconList, nIconIndex, ILD_TRANSPARENT);
416
417 if (phiconSmall)
418 *phiconSmall = pImageList_GetIcon(ShellSmallIconList, nIconIndex, ILD_TRANSPARENT);
419
420 return S_OK;
421}
422
423static struct ICOM_VTABLE(IExtractIconA) eivt =
424{
425 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
426 IExtractIconA_fnQueryInterface,
427 IExtractIconA_fnAddRef,
428 IExtractIconA_fnRelease,
429 IExtractIconA_fnGetIconLocation,
430 IExtractIconA_fnExtract
431};
432
433/************************************************************************
434 * IEIPersistFile_QueryInterface (IUnknown)
435 */
436static HRESULT WINAPI IEIPersistFile_fnQueryInterface(
437 IPersistFile *iface,
438 REFIID iid,
439 LPVOID *ppvObj)
440{
441 _ICOM_THIS_From_IPersistFile(IExtractIconA, iface);
442
443 return IShellFolder_QueryInterface((IExtractIconA*)This, iid, ppvObj);
444}
445
446/************************************************************************
447 * IEIPersistFile_AddRef (IUnknown)
448 */
449static ULONG WINAPI IEIPersistFile_fnAddRef(
450 IPersistFile *iface)
451{
452 _ICOM_THIS_From_IPersistFile(IExtractIconA, iface);
453
454 return IExtractIconA_AddRef((IExtractIconA*)This);
455}
456
457/************************************************************************
458 * IEIPersistFile_Release (IUnknown)
459 */
460static ULONG WINAPI IEIPersistFile_fnRelease(
461 IPersistFile *iface)
462{
463 _ICOM_THIS_From_IPersistFile(IExtractIconA, iface);
464
465 return IExtractIconA_Release((IExtractIconA*)This);
466}
467
468/************************************************************************
469 * IEIPersistFile_GetClassID (IPersist)
470 */
471static HRESULT WINAPI IEIPersistFile_fnGetClassID(
472 IPersistFile *iface,
473 LPCLSID lpClassId)
474{
475 CLSID StdFolderID = { 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} };
476
477 if (lpClassId==NULL)
478 return E_POINTER;
479
480 memcpy(lpClassId, &StdFolderID, sizeof(StdFolderID));
481
482 return S_OK;
483}
484
485/************************************************************************
486 * IEIPersistFile_Load (IPersistFile)
487 */
488static HRESULT WINAPI IEIPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR pszFileName, DWORD dwMode)
489{
490 _ICOM_THIS_From_IPersistFile(IExtractIconA, iface);
491 FIXME("%p\n", This);
492 return E_NOTIMPL;
493
494}
495
496#ifdef __WIN32OS2__
497/************************************************************************
498 * IEIPersistFile_IsDirty (IPersistFile)
499 */
500static HRESULT WINAPI IEIPersistFile_fnIsDirty(IPersistFile* iface)
501{
502 dprintf(("SHELL32: Folders: IEIPersistFile_fnIsDirty not implemented.\n"));
503 return E_NOTIMPL;
504}
505
506/************************************************************************
507 * IEIPersistFile_Save (IPersistFile)
508 */
509static HRESULT WINAPI IEIPersistFile_fnSave(IPersistFile* iface, LPCOLESTR pszFileName, DWORD dwMode)
510{
511 dprintf(("SHELL32: Folders: IEIPersistFile_fnSave not implemented.\n"));
512 return E_NOTIMPL;
513}
514
515
516/************************************************************************
517 * IEIPersistFile_SaveCompleted (IPersistFile)
518 */
519static HRESULT WINAPI IEIPersistFile_fnSaveCompleted(IPersistFile* iface, LPCOLESTR pszFileName)
520{
521 dprintf(("SHELL32: Folders: IEIPersistFile_fnSaveCompleted not implemented.\n"));
522 return E_NOTIMPL;
523}
524
525
526/************************************************************************
527 * IEIPersistFile_GetCurFile (IPersistFile)
528 */
529static HRESULT WINAPI IEIPersistFile_fnGetCurFile(IPersistFile* iface, LPOLESTR* pszFileName)
530{
531 dprintf(("SHELL32: Folders: IEIPersistFile_fnGetCurFile not implemented.\n"));
532 return E_NOTIMPL;
533}
534#endif
535
536static struct ICOM_VTABLE(IPersistFile) pfvt =
537{
538 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
539 IEIPersistFile_fnQueryInterface,
540 IEIPersistFile_fnAddRef,
541 IEIPersistFile_fnRelease,
542 IEIPersistFile_fnGetClassID,
543#ifdef __WIN32OS2__
544 IEIPersistFile_fnIsDirty, /* IEIPersistFile_fnIsDirty */
545#else
546 (void *) 0xdeadbeef /* IEIPersistFile_fnIsDirty */,
547#endif
548 IEIPersistFile_fnLoad,
549#ifdef __WIN32OS2__
550 IEIPersistFile_fnSave, /* IEIPersistFile_fnSave */
551 IEIPersistFile_fnSaveCompleted, /* IEIPersistFile_fnSaveCompleted */
552 IEIPersistFile_fnGetCurFile /* IEIPersistFile_fnGetCurFile */
553#else
554 (void *) 0xdeadbeef /* IEIPersistFile_fnSave */,
555 (void *) 0xdeadbeef /* IEIPersistFile_fnSaveCompleted */,
556 (void *) 0xdeadbeef /* IEIPersistFile_fnGetCurFile */
557#endif
558};
559
Note: See TracBrowser for help on using the repository browser.