195 lines
3.6 KiB
C++
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;
|
||
|
}
|
||
|
|