xref: /aosp_15_r20/external/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/ChooserDialog.cpp (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
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	<assert.h>
19*48a54d36SAndroid Build Coastguard Worker #include	<stdio.h>
20*48a54d36SAndroid Build Coastguard Worker #include	<stdlib.h>
21*48a54d36SAndroid Build Coastguard Worker #include	<string.h>
22*48a54d36SAndroid Build Coastguard Worker #include	<time.h>
23*48a54d36SAndroid Build Coastguard Worker 
24*48a54d36SAndroid Build Coastguard Worker #include	<algorithm>
25*48a54d36SAndroid Build Coastguard Worker #include	<memory>
26*48a54d36SAndroid Build Coastguard Worker 
27*48a54d36SAndroid Build Coastguard Worker #include	"stdafx.h"
28*48a54d36SAndroid Build Coastguard Worker 
29*48a54d36SAndroid Build Coastguard Worker #include	"DNSServices.h"
30*48a54d36SAndroid Build Coastguard Worker 
31*48a54d36SAndroid Build Coastguard Worker #include	"Application.h"
32*48a54d36SAndroid Build Coastguard Worker #include	"AboutDialog.h"
33*48a54d36SAndroid Build Coastguard Worker #include	"LoginDialog.h"
34*48a54d36SAndroid Build Coastguard Worker #include	"Resource.h"
35*48a54d36SAndroid Build Coastguard Worker 
36*48a54d36SAndroid Build Coastguard Worker #include	"ChooserDialog.h"
37*48a54d36SAndroid Build Coastguard Worker 
38*48a54d36SAndroid Build Coastguard Worker #ifdef _DEBUG
39*48a54d36SAndroid Build Coastguard Worker #define new DEBUG_NEW
40*48a54d36SAndroid Build Coastguard Worker #undef THIS_FILE
41*48a54d36SAndroid Build Coastguard Worker static char THIS_FILE[] = __FILE__;
42*48a54d36SAndroid Build Coastguard Worker #endif
43*48a54d36SAndroid Build Coastguard Worker 
44*48a54d36SAndroid Build Coastguard Worker #if 0
45*48a54d36SAndroid Build Coastguard Worker #pragma mark == Constants ==
46*48a54d36SAndroid Build Coastguard Worker #endif
47*48a54d36SAndroid Build Coastguard Worker 
48*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
49*48a54d36SAndroid Build Coastguard Worker //	Constants
50*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
51*48a54d36SAndroid Build Coastguard Worker 
52*48a54d36SAndroid Build Coastguard Worker // Menus
53*48a54d36SAndroid Build Coastguard Worker 
54*48a54d36SAndroid Build Coastguard Worker enum
55*48a54d36SAndroid Build Coastguard Worker {
56*48a54d36SAndroid Build Coastguard Worker 	kChooserMenuIndexFile	= 0,
57*48a54d36SAndroid Build Coastguard Worker 	kChooserMenuIndexHelp	= 1
58*48a54d36SAndroid Build Coastguard Worker };
59*48a54d36SAndroid Build Coastguard Worker 
60*48a54d36SAndroid Build Coastguard Worker // Domain List
61*48a54d36SAndroid Build Coastguard Worker 
62*48a54d36SAndroid Build Coastguard Worker #define kDomainListDefaultDomainColumnWidth		 		164
63*48a54d36SAndroid Build Coastguard Worker 
64*48a54d36SAndroid Build Coastguard Worker // Service List
65*48a54d36SAndroid Build Coastguard Worker 
66*48a54d36SAndroid Build Coastguard Worker #define kServiceListDefaultServiceColumnTypeWidth		146
67*48a54d36SAndroid Build Coastguard Worker #define kServiceListDefaultServiceColumnDescWidth		230
68*48a54d36SAndroid Build Coastguard Worker 
69*48a54d36SAndroid Build Coastguard Worker // Chooser List
70*48a54d36SAndroid Build Coastguard Worker 
71*48a54d36SAndroid Build Coastguard Worker #define kChooserListDefaultNameColumnWidth				190
72*48a54d36SAndroid Build Coastguard Worker #define kChooserListDefaultIPColumnWidth				120
73*48a54d36SAndroid Build Coastguard Worker 
74*48a54d36SAndroid Build Coastguard Worker // Windows User Messages
75*48a54d36SAndroid Build Coastguard Worker 
76*48a54d36SAndroid Build Coastguard Worker #define	WM_USER_DOMAIN_ADD								( WM_USER + 0x100 )
77*48a54d36SAndroid Build Coastguard Worker #define	WM_USER_DOMAIN_REMOVE							( WM_USER + 0x101 )
78*48a54d36SAndroid Build Coastguard Worker #define	WM_USER_SERVICE_ADD								( WM_USER + 0x102 )
79*48a54d36SAndroid Build Coastguard Worker #define	WM_USER_SERVICE_REMOVE							( WM_USER + 0x103 )
80*48a54d36SAndroid Build Coastguard Worker #define	WM_USER_RESOLVE									( WM_USER + 0x104 )
81*48a54d36SAndroid Build Coastguard Worker 
82*48a54d36SAndroid Build Coastguard Worker #if 0
83*48a54d36SAndroid Build Coastguard Worker #pragma mark == Constants - Service Table ==
84*48a54d36SAndroid Build Coastguard Worker #endif
85*48a54d36SAndroid Build Coastguard Worker 
86*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
87*48a54d36SAndroid Build Coastguard Worker //	Constants - Service Table
88*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
89*48a54d36SAndroid Build Coastguard Worker 
90*48a54d36SAndroid Build Coastguard Worker struct	KnownServiceEntry
91*48a54d36SAndroid Build Coastguard Worker {
92*48a54d36SAndroid Build Coastguard Worker 	const char *		serviceType;
93*48a54d36SAndroid Build Coastguard Worker 	const char *		description;
94*48a54d36SAndroid Build Coastguard Worker 	const char *		urlScheme;
95*48a54d36SAndroid Build Coastguard Worker 	bool				useText;
96*48a54d36SAndroid Build Coastguard Worker };
97*48a54d36SAndroid Build Coastguard Worker 
98*48a54d36SAndroid Build Coastguard Worker static const KnownServiceEntry		kKnownServiceTable[] =
99*48a54d36SAndroid Build Coastguard Worker {
100*48a54d36SAndroid Build Coastguard Worker 	{ "_accountedge._tcp.",	 		"MYOB AccountEdge", 										"", 			false },
101*48a54d36SAndroid Build Coastguard Worker 	{ "_aecoretech._tcp.", 			"Apple Application Engineering Services",					"", 			false },
102*48a54d36SAndroid Build Coastguard Worker 	{ "_afpovertcp._tcp.", 			"Apple File Sharing (AFP)", 								"afp://", 		false },
103*48a54d36SAndroid Build Coastguard Worker 	{ "_airport._tcp.", 			"AirPort Base Station",										"", 			false },
104*48a54d36SAndroid Build Coastguard Worker 	{ "_apple-sasl._tcp.", 			"Apple Password Server", 									"", 			false },
105*48a54d36SAndroid Build Coastguard Worker 	{ "_aquamon._tcp.", 			"AquaMon", 													"", 			false },
106*48a54d36SAndroid Build Coastguard Worker 	{ "_async._tcp", 				"address-o-sync", 											"", 			false },
107*48a54d36SAndroid Build Coastguard Worker 	{ "_auth._tcp.", 				"Authentication Service",									"", 			false },
108*48a54d36SAndroid Build Coastguard Worker 	{ "_bootps._tcp.", 				"Bootstrap Protocol Server",								"", 			false },
109*48a54d36SAndroid Build Coastguard Worker 	{ "_bousg._tcp.", 				"Bag Of Unusual Strategy Games",							"", 			false },
110*48a54d36SAndroid Build Coastguard Worker 	{ "_browse._udp.", 				"DNS Service Discovery",									"", 			false },
111*48a54d36SAndroid Build Coastguard Worker 	{ "_cheat._tcp.", 				"The Cheat",												"", 			false },
112*48a54d36SAndroid Build Coastguard Worker 	{ "_chess._tcp", 				"Project Gridlock", 										"", 			false },
113*48a54d36SAndroid Build Coastguard Worker 	{ "_chfts._tcp", 				"Fluid Theme Server", 										"", 			false },
114*48a54d36SAndroid Build Coastguard Worker 	{ "_clipboard._tcp", 			"Clipboard Sharing", 										"", 			false },
115*48a54d36SAndroid Build Coastguard Worker 	{ "_contactserver._tcp.", 		"Now Up-to-Date & Contact",									"", 			false },
116*48a54d36SAndroid Build Coastguard Worker 	{ "_cvspserver._tcp", 			"CVS PServer", 												"", 			false },
117*48a54d36SAndroid Build Coastguard Worker 	{ "_cytv._tcp.", 				"CyTV Network streaming for Elgato EyeTV",					"", 			false },
118*48a54d36SAndroid Build Coastguard Worker 	{ "_daap._tcp.", 				"Digital Audio Access Protocol (iTunes)",					"daap://",		false },
119*48a54d36SAndroid Build Coastguard Worker 	{ "_distcc._tcp", 				"Distributed Compiler", 									"", 			false },
120*48a54d36SAndroid Build Coastguard Worker 	{ "_dns-sd._udp", 				"DNS Service Discovery", 									"", 			false },
121*48a54d36SAndroid Build Coastguard Worker 	{ "_dpap._tcp.", 				"Digital Picture Access Protocol (iPhoto)",					"", 			false },
122*48a54d36SAndroid Build Coastguard Worker 	{ "_earphoria._tcp.", 			"Earphoria",												"", 			false },
123*48a54d36SAndroid Build Coastguard Worker 	{ "_ecbyesfsgksc._tcp.", 		"Net Monitor Anti-Piracy Service",							"",				false },
124*48a54d36SAndroid Build Coastguard Worker 	{ "_eheap._tcp.", 				"Interactive Room Software",								"",				false },
125*48a54d36SAndroid Build Coastguard Worker 	{ "_embrace._tcp.", 			"DataEnvoy",												"",				false },
126*48a54d36SAndroid Build Coastguard Worker 	{ "_eppc._tcp.", 				"Remote AppleEvents", 										"eppc://", 		false },
127*48a54d36SAndroid Build Coastguard Worker 	{ "_exec._tcp.", 				"Remote Process Execution",									"",				false },
128*48a54d36SAndroid Build Coastguard Worker 	{ "_facespan._tcp.", 			"FaceSpan",													"",				false },
129*48a54d36SAndroid Build Coastguard Worker 	{ "_fjork._tcp.", 				"Fjork",													"",				false },
130*48a54d36SAndroid Build Coastguard Worker 	{ "_ftp._tcp.", 				"File Transfer (FTP)", 										"ftp://", 		false },
131*48a54d36SAndroid Build Coastguard Worker 	{ "_ftpcroco._tcp.", 			"Crocodile FTP Server",										"",				false },
132*48a54d36SAndroid Build Coastguard Worker 	{ "_gbs-smp._tcp.", 			"SnapMail",													"",				false },
133*48a54d36SAndroid Build Coastguard Worker 	{ "_gbs-stp._tcp.", 			"SnapTalk",													"",				false },
134*48a54d36SAndroid Build Coastguard Worker 	{ "_grillezvous._tcp.", 		"Roxio ToastAnywhere(tm) Recorder Sharing",					"",				false },
135*48a54d36SAndroid Build Coastguard Worker 	{ "_h323._tcp.", 				"H.323",													"",				false },
136*48a54d36SAndroid Build Coastguard Worker 	{ "_hotwayd._tcp", 				"Hotwayd", 													"", 			false },
137*48a54d36SAndroid Build Coastguard Worker 	{ "_http._tcp.", 				"Web Server (HTTP)", 										"http://", 		true  },
138*48a54d36SAndroid Build Coastguard Worker 	{ "_hydra._tcp", 				"SubEthaEdit", 												"", 			false },
139*48a54d36SAndroid Build Coastguard Worker 	{ "_ica-networking._tcp.", 		"Image Capture Networking",									"", 			false },
140*48a54d36SAndroid Build Coastguard Worker 	{ "_ichalkboard._tcp.", 		"iChalk",													"", 			false },
141*48a54d36SAndroid Build Coastguard Worker 	{ "_ichat._tcp.", 				"iChat",				 									"ichat://",		false },
142*48a54d36SAndroid Build Coastguard Worker 	{ "_iconquer._tcp.",	 		"iConquer",													"", 			false },
143*48a54d36SAndroid Build Coastguard Worker 	{ "_imap._tcp.", 				"Internet Message Access Protocol",							"",				false },
144*48a54d36SAndroid Build Coastguard Worker 	{ "_imidi._tcp.", 				"iMidi",													"",				false },
145*48a54d36SAndroid Build Coastguard Worker 	{ "_ipp._tcp.", 				"Printer (IPP)", 											"ipp://", 		false },
146*48a54d36SAndroid Build Coastguard Worker 	{ "_ishare._tcp.", 				"iShare",													"",				false },
147*48a54d36SAndroid Build Coastguard Worker 	{ "_isparx._tcp.", 				"iSparx",													"",				false },
148*48a54d36SAndroid Build Coastguard Worker 	{ "_istorm._tcp", 				"iStorm", 													"", 			false },
149*48a54d36SAndroid Build Coastguard Worker 	{ "_iwork._tcp.", 				"iWork Server",												"",				false },
150*48a54d36SAndroid Build Coastguard Worker 	{ "_liaison._tcp.", 			"Liaison",													"",				false },
151*48a54d36SAndroid Build Coastguard Worker 	{ "_login._tcp.", 				"Remote Login a la Telnet",									"",				false },
152*48a54d36SAndroid Build Coastguard Worker 	{ "_lontalk._tcp.", 			"LonTalk over IP (ANSI 852)",								"",				false },
153*48a54d36SAndroid Build Coastguard Worker 	{ "_lonworks._tcp.", 			"Echelon LNS Remote Client",								"",				false },
154*48a54d36SAndroid Build Coastguard Worker 	{ "_macfoh-remote._tcp.", 		"MacFOH Remote",											"",				false },
155*48a54d36SAndroid Build Coastguard Worker 	{ "_moneyworks._tcp.", 			"MoneyWorks",												"",				false },
156*48a54d36SAndroid Build Coastguard Worker 	{ "_mp3sushi._tcp", 			"MP3 Sushi", 												"", 			false },
157*48a54d36SAndroid Build Coastguard Worker 	{ "_mttp._tcp.", 				"MenuTunes Sharing",										"",				false },
158*48a54d36SAndroid Build Coastguard Worker 	{ "_ncbroadcast._tcp.", 		"Network Clipboard Broadcasts",								"",				false },
159*48a54d36SAndroid Build Coastguard Worker 	{ "_ncdirect._tcp.", 			"Network Clipboard Direct Transfers",						"",				false },
160*48a54d36SAndroid Build Coastguard Worker 	{ "_ncsyncserver._tcp.", 		"Network Clipboard Sync Server",							"",				false },
161*48a54d36SAndroid Build Coastguard Worker 	{ "_newton-dock._tcp.", 		"Escale",													"",				false },
162*48a54d36SAndroid Build Coastguard Worker 	{ "_nfs._tcp", 					"NFS", 														"", 			false },
163*48a54d36SAndroid Build Coastguard Worker 	{ "_nssocketport._tcp.", 		"DO over NSSocketPort",										"",				false },
164*48a54d36SAndroid Build Coastguard Worker 	{ "_omni-bookmark._tcp.", 		"OmniWeb",													"",				false },
165*48a54d36SAndroid Build Coastguard Worker 	{ "_openbase._tcp.", 			"OpenBase SQL",												"",				false },
166*48a54d36SAndroid Build Coastguard Worker 	{ "_p2pchat._tcp.", 			"Peer-to-Peer Chat",										"",				false },
167*48a54d36SAndroid Build Coastguard Worker 	{ "_pdl-datastream._tcp.", 		"Printer (PDL)", 											"pdl://", 		false },
168*48a54d36SAndroid Build Coastguard Worker 	{ "_poch._tcp.", 				"Parallel OperatiOn and Control Heuristic",					"",				false },
169*48a54d36SAndroid Build Coastguard Worker 	{ "_pop_2_ambrosia._tcp.",		"Pop-Pop",													"",				false },
170*48a54d36SAndroid Build Coastguard Worker 	{ "_pop3._tcp", 				"POP3 Server", 												"", 			false },
171*48a54d36SAndroid Build Coastguard Worker 	{ "_postgresql._tcp", 			"PostgreSQL Server", 										"", 			false },
172*48a54d36SAndroid Build Coastguard Worker 	{ "_presence._tcp", 			"iChat AV", 												"", 			false },
173*48a54d36SAndroid Build Coastguard Worker 	{ "_printer._tcp.", 			"Printer (LPR)", 											"lpr://", 		false },
174*48a54d36SAndroid Build Coastguard Worker 	{ "_ptp._tcp.", 				"Picture Transfer (PTP)", 									"ptp://", 		false },
175*48a54d36SAndroid Build Coastguard Worker 	{ "_register._tcp", 			"DNS Service Discovery", 									"", 			false },
176*48a54d36SAndroid Build Coastguard Worker 	{ "_rfb._tcp.", 				"Remote Frame Buffer",										"",				false },
177*48a54d36SAndroid Build Coastguard Worker 	{ "_riousbprint._tcp.", 		"Remote I/O USB Printer Protocol",							"",				false },
178*48a54d36SAndroid Build Coastguard Worker 	{ "_rtsp._tcp.", 				"Real Time Stream Control Protocol",						"",				false },
179*48a54d36SAndroid Build Coastguard Worker 	{ "_safarimenu._tcp", 			"Safari Menu", 												"", 			false },
180*48a54d36SAndroid Build Coastguard Worker 	{ "_scone._tcp", 				"Scone", 													"", 			false },
181*48a54d36SAndroid Build Coastguard Worker 	{ "_sdsharing._tcp.", 			"Speed Download",											"",				false },
182*48a54d36SAndroid Build Coastguard Worker 	{ "_seeCard._tcp.", 			"seeCard",													"",				false },
183*48a54d36SAndroid Build Coastguard Worker 	{ "_services._udp.", 			"DNS Service Discovery",									"",				false },
184*48a54d36SAndroid Build Coastguard Worker 	{ "_shell._tcp.", 				"like exec, but automatic authentication",					"",				false },
185*48a54d36SAndroid Build Coastguard Worker 	{ "_shout._tcp.", 				"Shout",													"",				false },
186*48a54d36SAndroid Build Coastguard Worker 	{ "_shoutcast._tcp", 			"Nicecast", 												"", 			false },
187*48a54d36SAndroid Build Coastguard Worker 	{ "_smb._tcp.", 				"Windows File Sharing (SMB)", 								"smb://", 		false },
188*48a54d36SAndroid Build Coastguard Worker 	{ "_soap._tcp.", 				"Simple Object Access Protocol", 							"", 			false },
189*48a54d36SAndroid Build Coastguard Worker 	{ "_spincrisis._tcp.", 			"Spin Crisis",												"",				false },
190*48a54d36SAndroid Build Coastguard Worker 	{ "_spl-itunes._tcp.", 			"launchTunes",												"",				false },
191*48a54d36SAndroid Build Coastguard Worker 	{ "_spr-itunes._tcp.", 			"netTunes",													"",				false },
192*48a54d36SAndroid Build Coastguard Worker 	{ "_ssh._tcp.", 				"Secure Shell (SSH)", 										"ssh://", 		false },
193*48a54d36SAndroid Build Coastguard Worker 	{ "_ssscreenshare._tcp", 		"Screen Sharing", 											"", 			false },
194*48a54d36SAndroid Build Coastguard Worker 	{ "_sge-exec._tcp", 			"Sun Grid Engine (Execution Host)", 						"", 			false },
195*48a54d36SAndroid Build Coastguard Worker 	{ "_sge-qmaster._tcp", 			"Sun Grid Engine (Master)", 								"", 			false },
196*48a54d36SAndroid Build Coastguard Worker 	{ "_stickynotes._tcp", 			"Sticky Notes", 											"", 			false },
197*48a54d36SAndroid Build Coastguard Worker 	{ "_strateges._tcp", 			"Strateges", 												"", 			false },
198*48a54d36SAndroid Build Coastguard Worker 	{ "_sxqdea._tcp", 				"Synchronize! Pro X", 										"", 			false },
199*48a54d36SAndroid Build Coastguard Worker 	{ "_sybase-tds._tcp", 			"Sybase Server", 											"", 			false },
200*48a54d36SAndroid Build Coastguard Worker 	{ "_tce._tcp", 					"Power Card", 												"", 			false },
201*48a54d36SAndroid Build Coastguard Worker 	{ "_teamlist._tcp", 			"ARTIS Team Task",											"", 			false },
202*48a54d36SAndroid Build Coastguard Worker 	{ "_teleport._tcp", 			"teleport",													"", 			false },
203*48a54d36SAndroid Build Coastguard Worker 	{ "_telnet._tcp.", 				"Telnet", 													"telnet://", 	false },
204*48a54d36SAndroid Build Coastguard Worker 	{ "_tftp._tcp.", 				"Trivial File Transfer (TFTP)", 							"tftp://", 		false },
205*48a54d36SAndroid Build Coastguard Worker 	{ "_tinavigator._tcp.", 		"TI Navigator", 											"", 			false },
206*48a54d36SAndroid Build Coastguard Worker 	{ "_tivo_servemedia._tcp", 		"TiVo",														"", 			false },
207*48a54d36SAndroid Build Coastguard Worker 	{ "_upnp._tcp.", 				"Universal Plug and Play", 									"", 			false },
208*48a54d36SAndroid Build Coastguard Worker 	{ "_utest._tcp.", 				"uTest", 													"", 			false },
209*48a54d36SAndroid Build Coastguard Worker 	{ "_vue4rendercow._tcp",		"VueProRenderCow",											"", 			false },
210*48a54d36SAndroid Build Coastguard Worker 	{ "_webdav._tcp.", 				"WebDAV", 													"webdav://",	false },
211*48a54d36SAndroid Build Coastguard Worker 	{ "_whamb._tcp.", 				"Whamb", 													"",				false },
212*48a54d36SAndroid Build Coastguard Worker 	{ "_workstation._tcp", 			"Macintosh Manager",										"", 			false },
213*48a54d36SAndroid Build Coastguard Worker 	{ "_ws._tcp", 					"Web Services",												"", 			false },
214*48a54d36SAndroid Build Coastguard Worker 	{ "_xserveraid._tcp.", 			"Xserve RAID",												"xsr://", 		false },
215*48a54d36SAndroid Build Coastguard Worker 	{ "_xsync._tcp.",	 			"Xserve RAID Synchronization",								"",		 		false },
216*48a54d36SAndroid Build Coastguard Worker 
217*48a54d36SAndroid Build Coastguard Worker 	{ "",	 						"",															"",		 		false },
218*48a54d36SAndroid Build Coastguard Worker 
219*48a54d36SAndroid Build Coastguard Worker 	// Unofficial and invalid service types that will be phased out:
220*48a54d36SAndroid Build Coastguard Worker 
221*48a54d36SAndroid Build Coastguard Worker 	{ "_clipboardsharing._tcp.",			"ClipboardSharing",									"",		 		false },
222*48a54d36SAndroid Build Coastguard Worker 	{ "_MacOSXDupSuppress._tcp.",			"Mac OS X Duplicate Suppression",					"",		 		false },
223*48a54d36SAndroid Build Coastguard Worker 	{ "_netmonitorserver._tcp.",			"Net Monitor Server",								"",		 		false },
224*48a54d36SAndroid Build Coastguard Worker 	{ "_networkclipboard._tcp.",			"Network Clipboard",								"",		 		false },
225*48a54d36SAndroid Build Coastguard Worker 	{ "_slimdevices_slimp3_cli._tcp.",		"SliMP3 Server Command-Line Interface",				"",		 		false },
226*48a54d36SAndroid Build Coastguard Worker 	{ "_slimdevices_slimp3_http._tcp.",		"SliMP3 Server Web Interface",						"",		 		false },
227*48a54d36SAndroid Build Coastguard Worker 	{ "_tieducationalhandhelddevice._tcp.",	"TI Connect Manager",								"",		 		false },
228*48a54d36SAndroid Build Coastguard Worker 	{ "_tivo_servemedia._tcp.",				"TiVo",												"",		 		false },
229*48a54d36SAndroid Build Coastguard Worker 
230*48a54d36SAndroid Build Coastguard Worker 	{ NULL,							NULL,														NULL,			false },
231*48a54d36SAndroid Build Coastguard Worker };
232*48a54d36SAndroid Build Coastguard Worker 
233*48a54d36SAndroid Build Coastguard Worker #if 0
234*48a54d36SAndroid Build Coastguard Worker #pragma mark == Structures ==
235*48a54d36SAndroid Build Coastguard Worker #endif
236*48a54d36SAndroid Build Coastguard Worker 
237*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
238*48a54d36SAndroid Build Coastguard Worker //	Structures
239*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
240*48a54d36SAndroid Build Coastguard Worker 
241*48a54d36SAndroid Build Coastguard Worker struct	DomainEventInfo
242*48a54d36SAndroid Build Coastguard Worker {
243*48a54d36SAndroid Build Coastguard Worker 	DNSBrowserEventType		eventType;
244*48a54d36SAndroid Build Coastguard Worker 	CString					domain;
245*48a54d36SAndroid Build Coastguard Worker 	DNSNetworkAddress		ifIP;
246*48a54d36SAndroid Build Coastguard Worker };
247*48a54d36SAndroid Build Coastguard Worker 
248*48a54d36SAndroid Build Coastguard Worker struct	ServiceEventInfo
249*48a54d36SAndroid Build Coastguard Worker {
250*48a54d36SAndroid Build Coastguard Worker 	DNSBrowserEventType		eventType;
251*48a54d36SAndroid Build Coastguard Worker 	std::string				name;
252*48a54d36SAndroid Build Coastguard Worker 	std::string				type;
253*48a54d36SAndroid Build Coastguard Worker 	std::string				domain;
254*48a54d36SAndroid Build Coastguard Worker 	DNSNetworkAddress		ifIP;
255*48a54d36SAndroid Build Coastguard Worker };
256*48a54d36SAndroid Build Coastguard Worker 
257*48a54d36SAndroid Build Coastguard Worker #if 0
258*48a54d36SAndroid Build Coastguard Worker #pragma mark == Prototypes ==
259*48a54d36SAndroid Build Coastguard Worker #endif
260*48a54d36SAndroid Build Coastguard Worker 
261*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
262*48a54d36SAndroid Build Coastguard Worker //	Prototypes
263*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
264*48a54d36SAndroid Build Coastguard Worker 
265*48a54d36SAndroid Build Coastguard Worker static void
266*48a54d36SAndroid Build Coastguard Worker 	BrowserCallBack(
267*48a54d36SAndroid Build Coastguard Worker 		void *					inContext,
268*48a54d36SAndroid Build Coastguard Worker 		DNSBrowserRef			inRef,
269*48a54d36SAndroid Build Coastguard Worker 		DNSStatus				inStatusCode,
270*48a54d36SAndroid Build Coastguard Worker 		const DNSBrowserEvent *	inEvent );
271*48a54d36SAndroid Build Coastguard Worker 
272*48a54d36SAndroid Build Coastguard Worker static char *	DNSNetworkAddressToString( const DNSNetworkAddress *inAddr, char *outString );
273*48a54d36SAndroid Build Coastguard Worker 
274*48a54d36SAndroid Build Coastguard Worker static DWORD	UTF8StringToStringObject( const char *inUTF8, CString &inObject );
275*48a54d36SAndroid Build Coastguard Worker static DWORD	StringObjectToUTF8String( CString &inObject, std::string &outUTF8 );
276*48a54d36SAndroid Build Coastguard Worker 
277*48a54d36SAndroid Build Coastguard Worker #if 0
278*48a54d36SAndroid Build Coastguard Worker #pragma mark == Message Map ==
279*48a54d36SAndroid Build Coastguard Worker #endif
280*48a54d36SAndroid Build Coastguard Worker 
281*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
282*48a54d36SAndroid Build Coastguard Worker //	Message Map
283*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
284*48a54d36SAndroid Build Coastguard Worker 
BEGIN_MESSAGE_MAP(ChooserDialog,CDialog)285*48a54d36SAndroid Build Coastguard Worker BEGIN_MESSAGE_MAP(ChooserDialog, CDialog)
286*48a54d36SAndroid Build Coastguard Worker 	//{{AFX_MSG_MAP(ChooserDialog)
287*48a54d36SAndroid Build Coastguard Worker 	ON_WM_SYSCOMMAND()
288*48a54d36SAndroid Build Coastguard Worker 	ON_NOTIFY(LVN_ITEMCHANGED, IDC_DOMAIN_LIST, OnDomainListChanged)
289*48a54d36SAndroid Build Coastguard Worker 	ON_NOTIFY(LVN_ITEMCHANGED, IDC_SERVICE_LIST, OnServiceListChanged)
290*48a54d36SAndroid Build Coastguard Worker 	ON_NOTIFY(LVN_ITEMCHANGED, IDC_CHOOSER_LIST, OnChooserListChanged)
291*48a54d36SAndroid Build Coastguard Worker 	ON_NOTIFY(NM_DBLCLK, IDC_CHOOSER_LIST, OnChooserListDoubleClick)
292*48a54d36SAndroid Build Coastguard Worker 	ON_COMMAND(ID_HELP_ABOUT, OnAbout)
293*48a54d36SAndroid Build Coastguard Worker 	ON_WM_INITMENUPOPUP()
294*48a54d36SAndroid Build Coastguard Worker 	ON_WM_ACTIVATE()
295*48a54d36SAndroid Build Coastguard Worker 	ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
296*48a54d36SAndroid Build Coastguard Worker 	ON_COMMAND(ID_FILE_EXIT, OnExit)
297*48a54d36SAndroid Build Coastguard Worker 	ON_WM_CLOSE()
298*48a54d36SAndroid Build Coastguard Worker 	ON_WM_NCDESTROY()
299*48a54d36SAndroid Build Coastguard Worker 	//}}AFX_MSG_MAP
300*48a54d36SAndroid Build Coastguard Worker 	ON_MESSAGE( WM_USER_DOMAIN_ADD, OnDomainAdd )
301*48a54d36SAndroid Build Coastguard Worker 	ON_MESSAGE( WM_USER_DOMAIN_REMOVE, OnDomainRemove )
302*48a54d36SAndroid Build Coastguard Worker 	ON_MESSAGE( WM_USER_SERVICE_ADD, OnServiceAdd )
303*48a54d36SAndroid Build Coastguard Worker 	ON_MESSAGE( WM_USER_SERVICE_REMOVE, OnServiceRemove )
304*48a54d36SAndroid Build Coastguard Worker 	ON_MESSAGE( WM_USER_RESOLVE, OnResolve )
305*48a54d36SAndroid Build Coastguard Worker END_MESSAGE_MAP()
306*48a54d36SAndroid Build Coastguard Worker 
307*48a54d36SAndroid Build Coastguard Worker #if 0
308*48a54d36SAndroid Build Coastguard Worker #pragma mark == Routines ==
309*48a54d36SAndroid Build Coastguard Worker #endif
310*48a54d36SAndroid Build Coastguard Worker 
311*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
312*48a54d36SAndroid Build Coastguard Worker //	ChooserDialog
313*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
314*48a54d36SAndroid Build Coastguard Worker 
315*48a54d36SAndroid Build Coastguard Worker ChooserDialog::ChooserDialog( CWnd *inParent )
316*48a54d36SAndroid Build Coastguard Worker 	: CDialog( ChooserDialog::IDD, inParent)
317*48a54d36SAndroid Build Coastguard Worker {
318*48a54d36SAndroid Build Coastguard Worker 	//{{AFX_DATA_INIT(ChooserDialog)
319*48a54d36SAndroid Build Coastguard Worker 		// Note: the ClassWizard will add member initialization here
320*48a54d36SAndroid Build Coastguard Worker 	//}}AFX_DATA_INIT
321*48a54d36SAndroid Build Coastguard Worker 
322*48a54d36SAndroid Build Coastguard Worker 	// Load menu accelerator table.
323*48a54d36SAndroid Build Coastguard Worker 
324*48a54d36SAndroid Build Coastguard Worker 	mMenuAcceleratorTable = ::LoadAccelerators( AfxGetInstanceHandle(), MAKEINTRESOURCE( IDR_CHOOSER_DIALOG_MENU_ACCELERATORS ) );
325*48a54d36SAndroid Build Coastguard Worker 	assert( mMenuAcceleratorTable );
326*48a54d36SAndroid Build Coastguard Worker 
327*48a54d36SAndroid Build Coastguard Worker 	mBrowser 			= NULL;
328*48a54d36SAndroid Build Coastguard Worker 	mIsServiceBrowsing	= false;
329*48a54d36SAndroid Build Coastguard Worker }
330*48a54d36SAndroid Build Coastguard Worker 
331*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
332*48a54d36SAndroid Build Coastguard Worker //	~ChooserDialog
333*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
334*48a54d36SAndroid Build Coastguard Worker 
~ChooserDialog(void)335*48a54d36SAndroid Build Coastguard Worker ChooserDialog::~ChooserDialog( void )
336*48a54d36SAndroid Build Coastguard Worker {
337*48a54d36SAndroid Build Coastguard Worker 	if( mBrowser )
338*48a54d36SAndroid Build Coastguard Worker 	{
339*48a54d36SAndroid Build Coastguard Worker 		DNSStatus		err;
340*48a54d36SAndroid Build Coastguard Worker 
341*48a54d36SAndroid Build Coastguard Worker 		err = DNSBrowserRelease( mBrowser, 0 );
342*48a54d36SAndroid Build Coastguard Worker 		assert( err == kDNSNoErr );
343*48a54d36SAndroid Build Coastguard Worker 	}
344*48a54d36SAndroid Build Coastguard Worker }
345*48a54d36SAndroid Build Coastguard Worker 
346*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
347*48a54d36SAndroid Build Coastguard Worker //	DoDataExchange
348*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
349*48a54d36SAndroid Build Coastguard Worker 
DoDataExchange(CDataExchange * pDX)350*48a54d36SAndroid Build Coastguard Worker void ChooserDialog::DoDataExchange( CDataExchange *pDX )
351*48a54d36SAndroid Build Coastguard Worker {
352*48a54d36SAndroid Build Coastguard Worker 	CDialog::DoDataExchange(pDX);
353*48a54d36SAndroid Build Coastguard Worker 
354*48a54d36SAndroid Build Coastguard Worker 	//{{AFX_DATA_MAP(ChooserDialog)
355*48a54d36SAndroid Build Coastguard Worker 	DDX_Control(pDX, IDC_SERVICE_LIST, mServiceList);
356*48a54d36SAndroid Build Coastguard Worker 	DDX_Control(pDX, IDC_DOMAIN_LIST, mDomainList);
357*48a54d36SAndroid Build Coastguard Worker 	DDX_Control(pDX, IDC_CHOOSER_LIST, mChooserList);
358*48a54d36SAndroid Build Coastguard Worker 	//}}AFX_DATA_MAP
359*48a54d36SAndroid Build Coastguard Worker }
360*48a54d36SAndroid Build Coastguard Worker 
361*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
362*48a54d36SAndroid Build Coastguard Worker //	OnInitDialog
363*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
364*48a54d36SAndroid Build Coastguard Worker 
OnInitDialog(void)365*48a54d36SAndroid Build Coastguard Worker BOOL	ChooserDialog::OnInitDialog( void )
366*48a54d36SAndroid Build Coastguard Worker {
367*48a54d36SAndroid Build Coastguard Worker 	HICON			icon;
368*48a54d36SAndroid Build Coastguard Worker 	BOOL			result;
369*48a54d36SAndroid Build Coastguard Worker 	CString			tempString;
370*48a54d36SAndroid Build Coastguard Worker 	DNSStatus		err;
371*48a54d36SAndroid Build Coastguard Worker 
372*48a54d36SAndroid Build Coastguard Worker 	// Initialize our parent.
373*48a54d36SAndroid Build Coastguard Worker 
374*48a54d36SAndroid Build Coastguard Worker 	CDialog::OnInitDialog();
375*48a54d36SAndroid Build Coastguard Worker 
376*48a54d36SAndroid Build Coastguard Worker 	// Set up the window icon.
377*48a54d36SAndroid Build Coastguard Worker 
378*48a54d36SAndroid Build Coastguard Worker 	icon = AfxGetApp()->LoadIcon( IDR_MAIN_ICON );
379*48a54d36SAndroid Build Coastguard Worker 	assert( icon );
380*48a54d36SAndroid Build Coastguard Worker 	if( icon )
381*48a54d36SAndroid Build Coastguard Worker 	{
382*48a54d36SAndroid Build Coastguard Worker 		SetIcon( icon, TRUE );		// Set big icon
383*48a54d36SAndroid Build Coastguard Worker 		SetIcon( icon, FALSE );		// Set small icon
384*48a54d36SAndroid Build Coastguard Worker 	}
385*48a54d36SAndroid Build Coastguard Worker 
386*48a54d36SAndroid Build Coastguard Worker 	// Set up the Domain List.
387*48a54d36SAndroid Build Coastguard Worker 
388*48a54d36SAndroid Build Coastguard Worker 	result = tempString.LoadString( IDS_CHOOSER_DOMAIN_COLUMN_NAME );
389*48a54d36SAndroid Build Coastguard Worker 	assert( result );
390*48a54d36SAndroid Build Coastguard Worker 	mDomainList.InsertColumn( 0, tempString, LVCFMT_LEFT, kDomainListDefaultDomainColumnWidth );
391*48a54d36SAndroid Build Coastguard Worker 
392*48a54d36SAndroid Build Coastguard Worker 	// Set up the Service List.
393*48a54d36SAndroid Build Coastguard Worker 
394*48a54d36SAndroid Build Coastguard Worker 	result = tempString.LoadString( IDS_CHOOSER_SERVICE_COLUMN_TYPE );
395*48a54d36SAndroid Build Coastguard Worker 	assert( result );
396*48a54d36SAndroid Build Coastguard Worker 	mServiceList.InsertColumn( 0, tempString, LVCFMT_LEFT, kServiceListDefaultServiceColumnTypeWidth );
397*48a54d36SAndroid Build Coastguard Worker 
398*48a54d36SAndroid Build Coastguard Worker 	result = tempString.LoadString( IDS_CHOOSER_SERVICE_COLUMN_DESC );
399*48a54d36SAndroid Build Coastguard Worker 	assert( result );
400*48a54d36SAndroid Build Coastguard Worker 	mServiceList.InsertColumn( 1, tempString, LVCFMT_LEFT, kServiceListDefaultServiceColumnDescWidth );
401*48a54d36SAndroid Build Coastguard Worker 
402*48a54d36SAndroid Build Coastguard Worker 	PopulateServicesList();
403*48a54d36SAndroid Build Coastguard Worker 
404*48a54d36SAndroid Build Coastguard Worker 	// Set up the Chooser List.
405*48a54d36SAndroid Build Coastguard Worker 
406*48a54d36SAndroid Build Coastguard Worker 	result = tempString.LoadString( IDS_CHOOSER_CHOOSER_NAME_COLUMN_NAME );
407*48a54d36SAndroid Build Coastguard Worker 	assert( result );
408*48a54d36SAndroid Build Coastguard Worker 	mChooserList.InsertColumn( 0, tempString, LVCFMT_LEFT, kChooserListDefaultNameColumnWidth );
409*48a54d36SAndroid Build Coastguard Worker 
410*48a54d36SAndroid Build Coastguard Worker 	result = tempString.LoadString( IDS_CHOOSER_CHOOSER_IP_COLUMN_NAME );
411*48a54d36SAndroid Build Coastguard Worker 	assert( result );
412*48a54d36SAndroid Build Coastguard Worker 	mChooserList.InsertColumn( 1, tempString, LVCFMT_LEFT, kChooserListDefaultIPColumnWidth );
413*48a54d36SAndroid Build Coastguard Worker 
414*48a54d36SAndroid Build Coastguard Worker 	// Set up the other controls.
415*48a54d36SAndroid Build Coastguard Worker 
416*48a54d36SAndroid Build Coastguard Worker 	UpdateInfoDisplay();
417*48a54d36SAndroid Build Coastguard Worker 
418*48a54d36SAndroid Build Coastguard Worker 	// Start browsing for domains.
419*48a54d36SAndroid Build Coastguard Worker 
420*48a54d36SAndroid Build Coastguard Worker 	err = DNSBrowserCreate( 0, BrowserCallBack, this, &mBrowser );
421*48a54d36SAndroid Build Coastguard Worker 	assert( err == kDNSNoErr );
422*48a54d36SAndroid Build Coastguard Worker 
423*48a54d36SAndroid Build Coastguard Worker 	err = DNSBrowserStartDomainSearch( mBrowser, 0 );
424*48a54d36SAndroid Build Coastguard Worker 	assert( err == kDNSNoErr );
425*48a54d36SAndroid Build Coastguard Worker 
426*48a54d36SAndroid Build Coastguard Worker 	return( true );
427*48a54d36SAndroid Build Coastguard Worker }
428*48a54d36SAndroid Build Coastguard Worker 
429*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
430*48a54d36SAndroid Build Coastguard Worker //	OnFileClose
431*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
432*48a54d36SAndroid Build Coastguard Worker 
OnFileClose()433*48a54d36SAndroid Build Coastguard Worker void ChooserDialog::OnFileClose()
434*48a54d36SAndroid Build Coastguard Worker {
435*48a54d36SAndroid Build Coastguard Worker 	OnClose();
436*48a54d36SAndroid Build Coastguard Worker }
437*48a54d36SAndroid Build Coastguard Worker 
438*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
439*48a54d36SAndroid Build Coastguard Worker //	OnActivate
440*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
441*48a54d36SAndroid Build Coastguard Worker 
OnActivate(UINT nState,CWnd * pWndOther,BOOL bMinimized)442*48a54d36SAndroid Build Coastguard Worker void ChooserDialog::OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized )
443*48a54d36SAndroid Build Coastguard Worker {
444*48a54d36SAndroid Build Coastguard Worker 	// Always make the active window the "main" window so modal dialogs work better and the app quits after closing
445*48a54d36SAndroid Build Coastguard Worker 	// the last window.
446*48a54d36SAndroid Build Coastguard Worker 
447*48a54d36SAndroid Build Coastguard Worker 	gApp.m_pMainWnd = this;
448*48a54d36SAndroid Build Coastguard Worker 
449*48a54d36SAndroid Build Coastguard Worker 	CDialog::OnActivate(nState, pWndOther, bMinimized);
450*48a54d36SAndroid Build Coastguard Worker }
451*48a54d36SAndroid Build Coastguard Worker 
452*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
453*48a54d36SAndroid Build Coastguard Worker //	PostNcDestroy
454*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
455*48a54d36SAndroid Build Coastguard Worker 
PostNcDestroy()456*48a54d36SAndroid Build Coastguard Worker void	ChooserDialog::PostNcDestroy()
457*48a54d36SAndroid Build Coastguard Worker {
458*48a54d36SAndroid Build Coastguard Worker 	// Call the base class to do the normal cleanup.
459*48a54d36SAndroid Build Coastguard Worker 
460*48a54d36SAndroid Build Coastguard Worker 	delete this;
461*48a54d36SAndroid Build Coastguard Worker }
462*48a54d36SAndroid Build Coastguard Worker 
463*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
464*48a54d36SAndroid Build Coastguard Worker //	PreTranslateMessage
465*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
466*48a54d36SAndroid Build Coastguard Worker 
PreTranslateMessage(MSG * pMsg)467*48a54d36SAndroid Build Coastguard Worker BOOL	ChooserDialog::PreTranslateMessage(MSG* pMsg)
468*48a54d36SAndroid Build Coastguard Worker {
469*48a54d36SAndroid Build Coastguard Worker 	BOOL		result;
470*48a54d36SAndroid Build Coastguard Worker 
471*48a54d36SAndroid Build Coastguard Worker 	result = false;
472*48a54d36SAndroid Build Coastguard Worker 	assert( mMenuAcceleratorTable );
473*48a54d36SAndroid Build Coastguard Worker 	if( mMenuAcceleratorTable )
474*48a54d36SAndroid Build Coastguard Worker 	{
475*48a54d36SAndroid Build Coastguard Worker 		result = ::TranslateAccelerator( m_hWnd, mMenuAcceleratorTable, pMsg );
476*48a54d36SAndroid Build Coastguard Worker 	}
477*48a54d36SAndroid Build Coastguard Worker 	if( !result )
478*48a54d36SAndroid Build Coastguard Worker 	{
479*48a54d36SAndroid Build Coastguard Worker 		result = CDialog::PreTranslateMessage( pMsg );
480*48a54d36SAndroid Build Coastguard Worker 	}
481*48a54d36SAndroid Build Coastguard Worker 	return( result );
482*48a54d36SAndroid Build Coastguard Worker }
483*48a54d36SAndroid Build Coastguard Worker 
484*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
485*48a54d36SAndroid Build Coastguard Worker //	OnInitMenuPopup
486*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
487*48a54d36SAndroid Build Coastguard Worker 
OnInitMenuPopup(CMenu * pPopupMenu,UINT nIndex,BOOL bSysMenu)488*48a54d36SAndroid Build Coastguard Worker void	ChooserDialog::OnInitMenuPopup( CMenu *pPopupMenu, UINT nIndex, BOOL bSysMenu )
489*48a54d36SAndroid Build Coastguard Worker {
490*48a54d36SAndroid Build Coastguard Worker 	CDialog::OnInitMenuPopup( pPopupMenu, nIndex, bSysMenu );
491*48a54d36SAndroid Build Coastguard Worker 
492*48a54d36SAndroid Build Coastguard Worker 	switch( nIndex )
493*48a54d36SAndroid Build Coastguard Worker 	{
494*48a54d36SAndroid Build Coastguard Worker 		case kChooserMenuIndexFile:
495*48a54d36SAndroid Build Coastguard Worker 			break;
496*48a54d36SAndroid Build Coastguard Worker 
497*48a54d36SAndroid Build Coastguard Worker 		case kChooserMenuIndexHelp:
498*48a54d36SAndroid Build Coastguard Worker 			break;
499*48a54d36SAndroid Build Coastguard Worker 
500*48a54d36SAndroid Build Coastguard Worker 		default:
501*48a54d36SAndroid Build Coastguard Worker 			break;
502*48a54d36SAndroid Build Coastguard Worker 	}
503*48a54d36SAndroid Build Coastguard Worker }
504*48a54d36SAndroid Build Coastguard Worker 
505*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
506*48a54d36SAndroid Build Coastguard Worker //	OnExit
507*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
508*48a54d36SAndroid Build Coastguard Worker 
OnExit()509*48a54d36SAndroid Build Coastguard Worker void ChooserDialog::OnExit()
510*48a54d36SAndroid Build Coastguard Worker {
511*48a54d36SAndroid Build Coastguard Worker 	OnClose();
512*48a54d36SAndroid Build Coastguard Worker }
513*48a54d36SAndroid Build Coastguard Worker 
514*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
515*48a54d36SAndroid Build Coastguard Worker //	OnAbout
516*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
517*48a54d36SAndroid Build Coastguard Worker 
OnAbout()518*48a54d36SAndroid Build Coastguard Worker void	ChooserDialog::OnAbout()
519*48a54d36SAndroid Build Coastguard Worker {
520*48a54d36SAndroid Build Coastguard Worker 	AboutDialog		dialog;
521*48a54d36SAndroid Build Coastguard Worker 
522*48a54d36SAndroid Build Coastguard Worker 	dialog.DoModal();
523*48a54d36SAndroid Build Coastguard Worker }
524*48a54d36SAndroid Build Coastguard Worker 
525*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
526*48a54d36SAndroid Build Coastguard Worker //	OnSysCommand
527*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
528*48a54d36SAndroid Build Coastguard Worker 
OnSysCommand(UINT inID,LPARAM inParam)529*48a54d36SAndroid Build Coastguard Worker void	ChooserDialog::OnSysCommand( UINT inID, LPARAM inParam )
530*48a54d36SAndroid Build Coastguard Worker {
531*48a54d36SAndroid Build Coastguard Worker 	CDialog::OnSysCommand( inID, inParam );
532*48a54d36SAndroid Build Coastguard Worker }
533*48a54d36SAndroid Build Coastguard Worker 
534*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
535*48a54d36SAndroid Build Coastguard Worker //	OnClose
536*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
537*48a54d36SAndroid Build Coastguard Worker 
OnClose()538*48a54d36SAndroid Build Coastguard Worker void ChooserDialog::OnClose()
539*48a54d36SAndroid Build Coastguard Worker {
540*48a54d36SAndroid Build Coastguard Worker 	StopBrowsing();
541*48a54d36SAndroid Build Coastguard Worker 
542*48a54d36SAndroid Build Coastguard Worker 	gApp.m_pMainWnd = this;
543*48a54d36SAndroid Build Coastguard Worker 	DestroyWindow();
544*48a54d36SAndroid Build Coastguard Worker }
545*48a54d36SAndroid Build Coastguard Worker 
546*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
547*48a54d36SAndroid Build Coastguard Worker //	OnNcDestroy
548*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
549*48a54d36SAndroid Build Coastguard Worker 
OnNcDestroy()550*48a54d36SAndroid Build Coastguard Worker void ChooserDialog::OnNcDestroy()
551*48a54d36SAndroid Build Coastguard Worker {
552*48a54d36SAndroid Build Coastguard Worker 	gApp.m_pMainWnd = this;
553*48a54d36SAndroid Build Coastguard Worker 
554*48a54d36SAndroid Build Coastguard Worker 	CDialog::OnNcDestroy();
555*48a54d36SAndroid Build Coastguard Worker }
556*48a54d36SAndroid Build Coastguard Worker 
557*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
558*48a54d36SAndroid Build Coastguard Worker //	OnDomainListChanged
559*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
560*48a54d36SAndroid Build Coastguard Worker 
OnDomainListChanged(NMHDR * pNMHDR,LRESULT * pResult)561*48a54d36SAndroid Build Coastguard Worker void	ChooserDialog::OnDomainListChanged( NMHDR *pNMHDR, LRESULT *pResult )
562*48a54d36SAndroid Build Coastguard Worker {
563*48a54d36SAndroid Build Coastguard Worker 	UNUSED_ALWAYS( pNMHDR );
564*48a54d36SAndroid Build Coastguard Worker 
565*48a54d36SAndroid Build Coastguard Worker 	// Domain list changes have similar effects to service list changes so reuse that code path by calling it here.
566*48a54d36SAndroid Build Coastguard Worker 
567*48a54d36SAndroid Build Coastguard Worker 	OnServiceListChanged( NULL, NULL );
568*48a54d36SAndroid Build Coastguard Worker 
569*48a54d36SAndroid Build Coastguard Worker 	*pResult = 0;
570*48a54d36SAndroid Build Coastguard Worker }
571*48a54d36SAndroid Build Coastguard Worker 
572*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
573*48a54d36SAndroid Build Coastguard Worker //	OnServiceListChanged
574*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
575*48a54d36SAndroid Build Coastguard Worker 
OnServiceListChanged(NMHDR * pNMHDR,LRESULT * pResult)576*48a54d36SAndroid Build Coastguard Worker void	ChooserDialog::OnServiceListChanged( NMHDR *pNMHDR, LRESULT *pResult )
577*48a54d36SAndroid Build Coastguard Worker {
578*48a54d36SAndroid Build Coastguard Worker 	int				selectedType;
579*48a54d36SAndroid Build Coastguard Worker 	int				selectedDomain;
580*48a54d36SAndroid Build Coastguard Worker 
581*48a54d36SAndroid Build Coastguard Worker 	UNUSED_ALWAYS( pNMHDR );
582*48a54d36SAndroid Build Coastguard Worker 
583*48a54d36SAndroid Build Coastguard Worker 	// Stop any existing service search.
584*48a54d36SAndroid Build Coastguard Worker 
585*48a54d36SAndroid Build Coastguard Worker 	StopBrowsing();
586*48a54d36SAndroid Build Coastguard Worker 
587*48a54d36SAndroid Build Coastguard Worker 	// If a domain and service type are selected, start searching for the service type on the domain.
588*48a54d36SAndroid Build Coastguard Worker 
589*48a54d36SAndroid Build Coastguard Worker 	selectedType 	= mServiceList.GetNextItem( -1, LVNI_SELECTED );
590*48a54d36SAndroid Build Coastguard Worker 	selectedDomain 	= mDomainList.GetNextItem( -1, LVNI_SELECTED );
591*48a54d36SAndroid Build Coastguard Worker 
592*48a54d36SAndroid Build Coastguard Worker 	if( ( selectedType >= 0 ) && ( selectedDomain >= 0 ) )
593*48a54d36SAndroid Build Coastguard Worker 	{
594*48a54d36SAndroid Build Coastguard Worker 		CString				s;
595*48a54d36SAndroid Build Coastguard Worker 		std::string			utf8;
596*48a54d36SAndroid Build Coastguard Worker 		const char *		type;
597*48a54d36SAndroid Build Coastguard Worker 
598*48a54d36SAndroid Build Coastguard Worker 		s = mDomainList.GetItemText( selectedDomain, 0 );
599*48a54d36SAndroid Build Coastguard Worker 		StringObjectToUTF8String( s, utf8 );
600*48a54d36SAndroid Build Coastguard Worker 		type = mServiceTypes[ selectedType ].serviceType.c_str();
601*48a54d36SAndroid Build Coastguard Worker 		if( *type != '\0' )
602*48a54d36SAndroid Build Coastguard Worker 		{
603*48a54d36SAndroid Build Coastguard Worker 			StartBrowsing( type, utf8.c_str() );
604*48a54d36SAndroid Build Coastguard Worker 		}
605*48a54d36SAndroid Build Coastguard Worker 	}
606*48a54d36SAndroid Build Coastguard Worker 
607*48a54d36SAndroid Build Coastguard Worker 	if( pResult )
608*48a54d36SAndroid Build Coastguard Worker 	{
609*48a54d36SAndroid Build Coastguard Worker 		*pResult = 0;
610*48a54d36SAndroid Build Coastguard Worker 	}
611*48a54d36SAndroid Build Coastguard Worker }
612*48a54d36SAndroid Build Coastguard Worker 
613*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
614*48a54d36SAndroid Build Coastguard Worker //	OnChooserListChanged
615*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
616*48a54d36SAndroid Build Coastguard Worker 
OnChooserListChanged(NMHDR * pNMHDR,LRESULT * pResult)617*48a54d36SAndroid Build Coastguard Worker void	ChooserDialog::OnChooserListChanged( NMHDR *pNMHDR, LRESULT *pResult )
618*48a54d36SAndroid Build Coastguard Worker {
619*48a54d36SAndroid Build Coastguard Worker 	UNUSED_ALWAYS( pNMHDR );
620*48a54d36SAndroid Build Coastguard Worker 
621*48a54d36SAndroid Build Coastguard Worker 	UpdateInfoDisplay();
622*48a54d36SAndroid Build Coastguard Worker 	*pResult = 0;
623*48a54d36SAndroid Build Coastguard Worker }
624*48a54d36SAndroid Build Coastguard Worker 
625*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
626*48a54d36SAndroid Build Coastguard Worker //	OnChooserListDoubleClick
627*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
628*48a54d36SAndroid Build Coastguard Worker 
OnChooserListDoubleClick(NMHDR * pNMHDR,LRESULT * pResult)629*48a54d36SAndroid Build Coastguard Worker void	ChooserDialog::OnChooserListDoubleClick( NMHDR *pNMHDR, LRESULT *pResult )
630*48a54d36SAndroid Build Coastguard Worker {
631*48a54d36SAndroid Build Coastguard Worker 	int		selectedItem;
632*48a54d36SAndroid Build Coastguard Worker 
633*48a54d36SAndroid Build Coastguard Worker 	UNUSED_ALWAYS( pNMHDR );
634*48a54d36SAndroid Build Coastguard Worker 
635*48a54d36SAndroid Build Coastguard Worker 	// Display the service instance if it is selected. Otherwise, clear all the info.
636*48a54d36SAndroid Build Coastguard Worker 
637*48a54d36SAndroid Build Coastguard Worker 	selectedItem = mChooserList.GetNextItem( -1, LVNI_SELECTED );
638*48a54d36SAndroid Build Coastguard Worker 	if( selectedItem >= 0 )
639*48a54d36SAndroid Build Coastguard Worker 	{
640*48a54d36SAndroid Build Coastguard Worker 		ServiceInstanceInfo *			p;
641*48a54d36SAndroid Build Coastguard Worker 		CString							url;
642*48a54d36SAndroid Build Coastguard Worker 		const KnownServiceEntry *		service;
643*48a54d36SAndroid Build Coastguard Worker 
644*48a54d36SAndroid Build Coastguard Worker 		assert( selectedItem < (int) mServiceInstances.size() );
645*48a54d36SAndroid Build Coastguard Worker 		p = &mServiceInstances[ selectedItem ];
646*48a54d36SAndroid Build Coastguard Worker 
647*48a54d36SAndroid Build Coastguard Worker 		// Search for a known service type entry that matches.
648*48a54d36SAndroid Build Coastguard Worker 
649*48a54d36SAndroid Build Coastguard Worker 		for( service = kKnownServiceTable; service->serviceType; ++service )
650*48a54d36SAndroid Build Coastguard Worker 		{
651*48a54d36SAndroid Build Coastguard Worker 			if( p->type == service->serviceType )
652*48a54d36SAndroid Build Coastguard Worker 			{
653*48a54d36SAndroid Build Coastguard Worker 				break;
654*48a54d36SAndroid Build Coastguard Worker 			}
655*48a54d36SAndroid Build Coastguard Worker 		}
656*48a54d36SAndroid Build Coastguard Worker 		if( service->serviceType )
657*48a54d36SAndroid Build Coastguard Worker 		{
658*48a54d36SAndroid Build Coastguard Worker 			const char *		text;
659*48a54d36SAndroid Build Coastguard Worker 
660*48a54d36SAndroid Build Coastguard Worker 			// Create a URL representing the service instance.
661*48a54d36SAndroid Build Coastguard Worker 
662*48a54d36SAndroid Build Coastguard Worker 			if( strcmp( service->serviceType, "_smb._tcp." ) == 0 )
663*48a54d36SAndroid Build Coastguard Worker 			{
664*48a54d36SAndroid Build Coastguard Worker 				// Special case for SMB (no port number).
665*48a54d36SAndroid Build Coastguard Worker 
666*48a54d36SAndroid Build Coastguard Worker 				url.Format( TEXT( "%s%s/" ), service->urlScheme, (const char *) p->ip.c_str() );
667*48a54d36SAndroid Build Coastguard Worker 			}
668*48a54d36SAndroid Build Coastguard Worker 			else if( strcmp( service->serviceType, "_ftp._tcp." ) == 0 )
669*48a54d36SAndroid Build Coastguard Worker 			{
670*48a54d36SAndroid Build Coastguard Worker 				// Special case for FTP to get login info.
671*48a54d36SAndroid Build Coastguard Worker 
672*48a54d36SAndroid Build Coastguard Worker 				LoginDialog		dialog;
673*48a54d36SAndroid Build Coastguard Worker 				CString			username;
674*48a54d36SAndroid Build Coastguard Worker 				CString			password;
675*48a54d36SAndroid Build Coastguard Worker 
676*48a54d36SAndroid Build Coastguard Worker 				if( !dialog.GetLogin( username, password ) )
677*48a54d36SAndroid Build Coastguard Worker 				{
678*48a54d36SAndroid Build Coastguard Worker 					goto exit;
679*48a54d36SAndroid Build Coastguard Worker 				}
680*48a54d36SAndroid Build Coastguard Worker 
681*48a54d36SAndroid Build Coastguard Worker 				// Build URL in the following format:
682*48a54d36SAndroid Build Coastguard Worker 				//
683*48a54d36SAndroid Build Coastguard Worker 				// ftp://[username[:password]@]<ip>
684*48a54d36SAndroid Build Coastguard Worker 
685*48a54d36SAndroid Build Coastguard Worker 				url += service->urlScheme;
686*48a54d36SAndroid Build Coastguard Worker 				if( username.GetLength() > 0 )
687*48a54d36SAndroid Build Coastguard Worker 				{
688*48a54d36SAndroid Build Coastguard Worker 					url += username;
689*48a54d36SAndroid Build Coastguard Worker 					if( password.GetLength() > 0 )
690*48a54d36SAndroid Build Coastguard Worker 					{
691*48a54d36SAndroid Build Coastguard Worker 						url += ':';
692*48a54d36SAndroid Build Coastguard Worker 						url += password;
693*48a54d36SAndroid Build Coastguard Worker 					}
694*48a54d36SAndroid Build Coastguard Worker 					url += '@';
695*48a54d36SAndroid Build Coastguard Worker 				}
696*48a54d36SAndroid Build Coastguard Worker 				url += p->ip.c_str();
697*48a54d36SAndroid Build Coastguard Worker 			}
698*48a54d36SAndroid Build Coastguard Worker 			else if( strcmp( service->serviceType, "_http._tcp." ) == 0 )
699*48a54d36SAndroid Build Coastguard Worker 			{
700*48a54d36SAndroid Build Coastguard Worker 				// Special case for HTTP to exclude "path=" if present.
701*48a54d36SAndroid Build Coastguard Worker 
702*48a54d36SAndroid Build Coastguard Worker 				text = service->useText ? p->text.c_str() : "";
703*48a54d36SAndroid Build Coastguard Worker 				if( strncmp( text, "path=", 5 ) == 0 )
704*48a54d36SAndroid Build Coastguard Worker 				{
705*48a54d36SAndroid Build Coastguard Worker 					text += 5;
706*48a54d36SAndroid Build Coastguard Worker 				}
707*48a54d36SAndroid Build Coastguard Worker 				if( *text != '/' )
708*48a54d36SAndroid Build Coastguard Worker 				{
709*48a54d36SAndroid Build Coastguard Worker 					url.Format( TEXT( "%s%s/%s" ), service->urlScheme, (const char *) p->ip.c_str(), text );
710*48a54d36SAndroid Build Coastguard Worker 				}
711*48a54d36SAndroid Build Coastguard Worker 				else
712*48a54d36SAndroid Build Coastguard Worker 				{
713*48a54d36SAndroid Build Coastguard Worker 					url.Format( TEXT( "%s%s%s" ), service->urlScheme, (const char *) p->ip.c_str(), text );
714*48a54d36SAndroid Build Coastguard Worker 				}
715*48a54d36SAndroid Build Coastguard Worker 			}
716*48a54d36SAndroid Build Coastguard Worker 			else
717*48a54d36SAndroid Build Coastguard Worker 			{
718*48a54d36SAndroid Build Coastguard Worker 				text = service->useText ? p->text.c_str() : "";
719*48a54d36SAndroid Build Coastguard Worker 				url.Format( TEXT( "%s%s/%s" ), service->urlScheme, (const char *) p->ip.c_str(), text );
720*48a54d36SAndroid Build Coastguard Worker 			}
721*48a54d36SAndroid Build Coastguard Worker 
722*48a54d36SAndroid Build Coastguard Worker 			// Let the system open the URL in the correct app.
723*48a54d36SAndroid Build Coastguard Worker 
724*48a54d36SAndroid Build Coastguard Worker 			{
725*48a54d36SAndroid Build Coastguard Worker 				CWaitCursor		waitCursor;
726*48a54d36SAndroid Build Coastguard Worker 
727*48a54d36SAndroid Build Coastguard Worker 				ShellExecute( NULL, TEXT( "open" ), url, TEXT( "" ), TEXT( "c:\\" ), SW_SHOWNORMAL );
728*48a54d36SAndroid Build Coastguard Worker 			}
729*48a54d36SAndroid Build Coastguard Worker 		}
730*48a54d36SAndroid Build Coastguard Worker 	}
731*48a54d36SAndroid Build Coastguard Worker 
732*48a54d36SAndroid Build Coastguard Worker exit:
733*48a54d36SAndroid Build Coastguard Worker 	*pResult = 0;
734*48a54d36SAndroid Build Coastguard Worker }
735*48a54d36SAndroid Build Coastguard Worker 
736*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
737*48a54d36SAndroid Build Coastguard Worker //	OnCancel
738*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
739*48a54d36SAndroid Build Coastguard Worker 
OnCancel()740*48a54d36SAndroid Build Coastguard Worker void ChooserDialog::OnCancel()
741*48a54d36SAndroid Build Coastguard Worker {
742*48a54d36SAndroid Build Coastguard Worker 	// Do nothing.
743*48a54d36SAndroid Build Coastguard Worker }
744*48a54d36SAndroid Build Coastguard Worker 
745*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
746*48a54d36SAndroid Build Coastguard Worker //	PopulateServicesList
747*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
748*48a54d36SAndroid Build Coastguard Worker 
PopulateServicesList(void)749*48a54d36SAndroid Build Coastguard Worker void	ChooserDialog::PopulateServicesList( void )
750*48a54d36SAndroid Build Coastguard Worker {
751*48a54d36SAndroid Build Coastguard Worker 	ServiceTypeVector::iterator		i;
752*48a54d36SAndroid Build Coastguard Worker 	CString							type;
753*48a54d36SAndroid Build Coastguard Worker 	CString							desc;
754*48a54d36SAndroid Build Coastguard Worker 	std::string						tmp;
755*48a54d36SAndroid Build Coastguard Worker 
756*48a54d36SAndroid Build Coastguard Worker 	// Add a fixed list of known services.
757*48a54d36SAndroid Build Coastguard Worker 
758*48a54d36SAndroid Build Coastguard Worker 	if( mServiceTypes.empty() )
759*48a54d36SAndroid Build Coastguard Worker 	{
760*48a54d36SAndroid Build Coastguard Worker 		const KnownServiceEntry *		service;
761*48a54d36SAndroid Build Coastguard Worker 
762*48a54d36SAndroid Build Coastguard Worker 		for( service = kKnownServiceTable; service->serviceType; ++service )
763*48a54d36SAndroid Build Coastguard Worker 		{
764*48a54d36SAndroid Build Coastguard Worker 			ServiceTypeInfo		info;
765*48a54d36SAndroid Build Coastguard Worker 
766*48a54d36SAndroid Build Coastguard Worker 			info.serviceType 	= service->serviceType;
767*48a54d36SAndroid Build Coastguard Worker 			info.description 	= service->description;
768*48a54d36SAndroid Build Coastguard Worker 			info.urlScheme 		= service->urlScheme;
769*48a54d36SAndroid Build Coastguard Worker 			mServiceTypes.push_back( info );
770*48a54d36SAndroid Build Coastguard Worker 		}
771*48a54d36SAndroid Build Coastguard Worker 	}
772*48a54d36SAndroid Build Coastguard Worker 
773*48a54d36SAndroid Build Coastguard Worker 	// Add each service to the list.
774*48a54d36SAndroid Build Coastguard Worker 
775*48a54d36SAndroid Build Coastguard Worker 	for( i = mServiceTypes.begin(); i != mServiceTypes.end(); ++i )
776*48a54d36SAndroid Build Coastguard Worker 	{
777*48a54d36SAndroid Build Coastguard Worker 		const char *		p;
778*48a54d36SAndroid Build Coastguard Worker 		const char *		q;
779*48a54d36SAndroid Build Coastguard Worker 
780*48a54d36SAndroid Build Coastguard Worker 		p  = ( *i ).serviceType.c_str();
781*48a54d36SAndroid Build Coastguard Worker 		if( *p == '_' ) ++p;							// Skip leading '_'.
782*48a54d36SAndroid Build Coastguard Worker 		q  = strchr( p, '.' );							// Find first '.'.
783*48a54d36SAndroid Build Coastguard Worker 		if( q )	tmp.assign( p, (size_t)( q - p ) );		// Use only up to the first '.'.
784*48a54d36SAndroid Build Coastguard Worker 		else	tmp.assign( p );						// No '.' so use the entire string.
785*48a54d36SAndroid Build Coastguard Worker 		UTF8StringToStringObject( tmp.c_str(), type );
786*48a54d36SAndroid Build Coastguard Worker 		UTF8StringToStringObject( ( *i ).description.c_str(), desc );
787*48a54d36SAndroid Build Coastguard Worker 
788*48a54d36SAndroid Build Coastguard Worker 		int		n;
789*48a54d36SAndroid Build Coastguard Worker 
790*48a54d36SAndroid Build Coastguard Worker 		n = mServiceList.GetItemCount();
791*48a54d36SAndroid Build Coastguard Worker 		mServiceList.InsertItem( n, type );
792*48a54d36SAndroid Build Coastguard Worker 		mServiceList.SetItemText( n, 1, desc );
793*48a54d36SAndroid Build Coastguard Worker 	}
794*48a54d36SAndroid Build Coastguard Worker 
795*48a54d36SAndroid Build Coastguard Worker 	// Select the first service type by default.
796*48a54d36SAndroid Build Coastguard Worker 
797*48a54d36SAndroid Build Coastguard Worker 	if( !mServiceTypes.empty() )
798*48a54d36SAndroid Build Coastguard Worker 	{
799*48a54d36SAndroid Build Coastguard Worker 		mServiceList.SetItemState( 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
800*48a54d36SAndroid Build Coastguard Worker 	}
801*48a54d36SAndroid Build Coastguard Worker }
802*48a54d36SAndroid Build Coastguard Worker 
803*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
804*48a54d36SAndroid Build Coastguard Worker //	UpdateInfoDisplay
805*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
806*48a54d36SAndroid Build Coastguard Worker 
UpdateInfoDisplay(void)807*48a54d36SAndroid Build Coastguard Worker void	ChooserDialog::UpdateInfoDisplay( void )
808*48a54d36SAndroid Build Coastguard Worker {
809*48a54d36SAndroid Build Coastguard Worker 	int							selectedItem;
810*48a54d36SAndroid Build Coastguard Worker 	std::string					name;
811*48a54d36SAndroid Build Coastguard Worker 	CString						s;
812*48a54d36SAndroid Build Coastguard Worker 	std::string					ip;
813*48a54d36SAndroid Build Coastguard Worker 	std::string					ifIP;
814*48a54d36SAndroid Build Coastguard Worker 	std::string					text;
815*48a54d36SAndroid Build Coastguard Worker 	std::string					textNewLines;
816*48a54d36SAndroid Build Coastguard Worker 	std::string					hostName;
817*48a54d36SAndroid Build Coastguard Worker 	CWnd *						item;
818*48a54d36SAndroid Build Coastguard Worker 	std::string::iterator		i;
819*48a54d36SAndroid Build Coastguard Worker 
820*48a54d36SAndroid Build Coastguard Worker 	// Display the service instance if it is selected. Otherwise, clear all the info.
821*48a54d36SAndroid Build Coastguard Worker 
822*48a54d36SAndroid Build Coastguard Worker 	selectedItem = mChooserList.GetNextItem( -1, LVNI_SELECTED );
823*48a54d36SAndroid Build Coastguard Worker 	if( selectedItem >= 0 )
824*48a54d36SAndroid Build Coastguard Worker 	{
825*48a54d36SAndroid Build Coastguard Worker 		ServiceInstanceInfo *		p;
826*48a54d36SAndroid Build Coastguard Worker 
827*48a54d36SAndroid Build Coastguard Worker 		assert( selectedItem < (int) mServiceInstances.size() );
828*48a54d36SAndroid Build Coastguard Worker 		p = &mServiceInstances[ selectedItem ];
829*48a54d36SAndroid Build Coastguard Worker 
830*48a54d36SAndroid Build Coastguard Worker 		name 		= p->name;
831*48a54d36SAndroid Build Coastguard Worker 		ip 			= p->ip;
832*48a54d36SAndroid Build Coastguard Worker 		ifIP 		= p->ifIP;
833*48a54d36SAndroid Build Coastguard Worker 		text 		= p->text;
834*48a54d36SAndroid Build Coastguard Worker 		hostName	= p->hostName;
835*48a54d36SAndroid Build Coastguard Worker 
836*48a54d36SAndroid Build Coastguard Worker 		// Sync up the list items with the actual data (IP address may change).
837*48a54d36SAndroid Build Coastguard Worker 
838*48a54d36SAndroid Build Coastguard Worker 		UTF8StringToStringObject( ip.c_str(), s );
839*48a54d36SAndroid Build Coastguard Worker 		mChooserList.SetItemText( selectedItem, 1, s );
840*48a54d36SAndroid Build Coastguard Worker 	}
841*48a54d36SAndroid Build Coastguard Worker 
842*48a54d36SAndroid Build Coastguard Worker 	// Name
843*48a54d36SAndroid Build Coastguard Worker 
844*48a54d36SAndroid Build Coastguard Worker 	item = (CWnd *) this->GetDlgItem( IDC_INFO_NAME_TEXT );
845*48a54d36SAndroid Build Coastguard Worker 	assert( item );
846*48a54d36SAndroid Build Coastguard Worker 	UTF8StringToStringObject( name.c_str(), s );
847*48a54d36SAndroid Build Coastguard Worker 	item->SetWindowText( s );
848*48a54d36SAndroid Build Coastguard Worker 
849*48a54d36SAndroid Build Coastguard Worker 	// IP
850*48a54d36SAndroid Build Coastguard Worker 
851*48a54d36SAndroid Build Coastguard Worker 	item = (CWnd *) this->GetDlgItem( IDC_INFO_IP_TEXT );
852*48a54d36SAndroid Build Coastguard Worker 	assert( item );
853*48a54d36SAndroid Build Coastguard Worker 	UTF8StringToStringObject( ip.c_str(), s );
854*48a54d36SAndroid Build Coastguard Worker 	item->SetWindowText( s );
855*48a54d36SAndroid Build Coastguard Worker 
856*48a54d36SAndroid Build Coastguard Worker 	// Interface
857*48a54d36SAndroid Build Coastguard Worker 
858*48a54d36SAndroid Build Coastguard Worker 	item = (CWnd *) this->GetDlgItem( IDC_INFO_INTERFACE_TEXT );
859*48a54d36SAndroid Build Coastguard Worker 	assert( item );
860*48a54d36SAndroid Build Coastguard Worker 	UTF8StringToStringObject( ifIP.c_str(), s );
861*48a54d36SAndroid Build Coastguard Worker 	item->SetWindowText( s );
862*48a54d36SAndroid Build Coastguard Worker 
863*48a54d36SAndroid Build Coastguard Worker 
864*48a54d36SAndroid Build Coastguard Worker 	item = (CWnd *) this->GetDlgItem( IDC_INFO_HOST_NAME_TEXT );
865*48a54d36SAndroid Build Coastguard Worker 	assert( item );
866*48a54d36SAndroid Build Coastguard Worker 	UTF8StringToStringObject( hostName.c_str(), s );
867*48a54d36SAndroid Build Coastguard Worker 	item->SetWindowText( s );
868*48a54d36SAndroid Build Coastguard Worker 
869*48a54d36SAndroid Build Coastguard Worker 	// Text
870*48a54d36SAndroid Build Coastguard Worker 
871*48a54d36SAndroid Build Coastguard Worker 	item = (CWnd *) this->GetDlgItem( IDC_INFO_TEXT_TEXT );
872*48a54d36SAndroid Build Coastguard Worker 	assert( item );
873*48a54d36SAndroid Build Coastguard Worker 	for( i = text.begin(); i != text.end(); ++i )
874*48a54d36SAndroid Build Coastguard Worker 	{
875*48a54d36SAndroid Build Coastguard Worker 		if( *i == '\1' )
876*48a54d36SAndroid Build Coastguard Worker 		{
877*48a54d36SAndroid Build Coastguard Worker 			textNewLines += "\r\n";
878*48a54d36SAndroid Build Coastguard Worker 		}
879*48a54d36SAndroid Build Coastguard Worker 		else
880*48a54d36SAndroid Build Coastguard Worker 		{
881*48a54d36SAndroid Build Coastguard Worker 			textNewLines += *i;
882*48a54d36SAndroid Build Coastguard Worker 		}
883*48a54d36SAndroid Build Coastguard Worker 	}
884*48a54d36SAndroid Build Coastguard Worker 	UTF8StringToStringObject( textNewLines.c_str(), s );
885*48a54d36SAndroid Build Coastguard Worker 	item->SetWindowText( s );
886*48a54d36SAndroid Build Coastguard Worker }
887*48a54d36SAndroid Build Coastguard Worker 
888*48a54d36SAndroid Build Coastguard Worker #if 0
889*48a54d36SAndroid Build Coastguard Worker #pragma mark -
890*48a54d36SAndroid Build Coastguard Worker #endif
891*48a54d36SAndroid Build Coastguard Worker 
892*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
893*48a54d36SAndroid Build Coastguard Worker //	OnDomainAdd
894*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
895*48a54d36SAndroid Build Coastguard Worker 
OnDomainAdd(WPARAM inWParam,LPARAM inLParam)896*48a54d36SAndroid Build Coastguard Worker LONG	ChooserDialog::OnDomainAdd( WPARAM inWParam, LPARAM inLParam )
897*48a54d36SAndroid Build Coastguard Worker {
898*48a54d36SAndroid Build Coastguard Worker 	DomainEventInfo *						p;
899*48a54d36SAndroid Build Coastguard Worker 	std::auto_ptr < DomainEventInfo >		pAutoPtr;
900*48a54d36SAndroid Build Coastguard Worker 	int										n;
901*48a54d36SAndroid Build Coastguard Worker 	int										i;
902*48a54d36SAndroid Build Coastguard Worker 	CString									domain;
903*48a54d36SAndroid Build Coastguard Worker 	CString									s;
904*48a54d36SAndroid Build Coastguard Worker 	bool									found;
905*48a54d36SAndroid Build Coastguard Worker 
906*48a54d36SAndroid Build Coastguard Worker 	UNUSED_ALWAYS( inWParam );
907*48a54d36SAndroid Build Coastguard Worker 
908*48a54d36SAndroid Build Coastguard Worker 	assert( inLParam );
909*48a54d36SAndroid Build Coastguard Worker 	p = reinterpret_cast <DomainEventInfo *> ( inLParam );
910*48a54d36SAndroid Build Coastguard Worker 	pAutoPtr.reset( p );
911*48a54d36SAndroid Build Coastguard Worker 
912*48a54d36SAndroid Build Coastguard Worker 	// Search to see if we already know about this domain. If not, add it to the list.
913*48a54d36SAndroid Build Coastguard Worker 
914*48a54d36SAndroid Build Coastguard Worker 	found = false;
915*48a54d36SAndroid Build Coastguard Worker 	domain = p->domain;
916*48a54d36SAndroid Build Coastguard Worker 	n = mDomainList.GetItemCount();
917*48a54d36SAndroid Build Coastguard Worker 	for( i = 0; i < n; ++i )
918*48a54d36SAndroid Build Coastguard Worker 	{
919*48a54d36SAndroid Build Coastguard Worker 		s = mDomainList.GetItemText( i, 0 );
920*48a54d36SAndroid Build Coastguard Worker 		if( s == domain )
921*48a54d36SAndroid Build Coastguard Worker 		{
922*48a54d36SAndroid Build Coastguard Worker 			found = true;
923*48a54d36SAndroid Build Coastguard Worker 			break;
924*48a54d36SAndroid Build Coastguard Worker 		}
925*48a54d36SAndroid Build Coastguard Worker 	}
926*48a54d36SAndroid Build Coastguard Worker 	if( !found )
927*48a54d36SAndroid Build Coastguard Worker 	{
928*48a54d36SAndroid Build Coastguard Worker 		int		selectedItem;
929*48a54d36SAndroid Build Coastguard Worker 
930*48a54d36SAndroid Build Coastguard Worker 		mDomainList.InsertItem( n, domain );
931*48a54d36SAndroid Build Coastguard Worker 
932*48a54d36SAndroid Build Coastguard Worker 		// If no domains are selected and the domain being added is a default domain, select it.
933*48a54d36SAndroid Build Coastguard Worker 
934*48a54d36SAndroid Build Coastguard Worker 		selectedItem = mDomainList.GetNextItem( -1, LVNI_SELECTED );
935*48a54d36SAndroid Build Coastguard Worker 		if( ( selectedItem < 0 ) && ( p->eventType == kDNSBrowserEventTypeAddDefaultDomain ) )
936*48a54d36SAndroid Build Coastguard Worker 		{
937*48a54d36SAndroid Build Coastguard Worker 			mDomainList.SetItemState( n, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
938*48a54d36SAndroid Build Coastguard Worker 		}
939*48a54d36SAndroid Build Coastguard Worker 	}
940*48a54d36SAndroid Build Coastguard Worker 	return( 0 );
941*48a54d36SAndroid Build Coastguard Worker }
942*48a54d36SAndroid Build Coastguard Worker 
943*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
944*48a54d36SAndroid Build Coastguard Worker //	OnDomainRemove
945*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
946*48a54d36SAndroid Build Coastguard Worker 
OnDomainRemove(WPARAM inWParam,LPARAM inLParam)947*48a54d36SAndroid Build Coastguard Worker LONG	ChooserDialog::OnDomainRemove( WPARAM inWParam, LPARAM inLParam )
948*48a54d36SAndroid Build Coastguard Worker {
949*48a54d36SAndroid Build Coastguard Worker 	DomainEventInfo *						p;
950*48a54d36SAndroid Build Coastguard Worker 	std::auto_ptr < DomainEventInfo >		pAutoPtr;
951*48a54d36SAndroid Build Coastguard Worker 	int										n;
952*48a54d36SAndroid Build Coastguard Worker 	int										i;
953*48a54d36SAndroid Build Coastguard Worker 	CString									domain;
954*48a54d36SAndroid Build Coastguard Worker 	CString									s;
955*48a54d36SAndroid Build Coastguard Worker 	bool									found;
956*48a54d36SAndroid Build Coastguard Worker 
957*48a54d36SAndroid Build Coastguard Worker 	UNUSED_ALWAYS( inWParam );
958*48a54d36SAndroid Build Coastguard Worker 
959*48a54d36SAndroid Build Coastguard Worker 	assert( inLParam );
960*48a54d36SAndroid Build Coastguard Worker 	p = reinterpret_cast <DomainEventInfo *> ( inLParam );
961*48a54d36SAndroid Build Coastguard Worker 	pAutoPtr.reset( p );
962*48a54d36SAndroid Build Coastguard Worker 
963*48a54d36SAndroid Build Coastguard Worker 	// Search to see if we know about this domain. If so, remove it from the list.
964*48a54d36SAndroid Build Coastguard Worker 
965*48a54d36SAndroid Build Coastguard Worker 	found = false;
966*48a54d36SAndroid Build Coastguard Worker 	domain = p->domain;
967*48a54d36SAndroid Build Coastguard Worker 	n = mDomainList.GetItemCount();
968*48a54d36SAndroid Build Coastguard Worker 	for( i = 0; i < n; ++i )
969*48a54d36SAndroid Build Coastguard Worker 	{
970*48a54d36SAndroid Build Coastguard Worker 		s = mDomainList.GetItemText( i, 0 );
971*48a54d36SAndroid Build Coastguard Worker 		if( s == domain )
972*48a54d36SAndroid Build Coastguard Worker 		{
973*48a54d36SAndroid Build Coastguard Worker 			found = true;
974*48a54d36SAndroid Build Coastguard Worker 			break;
975*48a54d36SAndroid Build Coastguard Worker 		}
976*48a54d36SAndroid Build Coastguard Worker 	}
977*48a54d36SAndroid Build Coastguard Worker 	if( found )
978*48a54d36SAndroid Build Coastguard Worker 	{
979*48a54d36SAndroid Build Coastguard Worker 		mDomainList.DeleteItem( i );
980*48a54d36SAndroid Build Coastguard Worker 	}
981*48a54d36SAndroid Build Coastguard Worker 	return( 0 );
982*48a54d36SAndroid Build Coastguard Worker }
983*48a54d36SAndroid Build Coastguard Worker 
984*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
985*48a54d36SAndroid Build Coastguard Worker //	OnServiceAdd
986*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
987*48a54d36SAndroid Build Coastguard Worker 
OnServiceAdd(WPARAM inWParam,LPARAM inLParam)988*48a54d36SAndroid Build Coastguard Worker LONG	ChooserDialog::OnServiceAdd( WPARAM inWParam, LPARAM inLParam )
989*48a54d36SAndroid Build Coastguard Worker {
990*48a54d36SAndroid Build Coastguard Worker 	ServiceEventInfo *						p;
991*48a54d36SAndroid Build Coastguard Worker 	std::auto_ptr < ServiceEventInfo >		pAutoPtr;
992*48a54d36SAndroid Build Coastguard Worker 
993*48a54d36SAndroid Build Coastguard Worker 	UNUSED_ALWAYS( inWParam );
994*48a54d36SAndroid Build Coastguard Worker 
995*48a54d36SAndroid Build Coastguard Worker 	assert( inLParam );
996*48a54d36SAndroid Build Coastguard Worker 	p = reinterpret_cast <ServiceEventInfo *> ( inLParam );
997*48a54d36SAndroid Build Coastguard Worker 	pAutoPtr.reset( p );
998*48a54d36SAndroid Build Coastguard Worker 
999*48a54d36SAndroid Build Coastguard Worker 	return( 0 );
1000*48a54d36SAndroid Build Coastguard Worker }
1001*48a54d36SAndroid Build Coastguard Worker 
1002*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1003*48a54d36SAndroid Build Coastguard Worker //	OnServiceRemove
1004*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1005*48a54d36SAndroid Build Coastguard Worker 
OnServiceRemove(WPARAM inWParam,LPARAM inLParam)1006*48a54d36SAndroid Build Coastguard Worker LONG	ChooserDialog::OnServiceRemove( WPARAM inWParam, LPARAM inLParam )
1007*48a54d36SAndroid Build Coastguard Worker {
1008*48a54d36SAndroid Build Coastguard Worker 	ServiceEventInfo *						p;
1009*48a54d36SAndroid Build Coastguard Worker 	std::auto_ptr < ServiceEventInfo >		pAutoPtr;
1010*48a54d36SAndroid Build Coastguard Worker 	bool									found;
1011*48a54d36SAndroid Build Coastguard Worker 	int										n;
1012*48a54d36SAndroid Build Coastguard Worker 	int										i;
1013*48a54d36SAndroid Build Coastguard Worker 
1014*48a54d36SAndroid Build Coastguard Worker 	UNUSED_ALWAYS( inWParam );
1015*48a54d36SAndroid Build Coastguard Worker 
1016*48a54d36SAndroid Build Coastguard Worker 	assert( inLParam );
1017*48a54d36SAndroid Build Coastguard Worker 	p = reinterpret_cast <ServiceEventInfo *> ( inLParam );
1018*48a54d36SAndroid Build Coastguard Worker 	pAutoPtr.reset( p );
1019*48a54d36SAndroid Build Coastguard Worker 
1020*48a54d36SAndroid Build Coastguard Worker 	// Search to see if we know about this service instance. If so, remove it from the list.
1021*48a54d36SAndroid Build Coastguard Worker 
1022*48a54d36SAndroid Build Coastguard Worker 	found = false;
1023*48a54d36SAndroid Build Coastguard Worker 	n = (int) mServiceInstances.size();
1024*48a54d36SAndroid Build Coastguard Worker 	for( i = 0; i < n; ++i )
1025*48a54d36SAndroid Build Coastguard Worker 	{
1026*48a54d36SAndroid Build Coastguard Worker 		ServiceInstanceInfo *		q;
1027*48a54d36SAndroid Build Coastguard Worker 
1028*48a54d36SAndroid Build Coastguard Worker 		// If the name, type, domain, and interface match, treat it as the same service instance.
1029*48a54d36SAndroid Build Coastguard Worker 
1030*48a54d36SAndroid Build Coastguard Worker 		q = &mServiceInstances[ i ];
1031*48a54d36SAndroid Build Coastguard Worker 		if( ( p->name 	== q->name ) 	&&
1032*48a54d36SAndroid Build Coastguard Worker 			( p->type 	== q->type ) 	&&
1033*48a54d36SAndroid Build Coastguard Worker 			( p->domain	== q->domain ) )
1034*48a54d36SAndroid Build Coastguard Worker 		{
1035*48a54d36SAndroid Build Coastguard Worker 			found = true;
1036*48a54d36SAndroid Build Coastguard Worker 			break;
1037*48a54d36SAndroid Build Coastguard Worker 		}
1038*48a54d36SAndroid Build Coastguard Worker 	}
1039*48a54d36SAndroid Build Coastguard Worker 	if( found )
1040*48a54d36SAndroid Build Coastguard Worker 	{
1041*48a54d36SAndroid Build Coastguard Worker 		mChooserList.DeleteItem( i );
1042*48a54d36SAndroid Build Coastguard Worker 		assert( i < (int) mServiceInstances.size() );
1043*48a54d36SAndroid Build Coastguard Worker 		mServiceInstances.erase( mServiceInstances.begin() + i );
1044*48a54d36SAndroid Build Coastguard Worker 	}
1045*48a54d36SAndroid Build Coastguard Worker 	return( 0 );
1046*48a54d36SAndroid Build Coastguard Worker }
1047*48a54d36SAndroid Build Coastguard Worker 
1048*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1049*48a54d36SAndroid Build Coastguard Worker //	OnResolve
1050*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1051*48a54d36SAndroid Build Coastguard Worker 
OnResolve(WPARAM inWParam,LPARAM inLParam)1052*48a54d36SAndroid Build Coastguard Worker LONG	ChooserDialog::OnResolve( WPARAM inWParam, LPARAM inLParam )
1053*48a54d36SAndroid Build Coastguard Worker {
1054*48a54d36SAndroid Build Coastguard Worker 	ServiceInstanceInfo *						p;
1055*48a54d36SAndroid Build Coastguard Worker 	std::auto_ptr < ServiceInstanceInfo >		pAutoPtr;
1056*48a54d36SAndroid Build Coastguard Worker 	int											selectedType;
1057*48a54d36SAndroid Build Coastguard Worker 	int											n;
1058*48a54d36SAndroid Build Coastguard Worker 	int											i;
1059*48a54d36SAndroid Build Coastguard Worker 	bool										found;
1060*48a54d36SAndroid Build Coastguard Worker 
1061*48a54d36SAndroid Build Coastguard Worker 	UNUSED_ALWAYS( inWParam );
1062*48a54d36SAndroid Build Coastguard Worker 
1063*48a54d36SAndroid Build Coastguard Worker 	assert( inLParam );
1064*48a54d36SAndroid Build Coastguard Worker 	p = reinterpret_cast <ServiceInstanceInfo *> ( inLParam );
1065*48a54d36SAndroid Build Coastguard Worker 	pAutoPtr.reset( p );
1066*48a54d36SAndroid Build Coastguard Worker 
1067*48a54d36SAndroid Build Coastguard Worker 	// Make sure it is for an item of the correct type. This handles any resolves that may have been queued up.
1068*48a54d36SAndroid Build Coastguard Worker 
1069*48a54d36SAndroid Build Coastguard Worker 	selectedType = mServiceList.GetNextItem( -1, LVNI_SELECTED );
1070*48a54d36SAndroid Build Coastguard Worker 	assert( selectedType >= 0 );
1071*48a54d36SAndroid Build Coastguard Worker 	if( selectedType >= 0 )
1072*48a54d36SAndroid Build Coastguard Worker 	{
1073*48a54d36SAndroid Build Coastguard Worker 		assert( selectedType <= (int) mServiceTypes.size() );
1074*48a54d36SAndroid Build Coastguard Worker 		if( p->type != mServiceTypes[ selectedType ].serviceType )
1075*48a54d36SAndroid Build Coastguard Worker 		{
1076*48a54d36SAndroid Build Coastguard Worker 			goto exit;
1077*48a54d36SAndroid Build Coastguard Worker 		}
1078*48a54d36SAndroid Build Coastguard Worker 	}
1079*48a54d36SAndroid Build Coastguard Worker 
1080*48a54d36SAndroid Build Coastguard Worker 	// Search to see if we know about this service instance. If so, update its info. Otherwise, add it to the list.
1081*48a54d36SAndroid Build Coastguard Worker 
1082*48a54d36SAndroid Build Coastguard Worker 	found = false;
1083*48a54d36SAndroid Build Coastguard Worker 	n = (int) mServiceInstances.size();
1084*48a54d36SAndroid Build Coastguard Worker 	for( i = 0; i < n; ++i )
1085*48a54d36SAndroid Build Coastguard Worker 	{
1086*48a54d36SAndroid Build Coastguard Worker 		ServiceInstanceInfo *		q;
1087*48a54d36SAndroid Build Coastguard Worker 
1088*48a54d36SAndroid Build Coastguard Worker 		// If the name, type, domain, and interface matches, treat it as the same service instance.
1089*48a54d36SAndroid Build Coastguard Worker 
1090*48a54d36SAndroid Build Coastguard Worker 		q = &mServiceInstances[ i ];
1091*48a54d36SAndroid Build Coastguard Worker 		if( ( p->name 	== q->name ) 	&&
1092*48a54d36SAndroid Build Coastguard Worker 			( p->type 	== q->type ) 	&&
1093*48a54d36SAndroid Build Coastguard Worker 			( p->domain	== q->domain ) 	&&
1094*48a54d36SAndroid Build Coastguard Worker 			( p->ifIP 	== q->ifIP ) )
1095*48a54d36SAndroid Build Coastguard Worker 		{
1096*48a54d36SAndroid Build Coastguard Worker 			found = true;
1097*48a54d36SAndroid Build Coastguard Worker 			break;
1098*48a54d36SAndroid Build Coastguard Worker 		}
1099*48a54d36SAndroid Build Coastguard Worker 	}
1100*48a54d36SAndroid Build Coastguard Worker 	if( found )
1101*48a54d36SAndroid Build Coastguard Worker 	{
1102*48a54d36SAndroid Build Coastguard Worker 		mServiceInstances[ i ] = *p;
1103*48a54d36SAndroid Build Coastguard Worker 	}
1104*48a54d36SAndroid Build Coastguard Worker 	else
1105*48a54d36SAndroid Build Coastguard Worker 	{
1106*48a54d36SAndroid Build Coastguard Worker 		CString		s;
1107*48a54d36SAndroid Build Coastguard Worker 
1108*48a54d36SAndroid Build Coastguard Worker 		mServiceInstances.push_back( *p );
1109*48a54d36SAndroid Build Coastguard Worker 		UTF8StringToStringObject( p->name.c_str(), s );
1110*48a54d36SAndroid Build Coastguard Worker 		mChooserList.InsertItem( n, s );
1111*48a54d36SAndroid Build Coastguard Worker 
1112*48a54d36SAndroid Build Coastguard Worker 		UTF8StringToStringObject( p->ip.c_str(), s );
1113*48a54d36SAndroid Build Coastguard Worker 		mChooserList.SetItemText( n, 1, s );
1114*48a54d36SAndroid Build Coastguard Worker 
1115*48a54d36SAndroid Build Coastguard Worker 		// If this is the only item, select it.
1116*48a54d36SAndroid Build Coastguard Worker 
1117*48a54d36SAndroid Build Coastguard Worker 		if( n == 0 )
1118*48a54d36SAndroid Build Coastguard Worker 		{
1119*48a54d36SAndroid Build Coastguard Worker 			mChooserList.SetItemState( n, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
1120*48a54d36SAndroid Build Coastguard Worker 		}
1121*48a54d36SAndroid Build Coastguard Worker 	}
1122*48a54d36SAndroid Build Coastguard Worker 	UpdateInfoDisplay();
1123*48a54d36SAndroid Build Coastguard Worker 
1124*48a54d36SAndroid Build Coastguard Worker exit:
1125*48a54d36SAndroid Build Coastguard Worker 	return( 0 );
1126*48a54d36SAndroid Build Coastguard Worker }
1127*48a54d36SAndroid Build Coastguard Worker 
1128*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1129*48a54d36SAndroid Build Coastguard Worker //	StartBrowsing
1130*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1131*48a54d36SAndroid Build Coastguard Worker 
StartBrowsing(const char * inType,const char * inDomain)1132*48a54d36SAndroid Build Coastguard Worker void	ChooserDialog::StartBrowsing( const char *inType, const char *inDomain )
1133*48a54d36SAndroid Build Coastguard Worker {
1134*48a54d36SAndroid Build Coastguard Worker 	DNSStatus		err;
1135*48a54d36SAndroid Build Coastguard Worker 
1136*48a54d36SAndroid Build Coastguard Worker 	assert( mServiceInstances.empty() );
1137*48a54d36SAndroid Build Coastguard Worker 	assert( mChooserList.GetItemCount() == 0 );
1138*48a54d36SAndroid Build Coastguard Worker 	assert( !mIsServiceBrowsing );
1139*48a54d36SAndroid Build Coastguard Worker 
1140*48a54d36SAndroid Build Coastguard Worker 	mChooserList.DeleteAllItems();
1141*48a54d36SAndroid Build Coastguard Worker 	mServiceInstances.clear();
1142*48a54d36SAndroid Build Coastguard Worker 
1143*48a54d36SAndroid Build Coastguard Worker 	mIsServiceBrowsing = true;
1144*48a54d36SAndroid Build Coastguard Worker 	err = DNSBrowserStartServiceSearch( mBrowser, kDNSBrowserFlagAutoResolve, inType, inDomain );
1145*48a54d36SAndroid Build Coastguard Worker 	assert( err == kDNSNoErr );
1146*48a54d36SAndroid Build Coastguard Worker }
1147*48a54d36SAndroid Build Coastguard Worker 
1148*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1149*48a54d36SAndroid Build Coastguard Worker //	StopBrowsing
1150*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1151*48a54d36SAndroid Build Coastguard Worker 
StopBrowsing(void)1152*48a54d36SAndroid Build Coastguard Worker void	ChooserDialog::StopBrowsing( void )
1153*48a54d36SAndroid Build Coastguard Worker {
1154*48a54d36SAndroid Build Coastguard Worker 	// If searching, stop.
1155*48a54d36SAndroid Build Coastguard Worker 
1156*48a54d36SAndroid Build Coastguard Worker 	if( mIsServiceBrowsing )
1157*48a54d36SAndroid Build Coastguard Worker 	{
1158*48a54d36SAndroid Build Coastguard Worker 		DNSStatus		err;
1159*48a54d36SAndroid Build Coastguard Worker 
1160*48a54d36SAndroid Build Coastguard Worker 		mIsServiceBrowsing = false;
1161*48a54d36SAndroid Build Coastguard Worker 		err = DNSBrowserStopServiceSearch( mBrowser, 0 );
1162*48a54d36SAndroid Build Coastguard Worker 		assert( err == kDNSNoErr );
1163*48a54d36SAndroid Build Coastguard Worker 	}
1164*48a54d36SAndroid Build Coastguard Worker 
1165*48a54d36SAndroid Build Coastguard Worker 	// Remove all service instances.
1166*48a54d36SAndroid Build Coastguard Worker 
1167*48a54d36SAndroid Build Coastguard Worker 	mChooserList.DeleteAllItems();
1168*48a54d36SAndroid Build Coastguard Worker 	assert( mChooserList.GetItemCount() == 0 );
1169*48a54d36SAndroid Build Coastguard Worker 	mServiceInstances.clear();
1170*48a54d36SAndroid Build Coastguard Worker 	assert( mServiceInstances.empty() );
1171*48a54d36SAndroid Build Coastguard Worker 	UpdateInfoDisplay();
1172*48a54d36SAndroid Build Coastguard Worker }
1173*48a54d36SAndroid Build Coastguard Worker 
1174*48a54d36SAndroid Build Coastguard Worker #if 0
1175*48a54d36SAndroid Build Coastguard Worker #pragma mark -
1176*48a54d36SAndroid Build Coastguard Worker #endif
1177*48a54d36SAndroid Build Coastguard Worker 
1178*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1179*48a54d36SAndroid Build Coastguard Worker //	BrowserCallBack
1180*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1181*48a54d36SAndroid Build Coastguard Worker 
1182*48a54d36SAndroid Build Coastguard Worker static void
BrowserCallBack(void * inContext,DNSBrowserRef inRef,DNSStatus inStatusCode,const DNSBrowserEvent * inEvent)1183*48a54d36SAndroid Build Coastguard Worker 	BrowserCallBack(
1184*48a54d36SAndroid Build Coastguard Worker 		void *					inContext,
1185*48a54d36SAndroid Build Coastguard Worker 		DNSBrowserRef			inRef,
1186*48a54d36SAndroid Build Coastguard Worker 		DNSStatus				inStatusCode,
1187*48a54d36SAndroid Build Coastguard Worker 		const DNSBrowserEvent *	inEvent )
1188*48a54d36SAndroid Build Coastguard Worker {
1189*48a54d36SAndroid Build Coastguard Worker 	ChooserDialog *		dialog;
1190*48a54d36SAndroid Build Coastguard Worker 	UINT 				message;
1191*48a54d36SAndroid Build Coastguard Worker 	BOOL				posted;
1192*48a54d36SAndroid Build Coastguard Worker 
1193*48a54d36SAndroid Build Coastguard Worker 	UNUSED_ALWAYS( inStatusCode );
1194*48a54d36SAndroid Build Coastguard Worker 	UNUSED_ALWAYS( inRef );
1195*48a54d36SAndroid Build Coastguard Worker 
1196*48a54d36SAndroid Build Coastguard Worker 	// Check parameters.
1197*48a54d36SAndroid Build Coastguard Worker 
1198*48a54d36SAndroid Build Coastguard Worker 	assert( inContext );
1199*48a54d36SAndroid Build Coastguard Worker 	dialog = reinterpret_cast <ChooserDialog *> ( inContext );
1200*48a54d36SAndroid Build Coastguard Worker 
1201*48a54d36SAndroid Build Coastguard Worker 	try
1202*48a54d36SAndroid Build Coastguard Worker 	{
1203*48a54d36SAndroid Build Coastguard Worker 		switch( inEvent->type )
1204*48a54d36SAndroid Build Coastguard Worker 		{
1205*48a54d36SAndroid Build Coastguard Worker 			case kDNSBrowserEventTypeRelease:
1206*48a54d36SAndroid Build Coastguard Worker 				break;
1207*48a54d36SAndroid Build Coastguard Worker 
1208*48a54d36SAndroid Build Coastguard Worker 			// Domains
1209*48a54d36SAndroid Build Coastguard Worker 
1210*48a54d36SAndroid Build Coastguard Worker 			case kDNSBrowserEventTypeAddDomain:
1211*48a54d36SAndroid Build Coastguard Worker 			case kDNSBrowserEventTypeAddDefaultDomain:
1212*48a54d36SAndroid Build Coastguard Worker 			case kDNSBrowserEventTypeRemoveDomain:
1213*48a54d36SAndroid Build Coastguard Worker 			{
1214*48a54d36SAndroid Build Coastguard Worker 				DomainEventInfo *						domain;
1215*48a54d36SAndroid Build Coastguard Worker 				std::auto_ptr < DomainEventInfo >		domainAutoPtr;
1216*48a54d36SAndroid Build Coastguard Worker 
1217*48a54d36SAndroid Build Coastguard Worker 				domain = new DomainEventInfo;
1218*48a54d36SAndroid Build Coastguard Worker 				domainAutoPtr.reset( domain );
1219*48a54d36SAndroid Build Coastguard Worker 
1220*48a54d36SAndroid Build Coastguard Worker 				domain->eventType 	= inEvent->type;
1221*48a54d36SAndroid Build Coastguard Worker 				domain->domain 		= inEvent->data.addDomain.domain;
1222*48a54d36SAndroid Build Coastguard Worker 				domain->ifIP		= inEvent->data.addDomain.interfaceIP;
1223*48a54d36SAndroid Build Coastguard Worker 
1224*48a54d36SAndroid Build Coastguard Worker 				message = ( inEvent->type == kDNSBrowserEventTypeRemoveDomain ) ? WM_USER_DOMAIN_REMOVE : WM_USER_DOMAIN_ADD;
1225*48a54d36SAndroid Build Coastguard Worker 				posted = ::PostMessage( dialog->GetSafeHwnd(), message, 0, (LPARAM) domain );
1226*48a54d36SAndroid Build Coastguard Worker 				assert( posted );
1227*48a54d36SAndroid Build Coastguard Worker 				if( posted )
1228*48a54d36SAndroid Build Coastguard Worker 				{
1229*48a54d36SAndroid Build Coastguard Worker 					domainAutoPtr.release();
1230*48a54d36SAndroid Build Coastguard Worker 				}
1231*48a54d36SAndroid Build Coastguard Worker 				break;
1232*48a54d36SAndroid Build Coastguard Worker 			}
1233*48a54d36SAndroid Build Coastguard Worker 
1234*48a54d36SAndroid Build Coastguard Worker 			// Services
1235*48a54d36SAndroid Build Coastguard Worker 
1236*48a54d36SAndroid Build Coastguard Worker 			case kDNSBrowserEventTypeAddService:
1237*48a54d36SAndroid Build Coastguard Worker 			case kDNSBrowserEventTypeRemoveService:
1238*48a54d36SAndroid Build Coastguard Worker 			{
1239*48a54d36SAndroid Build Coastguard Worker 				ServiceEventInfo *						service;
1240*48a54d36SAndroid Build Coastguard Worker 				std::auto_ptr < ServiceEventInfo >		serviceAutoPtr;
1241*48a54d36SAndroid Build Coastguard Worker 
1242*48a54d36SAndroid Build Coastguard Worker 				service = new ServiceEventInfo;
1243*48a54d36SAndroid Build Coastguard Worker 				serviceAutoPtr.reset( service );
1244*48a54d36SAndroid Build Coastguard Worker 
1245*48a54d36SAndroid Build Coastguard Worker 				service->eventType 	= inEvent->type;
1246*48a54d36SAndroid Build Coastguard Worker 				service->name 		= inEvent->data.addService.name;
1247*48a54d36SAndroid Build Coastguard Worker 				service->type 		= inEvent->data.addService.type;
1248*48a54d36SAndroid Build Coastguard Worker 				service->domain		= inEvent->data.addService.domain;
1249*48a54d36SAndroid Build Coastguard Worker 				service->ifIP		= inEvent->data.addService.interfaceIP;
1250*48a54d36SAndroid Build Coastguard Worker 
1251*48a54d36SAndroid Build Coastguard Worker 				message = ( inEvent->type == kDNSBrowserEventTypeAddService ) ? WM_USER_SERVICE_ADD : WM_USER_SERVICE_REMOVE;
1252*48a54d36SAndroid Build Coastguard Worker 				posted = ::PostMessage( dialog->GetSafeHwnd(), message, 0, (LPARAM) service );
1253*48a54d36SAndroid Build Coastguard Worker 				assert( posted );
1254*48a54d36SAndroid Build Coastguard Worker 				if( posted )
1255*48a54d36SAndroid Build Coastguard Worker 				{
1256*48a54d36SAndroid Build Coastguard Worker 					serviceAutoPtr.release();
1257*48a54d36SAndroid Build Coastguard Worker 				}
1258*48a54d36SAndroid Build Coastguard Worker 				break;
1259*48a54d36SAndroid Build Coastguard Worker 			}
1260*48a54d36SAndroid Build Coastguard Worker 
1261*48a54d36SAndroid Build Coastguard Worker 			// Resolves
1262*48a54d36SAndroid Build Coastguard Worker 
1263*48a54d36SAndroid Build Coastguard Worker 			case kDNSBrowserEventTypeResolved:
1264*48a54d36SAndroid Build Coastguard Worker 				if( inEvent->data.resolved->address.addressType == kDNSNetworkAddressTypeIPv4  )
1265*48a54d36SAndroid Build Coastguard Worker 				{
1266*48a54d36SAndroid Build Coastguard Worker 					ServiceInstanceInfo *						serviceInstance;
1267*48a54d36SAndroid Build Coastguard Worker 					std::auto_ptr < ServiceInstanceInfo >		serviceInstanceAutoPtr;
1268*48a54d36SAndroid Build Coastguard Worker 					char										s[ 32 ];
1269*48a54d36SAndroid Build Coastguard Worker 
1270*48a54d36SAndroid Build Coastguard Worker 					serviceInstance = new ServiceInstanceInfo;
1271*48a54d36SAndroid Build Coastguard Worker 					serviceInstanceAutoPtr.reset( serviceInstance );
1272*48a54d36SAndroid Build Coastguard Worker 
1273*48a54d36SAndroid Build Coastguard Worker 					serviceInstance->name 		= inEvent->data.resolved->name;
1274*48a54d36SAndroid Build Coastguard Worker 					serviceInstance->type 		= inEvent->data.resolved->type;
1275*48a54d36SAndroid Build Coastguard Worker 					serviceInstance->domain		= inEvent->data.resolved->domain;
1276*48a54d36SAndroid Build Coastguard Worker 					serviceInstance->ip			= DNSNetworkAddressToString( &inEvent->data.resolved->address, s );
1277*48a54d36SAndroid Build Coastguard Worker 					serviceInstance->ifIP		= DNSNetworkAddressToString( &inEvent->data.resolved->interfaceIP, s );
1278*48a54d36SAndroid Build Coastguard Worker 					serviceInstance->text 		= inEvent->data.resolved->textRecord;
1279*48a54d36SAndroid Build Coastguard Worker 					serviceInstance->hostName	= inEvent->data.resolved->hostName;
1280*48a54d36SAndroid Build Coastguard Worker 
1281*48a54d36SAndroid Build Coastguard Worker 					posted = ::PostMessage( dialog->GetSafeHwnd(), WM_USER_RESOLVE, 0, (LPARAM) serviceInstance );
1282*48a54d36SAndroid Build Coastguard Worker 					assert( posted );
1283*48a54d36SAndroid Build Coastguard Worker 					if( posted )
1284*48a54d36SAndroid Build Coastguard Worker 					{
1285*48a54d36SAndroid Build Coastguard Worker 						serviceInstanceAutoPtr.release();
1286*48a54d36SAndroid Build Coastguard Worker 					}
1287*48a54d36SAndroid Build Coastguard Worker 				}
1288*48a54d36SAndroid Build Coastguard Worker 				break;
1289*48a54d36SAndroid Build Coastguard Worker 
1290*48a54d36SAndroid Build Coastguard Worker 			default:
1291*48a54d36SAndroid Build Coastguard Worker 				break;
1292*48a54d36SAndroid Build Coastguard Worker 		}
1293*48a54d36SAndroid Build Coastguard Worker 	}
1294*48a54d36SAndroid Build Coastguard Worker 	catch( ... )
1295*48a54d36SAndroid Build Coastguard Worker 	{
1296*48a54d36SAndroid Build Coastguard Worker 		// Don't let exceptions escape.
1297*48a54d36SAndroid Build Coastguard Worker 	}
1298*48a54d36SAndroid Build Coastguard Worker }
1299*48a54d36SAndroid Build Coastguard Worker 
1300*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1301*48a54d36SAndroid Build Coastguard Worker //	DNSNetworkAddressToString
1302*48a54d36SAndroid Build Coastguard Worker //
1303*48a54d36SAndroid Build Coastguard Worker //	Note: Currently only supports IPv4 network addresses.
1304*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1305*48a54d36SAndroid Build Coastguard Worker 
DNSNetworkAddressToString(const DNSNetworkAddress * inAddr,char * outString)1306*48a54d36SAndroid Build Coastguard Worker static char *	DNSNetworkAddressToString( const DNSNetworkAddress *inAddr, char *outString )
1307*48a54d36SAndroid Build Coastguard Worker {
1308*48a54d36SAndroid Build Coastguard Worker 	const DNSUInt8 *		p;
1309*48a54d36SAndroid Build Coastguard Worker 	DNSUInt16				port;
1310*48a54d36SAndroid Build Coastguard Worker 
1311*48a54d36SAndroid Build Coastguard Worker 	p = inAddr->u.ipv4.addr.v8;
1312*48a54d36SAndroid Build Coastguard Worker 	port = ntohs( inAddr->u.ipv4.port.v16 );
1313*48a54d36SAndroid Build Coastguard Worker 	if( port != kDNSPortInvalid )
1314*48a54d36SAndroid Build Coastguard Worker 	{
1315*48a54d36SAndroid Build Coastguard Worker 		sprintf( outString, "%u.%u.%u.%u:%u", p[ 0 ], p[ 1 ], p[ 2 ], p[ 3 ], port );
1316*48a54d36SAndroid Build Coastguard Worker 	}
1317*48a54d36SAndroid Build Coastguard Worker 	else
1318*48a54d36SAndroid Build Coastguard Worker 	{
1319*48a54d36SAndroid Build Coastguard Worker 		sprintf( outString, "%u.%u.%u.%u", p[ 0 ], p[ 1 ], p[ 2 ], p[ 3 ] );
1320*48a54d36SAndroid Build Coastguard Worker 	}
1321*48a54d36SAndroid Build Coastguard Worker 	return( outString );
1322*48a54d36SAndroid Build Coastguard Worker }
1323*48a54d36SAndroid Build Coastguard Worker 
1324*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1325*48a54d36SAndroid Build Coastguard Worker //	UTF8StringToStringObject
1326*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1327*48a54d36SAndroid Build Coastguard Worker 
UTF8StringToStringObject(const char * inUTF8,CString & inObject)1328*48a54d36SAndroid Build Coastguard Worker static DWORD	UTF8StringToStringObject( const char *inUTF8, CString &inObject )
1329*48a54d36SAndroid Build Coastguard Worker {
1330*48a54d36SAndroid Build Coastguard Worker 	DWORD		err;
1331*48a54d36SAndroid Build Coastguard Worker 	int			n;
1332*48a54d36SAndroid Build Coastguard Worker 	BSTR		unicode;
1333*48a54d36SAndroid Build Coastguard Worker 
1334*48a54d36SAndroid Build Coastguard Worker 	unicode = NULL;
1335*48a54d36SAndroid Build Coastguard Worker 
1336*48a54d36SAndroid Build Coastguard Worker 	n = MultiByteToWideChar( CP_UTF8, 0, inUTF8, -1, NULL, 0 );
1337*48a54d36SAndroid Build Coastguard Worker 	if( n > 0 )
1338*48a54d36SAndroid Build Coastguard Worker 	{
1339*48a54d36SAndroid Build Coastguard Worker 		unicode = (BSTR) malloc( (size_t)( n * sizeof( wchar_t ) ) );
1340*48a54d36SAndroid Build Coastguard Worker 		if( !unicode )
1341*48a54d36SAndroid Build Coastguard Worker 		{
1342*48a54d36SAndroid Build Coastguard Worker 			err = ERROR_INSUFFICIENT_BUFFER;
1343*48a54d36SAndroid Build Coastguard Worker 			goto exit;
1344*48a54d36SAndroid Build Coastguard Worker 		}
1345*48a54d36SAndroid Build Coastguard Worker 
1346*48a54d36SAndroid Build Coastguard Worker 		n = MultiByteToWideChar( CP_UTF8, 0, inUTF8, -1, unicode, n );
1347*48a54d36SAndroid Build Coastguard Worker 		try
1348*48a54d36SAndroid Build Coastguard Worker 		{
1349*48a54d36SAndroid Build Coastguard Worker 			inObject = unicode;
1350*48a54d36SAndroid Build Coastguard Worker 		}
1351*48a54d36SAndroid Build Coastguard Worker 		catch( ... )
1352*48a54d36SAndroid Build Coastguard Worker 		{
1353*48a54d36SAndroid Build Coastguard Worker 			err = ERROR_NO_UNICODE_TRANSLATION;
1354*48a54d36SAndroid Build Coastguard Worker 			goto exit;
1355*48a54d36SAndroid Build Coastguard Worker 		}
1356*48a54d36SAndroid Build Coastguard Worker 	}
1357*48a54d36SAndroid Build Coastguard Worker 	else
1358*48a54d36SAndroid Build Coastguard Worker 	{
1359*48a54d36SAndroid Build Coastguard Worker 		inObject = "";
1360*48a54d36SAndroid Build Coastguard Worker 	}
1361*48a54d36SAndroid Build Coastguard Worker 	err = 0;
1362*48a54d36SAndroid Build Coastguard Worker 
1363*48a54d36SAndroid Build Coastguard Worker exit:
1364*48a54d36SAndroid Build Coastguard Worker 	if( unicode )
1365*48a54d36SAndroid Build Coastguard Worker 	{
1366*48a54d36SAndroid Build Coastguard Worker 		free( unicode );
1367*48a54d36SAndroid Build Coastguard Worker 	}
1368*48a54d36SAndroid Build Coastguard Worker 	return( err );
1369*48a54d36SAndroid Build Coastguard Worker }
1370*48a54d36SAndroid Build Coastguard Worker 
1371*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1372*48a54d36SAndroid Build Coastguard Worker //	StringObjectToUTF8String
1373*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1374*48a54d36SAndroid Build Coastguard Worker 
StringObjectToUTF8String(CString & inObject,std::string & outUTF8)1375*48a54d36SAndroid Build Coastguard Worker static DWORD	StringObjectToUTF8String( CString &inObject, std::string &outUTF8 )
1376*48a54d36SAndroid Build Coastguard Worker {
1377*48a54d36SAndroid Build Coastguard Worker 	DWORD		err;
1378*48a54d36SAndroid Build Coastguard Worker 	BSTR		unicode;
1379*48a54d36SAndroid Build Coastguard Worker 	int			nUnicode;
1380*48a54d36SAndroid Build Coastguard Worker 	int			n;
1381*48a54d36SAndroid Build Coastguard Worker 	char *		utf8;
1382*48a54d36SAndroid Build Coastguard Worker 
1383*48a54d36SAndroid Build Coastguard Worker 	unicode = NULL;
1384*48a54d36SAndroid Build Coastguard Worker 	utf8	= NULL;
1385*48a54d36SAndroid Build Coastguard Worker 
1386*48a54d36SAndroid Build Coastguard Worker 	nUnicode = inObject.GetLength();
1387*48a54d36SAndroid Build Coastguard Worker 	if( nUnicode > 0 )
1388*48a54d36SAndroid Build Coastguard Worker 	{
1389*48a54d36SAndroid Build Coastguard Worker 		unicode = inObject.AllocSysString();
1390*48a54d36SAndroid Build Coastguard Worker 		n = WideCharToMultiByte( CP_UTF8, 0, unicode, nUnicode, NULL, 0, NULL, NULL );
1391*48a54d36SAndroid Build Coastguard Worker 		assert( n > 0 );
1392*48a54d36SAndroid Build Coastguard Worker 
1393*48a54d36SAndroid Build Coastguard Worker 		utf8 = (char *) malloc( (size_t) n );
1394*48a54d36SAndroid Build Coastguard Worker 		assert( utf8 );
1395*48a54d36SAndroid Build Coastguard Worker 		if( !utf8 ) { err = ERROR_INSUFFICIENT_BUFFER; goto exit; }
1396*48a54d36SAndroid Build Coastguard Worker 
1397*48a54d36SAndroid Build Coastguard Worker 		n = WideCharToMultiByte( CP_UTF8, 0, unicode, nUnicode, utf8, n, NULL, NULL );
1398*48a54d36SAndroid Build Coastguard Worker 		assert( n > 0 );
1399*48a54d36SAndroid Build Coastguard Worker 
1400*48a54d36SAndroid Build Coastguard Worker 		try
1401*48a54d36SAndroid Build Coastguard Worker 		{
1402*48a54d36SAndroid Build Coastguard Worker 			outUTF8.assign( utf8, n );
1403*48a54d36SAndroid Build Coastguard Worker 		}
1404*48a54d36SAndroid Build Coastguard Worker 		catch( ... )
1405*48a54d36SAndroid Build Coastguard Worker 		{
1406*48a54d36SAndroid Build Coastguard Worker 			err = ERROR_NO_UNICODE_TRANSLATION;
1407*48a54d36SAndroid Build Coastguard Worker 			goto exit;
1408*48a54d36SAndroid Build Coastguard Worker 		}
1409*48a54d36SAndroid Build Coastguard Worker 	}
1410*48a54d36SAndroid Build Coastguard Worker 	else
1411*48a54d36SAndroid Build Coastguard Worker 	{
1412*48a54d36SAndroid Build Coastguard Worker 		outUTF8.clear();
1413*48a54d36SAndroid Build Coastguard Worker 	}
1414*48a54d36SAndroid Build Coastguard Worker 	err = 0;
1415*48a54d36SAndroid Build Coastguard Worker 
1416*48a54d36SAndroid Build Coastguard Worker exit:
1417*48a54d36SAndroid Build Coastguard Worker 	if( unicode )
1418*48a54d36SAndroid Build Coastguard Worker 	{
1419*48a54d36SAndroid Build Coastguard Worker 		SysFreeString( unicode );
1420*48a54d36SAndroid Build Coastguard Worker 	}
1421*48a54d36SAndroid Build Coastguard Worker 	if( utf8 )
1422*48a54d36SAndroid Build Coastguard Worker 	{
1423*48a54d36SAndroid Build Coastguard Worker 		free( utf8 );
1424*48a54d36SAndroid Build Coastguard Worker 	}
1425*48a54d36SAndroid Build Coastguard Worker 	return( err );
1426*48a54d36SAndroid Build Coastguard Worker }
1427