/**********************************************************************/ /** 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 #include #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* pObj; int currentIndex = -1; CHECK_HR( hr = CComObject::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(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