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	"stdafx.h"
19*48a54d36SAndroid Build Coastguard Worker 
20*48a54d36SAndroid Build Coastguard Worker #include	"Application.h"
21*48a54d36SAndroid Build Coastguard Worker 
22*48a54d36SAndroid Build Coastguard Worker #include	"DNSServices.h"
23*48a54d36SAndroid Build Coastguard Worker 
24*48a54d36SAndroid Build Coastguard Worker #include	"BrowserDialog.h"
25*48a54d36SAndroid Build Coastguard Worker 
26*48a54d36SAndroid Build Coastguard Worker #ifdef _DEBUG
27*48a54d36SAndroid Build Coastguard Worker #define new DEBUG_NEW
28*48a54d36SAndroid Build Coastguard Worker #undef THIS_FILE
29*48a54d36SAndroid Build Coastguard Worker static char THIS_FILE[] = __FILE__;
30*48a54d36SAndroid Build Coastguard Worker #endif
31*48a54d36SAndroid Build Coastguard Worker 
32*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
33*48a54d36SAndroid Build Coastguard Worker //	Constants
34*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
35*48a54d36SAndroid Build Coastguard Worker 
36*48a54d36SAndroid Build Coastguard Worker #define	WM_USER_SERVICE_ADD			( WM_USER + 0x100 )
37*48a54d36SAndroid Build Coastguard Worker #define	WM_USER_SERVICE_REMOVE		( WM_USER + 0x101 )
38*48a54d36SAndroid Build Coastguard Worker 
39*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
40*48a54d36SAndroid Build Coastguard Worker //	Message Map
41*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
42*48a54d36SAndroid Build Coastguard Worker 
43*48a54d36SAndroid Build Coastguard Worker BEGIN_MESSAGE_MAP(BrowserDialog, CDialog)
44*48a54d36SAndroid Build Coastguard Worker 	//{{AFX_MSG_MAP(BrowserDialog)
45*48a54d36SAndroid Build Coastguard Worker 	ON_NOTIFY(NM_CLICK, IDC_BROWSE_LIST, OnBrowserListDoubleClick)
46*48a54d36SAndroid Build Coastguard Worker 	ON_MESSAGE( WM_USER_SERVICE_ADD, OnServiceAdd )
47*48a54d36SAndroid Build Coastguard Worker 	ON_MESSAGE( WM_USER_SERVICE_REMOVE, OnServiceRemove )
48*48a54d36SAndroid Build Coastguard Worker 	//}}AFX_MSG_MAP
49*48a54d36SAndroid Build Coastguard Worker END_MESSAGE_MAP()
50*48a54d36SAndroid Build Coastguard Worker 
51*48a54d36SAndroid Build Coastguard Worker static DWORD	UTF8StringToStringObject( const char *inUTF8, CString &inObject );
52*48a54d36SAndroid Build Coastguard Worker 
53*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
54*48a54d36SAndroid Build Coastguard Worker //	BrowserDialog
55*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
56*48a54d36SAndroid Build Coastguard Worker 
BrowserDialog(CWnd * inParent)57*48a54d36SAndroid Build Coastguard Worker BrowserDialog::BrowserDialog( CWnd *inParent )
58*48a54d36SAndroid Build Coastguard Worker 	: CDialog( BrowserDialog::IDD, inParent )
59*48a54d36SAndroid Build Coastguard Worker {
60*48a54d36SAndroid Build Coastguard Worker 	//{{AFX_DATA_INIT(BrowserDialog)
61*48a54d36SAndroid Build Coastguard Worker 		// Note: the ClassWizard will add member initialization here
62*48a54d36SAndroid Build Coastguard Worker 	//}}AFX_DATA_INIT
63*48a54d36SAndroid Build Coastguard Worker 
64*48a54d36SAndroid Build Coastguard Worker 	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32.
65*48a54d36SAndroid Build Coastguard Worker 
66*48a54d36SAndroid Build Coastguard Worker 	mIcon = AfxGetApp()->LoadIcon( IDR_MAINFRAME );
67*48a54d36SAndroid Build Coastguard Worker 	ASSERT( mIcon );
68*48a54d36SAndroid Build Coastguard Worker }
69*48a54d36SAndroid Build Coastguard Worker 
70*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
71*48a54d36SAndroid Build Coastguard Worker //	DoDataExchange
72*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
73*48a54d36SAndroid Build Coastguard Worker 
DoDataExchange(CDataExchange * pDX)74*48a54d36SAndroid Build Coastguard Worker void	BrowserDialog::DoDataExchange( CDataExchange *pDX )
75*48a54d36SAndroid Build Coastguard Worker {
76*48a54d36SAndroid Build Coastguard Worker 	CDialog::DoDataExchange(pDX);
77*48a54d36SAndroid Build Coastguard Worker 	//{{AFX_DATA_MAP(BrowserDialog)
78*48a54d36SAndroid Build Coastguard Worker 	DDX_Control(pDX, IDC_BROWSE_LIST, mBrowserList);
79*48a54d36SAndroid Build Coastguard Worker 	//}}AFX_DATA_MAP
80*48a54d36SAndroid Build Coastguard Worker }
81*48a54d36SAndroid Build Coastguard Worker 
82*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
83*48a54d36SAndroid Build Coastguard Worker //	OnInitDialog
84*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
85*48a54d36SAndroid Build Coastguard Worker 
OnInitDialog()86*48a54d36SAndroid Build Coastguard Worker BOOL	BrowserDialog::OnInitDialog()
87*48a54d36SAndroid Build Coastguard Worker {
88*48a54d36SAndroid Build Coastguard Worker 	CString		s;
89*48a54d36SAndroid Build Coastguard Worker 
90*48a54d36SAndroid Build Coastguard Worker 	CDialog::OnInitDialog();
91*48a54d36SAndroid Build Coastguard Worker 
92*48a54d36SAndroid Build Coastguard Worker 	// Set the icon for this dialog. The framework does this automatically when the application's main window is not a dialog.
93*48a54d36SAndroid Build Coastguard Worker 
94*48a54d36SAndroid Build Coastguard Worker 	SetIcon( mIcon, TRUE );		// Set big icon
95*48a54d36SAndroid Build Coastguard Worker 	SetIcon( mIcon, FALSE );	// Set small icon
96*48a54d36SAndroid Build Coastguard Worker 
97*48a54d36SAndroid Build Coastguard Worker 	CenterWindow( GetDesktopWindow() );
98*48a54d36SAndroid Build Coastguard Worker 
99*48a54d36SAndroid Build Coastguard Worker 	// Set up the list.
100*48a54d36SAndroid Build Coastguard Worker 
101*48a54d36SAndroid Build Coastguard Worker 	CRect		rect;
102*48a54d36SAndroid Build Coastguard Worker 
103*48a54d36SAndroid Build Coastguard Worker 	s.LoadString( IDS_BROWSER_LIST_COLUMN_NAME );
104*48a54d36SAndroid Build Coastguard Worker 	mBrowserList.GetWindowRect( rect );
105*48a54d36SAndroid Build Coastguard Worker 	mBrowserList.InsertColumn( 0, s, LVCFMT_LEFT, rect.Width() - 8 );
106*48a54d36SAndroid Build Coastguard Worker 
107*48a54d36SAndroid Build Coastguard Worker 	// Start browsing for services.
108*48a54d36SAndroid Build Coastguard Worker 
109*48a54d36SAndroid Build Coastguard Worker 	DNSStatus		err;
110*48a54d36SAndroid Build Coastguard Worker 
111*48a54d36SAndroid Build Coastguard Worker 	err = DNSBrowserCreate( 0, OnBrowserCallBack, this, &mBrowser );
112*48a54d36SAndroid Build Coastguard Worker 	if( err )
113*48a54d36SAndroid Build Coastguard Worker 	{
114*48a54d36SAndroid Build Coastguard Worker 		AfxMessageBox( IDP_SOCKETS_INIT_FAILED );
115*48a54d36SAndroid Build Coastguard Worker 		goto exit;
116*48a54d36SAndroid Build Coastguard Worker 	}
117*48a54d36SAndroid Build Coastguard Worker 
118*48a54d36SAndroid Build Coastguard Worker 	err = DNSBrowserStartServiceSearch( mBrowser, kDNSBrowserFlagAutoResolve, "_http._tcp", NULL );
119*48a54d36SAndroid Build Coastguard Worker 	if( err )
120*48a54d36SAndroid Build Coastguard Worker 	{
121*48a54d36SAndroid Build Coastguard Worker 		AfxMessageBox( IDP_SOCKETS_INIT_FAILED );
122*48a54d36SAndroid Build Coastguard Worker 		goto exit;
123*48a54d36SAndroid Build Coastguard Worker 	}
124*48a54d36SAndroid Build Coastguard Worker 
125*48a54d36SAndroid Build Coastguard Worker exit:
126*48a54d36SAndroid Build Coastguard Worker 	return( TRUE );
127*48a54d36SAndroid Build Coastguard Worker }
128*48a54d36SAndroid Build Coastguard Worker 
129*48a54d36SAndroid Build Coastguard Worker 
130*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
131*48a54d36SAndroid Build Coastguard Worker //	OnBrowserListDoubleClick
132*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
133*48a54d36SAndroid Build Coastguard Worker 
OnBrowserListDoubleClick(NMHDR * pNMHDR,LRESULT * pResult)134*48a54d36SAndroid Build Coastguard Worker void	BrowserDialog::OnBrowserListDoubleClick( NMHDR *pNMHDR, LRESULT *pResult )
135*48a54d36SAndroid Build Coastguard Worker {
136*48a54d36SAndroid Build Coastguard Worker 	int		selectedItem;
137*48a54d36SAndroid Build Coastguard Worker 
138*48a54d36SAndroid Build Coastguard Worker 	(void) pNMHDR;	// Unused
139*48a54d36SAndroid Build Coastguard Worker 
140*48a54d36SAndroid Build Coastguard Worker 	selectedItem = mBrowserList.GetNextItem( -1, LVNI_SELECTED );
141*48a54d36SAndroid Build Coastguard Worker 	if( selectedItem >= 0 )
142*48a54d36SAndroid Build Coastguard Worker 	{
143*48a54d36SAndroid Build Coastguard Worker 		BrowserEntry *		entry;
144*48a54d36SAndroid Build Coastguard Worker 		CString				temp;
145*48a54d36SAndroid Build Coastguard Worker 		CString				url;
146*48a54d36SAndroid Build Coastguard Worker 
147*48a54d36SAndroid Build Coastguard Worker 		// Build the URL from the IP and optional TXT record.
148*48a54d36SAndroid Build Coastguard Worker 
149*48a54d36SAndroid Build Coastguard Worker 		entry = &mBrowserEntries[ selectedItem ];
150*48a54d36SAndroid Build Coastguard Worker 		url += "http://" + entry->ip;
151*48a54d36SAndroid Build Coastguard Worker 		temp = entry->text;
152*48a54d36SAndroid Build Coastguard Worker 		if( temp.Find( TEXT( "path=" ) ) == 0 )
153*48a54d36SAndroid Build Coastguard Worker 		{
154*48a54d36SAndroid Build Coastguard Worker 			temp.Delete( 0, 5 );
155*48a54d36SAndroid Build Coastguard Worker 		}
156*48a54d36SAndroid Build Coastguard Worker 		if( temp.Find( '/' ) != 0 )
157*48a54d36SAndroid Build Coastguard Worker 		{
158*48a54d36SAndroid Build Coastguard Worker 			url += '/';
159*48a54d36SAndroid Build Coastguard Worker 		}
160*48a54d36SAndroid Build Coastguard Worker 		url += temp;
161*48a54d36SAndroid Build Coastguard Worker 
162*48a54d36SAndroid Build Coastguard Worker 		// Let the system open the URL in the correct app.
163*48a54d36SAndroid Build Coastguard Worker 
164*48a54d36SAndroid Build Coastguard Worker 		SHELLEXECUTEINFO		info;
165*48a54d36SAndroid Build Coastguard Worker 
166*48a54d36SAndroid Build Coastguard Worker 		info.cbSize			= sizeof( info );
167*48a54d36SAndroid Build Coastguard Worker 		info.fMask 			= 0;
168*48a54d36SAndroid Build Coastguard Worker 		info.hwnd 			= NULL;
169*48a54d36SAndroid Build Coastguard Worker 		info.lpVerb 		= NULL;
170*48a54d36SAndroid Build Coastguard Worker 		info.lpFile 		= url;
171*48a54d36SAndroid Build Coastguard Worker 		info.lpParameters 	= NULL;
172*48a54d36SAndroid Build Coastguard Worker 		info.lpDirectory 	= NULL;
173*48a54d36SAndroid Build Coastguard Worker 		info.nShow 			= SW_SHOWNORMAL;
174*48a54d36SAndroid Build Coastguard Worker 		info.hInstApp 		= NULL;
175*48a54d36SAndroid Build Coastguard Worker 
176*48a54d36SAndroid Build Coastguard Worker 		ShellExecuteEx( &info );
177*48a54d36SAndroid Build Coastguard Worker 	}
178*48a54d36SAndroid Build Coastguard Worker 	*pResult = 0;
179*48a54d36SAndroid Build Coastguard Worker }
180*48a54d36SAndroid Build Coastguard Worker 
181*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
182*48a54d36SAndroid Build Coastguard Worker //	OnBrowserCallBack [static]
183*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
184*48a54d36SAndroid Build Coastguard Worker 
185*48a54d36SAndroid Build Coastguard Worker void
OnBrowserCallBack(void * inContext,DNSBrowserRef inRef,DNSStatus inStatusCode,const DNSBrowserEvent * inEvent)186*48a54d36SAndroid Build Coastguard Worker 	BrowserDialog::OnBrowserCallBack(
187*48a54d36SAndroid Build Coastguard Worker 		void *					inContext,
188*48a54d36SAndroid Build Coastguard Worker 		DNSBrowserRef			inRef,
189*48a54d36SAndroid Build Coastguard Worker 		DNSStatus				inStatusCode,
190*48a54d36SAndroid Build Coastguard Worker 		const DNSBrowserEvent *	inEvent )
191*48a54d36SAndroid Build Coastguard Worker {
192*48a54d36SAndroid Build Coastguard Worker 	BrowserDialog *		dialog;
193*48a54d36SAndroid Build Coastguard Worker 	BrowserEntry *		entry;
194*48a54d36SAndroid Build Coastguard Worker 	BOOL				posted;
195*48a54d36SAndroid Build Coastguard Worker 
196*48a54d36SAndroid Build Coastguard Worker 	DNS_UNUSED( inStatusCode );
197*48a54d36SAndroid Build Coastguard Worker 	dialog = reinterpret_cast < BrowserDialog * > ( inContext );
198*48a54d36SAndroid Build Coastguard Worker 	ASSERT( dialog );
199*48a54d36SAndroid Build Coastguard Worker 
200*48a54d36SAndroid Build Coastguard Worker 	switch( inEvent->type )
201*48a54d36SAndroid Build Coastguard Worker 	{
202*48a54d36SAndroid Build Coastguard Worker 		case kDNSBrowserEventTypeResolved:
203*48a54d36SAndroid Build Coastguard Worker 			if( inEvent->data.resolved->address.addressType == kDNSNetworkAddressTypeIPv4  )
204*48a54d36SAndroid Build Coastguard Worker 			{
205*48a54d36SAndroid Build Coastguard Worker 				char		ip[ 64 ];
206*48a54d36SAndroid Build Coastguard Worker 
207*48a54d36SAndroid Build Coastguard Worker 				sprintf( ip, "%u.%u.%u.%u:%u",
208*48a54d36SAndroid Build Coastguard Worker 					inEvent->data.resolved->address.u.ipv4.addr.v8[ 0 ],
209*48a54d36SAndroid Build Coastguard Worker 					inEvent->data.resolved->address.u.ipv4.addr.v8[ 1 ],
210*48a54d36SAndroid Build Coastguard Worker 					inEvent->data.resolved->address.u.ipv4.addr.v8[ 2 ],
211*48a54d36SAndroid Build Coastguard Worker 					inEvent->data.resolved->address.u.ipv4.addr.v8[ 3 ],
212*48a54d36SAndroid Build Coastguard Worker 					( inEvent->data.resolved->address.u.ipv4.port.v8[ 0 ] << 8 ) |
213*48a54d36SAndroid Build Coastguard Worker 					  inEvent->data.resolved->address.u.ipv4.port.v8[ 1 ] );
214*48a54d36SAndroid Build Coastguard Worker 
215*48a54d36SAndroid Build Coastguard Worker 				entry = new BrowserEntry;
216*48a54d36SAndroid Build Coastguard Worker 				ASSERT( entry );
217*48a54d36SAndroid Build Coastguard Worker 				if( entry )
218*48a54d36SAndroid Build Coastguard Worker 				{
219*48a54d36SAndroid Build Coastguard Worker 					UTF8StringToStringObject( inEvent->data.resolved->name, entry->name );
220*48a54d36SAndroid Build Coastguard Worker 					UTF8StringToStringObject( ip, entry->ip );
221*48a54d36SAndroid Build Coastguard Worker 					UTF8StringToStringObject( inEvent->data.resolved->textRecord, entry->text );
222*48a54d36SAndroid Build Coastguard Worker 
223*48a54d36SAndroid Build Coastguard Worker 					posted = ::PostMessage( dialog->GetSafeHwnd(), WM_USER_SERVICE_ADD, 0, (LPARAM) entry );
224*48a54d36SAndroid Build Coastguard Worker 					ASSERT( posted );
225*48a54d36SAndroid Build Coastguard Worker 					if( !posted )
226*48a54d36SAndroid Build Coastguard Worker 					{
227*48a54d36SAndroid Build Coastguard Worker 						delete entry;
228*48a54d36SAndroid Build Coastguard Worker 					}
229*48a54d36SAndroid Build Coastguard Worker 				}
230*48a54d36SAndroid Build Coastguard Worker 			}
231*48a54d36SAndroid Build Coastguard Worker 			break;
232*48a54d36SAndroid Build Coastguard Worker 
233*48a54d36SAndroid Build Coastguard Worker 		case kDNSBrowserEventTypeRemoveService:
234*48a54d36SAndroid Build Coastguard Worker 			entry = new BrowserEntry;
235*48a54d36SAndroid Build Coastguard Worker 			ASSERT( entry );
236*48a54d36SAndroid Build Coastguard Worker 			if( entry )
237*48a54d36SAndroid Build Coastguard Worker 			{
238*48a54d36SAndroid Build Coastguard Worker 				UTF8StringToStringObject( inEvent->data.removeService.name, entry->name );
239*48a54d36SAndroid Build Coastguard Worker 
240*48a54d36SAndroid Build Coastguard Worker 				posted = ::PostMessage( dialog->GetSafeHwnd(), WM_USER_SERVICE_REMOVE, 0, (LPARAM) entry );
241*48a54d36SAndroid Build Coastguard Worker 				ASSERT( posted );
242*48a54d36SAndroid Build Coastguard Worker 				if( !posted )
243*48a54d36SAndroid Build Coastguard Worker 				{
244*48a54d36SAndroid Build Coastguard Worker 					delete entry;
245*48a54d36SAndroid Build Coastguard Worker 				}
246*48a54d36SAndroid Build Coastguard Worker 			}
247*48a54d36SAndroid Build Coastguard Worker 			break;
248*48a54d36SAndroid Build Coastguard Worker 
249*48a54d36SAndroid Build Coastguard Worker 		default:
250*48a54d36SAndroid Build Coastguard Worker 			break;
251*48a54d36SAndroid Build Coastguard Worker 	}
252*48a54d36SAndroid Build Coastguard Worker }
253*48a54d36SAndroid Build Coastguard Worker 
254*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
255*48a54d36SAndroid Build Coastguard Worker //	BrowserAddService
256*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
257*48a54d36SAndroid Build Coastguard Worker 
OnServiceAdd(WPARAM inWParam,LPARAM inLParam)258*48a54d36SAndroid Build Coastguard Worker LONG	BrowserDialog::OnServiceAdd( WPARAM inWParam, LPARAM inLParam )
259*48a54d36SAndroid Build Coastguard Worker {
260*48a54d36SAndroid Build Coastguard Worker 	BrowserEntry *		entry;
261*48a54d36SAndroid Build Coastguard Worker 	INT_PTR				lo;
262*48a54d36SAndroid Build Coastguard Worker 	INT_PTR				hi;
263*48a54d36SAndroid Build Coastguard Worker 	INT_PTR				mid;
264*48a54d36SAndroid Build Coastguard Worker 	int					result;
265*48a54d36SAndroid Build Coastguard Worker 
266*48a54d36SAndroid Build Coastguard Worker 	(void) inWParam;	// Unused
267*48a54d36SAndroid Build Coastguard Worker 
268*48a54d36SAndroid Build Coastguard Worker 	entry = reinterpret_cast < BrowserEntry * > ( inLParam );
269*48a54d36SAndroid Build Coastguard Worker 	ASSERT( entry );
270*48a54d36SAndroid Build Coastguard Worker 
271*48a54d36SAndroid Build Coastguard Worker 	result 	= -1;
272*48a54d36SAndroid Build Coastguard Worker 	mid		= 0;
273*48a54d36SAndroid Build Coastguard Worker 	lo 		= 0;
274*48a54d36SAndroid Build Coastguard Worker 	hi 		= mBrowserEntries.GetSize() - 1;
275*48a54d36SAndroid Build Coastguard Worker 	while( lo <= hi )
276*48a54d36SAndroid Build Coastguard Worker 	{
277*48a54d36SAndroid Build Coastguard Worker 		mid = ( lo + hi ) / 2;
278*48a54d36SAndroid Build Coastguard Worker 		result = entry->name.CompareNoCase( mBrowserEntries[ mid ].name );
279*48a54d36SAndroid Build Coastguard Worker 		if( result == 0 )
280*48a54d36SAndroid Build Coastguard Worker 		{
281*48a54d36SAndroid Build Coastguard Worker 			break;
282*48a54d36SAndroid Build Coastguard Worker 		}
283*48a54d36SAndroid Build Coastguard Worker 		else if( result < 0 )
284*48a54d36SAndroid Build Coastguard Worker 		{
285*48a54d36SAndroid Build Coastguard Worker 			hi = mid - 1;
286*48a54d36SAndroid Build Coastguard Worker 		}
287*48a54d36SAndroid Build Coastguard Worker 		else
288*48a54d36SAndroid Build Coastguard Worker 		{
289*48a54d36SAndroid Build Coastguard Worker 			lo = mid + 1;
290*48a54d36SAndroid Build Coastguard Worker 		}
291*48a54d36SAndroid Build Coastguard Worker 	}
292*48a54d36SAndroid Build Coastguard Worker 	if( result == 0 )
293*48a54d36SAndroid Build Coastguard Worker 	{
294*48a54d36SAndroid Build Coastguard Worker 		mBrowserEntries[ mid ].ip	= entry->ip;
295*48a54d36SAndroid Build Coastguard Worker 		mBrowserEntries[ mid ].text	= entry->text;
296*48a54d36SAndroid Build Coastguard Worker 	}
297*48a54d36SAndroid Build Coastguard Worker 	else
298*48a54d36SAndroid Build Coastguard Worker 	{
299*48a54d36SAndroid Build Coastguard Worker 		if( result > 0 )
300*48a54d36SAndroid Build Coastguard Worker 		{
301*48a54d36SAndroid Build Coastguard Worker 			mid += 1;
302*48a54d36SAndroid Build Coastguard Worker 		}
303*48a54d36SAndroid Build Coastguard Worker 		mBrowserEntries.InsertAt( mid, *entry );
304*48a54d36SAndroid Build Coastguard Worker 		mBrowserList.InsertItem( mid, entry->name );
305*48a54d36SAndroid Build Coastguard Worker 	}
306*48a54d36SAndroid Build Coastguard Worker 	delete entry;
307*48a54d36SAndroid Build Coastguard Worker 	return( 0 );
308*48a54d36SAndroid Build Coastguard Worker }
309*48a54d36SAndroid Build Coastguard Worker 
310*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
311*48a54d36SAndroid Build Coastguard Worker //	OnServiceRemove
312*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
313*48a54d36SAndroid Build Coastguard Worker 
OnServiceRemove(WPARAM inWParam,LPARAM inLParam)314*48a54d36SAndroid Build Coastguard Worker LONG	BrowserDialog::OnServiceRemove( WPARAM inWParam, LPARAM inLParam )
315*48a54d36SAndroid Build Coastguard Worker {
316*48a54d36SAndroid Build Coastguard Worker 	BrowserEntry *		entry;
317*48a54d36SAndroid Build Coastguard Worker 	INT_PTR				hi;
318*48a54d36SAndroid Build Coastguard Worker 	INT_PTR				lo;
319*48a54d36SAndroid Build Coastguard Worker 	INT_PTR				mid;
320*48a54d36SAndroid Build Coastguard Worker 	int					result;
321*48a54d36SAndroid Build Coastguard Worker 
322*48a54d36SAndroid Build Coastguard Worker 	(void) inWParam;	// Unused
323*48a54d36SAndroid Build Coastguard Worker 
324*48a54d36SAndroid Build Coastguard Worker 	entry = reinterpret_cast < BrowserEntry * > ( inLParam );
325*48a54d36SAndroid Build Coastguard Worker 	ASSERT( entry );
326*48a54d36SAndroid Build Coastguard Worker 
327*48a54d36SAndroid Build Coastguard Worker 	result 	= -1;
328*48a54d36SAndroid Build Coastguard Worker 	mid		= 0;
329*48a54d36SAndroid Build Coastguard Worker 	lo 		= 0;
330*48a54d36SAndroid Build Coastguard Worker 	hi 		= mBrowserEntries.GetSize() - 1;
331*48a54d36SAndroid Build Coastguard Worker 	while( lo <= hi )
332*48a54d36SAndroid Build Coastguard Worker 	{
333*48a54d36SAndroid Build Coastguard Worker 		mid = ( lo + hi ) / 2;
334*48a54d36SAndroid Build Coastguard Worker 		result = entry->name.CompareNoCase( mBrowserEntries[ mid ].name );
335*48a54d36SAndroid Build Coastguard Worker 		if( result == 0 )
336*48a54d36SAndroid Build Coastguard Worker 		{
337*48a54d36SAndroid Build Coastguard Worker 			break;
338*48a54d36SAndroid Build Coastguard Worker 		}
339*48a54d36SAndroid Build Coastguard Worker 		else if( result < 0 )
340*48a54d36SAndroid Build Coastguard Worker 		{
341*48a54d36SAndroid Build Coastguard Worker 			hi = mid - 1;
342*48a54d36SAndroid Build Coastguard Worker 		}
343*48a54d36SAndroid Build Coastguard Worker 		else
344*48a54d36SAndroid Build Coastguard Worker 		{
345*48a54d36SAndroid Build Coastguard Worker 			lo = mid + 1;
346*48a54d36SAndroid Build Coastguard Worker 		}
347*48a54d36SAndroid Build Coastguard Worker 	}
348*48a54d36SAndroid Build Coastguard Worker 	if( result == 0 )
349*48a54d36SAndroid Build Coastguard Worker 	{
350*48a54d36SAndroid Build Coastguard Worker 		mBrowserList.DeleteItem( mid );
351*48a54d36SAndroid Build Coastguard Worker 		mBrowserEntries.RemoveAt( mid );
352*48a54d36SAndroid Build Coastguard Worker 	}
353*48a54d36SAndroid Build Coastguard Worker 	delete entry;
354*48a54d36SAndroid Build Coastguard Worker 	return( 0 );
355*48a54d36SAndroid Build Coastguard Worker }
356*48a54d36SAndroid Build Coastguard Worker 
357*48a54d36SAndroid Build Coastguard Worker #if 0
358*48a54d36SAndroid Build Coastguard Worker #pragma mark -
359*48a54d36SAndroid Build Coastguard Worker #endif
360*48a54d36SAndroid Build Coastguard Worker 
361*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
362*48a54d36SAndroid Build Coastguard Worker //	UTF8StringToStringObject
363*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
364*48a54d36SAndroid Build Coastguard Worker 
UTF8StringToStringObject(const char * inUTF8,CString & inObject)365*48a54d36SAndroid Build Coastguard Worker static DWORD	UTF8StringToStringObject( const char *inUTF8, CString &inObject )
366*48a54d36SAndroid Build Coastguard Worker {
367*48a54d36SAndroid Build Coastguard Worker 	DWORD			err;
368*48a54d36SAndroid Build Coastguard Worker 	int				n;
369*48a54d36SAndroid Build Coastguard Worker 	wchar_t *		unicode;
370*48a54d36SAndroid Build Coastguard Worker 
371*48a54d36SAndroid Build Coastguard Worker 	unicode = NULL;
372*48a54d36SAndroid Build Coastguard Worker 
373*48a54d36SAndroid Build Coastguard Worker 	n = MultiByteToWideChar( CP_UTF8, 0, inUTF8, -1, NULL, 0 );
374*48a54d36SAndroid Build Coastguard Worker 	if( n > 0 )
375*48a54d36SAndroid Build Coastguard Worker 	{
376*48a54d36SAndroid Build Coastguard Worker 		unicode = (wchar_t *) malloc( (size_t)( n * sizeof( wchar_t ) ) );
377*48a54d36SAndroid Build Coastguard Worker 		if( !unicode ) { err = ERROR_INSUFFICIENT_BUFFER; goto exit; };
378*48a54d36SAndroid Build Coastguard Worker 
379*48a54d36SAndroid Build Coastguard Worker 		n = MultiByteToWideChar( CP_UTF8, 0, inUTF8, -1, unicode, n );
380*48a54d36SAndroid Build Coastguard Worker 		inObject = unicode;
381*48a54d36SAndroid Build Coastguard Worker 	}
382*48a54d36SAndroid Build Coastguard Worker 	else
383*48a54d36SAndroid Build Coastguard Worker 	{
384*48a54d36SAndroid Build Coastguard Worker 		inObject = "";
385*48a54d36SAndroid Build Coastguard Worker 	}
386*48a54d36SAndroid Build Coastguard Worker 	err = 0;
387*48a54d36SAndroid Build Coastguard Worker 
388*48a54d36SAndroid Build Coastguard Worker exit:
389*48a54d36SAndroid Build Coastguard Worker 	if( unicode )
390*48a54d36SAndroid Build Coastguard Worker 	{
391*48a54d36SAndroid Build Coastguard Worker 		free( unicode );
392*48a54d36SAndroid Build Coastguard Worker 	}
393*48a54d36SAndroid Build Coastguard Worker 	return( err );
394*48a54d36SAndroid Build Coastguard Worker }
395