|
|
//----------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2001.
//
// File: spolitem.cpp
//
// Contents: WiF Policy Snapin
//
//
// History: TaroonM
// 10/30/01
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include <htmlhelp.h>
#include "sprpage.h"
#include "new.h"
#include "genpage.h"
#ifdef WIZ97WIZARDS
#include "wiz97run.h"
#endif
const TCHAR c_szPolicyAgentServiceName[] = _T("PolicyAgent"); #define SERVICE_CONTROL_NEW_POLICY 129
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
#define celems(_x) (sizeof(_x) / sizeof(_x[0]))
DWORD ComputePolicyDN( LPWSTR pszDirDomainName, GUID PolicyIdentifier, LPWSTR pszPolicyDN );
// Construction/destruction
CSecPolItem::CSecPolItem () : m_pDisplayInfo( NULL ), m_nResultSelected( -1 ), m_bWiz97On( FALSE ), m_bBlockDSDelete( FALSE ), m_bItemSelected( FALSE ) { m_pPolicy = NULL; m_bNewPol = FALSE; ZeroMemory( &m_ResultItem, sizeof( RESULTDATAITEM ) ); }
CSecPolItem::~CSecPolItem() { if (m_pDisplayInfo != NULL) { delete m_pDisplayInfo; m_pDisplayInfo = NULL; } if (m_pPolicy) { FreeWirelessPolicyData(m_pPolicy); } };
void CSecPolItem::Initialize (WIRELESS_POLICY_DATA *pPolicy, CComponentDataImpl* pComponentDataImpl, CComponentImpl* pComponentImpl, BOOL bTemporaryDSObject) { PWIRELESS_POLICY_DATA pWirelessPolicyData = NULL; HANDLE hLocalPolicyStore = NULL; // call base class initialize
CSnapObject::Initialize( pComponentDataImpl, pComponentImpl, bTemporaryDSObject ); ZeroMemory( &m_ResultItem, sizeof( RESULTDATAITEM ) ); m_bNewPol = bTemporaryDSObject; if (m_pPolicy) { FreeWirelessPolicyData(m_pPolicy); } m_pPolicy = pPolicy; if (m_pPolicy) { m_strName = pPolicy->pszWirelessName; } // Set default resultItem settings
GetResultItem()->mask = RDI_STR | RDI_IMAGE; GetResultItem()->str = MMC_CALLBACK; // Set the image. Active items get an image to indicate this state.
BOOL bEnabled = FALSE; bEnabled = CheckForEnabled(); GetResultItem()->nImage = bEnabled ? ENABLEDSECPOLICY_IMAGE_IDX : SECPOLICY_IMAGE_IDX; }
//////////////////////////////////////////////////////////////////////////
// handle IExtendContextMenu
STDMETHODIMP CSecPolItem::AddMenuItems ( LPCONTEXTMENUCALLBACK pContextMenuCallback, long *pInsertionAllowed ) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = S_OK; CONTEXTMENUITEM mItem; LONG lCommandID; // only add these menu items if we are pointed to the local machine
if ((m_pComponentDataImpl->EnumLocation()==LOCATION_REMOTE) || (m_pComponentDataImpl->EnumLocation()==LOCATION_LOCAL) // extension snapin?
|| ((m_pComponentDataImpl->EnumLocation()==LOCATION_GLOBAL) && (NULL != m_pComponentDataImpl->GetStaticScopeObject()->GetExtScopeObject()))) { // getthe active/inactive strings
CString strMenuText; CString strMenuDescription; /*
if (CheckForEnabled ()) { strMenuText.LoadString (IDS_MENUTEXT_UNASSIGN); strMenuDescription.LoadString (IDS_MENUDESCRIPTION_UNASSIGN); lCommandID = IDM_UNASSIGN; } else { strMenuText.LoadString (IDS_MENUTEXT_ASSIGN); strMenuDescription.LoadString (IDS_MENUDESCRIPTION_ASSIGN); lCommandID = IDM_ASSIGN; } // see if we can insert into the top
if (*pInsertionAllowed & CCM_INSERTIONALLOWED_TOP) { // set active/inactive
CONFIGUREITEM (mItem, strMenuText, strMenuDescription, lCommandID, CCM_INSERTIONPOINTID_PRIMARY_TOP, 0, 0); hr = pContextMenuCallback->AddItem(&mItem); ASSERT(hr == S_OK); } // see if we can insert into the tasks
if (*pInsertionAllowed & CCM_INSERTIONALLOWED_TASK) { // set active/inactive
CONFIGUREITEM (mItem, strMenuText, strMenuDescription, lCommandID, CCM_INSERTIONPOINTID_PRIMARY_TASK, 0, 0); hr = pContextMenuCallback->AddItem(&mItem); ASSERT(hr == S_OK); } */ } // we are done
return hr; }
STDMETHODIMP CSecPolItem::Command ( long lCommandID, IConsoleNameSpace* // not used for result items
) { WCHAR szMachinePath[256]; HRESULT hr = S_OK; AFX_MANAGE_STATE(AfxGetStaticModuleState()); return CWirelessSnapInDataObjectImpl<CSecPolItem>::Command( lCommandID, (IConsoleNameSpace*)NULL ); // we handled it
return S_OK; }
HRESULT CSecPolItem::IsPolicyExist() { HRESULT hr = S_OK; PWIRELESS_POLICY_DATA pWirelessPolicyData = NULL; HANDLE hPolicyStore = NULL; PWIRELESS_PS_DATA * ppWirelessPSData = NULL; DWORD dwNumPSObjects = 0; hPolicyStore = m_pComponentDataImpl->GetPolicyStoreHandle(); pWirelessPolicyData = GetWirelessPolicy(); return hr; }
// handle IExtendPropertySheet
STDMETHODIMP CSecPolItem::CreatePropertyPages ( LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle ) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); HRESULT hr = S_OK; ASSERT(lpProvider != NULL); // save this notification handle
SetNotificationHandle (handle); //check if the policy exists before pops up the property page
//may be deleted by some other instance, if so return FALSE, force the refresh
if ( !m_bNewPol ) { hr = IsPolicyExist(); if ( FAILED(hr) ) { ReportError(IDS_LOAD_ERROR, hr); // trigger a refresh
m_pComponentDataImpl->GetConsole()->UpdateAllViews( this, 0,0 ); return hr; } } #ifdef WIZ97WIZARDS
if (m_bWiz97On) { // We only run the wizard in the case of a new object, if that changes we will need to
// verify we are doing an 'add' here
// IF the wizard wants to it will associate these two
PWIRELESS_PS_DATA pWirelessPSData = NULL; ASSERT(GetWirelessPolicy()); ASSERT(GetWirelessPolicy()->ppWirelessPSData); /*
pWirelessPSData = *GetWirelessPolicy()->ppWirelessPSData; if (pWirelessPSData) { */ HRESULT hr = CreateSecPolItemWiz97PropertyPages(dynamic_cast<CComObject<CSecPolItem>*>(this), pWirelessPSData, lpProvider); // the wizard should have done an addref on the pWirelessPSData pointer we just passed into it, so
// it so we can feel free to releaseref now
/*
} else { // we don't want to save the notification handle after all
SetNotificationHandle (NULL); hr = E_UNEXPECTED; } */ return hr; } else { #endif
CComPtr<CSecPolPropSheetManager> spPropshtManager = new CComObject<CSecPolPropSheetManager>; if (NULL == spPropshtManager.p) { ReportError(IDS_OPERATION_FAIL, E_OUTOFMEMORY); return E_OUTOFMEMORY; } // Create the property page(s); gets deleted when the window is destroyed
CGenPage* pGenPage = new CGenPage(IDD_WIRELESSGENPROP); CSecPolRulesPage* pRulesPage = new CSecPolRulesPage(); if ((pRulesPage == NULL) || (pGenPage == NULL)) return E_UNEXPECTED; // if the first page can't initialize this probably means that there was a problem
// talking to the DS, in which case we fail to bring up the propery pages and figure
// that a refresh will get us back to a valid state
hr = pGenPage->Initialize (dynamic_cast<CComObject<CSecPolItem>*>(this)); if (hr != S_OK) { // since we are not going to display the tab dialog we need to clean up
delete pGenPage; delete pRulesPage; // we don't want to save the notification handle after all
SetNotificationHandle (NULL); // trigger a refresh
m_pComponentDataImpl->GetConsole()->UpdateAllViews( this, 0,0 ); return hr; } // yes, we ignore the return value on these guys, since the only return value that
// can currently come back would have come back on the first guy anyway
pRulesPage->Initialize (dynamic_cast<CComObject<CSecPolItem>*>(this)); HPROPSHEETPAGE hGenPage = MyCreatePropertySheetPage(&(pGenPage->m_psp)); HPROPSHEETPAGE hRulesPage = MyCreatePropertySheetPage(&(pRulesPage->m_psp)); if ((hGenPage == NULL) || (hRulesPage == NULL)) { // we don't want to save the notification handle after all
SetNotificationHandle (NULL); return E_UNEXPECTED; } lpProvider->AddPage(hGenPage); lpProvider->AddPage(hRulesPage); spPropshtManager->Initialize(dynamic_cast<CComObject<CSecPolItem>*>(this)); spPropshtManager->AddPage(pRulesPage); spPropshtManager->AddPage(pGenPage); return S_OK; #ifdef WIZ97WIZARDS
} #endif
}
STDMETHODIMP CSecPolItem::QueryPagesFor( void ) { // display our locations dialog via this
return S_OK; }
// Destroy helper
STDMETHODIMP CSecPolItem::Destroy( void ) { // just return success
return S_OK; }
// handle IComponent and IComponentData
STDMETHODIMP CSecPolItem::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("CSecPolItem::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_DBLCLICK: OPT_TRACE(_T("MMCN_DBLCLICK\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()); // if didn't handle something... then return FALSE
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: { // Obtain IConsoleVerb from console
CComPtr<IConsoleVerb> spVerb; pConsole->QueryConsoleVerb( &spVerb ); m_bItemSelected = !!(HIWORD(arg)); // call object to set verb state
AdjustVerbState( (IConsoleVerb*)spVerb ); // Remember selected result item
CComQIPtr <IResultData, &IID_IResultData> spResult( pConsole ); if (spResult == NULL) { TRACE(_T("CComponentDataImpl::Notify QI for IResultData FAILED\n")); break; } hr = OnSelect( arg, param, (IResultData*)spResult); break; } case MMCN_PROPERTY_CHANGE: { // the object pointer should be in lParam
OnPropertyChange( param, pConsole ); // This message is received whenever the property sheet is dismissed.
// Now is a good time to make sure the result item which was originally
// selected remains so.
CComQIPtr <IResultData, &IID_IResultData> spResult( pConsole ); if (spResult == NULL) { TRACE(_T("CComponentDataImpl::Notify QI for IResultData FAILED\n")); break; } SelectResult( (IResultData*)spResult ); break; } case MMCN_VIEW_CHANGE: { // Refresh the entire result pane if view has changed.
hr = pConsole->UpdateAllViews( m_pComponentDataImpl->GetStaticScopeObject(), 0, 0 ); break; } case MMCN_RENAME: { hr = OnRename( arg, param ); // even if the rename failed mmc will still display with the
// new name... thus we have to force a refresh in the failure case
if (hr != S_OK) { if (S_FALSE == hr) { CThemeContextActivator activator; AfxMessageBox(IDS_ERROR_EMPTY_POL_NAME); } else { ReportError(IDS_SAVE_ERROR, hr); hr = S_FALSE; } } break; } case MMCN_DELETE: { CThemeContextActivator activator; // delete the item
if (AfxMessageBox (IDS_SUREYESNO, MB_YESNO | MB_DEFBUTTON2) == IDYES) { // turn on wait cursor
CWaitCursor waitCursor; // Obtain IResultData
CComQIPtr <IResultData, &IID_IResultData> pResultData( pConsole ); ASSERT( pResultData != NULL ); // param is not used on MMCN_DELETE, replace it with IResultData*
hr = OnDelete( arg, (LPARAM)(IResultData*)pResultData ); if (hr != S_OK) { ReportError(IDS_SAVE_ERROR, hr); hr = S_FALSE; } } else hr = S_FALSE; // tell IComponent the delete wasn't done.
break; } // we didn't handle it... do default behaviour
case MMCN_DBLCLICK: { PWIRELESS_POLICY_DATA pWirelessPolicyData = NULL; pWirelessPolicyData = GetWirelessPolicy(); break; } case MMCN_ACTIVATE: case MMCN_MINIMIZED: case MMCN_BTN_CLICK: default: break; } return hr; }
HRESULT GetGpoDisplayName(WCHAR *szGpoId, WCHAR *pszGpoName, DWORD dwSize ) { LPGROUPPOLICYOBJECT pGPO = NULL; //Group Policy Object
HRESULT hr = S_OK; //result returned by functions
//
// Create an IGroupPolicyObject instance to work with
//
hr = CoCreateInstance(CLSID_GroupPolicyObject, NULL, CLSCTX_SERVER, IID_IGroupPolicyObject, (void **)&pGPO); if (FAILED(hr)) { return hr; } hr = pGPO->OpenDSGPO((LPOLESTR)szGpoId,GPO_OPEN_READ_ONLY); if (FAILED(hr)) { pGPO->Release(); return hr; } hr = pGPO->GetDisplayName( pszGpoName, dwSize ); if (FAILED(hr)) { pGPO->Release(); return hr; } pGPO->Release(); return hr; }
// handle IComponent
STDMETHODIMP CSecPolItem::GetResultDisplayInfo( RESULTDATAITEM *pResultDataItem ) { TCHAR *temp = NULL; DWORD dwError = S_OK; OPT_TRACE(_T("CSecPolItem::GetResultDisplayInfo this-%p\n"), this); AFX_MANAGE_STATE(AfxGetStaticModuleState()); // are they looking for the image?
if (pResultDataItem->mask & RDI_IMAGE) { pResultDataItem->nImage = GetResultItem()->nImage; OPT_TRACE(_T(" returning image[%i]\n"), GetResultItem()->nImage); } // are they looking for a string?
if (pResultDataItem->mask & RDI_STR) { if (GetWirelessPolicy() != NULL) { switch (pResultDataItem->nCol) { case COL_NAME: { CString str = m_pPolicy->pszWirelessName; temp = (TCHAR*) realloc (m_pDisplayInfo, (str.GetLength()+1)*sizeof(TCHAR)); if (temp == NULL) { dwError = GetLastError(); } else { m_pDisplayInfo = temp; lstrcpy (m_pDisplayInfo, str.GetBuffer(20)); } pResultDataItem->str = m_pDisplayInfo; OPT_TRACE(_T(" returning COL_NAME-%s\n"), m_pDisplayInfo); } break; case COL_DESCRIPTION: { CString str = m_pPolicy->pszDescription; temp = (TCHAR*) realloc (m_pDisplayInfo, (str.GetLength()+1)*sizeof(TCHAR)); if (temp == NULL) { dwError = GetLastError(); } else { m_pDisplayInfo = temp; lstrcpy (m_pDisplayInfo, str.GetBuffer(20)); } pResultDataItem->str = m_pDisplayInfo; OPT_TRACE(_T(" returning COL_DESCRIPTION-%s\n"), m_pDisplayInfo); } break; default: { if ( !m_pComponentDataImpl->IsRsop() ) { switch( pResultDataItem->nCol ) { case COL_LAST_MODIFIED: { CString strTime; if(SUCCEEDED(FormatTime((time_t)m_pPolicy->dwWhenChanged, strTime))) { temp = (TCHAR*) realloc (m_pDisplayInfo, (strTime.GetLength()+1)*sizeof(TCHAR)); if (temp != NULL) { m_pDisplayInfo = temp; lstrcpy(m_pDisplayInfo, strTime); } else { dwError = GetLastError(); } pResultDataItem->str = m_pDisplayInfo; OPT_TRACE(_T(" returning COL_ACTIVE-%s\n"), m_pDisplayInfo); } } break; default: // for debugging
ASSERT (0); break; } //inner switch
} //if ( !m_pComponentDataImpl->IsRsop() )
else { //rsop case
switch( pResultDataItem->nCol ) { case COL_GPONAME: if ( m_pPolicy->pRsopInfo ) { WCHAR szGpoName[512]; CString strGpoId; strGpoId.Format(_T("LDAP://%s"),m_pPolicy->pRsopInfo->pszGPOID); HRESULT hr = GetGpoDisplayName( (WCHAR*)(LPCTSTR)strGpoId, szGpoName, 512 ); if (S_OK == hr ) { INT iSize = (lstrlen(szGpoName) + 1) * sizeof(WCHAR); temp = (TCHAR*) realloc (m_pDisplayInfo, iSize); if (temp!= NULL) { m_pDisplayInfo = temp; lstrcpy(m_pDisplayInfo, szGpoName); } else { dwError = GetLastError(); } pResultDataItem->str = m_pDisplayInfo; OPT_TRACE(_T(" returning COL_ACTIVE-%s\n"), m_pDisplayInfo); } } break; case COL_PRECEDENCE: if ( m_pPolicy->pRsopInfo ) { const int cchMaxDigits = 33; temp = (TCHAR*) realloc (m_pDisplayInfo, cchMaxDigits * sizeof(TCHAR)); if (temp!=NULL) { m_pDisplayInfo = temp; wsprintf(m_pDisplayInfo, _T("%d"),m_pPolicy->pRsopInfo->uiPrecedence); } else { dwError = GetLastError(); } pResultDataItem->str = m_pDisplayInfo; OPT_TRACE(_T(" returning COL_ACTIVE-%s\n"), m_pDisplayInfo); } break; case COL_OU: if ( m_pPolicy->pRsopInfo ) { INT iLen = (lstrlen(m_pPolicy->pRsopInfo->pszSOMID) + 1) *sizeof(TCHAR); temp = (TCHAR*) realloc (m_pDisplayInfo, iLen); if (temp!=NULL) { m_pDisplayInfo = temp; lstrcpy(m_pDisplayInfo, m_pPolicy->pRsopInfo->pszSOMID); } else { dwError = GetLastError(); } pResultDataItem->str = m_pDisplayInfo; OPT_TRACE(_T(" returning COL_ACTIVE-%s\n"), m_pDisplayInfo); } break; default: // for debugging
ASSERT (0); break; }//inner switch
} }//default case
} //outer switch
} //if (GetWirelessPolicy() != NULL)
else { CString str; str.LoadString (IDS_COLUMN_INVALID); temp = (TCHAR*) realloc (m_pDisplayInfo, (str.GetLength()+1)*sizeof(TCHAR)); if (temp == NULL) { dwError = GetLastError(); } else { m_pDisplayInfo = temp; lstrcpy (m_pDisplayInfo, str.GetBuffer(20)); } pResultDataItem->str = m_pDisplayInfo; } } return HRESULT_FROM_WIN32(dwError); }
//+---------------------------------------------------------------------------
//
// Member: CAdvIpcfgDlg::FormatTime
//
// Purpose: convert time_t to a string.
//
// Returns: error code
//
// Note: _wasctime has some localization problems. So we do the formatting ourselves
HRESULT CSecPolItem::FormatTime(time_t t, CString & str) { time_t timeCurrent = time(NULL); LONGLONG llTimeDiff = 0; FILETIME ftCurrent = {0}; FILETIME ftLocal = {0}; SYSTEMTIME SysTime; WCHAR szBuff[256] = {0}; str = L""; GetSystemTimeAsFileTime(&ftCurrent); llTimeDiff = (LONGLONG)t - (LONGLONG)timeCurrent; llTimeDiff *= 10000000; *((LONGLONG UNALIGNED64 *)&ftCurrent) += llTimeDiff; if (!FileTimeToLocalFileTime(&ftCurrent, &ftLocal )) { return HRESULT_FROM_WIN32(GetLastError()); } if (!FileTimeToSystemTime( &ftLocal, &SysTime )) { return HRESULT_FROM_WIN32(GetLastError()); } if (0 == GetDateFormat(LOCALE_USER_DEFAULT, 0, &SysTime, NULL, szBuff, celems(szBuff))) { return HRESULT_FROM_WIN32(GetLastError()); } str = szBuff; str += L" "; ZeroMemory(szBuff, sizeof(szBuff)); if (0 == GetTimeFormat(LOCALE_USER_DEFAULT, 0, &SysTime, NULL, szBuff, celems(szBuff))) { return HRESULT_FROM_WIN32(GetLastError()); } str += szBuff; return S_OK; }
// IIWirelessSnapInData
STDMETHODIMP CSecPolItem::GetResultData( RESULTDATAITEM **ppResultDataItem ) { ASSERT( NULL != ppResultDataItem ); ASSERT( NULL != GetResultItem() ); if (NULL == ppResultDataItem) return E_INVALIDARG; *ppResultDataItem = GetResultItem(); return S_OK; }
STDMETHODIMP CSecPolItem::GetGuidForCompare( GUID *pGuid ) { ASSERT( NULL != pGuid ); if (NULL == pGuid) return E_INVALIDARG; CopyMemory( pGuid, &m_pPolicy->PolicyIdentifier, sizeof( GUID ) ); return S_OK; }
STDMETHODIMP CSecPolItem::AdjustVerbState (LPCONSOLEVERB pConsoleVerb) { HRESULT hr = S_OK; // pass to base class
hr = CWirelessSnapInDataObjectImpl<CSecPolItem>::AdjustVerbState( pConsoleVerb ); ASSERT (hr == S_OK); MMC_BUTTON_STATE buttonProperties = (m_bItemSelected) ? ENABLED : HIDDEN; if ( m_pComponentDataImpl->IsRsop() ) { PWIRELESS_POLICY_DATA pWirelessPolicyData = NULL; pWirelessPolicyData = GetWirelessPolicy(); hr = pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, buttonProperties, TRUE); ASSERT (hr == S_OK); } else { hr = pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, buttonProperties, TRUE); ASSERT (hr == S_OK); hr = pConsoleVerb->SetVerbState(MMC_VERB_RENAME, ENABLED, TRUE); ASSERT (hr == S_OK); hr = pConsoleVerb->SetVerbState(MMC_VERB_DELETE, ENABLED, TRUE); ASSERT (hr == S_OK); } hr = pConsoleVerb->SetDefaultVerb(m_bItemSelected ? MMC_VERB_PROPERTIES : MMC_VERB_NONE); ASSERT (hr == S_OK); return hr; }
STDMETHODIMP CSecPolItem::DoPropertyChangeHook( void ) { return DisplaySecPolProperties( m_pPolicy->pszWirelessName, FALSE ); } ///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSecPolItem::DisplaySecPolProperties( CString strTitle, BOOL bWiz97On /*= TRUE*/ ) { HRESULT hr; // Add a ref for the prop sheet/wizard.
((CComObject <CSecPolItem>*)this)->AddRef(); // switch from the IComponentDataImpl to pUnk
LPUNKNOWN pUnk = m_pComponentDataImpl->GetUnknown(); // bring up the sheet
#ifdef WIZ97WIZARDS
if (bWiz97On) { // because we are creating a new one we need to turn on the wiz97 wizard
// unless it has been overridden
m_bWiz97On = bWiz97On; hr = m_pComponentDataImpl->m_pPrshtProvider->CreatePropertySheet( strTitle, FALSE, (LONG_PTR)this, (LPDATAOBJECT)this, MMC_PSO_NOAPPLYNOW | MMC_PSO_NEWWIZARDTYPE ); } else { #endif
hr = m_pComponentDataImpl->m_pPrshtProvider->CreatePropertySheet( strTitle, TRUE, (LONG_PTR)this, (LPDATAOBJECT)this, MMC_PSO_NOAPPLYNOW ); #ifdef WIZ97WIZARDS
} #endif
ASSERT (hr == S_OK); // TODO: get the mmc team to fix this hack, we shouldn't need to do the FindWindow calls
// NOTE: if there are multiple MDI windows open this will fail
HWND hWnd = NULL; // (nsun) As of 5/21/99, we no longer need to do this
// hr = m_pComponentDataImpl->GetConsole()->GetMainWindow(&hWnd);
// hWnd = ::FindWindowEx(hWnd, NULL, L"MDIClient", NULL);
// hWnd = ::FindWindowEx(hWnd, NULL, L"MMCChildFrm", NULL);
// hWnd = ::FindWindowEx(hWnd, NULL, L"MMCView", NULL);
// ASSERT(hWnd);
// TODO: need to check return value and call AddExtensionPages if it was successful
hr = m_pComponentDataImpl->m_pPrshtProvider->AddPrimaryPages (pUnk, TRUE, hWnd, TRUE); ASSERT (hr == S_OK); // m_dwRef should be at least 3; 2 from MMC, 1 from this function
((CComObject <CSecPolItem>*)this)->Release(); hr = m_pComponentDataImpl->GetConsole()->GetMainWindow(&hWnd); ASSERT(hWnd); // Show() returns 1 if wizard is cancelled, 0 if it finished
hr = m_pComponentDataImpl->m_pPrshtProvider->Show ((LONG_PTR)hWnd, 0); #ifdef WIZ97WIZARDS
m_bWiz97On = FALSE; #endif
// Pass prop sheet return code back to caller.
return hr; }
STDMETHODIMP CSecPolItem::OnDelete (LPARAM arg, LPARAM param) // param == IResultData*
{ HRESULT hr; // remove the item from the UI
LPRESULTDATA pResultData = (LPRESULTDATA)param; hr = pResultData->DeleteItem( m_ResultItem.itemID, 0 ); ASSERT(hr == S_OK); // need to check to see if WE are the current active policy
PWIRELESS_POLICY_DATA pPolicy = GetWirelessPolicy(); ASSERT(pPolicy); DWORD dwError = 0; //for machine policy, unassign the policy if the policy to delete is assigned
//for domain policy, we cannot do much here because we have no idea about which group
//units are using the policy
hr = DeleteWirelessPolicy(m_pComponentDataImpl->GetPolicyStoreHandle(), pPolicy); if (FAILED(hr)) { return hr; }
GUID guidClientExt = CLSID_WIRELESSClientEx; GUID guidSnapin = CLSID_Snapin;
m_pComponentDataImpl->UseGPEInformationInterface()->PolicyChanged ( TRUE, FALSE, &guidClientExt, &guidSnapin ); // Remove the item from the result list
//m_pComponentDataImpl->GetStaticScopeObject()->RemoveResultItem( (LPDATAOBJECT)this );
// do a refresh of all views, we pass in the scope item to refresh all
m_pComponentDataImpl->GetConsole()->UpdateAllViews( m_pComponentDataImpl->GetStaticScopeObject(), 0, 0 ); // TODO: return value from OnDelete is wrong
return S_OK; }
STDMETHODIMP CSecPolItem::OnPropertyChange(LPARAM lParam, LPCONSOLE pConsole ) { // call base class
return CWirelessSnapInDataObjectImpl<CSecPolItem>::OnPropertyChange( lParam, pConsole ); }
STDMETHODIMP CSecPolItem::OnRename( LPARAM arg, LPARAM param ) { DWORD dwError = 0; // TODO: what are the valid args for MMCN_RENAME?
if (arg == 0) return S_OK; LPOLESTR pszNewName = reinterpret_cast<LPOLESTR>(param); if (pszNewName == NULL) return E_INVALIDARG; CString strTemp = pszNewName; strTemp.TrimLeft(); strTemp.TrimRight(); if (strTemp.IsEmpty()) { return S_FALSE; } HRESULT hr = S_FALSE; PWIRELESS_POLICY_DATA pPolicy = GetWirelessPolicy(); if (pPolicy) {
if (pPolicy->pszOldWirelessName) FreePolStr(pPolicy->pszOldWirelessName); if (pPolicy->pszWirelessName) { pPolicy->pszOldWirelessName = pPolicy->pszWirelessName; } pPolicy->pszWirelessName = AllocPolStr(strTemp); if (NULL == pPolicy->pszWirelessName) { CThemeContextActivator activator; CString strMsg; strMsg.LoadString(IDS_ERR_OUTOFMEMORY); AfxMessageBox(strMsg); return S_FALSE; } dwError = WirelessSetPolicyData( m_pComponentDataImpl->GetPolicyStoreHandle(), pPolicy ); if (ERROR_SUCCESS != dwError) { ReportError(IDS_SAVE_ERROR, HRESULT_FROM_WIN32(dwError)); return S_FALSE; }
GUID guidClientExt = CLSID_WIRELESSClientEx; GUID guidSnapin = CLSID_Snapin; m_pComponentDataImpl->UseGPEInformationInterface()->PolicyChanged ( TRUE, TRUE, &guidClientExt, &guidSnapin ); } return S_OK; } ////////////////////////////////////////////////////////////////////////////////
//
// Function: OnSelect
// Description:
// On MMCN_SELECT determine which result item has been selected and
// remember it so we can ensure it remains selected when its property
// sheet (with General and SecPol pages) is dismissed.
//
HRESULT CSecPolItem::OnSelect(LPARAM arg, LPARAM param, IResultData *pResultData ) { HRESULT hr = S_OK; BOOL bScope = (BOOL) LOWORD(arg); BOOL bSelected = (BOOL) HIWORD(arg); if (!bScope) { if (bSelected) { // A result item was selected, save its index.
RESULTDATAITEM rdi; ZeroMemory( &rdi, sizeof( RESULTDATAITEM ) ); rdi.mask = RDI_STATE | RDI_INDEX; m_nResultSelected = -1; do { hr = pResultData->GetItem( &rdi ); if (hr == S_OK) { if (!rdi.bScopeItem && rdi.nState & LVIS_FOCUSED && rdi.nState & LVIS_SELECTED) { OPT_TRACE( _T("CComponentImpl::OnSelect GetItem index-%i ID-%i\n"), rdi.nIndex, rdi.itemID ); m_nResultSelected = rdi.nIndex; ASSERT( -1 != m_nResultSelected ); break; } rdi.nIndex++; rdi.nState = 0; } } while ((S_OK == hr) && (rdi.nIndex >= 0)); } } else // A scope item was selected
m_nResultSelected = -1; return hr; }
// Function: SelectResult
// Description:
// Select the result item indexed by m_nResultSelected when the index
// is valid (0, or greater)
//
void CSecPolItem::SelectResult( IResultData *pResultData ) { if (-1 == m_nResultSelected) return; HRESULT hr = pResultData->ModifyItemState( m_nResultSelected, (HRESULTITEM)0, LVIS_FOCUSED | LVIS_SELECTED, 0 ); // This fails if a property sheet is being displayed.
//ASSERT( S_OK == hr );
}
// Function: CheckForEnabled
// Description:
// Checks GetPolicy() policy to see if it is enabled given the current
// storage location. Returns FALSE if the storage location doesn't support
// Enabled/Disabled
BOOL CSecPolItem::CheckForEnabled () { BOOL bRetVal = FALSE; HRESULT hr = S_OK; WCHAR szMachinePath[256]; WCHAR szPolicyDN[256]; BSTR pszCurrentDN = NULL; PWIRELESS_POLICY_DATA pWirelessPolicyData = NULL; HANDLE hLocalPolicyStore = NULL; WCHAR szPathName[MAX_PATH]; DWORD dwError = 0; // if we are an extension snapin then look to the GPE we are extending, otherwise
// use the normal storage location
// NOTE: we also check to make sure we are talking to the global store
// because we don't want to use the GPO object settings in anything but the
// DS case
pWirelessPolicyData = GetWirelessPolicy(); szPolicyDN[0] = L'\0'; szPathName[0] = L'\0'; if ( m_pComponentDataImpl->IsRsop() ) { if ( pWirelessPolicyData->pRsopInfo && pWirelessPolicyData->pRsopInfo->uiPrecedence == 1 ) { bRetVal = TRUE; return bRetVal; } } return bRetVal; }
////////////////////////////////////////////////////////////////////////////////
// IExtendControlbar helpers
STDMETHODIMP_(BOOL) CSecPolItem::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
) { BOOL bActive = FALSE; PWIRELESS_POLICY_DATA pWirelessPolicyData = NULL; HANDLE hLocalPolicyStore = NULL; STORAGE_LOCATION eStgLocation = m_pComponentDataImpl->EnumLocation(); pWirelessPolicyData = GetWirelessPolicy(); bActive = CheckForEnabled(); // Handle only the enable/disable state
if (ENABLED == fsState) { // Our toolbar has only two items
if (IDM_ASSIGN == id || IDM_UNASSIGN == id) { // The toolbar items should be enabled only if we are pointed to the local machine
if (LOCATION_REMOTE == eStgLocation || LOCATION_LOCAL == eStgLocation // extension snapin?
|| (LOCATION_GLOBAL == eStgLocation && (NULL != m_pComponentDataImpl->GetStaticScopeObject()->GetExtScopeObject()))) { // Disable the SetActive button when policy is already active
if (IDM_ASSIGN == id) { if (bActive) return FALSE; else return TRUE; } // Disable the SetInactive button when policy is already inactive
else if (IDM_UNASSIGN == id) { if (!bActive) return FALSE; else return TRUE; } } else { // Disable both the SetActive and SetInactive buttons for DS based snap-in
return FALSE; } } } return FALSE; }
DWORD ComputePolicyDN( LPWSTR pszDirDomainName, GUID PolicyIdentifier, LPWSTR pszPolicyDN ) { DWORD dwError = 0; LPWSTR pszPolicyIdentifier = NULL; if (!pszDirDomainName) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } dwError = StringFromCLSID( PolicyIdentifier, &pszPolicyIdentifier ); BAIL_ON_WIN32_ERROR(dwError); wcscpy(pszPolicyDN,L"cn=msieee80211-Policy"); wcscat(pszPolicyDN,pszPolicyIdentifier); wcscat(pszPolicyDN,L",cn=Wireless Policy,cn=System,"); wcscat(pszPolicyDN, pszDirDomainName); error: if (pszPolicyIdentifier) { CoTaskMemFree(pszPolicyIdentifier); } return(dwError); }
|