Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

320 lines
8.9 KiB

//
// CPifFile class
//
// supports:
//
// IPersistFile - "load" a PIF file
// IExtractIcon - extract a icon from a PIF file.
//
#define NO_INCLUDE_UNION
#include "shellprv.h"
////////////////////////////////////////////////////////////////////////
// PifFile class
////////////////////////////////////////////////////////////////////////
class PifFile : IShellExtInit, IExtractIcon, IPersistFile
#ifdef UNICODE
, IExtractIconA
#endif
{
public:
// *** IUnknown methods ***
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
ULONG STDMETHODCALLTYPE AddRef(void);
ULONG STDMETHODCALLTYPE Release(void);
// *** IShellExtInit methods ***
HRESULT STDMETHODCALLTYPE Initialize(LPCITEMIDLIST pidlFolder,LPDATAOBJECT lpdobj, HKEY hkeyProgID);
// *** IPersist methods ***
HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
// *** IPersistFile methods ***
HRESULT STDMETHODCALLTYPE IsDirty(void);
HRESULT STDMETHODCALLTYPE Load(LPCOLESTR pszFileName, DWORD dwMode);
HRESULT STDMETHODCALLTYPE Save(LPCOLESTR pszFileName, BOOL fRemember);
HRESULT STDMETHODCALLTYPE SaveCompleted(LPCOLESTR pszFileName);
HRESULT STDMETHODCALLTYPE GetCurFile(LPOLESTR *ppszFileName);
// *** IExtractIcon methods ***
HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags,LPTSTR szIconFile,UINT cchMax,int *piIndex,UINT * pwFlags);
HRESULT STDMETHODCALLTYPE ExtractIcon(LPCTSTR pszFile,UINT nIconIndex,HICON *phiconLarge,HICON *phiconSmall,UINT nIcons);
#ifdef UNICODE
// *** IExtractIconA methods ***
HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags,LPSTR szIconFile,UINT cchMax,int *piIndex,UINT * pwFlags);
HRESULT STDMETHODCALLTYPE ExtractIcon(LPCSTR pszFile,UINT nIconIndex,HICON *phiconLarge,HICON *phiconSmall,UINT nIcons);
#endif
PifFile();
~PifFile();
//
// data
//
private:
UINT cRef;
int hPifProps;
};
////////////////////////////////////////////////////////////////////////
//
// CPifFile_CreateInstance
//
// public function to create a instance of a CPifFile
//
////////////////////////////////////////////////////////////////////////
extern "C" HRESULT CALLBACK CPifFile_CreateInstance(LPUNKNOWN punkOuter, REFIID riid, LPVOID FAR* ppvOut)
{
HRESULT hres;
PifFile *p;
// does not support aggregation.
if (punkOuter)
return ResultFromScode(CLASS_E_NOAGGREGATION);
p = new PifFile();
if (p == NULL)
return ResultFromScode(E_FAIL);
//
// Note that the Release member will free the object, if QueryInterface
// failed.
//
hres = p->QueryInterface(riid, ppvOut);
p->Release();
return hres; // S_OK or E_NOINTERFACE
}
////////////////////////////////////////////////////////////////////////
// constuct/destruct
////////////////////////////////////////////////////////////////////////
PifFile::PifFile()
{
this->cRef = 1;
}
PifFile::~PifFile()
{
if (hPifProps)
PifMgr_CloseProperties(hPifProps, 0);
hPifProps=0;
}
////////////////////////////////////////////////////////////////////////
// IUnknown
////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE PifFile::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
{
*ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown))
{
DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IUnknown)"));
*ppvObj = (void*)this;
AddRef();
return NOERROR;
}
else if (IsEqualIID(riid, IID_IShellExtInit))
{
DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IShellExtInit)"));
*ppvObj = (void*)(IShellExtInit*)this;
AddRef();
return NOERROR;
}
else if (IsEqualIID(riid, IID_IPersistFile))
{
DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IPersistFile)"));
*ppvObj = (void*)(IPersistFile*)this;
AddRef();
return NOERROR;
}
else if (IsEqualIID(riid, IID_IExtractIcon))
{
DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IExtractIcon)"));
*ppvObj = (void*)(IExtractIcon*)this;
AddRef();
return NOERROR;
}
#ifdef UNICODE
else if (IsEqualIID(riid, IID_IExtractIconA))
{
DebugMsg(DM_TRACE, TEXT("PifFile::QueryInterface(IExtractIconA)"));
*ppvObj = (void*)(IExtractIconA*)this;
AddRef();
return NOERROR;
}
#endif
return ResultFromScode(E_NOINTERFACE);
}
ULONG STDMETHODCALLTYPE PifFile::AddRef()
{
DebugMsg(DM_TRACE, TEXT("PifFile::AddRef() ==> %d"), this->cRef+1);
this->cRef++;
return this->cRef;
}
ULONG STDMETHODCALLTYPE PifFile::Release()
{
DebugMsg(DM_TRACE, TEXT("PifFile::Release() ==> %d"), this->cRef-1);
this->cRef--;
if (this->cRef>0)
{
return this->cRef;
}
delete this;
return 0;
}
////////////////////////////////////////////////////////////////////////
// IShellExtInit
////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE PifFile::Initialize(LPCITEMIDLIST pidlFolder,LPDATAOBJECT lpdobj, HKEY hkeyProgID)
{
DebugMsg(DM_TRACE, TEXT("PifFile::Initialize()"));
return ResultFromScode(S_OK);
}
////////////////////////////////////////////////////////////////////////
// IPersistFile
////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE PifFile::GetClassID(LPCLSID lpClassID)
{
DebugMsg(DM_TRACE, TEXT("PifFile::GetClass()"));
*lpClassID = CLSID_PifFile;
return NOERROR;
}
HRESULT STDMETHODCALLTYPE PifFile::IsDirty()
{
DebugMsg(DM_TRACE, TEXT("PifFile::IsDirty()"));
return ResultFromScode(S_FALSE);
}
HRESULT STDMETHODCALLTYPE PifFile::Load(LPCOLESTR pwszFile, DWORD grfMode)
{
TCHAR szPath[MAX_PATH];
OleStrToStrN(szPath, ARRAYSIZE(szPath), pwszFile, -1);
DebugMsg(DM_TRACE, TEXT("PifFile::Load(%s)"), szPath);
if (hPifProps)
PifMgr_CloseProperties(hPifProps, 0);
hPifProps = PifMgr_OpenProperties(szPath, NULL, 0, 0);
return hPifProps == 0 ? ResultFromScode(E_FAIL) : ResultFromScode(S_OK);
}
HRESULT STDMETHODCALLTYPE PifFile::Save(LPCOLESTR pwszFile, BOOL fRemember)
{
return ResultFromScode(E_NOTIMPL);
}
HRESULT STDMETHODCALLTYPE PifFile::SaveCompleted(LPCOLESTR pwszFile)
{
return ResultFromScode(E_NOTIMPL);
}
HRESULT STDMETHODCALLTYPE PifFile::GetCurFile(LPOLESTR FAR* lplpszFileName)
{
return ResultFromScode(E_NOTIMPL);
}
////////////////////////////////////////////////////////////////////////
// IExtractIcon
////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE PifFile::GetIconLocation(UINT uFlags,LPTSTR szIconFile,UINT cchMax,int *piIndex,UINT * pwFlags)
{
PROPPRG ProgramProps;
VDATEINPUTBUF(szIconFile, TCHAR, cchMax);
if (hPifProps == 0)
return ResultFromScode(E_FAIL);
if (!PifMgr_GetProperties(hPifProps,MAKEINTATOM(GROUP_PRG), &ProgramProps, SIZEOF(ProgramProps), 0))
{
DebugMsg(DM_TRACE, TEXT("PifFile::GetIconLocation() PifMgr_GetProperties *failed*"));
return ResultFromScode(E_FAIL);
}
if (ProgramProps.achIconFile[0] == 0)
{
lstrcpy(szIconFile, ICONFILE_DEFAULT);
*piIndex = ICONINDEX_DEFAULT;
}
else
{
lstrcpy(szIconFile, ProgramProps.achIconFile);
*piIndex = ProgramProps.wIconIndex;
}
*pwFlags = 0;
DebugMsg(DM_TRACE, TEXT("PifFile::GetIconLocation() ==> %s!%d"), szIconFile, *piIndex);
return ResultFromScode(S_OK);
}
HRESULT STDMETHODCALLTYPE PifFile::ExtractIcon(LPCTSTR pszFile,UINT nIconIndex,HICON *phiconLarge,HICON *phiconSmall,UINT nIcons)
{
DebugMsg(DM_TRACE, TEXT("PifFile::ExtractIcon()"));
return ResultFromScode(E_NOTIMPL);
}
#ifdef UNICODE
////////////////////////////////////////////////////////////////////////
// IExtractIconA
////////////////////////////////////////////////////////////////////////
HRESULT STDMETHODCALLTYPE PifFile::GetIconLocation(UINT uFlags,LPSTR pszIconFile,UINT cchMax,int *piIndex,UINT * pwFlags)
{
WCHAR szIconFile[MAX_PATH];
HRESULT hres;
VDATEINPUTBUF(szIconFile, TCHAR, cchMax);
DebugMsg(DM_TRACE, TEXT("PifFile::IExtractIconA::GetIconLocation()"));
hres = this->GetIconLocation(uFlags,szIconFile,ARRAYSIZE(szIconFile),
piIndex, pwFlags);
//
// We don't want to copy the icon file name on the S_FALSE case
//
if (SUCCEEDED(hres) && hres != S_FALSE)
{
WideCharToMultiByte(CP_ACP, 0,
szIconFile, -1,
pszIconFile, cchMax,
NULL, NULL);
}
return hres;
}
HRESULT STDMETHODCALLTYPE PifFile::ExtractIcon(LPCSTR pszFile,UINT nIconIndex,HICON *phiconLarge,HICON *phiconSmall,UINT nIcons)
{
DebugMsg(DM_TRACE, TEXT("PifFile::IExtractIconA::ExtractIcon()"));
return ResultFromScode(E_NOTIMPL);
}
#endif