Sweden-Number/dlls/shell32/folders.c

149 lines
3.8 KiB
C

/*
* Copyright 1997 Marcus Meissner
* Copyright 1998 Juergen Schmied
*
*/
#include <stdlib.h>
#include <string.h>
#include "wine/obj_base.h"
#include "wine/obj_extracticon.h"
#include "debug.h"
#include "winerror.h"
#include "pidl.h"
#include "shell32_main.h"
/***********************************************************************
* IExtractIconA implementation
*/
typedef struct
{ ICOM_VTABLE(IExtractIconA)* lpvtbl;
DWORD ref;
LPITEMIDLIST pidl;
} IExtractIconAImpl;
static struct ICOM_VTABLE(IExtractIconA) eivt;
/**************************************************************************
* IExtractIconA_Constructor
*/
IExtractIconA* IExtractIconA_Constructor(LPCITEMIDLIST pidl)
{
IExtractIconAImpl* ei;
ei=(IExtractIconAImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IExtractIconAImpl));
ei->ref=1;
ei->lpvtbl=&eivt;
ei->pidl=ILClone(pidl);
pdump(pidl);
TRACE(shell,"(%p)\n",ei);
shell32_ObjCount++;
return (IExtractIconA *)ei;
}
/**************************************************************************
* IExtractIconA_QueryInterface
*/
static HRESULT WINAPI IExtractIconA_fnQueryInterface( IExtractIconA * iface, REFIID riid, LPVOID *ppvObj)
{
ICOM_THIS(IExtractIconAImpl,iface);
char xriid[50];
WINE_StringFromCLSID((LPCLSID)riid,xriid);
TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",This,xriid,ppvObj);
*ppvObj = NULL;
if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/
{ *ppvObj = This;
}
else if(IsEqualIID(riid, &IID_IExtractIconA)) /*IExtractIcon*/
{ *ppvObj = (IExtractIconA*)This;
}
if(*ppvObj)
{ IExtractIconA_AddRef((IExtractIconA*) *ppvObj);
TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
return S_OK;
}
TRACE(shell,"-- Interface: E_NOINTERFACE\n");
return E_NOINTERFACE;
}
/**************************************************************************
* IExtractIconA_AddRef
*/
static ULONG WINAPI IExtractIconA_fnAddRef(IExtractIconA * iface)
{
ICOM_THIS(IExtractIconAImpl,iface);
TRACE(shell,"(%p)->(count=%lu)\n",This,(This->ref)+1);
shell32_ObjCount++;
return ++(This->ref);
}
/**************************************************************************
* IExtractIconA_Release
*/
static ULONG WINAPI IExtractIconA_fnRelease(IExtractIconA * iface)
{
ICOM_THIS(IExtractIconAImpl,iface);
TRACE(shell,"(%p)->()\n",This);
shell32_ObjCount--;
if (!--(This->ref))
{ TRACE(shell," destroying IExtractIcon(%p)\n",This);
SHFree(This->pidl);
HeapFree(GetProcessHeap(),0,This);
return 0;
}
return This->ref;
}
/**************************************************************************
* IExtractIconA_GetIconLocation
*/
static HRESULT WINAPI IExtractIconA_fnGetIconLocation(IExtractIconA * iface, UINT uFlags, LPSTR szIconFile, UINT cchMax, int * piIndex, UINT * pwFlags)
{
ICOM_THIS(IExtractIconAImpl,iface);
WARN (shell,"(%p) (flags=%u file=%s max=%u %p %p) semi-stub\n", This, uFlags, szIconFile, cchMax, piIndex, pwFlags);
*piIndex = (int) SHMapPIDLToSystemImageListIndex(0, This->pidl,0);
*pwFlags = GIL_NOTFILENAME;
WARN (shell,"-- %x\n",*piIndex);
return NOERROR;
}
/**************************************************************************
* IExtractIconA_Extract
*/
static HRESULT WINAPI IExtractIconA_fnExtract(IExtractIconA * iface, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize)
{
ICOM_THIS(IExtractIconAImpl,iface);
FIXME (shell,"(%p) (file=%s index=%u %p %p size=%u) semi-stub\n", This, pszFile, nIconIndex, phiconLarge, phiconSmall, nIconSize);
*phiconLarge = pImageList_GetIcon(ShellBigIconList, nIconIndex, ILD_TRANSPARENT);
*phiconSmall = pImageList_GetIcon(ShellSmallIconList, nIconIndex, ILD_TRANSPARENT);
return S_OK;
}
static struct ICOM_VTABLE(IExtractIconA) eivt =
{ IExtractIconA_fnQueryInterface,
IExtractIconA_fnAddRef,
IExtractIconA_fnRelease,
IExtractIconA_fnGetIconLocation,
IExtractIconA_fnExtract
};