//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1998 // // File: rasprof.cpp // //-------------------------------------------------------------------------- #include "stdafx.h" #include "rasdial.h" #include "rasprof.h" #include "profsht.h" #include "pgiasadv.h" //======================================== // // Open profile UI API -- expose advanced page // // critical section protected pointer map class CAdvPagePointerMap { public: ~CAdvPagePointerMap() { HPROPSHEETPAGE hPage = NULL; CPgIASAdv* pPage = NULL; m_cs.Lock(); POSITION pos = m_mPointers.GetStartPosition(); while(pos) { m_mPointers.GetNextAssoc(pos, hPage, pPage); if(pPage) delete pPage; } m_mPointers.RemoveAll(); m_cs.Unlock(); }; BOOL AddItem(HPROPSHEETPAGE hPage, CPgIASAdv* pPage) { BOOL bRet = TRUE; if(!pPage || !hPage) return FALSE; m_cs.Lock(); try{ m_mPointers.SetAt(hPage, pPage); }catch(...) { bRet = FALSE; } m_cs.Unlock(); return bRet; }; CPgIASAdv* FindAndRemoveItem(HPROPSHEETPAGE hPage) { CPgIASAdv* pPage = NULL; if (!hPage) return NULL; m_cs.Lock(); m_mPointers.Lookup(hPage, pPage); m_mPointers.RemoveKey(hPage); m_cs.Unlock(); return pPage; }; protected: CMap m_mPointers; CCriticalSection m_cs; } AdvancedPagePointerMap; //======================================== // // Open profile UI API -- expose advanced page // // create a profile advanced page DllExport HPROPSHEETPAGE WINAPI IASCreateProfileAdvancedPage( ISdo* pProfile, ISdoDictionaryOld* pDictionary, LONG lFilter, // Mask used to test which attributes will be included. void* pvData // Contains std::vector< CComPtr< IIASAttributeInfo > > * ) { HPROPSHEETPAGE hPage = NULL; CPgIASAdv* pPage = NULL; AFX_MANAGE_STATE(AfxGetStaticModuleState()); try{ pPage = new CPgIASAdv(pProfile, pDictionary); if(pPage) { pPage->SetData(lFilter, pvData); hPage = ::CreatePropertySheetPage(&pPage->m_psp); if (!hPage) delete pPage; else AdvancedPagePointerMap.AddItem(hPage, pPage); } } catch (...) { SetLastError(ERROR_OUTOFMEMORY); if(pPage) { delete pPage; pPage = NULL; hPage = NULL; } } return hPage; } //======================================== // // Open profile UI API -- expose advanced page // // clean up the resources used by C++ object DllExport BOOL WINAPI IASDeleteProfileAdvancedPage( HPROPSHEETPAGE hPage ) { CPgIASAdv* pPage = AdvancedPagePointerMap.FindAndRemoveItem(hPage); if (!pPage) return FALSE; delete pPage; return TRUE; } //======================================== // // Open profile UI API // DllExport HRESULT OpenRAS_IASProfileDlg( LPCWSTR pMachineName, ISdo* pProfile, // profile SDO pointer ISdoDictionaryOld * pDictionary, // dictionary SDO pointer BOOL bReadOnly, // if the dlg is for readonly DWORD dwTabFlags, // what to show void *pvData // additional data ) { HRESULT hr = S_OK; if(!pProfile || !pDictionary) return E_INVALIDARG; AFX_MANAGE_STATE(AfxGetStaticModuleState()); CRASProfileMerge profile(pProfile, pDictionary); profile.SetMachineName(pMachineName); hr = profile.Load(); if(!FAILED(hr)) { CProfileSheetMerge sh(profile, true, IDS_EDITDIALINPROFILE); sh.SetReadOnly(bReadOnly); sh.PreparePages(dwTabFlags, pvData); if(IDOK == sh.DoModal()) { if(sh.GetLastError() != S_OK) hr = sh.GetLastError(); else if(!sh.IsApplied()) hr = S_FALSE; } else hr = S_FALSE; } return hr; }