382 lines
9.1 KiB
C++
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
|