Home | History | Annotate | Download | only in ControlPanel
      1 /* -*- Mode: C; tab-width: 4 -*-
      2  *
      3  * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 #include "BrowsingPage.h"
     19 #include "resource.h"
     20 
     21 #include "ConfigPropertySheet.h"
     22 
     23 #include <WinServices.h>
     24 
     25 #define MAX_KEY_LENGTH 255
     26 
     27 
     28 IMPLEMENT_DYNCREATE(CBrowsingPage, CPropertyPage)
     29 
     30 
     31 //---------------------------------------------------------------------------------------------------------------------------
     32 //	CBrowsingPage::CBrowsingPage
     33 //---------------------------------------------------------------------------------------------------------------------------
     34 
     35 CBrowsingPage::CBrowsingPage()
     36 :
     37 	CPropertyPage(CBrowsingPage::IDD)
     38 {
     39 	//{{AFX_DATA_INIT(CBrowsingPage)
     40 	//}}AFX_DATA_INIT
     41 
     42 	m_firstTime = true;
     43 }
     44 
     45 
     46 //---------------------------------------------------------------------------------------------------------------------------
     47 //	CBrowsingPage::~CBrowsingPage
     48 //---------------------------------------------------------------------------------------------------------------------------
     49 
     50 CBrowsingPage::~CBrowsingPage()
     51 {
     52 }
     53 
     54 
     55 //---------------------------------------------------------------------------------------------------------------------------
     56 //	CBrowsingPage::DoDataExchange
     57 //---------------------------------------------------------------------------------------------------------------------------
     58 
     59 void CBrowsingPage::DoDataExchange(CDataExchange* pDX)
     60 {
     61 	CPropertyPage::DoDataExchange(pDX);
     62 	//{{AFX_DATA_MAP(CBrowsingPage)
     63 	//}}AFX_DATA_MAP
     64 	DDX_Control(pDX, IDC_BROWSE_LIST, m_browseListCtrl);
     65 	DDX_Control(pDX, IDC_REMOVE_BROWSE_DOMAIN, m_removeButton);
     66 }
     67 
     68 BEGIN_MESSAGE_MAP(CBrowsingPage, CPropertyPage)
     69 	//{{AFX_MSG_MAP(CBrowsingPage)
     70 	//}}AFX_MSG_MAP
     71 	ON_BN_CLICKED(IDC_ADD_BROWSE_DOMAIN, OnBnClickedAddBrowseDomain)
     72 	ON_BN_CLICKED(IDC_REMOVE_BROWSE_DOMAIN, OnBnClickedRemoveBrowseDomain)
     73 	ON_NOTIFY(LVN_ITEMCHANGED, IDC_BROWSE_LIST, OnLvnItemchangedBrowseList)
     74 END_MESSAGE_MAP()
     75 
     76 
     77 //---------------------------------------------------------------------------------------------------------------------------
     78 //	CBrowsingPage::SetModified
     79 //---------------------------------------------------------------------------------------------------------------------------
     80 
     81 void CBrowsingPage::SetModified( BOOL bChanged )
     82 {
     83 	m_modified = bChanged;
     84 
     85 	CPropertyPage::SetModified( bChanged );
     86 }
     87 
     88 
     89 //---------------------------------------------------------------------------------------------------------------------------
     90 //	CBrowsingPage::OnSetActive
     91 //---------------------------------------------------------------------------------------------------------------------------
     92 
     93 BOOL
     94 CBrowsingPage::OnSetActive()
     95 {
     96 	CConfigPropertySheet	*	psheet;
     97 	HKEY						key = NULL;
     98 	HKEY						subKey = NULL;
     99 	DWORD						dwSize;
    100 	DWORD						enabled;
    101 	DWORD						err;
    102 	TCHAR						subKeyName[MAX_KEY_LENGTH];
    103 	DWORD						cSubKeys = 0;
    104 	DWORD						cbMaxSubKey;
    105 	DWORD						cchMaxClass;
    106 	int							nIndex;
    107     DWORD						i;
    108 	BOOL						b = CPropertyPage::OnSetActive();
    109 
    110 	psheet = reinterpret_cast<CConfigPropertySheet*>(GetParent());
    111 	require_quiet( psheet, exit );
    112 
    113 	m_modified = FALSE;
    114 
    115 	if ( m_firstTime )
    116 	{
    117 		m_browseListCtrl.SetExtendedStyle((m_browseListCtrl.GetStyle() & (~LVS_EX_GRIDLINES))|LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
    118 
    119 		m_browseListCtrl.InsertColumn(0, L"", LVCFMT_LEFT, 20 );
    120 		m_browseListCtrl.InsertColumn(1, L"", LVCFMT_LEFT, 345);
    121 
    122 		m_firstTime = false;
    123 	}
    124 
    125 	m_initialized = false;
    126 
    127 	// Clear out what's there
    128 
    129 	m_browseListCtrl.DeleteAllItems();
    130 
    131 	// Now populate the browse domain box
    132 
    133 	err = RegCreateKeyEx( HKEY_LOCAL_MACHINE, kServiceParametersNode L"\\DynDNS\\Setup\\" kServiceDynDNSBrowseDomains, 0,
    134 		                  NULL, REG_OPTION_NON_VOLATILE, KEY_READ|KEY_WRITE|KEY_WOW64_32KEY, NULL, &key, NULL );
    135 	require_noerr( err, exit );
    136 
    137 	// Get information about this node
    138 
    139     err = RegQueryInfoKey( key, NULL, NULL, NULL, &cSubKeys, &cbMaxSubKey, &cchMaxClass, NULL, NULL, NULL, NULL, NULL );
    140 	require_noerr( err, exit );
    141 
    142 	for ( i = 0; i < cSubKeys; i++)
    143 	{
    144 		dwSize = MAX_KEY_LENGTH;
    145 
    146 		err = RegEnumKeyEx( key, i, subKeyName, &dwSize, NULL, NULL, NULL, NULL );
    147 		require_noerr( err, exit );
    148 
    149 		err = RegOpenKey( key, subKeyName, &subKey );
    150 		require_noerr( err, exit );
    151 
    152 		dwSize = sizeof( DWORD );
    153 		err = RegQueryValueEx( subKey, L"Enabled", NULL, NULL, (LPBYTE) &enabled, &dwSize );
    154 		require_noerr( err, exit );
    155 
    156 		nIndex = m_browseListCtrl.InsertItem( m_browseListCtrl.GetItemCount(), L"");
    157 		m_browseListCtrl.SetItemText( nIndex, 1, subKeyName );
    158 		m_browseListCtrl.SetCheck( nIndex, enabled );
    159 
    160 		RegCloseKey( subKey );
    161 		subKey = NULL;
    162     }
    163 
    164 	m_browseListCtrl.SortItems( SortFunc, (DWORD_PTR) this );
    165 
    166 	m_removeButton.EnableWindow( FALSE );
    167 
    168 exit:
    169 
    170 	if ( subKey )
    171 	{
    172 		RegCloseKey( subKey );
    173 	}
    174 
    175 	if ( key )
    176 	{
    177 		RegCloseKey( key );
    178 	}
    179 
    180 	m_initialized = true;
    181 
    182 	return b;
    183 }
    184 
    185 
    186 
    187 //---------------------------------------------------------------------------------------------------------------------------
    188 //	CBrowsingPage::OnOK
    189 //---------------------------------------------------------------------------------------------------------------------------
    190 
    191 void
    192 CBrowsingPage::OnOK()
    193 {
    194 	if ( m_modified )
    195 	{
    196 		Commit();
    197 	}
    198 }
    199 
    200 
    201 
    202 //---------------------------------------------------------------------------------------------------------------------------
    203 //	CBrowsingPage::Commit
    204 //---------------------------------------------------------------------------------------------------------------------------
    205 
    206 void
    207 CBrowsingPage::Commit()
    208 {
    209 	HKEY		key		= NULL;
    210 	HKEY		subKey	= NULL;
    211 	TCHAR		subKeyName[MAX_KEY_LENGTH];
    212 	DWORD		cSubKeys = 0;
    213 	DWORD		cbMaxSubKey;
    214 	DWORD		cchMaxClass;
    215 	DWORD		dwSize;
    216 	int			i;
    217 	DWORD		err;
    218 
    219 	err = RegCreateKeyEx( HKEY_LOCAL_MACHINE, kServiceParametersNode L"\\DynDNS\\Setup\\" kServiceDynDNSBrowseDomains, 0,
    220 	                      NULL, REG_OPTION_NON_VOLATILE, KEY_READ|KEY_WRITE|KEY_WOW64_32KEY, NULL, &key, NULL );
    221 	require_noerr( err, exit );
    222 
    223 	// First, remove all the entries that are there
    224 
    225     err = RegQueryInfoKey( key, NULL, NULL, NULL, &cSubKeys, &cbMaxSubKey, &cchMaxClass, NULL, NULL, NULL, NULL, NULL );
    226 	require_noerr( err, exit );
    227 
    228 	for ( i = 0; i < (int) cSubKeys; i++ )
    229 	{
    230 		dwSize = MAX_KEY_LENGTH;
    231 
    232 		err = RegEnumKeyEx( key, 0, subKeyName, &dwSize, NULL, NULL, NULL, NULL );
    233 		require_noerr( err, exit );
    234 
    235 		err = RegDeleteKey( key, subKeyName );
    236 		require_noerr( err, exit );
    237 	}
    238 
    239 	// Now re-populate
    240 
    241 	for ( i = 0; i < m_browseListCtrl.GetItemCount(); i++ )
    242 	{
    243 		DWORD enabled = (DWORD) m_browseListCtrl.GetCheck( i );
    244 
    245 		err = RegCreateKeyEx( key, m_browseListCtrl.GetItemText( i, 1 ), 0,
    246 		                      NULL, REG_OPTION_NON_VOLATILE, KEY_READ|KEY_WRITE|KEY_WOW64_32KEY, NULL, &subKey, NULL );
    247 		require_noerr( err, exit );
    248 
    249 		err = RegSetValueEx( subKey, L"Enabled", NULL, REG_DWORD, (LPBYTE) &enabled, sizeof( enabled ) );
    250 		require_noerr( err, exit );
    251 
    252 		RegCloseKey( subKey );
    253 		subKey = NULL;
    254 	}
    255 
    256 exit:
    257 
    258 	if ( subKey )
    259 	{
    260 		RegCloseKey( subKey );
    261 	}
    262 
    263 	if ( key )
    264 	{
    265 		RegCloseKey( key );
    266 	}
    267 }
    268 
    269 
    270 
    271 //---------------------------------------------------------------------------------------------------------------------------
    272 //	CBrowsingPage::OnBnClickedAddBrowseDomain
    273 //---------------------------------------------------------------------------------------------------------------------------
    274 
    275 void
    276 CBrowsingPage::OnBnClickedAddBrowseDomain()
    277 {
    278 	CAddBrowseDomain dlg( GetParent() );
    279 
    280 	if ( ( dlg.DoModal() == IDOK ) && ( dlg.m_text.GetLength() > 0 ) )
    281 	{
    282 		int nIndex;
    283 
    284 		nIndex = m_browseListCtrl.InsertItem( m_browseListCtrl.GetItemCount(), L"");
    285 		m_browseListCtrl.SetItemText( nIndex, 1, dlg.m_text );
    286 		m_browseListCtrl.SetCheck( nIndex, 1 );
    287 
    288 		m_browseListCtrl.SortItems( SortFunc, (DWORD_PTR) this );
    289 
    290 		m_browseListCtrl.Invalidate();
    291 
    292 		SetModified( TRUE );
    293 	}
    294 }
    295 
    296 
    297 //---------------------------------------------------------------------------------------------------------------------------
    298 //	CBrowsingPage::OnBnClickedRemoveBrowseDomain
    299 //---------------------------------------------------------------------------------------------------------------------------
    300 
    301 void
    302 CBrowsingPage::OnBnClickedRemoveBrowseDomain()
    303 {
    304 	UINT	selectedCount = m_browseListCtrl.GetSelectedCount();
    305 	int		nItem = -1;
    306 	UINT	i;
    307 
    308 	// Update all of the selected items.
    309 
    310 	for ( i = 0; i < selectedCount; i++ )
    311 	{
    312 		nItem = m_browseListCtrl.GetNextItem( -1, LVNI_SELECTED );
    313 		check( nItem != -1 );
    314 
    315 		m_browseListCtrl.DeleteItem( nItem );
    316 
    317 		SetModified( TRUE );
    318 	}
    319 
    320 	m_removeButton.EnableWindow( FALSE );
    321 }
    322 
    323 
    324 void
    325 CBrowsingPage::OnLvnItemchangedBrowseList(NMHDR *pNMHDR, LRESULT *pResult)
    326 {
    327 	if ( m_browseListCtrl.GetSelectedCount() )
    328 	{
    329 		m_removeButton.EnableWindow( TRUE );
    330 	}
    331 
    332 	if ( m_initialized )
    333 	{
    334 		NM_LISTVIEW * pNMListView = (NM_LISTVIEW*)pNMHDR;
    335 
    336 		BOOL bPrevState = (BOOL) ( ( ( pNMListView->uOldState & LVIS_STATEIMAGEMASK ) >> 12 ) - 1 );
    337 
    338 		if ( bPrevState < 0 )
    339 		{
    340 			bPrevState = 0;
    341 		}
    342 
    343 
    344 		BOOL bChecked = ( BOOL ) ( ( ( pNMListView->uNewState & LVIS_STATEIMAGEMASK ) >> 12) - 1 );
    345 
    346 		if ( bChecked < 0 )
    347 		{
    348 			bChecked = 0;
    349 		}
    350 
    351 		if ( bPrevState != bChecked )
    352 		{
    353 			SetModified( TRUE );
    354 		}
    355 	}
    356 
    357 	*pResult = 0;
    358 }
    359 
    360 
    361 
    362 int CALLBACK
    363 CBrowsingPage::SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    364 {
    365 	CString str1;
    366 	CString	str2;
    367 	int		ret = 0;
    368 
    369 	CBrowsingPage * self = reinterpret_cast<CBrowsingPage*>( lParamSort );
    370 	require_quiet( self, exit );
    371 
    372 	str1 = self->m_browseListCtrl.GetItemText( (int) lParam1, 1 );
    373 	str2 = self->m_browseListCtrl.GetItemText( (int) lParam2, 1 );
    374 
    375 	ret = str1.Compare( str2 );
    376 
    377 exit:
    378 
    379 	return ret;
    380 }
    381 
    382 
    383 // CAddBrowseDomain dialog
    384 
    385 IMPLEMENT_DYNAMIC(CAddBrowseDomain, CDialog)
    386 CAddBrowseDomain::CAddBrowseDomain(CWnd* pParent /*=NULL*/)
    387 	: CDialog(CAddBrowseDomain::IDD, pParent)
    388 {
    389 }
    390 
    391 CAddBrowseDomain::~CAddBrowseDomain()
    392 {
    393 }
    394 
    395 void CAddBrowseDomain::DoDataExchange(CDataExchange* pDX)
    396 {
    397 	CDialog::DoDataExchange(pDX);
    398 	DDX_Control(pDX, IDC_COMBO1, m_comboBox);
    399 }
    400 
    401 
    402 BOOL
    403 CAddBrowseDomain::OnInitDialog()
    404 {
    405 	CConfigPropertySheet	*	psheet;
    406 	CConfigPropertySheet::StringList::iterator		it;
    407 
    408 	BOOL b = CDialog::OnInitDialog();
    409 
    410 	psheet = reinterpret_cast<CConfigPropertySheet*>(GetParent());
    411 	require_quiet( psheet, exit );
    412 
    413 	for ( it = psheet->m_browseDomains.begin(); it != psheet->m_browseDomains.end(); it++ )
    414 	{
    415 		CString text = *it;
    416 
    417 		if ( m_comboBox.FindStringExact( -1, *it ) == CB_ERR )
    418 		{
    419 			m_comboBox.AddString( *it );
    420 		}
    421 	}
    422 
    423 exit:
    424 
    425 	return b;
    426 }
    427 
    428 
    429 void
    430 CAddBrowseDomain::OnOK()
    431 {
    432 	m_comboBox.GetWindowText( m_text );
    433 
    434 	CDialog::OnOK();
    435 }
    436 
    437 
    438 
    439 BEGIN_MESSAGE_MAP(CAddBrowseDomain, CDialog)
    440 END_MESSAGE_MAP()
    441 
    442