X-Git-Url: https://git.saurik.com/apple/mdnsresponder.git/blobdiff_plain/052924568ac81d9637dc4ae07e9de2887b7dc50c..0b74dd16dce34c1c64267ece7abda266fa586255:/mDNSWindows/ControlPanel/SecondPage.cpp?ds=inline diff --git a/mDNSWindows/ControlPanel/SecondPage.cpp b/mDNSWindows/ControlPanel/SecondPage.cpp index a330e84..b6cf4ff 100755 --- a/mDNSWindows/ControlPanel/SecondPage.cpp +++ b/mDNSWindows/ControlPanel/SecondPage.cpp @@ -1,33 +1,19 @@ -/* +/* -*- Mode: C; tab-width: 4 -*- + * * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * This file contains Original Code and/or Modifications of Original Code - * as defined in and that are subject to the Apple Public Source License - * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. + * http://www.apache.org/licenses/LICENSE-2.0 * - * The Original Code and all software distributed under the License are - * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. - * Please see the License for the specific language governing rights and + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ - - Change History (most recent first): - -$Log: SecondPage.cpp,v $ -Revision 1.3 2005/03/03 19:55:22 shersche - ControlPanel source code isn't saving CVS log info - - -*/ + */ #include "SecondPage.h" #include "resource.h" @@ -37,6 +23,8 @@ Revision 1.3 2005/03/03 19:55:22 shersche #include +#define MAX_KEY_LENGTH 255 + IMPLEMENT_DYNCREATE(CSecondPage, CPropertyPage) @@ -46,10 +34,17 @@ IMPLEMENT_DYNCREATE(CSecondPage, CPropertyPage) CSecondPage::CSecondPage() : - CPropertyPage(CSecondPage::IDD) + CPropertyPage(CSecondPage::IDD), + m_setupKey( NULL ) { //{{AFX_DATA_INIT(CSecondPage) //}}AFX_DATA_INIT + + OSStatus err; + + err = RegCreateKeyEx( HKEY_LOCAL_MACHINE, kServiceParametersNode L"\\DynDNS\\Setup\\" kServiceDynDNSRegistrationDomains, 0, + NULL, REG_OPTION_NON_VOLATILE, KEY_READ|KEY_WRITE, NULL, &m_setupKey, NULL ); + check_noerr( err ); } @@ -59,6 +54,11 @@ CSecondPage::CSecondPage() CSecondPage::~CSecondPage() { + if ( m_setupKey ) + { + RegCloseKey( m_setupKey ); + m_setupKey = NULL; + } } @@ -109,9 +109,6 @@ BOOL CSecondPage::OnSetActive() { CConfigPropertySheet * psheet; - HKEY key = NULL; - DWORD dwSize; - DWORD enabled; DWORD err; BOOL b = CPropertyPage::OnSetActive(); @@ -126,20 +123,9 @@ CSecondPage::OnSetActive() // Now populate the registration domain box - err = RegCreateKey( HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\" kServiceName L"\\Parameters\\DynDNS\\Setup\\" kServiceDynDNSRegistrationDomains, &key ); - require_noerr( err, exit ); - - err = Populate( m_regDomainsBox, key, psheet->m_regDomains ); + err = Populate( m_regDomainsBox, m_setupKey, psheet->m_regDomains ); check_noerr( err ); - dwSize = sizeof( DWORD ); - err = RegQueryValueEx( key, L"Enabled", NULL, NULL, (LPBYTE) &enabled, &dwSize ); - m_advertiseServicesButton.SetCheck( ( !err && enabled ) ? BST_CHECKED : BST_UNCHECKED ); - m_regDomainsBox.EnableWindow( ( !err && enabled ) ); - m_sharedSecretButton.EnableWindow( (!err && enabled ) ); - - RegCloseKey( key ); - exit: return b; @@ -168,20 +154,12 @@ CSecondPage::OnOK() void CSecondPage::Commit() { - HKEY key = NULL; - DWORD err; + DWORD err; - err = RegCreateKey( HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\" kServiceName L"\\Parameters\\DynDNS\\Setup\\" kServiceDynDNSRegistrationDomains, &key ); - require_noerr( err, exit ); - - err = Commit( m_regDomainsBox, key, m_advertiseServicesButton.GetCheck() == BST_CHECKED ); - check_noerr( err ); - -exit: - - if ( key ) + if ( m_setupKey != NULL ) { - RegCloseKey( key ); + err = Commit( m_regDomainsBox, m_setupKey, m_advertiseServicesButton.GetCheck() == BST_CHECKED ); + check_noerr( err ); } } @@ -194,8 +172,31 @@ OSStatus CSecondPage::Commit( CComboBox & box, HKEY key, DWORD enabled ) { CString selected; + HKEY subKey = NULL; + TCHAR subKeyName[MAX_KEY_LENGTH]; + DWORD cSubKeys = 0; + DWORD cbMaxSubKey; + DWORD cchMaxClass; + DWORD dwSize; + int i; OSStatus err = kNoErr; + // First, remove all the entries that are there + + err = RegQueryInfoKey( key, NULL, NULL, NULL, &cSubKeys, &cbMaxSubKey, &cchMaxClass, NULL, NULL, NULL, NULL, NULL ); + require_noerr( err, exit ); + + for ( i = 0; i < (int) cSubKeys; i++ ) + { + dwSize = MAX_KEY_LENGTH; + + err = RegEnumKeyEx( key, 0, subKeyName, &dwSize, NULL, NULL, NULL, NULL ); + require_noerr( err, exit ); + + err = RegDeleteKey( key, subKeyName ); + require_noerr( err, exit ); + } + // Get selected text box.GetWindowText( selected ); @@ -228,12 +229,21 @@ CSecondPage::Commit( CComboBox & box, HKEY key, DWORD enabled ) // Save selected text in registry. This will trigger mDNSResponder to setup // DynDNS config again - err = RegSetValueEx( key, L"", 0, REG_SZ, (LPBYTE) (LPCTSTR) selected, ( selected.GetLength() + 1 ) * sizeof( TCHAR ) ); - check_noerr( err ); + err = RegCreateKeyEx( key, selected, 0, + NULL, REG_OPTION_NON_VOLATILE, KEY_READ|KEY_WRITE, NULL, &subKey, NULL ); + require_noerr( err, exit ); - err = RegSetValueEx( key, L"Enabled", 0, REG_DWORD, (LPBYTE) &enabled, sizeof( DWORD ) ); + err = RegSetValueEx( subKey, L"Enabled", 0, REG_DWORD, (LPBYTE) &enabled, sizeof( DWORD ) ); check_noerr( err ); +exit: + + if ( subKey ) + { + RegCloseKey( subKey ); + subKey = NULL; + } + return err; } @@ -244,15 +254,39 @@ CSecondPage::Commit( CComboBox & box, HKEY key, DWORD enabled ) void CSecondPage::OnBnClickedSharedSecret() { - CString string; + CString name; - m_regDomainsBox.GetWindowText( string ); + m_regDomainsBox.GetWindowText( name ); CSharedSecret dlg; - dlg.m_secretName = string; + dlg.Load( name ); + + if ( dlg.DoModal() == IDOK ) + { + DWORD wakeup = 0; + DWORD dwSize = sizeof( DWORD ); + OSStatus err; + + dlg.Commit( name ); + + // We have now updated the secret, however the system service + // doesn't know about it yet. So we're going to update the + // registry with a dummy value which will cause the system + // service to re-initialize it's DynDNS setup + // - dlg.DoModal(); + RegQueryValueEx( m_setupKey, L"Wakeup", NULL, NULL, (LPBYTE) &wakeup, &dwSize ); + + wakeup++; + + err = RegSetValueEx( m_setupKey, L"Wakeup", 0, REG_DWORD, (LPBYTE) &wakeup, sizeof( DWORD ) ); + require_noerr( err, exit ); + } + +exit: + + return; } @@ -347,9 +381,14 @@ CSecondPage::EmptyComboBox( CComboBox & box ) OSStatus CSecondPage::Populate( CComboBox & box, HKEY key, StringList & l ) { - TCHAR rawString[kDNSServiceMaxDomainName + 1]; - DWORD rawStringLen; CString string; + HKEY subKey = NULL; + DWORD dwSize; + DWORD enabled = 0; + TCHAR subKeyName[MAX_KEY_LENGTH]; + DWORD cSubKeys = 0; + DWORD cbMaxSubKey; + DWORD cchMaxClass; OSStatus err; err = RegQueryString( key, L"UserDefined", string ); @@ -389,31 +428,44 @@ CSecondPage::Populate( CComboBox & box, HKEY key, StringList & l ) } } - // Now look to see if there is a selected string, and if so, - // select it + err = RegQueryInfoKey( key, NULL, NULL, NULL, &cSubKeys, &cbMaxSubKey, &cchMaxClass, NULL, NULL, NULL, NULL, NULL ); + require_noerr( err, exit ); - rawString[0] = '\0'; + if ( cSubKeys > 0 ) + { + dwSize = MAX_KEY_LENGTH; + + err = RegEnumKeyEx( key, 0, subKeyName, &dwSize, NULL, NULL, NULL, NULL ); + require_noerr( err, exit ); - rawStringLen = sizeof( rawString ); + err = RegOpenKey( key, subKeyName, &subKey ); + require_noerr( err, exit ); - err = RegQueryValueEx( key, L"", 0, NULL, (LPBYTE) rawString, &rawStringLen ); + dwSize = sizeof( DWORD ); + err = RegQueryValueEx( subKey, L"Enabled", NULL, NULL, (LPBYTE) &enabled, &dwSize ); + require_noerr( err, exit ); - string = rawString; - - if ( !err && ( string.GetLength() != 0 ) ) - { // See if it's there - if ( box.SelectString( -1, string ) == CB_ERR ) + if ( box.SelectString( -1, subKeyName ) == CB_ERR ) { // If not, add it - box.AddString( string ); + box.AddString( subKeyName ); } - box.SelectString( -1, string ); + box.SelectString( -1, subKeyName ); + + RegCloseKey( subKey ); + subKey = NULL; } +exit: + + m_advertiseServicesButton.SetCheck( ( !err && enabled ) ? BST_CHECKED : BST_UNCHECKED ); + m_regDomainsBox.EnableWindow( ( !err && enabled ) ); + m_sharedSecretButton.EnableWindow( (!err && enabled ) ); + return err; } @@ -428,7 +480,8 @@ CSecondPage::CreateKey( CString & name, DWORD enabled ) HKEY key = NULL; OSStatus err; - err = RegCreateKey( HKEY_LOCAL_MACHINE, (LPCTSTR) name, &key ); + err = RegCreateKeyEx( HKEY_LOCAL_MACHINE, (LPCTSTR) name, 0, + NULL, REG_OPTION_NON_VOLATILE, KEY_READ|KEY_WRITE, NULL, &key, NULL ); require_noerr( err, exit ); err = RegSetValueEx( key, L"Enabled", 0, REG_DWORD, (LPBYTE) &enabled, sizeof( DWORD ) ); @@ -470,6 +523,7 @@ CSecondPage::RegQueryString( HKEY key, CString valueName, CString & value ) string = (TCHAR*) malloc( stringLen ); require_action( string, exit, err = kUnknownErr ); + *string = '\0'; err = RegQueryValueEx( key, valueName, 0, NULL, (LPBYTE) string, &stringLen );