windows-nt/Source/XPSP1/NT/admin/snapin/wsecmgr/hidwnd.cpp
2020-09-26 16:20:57 +08:00

390 lines
7.8 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation 1996-2001.
//
// File: hidwnd.cpp
//
// Contents: implementation of CHiddenWnd
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include <mmc.h>
#include "wsecmgr.h"
#include "resource.h"
#include "snapmgr.h"
#include "HidWnd.h"
#include "util.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define SCEM_UPDATE_ALL_VIEWS (WM_APP+101)
#define SCEM_UPDATE_ITEM (WM_APP+102)
#define SCEM_REFRESH_POLICY (WM_APP+103)
#define SCEM_RELOAD_LOCATION (WM_APP+104)
#define SCEM_SET_PROFILE_DESC (WM_APP+105)
#define SCEM_LOCK_ANAL_PANE (WM_APP+106)
#define SCEM_CLOSE_ANAL_PANE (WM_APP+107)
#define SCEM_SELECT_SCOPE_ITEM (WM_APP+108)
/////////////////////////////////////////////////////////////////////////////
// CHiddenWnd
CHiddenWnd::CHiddenWnd()
{
m_GPTInfo = NULL;
m_pConsole = NULL;
}
CHiddenWnd::~CHiddenWnd()
{
DestroyWindow(); //Memory leak, 4/27/2001
if (m_pConsole) {
m_pConsole->Release();
}
if (m_GPTInfo) {
m_GPTInfo->Release();
}
}
BEGIN_MESSAGE_MAP(CHiddenWnd, CWnd)
//{{AFX_MSG_MAP(CHiddenWnd)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
ON_MESSAGE(SCEM_UPDATE_ALL_VIEWS,OnUpdateAllViews)
ON_MESSAGE(SCEM_UPDATE_ITEM,OnUpdateItem)
ON_MESSAGE(SCEM_REFRESH_POLICY,OnRefreshPolicy)
ON_MESSAGE(SCEM_RELOAD_LOCATION,OnReloadLocation)
ON_MESSAGE(SCEM_LOCK_ANAL_PANE,OnLockAnalysisPane)
ON_MESSAGE(SCEM_CLOSE_ANAL_PANE,OnCloseAnalysisPane)
ON_MESSAGE(SCEM_SELECT_SCOPE_ITEM,OnSelectScopeItem)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHiddenWnd message handlers
#define VOID_RET
void
CHiddenWnd::OnUpdateAllViews(WPARAM uParam, LPARAM lParam)
{
PUPDATEVIEWDATA puvd;
puvd = (PUPDATEVIEWDATA)uParam;
if (!puvd) {
return VOID_RET;
}
if (m_pConsole) {
m_pConsole->UpdateAllViews(puvd->pDataObject,puvd->data,puvd->hint);
}
if( puvd->pDataObject && 1 == (int)lParam ) //Raid #357968, #354861, 4/25/2001
{
puvd->pDataObject->Release();
}
LocalFree(puvd);
return VOID_RET;
}
void
CHiddenWnd::OnUpdateItem(WPARAM uParam, LPARAM lParam)
{
LPRESULTDATA pResultPane;
HRESULTITEM hResultItem;
pResultPane = (LPRESULTDATA)uParam;
hResultItem = (HRESULTITEM)lParam;
if (!pResultPane) {
return VOID_RET;
}
try {
pResultPane->UpdateItem(hResultItem);
} catch (...) {
ASSERT(FALSE);
}
return VOID_RET;
}
void
CHiddenWnd::OnRefreshPolicy(WPARAM uParam, LPARAM lParam)
{
GUID guidExtension = { 0x827d319e, 0x6eac, 0x11d2, {0xa4, 0xea, 0x00, 0xc0, 0x4f, 0x79, 0xf8, 0x3a }};
GUID guidSnapin = CLSID_Snapin;
if (!m_GPTInfo) {
return VOID_RET;
}
try {
if (!SUCCEEDED(m_GPTInfo->PolicyChanged(TRUE, TRUE, &guidExtension, &guidSnapin))) {
AfxMessageBox(IDS_ERROR_REFRESH_POLICY_FAILED);
}
} catch (...) {
AfxMessageBox(IDS_ERROR_REFRESH_POLICY_FAILED);
ASSERT(FALSE);
}
return VOID_RET;
}
void
CHiddenWnd::OnReloadLocation(WPARAM uParam, LPARAM lParam)
{
CFolder *pFolder;
CComponentDataImpl *pCDI;
pFolder = reinterpret_cast<CFolder*>(uParam);
if (lParam) {
pCDI = reinterpret_cast<CComponentDataImpl*>(lParam);
} else {
pCDI = m_pCDI;
}
try {
pCDI->ReloadLocation(pFolder);
} catch (...) {
ASSERT(FALSE);
}
return VOID_RET;
}
HRESULT
CHiddenWnd::UpdateAllViews(
LPDATAOBJECT pDO,
CSnapin *pSnapin,
CFolder *pFolder,
CResult *pResult,
UINT uAction
)
{
PUPDATEVIEWDATA puvd;
if(!m_hWnd){
return S_OK;
}
//
// Notify item.
//
puvd = (UpdateViewData *)LocalAlloc(0, sizeof( UpdateViewData ));
if (!puvd) {
return E_FAIL;
}
puvd->pDataObject = (LPDATAOBJECT)pSnapin;
puvd->data = (LPARAM)pResult;
puvd->hint = uAction;
if (!::PostMessage(m_hWnd, SCEM_UPDATE_ALL_VIEWS, (WPARAM)puvd, 0))
{
//
// puvd will be freed by the SCEM_UPDATE_ALL_VIEWS handler,
// but if somehow the PostMessage fails we need to free it ourselves.
//
LocalFree(puvd);
}
return S_OK;
}
HRESULT
CHiddenWnd::UpdateAllViews(LPDATAOBJECT pDO, LPARAM data, LPARAM hint)
{
PUPDATEVIEWDATA puvd;
puvd = (UpdateViewData *)LocalAlloc(0, sizeof(UpdateViewData));
if (!puvd) {
return E_FAIL;
}
puvd->pDataObject = pDO;
puvd->data = data;
puvd->hint = hint;
if (!m_hWnd || !::PostMessage(m_hWnd,SCEM_UPDATE_ALL_VIEWS,(WPARAM)puvd,(LPARAM)1))
{
//
// puvd will be freed by the SCEM_UPDATE_ALL_VIEWS handler,
// but if somehow the PostMessage fails we need to free it ourselves.
//
if( puvd->pDataObject ) //Raid #357968, #354861, 4/25/2001
{
puvd->pDataObject->Release();
}
LocalFree( puvd );
}
return S_OK;
}
HRESULT
CHiddenWnd::UpdateItem(LPRESULTDATA pResultPane,HRESULTITEM hResultItem)
{
if (!pResultPane) {
return E_INVALIDARG;
}
if (m_hWnd) {
::PostMessage(m_hWnd,SCEM_UPDATE_ITEM,(WPARAM)pResultPane,(LPARAM)hResultItem);
}
return S_OK;
}
HRESULT
CHiddenWnd::RefreshPolicy()
{
if (m_hWnd) {
::PostMessage(m_hWnd,SCEM_REFRESH_POLICY,0,0);
}
return S_OK;
}
void
CHiddenWnd::SetGPTInformation(LPGPEINFORMATION GPTInfo)
{
if (m_GPTInfo) {
m_GPTInfo->Release();
}
m_GPTInfo = GPTInfo;
if (m_GPTInfo) {
m_GPTInfo->AddRef();
}
}
void
CHiddenWnd::SetConsole(LPCONSOLE pConsole)
{
if (m_pConsole) {
m_pConsole->Release();
}
m_pConsole = pConsole;
if (m_pConsole) {
m_pConsole->AddRef();
}
}
HRESULT
CHiddenWnd::ReloadLocation(CFolder * pFolder,CComponentDataImpl * pCDI)
{
if (m_hWnd) {
::PostMessage(m_hWnd,SCEM_RELOAD_LOCATION, (WPARAM)pFolder, (LPARAM)pCDI);
}
return S_OK;
}
HRESULT
CHiddenWnd::SetProfileDescription(CString *strFile, CString *strDescription)
{
LPTSTR szFile = NULL;
LPTSTR szDescription = NULL;
if (!strFile->IsEmpty()) {
szFile = (LPTSTR)LocalAlloc(LPTR,(strFile->GetLength()+1)*sizeof(TCHAR));
if (!szFile) {
return E_OUTOFMEMORY;
}
}
if (!strDescription->IsEmpty()) {
szDescription = (LPTSTR)LocalAlloc(LPTR,(strDescription->GetLength()+1)*sizeof(TCHAR));
if (!szDescription) {
LocalFree(szFile);
return E_OUTOFMEMORY;
}
}
if (m_hWnd) {
::PostMessage(m_hWnd,SCEM_RELOAD_LOCATION, (WPARAM)szFile, (LPARAM)szDescription);
}
return S_OK;
}
void
CHiddenWnd::OnLockAnalysisPane(WPARAM uParam, LPARAM lParam)
{
try {
m_pCDI->LockAnalysisPane((BOOL)uParam,(BOOL)lParam);
} catch (...) {
ASSERT(FALSE);
}
return VOID_RET;
}
HRESULT
CHiddenWnd::LockAnalysisPane(BOOL bLock, BOOL fRemoveAnalDlg)
{
if (m_hWnd) {
::PostMessage(m_hWnd,SCEM_LOCK_ANAL_PANE, (WPARAM)bLock, (LPARAM)fRemoveAnalDlg);
}
return S_OK;
}
void
CHiddenWnd::OnCloseAnalysisPane(WPARAM uParam, LPARAM lParam)
{
try {
m_pCDI->CloseAnalysisPane();
} catch (...) {
ASSERT(FALSE);
}
return VOID_RET;
}
void
CHiddenWnd::CloseAnalysisPane()
{
if (m_hWnd) {
::PostMessage(m_hWnd,SCEM_CLOSE_ANAL_PANE, NULL, NULL);
}
}
void
CHiddenWnd::OnSelectScopeItem(WPARAM uParam, LPARAM lParam)
{
try {
m_pCDI->GetConsole()->SelectScopeItem(uParam);
} catch (...) {
ASSERT(FALSE);
}
return VOID_RET;
}
void
CHiddenWnd::SelectScopeItem(HSCOPEITEM ID)
{
if (m_hWnd) {
::PostMessage(m_hWnd,SCEM_SELECT_SCOPE_ITEM, (WPARAM) ID, NULL);
}
}