2 * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
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
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.
21 * @APPLE_LICENSE_HEADER_END@
23 Change History (most recent first):
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
32 #include "SecondPage.h"
35 #include "ConfigPropertySheet.h"
36 #include "SharedSecret.h"
38 #include <WinServices.h>
40 IMPLEMENT_DYNCREATE(CSecondPage
, CPropertyPage
)
43 //---------------------------------------------------------------------------------------------------------------------------
44 // CSecondPage::CSecondPage
45 //---------------------------------------------------------------------------------------------------------------------------
47 CSecondPage::CSecondPage()
49 CPropertyPage(CSecondPage::IDD
)
51 //{{AFX_DATA_INIT(CSecondPage)
56 //---------------------------------------------------------------------------------------------------------------------------
57 // CSecondPage::~CSecondPage
58 //---------------------------------------------------------------------------------------------------------------------------
60 CSecondPage::~CSecondPage()
65 //---------------------------------------------------------------------------------------------------------------------------
66 // CSecondPage::DoDataExchange
67 //---------------------------------------------------------------------------------------------------------------------------
69 void CSecondPage::DoDataExchange(CDataExchange
* pDX
)
71 CPropertyPage::DoDataExchange(pDX
);
72 //{{AFX_DATA_MAP(CSecondPage)
74 DDX_Control(pDX
, IDC_CHECK1
, m_advertiseServicesButton
);
75 DDX_Control(pDX
, IDC_BUTTON1
, m_sharedSecretButton
);
76 DDX_Control(pDX
, IDC_COMBO2
, m_regDomainsBox
);
79 BEGIN_MESSAGE_MAP(CSecondPage
, CPropertyPage
)
80 //{{AFX_MSG_MAP(CSecondPage)
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
)
92 //---------------------------------------------------------------------------------------------------------------------------
93 // CSecondPage::SetModified
94 //---------------------------------------------------------------------------------------------------------------------------
96 void CSecondPage::SetModified( BOOL bChanged
)
98 m_modified
= bChanged
;
100 CPropertyPage::SetModified( bChanged
);
104 //---------------------------------------------------------------------------------------------------------------------------
105 // CSecondPage::OnSetActive
106 //---------------------------------------------------------------------------------------------------------------------------
109 CSecondPage::OnSetActive()
111 CConfigPropertySheet
* psheet
;
116 BOOL b
= CPropertyPage::OnSetActive();
118 psheet
= reinterpret_cast<CConfigPropertySheet
*>(GetParent());
119 require_quiet( psheet
, exit
);
123 // Clear out what's there
125 EmptyComboBox( m_regDomainsBox
);
127 // Now populate the registration domain box
129 err
= RegCreateKey( HKEY_LOCAL_MACHINE
, L
"SYSTEM\\CurrentControlSet\\Services\\" kServiceName L
"\\Parameters\\DynDNS\\Setup\\" kServiceDynDNSRegistrationDomains
, &key
);
130 require_noerr( err
, exit
);
132 err
= Populate( m_regDomainsBox
, key
, psheet
->m_regDomains
);
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
) );
149 //---------------------------------------------------------------------------------------------------------------------------
151 //---------------------------------------------------------------------------------------------------------------------------
164 //---------------------------------------------------------------------------------------------------------------------------
165 // CSecondPage::Commit
166 //---------------------------------------------------------------------------------------------------------------------------
169 CSecondPage::Commit()
174 err
= RegCreateKey( HKEY_LOCAL_MACHINE
, L
"SYSTEM\\CurrentControlSet\\Services\\" kServiceName L
"\\Parameters\\DynDNS\\Setup\\" kServiceDynDNSRegistrationDomains
, &key
);
175 require_noerr( err
, exit
);
177 err
= Commit( m_regDomainsBox
, key
, m_advertiseServicesButton
.GetCheck() == BST_CHECKED
);
189 //---------------------------------------------------------------------------------------------------------------------------
190 // CSecondPage::Commit
191 //---------------------------------------------------------------------------------------------------------------------------
194 CSecondPage::Commit( CComboBox
& box
, HKEY key
, DWORD enabled
)
197 OSStatus err
= kNoErr
;
201 box
.GetWindowText( selected
);
203 // If we haven't seen this string before, add the string to the box and
206 if ( ( selected
.GetLength() > 0 ) && ( box
.FindStringExact( -1, selected
) == CB_ERR
) )
210 box
.AddString( selected
);
212 err
= RegQueryString( key
, L
"UserDefined", string
);
215 if ( string
.GetLength() )
217 string
+= L
"," + selected
;
224 err
= RegSetValueEx( key
, L
"UserDefined", 0, REG_SZ
, (LPBYTE
) (LPCTSTR
) string
, ( string
.GetLength() + 1) * sizeof( TCHAR
) );
228 // Save selected text in registry. This will trigger mDNSResponder to setup
229 // DynDNS config again
231 err
= RegSetValueEx( key
, L
"", 0, REG_SZ
, (LPBYTE
) (LPCTSTR
) selected
, ( selected
.GetLength() + 1 ) * sizeof( TCHAR
) );
234 err
= RegSetValueEx( key
, L
"Enabled", 0, REG_DWORD
, (LPBYTE
) &enabled
, sizeof( DWORD
) );
241 //---------------------------------------------------------------------------------------------------------------------------
242 // CSecondPage::OnBnClickedSharedSecret
243 //---------------------------------------------------------------------------------------------------------------------------
245 void CSecondPage::OnBnClickedSharedSecret()
249 m_regDomainsBox
.GetWindowText( string
);
253 dlg
.m_secretName
= string
;
259 //---------------------------------------------------------------------------------------------------------------------------
260 // CSecondPage::OnBnClickedAdvertise
261 //---------------------------------------------------------------------------------------------------------------------------
263 void CSecondPage::OnBnClickedAdvertise()
267 state
= m_advertiseServicesButton
.GetCheck();
269 m_regDomainsBox
.EnableWindow( state
);
270 m_sharedSecretButton
.EnableWindow( state
);
276 //---------------------------------------------------------------------------------------------------------------------------
277 // CSecondPage::OnCbnSelChange
278 //---------------------------------------------------------------------------------------------------------------------------
280 void CSecondPage::OnCbnSelChange()
286 //---------------------------------------------------------------------------------------------------------------------------
287 // CSecondPage::OnCbnEditChange
288 //---------------------------------------------------------------------------------------------------------------------------
290 void CSecondPage::OnCbnEditChange()
297 //---------------------------------------------------------------------------------------------------------------------------
298 // CSecondPage::OnAddRegistrationDomain
299 //---------------------------------------------------------------------------------------------------------------------------
302 CSecondPage::OnAddRegistrationDomain( CString
& domain
)
304 int index
= m_regDomainsBox
.FindStringExact( -1, domain
);
306 if ( index
== CB_ERR
)
308 m_regDomainsBox
.AddString( domain
);
313 //---------------------------------------------------------------------------------------------------------------------------
314 // CSecondPage::OnRemoveRegistrationDomain
315 //---------------------------------------------------------------------------------------------------------------------------
318 CSecondPage::OnRemoveRegistrationDomain( CString
& domain
)
320 int index
= m_regDomainsBox
.FindStringExact( -1, domain
);
322 if ( index
!= CB_ERR
)
324 m_regDomainsBox
.DeleteString( index
);
329 //---------------------------------------------------------------------------------------------------------------------------
330 // CSecondPage::EmptyComboBox
331 //---------------------------------------------------------------------------------------------------------------------------
334 CSecondPage::EmptyComboBox( CComboBox
& box
)
336 while ( box
.GetCount() > 0 )
338 box
.DeleteString( 0 );
343 //---------------------------------------------------------------------------------------------------------------------------
344 // CSecondPage::Populate
345 //---------------------------------------------------------------------------------------------------------------------------
348 CSecondPage::Populate( CComboBox
& box
, HKEY key
, StringList
& l
)
350 TCHAR rawString
[kDNSServiceMaxDomainName
+ 1];
355 err
= RegQueryString( key
, L
"UserDefined", string
);
357 if ( !err
&& string
.GetLength() )
365 tok
= string
.SpanExcluding( L
"," );
367 box
.AddString( tok
);
371 // Get rid of that string and comma
373 string
= string
.Right( string
.GetLength() - tok
.GetLength() - 1 );
382 StringList::iterator it
;
384 for ( it
= l
.begin(); it
!= l
.end(); it
++ )
386 if ( box
.FindStringExact( -1, *it
) == CB_ERR
)
388 box
.AddString( *it
);
392 // Now look to see if there is a selected string, and if so,
397 rawStringLen
= sizeof( rawString
);
399 err
= RegQueryValueEx( key
, L
"", 0, NULL
, (LPBYTE
) rawString
, &rawStringLen
);
403 if ( !err
&& ( string
.GetLength() != 0 ) )
407 if ( box
.SelectString( -1, string
) == CB_ERR
)
411 box
.AddString( string
);
414 box
.SelectString( -1, string
);
421 //---------------------------------------------------------------------------------------------------------------------------
422 // CSecondPage::CreateKey
423 //---------------------------------------------------------------------------------------------------------------------------
426 CSecondPage::CreateKey( CString
& name
, DWORD enabled
)
431 err
= RegCreateKey( HKEY_LOCAL_MACHINE
, (LPCTSTR
) name
, &key
);
432 require_noerr( err
, exit
);
434 err
= RegSetValueEx( key
, L
"Enabled", 0, REG_DWORD
, (LPBYTE
) &enabled
, sizeof( DWORD
) );
448 //---------------------------------------------------------------------------------------------------------------------------
449 // CSecondPage::RegQueryString
450 //---------------------------------------------------------------------------------------------------------------------------
453 CSecondPage::RegQueryString( HKEY key
, CString valueName
, CString
& value
)
471 string
= (TCHAR
*) malloc( stringLen
);
472 require_action( string
, exit
, err
= kUnknownErr
);
474 err
= RegQueryValueEx( key
, valueName
, 0, NULL
, (LPBYTE
) string
, &stringLen
);
478 while ( ( err
== ERROR_MORE_DATA
) && ( i
< 100 ) );