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

195 lines
3.6 KiB
C++

//+-------------------------------------------------------------------------
//
// 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<HPROPSHEETPAGE, HPROPSHEETPAGE, CPgIASAdv*, CPgIASAdv*> 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;
}