]> git.saurik.com Git - apple/mdnsresponder.git/blob - mDNSWindows/ControlPanel/SecondPage.cpp
a330e84f4287104110c2f806a2e4e7c840d9227b
[apple/mdnsresponder.git] / mDNSWindows / ControlPanel / SecondPage.cpp
1 /*
2 * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22
23 Change History (most recent first):
24
25 $Log: SecondPage.cpp,v $
26 Revision 1.3 2005/03/03 19:55:22 shersche
27 <rdar://problem/4034481> ControlPanel source code isn't saving CVS log info
28
29
30 */
31
32 #include "SecondPage.h"
33 #include "resource.h"
34
35 #include "ConfigPropertySheet.h"
36 #include "SharedSecret.h"
37
38 #include <WinServices.h>
39
40 IMPLEMENT_DYNCREATE(CSecondPage, CPropertyPage)
41
42
43 //---------------------------------------------------------------------------------------------------------------------------
44 // CSecondPage::CSecondPage
45 //---------------------------------------------------------------------------------------------------------------------------
46
47 CSecondPage::CSecondPage()
48 :
49 CPropertyPage(CSecondPage::IDD)
50 {
51 //{{AFX_DATA_INIT(CSecondPage)
52 //}}AFX_DATA_INIT
53 }
54
55
56 //---------------------------------------------------------------------------------------------------------------------------
57 // CSecondPage::~CSecondPage
58 //---------------------------------------------------------------------------------------------------------------------------
59
60 CSecondPage::~CSecondPage()
61 {
62 }
63
64
65 //---------------------------------------------------------------------------------------------------------------------------
66 // CSecondPage::DoDataExchange
67 //---------------------------------------------------------------------------------------------------------------------------
68
69 void CSecondPage::DoDataExchange(CDataExchange* pDX)
70 {
71 CPropertyPage::DoDataExchange(pDX);
72 //{{AFX_DATA_MAP(CSecondPage)
73 //}}AFX_DATA_MAP
74 DDX_Control(pDX, IDC_CHECK1, m_advertiseServicesButton);
75 DDX_Control(pDX, IDC_BUTTON1, m_sharedSecretButton);
76 DDX_Control(pDX, IDC_COMBO2, m_regDomainsBox);
77 }
78
79 BEGIN_MESSAGE_MAP(CSecondPage, CPropertyPage)
80 //{{AFX_MSG_MAP(CSecondPage)
81 //}}AFX_MSG_MAP
82 ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedSharedSecret)
83 ON_BN_CLICKED(IDC_CHECK1, OnBnClickedAdvertise)
84 ON_CBN_SELCHANGE(IDC_COMBO1, OnCbnSelChange)
85 ON_CBN_EDITCHANGE(IDC_COMBO1, OnCbnEditChange)
86 ON_CBN_EDITCHANGE(IDC_COMBO2, OnCbnEditChange)
87 ON_CBN_SELCHANGE(IDC_COMBO2, OnCbnSelChange)
88
89 END_MESSAGE_MAP()
90
91
92 //---------------------------------------------------------------------------------------------------------------------------
93 // CSecondPage::SetModified
94 //---------------------------------------------------------------------------------------------------------------------------
95
96 void CSecondPage::SetModified( BOOL bChanged )
97 {
98 m_modified = bChanged;
99
100 CPropertyPage::SetModified( bChanged );
101 }
102
103
104 //---------------------------------------------------------------------------------------------------------------------------
105 // CSecondPage::OnSetActive
106 //---------------------------------------------------------------------------------------------------------------------------
107
108 BOOL
109 CSecondPage::OnSetActive()
110 {
111 CConfigPropertySheet * psheet;
112 HKEY key = NULL;
113 DWORD dwSize;
114 DWORD enabled;
115 DWORD err;
116 BOOL b = CPropertyPage::OnSetActive();
117
118 psheet = reinterpret_cast<CConfigPropertySheet*>(GetParent());
119 require_quiet( psheet, exit );
120
121 m_modified = FALSE;
122
123 // Clear out what's there
124
125 EmptyComboBox( m_regDomainsBox );
126
127 // Now populate the registration domain box
128
129 err = RegCreateKey( HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\" kServiceName L"\\Parameters\\DynDNS\\Setup\\" kServiceDynDNSRegistrationDomains, &key );
130 require_noerr( err, exit );
131
132 err = Populate( m_regDomainsBox, key, psheet->m_regDomains );
133 check_noerr( err );
134
135 dwSize = sizeof( DWORD );
136 err = RegQueryValueEx( key, L"Enabled", NULL, NULL, (LPBYTE) &enabled, &dwSize );
137 m_advertiseServicesButton.SetCheck( ( !err && enabled ) ? BST_CHECKED : BST_UNCHECKED );
138 m_regDomainsBox.EnableWindow( ( !err && enabled ) );
139 m_sharedSecretButton.EnableWindow( (!err && enabled ) );
140
141 RegCloseKey( key );
142
143 exit:
144
145 return b;
146 }
147
148
149 //---------------------------------------------------------------------------------------------------------------------------
150 // CSecondPage::OnOK
151 //---------------------------------------------------------------------------------------------------------------------------
152
153 void
154 CSecondPage::OnOK()
155 {
156 if ( m_modified )
157 {
158 Commit();
159 }
160 }
161
162
163
164 //---------------------------------------------------------------------------------------------------------------------------
165 // CSecondPage::Commit
166 //---------------------------------------------------------------------------------------------------------------------------
167
168 void
169 CSecondPage::Commit()
170 {
171 HKEY key = NULL;
172 DWORD err;
173
174 err = RegCreateKey( HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\" kServiceName L"\\Parameters\\DynDNS\\Setup\\" kServiceDynDNSRegistrationDomains, &key );
175 require_noerr( err, exit );
176
177 err = Commit( m_regDomainsBox, key, m_advertiseServicesButton.GetCheck() == BST_CHECKED );
178 check_noerr( err );
179
180 exit:
181
182 if ( key )
183 {
184 RegCloseKey( key );
185 }
186 }
187
188
189 //---------------------------------------------------------------------------------------------------------------------------
190 // CSecondPage::Commit
191 //---------------------------------------------------------------------------------------------------------------------------
192
193 OSStatus
194 CSecondPage::Commit( CComboBox & box, HKEY key, DWORD enabled )
195 {
196 CString selected;
197 OSStatus err = kNoErr;
198
199 // Get selected text
200
201 box.GetWindowText( selected );
202
203 // If we haven't seen this string before, add the string to the box and
204 // the registry
205
206 if ( ( selected.GetLength() > 0 ) && ( box.FindStringExact( -1, selected ) == CB_ERR ) )
207 {
208 CString string;
209
210 box.AddString( selected );
211
212 err = RegQueryString( key, L"UserDefined", string );
213 check_noerr( err );
214
215 if ( string.GetLength() )
216 {
217 string += L"," + selected;
218 }
219 else
220 {
221 string = selected;
222 }
223
224 err = RegSetValueEx( key, L"UserDefined", 0, REG_SZ, (LPBYTE) (LPCTSTR) string, ( string.GetLength() + 1) * sizeof( TCHAR ) );
225 check_noerr ( err );
226 }
227
228 // Save selected text in registry. This will trigger mDNSResponder to setup
229 // DynDNS config again
230
231 err = RegSetValueEx( key, L"", 0, REG_SZ, (LPBYTE) (LPCTSTR) selected, ( selected.GetLength() + 1 ) * sizeof( TCHAR ) );
232 check_noerr( err );
233
234 err = RegSetValueEx( key, L"Enabled", 0, REG_DWORD, (LPBYTE) &enabled, sizeof( DWORD ) );
235 check_noerr( err );
236
237 return err;
238 }
239
240
241 //---------------------------------------------------------------------------------------------------------------------------
242 // CSecondPage::OnBnClickedSharedSecret
243 //---------------------------------------------------------------------------------------------------------------------------
244
245 void CSecondPage::OnBnClickedSharedSecret()
246 {
247 CString string;
248
249 m_regDomainsBox.GetWindowText( string );
250
251 CSharedSecret dlg;
252
253 dlg.m_secretName = string;
254
255 dlg.DoModal();
256 }
257
258
259 //---------------------------------------------------------------------------------------------------------------------------
260 // CSecondPage::OnBnClickedAdvertise
261 //---------------------------------------------------------------------------------------------------------------------------
262
263 void CSecondPage::OnBnClickedAdvertise()
264 {
265 int state;
266
267 state = m_advertiseServicesButton.GetCheck();
268
269 m_regDomainsBox.EnableWindow( state );
270 m_sharedSecretButton.EnableWindow( state );
271
272 SetModified( TRUE );
273 }
274
275
276 //---------------------------------------------------------------------------------------------------------------------------
277 // CSecondPage::OnCbnSelChange
278 //---------------------------------------------------------------------------------------------------------------------------
279
280 void CSecondPage::OnCbnSelChange()
281 {
282 SetModified( TRUE );
283 }
284
285
286 //---------------------------------------------------------------------------------------------------------------------------
287 // CSecondPage::OnCbnEditChange
288 //---------------------------------------------------------------------------------------------------------------------------
289
290 void CSecondPage::OnCbnEditChange()
291 {
292 SetModified( TRUE );
293 }
294
295
296
297 //---------------------------------------------------------------------------------------------------------------------------
298 // CSecondPage::OnAddRegistrationDomain
299 //---------------------------------------------------------------------------------------------------------------------------
300
301 void
302 CSecondPage::OnAddRegistrationDomain( CString & domain )
303 {
304 int index = m_regDomainsBox.FindStringExact( -1, domain );
305
306 if ( index == CB_ERR )
307 {
308 m_regDomainsBox.AddString( domain );
309 }
310 }
311
312
313 //---------------------------------------------------------------------------------------------------------------------------
314 // CSecondPage::OnRemoveRegistrationDomain
315 //---------------------------------------------------------------------------------------------------------------------------
316
317 void
318 CSecondPage::OnRemoveRegistrationDomain( CString & domain )
319 {
320 int index = m_regDomainsBox.FindStringExact( -1, domain );
321
322 if ( index != CB_ERR )
323 {
324 m_regDomainsBox.DeleteString( index );
325 }
326 }
327
328
329 //---------------------------------------------------------------------------------------------------------------------------
330 // CSecondPage::EmptyComboBox
331 //---------------------------------------------------------------------------------------------------------------------------
332
333 void
334 CSecondPage::EmptyComboBox( CComboBox & box )
335 {
336 while ( box.GetCount() > 0 )
337 {
338 box.DeleteString( 0 );
339 }
340 }
341
342
343 //---------------------------------------------------------------------------------------------------------------------------
344 // CSecondPage::Populate
345 //---------------------------------------------------------------------------------------------------------------------------
346
347 OSStatus
348 CSecondPage::Populate( CComboBox & box, HKEY key, StringList & l )
349 {
350 TCHAR rawString[kDNSServiceMaxDomainName + 1];
351 DWORD rawStringLen;
352 CString string;
353 OSStatus err;
354
355 err = RegQueryString( key, L"UserDefined", string );
356
357 if ( !err && string.GetLength() )
358 {
359 bool done = false;
360
361 while ( !done )
362 {
363 CString tok;
364
365 tok = string.SpanExcluding( L"," );
366
367 box.AddString( tok );
368
369 if ( tok != string )
370 {
371 // Get rid of that string and comma
372
373 string = string.Right( string.GetLength() - tok.GetLength() - 1 );
374 }
375 else
376 {
377 done = true;
378 }
379 }
380 }
381
382 StringList::iterator it;
383
384 for ( it = l.begin(); it != l.end(); it++ )
385 {
386 if ( box.FindStringExact( -1, *it ) == CB_ERR )
387 {
388 box.AddString( *it );
389 }
390 }
391
392 // Now look to see if there is a selected string, and if so,
393 // select it
394
395 rawString[0] = '\0';
396
397 rawStringLen = sizeof( rawString );
398
399 err = RegQueryValueEx( key, L"", 0, NULL, (LPBYTE) rawString, &rawStringLen );
400
401 string = rawString;
402
403 if ( !err && ( string.GetLength() != 0 ) )
404 {
405 // See if it's there
406
407 if ( box.SelectString( -1, string ) == CB_ERR )
408 {
409 // If not, add it
410
411 box.AddString( string );
412 }
413
414 box.SelectString( -1, string );
415 }
416
417 return err;
418 }
419
420
421 //---------------------------------------------------------------------------------------------------------------------------
422 // CSecondPage::CreateKey
423 //---------------------------------------------------------------------------------------------------------------------------
424
425 OSStatus
426 CSecondPage::CreateKey( CString & name, DWORD enabled )
427 {
428 HKEY key = NULL;
429 OSStatus err;
430
431 err = RegCreateKey( HKEY_LOCAL_MACHINE, (LPCTSTR) name, &key );
432 require_noerr( err, exit );
433
434 err = RegSetValueEx( key, L"Enabled", 0, REG_DWORD, (LPBYTE) &enabled, sizeof( DWORD ) );
435 check_noerr( err );
436
437 exit:
438
439 if ( key )
440 {
441 RegCloseKey( key );
442 }
443
444 return err;
445 }
446
447
448 //---------------------------------------------------------------------------------------------------------------------------
449 // CSecondPage::RegQueryString
450 //---------------------------------------------------------------------------------------------------------------------------
451
452 OSStatus
453 CSecondPage::RegQueryString( HKEY key, CString valueName, CString & value )
454 {
455 TCHAR * string;
456 DWORD stringLen;
457 int i;
458 OSStatus err;
459
460 stringLen = 1024;
461 string = NULL;
462 i = 0;
463
464 do
465 {
466 if ( string )
467 {
468 free( string );
469 }
470
471 string = (TCHAR*) malloc( stringLen );
472 require_action( string, exit, err = kUnknownErr );
473
474 err = RegQueryValueEx( key, valueName, 0, NULL, (LPBYTE) string, &stringLen );
475
476 i++;
477 }
478 while ( ( err == ERROR_MORE_DATA ) && ( i < 100 ) );
479
480 value = string;
481
482 exit:
483
484 if ( string )
485 {
486 free( string );
487 }
488
489 return err;
490 }