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