]> git.saurik.com Git - apple/mdnsresponder.git/blob - mDNSWindows/ControlPanel/BrowsingPage.cpp
mDNSResponder-258.13.tar.gz
[apple/mdnsresponder.git] / mDNSWindows / ControlPanel / BrowsingPage.cpp
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