windows-nt/Source/XPSP1/NT/ds/security/gina/samples/gptdemo/snapin.cpp
2020-09-26 16:20:57 +08:00

671 lines
18 KiB
C++

#include "main.h"
// {febf1208-8aff-11d2-a8a1-00c04fbbcfa2}
#define GPEXT_GUID { 0xfebf1208, 0x8aff, 0x11d2, { 0xa8, 0xa1, 0x0, 0xc0, 0x4f, 0xbb, 0xcf, 0xa2} };
GUID guidGPExt = GPEXT_GUID;
GUID guidSnapin = CLSID_GPTDemoSnapIn;
///////////////////////////////////////////////////////////////////////////////
// //
// CSnapIn object implementation //
// //
///////////////////////////////////////////////////////////////////////////////
CSnapIn::CSnapIn(CComponentData *pComponent)
{
m_cRef = 1;
InterlockedIncrement(&g_cRefThisDll);
m_pcd = pComponent;
m_pConsole = NULL;
m_pResult = NULL;
m_pHeader = NULL;
m_pImageResult = NULL;
m_pConsoleVerb = NULL;
m_nColumnSize = 180;
m_lViewMode = LVS_ICON;
LoadString(g_hInstance, IDS_NAME, m_column1, sizeof(m_column1));
}
CSnapIn::~CSnapIn()
{
InterlockedDecrement(&g_cRefThisDll);
}
///////////////////////////////////////////////////////////////////////////////
// //
// CSnapIn object implementation (IUnknown) //
// //
///////////////////////////////////////////////////////////////////////////////
HRESULT CSnapIn::QueryInterface (REFIID riid, void **ppv)
{
if (IsEqualIID(riid, IID_IComponent) || IsEqualIID(riid, IID_IUnknown))
{
*ppv = (LPCOMPONENT)this;
m_cRef++;
return S_OK;
}
else if (IsEqualIID(riid, IID_IExtendPropertySheet))
{
*ppv = (LPEXTENDPROPERTYSHEET)this;
m_cRef++;
return S_OK;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
}
ULONG CSnapIn::AddRef (void)
{
return ++m_cRef;
}
ULONG CSnapIn::Release (void)
{
if (--m_cRef == 0) {
delete this;
return 0;
}
return m_cRef;
}
///////////////////////////////////////////////////////////////////////////////
// //
// CSnapIn object implementation (IComponent) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSnapIn::Initialize(LPCONSOLE lpConsole)
{
HRESULT hr;
// Save the IConsole pointer
m_pConsole = lpConsole;
m_pConsole->AddRef();
hr = m_pConsole->QueryInterface(IID_IHeaderCtrl,
reinterpret_cast<void**>(&m_pHeader));
// Give the console the header control interface pointer
if (SUCCEEDED(hr))
m_pConsole->SetHeader(m_pHeader);
m_pConsole->QueryInterface(IID_IResultData,
reinterpret_cast<void**>(&m_pResult));
hr = m_pConsole->QueryResultImageList(&m_pImageResult);
hr = m_pConsole->QueryConsoleVerb(&m_pConsoleVerb);
return S_OK;
}
STDMETHODIMP CSnapIn::Destroy(long cookie)
{
if (m_pConsole != NULL)
{
m_pConsole->SetHeader(NULL);
m_pConsole->Release();
m_pConsole = NULL;
}
if (m_pHeader != NULL)
{
m_pHeader->Release();
m_pHeader = NULL;
}
if (m_pResult != NULL)
{
m_pResult->Release();
m_pResult = NULL;
}
if (m_pImageResult != NULL)
{
m_pImageResult->Release();
m_pImageResult = NULL;
}
if (m_pConsoleVerb != NULL)
{
m_pConsoleVerb->Release();
m_pConsoleVerb = NULL;
}
return S_OK;
}
STDMETHODIMP CSnapIn::Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param)
{
HRESULT hr = S_OK;
switch(event)
{
case MMCN_DBLCLICK:
hr = S_FALSE;
break;
case MMCN_ADD_IMAGES:
HBITMAP hbmp16x16;
HBITMAP hbmp32x32;
hbmp16x16 = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_16x16));
hbmp32x32 = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_32x32));
// Set the images
m_pImageResult->ImageListSetStrip(reinterpret_cast<long*>(hbmp16x16),
reinterpret_cast<long*>(hbmp32x32),
0, RGB(255, 0, 255));
DeleteObject(hbmp16x16);
DeleteObject(hbmp32x32);
break;
case MMCN_SHOW:
if (arg == TRUE)
{
RESULTDATAITEM resultItem;
LPGPTDATAOBJECT pGPTDataObject;
long cookie;
INT i;
//
// Get the cookie of the scope pane item
//
hr = lpDataObject->QueryInterface(IID_IGPTDataObject, (LPVOID *)&pGPTDataObject);
if (FAILED(hr))
return S_OK;
hr = pGPTDataObject->GetCookie(&cookie);
pGPTDataObject->Release(); // release initial ref
if (FAILED(hr))
return S_OK;
//
// Prepare the view
//
m_pHeader->InsertColumn(0, m_column1, LVCFMT_LEFT, m_nColumnSize);
m_pResult->SetViewMode(m_lViewMode);
//
// Add result pane items for this node
//
for (i = 0; i < g_NameSpace[cookie].cResultItems; i++)
{
resultItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
resultItem.str = MMC_CALLBACK;
resultItem.nImage = g_NameSpace[cookie].pResultItems[i].iImage;
resultItem.lParam = (LPARAM) &g_NameSpace[cookie].pResultItems[i];
m_pResult->InsertItem(&resultItem);
}
//m_pResult->Sort(0, 0, -1);
}
else
{
m_pHeader->GetColumnWidth(0, &m_nColumnSize);
m_pResult->GetViewMode(&m_lViewMode);
}
break;
case MMCN_SELECT:
if (m_pConsoleVerb)
{
LPRESULTITEM pItem;
LPGPTDATAOBJECT pGPTDataObject;
DATA_OBJECT_TYPES type;
LONG cookie;
//
// Set the default verb to open
//
m_pConsoleVerb->SetDefaultVerb(MMC_VERB_OPEN);
//
// See if this is one of our items.
//
hr = lpDataObject->QueryInterface(IID_IGPTDataObject, (LPVOID *)&pGPTDataObject);
if (FAILED(hr))
break;
pGPTDataObject->GetType(&type);
pGPTDataObject->GetCookie(&cookie);
pGPTDataObject->Release();
//
// If this is a result pane item or the root of the namespace
// nodes, enable the Properties menu item
//
if ((type == CCT_RESULT) || ((type == CCT_SCOPE) && (cookie == 0)))
{
m_pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, ENABLED, TRUE);
//
// If this is a result pane item, then change the default
// verb to Properties.
//
if (type == CCT_RESULT)
m_pConsoleVerb->SetDefaultVerb(MMC_VERB_PROPERTIES);
}
}
break;
default:
hr = E_UNEXPECTED;
break;
}
return hr;
}
STDMETHODIMP CSnapIn::GetDisplayInfo(LPRESULTDATAITEM pResult)
{
if (pResult)
{
if (pResult->bScopeItem == TRUE)
{
if (pResult->mask & RDI_STR)
{
if (pResult->nCol == 0)
pResult->str = g_NameSpace[pResult->lParam].szDisplayName;
else
pResult->str = L"";
}
if (pResult->mask & RDI_IMAGE)
{
pResult->nImage = 0;
}
}
else
{
if (pResult->mask & RDI_STR)
{
if (pResult->nCol == 0)
{
LPRESULTITEM lpResultItem = (LPRESULTITEM)pResult->lParam;
if (lpResultItem->szDisplayName[0] == TEXT('\0'))
{
LoadString (g_hInstance, lpResultItem->iStringID,
lpResultItem->szDisplayName,
MAX_DISPLAYNAME_SIZE);
}
pResult->str = lpResultItem->szDisplayName;
}
if (pResult->str == NULL)
pResult->str = (LPOLESTR)L"";
}
}
}
return S_OK;
}
STDMETHODIMP CSnapIn::QueryDataObject(long cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT *ppDataObject)
{
return m_pcd->QueryDataObject(cookie, type, ppDataObject);
}
STDMETHODIMP CSnapIn::GetResultViewType(long cookie, LPOLESTR *ppViewType,
long *pViewOptions)
{
return S_FALSE;
}
STDMETHODIMP CSnapIn::CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB)
{
HRESULT hr = S_FALSE;
LPGPTDATAOBJECT pGPTDataObjectA, pGPTDataObjectB;
LONG cookie1, cookie2;
if (lpDataObjectA == NULL || lpDataObjectB == NULL)
return E_POINTER;
//
// QI for the private GPTDataObject interface
//
if (FAILED(lpDataObjectA->QueryInterface(IID_IGPTDataObject,
(LPVOID *)&pGPTDataObjectA)))
{
return S_FALSE;
}
if (FAILED(lpDataObjectB->QueryInterface(IID_IGPTDataObject,
(LPVOID *)&pGPTDataObjectB)))
{
pGPTDataObjectA->Release();
return S_FALSE;
}
pGPTDataObjectA->GetCookie(&cookie1);
pGPTDataObjectB->GetCookie(&cookie2);
if (cookie1 == cookie2)
{
hr = S_OK;
}
pGPTDataObjectA->Release();
pGPTDataObjectB->Release();
return hr;
}
///////////////////////////////////////////////////////////////////////////////
// //
// CComponentData object implementation (IExtendPropertySheet) //
// //
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSnapIn::CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider,
long handle, LPDATAOBJECT lpDataObject)
{
HRESULT hr;
PROPSHEETPAGE psp;
HPROPSHEETPAGE hPage[2];
LPGPTDATAOBJECT pGPTDataObject;
LPRESULTITEM pItem;
LONG cookie;
//
// Make sure this is one of our objects
//
if (FAILED(lpDataObject->QueryInterface(IID_IGPTDataObject,
(LPVOID *)&pGPTDataObject)))
{
return S_OK;
}
//
// Get the cookie
//
pGPTDataObject->GetCookie(&cookie);
pGPTDataObject->Release();
pItem = (LPRESULTITEM)cookie;
//
// Initialize the common fields in the property sheet structure
//
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = 0;
psp.hInstance = g_hInstance;
psp.lParam = (LPARAM) this;
//
// Do the page specific stuff
//
switch (pItem->dwID)
{
case 2:
psp.pszTemplate = MAKEINTRESOURCE(IDD_README);
psp.pfnDlgProc = ReadmeDlgProc;
hPage[0] = CreatePropertySheetPage(&psp);
if (hPage[0])
{
hr = lpProvider->AddPage(hPage[0]);
}
else
{
DebugMsg((DM_WARNING, TEXT("CSnapIn::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
hr = E_FAIL;
}
break;
case 3:
psp.pszTemplate = MAKEINTRESOURCE(IDD_APPEAR);
psp.pfnDlgProc = AppearDlgProc;
hPage[0] = CreatePropertySheetPage(&psp);
if (hPage[0])
{
hr = lpProvider->AddPage(hPage[0]);
}
else
{
DebugMsg((DM_WARNING, TEXT("CSnapIn::CreatePropertyPages: Failed to create property sheet page with %d."),
GetLastError()));
hr = E_FAIL;
}
break;
}
return (hr);
}
STDMETHODIMP CSnapIn::QueryPagesFor(LPDATAOBJECT lpDataObject)
{
LPGPTDATAOBJECT pGPTDataObject;
DATA_OBJECT_TYPES type;
if (SUCCEEDED(lpDataObject->QueryInterface(IID_IGPTDataObject,
(LPVOID *)&pGPTDataObject)))
{
pGPTDataObject->GetType(&type);
pGPTDataObject->Release();
if (type == CCT_RESULT)
return S_OK;
}
return S_FALSE;
}
///////////////////////////////////////////////////////////////////////////////
// //
// CSnapIn object implementation (Internal functions) //
// //
///////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK CSnapIn::ReadmeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
return FALSE;
}
BOOL CALLBACK CSnapIn::AppearDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
CSnapIn * pCS;
static BOOL bAppearDirty;
HKEY hKeyRoot, hKey;
DWORD dwType, dwSize, dwDisp;
TCHAR szBuffer[MAX_PATH];
TCHAR szPath[2 * MAX_PATH];
HRESULT hr;
switch (message)
{
case WM_INITDIALOG:
{
pCS = (CSnapIn *) (((LPPROPSHEETPAGE)lParam)->lParam);
SetWindowLong (hDlg, DWL_USER, (LONG) pCS);
if (!pCS) {
break;
}
CheckRadioButton (hDlg, IDC_RED, IDC_DEFAULT, IDC_DEFAULT);
hr = pCS->m_pcd->m_pGPTInformation->GetFileSysPath (GPO_SECTION_USER, szPath, ARRAYSIZE(szPath));
if (SUCCEEDED(hr))
{
lstrcat (szPath, TEXT("\\gpext.ini"));
GetPrivateProfileString (TEXT("Colors"), TEXT("Background"), TEXT("0 128 128"),
szBuffer, MAX_PATH, szPath);
if (!lstrcmpi(szBuffer, TEXT("255 0 0")))
CheckRadioButton (hDlg, IDC_RED, IDC_DEFAULT, IDC_RED);
else if (!lstrcmpi(szBuffer, TEXT("0 255 0")))
CheckRadioButton (hDlg, IDC_RED, IDC_DEFAULT, IDC_GREEN);
else if (!lstrcmpi(szBuffer, TEXT("0 0 255")))
CheckRadioButton (hDlg, IDC_RED, IDC_DEFAULT, IDC_BLUE);
else if (!lstrcmpi(szBuffer, TEXT("0 0 0")))
CheckRadioButton (hDlg, IDC_RED, IDC_DEFAULT, IDC_BLACK);
else if (!lstrcmpi(szBuffer, TEXT("160 160 164")))
CheckRadioButton (hDlg, IDC_RED, IDC_DEFAULT, IDC_GRAY);
GetPrivateProfileString (TEXT("Desktop"), TEXT("Wallpaper"), TEXT("(None)"),
szBuffer, MAX_PATH, szPath);
SetDlgItemText (hDlg, IDC_WALLPAPER, szBuffer);
GetPrivateProfileString (TEXT("Desktop"), TEXT("TileWallpaper"), TEXT("0"),
szBuffer, MAX_PATH, szPath);
if (szBuffer[0] == TEXT('1'))
CheckRadioButton (hDlg, IDC_TILE, IDC_CENTER, IDC_TILE);
else
CheckRadioButton (hDlg, IDC_TILE, IDC_CENTER, IDC_CENTER);
}
bAppearDirty = FALSE;
break;
}
case WM_COMMAND:
if ((HIWORD(wParam) == BN_CLICKED) || (HIWORD(wParam) == EN_UPDATE))
{
if (!bAppearDirty)
{
SendMessage (GetParent(hDlg), PSM_CHANGED, (WPARAM) hDlg, 0);
bAppearDirty = TRUE;
}
}
break;
case WM_NOTIFY:
pCS = (CSnapIn *) GetWindowLong (hDlg, DWL_USER);
if (!pCS) {
break;
}
switch (((NMHDR FAR*)lParam)->code)
{
case PSN_APPLY:
{
if (bAppearDirty)
{
hr = pCS->m_pcd->m_pGPTInformation->GetFileSysPath (GPO_SECTION_USER, szPath, ARRAYSIZE(szPath));
if (SUCCEEDED(hr))
{
lstrcat (szPath, TEXT("\\gpext.ini"));
lstrcpy (szBuffer, TEXT("0 128 128"));
if (IsDlgButtonChecked (hDlg, IDC_RED) == BST_CHECKED)
lstrcpy (szBuffer, TEXT("255 0 0"));
else if (IsDlgButtonChecked (hDlg, IDC_GREEN) == BST_CHECKED)
lstrcpy (szBuffer, TEXT("0 255 0"));
else if (IsDlgButtonChecked (hDlg, IDC_BLUE) == BST_CHECKED)
lstrcpy (szBuffer, TEXT("0 0 255"));
else if (IsDlgButtonChecked (hDlg, IDC_BLACK) == BST_CHECKED)
lstrcpy (szBuffer, TEXT("0 0 0"));
else if (IsDlgButtonChecked (hDlg, IDC_GRAY) == BST_CHECKED)
lstrcpy (szBuffer, TEXT("160 160 164"));
WritePrivateProfileString (TEXT("Colors"), TEXT("Background"), szBuffer, szPath);
lstrcpy (szBuffer, TEXT("(None)"));
GetDlgItemText (hDlg, IDC_WALLPAPER, szBuffer, MAX_PATH);
WritePrivateProfileString (TEXT("Desktop"), TEXT("Wallpaper"), szBuffer, szPath);
if (IsDlgButtonChecked (hDlg, IDC_TILE) == BST_CHECKED)
lstrcpy (szBuffer, TEXT("1"));
else
lstrcpy (szBuffer, TEXT("0"));
WritePrivateProfileString (TEXT("Desktop"), TEXT("TileWallpaper"), szBuffer, szPath);
bAppearDirty = FALSE;
pCS->m_pcd->m_pGPTInformation->PolicyChanged(FALSE, TRUE, &guidGPExt, &guidSnapin);
}
}
}
// fall through...
case PSN_RESET:
SetWindowLong (hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
return TRUE;
}
break;
}
return FALSE;
}