// 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::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); }