377 lines
8.7 KiB
C++
377 lines
8.7 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows/NT **/
|
|
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
pgnetwk.cpp
|
|
Implemenation of CPgNetworking -- property page to edit
|
|
profile attributes related to inter-networking
|
|
|
|
FILE HISTORY:
|
|
|
|
*/
|
|
// PgNetwk.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
// #include "dlgfilt.h"
|
|
#include "PgNetwk.h"
|
|
#include "hlptable.h"
|
|
#include "mprapi.h"
|
|
#include "std.h"
|
|
#include "mprsnap.h"
|
|
#include "infobase.h"
|
|
#include "router.h"
|
|
#include "mprfltr.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPgNetworkingMerge property page
|
|
|
|
IMPLEMENT_DYNCREATE(CPgNetworkingMerge, CManagedPage)
|
|
|
|
CPgNetworkingMerge::CPgNetworkingMerge(CRASProfileMerge* profile)
|
|
: CManagedPage(CPgNetworkingMerge::IDD),
|
|
m_pProfile(profile),
|
|
m_bInited(false),
|
|
m_dwStaticIP(0)
|
|
|
|
{
|
|
//{{AFX_DATA_INIT(CPgNetworkingMerge)
|
|
m_nRadioStatic = -1;
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_pBox = NULL;
|
|
m_nFiltersSize = 0;
|
|
|
|
if(!(m_pProfile->m_dwAttributeFlags & PABF_msRADIUSFramedIPAddress)) // not defined in policy
|
|
{
|
|
m_nRadioStatic = 2;
|
|
}
|
|
else
|
|
{
|
|
m_dwStaticIP = m_pProfile->m_dwFramedIPAddress;
|
|
|
|
switch(m_dwStaticIP)
|
|
{
|
|
case RAS_IP_USERSELECT:
|
|
m_nRadioStatic = 1;
|
|
break;
|
|
case RAS_IP_SERVERASSIGN:
|
|
m_nRadioStatic = 0;
|
|
break;
|
|
default:
|
|
m_nRadioStatic = 3;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// filters
|
|
if((BSTR)m_pProfile->m_cbstrFilters)
|
|
{
|
|
m_cbstrFilters.AssignBSTR(m_pProfile->m_cbstrFilters);
|
|
}
|
|
|
|
SetHelpTable(g_aHelpIDs_IDD_NETWORKING_MERGE);
|
|
}
|
|
|
|
CPgNetworkingMerge::~CPgNetworkingMerge()
|
|
{
|
|
delete m_pBox;
|
|
}
|
|
|
|
void CPgNetworkingMerge::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
ASSERT(m_pProfile);
|
|
CPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CPgNetworkingMerge)
|
|
DDX_Radio(pDX, IDC_RADIOSERVER, m_nRadioStatic);
|
|
//}}AFX_DATA_MAP
|
|
|
|
|
|
if(pDX->m_bSaveAndValidate) // save data to this class
|
|
{
|
|
// ip adress control
|
|
SendDlgItemMessage(IDC_EDIT_STATIC_IP_ADDRESS, IPM_GETADDRESS, 0, (LPARAM)&m_dwStaticIP);
|
|
}
|
|
else // put to dialog
|
|
{
|
|
// ip adress control
|
|
if(m_bInited)
|
|
{
|
|
SendDlgItemMessage(IDC_EDIT_STATIC_IP_ADDRESS, IPM_SETADDRESS, 0, m_dwStaticIP);
|
|
}
|
|
else
|
|
{
|
|
SendDlgItemMessage(IDC_EDIT_STATIC_IP_ADDRESS, IPM_CLEARADDRESS, 0, m_dwStaticIP);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CPgNetworkingMerge, CPropertyPage)
|
|
//{{AFX_MSG_MAP(CPgNetworkingMerge)
|
|
ON_BN_CLICKED(IDC_RADIOCLIENT, OnRadioclient)
|
|
ON_BN_CLICKED(IDC_RADIOSERVER, OnRadioserver)
|
|
ON_WM_HELPINFO()
|
|
ON_WM_CONTEXTMENU()
|
|
ON_BN_CLICKED(IDC_RADIODEFAULT, OnRadiodefault)
|
|
ON_BN_CLICKED(IDC_RADIOSTATIC, OnRadioStatic)
|
|
ON_BN_CLICKED(IDC_BUTTON_TOCLIENT, OnButtonToclient)
|
|
ON_BN_CLICKED(IDC_BUTTON_FROMCLIENT, OnButtonFromclient)
|
|
ON_EN_CHANGE(IDC_EDIT_STATIC_IP_ADDRESS, OnStaticIPAddressChanged)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
// ON_NOTIFY(EN_CHANGE, IDC_EDIT_STATIC_IP_ADDRESS, OnStaticIPAddressChanged)
|
|
|
|
// ON_BN_CLICKED(IDC_EDIT_STATIC_IP_ADDRESS, OnStaticIPAddress)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPgNetworking message handlers
|
|
|
|
BOOL CPgNetworkingMerge::OnInitDialog()
|
|
{
|
|
// necessary?
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
|
|
CPropertyPage::OnInitDialog();
|
|
m_bInited = true;
|
|
|
|
// tperraut HACK should be replaced by a proper init of the control
|
|
CWnd* IPWnd = GetDlgItem(IDC_EDIT_STATIC_IP_ADDRESS);
|
|
if (IPWnd != NULL)
|
|
{
|
|
IPWnd->EnableWindow(TRUE);
|
|
}
|
|
SendDlgItemMessage(IDC_EDIT_STATIC_IP_ADDRESS, IPM_SETADDRESS, 0, m_dwStaticIP);
|
|
|
|
if (m_nRadioStatic == 3)
|
|
{
|
|
CWnd* IPWnd = GetDlgItem(IDC_EDIT_STATIC_IP_ADDRESS);
|
|
if (IPWnd != NULL)
|
|
{
|
|
IPWnd->EnableWindow(TRUE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CWnd* IPWnd = GetDlgItem(IDC_EDIT_STATIC_IP_ADDRESS);
|
|
if (IPWnd != NULL)
|
|
{
|
|
IPWnd->EnableWindow(FALSE);
|
|
}
|
|
}
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CPgNetworkingMerge::OnRadioclient()
|
|
{
|
|
CWnd* IPWnd = GetDlgItem(IDC_EDIT_STATIC_IP_ADDRESS);
|
|
if (IPWnd != NULL)
|
|
{
|
|
IPWnd->EnableWindow(FALSE);
|
|
}
|
|
|
|
SendDlgItemMessage(IDC_EDIT_STATIC_IP_ADDRESS, IPM_SETADDRESS, 0, m_dwStaticIP);
|
|
|
|
SetModified();
|
|
}
|
|
|
|
void CPgNetworkingMerge::OnRadioserver()
|
|
{
|
|
CWnd* IPWnd = GetDlgItem(IDC_EDIT_STATIC_IP_ADDRESS);
|
|
if (IPWnd != NULL)
|
|
{
|
|
IPWnd->EnableWindow(FALSE);
|
|
}
|
|
|
|
SendDlgItemMessage(IDC_EDIT_STATIC_IP_ADDRESS, IPM_SETADDRESS, 0, m_dwStaticIP);
|
|
|
|
SetModified();
|
|
}
|
|
|
|
void CPgNetworkingMerge::OnRadiodefault()
|
|
{
|
|
CWnd* IPWnd = GetDlgItem(IDC_EDIT_STATIC_IP_ADDRESS);
|
|
if (IPWnd != NULL)
|
|
{
|
|
IPWnd->EnableWindow(FALSE);
|
|
}
|
|
|
|
SetModified();
|
|
}
|
|
|
|
|
|
void CPgNetworkingMerge::OnRadioStatic()
|
|
{
|
|
if (m_bInited)
|
|
{
|
|
CWnd* IPWnd = GetDlgItem(IDC_EDIT_STATIC_IP_ADDRESS);
|
|
if (IPWnd != NULL)
|
|
{
|
|
IPWnd->EnableWindow(TRUE);
|
|
}
|
|
}
|
|
|
|
SetModified();
|
|
}
|
|
|
|
|
|
void CPgNetworkingMerge::OnStaticIPAddressChanged()
|
|
{
|
|
SetModified();
|
|
}
|
|
|
|
|
|
void CPgNetworkingMerge::EnableFilterSettings(BOOL bEnable)
|
|
{
|
|
m_pBox->Enable(bEnable);
|
|
}
|
|
|
|
|
|
BOOL CPgNetworkingMerge::OnApply()
|
|
{
|
|
if (!GetModified()) return TRUE;
|
|
|
|
// get the IP policy value
|
|
switch(m_nRadioStatic)
|
|
{
|
|
// tperraut: check what kind of IP first?
|
|
case 3:
|
|
{
|
|
m_pProfile->m_dwAttributeFlags |= PABF_msRADIUSFramedIPAddress;
|
|
m_pProfile->m_dwFramedIPAddress = m_dwStaticIP;
|
|
break;
|
|
}
|
|
case 2: // default server settings
|
|
{
|
|
m_pProfile->m_dwFramedIPAddress = 0;
|
|
m_pProfile->m_dwAttributeFlags &= ~PABF_msRADIUSFramedIPAddress; // not defined in policy
|
|
break;
|
|
}
|
|
case 1: // client requre
|
|
{
|
|
m_pProfile->m_dwAttributeFlags |= PABF_msRADIUSFramedIPAddress;
|
|
m_pProfile->m_dwFramedIPAddress = RAS_IP_USERSELECT;
|
|
break; // server assign
|
|
}
|
|
case 0:
|
|
{
|
|
m_pProfile->m_dwAttributeFlags |= PABF_msRADIUSFramedIPAddress;
|
|
m_pProfile->m_dwFramedIPAddress = RAS_IP_SERVERASSIGN;
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
// assert ?
|
|
break;
|
|
}
|
|
}
|
|
|
|
// filters
|
|
m_pProfile->m_cbstrFilters.AssignBSTR((BSTR)m_cbstrFilters);
|
|
m_pProfile->m_nFiltersSize = m_nFiltersSize;
|
|
|
|
return CManagedPage::OnApply();
|
|
}
|
|
|
|
BOOL CPgNetworkingMerge::OnHelpInfo(HELPINFO* pHelpInfo)
|
|
{
|
|
return CManagedPage::OnHelpInfo(pHelpInfo);
|
|
}
|
|
|
|
void CPgNetworkingMerge::OnContextMenu(CWnd* pWnd, CPoint point)
|
|
{
|
|
CManagedPage::OnContextMenu(pWnd, point);
|
|
}
|
|
|
|
|
|
void CPgNetworkingMerge::OnButtonToclient()
|
|
{
|
|
// Create Info base,
|
|
SPIInfoBase spInfoBase;
|
|
HRESULT hr = S_OK;
|
|
PBYTE pByte = NULL;
|
|
SAFEARRAY* pSA = NULL;
|
|
DWORD size = 0;
|
|
|
|
CHECK_HR( hr = CreateInfoBase(&spInfoBase) );
|
|
|
|
size = m_cbstrFilters.ByteLen();
|
|
pByte = (PBYTE)(BSTR)m_cbstrFilters;
|
|
|
|
if(size && pByte)
|
|
{
|
|
CHECK_HR(hr = spInfoBase->LoadFrom(size, pByte));
|
|
}
|
|
|
|
pByte = NULL;
|
|
// call API to bring up the UI to edit filter
|
|
CHECK_HR( hr = MprUIFilterConfigInfoBase(GetSafeHwnd(), spInfoBase, NULL, PID_IP, FILTER_TO_USER));
|
|
|
|
if(hr == S_OK)
|
|
{
|
|
int iBlocks = 0;
|
|
spInfoBase->GetInfo(&size, &iBlocks);
|
|
|
|
CHECK_HR( hr = spInfoBase->WriteTo(&pByte, &size));
|
|
m_cbstrFilters.AssignBlob((const char*)pByte, size);
|
|
m_nFiltersSize = size;
|
|
SetModified();
|
|
}
|
|
|
|
// if user chooses OK, then set back the value, and set dirty bit
|
|
L_ERR:
|
|
CoTaskMemFree(pByte);
|
|
return;
|
|
}
|
|
|
|
void CPgNetworkingMerge::OnButtonFromclient()
|
|
{
|
|
// Create Info base,
|
|
SPIInfoBase spInfoBase;
|
|
HRESULT hr = S_OK;
|
|
PBYTE pByte = NULL;
|
|
DWORD size = 0;
|
|
|
|
CHECK_HR( hr = CreateInfoBase(&spInfoBase) );
|
|
|
|
size = m_cbstrFilters.ByteLen();
|
|
pByte = (PBYTE)(BSTR)m_cbstrFilters;
|
|
|
|
if(size && pByte)
|
|
{
|
|
CHECK_HR(hr = spInfoBase->LoadFrom(size, pByte));
|
|
}
|
|
|
|
pByte = NULL;
|
|
// call API to bring up the UI to edit filter
|
|
CHECK_HR( hr = MprUIFilterConfigInfoBase(GetSafeHwnd(), spInfoBase, NULL, PID_IP, FILTER_FROM_USER));
|
|
|
|
if(hr == S_OK)
|
|
{
|
|
int iBlocks = 0;
|
|
spInfoBase->GetInfo(&size, &iBlocks);
|
|
|
|
CHECK_HR( hr = spInfoBase->WriteTo(&pByte, &size));
|
|
m_cbstrFilters.AssignBlob((const char*)pByte, size);
|
|
m_nFiltersSize = size;
|
|
SetModified();
|
|
}
|
|
|
|
// if user chooses OK, then set back the value, and set dirty bit
|
|
L_ERR:
|
|
CoTaskMemFree(pByte);
|
|
return;
|
|
|
|
}
|