2585 lines
89 KiB
C++
2585 lines
89 KiB
C++
//+--------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1994 - 1998.
|
|
//
|
|
// File: result.cpp
|
|
//
|
|
// Contents: implementation of the result pane
|
|
//
|
|
// Classes: CResultPane
|
|
//
|
|
// History: 03-14-1998 stevebl Created
|
|
// 05-20-1998 RahulTh Added drag-n-drop support for adding
|
|
// packages
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include "precomp.hxx"
|
|
|
|
#include <atlimpl.cpp>
|
|
#include <wbemcli.h>
|
|
#include "rsoputil.h"
|
|
#include <list>
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
long CResultPane::lDataObjectRefCount = 0;
|
|
|
|
// Internal private format
|
|
const wchar_t* SNAPIN_INTERNAL = L"APPMGR_INTERNAL";
|
|
|
|
#define ARRAYLEN(x) (sizeof(x) / sizeof((x)[0]))
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: ExtractInternalFormat
|
|
//
|
|
// Synopsis: Returns a pointer to our private object format given an
|
|
// LPDATAOBJECT
|
|
//
|
|
// Arguments: [lpDataObject] - pointer to a DATAOBJECT, generally from a
|
|
// MMC call.
|
|
//
|
|
// Returns: A pointer to INTERNAL, our internal object structure.
|
|
// NULL - if the object doesn't contain one of our objects
|
|
// (wasn't created by us)
|
|
//
|
|
// History: 3-13-1998 stevebl Commented
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
INTERNAL* ExtractInternalFormat(LPDATAOBJECT lpDataObject)
|
|
{
|
|
INTERNAL* internal = NULL;
|
|
|
|
STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL };
|
|
FORMATETC formatetc = { (CLIPFORMAT)CDataObject::m_cfInternal, NULL,
|
|
DVASPECT_CONTENT, -1, TYMED_HGLOBAL
|
|
};
|
|
|
|
if (!lpDataObject)
|
|
return NULL;
|
|
|
|
|
|
// Allocate memory for the stream
|
|
stgmedium.hGlobal = GlobalAlloc(GMEM_SHARE, sizeof(INTERNAL));
|
|
|
|
// Attempt to get data from the object
|
|
do
|
|
{
|
|
if (stgmedium.hGlobal == NULL)
|
|
break;
|
|
|
|
if (FAILED(lpDataObject->GetDataHere(&formatetc, &stgmedium)))
|
|
break;
|
|
|
|
internal = reinterpret_cast<INTERNAL*>(stgmedium.hGlobal);
|
|
|
|
if (internal == NULL)
|
|
break;
|
|
|
|
} while (FALSE);
|
|
|
|
return internal;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CResultPane's IComponent implementation
|
|
|
|
STDMETHODIMP CResultPane::GetResultViewType(MMC_COOKIE cookie, BSTR* ppViewType, LONG * pViewOptions)
|
|
{
|
|
// Use default view
|
|
return S_FALSE;
|
|
}
|
|
|
|
STDMETHODIMP CResultPane::Initialize(LPCONSOLE lpConsole)
|
|
{
|
|
ASSERT(lpConsole != NULL);
|
|
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
|
|
// Save the IConsole pointer
|
|
m_pConsole = lpConsole;
|
|
m_pConsole->AddRef();
|
|
|
|
m_szFolderTitle.LoadString(IDS_FOLDER_TITLE);
|
|
|
|
// QI for a IHeaderCtrl
|
|
HRESULT 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));
|
|
|
|
m_pConsole->QueryInterface(IID_IDisplayHelp,
|
|
reinterpret_cast<void**>(&m_pDisplayHelp));
|
|
|
|
hr = m_pConsole->QueryConsoleVerb(&m_pConsoleVerb);
|
|
ASSERT(hr == S_OK);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CResultPane::Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
MMC_COOKIE cookie;
|
|
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
|
|
|
|
if (event == MMCN_PROPERTY_CHANGE)
|
|
{
|
|
hr = OnPropertyChange(param);
|
|
}
|
|
else if (event == MMCN_VIEW_CHANGE)
|
|
{
|
|
hr = OnUpdateView(lpDataObject);
|
|
}
|
|
else
|
|
{
|
|
//kluge for drag-n-drop through explorer. To enable drag-n-drop
|
|
//through explorer, the paste verb is always enabled. since
|
|
//it is also hidden (see OnSelect), the user cannot use the
|
|
//standard toolbar to paste. However, if the user uses CTRL-V
|
|
//to paste when nothing has been cut, Notify gets invoked with
|
|
//a negative lpDataObject value, therefore, in that particular
|
|
//case, we simply return with an S_OK -RahulTh 5/20/1998
|
|
if ((LONG_PTR)lpDataObject <= 0)
|
|
return S_OK;
|
|
|
|
INTERNAL* pInternal = ExtractInternalFormat(lpDataObject);
|
|
|
|
if (pInternal == NULL)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
else
|
|
{
|
|
cookie = pInternal->m_cookie;
|
|
}
|
|
switch(event)
|
|
{
|
|
case MMCN_COLUMNS_CHANGED:
|
|
break;
|
|
case MMCN_ACTIVATE:
|
|
hr = OnActivate(cookie, arg, param);
|
|
break;
|
|
|
|
case MMCN_CLICK:
|
|
hr = OnResultItemClkOrDblClk(cookie, FALSE);
|
|
break;
|
|
|
|
case MMCN_DBLCLICK:
|
|
if (pInternal->m_type == CCT_RESULT)
|
|
hr = OnResultItemClkOrDblClk(cookie, TRUE);
|
|
else
|
|
hr = S_FALSE;
|
|
break;
|
|
|
|
case MMCN_ADD_IMAGES:
|
|
hr = OnAddImages(cookie, arg, param);
|
|
break;
|
|
|
|
case MMCN_SHOW:
|
|
hr = OnShow(cookie, arg, param);
|
|
break;
|
|
|
|
case MMCN_MINIMIZED:
|
|
hr = OnMinimize(cookie, arg, param);
|
|
break;
|
|
|
|
case MMCN_SELECT:
|
|
hr = OnSelect(pInternal->m_type, cookie, arg, param);
|
|
break;
|
|
|
|
case MMCN_COLUMN_CLICK:
|
|
// retain column number and sort option flags so we can pass
|
|
// them in to sort in the event we need to trigger a resort of
|
|
// the result pane
|
|
m_nSortColumn = arg;
|
|
m_dwSortOptions = param;
|
|
break;
|
|
|
|
case MMCN_DELETE:
|
|
hr = Command(IDM_DEL_APP, lpDataObject);
|
|
break;
|
|
|
|
case MMCN_REFRESH:
|
|
hr = Command(IDM_REFRESH, lpDataObject);
|
|
break;
|
|
|
|
case MMCN_QUERY_PASTE:
|
|
//always return S_OK here because there is no way we can check
|
|
//for the validity of the dragged objects here, so we simply
|
|
//give the green signal and wait for the MMCN_PASTE notification
|
|
//to see if the objects being dragged are valid at all.
|
|
hr = S_OK;
|
|
break;
|
|
|
|
case MMCN_PASTE:
|
|
if (arg > 0) //better be safe than sorry
|
|
OnFileDrop ((LPDATAOBJECT)arg);
|
|
hr = S_OK;
|
|
break;
|
|
|
|
case MMCN_CONTEXTHELP:
|
|
if (m_pDisplayHelp)
|
|
{
|
|
if (m_pScopePane->m_fRSOP)
|
|
{
|
|
SHELLEXECUTEINFO ShellInfo;
|
|
WCHAR pszHelpFilePath[ MAX_PATH ];
|
|
|
|
memset( &ShellInfo, 0, sizeof( ShellInfo ) );
|
|
|
|
ExpandEnvironmentStringsW (
|
|
L"%SystemRoot%\\Help\\RSOPsnp.chm",
|
|
pszHelpFilePath, MAX_PATH);
|
|
|
|
ShellInfo.cbSize = sizeof( ShellInfo );
|
|
ShellInfo.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_DOENVSUBST;
|
|
ShellInfo.lpVerb = L"open";
|
|
ShellInfo.lpFile = L"%SystemRoot%\\hh.exe";
|
|
ShellInfo.lpParameters = pszHelpFilePath;
|
|
ShellInfo.nShow = SW_SHOWNORMAL;
|
|
|
|
(void) ShellExecuteEx( &ShellInfo );
|
|
}
|
|
else
|
|
{
|
|
m_pDisplayHelp->ShowTopic (L"SPConcepts.chm::/ADE.htm");
|
|
}
|
|
}
|
|
break;
|
|
|
|
// Note - Future expansion of notify types possible
|
|
default:
|
|
hr = E_UNEXPECTED;
|
|
break;
|
|
}
|
|
|
|
FREE_INTERNAL(pInternal);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CResultPane::Destroy(MMC_COOKIE cookie)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
DebugMsg((DM_VERBOSE, TEXT("CResultPane::Destroy this=%08x cookie=%u"), this, cookie));
|
|
|
|
// Release the interfaces that we QI'ed
|
|
if (m_pConsole != NULL)
|
|
{
|
|
// Tell the console to release the header control interface
|
|
m_pConsole->SetHeader(NULL);
|
|
SAFE_RELEASE(m_pHeader);
|
|
|
|
SAFE_RELEASE(m_pResult);
|
|
SAFE_RELEASE(m_pConsoleVerb);
|
|
SAFE_RELEASE(m_pDisplayHelp);
|
|
SAFE_RELEASE(m_pToolbar);
|
|
SAFE_RELEASE(m_pControlbar);
|
|
|
|
// Release the IConsole interface last
|
|
SAFE_RELEASE(m_pConsole);
|
|
if (m_pScopePane)
|
|
{
|
|
m_pScopePane->RemoveResultPane(this);
|
|
((IComponentData*)m_pScopePane)->Release(); // QI'ed in IComponentDataImpl::CreateComponent
|
|
m_pScopePane = NULL;
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CResultPane::QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type,
|
|
LPDATAOBJECT* ppDataObject)
|
|
{
|
|
// Delegate it to the IComponentData
|
|
ASSERT(m_pScopePane != NULL);
|
|
return m_pScopePane->QueryDataObject(cookie, type, ppDataObject);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CResultPane's implementation specific members
|
|
|
|
DEBUG_DECLARE_INSTANCE_COUNTER(CResultPane);
|
|
|
|
CResultPane::CResultPane()
|
|
{
|
|
#if DBG
|
|
dbg_cRef = 0;
|
|
#endif
|
|
DEBUG_INCREMENT_INSTANCE_COUNTER(CResultPane);
|
|
DebugMsg((DM_VERBOSE, TEXT("CResultPane::CResultPane this=%08x ref=%u"), this, dbg_cRef));
|
|
CResultPane::lDataObjectRefCount = 0;
|
|
m_pDisplayHelp = NULL;
|
|
m_lViewMode = LVS_REPORT;
|
|
BOOL _fVisible = FALSE;
|
|
m_nSortColumn = 0;
|
|
m_dwSortOptions = 0;
|
|
Construct();
|
|
}
|
|
|
|
CResultPane::~CResultPane()
|
|
{
|
|
#if DBG
|
|
ASSERT(dbg_cRef == 0);
|
|
#endif
|
|
DebugMsg((DM_VERBOSE, TEXT("CResultPane::~CResultPane this=%08x ref=%u"), this, dbg_cRef));
|
|
|
|
DEBUG_DECREMENT_INSTANCE_COUNTER(CResultPane);
|
|
|
|
// Make sure the interfaces have been released
|
|
ASSERT(m_pConsole == NULL);
|
|
ASSERT(m_pHeader == NULL);
|
|
|
|
Construct();
|
|
|
|
ASSERT(CResultPane::lDataObjectRefCount == 0);
|
|
}
|
|
|
|
void CResultPane::Construct()
|
|
{
|
|
#if DBG
|
|
dbg_cRef = 0;
|
|
#endif
|
|
|
|
m_pConsole = NULL;
|
|
m_pHeader = NULL;
|
|
|
|
m_pResult = NULL;
|
|
m_pScopePane = NULL;
|
|
m_pControlbar = NULL;
|
|
m_pToolbar = NULL;
|
|
}
|
|
|
|
CString szExtension;
|
|
CString szFilter;
|
|
|
|
HRESULT CResultPane::InitializeHeaders(MMC_COOKIE cookie)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
HRESULT hr = S_OK;
|
|
|
|
ASSERT(m_pHeader);
|
|
|
|
CString sz;
|
|
sz.LoadString(IDS_NAME);
|
|
if (m_pScopePane->m_fRSOP)
|
|
{
|
|
// in RSOP mode the name follows the name for the view
|
|
|
|
}
|
|
int n = 0;
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, 150); // name
|
|
sz.LoadString(IDS_VERSION);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, 50); // version
|
|
sz.LoadString(IDS_STATE);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, 100); // state
|
|
sz.LoadString(IDS_AUTOINST);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN /*75*/); // auto-inst
|
|
sz.LoadString(IDS_SOURCE);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, 200); // source
|
|
sz.LoadString(IDS_MODS);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN); // mods
|
|
sz.LoadString(IDS_LOC);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN); // loc
|
|
sz.LoadString(IDS_OOSUNINST);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN);
|
|
sz.LoadString(IDS_SHOWARP);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN);
|
|
sz.LoadString(IDS_UITYPE);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN);
|
|
sz.LoadString(IDS_IGNORELOC);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN);
|
|
sz.LoadString(IDS_REMPREV);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN);
|
|
sz.LoadString(IDS_PRODCODE);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN);
|
|
sz.LoadString(IDS_STAGE);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN); // stage
|
|
sz.LoadString(IDS_RELATION);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN); // Upgrading
|
|
sz.LoadString(IDS_UPGRADEDBY);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN);
|
|
sz.LoadString(IDS_SCRIPT);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN);
|
|
sz.LoadString(IDS_MACH);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN);
|
|
sz.LoadString(IDS_X86ONIA64);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN);
|
|
sz.LoadString(IDS_FULLINSTALL);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN);
|
|
if (m_pScopePane->m_fRSOP)
|
|
{
|
|
sz.LoadString(IDS_ORIGIN);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, 150); // origin
|
|
sz.LoadString(IDS_SOM);
|
|
m_pHeader->InsertColumn(n++, sz, LVCFMT_LEFT, HIDE_COLUMN); // origin
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// IExtendContextMenu Implementation
|
|
|
|
STDMETHODIMP CResultPane::AddMenuItems(LPDATAOBJECT pDataObject,
|
|
LPCONTEXTMENUCALLBACK pContextMenuCallback, LONG * pInsertionAllowed)
|
|
{
|
|
return m_pScopePane->
|
|
AddMenuItems(pDataObject, pContextMenuCallback, pInsertionAllowed);
|
|
}
|
|
|
|
STDMETHODIMP CResultPane::Command(long nCommandID, LPDATAOBJECT pDataObject)
|
|
{
|
|
if (m_pScopePane)
|
|
return m_pScopePane->
|
|
Command(nCommandID, pDataObject);
|
|
else
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CResultPane::OnAddImages(MMC_COOKIE cookie, LPARAM arg, LPARAM param)
|
|
{
|
|
if (arg == 0)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
// add the images for the scope tree
|
|
CBitmap bmp16x16;
|
|
CBitmap bmp32x32;
|
|
LPIMAGELIST lpScopeImage = (LPIMAGELIST)arg;
|
|
|
|
// Load the bitmaps from the dll
|
|
bmp16x16.LoadBitmap(IDB_16x16);
|
|
bmp32x32.LoadBitmap(IDB_32x32);
|
|
|
|
// Set the images
|
|
lpScopeImage->ImageListSetStrip(reinterpret_cast<LONG_PTR *>(static_cast<HBITMAP>(bmp16x16)),
|
|
reinterpret_cast<LONG_PTR *>(static_cast<HBITMAP>(bmp32x32)),
|
|
0, RGB(255,0,255));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// IExtendPropertySheet Implementation
|
|
|
|
// Result item property pages:
|
|
STDMETHODIMP CResultPane::CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider,
|
|
LONG_PTR handle,
|
|
LPDATAOBJECT lpIDataObject)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
|
|
INTERNAL* pInternal = ExtractInternalFormat(lpIDataObject);
|
|
if (pInternal && (m_pScopePane->m_fRSOP || m_pScopePane->m_pIClassAdmin))
|
|
{
|
|
HRESULT hr = S_OK;
|
|
MMC_COOKIE cookie = pInternal->m_cookie;
|
|
CAppData & data = m_pScopePane->m_AppData[cookie];
|
|
FREE_INTERNAL(pInternal);
|
|
HPROPSHEETPAGE hSecurity = NULL;
|
|
LPSECURITYINFO pSI = NULL;
|
|
|
|
//
|
|
// make sure we have an up-to-date categories list
|
|
//
|
|
m_pScopePane->ClearCategories();
|
|
if (m_pScopePane->m_fRSOP)
|
|
{
|
|
m_pScopePane->GetRSoPCategories();
|
|
}
|
|
else
|
|
{
|
|
hr = CsGetAppCategories(&m_pScopePane->m_CatList);
|
|
if (FAILED(hr))
|
|
{
|
|
// report it
|
|
LogADEEvent(EVENTLOG_ERROR_TYPE, EVENT_ADE_GETCATEGORIES_ERROR, hr, NULL);
|
|
|
|
// Since failure only means the categories list will be
|
|
// empty, we'll proceed as if nothing happened.
|
|
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
|
|
//
|
|
// prepare the security property page
|
|
//
|
|
|
|
// check to make sure that we have access to this object
|
|
if (m_pScopePane->m_fRSOP)
|
|
{
|
|
pSI = new CRSOPSecurityInfo(&data);
|
|
}
|
|
else
|
|
{
|
|
CString szPath;
|
|
hr = m_pScopePane->GetPackageDSPath(szPath, data.m_pDetails->pszPackageName);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = DSCreateISecurityInfoObject(szPath,
|
|
NULL,
|
|
0,
|
|
&pSI,
|
|
NULL,
|
|
NULL,
|
|
0);
|
|
}
|
|
}
|
|
if (FAILED(hr))
|
|
{
|
|
// we don't have access to this object (probably due to permissions)
|
|
DebugMsg((DM_WARNING, TEXT("DSCreateISecurityInfoObject failed with 0x%x"), hr));
|
|
// force a refresh
|
|
hr = Command(IDM_REFRESH, lpIDataObject);
|
|
// DON'T quit just because we couldn't create the security page!
|
|
// return S_FALSE;
|
|
}
|
|
if (pSI)
|
|
{
|
|
hSecurity = CreateSecurityPage(pSI);
|
|
pSI->Release();
|
|
if (hSecurity == NULL)
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
// we have access
|
|
|
|
//
|
|
// Create the Product property page
|
|
//
|
|
data.m_pProduct = new CProduct();
|
|
data.m_pProduct->m_ppThis = &data.m_pProduct;
|
|
data.m_pProduct->m_pData = &data;
|
|
data.m_pProduct->m_cookie = cookie;
|
|
data.m_pProduct->m_hConsoleHandle = handle;
|
|
data.m_pProduct->m_pScopePane = m_pScopePane;
|
|
data.m_pProduct->m_pAppData = &m_pScopePane->m_AppData;
|
|
data.m_pProduct->m_pIGPEInformation = m_pScopePane->m_pIGPEInformation;
|
|
data.m_pProduct->m_fMachine = m_pScopePane->m_fMachine;
|
|
data.m_pProduct->m_fRSOP = m_pScopePane->m_fRSOP;
|
|
// no longer need to marshal, just set it
|
|
if (!m_pScopePane->m_fRSOP)
|
|
{
|
|
data.m_pProduct->m_pIClassAdmin = m_pScopePane->m_pIClassAdmin;
|
|
data.m_pProduct->m_pIClassAdmin->AddRef();
|
|
}
|
|
else
|
|
data.m_pProduct->m_pIClassAdmin = NULL;
|
|
|
|
hr = SetPropPageToDeleteOnClose(&data.m_pProduct->m_psp);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
HPROPSHEETPAGE hProduct = CreateThemedPropertySheetPage(&data.m_pProduct->m_psp);
|
|
if (hProduct == NULL)
|
|
return E_UNEXPECTED;
|
|
lpProvider->AddPage(hProduct);
|
|
}
|
|
|
|
//
|
|
// Create the Depeployment property page
|
|
//
|
|
data.m_pDeploy = new CDeploy();
|
|
data.m_pDeploy->m_ppThis = &data.m_pDeploy;
|
|
data.m_pDeploy->m_pData = &data;
|
|
data.m_pDeploy->m_cookie = cookie;
|
|
data.m_pDeploy->m_hConsoleHandle = handle;
|
|
data.m_pDeploy->m_fMachine = m_pScopePane->m_fMachine;
|
|
data.m_pDeploy->m_fRSOP = m_pScopePane->m_fRSOP;
|
|
data.m_pDeploy->m_pScopePane = m_pScopePane;
|
|
#if 0
|
|
data.m_pDeploy->m_pIGPEInformation = m_pScopePane->m_pIGPEInformation;
|
|
#endif
|
|
|
|
// no longer need to marsahl this interface, just set it
|
|
if (!m_pScopePane->m_fRSOP)
|
|
{
|
|
data.m_pDeploy->m_pIClassAdmin = m_pScopePane->m_pIClassAdmin;
|
|
data.m_pDeploy->m_pIClassAdmin->AddRef();
|
|
}
|
|
else
|
|
data.m_pDeploy->m_pIClassAdmin = NULL;
|
|
|
|
hr = SetPropPageToDeleteOnClose(&data.m_pDeploy->m_psp);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
HPROPSHEETPAGE hDeploy = CreateThemedPropertySheetPage(&data.m_pDeploy->m_psp);
|
|
if (hDeploy == NULL)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
lpProvider->AddPage(hDeploy);
|
|
}
|
|
|
|
if (data.m_pDetails->pInstallInfo->PathType != SetupNamePath)
|
|
{
|
|
//
|
|
// Create the upgrades property page
|
|
//
|
|
data.m_pUpgradeList = new CUpgradeList();
|
|
data.m_pUpgradeList->m_ppThis = &data.m_pUpgradeList;
|
|
data.m_pUpgradeList->m_pData = &data;
|
|
data.m_pUpgradeList->m_cookie = cookie;
|
|
data.m_pUpgradeList->m_hConsoleHandle = handle;
|
|
data.m_pUpgradeList->m_pScopePane = m_pScopePane;
|
|
data.m_pUpgradeList->m_fMachine = m_pScopePane->m_fMachine;
|
|
data.m_pUpgradeList->m_fRSOP = m_pScopePane->m_fRSOP;
|
|
#if 0
|
|
data.m_pUpgradeList->m_pIGPEInformation = m_pScopePane->m_pIGPEInformation;
|
|
#endif
|
|
|
|
// no longer need to marshal this interface, just set it
|
|
if (!m_pScopePane->m_fRSOP)
|
|
{
|
|
data.m_pUpgradeList->m_pIClassAdmin = m_pScopePane->m_pIClassAdmin;
|
|
data.m_pUpgradeList->m_pIClassAdmin->AddRef();
|
|
}
|
|
else
|
|
data.m_pUpgradeList->m_pIClassAdmin = NULL;
|
|
|
|
hr = SetPropPageToDeleteOnClose(&data.m_pUpgradeList->m_psp);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
HPROPSHEETPAGE hUpgradeList = CreateThemedPropertySheetPage(&data.m_pUpgradeList->m_psp);
|
|
if (hUpgradeList == NULL)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
lpProvider->AddPage(hUpgradeList);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Create the Category property page
|
|
//
|
|
if ( ! m_pScopePane->m_fRSOP || ( IDM_ARP == m_pScopePane->m_iViewState ) )
|
|
{
|
|
data.m_pCategory = new CCategory();
|
|
data.m_pCategory->m_ppThis = &data.m_pCategory;
|
|
data.m_pCategory->m_pData = &data;
|
|
data.m_pCategory->m_cookie = cookie;
|
|
data.m_pCategory->m_hConsoleHandle = handle;
|
|
data.m_pCategory->m_pCatList = &m_pScopePane->m_CatList;
|
|
data.m_pCategory->m_fRSOP = m_pScopePane->m_fRSOP;
|
|
|
|
// no longer need to marshal this interface, just set it
|
|
if (!m_pScopePane->m_fRSOP)
|
|
{
|
|
data.m_pCategory->m_pIClassAdmin = m_pScopePane->m_pIClassAdmin;
|
|
data.m_pCategory->m_pIClassAdmin->AddRef();
|
|
}
|
|
else
|
|
data.m_pCategory->m_pIClassAdmin = NULL;
|
|
|
|
hr = SetPropPageToDeleteOnClose(&data.m_pCategory->m_psp);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
HPROPSHEETPAGE hCategory = CreateThemedPropertySheetPage(&data.m_pCategory->m_psp);
|
|
if (hCategory == NULL)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
lpProvider->AddPage(hCategory);
|
|
}
|
|
}
|
|
|
|
if (data.m_pDetails->pInstallInfo->PathType != SetupNamePath)
|
|
{
|
|
//
|
|
// Create the Xforms property page
|
|
//
|
|
data.m_pXforms = new CXforms();
|
|
data.m_pXforms->m_ppThis = &data.m_pXforms;
|
|
data.m_pXforms->m_pData = &data;
|
|
data.m_pXforms->m_cookie = cookie;
|
|
data.m_pXforms->m_hConsoleHandle = handle;
|
|
data.m_pXforms->m_pScopePane = m_pScopePane;
|
|
|
|
// marshal the IClassAdmin interface to the page
|
|
if (!m_pScopePane->m_fRSOP)
|
|
{
|
|
data.m_pXforms->m_pIClassAdmin = m_pScopePane->m_pIClassAdmin;
|
|
data.m_pXforms->m_pIClassAdmin->AddRef();
|
|
}
|
|
else
|
|
data.m_pXforms->m_pIClassAdmin = NULL;
|
|
|
|
hr = SetPropPageToDeleteOnClose(&data.m_pXforms->m_psp);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
HPROPSHEETPAGE hXforms = CreateThemedPropertySheetPage(&data.m_pXforms->m_psp);
|
|
if (hXforms == NULL)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
lpProvider->AddPage(hXforms);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Add the security property page
|
|
//
|
|
if (hSecurity)
|
|
{
|
|
lpProvider->AddPage(hSecurity);
|
|
}
|
|
|
|
if (m_pScopePane->m_fRSOP)
|
|
{
|
|
// add precedence pane
|
|
data.m_pPrecedence = new CPrecedence();
|
|
data.m_pPrecedence->m_ppThis = &data.m_pPrecedence;
|
|
data.m_pPrecedence->m_szRSOPNamespace = m_pScopePane->m_szRSOPNamespace;
|
|
data.m_pPrecedence->m_pData = &data;
|
|
data.m_pPrecedence->m_iViewState = m_pScopePane->m_iViewState;
|
|
hr = SetPropPageToDeleteOnClose(&data.m_pPrecedence->m_psp);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
HPROPSHEETPAGE hPrecedence = CreateThemedPropertySheetPage(&data.m_pPrecedence->m_psp);
|
|
if (hPrecedence == NULL)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
lpProvider->AddPage(hPrecedence);
|
|
}
|
|
|
|
if (m_pScopePane->m_iViewState != IDM_ARP)
|
|
{
|
|
// add Cause pane
|
|
data.m_pCause = new CCause();
|
|
data.m_pCause->m_ppThis = &data.m_pCause;
|
|
data.m_pCause->m_pData = &data;
|
|
data.m_pCause->m_fRemovedView = IDM_REMOVED == m_pScopePane->m_iViewState;
|
|
hr = SetPropPageToDeleteOnClose(&data.m_pCause->m_psp);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
HPROPSHEETPAGE hCause = CreateThemedPropertySheetPage(&data.m_pCause->m_psp);
|
|
if (hCause == NULL)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
lpProvider->AddPage(hCause);
|
|
}
|
|
}
|
|
|
|
// check for failed settings and add the error pane if necessary
|
|
if (data.m_nStatus == 3)
|
|
{
|
|
data.m_pErrorInfo = new CErrorInfo();
|
|
data.m_pErrorInfo->m_ppThis = &data.m_pErrorInfo;
|
|
data.m_pErrorInfo->m_pData = &data;
|
|
hr = SetPropPageToDeleteOnClose(&data.m_pErrorInfo->m_psp);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
HPROPSHEETPAGE hErrorInfo = CreateThemedPropertySheetPage(&data.m_pErrorInfo->m_psp);
|
|
if (hErrorInfo == NULL)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
lpProvider->AddPage(hErrorInfo);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (m_pScopePane->m_ToolDefaults.fShowPkgDetails)
|
|
{
|
|
//
|
|
// Create the Package Details page (debug only)
|
|
//
|
|
data.m_pPkgDetails = new CPackageDetails();
|
|
data.m_pPkgDetails->m_ppThis = &data.m_pPkgDetails;
|
|
data.m_pPkgDetails->m_hConsoleHandle = handle;
|
|
data.m_pPkgDetails->m_pData = &data;
|
|
hr = SetPropPageToDeleteOnClose(&data.m_pPkgDetails->m_psp);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
HPROPSHEETPAGE hDetails = CreateThemedPropertySheetPage(&data.m_pPkgDetails->m_psp);
|
|
|
|
if (hDetails == NULL)
|
|
return E_UNEXPECTED;
|
|
lpProvider->AddPage(hDetails);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
return S_FALSE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
// Result items property pages:
|
|
STDMETHODIMP CResultPane::QueryPagesFor(LPDATAOBJECT lpDataObject)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
// Look at the data object and see if it an item that we want to have a property sheet
|
|
INTERNAL* pInternal = ExtractInternalFormat(lpDataObject);
|
|
if (pInternal)
|
|
{
|
|
if (CCT_RESULT == pInternal->m_type)
|
|
{
|
|
FREE_INTERNAL(pInternal);
|
|
return S_OK;
|
|
}
|
|
|
|
FREE_INTERNAL(pInternal);
|
|
}
|
|
return S_FALSE;
|
|
}
|
|
|
|
STDMETHODIMP CResultPane::CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB)
|
|
{
|
|
if (lpDataObjectA == NULL || lpDataObjectB == NULL)
|
|
return E_POINTER;
|
|
|
|
// Make sure both data object are mine
|
|
INTERNAL* pA;
|
|
INTERNAL* pB;
|
|
HRESULT hr = S_FALSE;
|
|
|
|
pA = ExtractInternalFormat(lpDataObjectA);
|
|
pB = ExtractInternalFormat(lpDataObjectB);
|
|
|
|
if (pA != NULL && pB != NULL)
|
|
hr = ((pA->m_type == pB->m_type) && (pA->m_cookie == pB->m_cookie)) ? S_OK : S_FALSE;
|
|
|
|
FREE_INTERNAL(pA);
|
|
FREE_INTERNAL(pB);
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CResultPane::SetControlbar(LPCONTROLBAR pControlbar)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if (m_pToolbar)
|
|
{
|
|
SAFE_RELEASE(m_pToolbar);
|
|
}
|
|
|
|
if (m_pControlbar)
|
|
{
|
|
SAFE_RELEASE(m_pControlbar);
|
|
}
|
|
|
|
if (pControlbar && m_pScopePane->m_fRSOP)
|
|
{
|
|
m_pControlbar = pControlbar;
|
|
m_pControlbar->AddRef();
|
|
|
|
hr = m_pControlbar->Create(TOOLBAR,
|
|
dynamic_cast<IExtendControlbar *>(this),
|
|
reinterpret_cast<IUnknown **>(&m_pToolbar));
|
|
DebugReportFailure(hr, (DM_WARNING, TEXT("SetControlBar: Create failed with 0x%x"), hr));
|
|
if (FAILED(hr))
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
m_pToolbar->AddRef();
|
|
|
|
// add the bitmap
|
|
|
|
CBitmap bmp;
|
|
if (!bmp.LoadBitmap(IDB_TOOLBAR1))
|
|
{
|
|
DebugReportFailure(hr, (DM_WARNING, TEXT("SetControlBar: LoadBitmap failed with 0x%x"), GetLastError()));
|
|
return E_FAIL;
|
|
}
|
|
|
|
hr = m_pToolbar->AddBitmap(3,
|
|
bmp,
|
|
16,
|
|
16,
|
|
RGB(255, 0, 255));
|
|
|
|
DebugReportFailure(hr, (DM_WARNING, TEXT("SetControlBar: AddBitmap failed with 0x%x"), hr));
|
|
if (FAILED(hr))
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
// add the buttons depending upon our state
|
|
|
|
CString szText;
|
|
CString szTooltipText;
|
|
int i = 0;
|
|
|
|
MMCBUTTON stButton;
|
|
stButton.nBitmap = 0;
|
|
stButton.idCommand = IDM_WINNER;
|
|
stButton.fsState = TBSTATE_ENABLED | ( m_pScopePane->m_iViewState == IDM_WINNER ? TBSTATE_PRESSED : 0 );
|
|
stButton.fsType = BTNS_GROUP;
|
|
szText.LoadString(IDS_WIN_TEXT);
|
|
szTooltipText.LoadString(IDS_WIN_TOOLTEXT);
|
|
stButton.lpButtonText = (LPOLESTR)((LPCWSTR) szText);
|
|
stButton.lpTooltipText = (LPOLESTR)((LPCWSTR) szTooltipText);
|
|
hr = m_pToolbar->InsertButton(i++, &stButton);
|
|
DebugReportFailure(hr, (DM_WARNING, TEXT("SetControlBar: InsertButton failed with 0x%x"), hr));
|
|
|
|
if ((m_pScopePane->m_dwRSOPFlags & RSOP_INFO_FLAG_DIAGNOSTIC_MODE) == RSOP_INFO_FLAG_DIAGNOSTIC_MODE)
|
|
{
|
|
// removed packages only apply in diagnostic mode
|
|
stButton.nBitmap = 1;
|
|
stButton.idCommand = IDM_REMOVED;
|
|
stButton.fsState = TBSTATE_ENABLED | ( m_pScopePane->m_iViewState == IDM_REMOVED ? TBSTATE_PRESSED : 0 );;
|
|
szText.LoadString(IDS_REM_TEXT);
|
|
szTooltipText.LoadString(IDS_REM_TOOLTEXT);
|
|
stButton.lpButtonText = (LPOLESTR)((LPCWSTR) szText);
|
|
stButton.lpTooltipText = (LPOLESTR)((LPCWSTR) szTooltipText);
|
|
hr = m_pToolbar->InsertButton(i++, &stButton);
|
|
DebugReportFailure(hr, (DM_WARNING, TEXT("SetControlBar: InsertButton failed with 0x%x"), hr));
|
|
}
|
|
|
|
if (!m_pScopePane->m_fMachine)
|
|
{
|
|
// ARP packages only apply to users
|
|
stButton.nBitmap = 2;
|
|
stButton.idCommand = IDM_ARP;
|
|
stButton.fsState = TBSTATE_ENABLED | ( m_pScopePane->m_iViewState == IDM_ARP ? TBSTATE_PRESSED : 0 );;
|
|
szText.LoadString(IDS_ARP_TEXT);
|
|
szTooltipText.LoadString(IDS_ARP_TOOLTEXT);
|
|
stButton.lpButtonText = (LPOLESTR)((LPCWSTR) szText);
|
|
stButton.lpTooltipText = (LPOLESTR)((LPCWSTR) szTooltipText);
|
|
hr = m_pToolbar->InsertButton(i++, &stButton);
|
|
DebugReportFailure(hr, (DM_WARNING, TEXT("SetControlBar: InsertButton failed with 0x%x"), hr));
|
|
}
|
|
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CResultPane::ControlbarNotify(MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (m_pControlbar)
|
|
{
|
|
if (event == MMCN_SELECT)
|
|
{
|
|
if (HIWORD(arg)) // is it selected or not
|
|
{
|
|
hr = m_pControlbar->Attach(TOOLBAR,
|
|
m_pToolbar);
|
|
DebugReportFailure(hr, (DM_WARNING, TEXT("ControlBarNotify: Attach failed with 0x%x"), hr));
|
|
}
|
|
else if ( (BOOL) LOWORD(arg) )
|
|
{
|
|
hr = m_pControlbar->Detach(m_pToolbar);
|
|
DebugReportFailure(hr, (DM_WARNING, TEXT("ControlBarNotify: Detach failed with 0x%x"), hr));
|
|
}
|
|
}
|
|
else if (event == MMCN_BTN_CLICK)
|
|
{
|
|
hr = Command(param, reinterpret_cast<IDataObject *>(arg));
|
|
DebugReportFailure(hr, (DM_WARNING, TEXT("ControlBarNotify: Command failed with 0x%x"), hr));
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CResultPane::Compare(LPARAM lUserParam, MMC_COOKIE cookieA, MMC_COOKIE cookieB, int* pnResult)
|
|
{
|
|
if (pnResult == NULL)
|
|
{
|
|
ASSERT(FALSE);
|
|
return E_POINTER;
|
|
}
|
|
|
|
// check col range
|
|
int nCol = *pnResult;
|
|
|
|
*pnResult = 0;
|
|
|
|
CAppData & dataA = m_pScopePane->m_AppData[cookieA];
|
|
CAppData & dataB = m_pScopePane->m_AppData[cookieB];
|
|
// compare the two based on column and the cookies
|
|
CString szA, szB;
|
|
|
|
switch (nCol)
|
|
{
|
|
case 0:
|
|
szA = dataA.m_pDetails->pszPackageName;
|
|
szB = dataB.m_pDetails->pszPackageName;
|
|
break;
|
|
case 1:
|
|
dataA.GetSzVersion(szA);
|
|
dataB.GetSzVersion(szB);
|
|
break;
|
|
case 2:
|
|
dataA.GetSzDeployment(szA);
|
|
dataB.GetSzDeployment(szB);
|
|
break;
|
|
case 3:
|
|
dataA.GetSzAutoInstall(szA);
|
|
dataB.GetSzAutoInstall(szB);
|
|
break;
|
|
case 4:
|
|
dataA.GetSzSource(szA);
|
|
dataB.GetSzSource(szB);
|
|
break;
|
|
case 5:
|
|
dataA.GetSzMods(szA);
|
|
dataB.GetSzMods(szB);
|
|
break;
|
|
case 6:
|
|
dataA.GetSzLocale(szA);
|
|
dataB.GetSzLocale(szB);
|
|
break;
|
|
case 7:
|
|
dataA.GetSzOOSUninstall(szA);
|
|
dataB.GetSzOOSUninstall(szB);
|
|
break;
|
|
case 8:
|
|
dataA.GetSzShowARP(szA);
|
|
dataB.GetSzShowARP(szB);
|
|
break;
|
|
case 9:
|
|
dataA.GetSzUIType(szA);
|
|
dataB.GetSzUIType(szB);
|
|
break;
|
|
case 10:
|
|
dataA.GetSzIgnoreLoc(szA);
|
|
dataB.GetSzIgnoreLoc(szB);
|
|
break;
|
|
case 11:
|
|
dataA.GetSzRemovePrev(szA);
|
|
dataB.GetSzRemovePrev(szB);
|
|
break;
|
|
case 12:
|
|
dataA.GetSzProductCode(szA);
|
|
dataB.GetSzProductCode(szB);
|
|
break;
|
|
case 13:
|
|
dataA.GetSzStage(szA);
|
|
dataB.GetSzStage(szB);
|
|
break;
|
|
case 14:
|
|
dataA.GetSzUpgrades(szA, m_pScopePane);
|
|
dataB.GetSzUpgrades(szB, m_pScopePane);
|
|
break;
|
|
case 15:
|
|
dataA.GetSzUpgradedBy(szA, m_pScopePane);
|
|
dataB.GetSzUpgradedBy(szB, m_pScopePane);
|
|
break;
|
|
case 16:
|
|
szA = dataA.m_pDetails->pInstallInfo->pszScriptPath;
|
|
szB = dataB.m_pDetails->pInstallInfo->pszScriptPath;
|
|
break;
|
|
case 17:
|
|
dataA.GetSzPlatform(szA);
|
|
dataB.GetSzPlatform(szB);
|
|
break;
|
|
case 18:
|
|
dataA.GetSzX86onIA64(szA);
|
|
dataB.GetSzX86onIA64(szB);
|
|
break;
|
|
case 19:
|
|
dataA.GetSzFullInstall(szA);
|
|
dataB.GetSzFullInstall(szB);
|
|
break;
|
|
case 20: // only valid in rsop
|
|
dataA.GetSzOrigin(szA);
|
|
dataB.GetSzOrigin(szB);
|
|
break;
|
|
case 21: // only valid in rsop
|
|
dataA.GetSzSOM(szA);
|
|
dataB.GetSzSOM(szB);
|
|
break;
|
|
}
|
|
*pnResult = szA.CompareNoCase(szB);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CResultPane::GetDisplayInfo(LPRESULTDATAITEM pResult)
|
|
{
|
|
static CString sz;
|
|
ASSERT(pResult != NULL);
|
|
if (pResult)
|
|
{
|
|
if (pResult->lParam == -1)
|
|
{
|
|
switch (pResult->nCol)
|
|
{
|
|
case 0:
|
|
pResult->str = (unsigned short *)((LPCOLESTR)m_szFolderTitle);
|
|
break;
|
|
default:
|
|
pResult->str = (BSTR)_T("");
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
map<MMC_COOKIE, CAppData>::iterator i = m_pScopePane->m_AppData.find(pResult->lParam);
|
|
if (i != m_pScopePane->m_AppData.end())
|
|
{
|
|
CAppData & data = i->second;
|
|
switch (pResult->nCol)
|
|
{
|
|
case 0:
|
|
sz = data.m_pDetails->pszPackageName;
|
|
break;
|
|
case 1:
|
|
data.GetSzVersion(sz);
|
|
break;
|
|
case 2:
|
|
data.GetSzDeployment(sz);
|
|
break;
|
|
case 3:
|
|
data.GetSzAutoInstall(sz);
|
|
break;
|
|
case 4:
|
|
data.GetSzSource(sz);
|
|
break;
|
|
case 5:
|
|
data.GetSzMods(sz);
|
|
break;
|
|
case 6:
|
|
data.GetSzLocale(sz);
|
|
break;
|
|
case 7:
|
|
data.GetSzOOSUninstall(sz);
|
|
break;
|
|
case 8:
|
|
data.GetSzShowARP(sz);
|
|
break;
|
|
case 9:
|
|
data.GetSzUIType(sz);
|
|
break;
|
|
case 10:
|
|
data.GetSzIgnoreLoc(sz);
|
|
break;
|
|
case 11:
|
|
data.GetSzRemovePrev(sz);
|
|
break;
|
|
case 12:
|
|
data.GetSzProductCode(sz);
|
|
break;
|
|
case 13:
|
|
data.GetSzStage(sz);
|
|
break;
|
|
case 14:
|
|
data.GetSzUpgrades(sz, m_pScopePane);
|
|
break;
|
|
case 15:
|
|
data.GetSzUpgradedBy(sz, m_pScopePane);
|
|
break;
|
|
case 16:
|
|
sz = data.m_pDetails->pInstallInfo->pszScriptPath;
|
|
break;
|
|
case 17:
|
|
data.GetSzPlatform(sz);
|
|
break;
|
|
case 18:
|
|
data.GetSzX86onIA64(sz);
|
|
break;
|
|
case 19:
|
|
data.GetSzFullInstall(sz);
|
|
break;
|
|
case 20:
|
|
data.GetSzOrigin(sz);
|
|
break;
|
|
case 21:
|
|
data.GetSzSOM(sz);
|
|
break;
|
|
default:
|
|
sz = "";
|
|
break;
|
|
}
|
|
pResult->str = (unsigned short *)((LPCOLESTR)sz);
|
|
}
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CResultPane::OnFolder(MMC_COOKIE cookie, LPARAM arg, LPARAM param)
|
|
{
|
|
ASSERT(FALSE);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CResultPane::OnShow(MMC_COOKIE cookie, LPARAM arg, LPARAM param)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
_fVisible = (BOOL)arg;
|
|
|
|
// Note - arg is TRUE when it is time to enumerate
|
|
if (arg == TRUE)
|
|
{
|
|
// Show the headers for this nodetype
|
|
ASSERT(m_pScopePane != NULL);
|
|
InitializeHeaders(cookie);
|
|
m_pResult->SetViewMode(m_lViewMode);
|
|
|
|
if (m_pScopePane->m_fRSOP || m_pScopePane->m_pIClassAdmin)
|
|
{
|
|
// if there's no IClassAdmin then there's nothing to enumerate
|
|
// unless we're in RSOP mode
|
|
Enumerate(cookie, param);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pResult->GetViewMode(&m_lViewMode);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CResultPane::OnActivate(MMC_COOKIE cookie, LPARAM arg, LPARAM param)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CResultPane::OnResultItemClkOrDblClk(MMC_COOKIE cookie, BOOL fDblClick)
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
HRESULT CResultPane::OnMinimize(MMC_COOKIE cookie, LPARAM arg, LPARAM param)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CResultPane::OnSelect(DATA_OBJECT_TYPES type, MMC_COOKIE cookie, LPARAM arg, LPARAM 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);
|
|
// Enable the delete verb.
|
|
// (UI review - we're NOT going to enable
|
|
// the delete verb after all.)
|
|
// m_pConsoleVerb->SetVerbState(MMC_VERB_DELETE, ENABLED, TRUE);
|
|
|
|
// Enable the properties verb.
|
|
m_pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, ENABLED, TRUE);
|
|
}
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetDefaultVerb(MMC_VERB_OPEN);
|
|
if (!m_pScopePane->m_fRSOP)
|
|
{
|
|
// Enable the properties verb.
|
|
m_pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, ENABLED, TRUE);
|
|
}
|
|
}
|
|
// Set the default verb to open
|
|
|
|
// Enable the refresh verb.
|
|
if (!m_pScopePane->m_fRSOP)
|
|
{
|
|
m_pConsoleVerb->SetVerbState(MMC_VERB_REFRESH, ENABLED, TRUE);
|
|
}
|
|
// Enable the paste verb and hide. due to the weird way in which
|
|
// MMC handles drag-n-drop scenarios, the only way to enable drag-n-drop
|
|
// from explorer is to keep the paste verb enabled forever.
|
|
// But do this only if we are not in RSoP because PASTE is meaningless
|
|
// for RSoP which is Read-Only.
|
|
if (!m_pScopePane->m_fRSOP)
|
|
{
|
|
m_pConsoleVerb->SetVerbState(MMC_VERB_PASTE, ENABLED, TRUE);
|
|
m_pConsoleVerb->SetVerbState(MMC_VERB_PASTE, HIDDEN, TRUE);
|
|
}
|
|
else
|
|
{
|
|
m_pConsoleVerb->SetVerbState(MMC_VERB_PASTE, ENABLED, FALSE);
|
|
m_pConsoleVerb->SetVerbState(MMC_VERB_PASTE, HIDDEN, TRUE);
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CResultPane::OnPropertyChange(LPARAM param) // param is the cookie of the item that changed
|
|
{
|
|
HRESULT hr = S_OK;
|
|
if(m_pScopePane->m_AppData[param].m_fVisible)
|
|
{
|
|
RESULTDATAITEM rd;
|
|
memset(&rd, 0, sizeof(rd));
|
|
rd.mask = RDI_IMAGE;
|
|
rd.itemID = m_pScopePane->m_AppData[param].m_itemID;
|
|
rd.nImage = m_pScopePane->m_AppData[param].GetImageIndex(m_pScopePane);
|
|
m_pResult->SetItem(&rd);
|
|
m_pResult->Sort(m_nSortColumn, m_dwSortOptions, -1);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CResultPane::OnUpdateView(LPDATAOBJECT lpDataObject)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
void CResultPane::Enumerate(MMC_COOKIE cookie, HSCOPEITEM pParent)
|
|
{
|
|
EnumerateResultPane(cookie);
|
|
}
|
|
|
|
|
|
HRESULT GetFailedSettings(IWbemServices * pNamespace,
|
|
CAppData &data,
|
|
IWbemClassObject * pInst)
|
|
{
|
|
VARIANT var;
|
|
HRESULT hr = S_OK;
|
|
VariantInit(&var);
|
|
BSTR strLanguage = SysAllocString(TEXT("WQL"));
|
|
if (strLanguage)
|
|
{
|
|
CString szRelPath;
|
|
hr = GetParameter(pInst,
|
|
TEXT("__RELPATH"),
|
|
szRelPath);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetFailedSettings: GetParameter(\"__RELPATH\") failed with 0x%x", hr));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// build the proper query
|
|
CString szQuery = TEXT("ASSOCIATORS OF {");
|
|
szQuery += szRelPath;
|
|
szQuery += TEXT("} WHERE ResultClass=RSOP_PolicySettingStatus");
|
|
|
|
BSTR strQuery = SysAllocString(szQuery);
|
|
if (strQuery)
|
|
{
|
|
IEnumWbemClassObject * pEnum = NULL;
|
|
// execute the query
|
|
hr = pNamespace->ExecQuery(strLanguage,
|
|
strQuery,
|
|
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
|
|
NULL,
|
|
&pEnum);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetFailedSettings: pNamespace->ExecQuery failed with 0x%x", hr));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
IWbemClassObject * pObj = NULL;
|
|
ULONG n = 0;
|
|
// get the result (only care about the first entry)
|
|
hr = pEnum->Next(WBEM_INFINITE,
|
|
1,
|
|
&pObj,
|
|
&n);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetFailedSettings: pEnum->Next failed with 0x%x", hr));
|
|
if (SUCCEEDED(hr) && n > 0)
|
|
{
|
|
hr = GetParameter(pObj, TEXT("EventSource"), data.m_szEventSource);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetFailedSettings: GetParameter(\"EventSource\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj, TEXT("EventLogName"), data.m_szEventLogName);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetFailedSettings: GetParameter(\"EventLogName\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj, TEXT("EventID"), data.m_dwEventID);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetFailedSettings: GetParameter(\"EventId\") failed with 0x%x", hr));
|
|
BSTR bstrTime = NULL;
|
|
hr = GetParameterBSTR(pObj, TEXT("EventTime"),bstrTime);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetFailedSettings: GetParameter(\"EventTime\") failed with 0x%x", hr));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
data.m_szEventTime = bstrTime;
|
|
if (bstrTime)
|
|
SysFreeString(bstrTime);
|
|
}
|
|
hr = GetParameter(pObj, TEXT("ErrorCode"), data.m_hrErrorCode);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetFailedSettings: GetParameter(\"ErrorCode\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj, TEXT("Status"), data.m_nStatus);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetFailedSettings: GetParameter(\"Status\") failed with 0x%x", hr));
|
|
}
|
|
pEnum->Release();
|
|
}
|
|
SysFreeString(strQuery);
|
|
}
|
|
else
|
|
{
|
|
DebugMsg((DM_WARNING, L"GetFailedSettings: SysAllocString failed with %u", GetLastError()));
|
|
}
|
|
}
|
|
SysFreeString(strLanguage);
|
|
}
|
|
VariantClear(&var);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT
|
|
GetUniqueUpgradeName(
|
|
IWbemServices * pNamespace,
|
|
BSTR strLanguage,
|
|
CString& szGPOID,
|
|
CString szGPOName,
|
|
CString& szUpgradeName)
|
|
{
|
|
HRESULT hr;
|
|
CString GpoName;
|
|
|
|
hr = S_OK;
|
|
|
|
if ( pNamespace )
|
|
{
|
|
LPTSTR pszGPOName = NULL;
|
|
|
|
hr = GetGPOFriendlyName(pNamespace,
|
|
(LPTSTR)((LPCTSTR) szGPOID),
|
|
strLanguage,
|
|
&pszGPOName);
|
|
|
|
GpoName = pszGPOName;
|
|
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetUniqueUpgradeName: GetGPOFriendlyName failed with 0x%x", hr));
|
|
|
|
OLESAFE_DELETE(pszGPOName);
|
|
}
|
|
else
|
|
{
|
|
GpoName = szGPOName;
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
szUpgradeName += TEXT(" (");
|
|
szUpgradeName += GpoName;
|
|
szUpgradeName += TEXT(")");
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT GetRsopFriendlyAppName(
|
|
IWbemServices * pNamespace,
|
|
CAppData &data)
|
|
{
|
|
VARIANT var;
|
|
HRESULT hr = S_OK;
|
|
VariantInit(&var);
|
|
CString szGPO;
|
|
|
|
BSTR strLanguage = SysAllocString(TEXT("WQL"));
|
|
|
|
if (strLanguage)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// build the proper query
|
|
CString szQuery = TEXT("SELECT Name, GPOID FROM RSOP_ApplicationManagementPolicySetting WHERE EntryType=1");
|
|
szQuery += TEXT(" AND ApplicationId=\"");
|
|
szQuery += data.m_szRemovingApplication;
|
|
szQuery +=L'\"';
|
|
|
|
BSTR strQuery = SysAllocString(szQuery);
|
|
if (strQuery)
|
|
{
|
|
IEnumWbemClassObject * pEnum = NULL;
|
|
// execute the query
|
|
hr = pNamespace->ExecQuery(strLanguage,
|
|
strQuery,
|
|
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
|
|
NULL,
|
|
&pEnum);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetRsopFriendlyAppName: pNamespace->ExecQuery failed with 0x%x", hr));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
IWbemClassObject * pObj = NULL;
|
|
ULONG n = 0;
|
|
// get the result (only care about the first entry)
|
|
hr = pEnum->Next(WBEM_INFINITE,
|
|
1,
|
|
&pObj,
|
|
&n);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetRsopFriendlyAppName: pEnum->Next failed with 0x%x", hr));
|
|
if (SUCCEEDED(hr) && n > 0)
|
|
{
|
|
hr = GetParameter(pObj, TEXT("Name"), data.m_szRemovingApplicationName);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetRsopFriendlyAppName: GetParameter(\"Name\") failed with 0x%x", hr));
|
|
}
|
|
|
|
if (SUCCEEDED(hr) && n > 0)
|
|
{
|
|
hr = GetParameter(pObj,
|
|
TEXT("GPOID"),
|
|
szGPO);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetRsopFriendlyAppName: GetParameter(\"GPOID\") failed with 0x%x", hr));
|
|
}
|
|
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
hr = GetUniqueUpgradeName(
|
|
pNamespace,
|
|
strLanguage,
|
|
szGPO,
|
|
TEXT(""),
|
|
data.m_szRemovingApplicationName);
|
|
}
|
|
|
|
pEnum->Release();
|
|
}
|
|
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetRsopFriendlyAppName: GetUniqueUpgradeName failed with 0x%x", hr));
|
|
|
|
SysFreeString(strQuery);
|
|
}
|
|
else
|
|
{
|
|
DebugMsg((DM_WARNING, L"GetRsopFriendlyAppName: SysAllocString failed with %u", GetLastError()));
|
|
}
|
|
}
|
|
SysFreeString(strLanguage);
|
|
}
|
|
VariantClear(&var);
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT GetRSOPUpgrades(IWbemServices * pNamespace,
|
|
TCHAR * szGPOID,
|
|
IWbemClassObject * pInst,
|
|
TCHAR * szParam,
|
|
set <CString> &s)
|
|
{
|
|
VARIANT var;
|
|
HRESULT hr = S_OK;
|
|
VariantInit(&var);
|
|
BSTR strLanguage = SysAllocString(TEXT("WQL"));
|
|
|
|
if (strLanguage)
|
|
{
|
|
CString EntryType;
|
|
|
|
hr = pInst->Get(szParam, 0, &var, 0, 0);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetRSOPUpgrades: pInst->Get(\"%s\") failed with 0x%x", szParam, hr));
|
|
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
VARIANT varEntryType;
|
|
|
|
VariantInit( &varEntryType );
|
|
|
|
hr = pInst->Get( L"EntryType", 0, &varEntryType, 0, 0 );
|
|
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
if ( VT_I4 == varEntryType.vt )
|
|
{
|
|
EntryType.Format( TEXT("%d"), varEntryType.lVal );
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
}
|
|
|
|
VariantClear( &varEntryType );
|
|
}
|
|
|
|
if (SUCCEEDED(hr) && var.vt == (VT_ARRAY | VT_BSTR))
|
|
{
|
|
CString sz;
|
|
SAFEARRAY * parray = var.parray;
|
|
BSTR * rgData = (BSTR *)parray->pvData;
|
|
UINT ui = parray->rgsabound[0].cElements;
|
|
while (ui--)
|
|
{
|
|
sz = rgData[ui];
|
|
|
|
// Find the app that this guid matches
|
|
|
|
// first build the proper query
|
|
CString szQuery = TEXT("SELECT Name, GPOID FROM RSOP_ApplicationManagementPolicySetting WHERE EntryType=");
|
|
|
|
szQuery += EntryType;
|
|
szQuery += TEXT(" AND ApplicationId=");
|
|
szQuery +=L'\"';
|
|
szQuery += sz;
|
|
szQuery +=L'\"';
|
|
|
|
BSTR strQuery = SysAllocString(szQuery);
|
|
if (strQuery)
|
|
{
|
|
IEnumWbemClassObject * pEnum = NULL;
|
|
// execute the query
|
|
hr = pNamespace->ExecQuery(strLanguage,
|
|
strQuery,
|
|
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
|
|
NULL,
|
|
&pEnum);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetRSOPUpgrades: pNamespace->ExecQuery failed with 0x%x", hr));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
IWbemClassObject * pObj = NULL;
|
|
ULONG n;
|
|
// get the result (only care about the first entry)
|
|
hr = pEnum->Next(WBEM_INFINITE,
|
|
1,
|
|
&pObj,
|
|
&n);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetRSOPUpgrades: pEnum->Next failed with 0x%x", hr));
|
|
if (SUCCEEDED(hr) && n > 0)
|
|
{
|
|
// get the PackageName
|
|
hr = GetParameter(pObj,
|
|
TEXT("Name"),
|
|
sz);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetRSOPUpgrades: GetParameter(\"Name\") failed with 0x%x", hr));
|
|
|
|
// get the GPOID
|
|
CString szGPO;
|
|
hr = GetParameter(pObj,
|
|
TEXT("GPOID"),
|
|
szGPO);
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetRSOPUpgrades: GetParameter(\"GPOID\") failed with 0x%x", hr));
|
|
|
|
hr = GetUniqueUpgradeName(pNamespace,
|
|
strLanguage,
|
|
szGPO,
|
|
TEXT(""),
|
|
sz);
|
|
|
|
DebugReportFailure(hr, (DM_WARNING, L"GetRSOPUpgrades: GetUniqueUpgradeName failed with 0x%x", hr));
|
|
|
|
// insert the name
|
|
s.insert(sz);
|
|
pObj->Release();
|
|
}
|
|
pEnum->Release();
|
|
}
|
|
SysFreeString(strQuery);
|
|
}
|
|
}
|
|
}
|
|
SysFreeString(strLanguage);
|
|
}
|
|
VariantClear(&var);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
GetRSOPUpgradedBy( map<MMC_COOKIE, CAppData>* pAppData )
|
|
{
|
|
map<MMC_COOKIE, CAppData>::iterator AppIterator;
|
|
CString UpgradeId;
|
|
CString AppId;
|
|
|
|
BSTR strLanguage = SysAllocString(TEXT("WQL"));
|
|
|
|
if ( ! strLanguage )
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
HRESULT hr;
|
|
|
|
hr = S_OK;
|
|
|
|
//
|
|
// For each app, retrieve the set of apps that it upgrades
|
|
//
|
|
for ( AppIterator = pAppData->begin(); AppIterator != pAppData->end(); AppIterator++)
|
|
{
|
|
{
|
|
CAppData& AppData = AppIterator->second;
|
|
|
|
AppId = AppData.m_pDetails->pszPackageName;
|
|
|
|
hr = GetUniqueUpgradeName(
|
|
NULL,
|
|
strLanguage,
|
|
AppData.m_szGPOID,
|
|
AppData.m_szGPOName,
|
|
AppId);
|
|
|
|
if ( FAILED(hr) )
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Iterate through each upgrade to see if
|
|
// we can find the upgrade in the list of apps
|
|
//
|
|
set <CString>::iterator CurrentUpgrade;
|
|
|
|
for (
|
|
CurrentUpgrade = AppData.m_setUpgrade.begin();
|
|
CurrentUpgrade != AppData.m_setUpgrade.end();
|
|
CurrentUpgrade++)
|
|
{
|
|
map<MMC_COOKIE, CAppData>::iterator UpgradeIterator;
|
|
|
|
for (
|
|
UpgradeIterator = pAppData->begin();
|
|
pAppData->end() != UpgradeIterator;
|
|
UpgradeIterator++)
|
|
{
|
|
UpgradeId = UpgradeIterator->second.m_pDetails->pszPackageName;
|
|
|
|
hr = GetUniqueUpgradeName(
|
|
NULL,
|
|
strLanguage,
|
|
UpgradeIterator->second.m_szGPOID,
|
|
UpgradeIterator->second.m_szGPOName,
|
|
UpgradeId);
|
|
|
|
if ( FAILED(hr) )
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
// See if this potential upgrade corresponds to the current upgrade
|
|
// listed in the current app -- if so, mark the upgraded app as being
|
|
// upgraded by the current app
|
|
//
|
|
if ( *CurrentUpgrade == UpgradeId )
|
|
{
|
|
UpgradeIterator->second.m_setUpgradedBy.insert( AppId );
|
|
}
|
|
}
|
|
}
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
for (
|
|
CurrentUpgrade = AppData.m_setReplace.begin();
|
|
CurrentUpgrade != AppData.m_setReplace.end();
|
|
CurrentUpgrade++)
|
|
{
|
|
map<MMC_COOKIE, CAppData>::iterator UpgradeIterator;
|
|
|
|
for (
|
|
UpgradeIterator = pAppData->begin();
|
|
pAppData->end() != UpgradeIterator;
|
|
UpgradeIterator++)
|
|
{
|
|
UpgradeId = UpgradeIterator->second.m_pDetails->pszPackageName;
|
|
|
|
hr = GetUniqueUpgradeName(
|
|
NULL,
|
|
strLanguage,
|
|
UpgradeIterator->second.m_szGPOID,
|
|
UpgradeIterator->second.m_szGPOName,
|
|
UpgradeId);
|
|
|
|
if ( FAILED(hr) )
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
// See if this potential upgrade corresponds to the current upgrade
|
|
// listed in the current app -- if so, mark the upgraded app as being
|
|
// upgraded by the current app
|
|
//
|
|
if ( *CurrentUpgrade == UpgradeId )
|
|
{
|
|
UpgradeIterator->second.m_setUpgradedBy.insert( AppId );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( FAILED(hr) )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( FAILED( hr) )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
SysFreeString(strLanguage);
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT CResultPane::EnumerateRSoPData(void)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
IWbemLocator * pLocator = NULL;
|
|
IWbemServices * pNamespace = NULL;
|
|
IWbemClassObject * pObj = NULL;
|
|
IEnumWbemClassObject * pEnum = NULL;
|
|
BSTR strQueryLanguage = SysAllocString(TEXT("WQL"));
|
|
BSTR strQuery = NULL;
|
|
CString szText;
|
|
|
|
m_pScopePane->m_AppData.erase(m_pScopePane->m_AppData.begin(), m_pScopePane->m_AppData.end());
|
|
|
|
switch (m_pScopePane->m_iViewState)
|
|
{
|
|
case IDM_WINNER:
|
|
strQuery = SysAllocString(TEXT("SELECT * FROM RSOP_ApplicationManagementPolicySetting WHERE EntryType=1"));
|
|
szText.LoadString(IDS_WIN_TEXT);
|
|
break;
|
|
case IDM_REMOVED:
|
|
strQuery = SysAllocString(TEXT("SELECT * FROM RSOP_ApplicationManagementPolicySetting WHERE EntryType=2"));
|
|
szText.LoadString(IDS_REM_TEXT);
|
|
break;
|
|
case IDM_ARP:
|
|
strQuery = SysAllocString(TEXT("SELECT * FROM RSOP_ApplicationManagementPolicySetting WHERE EntryType=3"));
|
|
szText.LoadString(IDS_ARP_TEXT);
|
|
break;
|
|
}
|
|
// set text of first column to match the view state
|
|
m_pHeader->SetColumnText(0, szText);
|
|
|
|
BSTR strNamespace = SysAllocString(m_pScopePane->m_szRSOPNamespace);
|
|
ULONG n = 0;
|
|
hr = CoCreateInstance(CLSID_WbemLocator,
|
|
0,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_IWbemLocator,
|
|
(LPVOID *) & pLocator);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: CoCreateInstance failed with 0x%x", hr));
|
|
if (FAILED(hr))
|
|
{
|
|
goto cleanup;
|
|
}
|
|
hr = pLocator->ConnectServer(strNamespace,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL,
|
|
&pNamespace);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: pLocator->ConnectServer failed with 0x%x", hr));
|
|
if (FAILED(hr))
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
hr = pNamespace->ExecQuery(strQueryLanguage,
|
|
strQuery,
|
|
WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY,
|
|
NULL,
|
|
&pEnum);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: pNamespace->ExecQuery failed with 0x%x", hr));
|
|
if (FAILED(hr))
|
|
{
|
|
goto cleanup;
|
|
}
|
|
do
|
|
{
|
|
hr = pEnum->Next(WBEM_INFINITE, 1, &pObj, &n);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: pEnum->Next failed with 0x%x", hr));
|
|
if (FAILED(hr))
|
|
{
|
|
goto cleanup;
|
|
}
|
|
if (n > 0)
|
|
{
|
|
// prepare the data entry and populate all the fields
|
|
CAppData data;
|
|
data.m_fRSoP = TRUE;
|
|
BOOL fDemandInstallable = FALSE;
|
|
int iLossOfScopeAction = 0;
|
|
BOOL fDisplayInARP = FALSE;
|
|
BOOL fIgnoreLanguage = FALSE;
|
|
BOOL fUpgradeSettingsMandatory = FALSE;
|
|
BOOL fUninstallUnmanaged = FALSE;
|
|
BOOL fAllowX86OnIA64 = FALSE;
|
|
int iAssignmentType = 0;
|
|
UINT uiDeploymentType = 0;
|
|
WCHAR * szPackageLocation = NULL;
|
|
UINT nTransforms = 0;
|
|
WCHAR ** rgszTransforms = NULL;
|
|
PACKAGEDETAIL * pd = new PACKAGEDETAIL;
|
|
ACTIVATIONINFO * pa = (ACTIVATIONINFO *)OLEALLOC(sizeof(ACTIVATIONINFO));
|
|
PLATFORMINFO * pp = (PLATFORMINFO *)OLEALLOC(sizeof(PLATFORMINFO));
|
|
INSTALLINFO * pi = (INSTALLINFO *)OLEALLOC(sizeof(INSTALLINFO));
|
|
if (pd && pa && pi && pp)
|
|
{
|
|
memset(pi, 0, sizeof(INSTALLINFO));
|
|
memset(pp, 0, sizeof(PLATFORMINFO));
|
|
memset(pa, 0, sizeof(ACTIVATIONINFO));
|
|
memset(pd, 0, sizeof(PACKAGEDETAIL));
|
|
pd->pActInfo = pa;
|
|
pd->pPlatformInfo = pp;
|
|
pd->pInstallInfo = pi;
|
|
}
|
|
else
|
|
{
|
|
// out of memory
|
|
if (pd)
|
|
{
|
|
delete pd;
|
|
}
|
|
if (pa)
|
|
{
|
|
delete pa;
|
|
}
|
|
if (pi)
|
|
{
|
|
delete pi;
|
|
}
|
|
if (pp)
|
|
{
|
|
delete pp;
|
|
}
|
|
hr = E_OUTOFMEMORY;
|
|
goto cleanup;
|
|
}
|
|
hr = GetParameter(pObj,
|
|
TEXT("Name"),
|
|
pd->pszPackageName);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"Name\") failed with 0x%x", hr));
|
|
DWORD dwPrecedence;
|
|
hr = GetParameter(pObj,
|
|
TEXT("Precedence"),
|
|
dwPrecedence);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"Precedence\") failed with 0x%x", hr));
|
|
if ((1 != dwPrecedence) && (IDM_REMOVED != m_pScopePane->m_iViewState))
|
|
{
|
|
data.m_fHide = TRUE;
|
|
}
|
|
hr = GetParameter(pObj,
|
|
TEXT("VersionNumberLo"),
|
|
pi->dwVersionLo);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"VersionNumberLo\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("VersionNumberHi"),
|
|
pi->dwVersionHi);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"VersionNumberHi\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("Publisher"),
|
|
pd->pszPublisher);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"Publisher\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("ProductId"),
|
|
pi->ProductCode);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"ProductId\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("ScriptFile"),
|
|
pi->pszScriptPath);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"ScriptFile\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("SupportURL"),
|
|
pi->pszUrl);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"SupportURL\") failed with 0x%x", hr));
|
|
pp->prgLocale = (LCID *) OLEALLOC(sizeof(LCID));
|
|
if (!pp->prgLocale)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto cleanup;
|
|
}
|
|
pp->cLocales = 1;
|
|
hr = GetParameter(pObj,
|
|
TEXT("LanguageID"),
|
|
pp->prgLocale[0]);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"LanguageID\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("MachineArchitectures"),
|
|
pp->cPlatforms,
|
|
pp->prgPlatform);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"MachineArchitectures\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("DeploymentType"),
|
|
uiDeploymentType);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"DeploymentType\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("InstallationUI"),
|
|
pi->InstallUiLevel);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"InstallationUI\") failed with 0x%x", hr));
|
|
if (pi->InstallUiLevel == 2)
|
|
{
|
|
pi->InstallUiLevel = INSTALLUILEVEL_FULL;
|
|
}
|
|
else
|
|
{
|
|
pi->InstallUiLevel = INSTALLUILEVEL_BASIC;
|
|
}
|
|
hr = GetParameter(pObj,
|
|
TEXT("RedeployCount"),
|
|
pi->dwRevision);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"RedeployCount\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("DemandInstallable"),
|
|
fDemandInstallable);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"DemandInstallable\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("LossOfScopeAction"),
|
|
iLossOfScopeAction);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"LossOfScopeAction\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("DisplayInARP"),
|
|
fDisplayInARP);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"DisplayInARP\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("IgnoreLanguage"),
|
|
fIgnoreLanguage);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"IgnoreLanguage\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("UninstallUnmanaged"),
|
|
fUninstallUnmanaged);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"UninstallUnmanaged\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("AssignmentType"),
|
|
iAssignmentType);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"AssignmentType\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("AllowX86OnIA64"),
|
|
fAllowX86OnIA64);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"AllowX86OnIA64\") failed with 0x%x", hr));
|
|
|
|
// build proper flags
|
|
pi->dwActFlags = (uiDeploymentType == 2 ? ACTFLG_Published : ACTFLG_Assigned)
|
|
| (fDemandInstallable ? ACTFLG_OnDemandInstall : 0)
|
|
| (iLossOfScopeAction == 1 ? ACTFLG_UninstallOnPolicyRemoval : ACTFLG_OrphanOnPolicyRemoval)
|
|
| (fDisplayInARP ? ACTFLG_UserInstall : 0)
|
|
| (fUninstallUnmanaged ? ACTFLG_UninstallUnmanaged : 0)
|
|
| (fIgnoreLanguage ? ACTFLG_IgnoreLanguage : 0)
|
|
| (iAssignmentType == 3 ? ACTFLG_InstallUserAssign : 0);
|
|
{
|
|
int nArch = pp->cPlatforms;
|
|
while (nArch--)
|
|
{
|
|
if (pp->prgPlatform[nArch].dwProcessorArch == PROCESSOR_ARCHITECTURE_INTEL)
|
|
{
|
|
if (!fAllowX86OnIA64)
|
|
{
|
|
pi->dwActFlags |= ACTFLG_ExcludeX86OnIA64;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
hr = GetParameter(pObj,
|
|
TEXT("UpgradeSettingsMandatory"),
|
|
fUpgradeSettingsMandatory);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"UpgradeSettingsMandatory\") failed with 0x%x", hr));
|
|
if (fUpgradeSettingsMandatory)
|
|
{
|
|
pi->dwActFlags |= ACTFLG_ForceUpgrade;
|
|
}
|
|
hr = GetParameter(pObj,
|
|
TEXT("PackageLocation"),
|
|
szPackageLocation);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"PackageLocation\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("transforms"),
|
|
nTransforms,
|
|
rgszTransforms
|
|
);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"transforms\") failed with 0x%x", hr));
|
|
pd->pszSourceList = (TCHAR **)OLEALLOC(sizeof(TCHAR *) * (nTransforms + 1));
|
|
if (!pd->pszSourceList)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto cleanup;
|
|
}
|
|
pd->cSources = nTransforms + 1;
|
|
if (NULL != pd->pszSourceList)
|
|
{
|
|
pd->pszSourceList[0] = szPackageLocation;
|
|
UINT n = nTransforms;
|
|
while (n--)
|
|
{
|
|
pd->pszSourceList[1 + n] = rgszTransforms[n];
|
|
}
|
|
OLESAFE_DELETE(rgszTransforms);
|
|
}
|
|
/* UNDONE
|
|
hr = GetParameter(pObj,
|
|
TEXT("localeMatchType"),
|
|
);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"LocaleMatchType\") failed with 0x%x", hr));
|
|
*/
|
|
hr = GetParameter(pObj,
|
|
TEXT("categories"),
|
|
pd->cCategories,
|
|
pd->rpCategory
|
|
);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"categories\") failed with 0x%x", hr));
|
|
data.m_pDetails = pd;
|
|
data.InitializeExtraInfo();
|
|
|
|
hr = GetParameter(pObj,
|
|
TEXT("GPOID"),
|
|
data.m_szGPOID);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"GPOID\") failed with 0x%x", hr));
|
|
LPTSTR pszGPOName = NULL;
|
|
hr = GetGPOFriendlyName(pNamespace,
|
|
(LPTSTR)((LPCTSTR) data.m_szGPOID),
|
|
strQueryLanguage,
|
|
&pszGPOName);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetGPOFriendlyName failed with 0x%x", hr));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
data.m_szGPOName = pszGPOName;
|
|
OLESAFE_DELETE(pszGPOName);
|
|
}
|
|
|
|
hr = GetParameter(pObj,
|
|
TEXT("Id"),
|
|
data.m_szDeploymentGroupID);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"Id\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("SOMID"),
|
|
data.m_szSOMID);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"SOMID\") failed with 0x%x", hr));
|
|
hr = GetParameter(pObj,
|
|
TEXT("SecurityDescriptor"),
|
|
data.m_psd);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"SecurityDescriptor\") failed with 0x%x", hr));
|
|
hr = GetRSOPUpgrades(pNamespace,
|
|
0,
|
|
pObj,
|
|
TEXT("UpgradeableApplications"),
|
|
data.m_setUpgrade);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetRSOPUpgrades(\"UpgradeableApplications\") failed with 0x%x", hr));
|
|
hr = GetRSOPUpgrades(pNamespace,
|
|
0,
|
|
pObj,
|
|
TEXT("ReplaceableApplications"),
|
|
data.m_setReplace);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetRSOPUpgrades(\"ReplaceableApplications\") failed with 0x%x", hr));
|
|
|
|
hr = GetParameter(pObj,
|
|
TEXT("ApplyCause"),
|
|
data.m_dwApplyCause);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"ApplyCause\") failed with 0x%x", hr));
|
|
|
|
hr = GetParameter(pObj,
|
|
TEXT("LanguageMatch"),
|
|
data.m_dwLanguageMatch);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"LanguageMatch\") failed with 0x%x", hr));
|
|
|
|
hr = GetParameter(pObj,
|
|
TEXT("OnDemandFileExtension"),
|
|
data.m_szOnDemandFileExtension);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"OnDemandFileExtension\") failed with 0x%x", hr));
|
|
|
|
hr = GetParameter(pObj,
|
|
TEXT("OnDemandClsid"),
|
|
data.m_szOnDemandClsid);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"OnDemandClsid\") failed with 0x%x", hr));
|
|
|
|
hr = GetParameter(pObj,
|
|
TEXT("OnDemandProgid"),
|
|
data.m_szOnDemandProgid);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"OnDemandProgid\") failed with 0x%x", hr));
|
|
|
|
hr = GetParameter(pObj,
|
|
TEXT("RemovalCause"),
|
|
data.m_dwRemovalCause);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"RemovalCause\") failed with 0x%x", hr));
|
|
|
|
hr = GetParameter(pObj,
|
|
TEXT("RemovalType"),
|
|
data.m_dwRemovalType);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"RemovalType\") failed with 0x%x", hr));
|
|
|
|
hr = GetParameter(pObj,
|
|
TEXT("RemovingApplication"),
|
|
data.m_szRemovingApplication);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetParameter(\"RemovingType\") failed with 0x%x", hr));
|
|
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
hr = GetRsopFriendlyAppName(
|
|
pNamespace,
|
|
data);
|
|
}
|
|
|
|
hr = GetFailedSettings(pNamespace,
|
|
data,
|
|
pObj);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
LPOLESTR lpText;
|
|
hr = this->m_pScopePane->m_pIRSOPInformation->GetEventLogEntryText((LPOLESTR)(LPCOLESTR)data.m_szEventSource,
|
|
(LPOLESTR)(LPCOLESTR)data.m_szEventLogName,
|
|
(LPOLESTR)(LPCOLESTR)data.m_szEventTime,
|
|
data.m_dwEventID,
|
|
&lpText);
|
|
DebugReportFailure(hr, (DM_WARNING, L"EnumerateRSoPData: GetEventLogEntryText failed with 0x%x", hr));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
data.m_szEventLogText = lpText;
|
|
CoTaskMemFree(lpText);
|
|
}
|
|
}
|
|
|
|
// insert the entry in the list
|
|
m_pScopePane->m_AppData[++m_pScopePane->m_lLastAllocated] = data;
|
|
m_pScopePane->m_UpgradeIndex[GetUpgradeIndex(data.m_pDetails->pInstallInfo->PackageGuid)] = m_pScopePane->m_lLastAllocated;
|
|
// prepare for the next itteration
|
|
if (pObj)
|
|
{
|
|
pObj->Release();
|
|
pObj = NULL;
|
|
}
|
|
}
|
|
} while (n > 0);
|
|
|
|
hr = GetRSOPUpgradedBy( &(m_pScopePane->m_AppData) );
|
|
|
|
cleanup:
|
|
SysFreeString(strQuery);
|
|
SysFreeString(strQueryLanguage);
|
|
SysFreeString(strNamespace);
|
|
if (pObj)
|
|
{
|
|
pObj->Release();
|
|
}
|
|
if (pEnum)
|
|
{
|
|
pEnum->Release();
|
|
}
|
|
if (pNamespace)
|
|
{
|
|
pNamespace->Release();
|
|
}
|
|
if (pLocator)
|
|
{
|
|
pLocator->Release();
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
void CResultPane::EnumerateResultPane(MMC_COOKIE cookie)
|
|
{
|
|
// put up an hourglass (this could take a while)
|
|
CHourglass hourglass;
|
|
|
|
if (m_pScopePane) // make sure we've been initialized before we do any of this.
|
|
{
|
|
ASSERT(m_pResult != NULL); // make sure we QI'ed for the interface
|
|
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_pScopePane->m_AppData.begin() == m_pScopePane->m_AppData.end() ) ||
|
|
m_pScopePane->m_fRSOP ) // test to see if the data has been initialized
|
|
{
|
|
HRESULT hr = S_OK;
|
|
if (m_pScopePane->m_fRSOP)
|
|
{
|
|
// get the data from RSOP database
|
|
hr = EnumerateRSoPData();
|
|
}
|
|
else
|
|
{
|
|
// get the data from ClassStore
|
|
ASSERT(m_pScopePane->m_pIClassAdmin != NULL);
|
|
IClassAdmin * pICA = m_pScopePane->m_pIClassAdmin;
|
|
CSPLATFORM csPlatform;
|
|
memset(&csPlatform, 0, sizeof(CSPLATFORM));
|
|
|
|
IEnumPackage * pIPE = NULL;
|
|
|
|
hr = pICA->EnumPackages(
|
|
NULL,
|
|
NULL,
|
|
APPQUERY_ADMINISTRATIVE,
|
|
NULL,
|
|
NULL,
|
|
&pIPE);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
PACKAGEDISPINFO * pi = new PACKAGEDISPINFO;
|
|
if (pi)
|
|
{
|
|
hr = pIPE->Reset();
|
|
while (SUCCEEDED(hr))
|
|
{
|
|
ULONG nceltFetched;
|
|
|
|
hr = pIPE->Next(1, pi, &nceltFetched);
|
|
if (nceltFetched)
|
|
{
|
|
PACKAGEDETAIL * pd = new PACKAGEDETAIL;
|
|
HRESULT hr = pICA->GetPackageDetails(pi->pszPackageName, pd);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CAppData data;
|
|
data.m_pDetails = pd;
|
|
|
|
data.InitializeExtraInfo();
|
|
|
|
m_pScopePane->m_AppData[++m_pScopePane->m_lLastAllocated] = data;
|
|
m_pScopePane->m_UpgradeIndex[GetUpgradeIndex(data.m_pDetails->pInstallInfo->PackageGuid)] = m_pScopePane->m_lLastAllocated;
|
|
}
|
|
else
|
|
{
|
|
DebugMsg((DM_WARNING, TEXT("GetPackageDetails failed with 0x%x"), hr));
|
|
delete pd;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
ReleasePackageInfo(pi);
|
|
}
|
|
delete pi;
|
|
}
|
|
SAFE_RELEASE(pIPE);
|
|
}
|
|
}
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = m_pScopePane->PopulateExtensions();
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = m_pScopePane->PopulateUpgradeLists();
|
|
}
|
|
}
|
|
}
|
|
if (_fVisible)
|
|
{
|
|
map<MMC_COOKIE, CAppData>::iterator i = m_pScopePane->m_AppData.begin();
|
|
while (i != m_pScopePane->m_AppData.end())
|
|
{
|
|
if (!i->second.m_fHide)
|
|
{
|
|
resultItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
|
|
resultItem.str = MMC_CALLBACK;
|
|
resultItem.nImage = i->second.GetImageIndex(m_pScopePane);
|
|
resultItem.lParam = i->first;
|
|
m_pResult->InsertItem(&resultItem);
|
|
i->second.m_fVisible = TRUE;
|
|
i->second.m_itemID = resultItem.itemID;
|
|
}
|
|
i++;
|
|
}
|
|
m_pResult->Sort(m_nSortColumn, m_dwSortOptions, -1);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Member: CResultPane::OnFileDrop
|
|
//
|
|
// Synopsis: this functions handles files dropped into the MMC snapin
|
|
//
|
|
// Arguments:
|
|
// [in] lpDataObject : the data object being dropped
|
|
//
|
|
// Returns:
|
|
// TRUE - all the dropped objects were successfully added
|
|
// FALSE - at least some of the dropped objects could not be added
|
|
//
|
|
// History: 5/20/1998 RahulTh created
|
|
//
|
|
// Notes: The dropped files are required to have a .msi extension
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
BOOL CResultPane::OnFileDrop (LPDATAOBJECT lpDataObject)
|
|
{
|
|
AFX_MANAGE_STATE (AfxGetStaticModuleState());
|
|
|
|
ASSERT (lpDataObject);
|
|
|
|
int nFiles, index, nRequired, iSlashPos;
|
|
STGMEDIUM medium;
|
|
HDROP hDrop;
|
|
TCHAR* szFileName;
|
|
UINT cbSize;
|
|
FORMATETC fe = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
|
|
CString szDisplayName;
|
|
CString szSource;
|
|
CString szExt;
|
|
BOOL fRetVal = TRUE;
|
|
BOOL fOneDropSucceeded = FALSE; //at least one file drop succeeded
|
|
HRESULT hr;
|
|
|
|
// always fail if we're in RSOP mode (we're read-only in this mode)
|
|
if (m_pScopePane->m_fRSOP)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//check if the dropped items support HDROP
|
|
//for files dragged from explorer, this is always supported
|
|
if (FAILED(hr = lpDataObject->GetData(&fe, &medium)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//the data object supports HDROP.
|
|
//this means that files are being dragged & dropped from explorer.
|
|
|
|
//crack open the data object to get the names of the files being dropped.
|
|
hDrop = (HDROP)medium.hGlobal;
|
|
//start with MAX_PATH, will work for most cases.
|
|
//if not, we will increase buffer size based on need.
|
|
//but we start with MAX_PATH in an attempt to minimize re-allocations
|
|
szFileName = new TCHAR [cbSize = MAX_PATH];
|
|
nFiles = ::DragQueryFile (hDrop, 0xFFFFFFFF, NULL, 0);
|
|
|
|
for (index = 0; index < nFiles; index++)
|
|
{
|
|
//find out the size of the buffer required (including the terminating
|
|
//NULL)
|
|
nRequired = ::DragQueryFile (hDrop, index, NULL, 0) + 1;
|
|
|
|
//expand the buffer if necessary. Note that we never contract it.
|
|
//Saves code and time
|
|
if (nRequired > cbSize)
|
|
{
|
|
delete [] szFileName;
|
|
szFileName = new TCHAR [cbSize = nRequired];
|
|
}
|
|
//get the full filename of the file being dropped.
|
|
::DragQueryFile (hDrop, index, szFileName, cbSize);
|
|
#if 0
|
|
// stevebl - gonna let any file through at this point. If it isn't
|
|
// a valid darwin file, AddMSIPackage will catch it and display an
|
|
// appropriate error.
|
|
|
|
//check the file extension
|
|
if (!(GetCapitalizedExt(szFileName, szExt) && TEXT("MSI") == szExt))
|
|
{
|
|
//do we put up an error message here?
|
|
fRetVal = FALSE; //failed for this file. wrong extension
|
|
continue;
|
|
}
|
|
#endif
|
|
//try to get a UNC path
|
|
hr = GetUNCPath (szFileName, szSource);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
CString sz;
|
|
sz.LoadString (IDS_NO_UNIVERSAL_NAME);
|
|
if (IDYES != ::MessageBox (m_pScopePane->m_hwndMainWindow, sz, szSource, MB_YESNO | MB_ICONEXCLAMATION))
|
|
continue;
|
|
}
|
|
|
|
//now get the display name for the file.
|
|
iSlashPos = szSource.ReverseFind ('\\');
|
|
if (-1 == iSlashPos)
|
|
szDisplayName = szSource;
|
|
else
|
|
szDisplayName = szSource.Mid (iSlashPos + 1);
|
|
|
|
//check the file extension to see if it's a ZAP file
|
|
if (GetCapitalizedExt(szFileName, szExt) && TEXT("ZAP") == szExt)
|
|
{
|
|
if (m_pScopePane->m_fMachine)
|
|
{
|
|
CString szText;
|
|
CString szTitle;
|
|
szText.LoadString(IDS_NO_ZAPS_ALLOWED);
|
|
// only allow ZAP files to be deployed to users
|
|
::MessageBox(m_pScopePane->m_hwndMainWindow,
|
|
szText,
|
|
szTitle,
|
|
MB_OK | MB_ICONEXCLAMATION);
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
hr = m_pScopePane->AddZAPPackage (szSource, szDisplayName);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = m_pScopePane->AddMSIPackage (szSource, szDisplayName);
|
|
}
|
|
if (SUCCEEDED(hr))
|
|
fOneDropSucceeded = TRUE;
|
|
}
|
|
|
|
//notify the clients
|
|
if (fOneDropSucceeded && m_pScopePane->m_pIGPEInformation)
|
|
{
|
|
if (FAILED(m_pScopePane->m_pIGPEInformation->PolicyChanged (m_pScopePane->m_fMachine,
|
|
TRUE, &guidExtension,
|
|
m_pScopePane->m_fMachine ? &guidMachSnapin
|
|
: &guidUserSnapin)))
|
|
{
|
|
ReportPolicyChangedError(m_pScopePane->m_hwndMainWindow);
|
|
}
|
|
}
|
|
//keep the environment clean. Pick up your litter.
|
|
delete [] szFileName;
|
|
|
|
return fRetVal;
|
|
}
|
|
|
|
// This code is needed to ensure that property pages get cleaned up properly.
|
|
// This ensures that when the property sheet is closed all my of property
|
|
// pages that are associated with that property sheet will get deleted.
|
|
LPFNPSPCALLBACK _MMCHookProp;
|
|
|
|
UINT CALLBACK HookPropertySheetProp(HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp)
|
|
{
|
|
UINT i = _MMCHookProp(hwnd, uMsg, ppsp);
|
|
switch (uMsg)
|
|
{
|
|
case PSPCB_RELEASE:
|
|
delete (CPropertyPage *) ppsp->lParam;
|
|
return TRUE;
|
|
default:
|
|
break;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
LRESULT SetPropPageToDeleteOnClose(void * vpsp)
|
|
{
|
|
HRESULT hr = MMCPropPageCallback(vpsp);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (vpsp == NULL)
|
|
return E_POINTER;
|
|
|
|
LPPROPSHEETPAGE psp = (LPPROPSHEETPAGE)vpsp;
|
|
|
|
if ((void*)psp->pfnCallback == (void*)HookPropertySheetProp)
|
|
return E_UNEXPECTED;
|
|
|
|
_MMCHookProp = psp->pfnCallback;
|
|
|
|
psp->pfnCallback = HookPropertySheetProp;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|