1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker *
3*48a54d36SAndroid Build Coastguard Worker * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved.
4*48a54d36SAndroid Build Coastguard Worker *
5*48a54d36SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*48a54d36SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*48a54d36SAndroid Build Coastguard Worker * You may obtain a copy of the License at
8*48a54d36SAndroid Build Coastguard Worker *
9*48a54d36SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*48a54d36SAndroid Build Coastguard Worker *
11*48a54d36SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*48a54d36SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*48a54d36SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*48a54d36SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*48a54d36SAndroid Build Coastguard Worker * limitations under the License.
16*48a54d36SAndroid Build Coastguard Worker */
17*48a54d36SAndroid Build Coastguard Worker
18*48a54d36SAndroid Build Coastguard Worker #include "ConfigPropertySheet.h"
19*48a54d36SAndroid Build Coastguard Worker #include <WinServices.h>
20*48a54d36SAndroid Build Coastguard Worker extern "C"
21*48a54d36SAndroid Build Coastguard Worker {
22*48a54d36SAndroid Build Coastguard Worker #include <ClientCommon.h>
23*48a54d36SAndroid Build Coastguard Worker }
24*48a54d36SAndroid Build Coastguard Worker #include <process.h>
25*48a54d36SAndroid Build Coastguard Worker
26*48a54d36SAndroid Build Coastguard Worker // Custom events
27*48a54d36SAndroid Build Coastguard Worker
28*48a54d36SAndroid Build Coastguard Worker #define WM_DATAREADY ( WM_USER + 0x100 )
29*48a54d36SAndroid Build Coastguard Worker
30*48a54d36SAndroid Build Coastguard Worker
IMPLEMENT_DYNCREATE(CConfigPropertySheet,CPropertySheet)31*48a54d36SAndroid Build Coastguard Worker IMPLEMENT_DYNCREATE(CConfigPropertySheet, CPropertySheet)
32*48a54d36SAndroid Build Coastguard Worker
33*48a54d36SAndroid Build Coastguard Worker
34*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
35*48a54d36SAndroid Build Coastguard Worker // CConfigPropertySheet::CConfigPropertySheet
36*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
37*48a54d36SAndroid Build Coastguard Worker
38*48a54d36SAndroid Build Coastguard Worker CConfigPropertySheet::CConfigPropertySheet()
39*48a54d36SAndroid Build Coastguard Worker :
40*48a54d36SAndroid Build Coastguard Worker CPropertySheet(),
41*48a54d36SAndroid Build Coastguard Worker m_browseDomainsRef( NULL ),
42*48a54d36SAndroid Build Coastguard Worker m_thread( NULL ),
43*48a54d36SAndroid Build Coastguard Worker m_threadExited( NULL )
44*48a54d36SAndroid Build Coastguard Worker {
45*48a54d36SAndroid Build Coastguard Worker AddPage(&m_firstPage );
46*48a54d36SAndroid Build Coastguard Worker AddPage(&m_secondPage);
47*48a54d36SAndroid Build Coastguard Worker AddPage(&m_thirdPage);
48*48a54d36SAndroid Build Coastguard Worker
49*48a54d36SAndroid Build Coastguard Worker InitializeCriticalSection( &m_lock );
50*48a54d36SAndroid Build Coastguard Worker }
51*48a54d36SAndroid Build Coastguard Worker
52*48a54d36SAndroid Build Coastguard Worker
53*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
54*48a54d36SAndroid Build Coastguard Worker // CConfigPropertySheet::~CConfigPropertySheet
55*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
56*48a54d36SAndroid Build Coastguard Worker
~CConfigPropertySheet()57*48a54d36SAndroid Build Coastguard Worker CConfigPropertySheet::~CConfigPropertySheet()
58*48a54d36SAndroid Build Coastguard Worker {
59*48a54d36SAndroid Build Coastguard Worker DeleteCriticalSection( &m_lock );
60*48a54d36SAndroid Build Coastguard Worker }
61*48a54d36SAndroid Build Coastguard Worker
62*48a54d36SAndroid Build Coastguard Worker
BEGIN_MESSAGE_MAP(CConfigPropertySheet,CPropertySheet)63*48a54d36SAndroid Build Coastguard Worker BEGIN_MESSAGE_MAP(CConfigPropertySheet, CPropertySheet)
64*48a54d36SAndroid Build Coastguard Worker //{{AFX_MSG_MAP(CConfigPropertySheet)
65*48a54d36SAndroid Build Coastguard Worker //}}AFX_MSG_MAP
66*48a54d36SAndroid Build Coastguard Worker ON_MESSAGE( WM_DATAREADY, OnDataReady )
67*48a54d36SAndroid Build Coastguard Worker END_MESSAGE_MAP()
68*48a54d36SAndroid Build Coastguard Worker
69*48a54d36SAndroid Build Coastguard Worker
70*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
71*48a54d36SAndroid Build Coastguard Worker // CConfigPropertySheet::OnInitDialog
72*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
73*48a54d36SAndroid Build Coastguard Worker
74*48a54d36SAndroid Build Coastguard Worker BOOL
75*48a54d36SAndroid Build Coastguard Worker CConfigPropertySheet::OnInitDialog()
76*48a54d36SAndroid Build Coastguard Worker {
77*48a54d36SAndroid Build Coastguard Worker OSStatus err;
78*48a54d36SAndroid Build Coastguard Worker
79*48a54d36SAndroid Build Coastguard Worker BOOL b = CPropertySheet::OnInitDialog();
80*48a54d36SAndroid Build Coastguard Worker
81*48a54d36SAndroid Build Coastguard Worker err = SetupBrowsing();
82*48a54d36SAndroid Build Coastguard Worker require_noerr( err, exit );
83*48a54d36SAndroid Build Coastguard Worker
84*48a54d36SAndroid Build Coastguard Worker exit:
85*48a54d36SAndroid Build Coastguard Worker
86*48a54d36SAndroid Build Coastguard Worker return b;
87*48a54d36SAndroid Build Coastguard Worker }
88*48a54d36SAndroid Build Coastguard Worker
89*48a54d36SAndroid Build Coastguard Worker
90*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
91*48a54d36SAndroid Build Coastguard Worker // CConfigPropertySheet::OnCommand
92*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
93*48a54d36SAndroid Build Coastguard Worker
94*48a54d36SAndroid Build Coastguard Worker BOOL
OnCommand(WPARAM wParam,LPARAM lParam)95*48a54d36SAndroid Build Coastguard Worker CConfigPropertySheet::OnCommand(WPARAM wParam, LPARAM lParam)
96*48a54d36SAndroid Build Coastguard Worker {
97*48a54d36SAndroid Build Coastguard Worker // Check if OK or Cancel was hit
98*48a54d36SAndroid Build Coastguard Worker
99*48a54d36SAndroid Build Coastguard Worker if ( ( wParam == ID_WIZFINISH ) || ( wParam == IDOK ) || ( wParam == IDCANCEL ) )
100*48a54d36SAndroid Build Coastguard Worker {
101*48a54d36SAndroid Build Coastguard Worker OnEndDialog();
102*48a54d36SAndroid Build Coastguard Worker }
103*48a54d36SAndroid Build Coastguard Worker
104*48a54d36SAndroid Build Coastguard Worker return CPropertySheet::OnCommand(wParam, lParam);
105*48a54d36SAndroid Build Coastguard Worker }
106*48a54d36SAndroid Build Coastguard Worker
107*48a54d36SAndroid Build Coastguard Worker
108*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
109*48a54d36SAndroid Build Coastguard Worker // CConfigPropertySheet::OnDataReady
110*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
111*48a54d36SAndroid Build Coastguard Worker
112*48a54d36SAndroid Build Coastguard Worker LRESULT
OnDataReady(WPARAM inWParam,LPARAM inLParam)113*48a54d36SAndroid Build Coastguard Worker CConfigPropertySheet::OnDataReady(WPARAM inWParam, LPARAM inLParam)
114*48a54d36SAndroid Build Coastguard Worker {
115*48a54d36SAndroid Build Coastguard Worker if (WSAGETSELECTERROR(inLParam) && !(HIWORD(inLParam)))
116*48a54d36SAndroid Build Coastguard Worker {
117*48a54d36SAndroid Build Coastguard Worker dlog( kDebugLevelError, "OnSocket: window error\n" );
118*48a54d36SAndroid Build Coastguard Worker }
119*48a54d36SAndroid Build Coastguard Worker else
120*48a54d36SAndroid Build Coastguard Worker {
121*48a54d36SAndroid Build Coastguard Worker SOCKET sock = (SOCKET) inWParam;
122*48a54d36SAndroid Build Coastguard Worker
123*48a54d36SAndroid Build Coastguard Worker if ( m_browseDomainsRef && DNSServiceRefSockFD( m_browseDomainsRef ) == (int) sock )
124*48a54d36SAndroid Build Coastguard Worker {
125*48a54d36SAndroid Build Coastguard Worker DNSServiceProcessResult( m_browseDomainsRef );
126*48a54d36SAndroid Build Coastguard Worker }
127*48a54d36SAndroid Build Coastguard Worker }
128*48a54d36SAndroid Build Coastguard Worker
129*48a54d36SAndroid Build Coastguard Worker return 0;
130*48a54d36SAndroid Build Coastguard Worker }
131*48a54d36SAndroid Build Coastguard Worker
132*48a54d36SAndroid Build Coastguard Worker
133*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
134*48a54d36SAndroid Build Coastguard Worker // CConfigPropertySheet::OnEndDialog
135*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
136*48a54d36SAndroid Build Coastguard Worker
137*48a54d36SAndroid Build Coastguard Worker void
OnEndDialog()138*48a54d36SAndroid Build Coastguard Worker CConfigPropertySheet::OnEndDialog()
139*48a54d36SAndroid Build Coastguard Worker {
140*48a54d36SAndroid Build Coastguard Worker OSStatus err;
141*48a54d36SAndroid Build Coastguard Worker
142*48a54d36SAndroid Build Coastguard Worker err = TearDownBrowsing();
143*48a54d36SAndroid Build Coastguard Worker check_noerr( err );
144*48a54d36SAndroid Build Coastguard Worker }
145*48a54d36SAndroid Build Coastguard Worker
146*48a54d36SAndroid Build Coastguard Worker
147*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
148*48a54d36SAndroid Build Coastguard Worker // CConfigPropertySheet::SetupBrowsing
149*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
150*48a54d36SAndroid Build Coastguard Worker
151*48a54d36SAndroid Build Coastguard Worker OSStatus
SetupBrowsing()152*48a54d36SAndroid Build Coastguard Worker CConfigPropertySheet::SetupBrowsing()
153*48a54d36SAndroid Build Coastguard Worker {
154*48a54d36SAndroid Build Coastguard Worker OSStatus err;
155*48a54d36SAndroid Build Coastguard Worker
156*48a54d36SAndroid Build Coastguard Worker // Start browsing for browse domains
157*48a54d36SAndroid Build Coastguard Worker
158*48a54d36SAndroid Build Coastguard Worker err = DNSServiceEnumerateDomains( &m_browseDomainsRef, kDNSServiceFlagsBrowseDomains, 0, BrowseDomainsReply, this );
159*48a54d36SAndroid Build Coastguard Worker require_noerr( err, exit );
160*48a54d36SAndroid Build Coastguard Worker
161*48a54d36SAndroid Build Coastguard Worker err = WSAAsyncSelect( DNSServiceRefSockFD( m_browseDomainsRef ), m_hWnd, WM_DATAREADY, FD_READ|FD_CLOSE );
162*48a54d36SAndroid Build Coastguard Worker require_noerr( err, exit );
163*48a54d36SAndroid Build Coastguard Worker
164*48a54d36SAndroid Build Coastguard Worker exit:
165*48a54d36SAndroid Build Coastguard Worker
166*48a54d36SAndroid Build Coastguard Worker if ( err )
167*48a54d36SAndroid Build Coastguard Worker {
168*48a54d36SAndroid Build Coastguard Worker TearDownBrowsing();
169*48a54d36SAndroid Build Coastguard Worker }
170*48a54d36SAndroid Build Coastguard Worker
171*48a54d36SAndroid Build Coastguard Worker return err;
172*48a54d36SAndroid Build Coastguard Worker }
173*48a54d36SAndroid Build Coastguard Worker
174*48a54d36SAndroid Build Coastguard Worker
175*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
176*48a54d36SAndroid Build Coastguard Worker // CConfigPropertySheet::TearDownBrowsing
177*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
178*48a54d36SAndroid Build Coastguard Worker
179*48a54d36SAndroid Build Coastguard Worker OSStatus
TearDownBrowsing()180*48a54d36SAndroid Build Coastguard Worker CConfigPropertySheet::TearDownBrowsing()
181*48a54d36SAndroid Build Coastguard Worker {
182*48a54d36SAndroid Build Coastguard Worker OSStatus err = kNoErr;
183*48a54d36SAndroid Build Coastguard Worker
184*48a54d36SAndroid Build Coastguard Worker if ( m_browseDomainsRef )
185*48a54d36SAndroid Build Coastguard Worker {
186*48a54d36SAndroid Build Coastguard Worker err = WSAAsyncSelect( DNSServiceRefSockFD( m_browseDomainsRef ), m_hWnd, 0, 0 );
187*48a54d36SAndroid Build Coastguard Worker check_noerr( err );
188*48a54d36SAndroid Build Coastguard Worker
189*48a54d36SAndroid Build Coastguard Worker DNSServiceRefDeallocate( m_browseDomainsRef );
190*48a54d36SAndroid Build Coastguard Worker
191*48a54d36SAndroid Build Coastguard Worker m_browseDomainsRef = NULL;
192*48a54d36SAndroid Build Coastguard Worker }
193*48a54d36SAndroid Build Coastguard Worker
194*48a54d36SAndroid Build Coastguard Worker return err;
195*48a54d36SAndroid Build Coastguard Worker }
196*48a54d36SAndroid Build Coastguard Worker
197*48a54d36SAndroid Build Coastguard Worker
198*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
199*48a54d36SAndroid Build Coastguard Worker // CConfigPropertySheet::DecodeDomainName
200*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
201*48a54d36SAndroid Build Coastguard Worker
202*48a54d36SAndroid Build Coastguard Worker OSStatus
DecodeDomainName(const char * raw,CString & decoded)203*48a54d36SAndroid Build Coastguard Worker CConfigPropertySheet::DecodeDomainName( const char * raw, CString & decoded )
204*48a54d36SAndroid Build Coastguard Worker {
205*48a54d36SAndroid Build Coastguard Worker char nextLabel[128] = "\0";
206*48a54d36SAndroid Build Coastguard Worker char decodedDomainString[kDNSServiceMaxDomainName];
207*48a54d36SAndroid Build Coastguard Worker char * buffer = (char *) raw;
208*48a54d36SAndroid Build Coastguard Worker int labels = 0, i;
209*48a54d36SAndroid Build Coastguard Worker char text[64];
210*48a54d36SAndroid Build Coastguard Worker const char *label[128];
211*48a54d36SAndroid Build Coastguard Worker OSStatus err;
212*48a54d36SAndroid Build Coastguard Worker
213*48a54d36SAndroid Build Coastguard Worker // Initialize
214*48a54d36SAndroid Build Coastguard Worker
215*48a54d36SAndroid Build Coastguard Worker decodedDomainString[0] = '\0';
216*48a54d36SAndroid Build Coastguard Worker
217*48a54d36SAndroid Build Coastguard Worker // Count the labels
218*48a54d36SAndroid Build Coastguard Worker
219*48a54d36SAndroid Build Coastguard Worker while ( *buffer )
220*48a54d36SAndroid Build Coastguard Worker {
221*48a54d36SAndroid Build Coastguard Worker label[labels++] = buffer;
222*48a54d36SAndroid Build Coastguard Worker buffer = (char *) GetNextLabel(buffer, text);
223*48a54d36SAndroid Build Coastguard Worker }
224*48a54d36SAndroid Build Coastguard Worker
225*48a54d36SAndroid Build Coastguard Worker buffer = (char*) raw;
226*48a54d36SAndroid Build Coastguard Worker
227*48a54d36SAndroid Build Coastguard Worker for (i = 0; i < labels; i++)
228*48a54d36SAndroid Build Coastguard Worker {
229*48a54d36SAndroid Build Coastguard Worker buffer = (char *)GetNextLabel(buffer, nextLabel);
230*48a54d36SAndroid Build Coastguard Worker strcat(decodedDomainString, nextLabel);
231*48a54d36SAndroid Build Coastguard Worker strcat(decodedDomainString, ".");
232*48a54d36SAndroid Build Coastguard Worker }
233*48a54d36SAndroid Build Coastguard Worker
234*48a54d36SAndroid Build Coastguard Worker // Remove trailing dot from domain name.
235*48a54d36SAndroid Build Coastguard Worker
236*48a54d36SAndroid Build Coastguard Worker decodedDomainString[ strlen( decodedDomainString ) - 1 ] = '\0';
237*48a54d36SAndroid Build Coastguard Worker
238*48a54d36SAndroid Build Coastguard Worker // Convert to Unicode
239*48a54d36SAndroid Build Coastguard Worker
240*48a54d36SAndroid Build Coastguard Worker err = UTF8StringToStringObject( decodedDomainString, decoded );
241*48a54d36SAndroid Build Coastguard Worker
242*48a54d36SAndroid Build Coastguard Worker return err;
243*48a54d36SAndroid Build Coastguard Worker }
244*48a54d36SAndroid Build Coastguard Worker
245*48a54d36SAndroid Build Coastguard Worker
246*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
247*48a54d36SAndroid Build Coastguard Worker // CConfigPropertySheet::BrowseDomainsReply
248*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
249*48a54d36SAndroid Build Coastguard Worker
250*48a54d36SAndroid Build Coastguard Worker void DNSSD_API
BrowseDomainsReply(DNSServiceRef sdRef,DNSServiceFlags flags,uint32_t interfaceIndex,DNSServiceErrorType errorCode,const char * replyDomain,void * context)251*48a54d36SAndroid Build Coastguard Worker CConfigPropertySheet::BrowseDomainsReply
252*48a54d36SAndroid Build Coastguard Worker (
253*48a54d36SAndroid Build Coastguard Worker DNSServiceRef sdRef,
254*48a54d36SAndroid Build Coastguard Worker DNSServiceFlags flags,
255*48a54d36SAndroid Build Coastguard Worker uint32_t interfaceIndex,
256*48a54d36SAndroid Build Coastguard Worker DNSServiceErrorType errorCode,
257*48a54d36SAndroid Build Coastguard Worker const char * replyDomain,
258*48a54d36SAndroid Build Coastguard Worker void * context
259*48a54d36SAndroid Build Coastguard Worker )
260*48a54d36SAndroid Build Coastguard Worker {
261*48a54d36SAndroid Build Coastguard Worker CConfigPropertySheet * self = reinterpret_cast<CConfigPropertySheet*>(context);
262*48a54d36SAndroid Build Coastguard Worker CString decoded;
263*48a54d36SAndroid Build Coastguard Worker OSStatus err;
264*48a54d36SAndroid Build Coastguard Worker
265*48a54d36SAndroid Build Coastguard Worker DEBUG_UNUSED( sdRef );
266*48a54d36SAndroid Build Coastguard Worker DEBUG_UNUSED( interfaceIndex );
267*48a54d36SAndroid Build Coastguard Worker
268*48a54d36SAndroid Build Coastguard Worker if ( errorCode )
269*48a54d36SAndroid Build Coastguard Worker {
270*48a54d36SAndroid Build Coastguard Worker goto exit;
271*48a54d36SAndroid Build Coastguard Worker }
272*48a54d36SAndroid Build Coastguard Worker
273*48a54d36SAndroid Build Coastguard Worker check( replyDomain );
274*48a54d36SAndroid Build Coastguard Worker
275*48a54d36SAndroid Build Coastguard Worker // Ignore local domains
276*48a54d36SAndroid Build Coastguard Worker
277*48a54d36SAndroid Build Coastguard Worker if ( strcmp( replyDomain, "local." ) == 0 )
278*48a54d36SAndroid Build Coastguard Worker {
279*48a54d36SAndroid Build Coastguard Worker goto exit;
280*48a54d36SAndroid Build Coastguard Worker }
281*48a54d36SAndroid Build Coastguard Worker
282*48a54d36SAndroid Build Coastguard Worker err = self->DecodeDomainName( replyDomain, decoded );
283*48a54d36SAndroid Build Coastguard Worker require_noerr( err, exit );
284*48a54d36SAndroid Build Coastguard Worker
285*48a54d36SAndroid Build Coastguard Worker // Remove trailing '.'
286*48a54d36SAndroid Build Coastguard Worker
287*48a54d36SAndroid Build Coastguard Worker decoded.TrimRight( '.' );
288*48a54d36SAndroid Build Coastguard Worker
289*48a54d36SAndroid Build Coastguard Worker if ( flags & kDNSServiceFlagsAdd )
290*48a54d36SAndroid Build Coastguard Worker {
291*48a54d36SAndroid Build Coastguard Worker self->m_browseDomains.push_back( decoded );
292*48a54d36SAndroid Build Coastguard Worker }
293*48a54d36SAndroid Build Coastguard Worker else
294*48a54d36SAndroid Build Coastguard Worker {
295*48a54d36SAndroid Build Coastguard Worker self->m_browseDomains.remove( decoded );
296*48a54d36SAndroid Build Coastguard Worker }
297*48a54d36SAndroid Build Coastguard Worker
298*48a54d36SAndroid Build Coastguard Worker exit:
299*48a54d36SAndroid Build Coastguard Worker
300*48a54d36SAndroid Build Coastguard Worker return;
301*48a54d36SAndroid Build Coastguard Worker }
302