windows-nt/Source/XPSP1/NT/net/mmc/acssnap/acsuser.cpp
2020-09-26 16:20:57 +08:00

382 lines
9.1 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1998 **/
/**********************************************************************/
/*
AcsUser.cpp
Implements the ACS User object extension
FILE HISTORY:
11/03/97 Wei Jiang Created
*/
// ACSUser.cpp : Implementation of CACSUser
#include "stdafx.h"
#include "acs.h"
#include "acsadmin.h"
#include "ACSUser.h"
#include <dsgetdc.h>
#include <mmc.h>
#if 0 // user page is removed
/////////////////////////////////////////////////////////////////////////////
// CACSUser
CACSUser::CACSUser()
{
m_pPage = NULL;
m_pwszObjName = NULL;
m_pwszClass = NULL;
m_ObjMedium.tymed =TYMED_HGLOBAL;
m_ObjMedium.hGlobal = NULL;
m_bShowPage = TRUE;
}
CACSUser::~CACSUser()
{
// stgmedia
delete m_pPage;
ReleaseStgMedium(&m_ObjMedium);
}
//===============================================================================
// IShellExtInit::Initialize
//
// information of the user object is passed in via parameter pDataObject
// further processing will be based on the DN of the user object
STDMETHODIMP CACSUser::Initialize
(
LPCITEMIDLIST pIDFolder,
LPDATAOBJECT pDataObj,
HKEY hRegKey
)
{
TRACE(_T("CACSUser::Initialize()\r\n"));
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ASSERT (pDataObj != NULL);
LPDSOBJECTNAMES pDsObjectNames;
// get the object name out of the pDataObj
UINT cfDsObjectNames = RegisterClipboardFormat(CFSTR_DSOBJECTNAMES);
FORMATETC fmte = {cfDsObjectNames, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
// Get the path to the DS object from the data object.
// Note: This call runs on the caller's main thread. The pages' window
// procs run on a different thread, so don't reference the data object
// from a winproc unless it is first marshalled on this thread.
HRESULT hr = pDataObj->GetData(&fmte, &m_ObjMedium);
if (!SUCCEEDED (hr))
{
ASSERT (0);
return hr;
}
pDsObjectNames = (LPDSOBJECTNAMES)m_ObjMedium.hGlobal;
if (pDsObjectNames->cItems < 1)
{
ASSERT (0);
return E_FAIL;
}
m_bShowPage = (pDsObjectNames->aObjects[0].dwProviderFlags & DSPROVIDER_ADVANCED);
// if not to show the page, then nothing need to be done after this
if(!m_bShowPage)
return hr;
// get the name of the object
m_pwszObjName = (LPWSTR)ByteOffset(pDsObjectNames, pDsObjectNames->aObjects[0].offsetName);
// get the class name of the object
m_pwszClass = (LPWSTR)ByteOffset(pDsObjectNames, pDsObjectNames->aObjects[0].offsetClass);
// if the user object is exist, change the user name, and load the property
ASSERT(!m_pPage); // it should have been consumed or new
try{
m_pPage = new CACSUserPg();
}catch(CMemoryException&)
{
delete m_pPage;
m_pPage = NULL;
}
if(!m_pPage)
return E_OUTOFMEMORY;
return m_pPage->Load(m_pwszObjName);
}
//
// FUNCTION: IShellPropSheetExt::AddPages(LPFNADDPROPSHEETPAGE, LPARAM)
//
// PURPOSE: Called by the shell just before the property sheet is displayed.
//
// PARAMETERS:
// lpfnAddPage - Pointer to the Shell's AddPage function
// lParam - Passed as second parameter to lpfnAddPage
//
// RETURN VALUE:
//
// NOERROR in all cases. If for some reason our pages don't get added,
// the Shell still needs to bring up the Properties... sheet.
//
// COMMENTS:
//
STDMETHODIMP CACSUser::AddPages(LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam)
{
TRACE(_T("CACSUser::AddPages()\r\n"));
// if not to show the page, then nothing need to be done after this
if(!m_bShowPage)
return S_OK;
// param validation
ASSERT (lpfnAddPage);
if (lpfnAddPage == NULL)
return E_UNEXPECTED;
// make sure our state is fixed up (cause we don't know what context we were called in)
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ASSERT(m_pPage); // the page object must have been created in initialize
VERIFY(SUCCEEDED(MMCPropPageCallback(&m_pPage->m_psp)));
HPROPSHEETPAGE hPage = CreatePropertySheetPage(&(m_pPage->m_psp));
ASSERT (hPage);
if (hPage == NULL)
return E_UNEXPECTED;
// add the page
lpfnAddPage (hPage, lParam);
m_pPage = NULL; // since it's just consumed by the dialog, cannot added again
return S_OK;
}
//
// FUNCTION: IShellPropSheetExt::ReplacePage(UINT, LPFNADDPROPSHEETPAGE, LPARAM)
//
// PURPOSE: Called by the shell only for Control Panel property sheet
// extensions
//
// PARAMETERS:
// uPageID - ID of page to be replaced
// lpfnReplaceWith - Pointer to the Shell's Replace function
// lParam - Passed as second parameter to lpfnReplaceWith
//
// RETURN VALUE:
//
// E_FAIL, since we don't support this function. It should never be
// called.
// COMMENTS:
//
STDMETHODIMP CACSUser::ReplacePage
(
UINT uPageID,
LPFNADDPROPSHEETPAGE lpfnReplaceWith,
LPARAM lParam
)
{
TRACE(_T("CACSUser::ReplacePage()\r\n"));
return E_FAIL;
}
/////////////////////////////////////////////////////////////////////////////
// CACSUserPg property page
IMPLEMENT_DYNCREATE(CACSUserPg, CACSPage)
BEGIN_MESSAGE_MAP(CACSUserPg, CACSPage)
//{{AFX_MSG_MAP(CACSUserPg)
ON_CBN_EDITCHANGE(IDC_COMBOUSERPROFILENAME, OnEditchangeCombouserprofilename)
ON_CBN_SELCHANGE(IDC_COMBOUSERPROFILENAME, OnSelchangeCombouserprofilename)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CACSUserPg::CACSUserPg() : CACSPage(CACSUserPg::IDD)
{
//{{AFX_DATA_INIT(CACSUserPg)
m_strProfileName = _T("");
//}}AFX_DATA_INIT
m_pBox = NULL;
}
CACSUserPg::~CACSUserPg()
{
delete m_pBox;
}
void CACSUserPg::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CACSUserPg)
DDX_CBString(pDX, IDC_COMBOUSERPROFILENAME, m_strProfileName);
DDV_MaxChars(pDX, m_strProfileName, 128);
//}}AFX_DATA_MAP
}
BOOL CACSUserPg::OnApply()
{
if(!GetModified()) return TRUE;
m_strArrayPolicyNames.DeleteAll();
if(!m_strProfileName.IsEmpty())
{
CString* pStr = NULL;
try
{
pStr = new CString();
*pStr = m_strProfileName;
m_strArrayPolicyNames.Add(pStr);
pStr = NULL;
}
catch(CMemoryException&)
{
delete pStr;
}
}
Save();
// TODO: Add your specialized code here and/or call the base class
return CACSPage::OnApply();
}
HRESULT CACSUserPg::Load(LPCWSTR userPath)
{
HRESULT hr;
// get the DS user attributes for PolicyName
// IADsContainer interface for the user object
if(FAILED(hr = ADsOpenObject((LPWSTR)userPath, NULL, NULL, ADS_SECURE_AUTHENTICATION | ADS_USE_SIGNING | ADS_USE_SEALING, IID_IADs, (void**)&m_spIADs)))
return hr;
ASSERT((IADs*)m_spIADs);
VARIANT var;
VariantInit(&var);
// framed route
m_strArrayPolicyNames.DeleteAll();
if SUCCEEDED(hr = m_spIADs->GetEx(ACS_UAN_POLICYNAME, &var))
{
m_strArrayPolicyNames = (SAFEARRAY*)V_ARRAY(&var);
}
else if (!NOTINCACHE(hr))
goto L_ERR;
VariantClear(&var);
L_SUCC:
hr = S_OK;
goto L_CLEANUP;
L_ERR:
goto L_CLEANUP;
L_CLEANUP:
VariantClear(&var);
return hr;
}
HRESULT CACSUserPg::Save()
{
HRESULT hr;
if(!(IADs*)m_spIADs)
return E_FAIL;
VARIANT var;
VariantInit(&var);
// Policy names
if(m_strArrayPolicyNames.GetSize())
{
V_VT(&var) = VT_VARIANT | VT_ARRAY;
V_ARRAY(&var) = (SAFEARRAY*)m_strArrayPolicyNames;
CHECK_HR(hr = m_spIADs->PutEx(ADS_PROPERTY_UPDATE,ACS_UAN_POLICYNAME, var));
}
else
{
if(S_OK == m_spIADs->GetEx(ACS_UAN_POLICYNAME, &var))
CHECK_HR(hr = m_spIADs->PutEx(ADS_PROPERTY_CLEAR, ACS_UAN_POLICYNAME, var));
}
VariantClear(&var);
CHECK_HR( hr = m_spIADs->SetInfo() );
L_ERR:
// message box to display error message -- FAILED to SAVE
return hr;
}
BOOL CACSUserPg::OnInitDialog()
{
HRESULT hr = S_OK;
CStrArray* pStrArray;
CComObject<CACSGlobalProfiles>* pObj;
int currentIndex = -1;
CHECK_HR( hr = CComObject<CACSGlobalProfiles>::CreateInstance(&pObj));
ASSERT(pObj);
m_spGlobalProfiles = (CACSGlobalProfiles*)pObj;
CHECK_HR( hr = m_spGlobalProfiles->Open());
pStrArray = m_spGlobalProfiles->GetChildrenNameList();
if(pStrArray)
m_GlobalProfileNames = *pStrArray;
// Initialize profile name
if(m_strArrayPolicyNames.GetSize())
m_strProfileName = *(m_strArrayPolicyNames[0]);
if(m_strProfileName.GetLength() && (currentIndex = m_GlobalProfileNames.Find(m_strProfileName)) == -1)
{
try
{
CString* pStr = new CString(m_strProfileName);
currentIndex = m_GlobalProfileNames.Add(pStr);
}
catch(CMemoryException&){} // it's ok even if the string is not added to the array
}
CACSPage::OnInitDialog();
// Initialize combo box list
// fillin the list box
try{
m_pBox = new CStrBox<CComboBox>(this, IDC_COMBOUSERPROFILENAME, m_GlobalProfileNames);
m_pBox->Fill();
if(currentIndex != -1)
m_pBox->Select(currentIndex);
}
catch(CMemoryException&)
{
CHECK_HR(hr = E_OUTOFMEMORY);
};
L_ERR:
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CACSUserPg::OnEditchangeCombouserprofilename()
{
SetModified(TRUE);
}
void CACSUserPg::OnSelchangeCombouserprofilename()
{
SetModified(TRUE);
}
#endif // #if 0