windows-nt/Source/XPSP1/NT/com/ole32/cs/admin/ui/events.cpp
2020-09-26 16:20:57 +08:00

197 lines
5.5 KiB
C++

// This is a part of the Microsoft Management Console.
// Copyright (C) 1995-1996 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Management Console and related
// electronic documentation provided with the interfaces.
#include "precomp.hxx"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Event handlers for IFrame::Notify
HRESULT CSnapin::OnFolder(long cookie, long arg, long param)
{
ASSERT(FALSE);
return S_OK;
}
HRESULT CSnapin::OnShow(long cookie, long arg, long param)
{
HRESULT hr = S_OK;
// Note - arg is TRUE when it is time to enumerate
if (arg == TRUE)
{
// Show the headers for this nodetype
ASSERT(m_pComponentData != NULL);
hr = m_pComponentData->InitializeClassAdmin();
if (SUCCEEDED(hr))
{
m_pResult->SetViewMode(m_lViewMode);
InitializeHeaders(cookie);
InitializeBitmaps(cookie);
Enumerate(cookie, param);
}
}
else
{
m_pResult->GetViewMode(&m_lViewMode);
}
return hr;
}
HRESULT CSnapin::OnActivate(long cookie, long arg, long param)
{
return S_OK;
}
HRESULT CSnapin::OnResultItemClkOrDblClk(long cookie, BOOL fDblClick)
{
return S_FALSE;
}
HRESULT CSnapin::OnMinimize(long cookie, long arg, long param)
{
return S_OK;
}
HRESULT CSnapin::OnSelect(DATA_OBJECT_TYPES type, long cookie, long arg, long param)
{
if (m_pConsoleVerb)
{
// If it's in the result pane then "properties" should be the
// default action. Otherwise "open" should be the default action.
if (type == CCT_RESULT)
m_pConsoleVerb->SetDefaultVerb(MMC_VERB_PROPERTIES);
else
m_pConsoleVerb->SetDefaultVerb(MMC_VERB_OPEN);
// Set the default verb to open
// Enable the properties verb.
m_pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, ENABLED, TRUE);
}
return S_OK;
}
HRESULT CSnapin::OnPropertyChange(long param) // param is the cookie of the item that changed
{
HRESULT hr = S_OK;
RESULTDATAITEM rd;
memset(&rd, 0, sizeof(rd));
rd.mask = RDI_IMAGE;
rd.itemID = m_pComponentData->m_AppData[param].itemID;
rd.nImage = m_pComponentData->m_AppData[param].GetImageIndex(m_pComponentData);
m_pResult->SetItem(&rd);
m_pResult->Sort(0, 0, -1);
return hr;
}
HRESULT CSnapin::OnUpdateView(LPDATAOBJECT lpDataObject)
{
return S_OK;
}
void CSnapin::Enumerate(long cookie, HSCOPEITEM pParent)
{
EnumerateResultPane(cookie);
}
void CSnapin::EnumerateResultPane(long cookie)
{
// put up an hourglass (this could take a while)
CHourglass hourglass;
ASSERT(m_pResult != NULL); // make sure we QI'ed for the interface
ASSERT(m_pComponentData != NULL);
ASSERT(m_pComponentData->m_pIClassAdmin != NULL);
RESULTDATAITEM resultItem;
memset(&resultItem, 0, sizeof(RESULTDATAITEM));
// Right now we only have one folder and it only
// contains a list of application packages so this is really simple.
if (m_pComponentData->m_AppData.begin() == m_pComponentData->m_AppData.end()) // test to see if the data has been initialized
{
IClassAdmin * pICA = m_pComponentData->m_pIClassAdmin;
m_pIClassAdmin = pICA;
CSPLATFORM csPlatform;
memset(&csPlatform, 0, sizeof(CSPLATFORM));
IEnumPackage * pIPE = NULL;
HRESULT hr = pICA->EnumPackages(
NULL,
NULL,
NULL,
NULL,
NULL,
&pIPE);
if (SUCCEEDED(hr))
{
hr = pIPE->Reset();
while (SUCCEEDED(hr))
{
ULONG nceltFetched;
PACKAGEDETAIL * pd = new PACKAGEDETAIL;
PACKAGEDISPINFO * pi = new PACKAGEDISPINFO;
hr = pIPE->Next(1, pi, &nceltFetched);
if (nceltFetched)
{
pICA->GetPackageDetails(pi->pszPackageName, pd);
APP_DATA data;
data.pDetails = pd;
data.InitializeExtraInfo();
m_pComponentData->m_AppData[++m_pComponentData->m_lLastAllocated] = data;
m_pComponentData->m_ScriptIndex[data.pDetails->pInstallInfo->pszScriptPath] = m_pComponentData->m_lLastAllocated;
}
else
{
delete pd;
break;
}
if (pi)
{
delete pi;
}
}
SAFE_RELEASE(pIPE);
}
if (SUCCEEDED(hr))
{
hr = m_pComponentData->PopulateExtensions();
if (SUCCEEDED(hr))
{
hr = m_pComponentData->PopulateUpgradeLists();
}
}
}
std::map<long, APP_DATA>::iterator i = m_pComponentData->m_AppData.begin();
while (i != m_pComponentData->m_AppData.end())
{
resultItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
resultItem.str = MMC_CALLBACK;
resultItem.nImage = i->second.GetImageIndex(m_pComponentData);
resultItem.lParam = i->first;
m_pResult->InsertItem(&resultItem);
i->second.itemID = resultItem.itemID;
i++;
}
m_pResult->Sort(0, 0, -1);
}