Windows-Server-2003/shell/ext/keyremap/mappsx.c

247 lines
6.3 KiB
C

/*****************************************************************************
*
* mappsx.c - IShellPropSheetExt interface
*
*****************************************************************************/
#include "map.h"
/*****************************************************************************
*
* The sqiffle for this file.
*
*****************************************************************************/
#define sqfl sqflPsx
/*****************************************************************************
*
* Declare the interfaces we will be providing.
*
* We must implement an IShellExtInit so the shell
* will know that we are ready for action.
*
*****************************************************************************/
Primary_Interface(CMapPsx, IShellPropSheetExt);
Secondary_Interface(CMapPsx, IShellExtInit);
/*****************************************************************************
*
* CMapPsx
*
* The property sheet extension for the Map/Ctrl gizmo.
*
*****************************************************************************/
typedef struct CMapPsx {
/* Supported interfaces */
IShellPropSheetExt psx;
IShellExtInit sxi;
} CMapPsx, CMSX, *PCMSX;
typedef IShellPropSheetExt PSX, *PPSX;
typedef IShellExtInit SXI, *PSXI;
typedef IDataObject DTO, *PDTO; /* Used by IShellExtInit */
/*****************************************************************************
*
* CMapPsx_QueryInterface (from IUnknown)
*
* We need to check for our additional interfaces before falling
* through to Common_QueryInterface.
*
*****************************************************************************/
STDMETHODIMP
CMapPsx_QueryInterface(PPSX ppsx, RIID riid, PPV ppvObj)
{
PCMSX this = IToClass(CMapPsx, psx, ppsx);
HRESULT hres;
if (IsEqualIID(riid, &IID_IShellExtInit)) {
*ppvObj = &this->sxi;
Common_AddRef(this);
hres = S_OK;
} else {
hres = Common_QueryInterface(this, riid, ppvObj);
}
AssertF(fLimpFF(FAILED(hres), *ppvObj == 0));
return hres;
}
/*****************************************************************************
*
* CMapPsx_AddRef (from IUnknown)
* CMapPsx_Release (from IUnknown)
*
*****************************************************************************/
#ifdef DEBUG
Default_AddRef(CMapPsx)
Default_Release(CMapPsx)
#else
#define CMapPsx_AddRef Common_AddRef
#define CMapPsx_Release Common_Release
#endif
/*****************************************************************************
*
* CMapPsx_Finalize (from Common)
*
* Release the resources of an CMapPsx.
*
*****************************************************************************/
void EXTERNAL
CMapPsx_Finalize(PV pv)
{
PCMSX this = pv;
EnterProc(CMapPsx_Finalize, (_ "p", pv));
ExitProc();
}
/*****************************************************************************
*
* CMapPsx_AddPages (From IShellPropSheetExt)
*
* Add one or more pages to an existing property sheet.
*
* lpfnAdd - callback function to add pages
* lp - refdata for lpfnAdd
*
*****************************************************************************/
STDMETHODIMP
CMapPsx_AddPages(PPSX ppsx, LPFNADDPROPSHEETPAGE lpfnAdd, LPARAM lp)
{
PCMSX this = IToClass(CMapPsx, psx, ppsx);
HRESULT hres;
EnterProc(CMapPsx_AddPages, (_ "p", ppsx));
/*
* Add the page only on Windows NT.
*/
if ((int)GetVersion() >= 0 && lpfnAdd) {
HPROPSHEETPAGE hpsp;
PROPSHEETPAGE psp;
psp.dwSize = sizeof(psp);
psp.dwFlags = PSP_DEFAULT;
psp.hInstance = g_hinst;
psp.pszTemplate = MAKEINTRESOURCE(IDD_MAIN);
psp.pfnDlgProc = MapPs_DlgProc;
hpsp = CreatePropertySheetPage(&psp);
if (hpsp) {
if (lpfnAdd(hpsp, lp)) {
Common_AddRef(this);
hres = S_OK;
} else {
DestroyPropertySheetPage(hpsp);
hres = E_FAIL;
}
} else {
hres = E_FAIL;
}
} else {
hres = E_INVALIDARG;
}
ExitOleProc();
return hres;
}
/*****************************************************************************
*
* CMapPsx_ReplacePages (From IShellPropSheetExt)
*
* Replaces one or more pages in an existing property sheet.
*
* id - page identifier
* lpfnReplace - callback function to replace the page
* lp - refdata for lpfnReplace
*
*****************************************************************************/
STDMETHODIMP
CMapPsx_ReplacePages(PPSX ppsx, UINT id,
LPFNADDPROPSHEETPAGE lpfnAdd, LPARAM lp)
{
PCMSX this = IToClass(CMapPsx, psx, ppsx);
HRESULT hres;
EnterProc(CMapPsx_ReplacePages, (_ "pu", ppsx, id));
hres = S_OK;
ExitOleProc();
return hres;
}
/*****************************************************************************
*
* CMapPsx_SXI_Initialize (from IShellExtension)
*
*****************************************************************************/
STDMETHODIMP
CMapPsx_SXI_Initialize(PSXI psxi, PCIDL pidlFolder, PDTO pdto, HKEY hk)
{
PCMSX this = IToClass(CMapPsx, sxi, psxi);
HRESULT hres;
EnterProc(CMapPsx_SXI_Initialize, (_ ""));
hres = S_OK;
ExitOleProc();
return hres;
}
/*****************************************************************************
*
* CMapPsx_New (from IClassFactory)
*
* Note that we release the pmpsx that Common_New created, because we
* are done with it. The real refcount is handled by the
* CMapPsx_QueryInterface.
*
*****************************************************************************/
STDMETHODIMP
CMapPsx_New(RIID riid, PPV ppvObj)
{
HRESULT hres;
EnterProc(CMapPsx_New, (_ "G", riid));
*ppvObj = 0;
hres = Common_New(CMapPsx, ppvObj);
if (SUCCEEDED(hres)) {
PCMSX pmpsx = *ppvObj;
pmpsx->sxi.lpVtbl = Secondary_Vtbl(CMapPsx, IShellExtInit);
hres = CMapPsx_QueryInterface(&pmpsx->psx, riid, ppvObj);
Common_Release(pmpsx);
}
ExitOleProcPpv(ppvObj);
return hres;
}
/*****************************************************************************
*
* The long-awaited vtbls
*
*****************************************************************************/
#pragma BEGIN_CONST_DATA
Primary_Interface_Begin(CMapPsx, IShellPropSheetExt)
CMapPsx_AddPages,
CMapPsx_ReplacePages,
Primary_Interface_End(CMapPsx, IIShellPropSheetExt)
Secondary_Interface_Begin(CMapPsx, IShellExtInit, sxi)
CMapPsx_SXI_Initialize,
Secondary_Interface_End(CMapPsx, IShellExtInit, sxi)