diff options
Diffstat (limited to 'mDNSResponder/mDNSWindows/ControlPanel/ConfigPropertySheet.cpp')
-rwxr-xr-x | mDNSResponder/mDNSWindows/ControlPanel/ConfigPropertySheet.cpp | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/mDNSResponder/mDNSWindows/ControlPanel/ConfigPropertySheet.cpp b/mDNSResponder/mDNSWindows/ControlPanel/ConfigPropertySheet.cpp new file mode 100755 index 00000000..5fae9555 --- /dev/null +++ b/mDNSResponder/mDNSWindows/ControlPanel/ConfigPropertySheet.cpp @@ -0,0 +1,301 @@ +/* -*- Mode: C; tab-width: 4 -*- + * + * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved. + * + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +#include "ConfigPropertySheet.h" +#include <WinServices.h> +extern "C" +{ +#include <ClientCommon.h> +} +#include <process.h> + +// Custom events + +#define WM_DATAREADY ( WM_USER + 0x100 ) + + +IMPLEMENT_DYNCREATE(CConfigPropertySheet, CPropertySheet) + + +//--------------------------------------------------------------------------------------------------------------------------- +// CConfigPropertySheet::CConfigPropertySheet +//--------------------------------------------------------------------------------------------------------------------------- + +CConfigPropertySheet::CConfigPropertySheet() +: + CPropertySheet(), + m_browseDomainsRef( NULL ), + m_thread( NULL ), + m_threadExited( NULL ) +{ + AddPage(&m_firstPage ); + AddPage(&m_secondPage); + AddPage(&m_thirdPage); + + InitializeCriticalSection( &m_lock ); +} + + +//--------------------------------------------------------------------------------------------------------------------------- +// CConfigPropertySheet::~CConfigPropertySheet +//--------------------------------------------------------------------------------------------------------------------------- + +CConfigPropertySheet::~CConfigPropertySheet() +{ + DeleteCriticalSection( &m_lock ); +} + + +BEGIN_MESSAGE_MAP(CConfigPropertySheet, CPropertySheet) + //{{AFX_MSG_MAP(CConfigPropertySheet) + //}}AFX_MSG_MAP + ON_MESSAGE( WM_DATAREADY, OnDataReady ) +END_MESSAGE_MAP() + + +//--------------------------------------------------------------------------------------------------------------------------- +// CConfigPropertySheet::OnInitDialog +//--------------------------------------------------------------------------------------------------------------------------- + +BOOL +CConfigPropertySheet::OnInitDialog() +{ + OSStatus err; + + BOOL b = CPropertySheet::OnInitDialog(); + + err = SetupBrowsing(); + require_noerr( err, exit ); + +exit: + + return b; +} + + +//--------------------------------------------------------------------------------------------------------------------------- +// CConfigPropertySheet::OnCommand +//--------------------------------------------------------------------------------------------------------------------------- + +BOOL +CConfigPropertySheet::OnCommand(WPARAM wParam, LPARAM lParam) +{ + // Check if OK or Cancel was hit + + if ( ( wParam == ID_WIZFINISH ) || ( wParam == IDOK ) || ( wParam == IDCANCEL ) ) + { + OnEndDialog(); + } + + return CPropertySheet::OnCommand(wParam, lParam); +} + + +//--------------------------------------------------------------------------------------------------------------------------- +// CConfigPropertySheet::OnDataReady +//--------------------------------------------------------------------------------------------------------------------------- + +LRESULT +CConfigPropertySheet::OnDataReady(WPARAM inWParam, LPARAM inLParam) +{ + if (WSAGETSELECTERROR(inLParam) && !(HIWORD(inLParam))) + { + dlog( kDebugLevelError, "OnSocket: window error\n" ); + } + else + { + SOCKET sock = (SOCKET) inWParam; + + if ( m_browseDomainsRef && DNSServiceRefSockFD( m_browseDomainsRef ) == (int) sock ) + { + DNSServiceProcessResult( m_browseDomainsRef ); + } + } + + return 0; +} + + +//--------------------------------------------------------------------------------------------------------------------------- +// CConfigPropertySheet::OnEndDialog +//--------------------------------------------------------------------------------------------------------------------------- + +void +CConfigPropertySheet::OnEndDialog() +{ + OSStatus err; + + err = TearDownBrowsing(); + check_noerr( err ); +} + + +//--------------------------------------------------------------------------------------------------------------------------- +// CConfigPropertySheet::SetupBrowsing +//--------------------------------------------------------------------------------------------------------------------------- + +OSStatus +CConfigPropertySheet::SetupBrowsing() +{ + OSStatus err; + + // Start browsing for browse domains + + err = DNSServiceEnumerateDomains( &m_browseDomainsRef, kDNSServiceFlagsBrowseDomains, 0, BrowseDomainsReply, this ); + require_noerr( err, exit ); + + err = WSAAsyncSelect( DNSServiceRefSockFD( m_browseDomainsRef ), m_hWnd, WM_DATAREADY, FD_READ|FD_CLOSE ); + require_noerr( err, exit ); + +exit: + + if ( err ) + { + TearDownBrowsing(); + } + + return err; +} + + +//--------------------------------------------------------------------------------------------------------------------------- +// CConfigPropertySheet::TearDownBrowsing +//--------------------------------------------------------------------------------------------------------------------------- + +OSStatus +CConfigPropertySheet::TearDownBrowsing() +{ + OSStatus err = kNoErr; + + if ( m_browseDomainsRef ) + { + err = WSAAsyncSelect( DNSServiceRefSockFD( m_browseDomainsRef ), m_hWnd, 0, 0 ); + check_noerr( err ); + + DNSServiceRefDeallocate( m_browseDomainsRef ); + + m_browseDomainsRef = NULL; + } + + return err; +} + + +//--------------------------------------------------------------------------------------------------------------------------- +// CConfigPropertySheet::DecodeDomainName +//--------------------------------------------------------------------------------------------------------------------------- + +OSStatus +CConfigPropertySheet::DecodeDomainName( const char * raw, CString & decoded ) +{ + char nextLabel[128] = "\0"; + char decodedDomainString[kDNSServiceMaxDomainName]; + char * buffer = (char *) raw; + int labels = 0, i; + char text[64]; + const char *label[128]; + OSStatus err; + + // Initialize + + decodedDomainString[0] = '\0'; + + // Count the labels + + while ( *buffer ) + { + label[labels++] = buffer; + buffer = (char *) GetNextLabel(buffer, text); + } + + buffer = (char*) raw; + + for (i = 0; i < labels; i++) + { + buffer = (char *)GetNextLabel(buffer, nextLabel); + strcat(decodedDomainString, nextLabel); + strcat(decodedDomainString, "."); + } + + // Remove trailing dot from domain name. + + decodedDomainString[ strlen( decodedDomainString ) - 1 ] = '\0'; + + // Convert to Unicode + + err = UTF8StringToStringObject( decodedDomainString, decoded ); + + return err; +} + + +//--------------------------------------------------------------------------------------------------------------------------- +// CConfigPropertySheet::BrowseDomainsReply +//--------------------------------------------------------------------------------------------------------------------------- + +void DNSSD_API +CConfigPropertySheet::BrowseDomainsReply + ( + DNSServiceRef sdRef, + DNSServiceFlags flags, + uint32_t interfaceIndex, + DNSServiceErrorType errorCode, + const char * replyDomain, + void * context + ) +{ + CConfigPropertySheet * self = reinterpret_cast<CConfigPropertySheet*>(context); + CString decoded; + OSStatus err; + + DEBUG_UNUSED( sdRef ); + DEBUG_UNUSED( interfaceIndex ); + + if ( errorCode ) + { + goto exit; + } + + check( replyDomain ); + + // Ignore local domains + + if ( strcmp( replyDomain, "local." ) == 0 ) + { + goto exit; + } + + err = self->DecodeDomainName( replyDomain, decoded ); + require_noerr( err, exit ); + + // Remove trailing '.' + + decoded.TrimRight( '.' ); + + if ( flags & kDNSServiceFlagsAdd ) + { + self->m_browseDomains.push_back( decoded ); + } + else + { + self->m_browseDomains.remove( decoded ); + } + +exit: + + return; +} |