mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
410 lines
11 KiB
410 lines
11 KiB
// cmponent.cpp : Implementation of CMyComputerComponent
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "macros.h"
|
|
USE_HANDLE_MACROS("MYCOMPUT(cmponent.cpp)")
|
|
|
|
#include "dataobj.h"
|
|
#include "cmponent.h" // CMyComputerComponent
|
|
#include "compdata.h" // CMyComputerComponentData
|
|
|
|
#include "guidhelp.h" // ExtractData
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#include "stdcmpnt.cpp" // CComponent
|
|
|
|
UINT g_aColumns0[4] =
|
|
{IDS_COLUMN_NAME,IDS_COLUMN_TYPE,IDS_COLUMN_DESCRIPTION,0}; // SYSTEMTOOLS, SERVERAPPS, STORAGE
|
|
UINT g_aColumns1[2] =
|
|
{IDS_COLUMN_NAME,0}; // MYCOMPUT_COMPUTER
|
|
|
|
UINT* g_Columns[MYCOMPUT_NUMTYPES] =
|
|
{ g_aColumns1, // MYCOMPUT_COMPUTER
|
|
g_aColumns0, // MYCOMPUT_SYSTEMTOOLS
|
|
g_aColumns0, // MYCOMPUT_SERVERAPPS
|
|
g_aColumns0 // MYCOMPUT_STORAGE
|
|
};
|
|
|
|
UINT** g_aColumns = g_Columns;
|
|
//
|
|
// CODEWORK this should be in a resource, for example code on loading data resources see
|
|
// D:\nt\private\net\ui\common\src\applib\applib\lbcolw.cxx ReloadColumnWidths()
|
|
// JonN 10/11/96
|
|
//
|
|
int g_aColumnWidths0[3] = {150,150,150};
|
|
int g_aColumnWidths1[1] = {450};
|
|
int* g_ColumnWidths[MYCOMPUT_NUMTYPES] =
|
|
{ g_aColumnWidths1, // MYCOMPUT_COMPUTER
|
|
g_aColumnWidths0, // MYCOMPUT_SYSTEMTOOLS
|
|
g_aColumnWidths0, // MYCOMPUT_SERVERAPPS
|
|
g_aColumnWidths0 // MYCOMPUT_STORAGE
|
|
};
|
|
int** g_aColumnWidths = g_ColumnWidths;
|
|
|
|
CMyComputerComponent::CMyComputerComponent()
|
|
: m_pSvcMgmtToolbar( NULL ),
|
|
m_pMyComputerToolbar( NULL ),
|
|
m_pControlbar( NULL ),
|
|
m_dwFlagsPersist( 0 ),
|
|
m_bForcingGetResultType (false)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
|
m_pViewedCookie = NULL;
|
|
}
|
|
|
|
CMyComputerComponent::~CMyComputerComponent()
|
|
{
|
|
TRACE_METHOD(CMyComputerComponent,Destructor);
|
|
VERIFY( SUCCEEDED(ReleaseAll()) );
|
|
}
|
|
|
|
HRESULT CMyComputerComponent::ReleaseAll()
|
|
{
|
|
MFC_TRY;
|
|
|
|
TRACE_METHOD(CMyComputerComponent,ReleaseAll);
|
|
|
|
SAFE_RELEASE(m_pSvcMgmtToolbar);
|
|
SAFE_RELEASE(m_pMyComputerToolbar);
|
|
SAFE_RELEASE(m_pControlbar);
|
|
|
|
return CComponent::ReleaseAll();
|
|
|
|
MFC_CATCH;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// IComponent Implementation
|
|
|
|
HRESULT CMyComputerComponent::LoadStrings()
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CMyComputerComponent::LoadColumns( CMyComputerCookie* pcookie )
|
|
{
|
|
TEST_NONNULL_PTR_PARAM(pcookie);
|
|
|
|
return LoadColumnsFromArrays( (INT)(pcookie->m_objecttype) );
|
|
}
|
|
|
|
|
|
HRESULT CMyComputerComponent::Show( CCookie* pcookie, LPARAM arg, HSCOPEITEM /*hScopeItem*/ )
|
|
{
|
|
TEST_NONNULL_PTR_PARAM(pcookie);
|
|
|
|
if ( QueryComponentDataRef ().m_bMessageView )
|
|
{
|
|
CComPtr<IUnknown> spUnknown;
|
|
CComPtr<IMessageView> spMessageView;
|
|
|
|
HRESULT hr = m_pConsole->QueryResultView(&spUnknown);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = spUnknown->QueryInterface(IID_IMessageView, (PVOID*)&spMessageView);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CString title;
|
|
|
|
VERIFY (title.LoadString (IDS_TASKPADTITLE_COMPUTER));
|
|
spMessageView->SetTitleText(title);
|
|
spMessageView->SetBodyText(QueryComponentDataRef ().m_strMessageViewMsg);
|
|
spMessageView->SetIcon(Icon_Information);
|
|
}
|
|
if ( E_NOINTERFACE == hr )
|
|
{
|
|
// The interface "IMessageView" was not found so call
|
|
// UpdateAllViews to force a call to GetResultType () which
|
|
// will install it. Since UpdateAllViews call MMCN_SHOW before
|
|
// calling GetResultType, this flag will prevent an endless
|
|
// loop
|
|
// Note: This call is made here because it OnViewChange with
|
|
// this hint will call SelectScopeItem () which cannot be
|
|
// called during MMCN_EXPAND
|
|
if ( !m_bForcingGetResultType )
|
|
{
|
|
m_bForcingGetResultType = true;
|
|
hr = m_pConsole->UpdateAllViews (0, 0, HINT_SELECT_ROOT_NODE);
|
|
}
|
|
}
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
if ( 0 == arg )
|
|
{
|
|
if ( NULL == m_pResultData )
|
|
{
|
|
ASSERT( FALSE );
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
// not needed pcookie->ReleaseResultChildren();
|
|
|
|
m_pViewedCookie = NULL;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
m_pViewedCookie = (CMyComputerCookie*)pcookie;
|
|
|
|
if ( MYCOMPUT_COMPUTER == m_pViewedCookie->m_objecttype
|
|
&& !(m_pViewedCookie->m_fRootCookieExpanded) )
|
|
{
|
|
m_pViewedCookie->m_fRootCookieExpanded = true;
|
|
CComQIPtr<IConsole2, &IID_IConsole2> pIConsole2 = m_pConsole;
|
|
ASSERT( pIConsole2 );
|
|
if ( pIConsole2 )
|
|
{
|
|
// JonN 5/27/99 Some dead code in this directory contains bad templates for
|
|
// looping on scopecookies, this is a better template
|
|
POSITION pos = pcookie->m_listScopeCookieBlocks.GetHeadPosition();
|
|
while (NULL != pos)
|
|
{
|
|
CBaseCookieBlock* pcookieblock = pcookie->m_listScopeCookieBlocks.GetNext( pos );
|
|
ASSERT( NULL != pcookieblock );
|
|
CMyComputerCookie* pChildCookie = (CMyComputerCookie*)pcookieblock;
|
|
// JonN 03/07/00: PREFIX 56323
|
|
switch ((NULL == pChildCookie) ? MYCOMPUT_COMPUTER
|
|
: pChildCookie->m_objecttype)
|
|
{
|
|
case MYCOMPUT_SYSTEMTOOLS:
|
|
case MYCOMPUT_STORAGE:
|
|
{
|
|
HRESULT hr = pIConsole2->Expand(pChildCookie->m_hScopeItem, TRUE);
|
|
ASSERT(SUCCEEDED(hr));
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
LoadColumns( m_pViewedCookie );
|
|
|
|
return PopulateListbox( m_pViewedCookie );
|
|
}
|
|
|
|
HRESULT CMyComputerComponent::OnNotifyAddImages( LPDATAOBJECT /*lpDataObject*/,
|
|
LPIMAGELIST lpImageList,
|
|
HSCOPEITEM /*hSelectedItem*/ )
|
|
{
|
|
if ( QueryComponentDataRef ().m_bMessageView )
|
|
return S_OK;
|
|
else
|
|
return QueryComponentDataRef().LoadIcons(lpImageList,TRUE);
|
|
}
|
|
|
|
HRESULT CMyComputerComponent::OnNotifySnapinHelp (LPDATAOBJECT pDataObject)
|
|
{
|
|
CCookie* pBaseParentCookie = NULL;
|
|
HRESULT hr = ExtractData( pDataObject,
|
|
CMyComputerDataObject::m_CFRawCookie,
|
|
reinterpret_cast<PBYTE>(&pBaseParentCookie),
|
|
sizeof(pBaseParentCookie) );
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT(FALSE);
|
|
return S_OK;
|
|
}
|
|
CMyComputerCookie* pCookie = QueryComponentDataRef().ActiveCookie(pBaseParentCookie);
|
|
if (NULL == pCookie)
|
|
{
|
|
ASSERT(FALSE);
|
|
return S_OK;
|
|
}
|
|
LPCTSTR lpcszHelpTopic = L"compmgmt_topnode.htm";
|
|
switch (pCookie->m_objecttype)
|
|
{
|
|
case MYCOMPUT_SYSTEMTOOLS:
|
|
lpcszHelpTopic = L"system_tools_overview.htm";
|
|
break;
|
|
case MYCOMPUT_SERVERAPPS:
|
|
lpcszHelpTopic = L"server_services_applications_overview.htm";
|
|
break;
|
|
case MYCOMPUT_STORAGE:
|
|
lpcszHelpTopic = L"storage_devices_overview.htm";
|
|
break;
|
|
default:
|
|
ASSERT(FALSE); // fall through
|
|
case MYCOMPUT_COMPUTER:
|
|
break;
|
|
}
|
|
|
|
return ShowHelpTopic( lpcszHelpTopic );
|
|
}
|
|
|
|
HRESULT CMyComputerComponent::PopulateListbox(CMyComputerCookie* /*pcookie*/)
|
|
{
|
|
// not needed (void) pcookie->AddRefResultChildren();
|
|
|
|
return S_OK; // no resultitems in this snapin
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
/// IExtendContextMenu
|
|
|
|
STDMETHODIMP CMyComputerComponent::AddMenuItems(
|
|
IDataObject* piDataObject,
|
|
IContextMenuCallback* piCallback,
|
|
long* pInsertionAllowed)
|
|
{
|
|
MFC_TRY;
|
|
|
|
TRACE_METHOD(CMyComputerComponent,AddMenuItems);
|
|
TEST_NONNULL_PTR_PARAM(piDataObject);
|
|
TEST_NONNULL_PTR_PARAM(piCallback);
|
|
TEST_NONNULL_PTR_PARAM(pInsertionAllowed);
|
|
TRACE( "CMyComputerComponent: extending menu\n" );
|
|
|
|
if ( 0 == (CCM_INSERTIONALLOWED_VIEW & (*pInsertionAllowed)) )
|
|
return S_OK; // no View menu
|
|
|
|
//
|
|
// CODEWORK This code will not work if My Computer becomes an extension,
|
|
// since the RawCookie format will not be available.
|
|
// WARNING cookie cast
|
|
//
|
|
CCookie* pBaseParentCookie = NULL;
|
|
HRESULT hr = ExtractData( piDataObject,
|
|
CMyComputerDataObject::m_CFRawCookie,
|
|
reinterpret_cast<PBYTE>(&pBaseParentCookie),
|
|
sizeof(pBaseParentCookie) );
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT(FALSE);
|
|
return S_OK;
|
|
}
|
|
CMyComputerCookie* pCookie = QueryComponentDataRef().ActiveCookie(pBaseParentCookie);
|
|
if (NULL == pCookie)
|
|
{
|
|
ASSERT(FALSE);
|
|
return S_OK;
|
|
}
|
|
switch (pCookie->m_objecttype)
|
|
{
|
|
case MYCOMPUT_COMPUTER:
|
|
case MYCOMPUT_SYSTEMTOOLS:
|
|
case MYCOMPUT_SERVERAPPS:
|
|
break;
|
|
default:
|
|
ASSERT(FALSE); // fall through
|
|
case MYCOMPUT_STORAGE:
|
|
return S_OK;
|
|
}
|
|
|
|
return hr;
|
|
|
|
MFC_CATCH;
|
|
} // CMyComputerComponent::AddMenuItems()
|
|
|
|
|
|
STDMETHODIMP CMyComputerComponent::Command(
|
|
LONG lCommandID,
|
|
IDataObject* piDataObject )
|
|
{
|
|
MFC_TRY;
|
|
|
|
TRACE_METHOD(CMyComputerComponent,Command);
|
|
TEST_NONNULL_PTR_PARAM(piDataObject);
|
|
TRACE( "CMyComputerComponent::Command: command %ld selected\n", lCommandID );
|
|
|
|
switch (lCommandID)
|
|
{
|
|
case -1:
|
|
break;
|
|
default:
|
|
ASSERT(FALSE);
|
|
break;
|
|
}
|
|
|
|
return S_OK;
|
|
|
|
MFC_CATCH;
|
|
|
|
} // CMyComputerComponent::Command()
|
|
|
|
HRESULT CMyComputerComponent::OnNotifySelect( LPDATAOBJECT lpDataObject, BOOL /*fSelected*/ )
|
|
{
|
|
MFC_TRY;
|
|
|
|
TRACE_METHOD(CMyComputerComponent,OnNotifySelect);
|
|
TEST_NONNULL_PTR_PARAM(lpDataObject);
|
|
|
|
CCookie* pBaseParentCookie = NULL;
|
|
HRESULT hr = ExtractData( lpDataObject,
|
|
CMyComputerDataObject::m_CFRawCookie,
|
|
reinterpret_cast<PBYTE>(&pBaseParentCookie),
|
|
sizeof(pBaseParentCookie) );
|
|
if ( FAILED(hr) )
|
|
{
|
|
ASSERT(FALSE);
|
|
return S_OK;
|
|
}
|
|
CMyComputerCookie* pCookie = QueryComponentDataRef().ActiveCookie(pBaseParentCookie);
|
|
if (NULL == pCookie)
|
|
{
|
|
ASSERT(FALSE);
|
|
return S_OK;
|
|
}
|
|
|
|
// Set the default verb to display the properties of the selected object
|
|
// We do this so that extensions can add properties, we don't have any
|
|
m_pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES,
|
|
ENABLED,
|
|
(MYCOMPUT_COMPUTER == pCookie->m_objecttype) );
|
|
|
|
m_pConsoleVerb->SetDefaultVerb(MMC_VERB_OPEN);
|
|
|
|
return S_OK;
|
|
MFC_CATCH;
|
|
}
|
|
|
|
STDMETHODIMP CMyComputerComponent::GetResultViewType(
|
|
MMC_COOKIE cookie,
|
|
LPOLESTR* ppViewType,
|
|
long* pViewOptions)
|
|
{
|
|
MFC_TRY;
|
|
if ( QueryComponentDataRef ().m_bMessageView )
|
|
{
|
|
m_bForcingGetResultType = false;
|
|
*pViewOptions = MMC_VIEW_OPTIONS_NOLISTVIEWS;
|
|
|
|
LPOLESTR psz = NULL;
|
|
StringFromCLSID(CLSID_MessageView, &psz);
|
|
|
|
USES_CONVERSION;
|
|
|
|
if (psz != NULL)
|
|
{
|
|
*ppViewType = psz;
|
|
return S_OK;
|
|
}
|
|
else
|
|
return S_FALSE;
|
|
}
|
|
else
|
|
return CComponent::GetResultViewType( cookie, ppViewType, pViewOptions );
|
|
MFC_CATCH;
|
|
}
|
|
|
|
HRESULT CMyComputerComponent::OnViewChange (LPDATAOBJECT /*pDataObject*/, LPARAM /*data*/, LPARAM hint)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
if ( (HINT_SELECT_ROOT_NODE & hint) )
|
|
{
|
|
hr = m_pConsole->SelectScopeItem (QueryComponentDataRef().QueryRootCookie().m_hScopeItem);
|
|
}
|
|
|
|
return hr;
|
|
}
|