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