1368 lines
43 KiB
C++
1368 lines
43 KiB
C++
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 2001.
|
||
|
//
|
||
|
// File: Mngrfldr.cpp
|
||
|
//
|
||
|
// Contents: Wireless Policy Snapin - Policy Main Page Manager.
|
||
|
//
|
||
|
//
|
||
|
// History: TaroonM
|
||
|
// 10/30/01
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
|
||
|
|
||
|
|
||
|
// #include "lm.h"
|
||
|
#include "dsgetdc.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
#define RESULTVIEW_COLUMN_COUNT 3
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// class CWirelessManagerFolder - represents the MMC scope view item
|
||
|
|
||
|
CWirelessManagerFolder::CWirelessManagerFolder () :
|
||
|
m_bEnumerated( FALSE ),
|
||
|
m_pExtScopeObject( NULL ),
|
||
|
m_ptszResultDisplayName( NULL ),
|
||
|
m_dwSortOrder( 0 ), // default is 0, else RSI_DESCENDING
|
||
|
m_nSortColumn( 0 ),
|
||
|
m_dwNumPolItems( 1 )
|
||
|
{
|
||
|
// INTERNALCookie( (LONG_PTR)this );
|
||
|
ZeroMemory( &m_ScopeItem, sizeof( SCOPEDATAITEM ) );
|
||
|
|
||
|
m_bLocationPageOk = TRUE;
|
||
|
m_bScopeItemInserted = FALSE;
|
||
|
}
|
||
|
|
||
|
CWirelessManagerFolder::~CWirelessManagerFolder ()
|
||
|
{
|
||
|
DELETE_OBJECT(m_ptszResultDisplayName);
|
||
|
|
||
|
// No need to release since we never did an AddRef
|
||
|
m_pExtScopeObject = NULL;
|
||
|
|
||
|
}
|
||
|
|
||
|
void CWirelessManagerFolder::SetNodeNameByLocation()
|
||
|
{
|
||
|
// Construct display name. Assume this doesn't change during a single
|
||
|
// invocation of this snap-in????
|
||
|
|
||
|
CString nodeName;
|
||
|
CString nodeNameOn;
|
||
|
|
||
|
// If this folder is being asked for scope info, it better know
|
||
|
// where ComponentData is.
|
||
|
ASSERT( NULL != m_pComponentDataImpl );
|
||
|
|
||
|
// Concatenate a string containing the location of this node
|
||
|
switch (m_pComponentDataImpl->EnumLocation())
|
||
|
{
|
||
|
case LOCATION_REMOTE:
|
||
|
{
|
||
|
nodeNameOn = L"\\\\";
|
||
|
nodeNameOn += m_pComponentDataImpl->RemoteMachineName ();
|
||
|
break;
|
||
|
}
|
||
|
case LOCATION_GLOBAL:
|
||
|
{
|
||
|
nodeNameOn.LoadString (IDS_NODENAME_GLOBAL);
|
||
|
|
||
|
if (m_pComponentDataImpl->RemoteMachineName().GetLength() > 0)
|
||
|
{
|
||
|
nodeNameOn += L" (";
|
||
|
nodeNameOn += m_pComponentDataImpl->RemoteMachineName();
|
||
|
nodeNameOn += L")";
|
||
|
}
|
||
|
|
||
|
// TODO: concider using this code to display the dns domain name
|
||
|
// even when not specified. Unfortunately MMC stashes this in the
|
||
|
// .MSC file IN IT'S OWN SECTION and uses it when the node is
|
||
|
// first displayed. So it would be incorrect until the snapin
|
||
|
// was loaded and had a chance to change it (assuming the .MSC file
|
||
|
// was created in a different domain). So for now we don't do this
|
||
|
/*
|
||
|
// let them know which (DNS domain name) is
|
||
|
// being used
|
||
|
PDOMAIN_CONTROLLER_INFO pDomainControllerInfo = NULL;
|
||
|
DWORD Flags = DS_DIRECTORY_SERVICE_REQUIRED | DS_RETURN_DNS_NAME | DS_FORCE_REDISCOVERY;
|
||
|
DWORD dwStatus = DsGetDcName(NULL,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
Flags,
|
||
|
&pDomainControllerInfo
|
||
|
) ;
|
||
|
if (dwStatus == NO_ERROR)
|
||
|
{
|
||
|
nodeNameOn += L" (";
|
||
|
nodeNameOn += pDomainControllerInfo->DomainName;
|
||
|
nodeNameOn += L")";
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
default:
|
||
|
{
|
||
|
nodeNameOn.LoadString (IDS_NODENAME_GLOBAL);
|
||
|
|
||
|
if (m_pComponentDataImpl->RemoteMachineName().GetLength() > 0)
|
||
|
{
|
||
|
nodeNameOn += L" (";
|
||
|
nodeNameOn += m_pComponentDataImpl->RemoteMachineName();
|
||
|
nodeNameOn += L")";
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
// nodeName has a %s in it, which is where nodeNameOn goes
|
||
|
nodeName.LoadString (IDS_NODENAME_BASE);
|
||
|
//nodeName.FormatMessage (IDS_NODENAME_BASE ,nodeNameOn);
|
||
|
// nodeName += nodeNameOn;
|
||
|
|
||
|
OPT_TRACE(_T("CWirelessManagerFolder::Initialize(%p) created node name-%s\n"), this, (LPCTSTR)nodeName);
|
||
|
|
||
|
// store name in our dataobject
|
||
|
NodeName( nodeName );
|
||
|
}
|
||
|
|
||
|
void CWirelessManagerFolder::Initialize
|
||
|
(
|
||
|
CComponentDataImpl* pComponentDataImpl,
|
||
|
CComponentImpl* pComponentImpl,
|
||
|
int nImage,
|
||
|
int nOpenImage,
|
||
|
BOOL bHasChildrenBox
|
||
|
)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
|
||
|
// call base class initializer
|
||
|
CSnapObject::Initialize( pComponentDataImpl, pComponentImpl, FALSE );
|
||
|
|
||
|
ZeroMemory( &m_ScopeItem, sizeof( SCOPEDATAITEM ) );
|
||
|
GetScopeItem()->mask = SDI_STR;
|
||
|
GetScopeItem()->displayname = (unsigned short*)(-1);
|
||
|
|
||
|
// Add close image
|
||
|
GetScopeItem()->mask |= SDI_IMAGE;
|
||
|
GetScopeItem()->nImage = nImage;
|
||
|
|
||
|
// Add open image
|
||
|
GetScopeItem()->mask |= SDI_OPENIMAGE;
|
||
|
GetScopeItem()->nOpenImage = nOpenImage;
|
||
|
|
||
|
// TODO: folder children flag needs to be dynamic based on actual children (PS: it doesn't work anyway!?)
|
||
|
// Add button to node if the folder has children
|
||
|
if (bHasChildrenBox)
|
||
|
{
|
||
|
GetScopeItem()->mask |= SDI_CHILDREN;
|
||
|
GetScopeItem()->cChildren = 1;
|
||
|
}
|
||
|
|
||
|
ASSERT( NodeName().IsEmpty() ); // there should be no name since we are initializing
|
||
|
|
||
|
// get our default node name set
|
||
|
SetNodeNameByLocation ();
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// handle IExtendContextMenu
|
||
|
STDMETHODIMP CWirelessManagerFolder::AddMenuItems
|
||
|
(
|
||
|
LPCONTEXTMENUCALLBACK pContextMenuCallback,
|
||
|
long *pInsertionAllowed
|
||
|
)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
CONTEXTMENUITEM mItem;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if ( m_pComponentDataImpl->IsRsop() )
|
||
|
{
|
||
|
//do not need any context menu for rsop mode
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//if we haven't open the storage yet, don't show the context menus
|
||
|
if (NULL == m_pComponentDataImpl->GetPolicyStoreHandle())
|
||
|
{
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
LONG lFlags = 0;
|
||
|
|
||
|
if (*pInsertionAllowed & CCM_INSERTIONALLOWED_TOP && (m_dwNumPolItems == 0))
|
||
|
{
|
||
|
CString strMenuText;
|
||
|
CString strMenuDescription;
|
||
|
|
||
|
// create policy
|
||
|
strMenuText.LoadString (IDS_MENUTEXT_CREATENEWSECPOL);
|
||
|
strMenuDescription.LoadString (IDS_MENUDESCRIPTION_CREATENEWSECPOL);
|
||
|
CONFIGUREITEM (mItem, strMenuText, strMenuDescription, IDM_CREATENEWSECPOL, CCM_INSERTIONPOINTID_PRIMARY_TOP, lFlags, 0);
|
||
|
hr &= pContextMenuCallback->AddItem(&mItem);
|
||
|
ASSERT(hr == S_OK);
|
||
|
|
||
|
}
|
||
|
|
||
|
if (*pInsertionAllowed & CCM_INSERTIONALLOWED_NEW && (m_dwNumPolItems == 0))
|
||
|
{
|
||
|
CString strMenuText;
|
||
|
CString strMenuDescription;
|
||
|
|
||
|
// Vbug 25 indicates that all _TOP menu options must ALSO be added under TASK or NEW:
|
||
|
|
||
|
// create policy
|
||
|
strMenuText.LoadString (IDS_MENUTEXT_CREATENEWSECPOL);
|
||
|
strMenuDescription.LoadString (IDS_MENUDESCRIPTION_CREATENEWSECPOL);
|
||
|
CONFIGUREITEM (mItem, strMenuText, strMenuDescription, IDM_CREATENEWSECPOL, CCM_INSERTIONPOINTID_PRIMARY_TASK, lFlags, 0);
|
||
|
hr = pContextMenuCallback->AddItem(&mItem);
|
||
|
ASSERT(hr == S_OK);
|
||
|
}
|
||
|
|
||
|
if (*pInsertionAllowed & CCM_INSERTIONALLOWED_TASK)
|
||
|
{
|
||
|
CString strMenuText;
|
||
|
CString strMenuDescription;
|
||
|
|
||
|
// Vbug 25 indicates that all _TOP menu options must ALSO be added under TASK or NEW:
|
||
|
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP_(BOOL) CWirelessManagerFolder::UpdateToolbarButton(
|
||
|
UINT id, // button ID
|
||
|
BOOL bSnapObjSelected, // ==TRUE when result/scope item is selected
|
||
|
BYTE fsState ) // enable/disable this button state by returning TRUE/FALSE
|
||
|
{
|
||
|
if ( m_pComponentDataImpl->IsRsop() && ( IDM_CREATENEWSECPOL == id ) )
|
||
|
return FALSE;
|
||
|
|
||
|
// GPO Change stuff
|
||
|
if ((m_dwNumPolItems > 0) && (IDM_CREATENEWSECPOL == id))
|
||
|
return FALSE;
|
||
|
|
||
|
if ((fsState == ENABLED) && m_pComponentDataImpl->GetPolicyStoreHandle())
|
||
|
return TRUE;
|
||
|
if ((fsState == INDETERMINATE) && NULL == m_pComponentDataImpl->GetPolicyStoreHandle())
|
||
|
return TRUE;
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CWirelessManagerFolder::Command
|
||
|
(
|
||
|
long lCommandID,
|
||
|
IConsoleNameSpace *pNameSpace
|
||
|
)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
|
||
|
HRESULT hrReturn = S_OK;
|
||
|
|
||
|
DWORD dwError = ERROR_SUCCESS;
|
||
|
|
||
|
//
|
||
|
// You can always talk to storage
|
||
|
//
|
||
|
|
||
|
switch (lCommandID)
|
||
|
{
|
||
|
case IDM_CREATENEWSECPOL:
|
||
|
{
|
||
|
// get a name for our new security policy
|
||
|
CString strUName;
|
||
|
DWORD dwError = 0;
|
||
|
GenerateUniqueSecPolicyName (strUName, IDS_NEWWIRELESSPOLICYNAME);
|
||
|
|
||
|
PWIRELESS_POLICY_DATA pPolicy = NULL;
|
||
|
hrReturn = CreateWirelessPolicyDataBuffer(&pPolicy);
|
||
|
if (FAILED(hrReturn))
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
pPolicy->pszWirelessName = AllocPolStr(strUName);
|
||
|
pPolicy->pszOldWirelessName = NULL;
|
||
|
|
||
|
// create the new wireless policy item
|
||
|
CComObject <CSecPolItem> * pNewPolItem;
|
||
|
CComObject <CSecPolItem>::CreateInstance(&pNewPolItem);
|
||
|
if (NULL == pNewPolItem)
|
||
|
{
|
||
|
FreeWirelessPolicyData(pPolicy);
|
||
|
return E_OUTOFMEMORY;
|
||
|
}
|
||
|
|
||
|
//Add ref to control the life time of the object
|
||
|
pNewPolItem->AddRef();
|
||
|
|
||
|
// initialize our new item
|
||
|
|
||
|
|
||
|
pNewPolItem->Initialize (
|
||
|
pPolicy,
|
||
|
m_pComponentDataImpl,
|
||
|
m_pComponentImpl,
|
||
|
TRUE);
|
||
|
|
||
|
// Force the properties of the new item to display.
|
||
|
//
|
||
|
// Note: This must be a wizard because other code assumes it is so:
|
||
|
// 1. If this is ever changed to add a policy without using the wizard,
|
||
|
// CSecPolRulesPage::OnCancel() must be modified to distinguish between
|
||
|
// the sheet which adds the policy, and the sheet which is displayed
|
||
|
// after the wizard Finishes.
|
||
|
//
|
||
|
// 2. ForcePropertiesDisplay returns 1 for cancel ONLY on wizard.
|
||
|
HRESULT hr = pNewPolItem->DisplaySecPolProperties (strUName);
|
||
|
|
||
|
if (S_OK == hr)
|
||
|
{
|
||
|
hrReturn = CreateWirelessPolicy(pPolicy);
|
||
|
|
||
|
if (FAILED(hrReturn))
|
||
|
{
|
||
|
ReportError(IDS_SAVE_ERROR, hrReturn);
|
||
|
dwError = 1;
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pComponentDataImpl->GetConsole()->UpdateAllViews( this, 0,0 );
|
||
|
|
||
|
if (pNewPolItem->IsPropertyChangeHookEnabled())
|
||
|
{
|
||
|
pNewPolItem->EnablePropertyChangeHook(FALSE);
|
||
|
pNewPolItem->DoPropertyChangeHook();
|
||
|
}
|
||
|
}
|
||
|
} else
|
||
|
{
|
||
|
dwError = 1;
|
||
|
}
|
||
|
|
||
|
pNewPolItem->Release();
|
||
|
|
||
|
// GPO Change :
|
||
|
//
|
||
|
// inform GPE that the policy has been added or deleted
|
||
|
//
|
||
|
//
|
||
|
if (dwError) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
GUID guidClientExt = CLSID_WIRELESSClientEx;
|
||
|
GUID guidSnapin = CLSID_Snapin;
|
||
|
|
||
|
m_pComponentDataImpl->UseGPEInformationInterface()->PolicyChanged (
|
||
|
TRUE,
|
||
|
TRUE,
|
||
|
&guidClientExt,
|
||
|
&guidSnapin
|
||
|
);
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
default:
|
||
|
hrReturn = S_FALSE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// S_FALSE if we didn't handle command
|
||
|
return hrReturn;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CWirelessManagerFolder::QueryPagesFor( void )
|
||
|
{
|
||
|
// we only want to display the location page once
|
||
|
HRESULT hr = E_UNEXPECTED;
|
||
|
if (m_bLocationPageOk)
|
||
|
{
|
||
|
// display our locations dialog via this
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
// Notify helper
|
||
|
STDMETHODIMP CWirelessManagerFolder::OnPropertyChange(LPARAM lParam, LPCONSOLE pConsole )
|
||
|
{
|
||
|
if (NULL != lParam)
|
||
|
{
|
||
|
// If lParam knows about our internal interface, let it handle this event
|
||
|
CComQIPtr<IWirelessSnapInDataObject, &IID_IWirelessSnapInDataObject>
|
||
|
spData( (LPUNKNOWN)lParam );
|
||
|
if (spData != NULL)
|
||
|
{
|
||
|
return spData->Notify( MMCN_PROPERTY_CHANGE, 0, 0, FALSE, pConsole, NULL /* IHeaderCtrl* */ );
|
||
|
}
|
||
|
}
|
||
|
// call base class
|
||
|
return CWirelessSnapInDataObjectImpl<CWirelessManagerFolder>::OnPropertyChange( lParam, pConsole );
|
||
|
}
|
||
|
|
||
|
// let us know when we are 'bout to go away
|
||
|
STDMETHODIMP CWirelessManagerFolder::Destroy ( void )
|
||
|
{
|
||
|
// nothing to say about the destroy
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
// handle IComponent and IComponentData
|
||
|
STDMETHODIMP CWirelessManagerFolder::Notify
|
||
|
(
|
||
|
MMC_NOTIFY_TYPE event,
|
||
|
LPARAM arg,
|
||
|
LPARAM param,
|
||
|
BOOL bComponentData, // TRUE when caller is IComponentData
|
||
|
IConsole *pConsole,
|
||
|
IHeaderCtrl *pHeader
|
||
|
)
|
||
|
{
|
||
|
#ifdef DO_TRACE
|
||
|
OPT_TRACE(_T("CWirelessManagerFolder::Notify this-%p "), this);
|
||
|
switch (event)
|
||
|
{
|
||
|
case MMCN_ACTIVATE:
|
||
|
OPT_TRACE(_T("MMCN_ACTIVATE\n"));
|
||
|
break;
|
||
|
case MMCN_ADD_IMAGES:
|
||
|
OPT_TRACE(_T("MMCN_ADD_IMAGES\n"));
|
||
|
break;
|
||
|
case MMCN_BTN_CLICK:
|
||
|
OPT_TRACE(_T("MMCN_BTN_CLICK\n"));
|
||
|
break;
|
||
|
case MMCN_CLICK:
|
||
|
OPT_TRACE(_T("MMCN_CLICK\n"));
|
||
|
break;
|
||
|
case MMCN_COLUMN_CLICK:
|
||
|
OPT_TRACE(_T("MMCN_COLUMN_CLICK\n"));
|
||
|
break;
|
||
|
case MMCN_CONTEXTMENU:
|
||
|
OPT_TRACE(_T("MMCN_CONTEXTMENU\n"));
|
||
|
break;
|
||
|
case MMCN_CUTORMOVE:
|
||
|
OPT_TRACE(_T("MMCN_CUTORMOVE\n"));
|
||
|
break;
|
||
|
case MMCN_DELETE:
|
||
|
OPT_TRACE(_T("MMCN_DELETE\n"));
|
||
|
break;
|
||
|
case MMCN_DESELECT_ALL:
|
||
|
OPT_TRACE(_T("MMCN_DESELECT_ALL\n"));
|
||
|
break;
|
||
|
case MMCN_EXPAND:
|
||
|
OPT_TRACE(_T("MMCN_EXPAND\n"));
|
||
|
break;
|
||
|
case MMCN_HELP:
|
||
|
OPT_TRACE(_T("MMCN_HELP\n"));
|
||
|
break;
|
||
|
case MMCN_MENU_BTNCLICK:
|
||
|
OPT_TRACE(_T("MMCN_MENU_BTNCLICK\n"));
|
||
|
break;
|
||
|
case MMCN_MINIMIZED:
|
||
|
OPT_TRACE(_T("MMCN_MINIMIZED\n"));
|
||
|
break;
|
||
|
case MMCN_PASTE:
|
||
|
OPT_TRACE(_T("MMCN_PASTE\n"));
|
||
|
break;
|
||
|
case MMCN_PROPERTY_CHANGE:
|
||
|
OPT_TRACE(_T("MMCN_PROPERTY_CHANGE\n"));
|
||
|
break;
|
||
|
case MMCN_QUERY_PASTE:
|
||
|
OPT_TRACE(_T("MMCN_QUERY_PASTE\n"));
|
||
|
break;
|
||
|
case MMCN_REFRESH:
|
||
|
OPT_TRACE(_T("MMCN_REFRESH\n"));
|
||
|
break;
|
||
|
case MMCN_REMOVE_CHILDREN:
|
||
|
OPT_TRACE(_T("MMCN_REMOVE_CHILDREN\n"));
|
||
|
break;
|
||
|
case MMCN_RENAME:
|
||
|
OPT_TRACE(_T("MMCN_RENAME\n"));
|
||
|
break;
|
||
|
case MMCN_SELECT:
|
||
|
OPT_TRACE(_T("MMCN_SELECT\n"));
|
||
|
break;
|
||
|
case MMCN_SHOW:
|
||
|
OPT_TRACE(_T("MMCN_SHOW\n"));
|
||
|
break;
|
||
|
case MMCN_VIEW_CHANGE:
|
||
|
OPT_TRACE(_T("MMCN_VIEW_CHANGE\n"));
|
||
|
break;
|
||
|
case MMCN_SNAPINHELP:
|
||
|
OPT_TRACE(_T("MMCN_SNAPINHELP\n"));
|
||
|
break;
|
||
|
case MMCN_CONTEXTHELP:
|
||
|
OPT_TRACE(_T("MMCN_CONTEXTHELP\n"));
|
||
|
break;
|
||
|
case MMCN_INITOCX:
|
||
|
OPT_TRACE(_T("MMCN_INITOCX\n"));
|
||
|
break;
|
||
|
case MMCN_FILTER_CHANGE:
|
||
|
OPT_TRACE(_T("MMCN_FILTER_CHANGE\n"));
|
||
|
break;
|
||
|
default:
|
||
|
OPT_TRACE(_T("Unknown event\n"));
|
||
|
break;
|
||
|
}
|
||
|
#endif //#ifdef DO_TRACE
|
||
|
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
HRESULT hr = S_FALSE;
|
||
|
|
||
|
// handle the event
|
||
|
switch(event)
|
||
|
{
|
||
|
case MMCN_CONTEXTHELP:
|
||
|
{
|
||
|
CComQIPtr <IDisplayHelp, &IID_IDisplayHelp> pDisplayHelp ( pConsole );
|
||
|
ASSERT( pDisplayHelp != NULL );
|
||
|
if (pDisplayHelp)
|
||
|
{
|
||
|
// need to form a complete path to the .chm file
|
||
|
CString s, s2;
|
||
|
s.LoadString(IDS_HELPCONCEPTSFILE);
|
||
|
DWORD dw = ExpandEnvironmentStrings (s, s2.GetBuffer (512), 512);
|
||
|
s2.ReleaseBuffer (-1);
|
||
|
if ((dw == 0) || (dw > 512))
|
||
|
{
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
pDisplayHelp->ShowTopic(s2.GetBuffer(512));
|
||
|
s2.ReleaseBuffer (-1);
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case MMCN_SELECT:
|
||
|
{
|
||
|
BOOL bSelect = (BOOL) HIWORD(arg);
|
||
|
|
||
|
if (bSelect)
|
||
|
{
|
||
|
// Obtain IConsoleVerb from console
|
||
|
CComPtr<IConsoleVerb> spVerb;
|
||
|
pConsole->QueryConsoleVerb( &spVerb );
|
||
|
|
||
|
// call object to set verb state
|
||
|
AdjustVerbState( (IConsoleVerb*)spVerb );
|
||
|
}
|
||
|
hr = S_OK;
|
||
|
break;
|
||
|
}
|
||
|
case MMCN_SHOW:
|
||
|
{
|
||
|
// Note - arg is TRUE when it is time to enumerate
|
||
|
if (arg == TRUE)
|
||
|
{
|
||
|
CWaitCursor waitCursor; // turn on the hourglass
|
||
|
|
||
|
CComQIPtr <IResultData, &IID_IResultData> pResultData( pConsole );
|
||
|
ASSERT( pResultData != NULL );
|
||
|
|
||
|
|
||
|
ASSERT( pHeader != NULL );
|
||
|
SetHeaders( pHeader, pResultData );
|
||
|
|
||
|
//$review sometimes the MMCN_SELECT was not sent to the snapin when the node
|
||
|
//is selected, use MMCN_SHOW to adjustverbstate instead
|
||
|
CComPtr<IConsoleVerb> spVerb;
|
||
|
pConsole->QueryConsoleVerb( &spVerb );
|
||
|
AdjustVerbState((IConsoleVerb*)spVerb);
|
||
|
|
||
|
// enumerate result items in that Folder
|
||
|
EnumerateResults( pResultData, m_nSortColumn, m_dwSortOrder );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// TODO: free data associated with the result pane items, because
|
||
|
// TODO: your node is no longer being displayed (??)
|
||
|
|
||
|
CComQIPtr <IResultData, &IID_IResultData> pResultData( pConsole );
|
||
|
ASSERT( pResultData != NULL );
|
||
|
|
||
|
// if we have a handle to the pResultData
|
||
|
if (pResultData)
|
||
|
{
|
||
|
// zip through and free off any result items we have laying around
|
||
|
RESULTDATAITEM resultItem;
|
||
|
ZeroMemory(&resultItem, sizeof(resultItem));
|
||
|
resultItem.mask = RDI_PARAM | RDI_STATE;
|
||
|
resultItem.nIndex = -1;
|
||
|
resultItem.nState = LVNI_ALL;
|
||
|
HRESULT hr;
|
||
|
do
|
||
|
{
|
||
|
hr = pResultData->GetNextItem (&resultItem);
|
||
|
if (hr == S_OK)
|
||
|
{
|
||
|
// free it off
|
||
|
// if it ain't the right type of object we'll leak it
|
||
|
IUnknown* pUnk = (IUnknown*)resultItem.lParam;
|
||
|
ASSERT (pUnk);
|
||
|
if (pUnk)
|
||
|
{
|
||
|
CComQIPtr<IWirelessSnapInDataObject, &IID_IWirelessSnapInDataObject> spData( pUnk );
|
||
|
if (spData)
|
||
|
{
|
||
|
// release it in prep for tossing all the objects
|
||
|
spData.Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
} while (hr == S_OK);
|
||
|
|
||
|
// now release this handle to their interface
|
||
|
// m_pResultData->Release();
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// NOTE: but the following, found in the sample snapin at this point,
|
||
|
// NOTE: conflicted with my above comment...
|
||
|
// Note: The console will remove the items from the result pane
|
||
|
}
|
||
|
return S_OK;
|
||
|
}
|
||
|
case MMCN_PROPERTY_CHANGE:
|
||
|
{
|
||
|
hr = OnPropertyChange( param, pConsole );
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
case MMCN_DELETE:
|
||
|
{
|
||
|
CThemeContextActivator activator;
|
||
|
// delete the item
|
||
|
if (AfxMessageBox (IDS_SUREYESNO, MB_YESNO | MB_DEFBUTTON2) == IDYES)
|
||
|
{
|
||
|
hr = OnDelete( arg, param );
|
||
|
if (S_OK == hr)
|
||
|
{
|
||
|
// CAN'T DO THIS ON A STRICTLY SCOPE DELETE
|
||
|
/*
|
||
|
// find reference to the parent (get pDataObject of parent)
|
||
|
SCOPEDATAITEM parentScopeDataItem;
|
||
|
parentScopeDataItem.ID = m_pScopeItem->relativeID;
|
||
|
parentScopeDataItem.mask = RDI_STR | RDI_PARAM | RDI_INDEX;
|
||
|
hr = m_pComponentDataImpl->GetConsoleNameSpace()->GetItem (&parentScopeDataItem);
|
||
|
ASSERT (SUCCEEDED(hr));
|
||
|
CSnapFolder* pParentFolder = reinterpret_cast<CSnapFolder*>(parentScopeDataItem.lParam);
|
||
|
|
||
|
// now tell the parent to refresh
|
||
|
pParentFolder->ForceRefresh (NULL);
|
||
|
*/
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case MMCN_REMOVE_CHILDREN:
|
||
|
{
|
||
|
SetEnumerated(FALSE);
|
||
|
m_bScopeItemInserted = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
case MMCN_RENAME:
|
||
|
{
|
||
|
hr = OnRename (arg, param);
|
||
|
break;
|
||
|
}
|
||
|
case MMCN_EXPAND:
|
||
|
{
|
||
|
if (arg == TRUE)
|
||
|
{
|
||
|
// TODO: if this is the root node this is our chance to save off the HSCOPEITEM of roots parent
|
||
|
//if (pInternal->m_cookie == NULL)
|
||
|
// m_pRootFolderScopeItem = pParent;
|
||
|
|
||
|
CComQIPtr <IConsoleNameSpace, &IID_IConsoleNameSpace> spConsoleNameSpace( pConsole );
|
||
|
// tell this folder to enumerate itself to the scope pane
|
||
|
OnScopeExpand( (IConsoleNameSpace*)spConsoleNameSpace, param );
|
||
|
|
||
|
hr = S_OK;
|
||
|
} else
|
||
|
{
|
||
|
// TODO: handle MMCN_EXPAND arg == FALSE
|
||
|
ASSERT (0);
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
case MMCN_VIEW_CHANGE:
|
||
|
{
|
||
|
// Obtain IResultData
|
||
|
CComQIPtr <IResultData, &IID_IResultData> pResultData( pConsole );
|
||
|
ASSERT( pResultData != NULL );
|
||
|
|
||
|
// Hint contains sort info, save it for calls to EnumerateResults
|
||
|
m_nSortColumn = LOWORD( param );
|
||
|
m_dwSortOrder = HIWORD( param );
|
||
|
|
||
|
ASSERT( RESULTVIEW_COLUMN_COUNT > m_nSortColumn );
|
||
|
ASSERT( 0 == m_dwSortOrder || RSI_DESCENDING == m_dwSortOrder );
|
||
|
|
||
|
ForceRefresh( pResultData );
|
||
|
break;
|
||
|
}
|
||
|
case MMCN_REFRESH:
|
||
|
{
|
||
|
// reset the reconnect flag
|
||
|
m_pComponentDataImpl->m_bAttemptReconnect = TRUE;
|
||
|
|
||
|
// Cause result pane to refresh its policy list
|
||
|
hr = pConsole->UpdateAllViews( this, 0, 0 );
|
||
|
ASSERT(hr == S_OK);
|
||
|
break;
|
||
|
}
|
||
|
case MMCN_ADD_IMAGES:
|
||
|
{
|
||
|
// Obtain IImageList from console
|
||
|
CComPtr<IImageList> spImage;
|
||
|
HRESULT hr = pConsole->QueryResultImageList( &spImage );
|
||
|
ASSERT(hr == S_OK);
|
||
|
|
||
|
OnAddImages( arg, param, (IImageList*)spImage );
|
||
|
hr = S_OK;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
// handle IComponent
|
||
|
STDMETHODIMP CWirelessManagerFolder::GetResultDisplayInfo( RESULTDATAITEM *pResultDataItem )
|
||
|
{
|
||
|
TCHAR *temp = NULL;
|
||
|
DWORD dwError = S_OK;
|
||
|
|
||
|
OPT_TRACE(_T("CWirelessManagerFolder::GetResultDisplayInfo this-%p\n"), this);
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
|
||
|
// We should be here only if we are loaded as an extension snap-in.
|
||
|
ASSERT( NULL != GetExtScopeObject() );
|
||
|
|
||
|
// are they looking for the image?
|
||
|
if (pResultDataItem->mask & RDI_IMAGE)
|
||
|
{
|
||
|
pResultDataItem->nImage = GetScopeItem()->nImage;
|
||
|
OPT_TRACE(_T(" returning image[%i]\n"), GetScopeItem()->nImage);
|
||
|
}
|
||
|
|
||
|
// are they looking for a string?
|
||
|
if (pResultDataItem->mask & RDI_STR)
|
||
|
{
|
||
|
// which column?
|
||
|
switch (pResultDataItem->nCol)
|
||
|
{
|
||
|
case 0:
|
||
|
// node name
|
||
|
temp = (TCHAR*)realloc( m_ptszResultDisplayName, (NodeName().GetLength()+1)*sizeof(TCHAR) );
|
||
|
if (temp != NULL)
|
||
|
{
|
||
|
m_ptszResultDisplayName = temp;
|
||
|
lstrcpy (m_ptszResultDisplayName, NodeName().GetBuffer(20));
|
||
|
} else
|
||
|
{
|
||
|
dwError = GetLastError();
|
||
|
}
|
||
|
NodeName().ReleaseBuffer(-1);
|
||
|
pResultDataItem->str = m_ptszResultDisplayName;
|
||
|
OPT_TRACE(_T(" returning node name-%s\n"), m_ptszResultDisplayName);
|
||
|
break;
|
||
|
case 1:
|
||
|
{
|
||
|
// node description
|
||
|
CString strDescription;
|
||
|
strDescription.LoadString (IDS_DESCRIPTION);
|
||
|
temp = (TCHAR*) realloc (m_ptszResultDisplayName, (strDescription.GetLength()+1)*sizeof(TCHAR));
|
||
|
if (temp != NULL)
|
||
|
{
|
||
|
m_ptszResultDisplayName = temp;
|
||
|
lstrcpy (m_ptszResultDisplayName, strDescription.GetBuffer(20));
|
||
|
} else
|
||
|
{
|
||
|
dwError = GetLastError();
|
||
|
}
|
||
|
strDescription.ReleaseBuffer(-1);
|
||
|
pResultDataItem->str = m_ptszResultDisplayName;
|
||
|
OPT_TRACE(_T(" returning node description-%s\n"), m_ptszResultDisplayName);
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
pResultDataItem->str = (LPOLESTR)_T("");
|
||
|
OPT_TRACE(_T(" returning NULL string\n"));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return HRESULT_FROM_WIN32(dwError);
|
||
|
}
|
||
|
|
||
|
// handle IComponentData
|
||
|
STDMETHODIMP CWirelessManagerFolder::GetScopeDisplayInfo( SCOPEDATAITEM *pScopeDataItem )
|
||
|
{
|
||
|
OPT_TRACE(_T("CWirelessManagerFolder::GetScopeDisplayInfo SCOPEDATAITEM.lParam-%p\n"), pScopeDataItem->lParam);
|
||
|
if (pScopeDataItem->mask & SDI_STR)
|
||
|
{
|
||
|
ASSERT( NodeName().GetLength() );
|
||
|
OPT_TRACE(_T(" display string-%s\n"), (LPCTSTR)NodeName());
|
||
|
// return display string
|
||
|
pScopeDataItem->displayname = (LPTSTR)(LPCTSTR)NodeName();
|
||
|
}
|
||
|
if (pScopeDataItem->mask & SDI_IMAGE)
|
||
|
pScopeDataItem->nImage = GetScopeItem()->nImage;
|
||
|
if (pScopeDataItem->mask & SDI_OPENIMAGE)
|
||
|
pScopeDataItem->nOpenImage = GetScopeItem()->nOpenImage;
|
||
|
if (pScopeDataItem->mask & SDI_CHILDREN)
|
||
|
pScopeDataItem->cChildren = 0; // WIFI mgr is always a scope leaf node
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
// IWirelessSnapInData
|
||
|
STDMETHODIMP CWirelessManagerFolder::GetScopeData( SCOPEDATAITEM **ppScopeDataItem )
|
||
|
{
|
||
|
ASSERT( NULL == ppScopeDataItem );
|
||
|
|
||
|
if (NULL == ppScopeDataItem)
|
||
|
return E_INVALIDARG;
|
||
|
*ppScopeDataItem = GetScopeItem();
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CWirelessManagerFolder::GetGuidForCompare( GUID *pGuid )
|
||
|
{
|
||
|
return E_UNEXPECTED;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CWirelessManagerFolder::AdjustVerbState (LPCONSOLEVERB pConsoleVerb)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
// Don't need to call base class, it disables REFRESH
|
||
|
if ( m_pComponentDataImpl->IsRsop() ) {
|
||
|
hr = pConsoleVerb->SetVerbState(MMC_VERB_REFRESH, HIDDEN, TRUE);
|
||
|
} else {
|
||
|
// Enable refresh
|
||
|
hr = pConsoleVerb->SetVerbState( MMC_VERB_REFRESH, HIDDEN, FALSE);
|
||
|
ASSERT (hr == S_OK);
|
||
|
hr = pConsoleVerb->SetVerbState( MMC_VERB_REFRESH, ENABLED, TRUE);
|
||
|
ASSERT (hr == S_OK);
|
||
|
}
|
||
|
|
||
|
// double make sure that properties is disabled
|
||
|
// (we don't ever enabled it but we have been seeing it work on some builds
|
||
|
// and not on others, i suspect this is an uninitialized variable in MMCland)
|
||
|
hr = pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, ENABLED, FALSE);
|
||
|
ASSERT (hr == S_OK);
|
||
|
hr = pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, HIDDEN, TRUE);
|
||
|
ASSERT (hr == S_OK);
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
void CWirelessManagerFolder::RemoveResultItem(LPUNKNOWN pUnkWalkingDead)
|
||
|
{
|
||
|
// free it off
|
||
|
// if it ain't the right type of object we'll leak it
|
||
|
ASSERT (pUnkWalkingDead);
|
||
|
if (pUnkWalkingDead)
|
||
|
{
|
||
|
CComQIPtr<IWirelessSnapInDataObject, &IID_IWirelessSnapInDataObject> spData( pUnkWalkingDead );
|
||
|
if (spData)
|
||
|
{
|
||
|
// release it in prep for tossing all the objects
|
||
|
spData.Release();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWirelessManagerFolder::EnumerateResults (
|
||
|
LPRESULTDATA pResult, int nSortColumn, DWORD dwSortOrder
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
DWORD i = 0;
|
||
|
HANDLE hPolicyStore = NULL;
|
||
|
PWIRELESS_POLICY_DATA pWirelessPolicyData = NULL;
|
||
|
PWIRELESS_POLICY_DATA pPolicy = NULL;
|
||
|
DWORD dwNumPolicyObjects = 0;
|
||
|
DWORD dwError = 0;
|
||
|
PWIRELESS_POLICY_DATA * ppWirelessPolicyData = NULL;
|
||
|
|
||
|
|
||
|
// Obtain storage containing policies
|
||
|
|
||
|
hPolicyStore = m_pComponentDataImpl->GetPolicyStoreHandle();
|
||
|
|
||
|
if (NULL == hPolicyStore)
|
||
|
return hr;
|
||
|
|
||
|
m_dwNumPolItems = 0;
|
||
|
dwError = WirelessEnumPolicyData(
|
||
|
hPolicyStore,
|
||
|
&ppWirelessPolicyData,
|
||
|
&dwNumPolicyObjects
|
||
|
);
|
||
|
/* Taroon BUG: Memory Leak.. Not freeing ppWirelessPolicyData*/
|
||
|
if ( dwError != ERROR_SUCCESS )
|
||
|
{
|
||
|
hr = HRESULT_FROM_WIN32(dwError);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < dwNumPolicyObjects; i++) {
|
||
|
|
||
|
// create a new CSecPolItem
|
||
|
|
||
|
pPolicy = *(ppWirelessPolicyData + i);
|
||
|
|
||
|
LPCSECPOLITEM pItem;
|
||
|
CComObject <CSecPolItem>::CreateInstance(&pItem);
|
||
|
|
||
|
// initialize the item
|
||
|
|
||
|
pItem->Initialize (pPolicy, m_pComponentDataImpl, m_pComponentImpl, FALSE);
|
||
|
|
||
|
pItem->GetResultItem()->mask |= RDI_PARAM;
|
||
|
pItem->GetResultItem()->lParam = (LPARAM) pItem;
|
||
|
OPT_TRACE(_T(" setting RESULTDATAITEM.lParam-%p\n"), pItem);
|
||
|
|
||
|
// QI to increment ref count
|
||
|
LPUNKNOWN pUnk;
|
||
|
hr = pItem->QueryInterface(IID_IUnknown, (void**)&pUnk);
|
||
|
ASSERT (hr == S_OK);
|
||
|
OPT_TRACE(_T(" QI on ComObject->IUnknown - %p->%p\n"), pItem, pUnk);
|
||
|
|
||
|
// add item to result pane
|
||
|
LPRESULTDATAITEM prdi = NULL;
|
||
|
dynamic_cast<IWirelessSnapInDataObject*>(pItem)->GetResultData(&prdi);
|
||
|
ASSERT( NULL != prdi );
|
||
|
hr = pResult->InsertItem( prdi );
|
||
|
|
||
|
// when the item is removed from the UI the QI'd interface will be released
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
m_dwNumPolItems = dwNumPolicyObjects;
|
||
|
|
||
|
// set the sort parameters
|
||
|
if (m_dwNumPolItems > 1) {
|
||
|
pResult->Sort( nSortColumn, dwSortOrder, 0 );
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP_(void) CWirelessManagerFolder::SetHeaders(LPHEADERCTRL pHeader, LPRESULTDATA pResult)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
ASSERT(pResult != NULL);
|
||
|
|
||
|
// set the description bar text
|
||
|
CString strDesc;
|
||
|
strDesc.LoadString (IDS_SNAPIN_DESC);
|
||
|
pResult->SetDescBarText(strDesc.GetBuffer(5));
|
||
|
|
||
|
|
||
|
CString strName;
|
||
|
|
||
|
//first two columns are common for both rsop and non-rsop case
|
||
|
strName.LoadString (IDS_COLUMN_NAME);
|
||
|
pHeader->InsertColumn(COL_NAME, strName, LVCFMT_LEFT, 140);
|
||
|
|
||
|
strName.LoadString (IDS_COLUMN_DESCRIPTION);
|
||
|
pHeader->InsertColumn(COL_DESCRIPTION, strName, LVCFMT_LEFT, 160);
|
||
|
|
||
|
// GPO New
|
||
|
|
||
|
if ( !m_pComponentDataImpl->IsRsop() )
|
||
|
{
|
||
|
/*
|
||
|
// if it is local or remote then third column is the ASSIGNED column
|
||
|
if ((m_pComponentDataImpl->EnumLocation()==LOCATION_REMOTE)
|
||
|
|| (m_pComponentDataImpl->EnumLocation()==LOCATION_LOCAL)
|
||
|
// extension snapin?
|
||
|
|| ((m_pComponentDataImpl->EnumLocation()==LOCATION_GLOBAL) && (NULL != m_pComponentDataImpl->GetStaticScopeObject()->GetExtScopeObject()))
|
||
|
)
|
||
|
{
|
||
|
strName.LoadString (IDS_COLUMN_POLICYASSIGNED);
|
||
|
pHeader->InsertColumn(COL_ACTIVE, strName, LVCFMT_LEFT, 160);
|
||
|
}
|
||
|
|
||
|
//for ds case, date stored in polstore is not valid, do not show for ds
|
||
|
if (m_pComponentDataImpl->EnumLocation() != LOCATION_GLOBAL )
|
||
|
{
|
||
|
strName.LoadString (IDS_POLICY_MODIFIEDTIME);
|
||
|
pHeader->InsertColumn(COL_LAST_MODIFIED, strName, LVCFMT_LEFT, 160);
|
||
|
}
|
||
|
*/
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//rsop case, columns will be different
|
||
|
strName.LoadString(IDS_COLUMN_GPONAME);
|
||
|
pHeader->InsertColumn(COL_GPONAME, strName, LVCFMT_LEFT, 160);
|
||
|
|
||
|
strName.LoadString(IDS_COLUMN_PRECEDENCE);
|
||
|
pHeader->InsertColumn(COL_PRECEDENCE, strName, LVCFMT_LEFT, 160);
|
||
|
|
||
|
strName.LoadString(IDS_COLUMN_OU);
|
||
|
pHeader->InsertColumn(COL_OU, strName, LVCFMT_LEFT, 160);
|
||
|
|
||
|
m_nSortColumn = COL_PRECEDENCE;
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void CWirelessManagerFolder::GenerateUniqueSecPolicyName (CString& strName, UINT nID)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
|
||
|
BOOL bUnique = TRUE;
|
||
|
int iUTag = 0;
|
||
|
CString strUName;
|
||
|
|
||
|
DWORD dwError = 0;
|
||
|
DWORD i = 0;
|
||
|
PWIRELESS_POLICY_DATA pWirelessPolicyData = NULL;
|
||
|
PWIRELESS_POLICY_DATA * ppWirelessPolicyData = NULL;
|
||
|
DWORD dwNumPolicyObjects = 0;
|
||
|
|
||
|
// if an nID was passed in then start with that
|
||
|
if (nID != 0)
|
||
|
{
|
||
|
strName.LoadString (nID);
|
||
|
}
|
||
|
|
||
|
// zip through the policies and verify name is unique
|
||
|
do
|
||
|
{
|
||
|
HANDLE hPolicyStore = NULL;
|
||
|
|
||
|
// only start tacking numbers on after the first pass
|
||
|
if (iUTag > 0)
|
||
|
{
|
||
|
TCHAR buff[32];
|
||
|
wsprintf (buff, _T(" (%d)"), iUTag);
|
||
|
strUName = strName + buff;
|
||
|
bUnique = TRUE;
|
||
|
} else
|
||
|
{
|
||
|
strUName = strName;
|
||
|
bUnique = TRUE;
|
||
|
}
|
||
|
|
||
|
hPolicyStore = m_pComponentDataImpl->GetPolicyStoreHandle();
|
||
|
|
||
|
dwError = WirelessEnumPolicyData(
|
||
|
hPolicyStore,
|
||
|
&ppWirelessPolicyData,
|
||
|
&dwNumPolicyObjects
|
||
|
);
|
||
|
|
||
|
for (i = 0; i < dwNumPolicyObjects; i++) {
|
||
|
|
||
|
pWirelessPolicyData = *(ppWirelessPolicyData + i);
|
||
|
if (0 == strUName.CompareNoCase(pWirelessPolicyData->pszWirelessName)) {
|
||
|
// set bUnique to FALSE
|
||
|
bUnique = FALSE;
|
||
|
iUTag++;
|
||
|
|
||
|
}
|
||
|
FreeWirelessPolicyData(pWirelessPolicyData);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
while (bUnique == FALSE);
|
||
|
|
||
|
// done
|
||
|
strName = strUName;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CWirelessManagerFolder::ForceRefresh( LPRESULTDATA pResultData )
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
DWORD dwError = 0;
|
||
|
BOOL bNeedChangeToolbar = FALSE;
|
||
|
|
||
|
//if haven't successfully opened the storage yet, try again now.
|
||
|
if (NULL == m_pComponentDataImpl->GetPolicyStoreHandle())
|
||
|
{
|
||
|
DWORD dwError = 0;
|
||
|
dwError = m_pComponentDataImpl->OpenPolicyStore();
|
||
|
if (ERROR_SUCCESS != dwError)
|
||
|
{
|
||
|
hr = HRESULT_FROM_WIN32(dwError);
|
||
|
ReportError(IDS_POLMSG_EFAIL, hr);
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
ASSERT(NULL != m_pComponentDataImpl->GetPolicyStoreHandle());
|
||
|
|
||
|
}
|
||
|
|
||
|
// turn on the hourglass
|
||
|
CWaitCursor waitCursor;
|
||
|
|
||
|
// to determine if we should delete the result items
|
||
|
CPtrList deletedList;
|
||
|
CPtrList releaseList;
|
||
|
BOOL bEnumerateItems = FALSE;
|
||
|
|
||
|
// release the interface for each of these result items as
|
||
|
// we are 'bout to nuke them
|
||
|
RESULTDATAITEM resultItem;
|
||
|
ZeroMemory(&resultItem, sizeof(resultItem));
|
||
|
resultItem.mask = RDI_PARAM | RDI_STATE | RDI_INDEX;
|
||
|
resultItem.nIndex = -1;
|
||
|
resultItem.nState = LVNI_ALL;
|
||
|
|
||
|
// get the next item
|
||
|
hr = pResultData->GetNextItem (&resultItem);
|
||
|
if (hr == S_OK)
|
||
|
{
|
||
|
while (hr == S_OK)
|
||
|
{
|
||
|
// if we recieved a scope node from the enumerations bail, they
|
||
|
// are refreshing a view that is displaying our scope node, not
|
||
|
// our result items (the only things that need to be refreshed)
|
||
|
|
||
|
// NOTE: an alternate (and more correct?) way to do this could
|
||
|
// be to keep track of our IComponent instances; in this situation
|
||
|
// we actually have two of them and if we knew which one we
|
||
|
// were we'd know if there were any result items to be refreshed
|
||
|
// We can't currently do this because the CWirelessManagerFolder is
|
||
|
// stored in the IComponentData implementation.
|
||
|
if (resultItem.bScopeItem == TRUE)
|
||
|
return S_OK;
|
||
|
|
||
|
// free it off
|
||
|
// if it ain't the right type of object we'll leak it
|
||
|
IUnknown* pUnk = (IUnknown*)resultItem.lParam;
|
||
|
ASSERT (pUnk);
|
||
|
if (pUnk)
|
||
|
{
|
||
|
CComQIPtr<IWirelessSnapInDataObject, &IID_IWirelessSnapInDataObject> spData( pUnk );
|
||
|
if (spData)
|
||
|
{
|
||
|
// delete it
|
||
|
HRESULTITEM actualItemID;
|
||
|
if (pResultData->FindItemByLParam (resultItem.lParam, &actualItemID) == S_OK)
|
||
|
{
|
||
|
// save for delete, release and note that we need to do deletion
|
||
|
deletedList.AddHead ((void*)actualItemID);
|
||
|
releaseList.AddHead ((void*)spData);
|
||
|
|
||
|
bEnumerateItems = TRUE;
|
||
|
}
|
||
|
} else
|
||
|
{
|
||
|
OPT_TRACE(_T("\tCWirelessManagerFolder::ForceRefresh(%p) couldn't QI on pUnk\n"), this);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// get the next item
|
||
|
hr = pResultData->GetNextItem (&resultItem);
|
||
|
}
|
||
|
} else
|
||
|
{
|
||
|
// there was _nothing_ in the list; so we enumerate anyway to see
|
||
|
// if there is something to add
|
||
|
bEnumerateItems = TRUE;
|
||
|
}
|
||
|
|
||
|
if (bEnumerateItems)
|
||
|
{
|
||
|
// delete them
|
||
|
while (!deletedList.IsEmpty())
|
||
|
{
|
||
|
LONG_PTR pLong = (LONG_PTR)deletedList.RemoveHead();
|
||
|
pResultData->DeleteItem (pLong, 0);
|
||
|
OPT_TRACE(_T("\tCWirelessManagerFolder::ForceRefresh(%p) deleting item, itemID(%p)\n"), this, pLong);
|
||
|
}
|
||
|
// we have no longer been enumerated
|
||
|
SetEnumerated(FALSE);
|
||
|
// re-add all items to our local list, which re-connects to storage
|
||
|
// for us; so we want to make sure that any warnings are displayed
|
||
|
m_pComponentDataImpl->IssueStorageWarning (TRUE);
|
||
|
|
||
|
//EnumerateResults( pResultData, m_nSortColumn, m_dwSortOrder );
|
||
|
HRESULT hrTemp = EnumerateResults( pResultData, m_nSortColumn, m_dwSortOrder );
|
||
|
|
||
|
//If the rpc connection is broken after we open the storage last time, the handle will
|
||
|
//become invalid. We need to re-open the storage to get a new handle.
|
||
|
if (FAILED(hrTemp))
|
||
|
{
|
||
|
dwError = m_pComponentDataImpl->OpenPolicyStore();
|
||
|
if (ERROR_SUCCESS != dwError)
|
||
|
{
|
||
|
hrTemp = HRESULT_FROM_WIN32(dwError);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hrTemp = EnumerateResults( pResultData, m_nSortColumn, m_dwSortOrder );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (FAILED(hrTemp))
|
||
|
{
|
||
|
bNeedChangeToolbar = TRUE;
|
||
|
|
||
|
//ReportError(IDS_POLMSG_EFAIL, hrTemp);
|
||
|
}
|
||
|
|
||
|
//release them
|
||
|
while (!releaseList.IsEmpty())
|
||
|
{
|
||
|
IWirelessSnapInDataObject* spData = (IWirelessSnapInDataObject*)releaseList.RemoveHead();
|
||
|
OPT_TRACE(_T("\tCWirelessManagerFolder::ForceRefresh(%p) releasing spData (%p)\n"), this, spData);
|
||
|
spData->Release();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CWirelessManagerFolder::OnScopeExpand( LPCONSOLENAMESPACE pConsoleNameSpace, HSCOPEITEM hScopeItem )
|
||
|
{
|
||
|
// paramater validation
|
||
|
ASSERT(pConsoleNameSpace != NULL);
|
||
|
|
||
|
// turn on the hourglass
|
||
|
CWaitCursor waitCursor;
|
||
|
|
||
|
HRESULT hr = S_OK;
|
||
|
// for later addition of sub-items we need to store our ID...
|
||
|
// (note that if we were inserted by ourself we would already have a valid id here
|
||
|
// ASSERT(hScopeItem != NULL);
|
||
|
GetScopeItem()->ID = hScopeItem;
|
||
|
|
||
|
if (!IsEnumerated())
|
||
|
{
|
||
|
// Insert the scope item if we are an extension snap-in
|
||
|
if (NULL != GetExtScopeObject() && !m_bScopeItemInserted)
|
||
|
{
|
||
|
// Set the parent
|
||
|
GetScopeItem()->relativeID = hScopeItem;
|
||
|
|
||
|
// insert it into the scope
|
||
|
hr = pConsoleNameSpace->InsertItem( GetScopeItem() );
|
||
|
ASSERT(hr == S_OK);
|
||
|
|
||
|
m_bScopeItemInserted = TRUE;
|
||
|
|
||
|
// Note - On return, the ID member of 'm_pScopeItem'
|
||
|
// contains the handle to the newly inserted item!
|
||
|
ASSERT( GetScopeItem()->ID != NULL );
|
||
|
}
|
||
|
|
||
|
DWORD dwError = 0;
|
||
|
dwError = m_pComponentDataImpl->OpenPolicyStore();
|
||
|
if (ERROR_SUCCESS != dwError)
|
||
|
{
|
||
|
hr = HRESULT_FROM_WIN32(dwError);
|
||
|
ReportError(IDS_POLMSG_EFAIL, hr);
|
||
|
}
|
||
|
|
||
|
// We have been enumerated
|
||
|
SetEnumerated(TRUE);
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
HRESULT CWirelessManagerFolder::OnAddImages(LPARAM arg, LPARAM param, IImageList* pImageList )
|
||
|
{
|
||
|
ASSERT( NULL != pImageList );
|
||
|
// TODO: what is arg, this only succeeds if it is not 0 but it isn't used...
|
||
|
if (arg == 0)
|
||
|
return E_INVALIDARG;
|
||
|
|
||
|
CBitmap bmp16x16;
|
||
|
CBitmap bmp32x32;
|
||
|
|
||
|
// Load the bitmaps from the dll
|
||
|
bmp16x16.LoadBitmap(IDB_16x16);
|
||
|
bmp32x32.LoadBitmap(IDB_32x32);
|
||
|
|
||
|
// Set the images
|
||
|
HRESULT hr = pImageList->ImageListSetStrip(reinterpret_cast<LONG_PTR*>(static_cast<HBITMAP>(bmp16x16)), reinterpret_cast<LONG_PTR*>(static_cast<HBITMAP>(bmp32x32)), 0, RGB(255, 0, 255));
|
||
|
ASSERT (hr == S_OK);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
HRESULT CWirelessManagerFolder::CreateWirelessPolicy(PWIRELESS_POLICY_DATA pPolicy)
|
||
|
{
|
||
|
ASSERT(pPolicy);
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
HANDLE hPolicyStore = NULL;
|
||
|
|
||
|
// NEW GPO
|
||
|
// Add Microsoft/Windows in Policies Container if its not there.
|
||
|
|
||
|
CString szMachinePath;
|
||
|
szMachinePath = m_pComponentDataImpl->DomainGPOName();
|
||
|
hr = AddWirelessPolicyContainerToGPO(szMachinePath);
|
||
|
if (FAILED(hr)) {
|
||
|
goto Error;
|
||
|
}
|
||
|
|
||
|
hPolicyStore = m_pComponentDataImpl->GetPolicyStoreHandle();
|
||
|
ASSERT(hPolicyStore);
|
||
|
|
||
|
CWRg(WirelessCreatePolicyData(hPolicyStore,
|
||
|
pPolicy));
|
||
|
|
||
|
Error:
|
||
|
return hr;
|
||
|
}
|