- New implementation of SendMessage, ReceiveMessage, ReplyMessage functions
[wine] / dlls / shell32 / folders.c
1 /*
2  *      Copyright 1997  Marcus Meissner
3  *      Copyright 1998  Juergen Schmied
4  *
5  */
6
7 #include <stdlib.h>
8 #include <string.h>
9 #include "debug.h"
10 #include "objbase.h"
11 #include "winerror.h"
12 #include "pidl.h"
13 #include "shell32_main.h"
14 #include "shlguid.h"
15
16
17 /******************************************************************************
18 * foreward declaration
19 */
20
21 /* IExtractIcon implementation*/
22 static HRESULT WINAPI IExtractIcon_QueryInterface(LPEXTRACTICON, REFIID, LPVOID *);
23 static ULONG WINAPI IExtractIcon_AddRef(LPEXTRACTICON);
24 static ULONG WINAPI IExtractIcon_AddRef(LPEXTRACTICON);
25 static ULONG WINAPI IExtractIcon_Release(LPEXTRACTICON);
26 static HRESULT WINAPI IExtractIcon_GetIconLocation(LPEXTRACTICON, UINT32, LPSTR, UINT32, int *, UINT32 *);
27 static HRESULT WINAPI IExtractIcon_Extract(LPEXTRACTICON, LPCSTR, UINT32, HICON32 *, HICON32 *, UINT32);
28
29
30 /***********************************************************************
31 *   IExtractIcon implementation
32 */
33 static struct IExtractIcon_VTable eivt = 
34 { IExtractIcon_QueryInterface,
35   IExtractIcon_AddRef,
36   IExtractIcon_Release,
37   IExtractIcon_GetIconLocation,
38   IExtractIcon_Extract
39 };
40 /**************************************************************************
41 *  IExtractIcon_Constructor
42 */
43 LPEXTRACTICON IExtractIcon_Constructor(LPCITEMIDLIST pidl)
44 { LPEXTRACTICON ei;
45
46   ei=(LPEXTRACTICON)HeapAlloc(GetProcessHeap(),0,sizeof(IExtractIcon));
47   ei->ref=1;
48   ei->lpvtbl=&eivt;
49   ei->pidl=ILClone(pidl);
50
51   pdump(pidl);
52
53         TRACE(shell,"(%p)\n",ei);
54         shell32_ObjCount++;
55         return ei;
56 }
57 /**************************************************************************
58  *  IExtractIcon_QueryInterface
59  */
60 static HRESULT WINAPI IExtractIcon_QueryInterface( LPEXTRACTICON this, REFIID riid, LPVOID *ppvObj)
61 {  char xriid[50];
62    WINE_StringFromCLSID((LPCLSID)riid,xriid);
63    TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",this,xriid,ppvObj);
64
65   *ppvObj = NULL;
66
67   if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
68   { *ppvObj = this; 
69   }
70   else if(IsEqualIID(riid, &IID_IExtractIcon))  /*IExtractIcon*/
71   {    *ppvObj = (IExtractIcon*)this;
72   }   
73
74   if(*ppvObj)
75   { (*(LPEXTRACTICON*)ppvObj)->lpvtbl->fnAddRef(this);          
76     TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
77     return S_OK;
78   }
79         TRACE(shell,"-- Interface: E_NOINTERFACE\n");
80         return E_NOINTERFACE;
81 }   
82
83 /**************************************************************************
84 *  IExtractIcon_AddRef
85 */
86 static ULONG WINAPI IExtractIcon_AddRef(LPEXTRACTICON this)
87 {       TRACE(shell,"(%p)->(count=%lu)\n",this,(this->ref)+1);
88
89         shell32_ObjCount++;
90
91         return ++(this->ref);
92 }
93 /**************************************************************************
94 *  IExtractIcon_Release
95 */
96 static ULONG WINAPI IExtractIcon_Release(LPEXTRACTICON this)
97 {       TRACE(shell,"(%p)->()\n",this);
98
99         shell32_ObjCount--;
100
101   if (!--(this->ref)) 
102   { TRACE(shell," destroying IExtractIcon(%p)\n",this);
103     SHFree(this->pidl);
104     HeapFree(GetProcessHeap(),0,this);
105     return 0;
106   }
107   return this->ref;
108 }
109 /**************************************************************************
110 *  IExtractIcon_GetIconLocation
111 */
112 static HRESULT WINAPI IExtractIcon_GetIconLocation(LPEXTRACTICON this, UINT32 uFlags, LPSTR szIconFile, UINT32 cchMax, int * piIndex, UINT32 * pwFlags)
113 {       WARN (shell,"(%p) (flags=%u file=%s max=%u %p %p) semi-stub\n", this, uFlags, szIconFile, cchMax, piIndex, pwFlags);
114
115         *piIndex = (int) SHMapPIDLToSystemImageListIndex(0, this->pidl,0);
116         *pwFlags = GIL_NOTFILENAME;
117
118         WARN (shell,"-- %x\n",*piIndex);
119
120         return NOERROR;
121 }
122 /**************************************************************************
123 *  IExtractIcon_Extract
124 */
125 static HRESULT WINAPI IExtractIcon_Extract(LPEXTRACTICON this, LPCSTR pszFile, UINT32 nIconIndex, HICON32 *phiconLarge, HICON32 *phiconSmall, UINT32 nIconSize)
126 { FIXME (shell,"(%p) (file=%s index=%u %p %p size=%u) semi-stub\n", this, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
127   *phiconLarge = pImageList_GetIcon(ShellBigIconList, nIconIndex, ILD_TRANSPARENT);
128   *phiconSmall = pImageList_GetIcon(ShellSmallIconList, nIconIndex, ILD_TRANSPARENT);
129   return S_OK;
130 }
131