]> git.saurik.com Git - apple/mdnsresponder.git/blob - mDNSWindows/Applications/ExplorerPlugin/ExplorerBar.cpp
mDNSResponder-66.3.tar.gz
[apple/mdnsresponder.git] / mDNSWindows / Applications / ExplorerPlugin / ExplorerBar.cpp
1 /*
2 * Copyright (c) 2003-2004 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
7 *
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * file.
14 *
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
22 *
23 * @APPLE_LICENSE_HEADER_END@
24
25 Change History (most recent first):
26
27 $Log: ExplorerBar.cpp,v $
28 Revision 1.1 2004/01/30 03:01:56 bradley
29 Explorer Plugin to browse for Rendezvous-enabled Web and FTP servers from within Internet Explorer.
30
31 */
32
33 #include "StdAfx.h"
34
35 #include "comutil.h"
36 #include "ShObjIdl.h"
37
38 #include "DebugServices.h"
39
40 #include "Resource.h"
41
42 #include "ExplorerBar.h"
43
44 // MFC Debugging
45
46 #ifdef _DEBUG
47 #define new DEBUG_NEW
48 #undef THIS_FILE
49 static char THIS_FILE[] = __FILE__;
50 #endif
51
52 //===========================================================================================================================
53 // Constants
54 //===========================================================================================================================
55
56 #define MIN_SIZE_X 10
57 #define MIN_SIZE_Y 10
58
59 //===========================================================================================================================
60 // ExplorerBar
61 //===========================================================================================================================
62
63 ExplorerBar::ExplorerBar( void )
64 {
65 ++gDLLRefCount;
66
67 mRefCount = 1;
68 mSite = NULL;
69 mWebBrowser = NULL;
70 mParentWindow = NULL;
71 mFocus = FALSE;
72 mViewMode = 0;
73 mBandID = 0;
74 }
75
76 //===========================================================================================================================
77 // ~ExplorerBar
78 //===========================================================================================================================
79
80 ExplorerBar::~ExplorerBar( void )
81 {
82 if( mWebBrowser )
83 {
84 mWebBrowser->Release();
85 mWebBrowser = NULL;
86 }
87 if( mSite )
88 {
89 mSite->Release();
90 mSite = NULL;
91 }
92
93 --gDLLRefCount;
94 }
95
96 #if 0
97 #pragma mark -
98 #pragma mark == IUnknown implementation ==
99 #endif
100
101 //===========================================================================================================================
102 // QueryInterface
103 //===========================================================================================================================
104
105 STDMETHODIMP ExplorerBar::QueryInterface( REFIID inID, LPVOID *outResult )
106 {
107 HRESULT err;
108
109 if( IsEqualIID( inID, IID_IUnknown ) ) // IUnknown
110 {
111 *outResult = this;
112 }
113 else if( IsEqualIID( inID, IID_IOleWindow ) ) // IOleWindow
114 {
115 *outResult = (IOleWindow *) this;
116 }
117 else if( IsEqualIID( inID, IID_IDockingWindow ) ) // IDockingWindow
118 {
119 *outResult = (IDockingWindow *) this;
120 }
121 else if( IsEqualIID( inID, IID_IDeskBand ) ) // IDeskBand
122 {
123 *outResult = (IDeskBand *) this;
124 }
125 else if( IsEqualIID( inID, IID_IInputObject ) ) // IInputObject
126 {
127 *outResult = (IInputObject *) this;
128 }
129 else if( IsEqualIID( inID, IID_IObjectWithSite ) ) // IObjectWithSite
130 {
131 *outResult = (IObjectWithSite *) this;
132 }
133 else if( IsEqualIID( inID, IID_IPersistStream ) ) // IPersistStream
134 {
135 *outResult = (IPersistStream *) this;
136 }
137 else
138 {
139 *outResult = NULL;
140 err = E_NOINTERFACE;
141 goto exit;
142 }
143
144 ( *( (LPUNKNOWN *) outResult ) )->AddRef();
145 err = S_OK;
146
147 exit:
148 return( err );
149 }
150
151 //===========================================================================================================================
152 // AddRef
153 //===========================================================================================================================
154
155 STDMETHODIMP_( DWORD ) ExplorerBar::AddRef( void )
156 {
157 return( ++mRefCount );
158 }
159
160 //===========================================================================================================================
161 // Release
162 //===========================================================================================================================
163
164 STDMETHODIMP_( DWORD ) ExplorerBar::Release( void )
165 {
166 DWORD count;
167
168 count = --mRefCount;
169 if( count == 0 )
170 {
171 delete this;
172 }
173 return( count );
174 }
175
176 #if 0
177 #pragma mark -
178 #pragma mark == IOleWindow implementation ==
179 #endif
180
181 //===========================================================================================================================
182 // GetWindow
183 //===========================================================================================================================
184
185 STDMETHODIMP ExplorerBar::GetWindow( HWND *outWindow )
186 {
187 *outWindow = mWindow.GetSafeHwnd();
188 return( S_OK );
189 }
190
191 //===========================================================================================================================
192 // ContextSensitiveHelp
193 //===========================================================================================================================
194
195 STDMETHODIMP ExplorerBar::ContextSensitiveHelp( BOOL inEnterMode )
196 {
197 DEBUG_UNUSED( inEnterMode );
198
199 return( E_NOTIMPL );
200 }
201
202 #if 0
203 #pragma mark -
204 #pragma mark == IDockingWindow implementation ==
205 #endif
206
207 //===========================================================================================================================
208 // ShowDW
209 //===========================================================================================================================
210
211 STDMETHODIMP ExplorerBar::ShowDW( BOOL inShow )
212 {
213 if( mWindow.GetSafeHwnd() )
214 {
215 mWindow.ShowWindow( inShow ? SW_SHOW : SW_HIDE );
216 }
217 return( S_OK );
218 }
219
220 //===========================================================================================================================
221 // CloseDW
222 //===========================================================================================================================
223
224 STDMETHODIMP ExplorerBar::CloseDW( DWORD inReserved )
225 {
226 DEBUG_UNUSED( inReserved );
227
228 ShowDW( FALSE );
229 if( mWindow.GetSafeHwnd() )
230 {
231 mWindow.SendMessage( WM_CLOSE );
232 }
233 return( S_OK );
234 }
235
236 //===========================================================================================================================
237 // ResizeBorderDW
238 //===========================================================================================================================
239
240 STDMETHODIMP ExplorerBar::ResizeBorderDW( LPCRECT inBorder, IUnknown *inPunkSite, BOOL inReserved )
241 {
242 DEBUG_UNUSED( inBorder );
243 DEBUG_UNUSED( inPunkSite );
244 DEBUG_UNUSED( inReserved );
245
246 return( E_NOTIMPL );
247 }
248
249 #if 0
250 #pragma mark -
251 #pragma mark == IDeskBand implementation ==
252 #endif
253
254 //===========================================================================================================================
255 // GetBandInfo
256 //===========================================================================================================================
257
258 STDMETHODIMP ExplorerBar::GetBandInfo( DWORD inBandID, DWORD inViewMode, DESKBANDINFO *outInfo )
259 {
260 HRESULT err;
261
262 require_action( outInfo, exit, err = E_INVALIDARG );
263
264 mBandID = inBandID;
265 mViewMode = inViewMode;
266
267 if( outInfo->dwMask & DBIM_MINSIZE )
268 {
269 outInfo->ptMinSize.x = 100;
270 outInfo->ptMinSize.y = 100;
271 }
272 if( outInfo->dwMask & DBIM_MAXSIZE )
273 {
274 // Unlimited max size.
275
276 outInfo->ptMaxSize.x = -1;
277 outInfo->ptMaxSize.y = -1;
278 }
279 if( outInfo->dwMask & DBIM_INTEGRAL )
280 {
281 outInfo->ptIntegral.x = 1;
282 outInfo->ptIntegral.y = 1;
283 }
284 if( outInfo->dwMask & DBIM_ACTUAL )
285 {
286 outInfo->ptActual.x = 0;
287 outInfo->ptActual.y = 0;
288 }
289 if( outInfo->dwMask & DBIM_TITLE )
290 {
291 CString s;
292 BOOL ok;
293
294 ok = s.LoadString( IDS_NAME );
295 require_action( ok, exit, err = kNoResourcesErr );
296
297 #ifdef UNICODE
298 lstrcpyn( outInfo->wszTitle, s, sizeof_array( outInfo->wszTitle ) );
299 #else
300 DWORD nChars;
301
302 nChars = MultiByteToWideChar( CP_ACP, 0, s, -1, outInfo->wszTitle, sizeof_array( outInfo->wszTitle ) );
303 err = translate_errno( nChars > 0, (OSStatus) GetLastError(), kUnknownErr );
304 require_noerr( err, exit );
305 #endif
306 }
307 if( outInfo->dwMask & DBIM_MODEFLAGS )
308 {
309 outInfo->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
310 }
311
312 // Force the default background color.
313
314 outInfo->dwMask &= ~DBIM_BKCOLOR;
315 err = S_OK;
316
317 exit:
318 return( err );
319 }
320
321 #if 0
322 #pragma mark -
323 #pragma mark == IInputObject implementation ==
324 #endif
325
326 //===========================================================================================================================
327 // UIActivateIO
328 //===========================================================================================================================
329
330 STDMETHODIMP ExplorerBar::UIActivateIO( BOOL inActivate, LPMSG inMsg )
331 {
332 DEBUG_UNUSED( inMsg );
333
334 if( inActivate )
335 {
336 mWindow.SetFocus();
337 }
338 return( S_OK );
339 }
340
341 //===========================================================================================================================
342 // HasFocusIO
343 //===========================================================================================================================
344
345 STDMETHODIMP ExplorerBar::HasFocusIO( void )
346 {
347 if( mWindow.GetFocus()->GetSafeHwnd() == mWindow.GetSafeHwnd() )
348 {
349 return( S_OK );
350 }
351 return( S_FALSE );
352 }
353
354 //===========================================================================================================================
355 // TranslateAcceleratorIO
356 //===========================================================================================================================
357
358 STDMETHODIMP ExplorerBar::TranslateAcceleratorIO( LPMSG inMsg )
359 {
360 DEBUG_UNUSED( inMsg );
361
362 return( S_FALSE );
363 }
364
365 #if 0
366 #pragma mark -
367 #pragma mark == IObjectWithSite implementation ==
368 #endif
369
370 //===========================================================================================================================
371 // SetSite
372 //===========================================================================================================================
373
374 STDMETHODIMP ExplorerBar::SetSite( IUnknown *inPunkSite )
375 {
376 AFX_MANAGE_STATE( AfxGetStaticModuleState() );
377
378 HRESULT err;
379
380 // Release the old interfaces.
381
382 if( mWebBrowser )
383 {
384 mWebBrowser->Release();
385 mWebBrowser = NULL;
386 }
387 if( mSite )
388 {
389 mSite->Release();
390 mSite = NULL;
391 }
392
393 // A non-NULL site means we're setting the site. Otherwise, the site is being released (done above).
394
395 if( !inPunkSite )
396 {
397 err = S_OK;
398 goto exit;
399 }
400
401 // Get the parent window.
402
403 IOleWindow * oleWindow;
404
405 mParentWindow = NULL;
406 err = inPunkSite->QueryInterface( IID_IOleWindow, (LPVOID *) &oleWindow );
407 require( SUCCEEDED( err ), exit );
408
409 err = oleWindow->GetWindow( &mParentWindow );
410 oleWindow->Release();
411 require_noerr( err, exit );
412 require_action( mParentWindow, exit, err = E_FAIL );
413
414 // Get the IInputObject interface.
415
416 err = inPunkSite->QueryInterface( IID_IInputObjectSite, (LPVOID *) &mSite );
417 require( SUCCEEDED( err ), exit );
418 check( mSite );
419
420 // Get the IWebBrowser2 interface.
421
422 IOleCommandTarget * oleCommandTarget;
423
424 err = inPunkSite->QueryInterface( IID_IOleCommandTarget, (LPVOID *) &oleCommandTarget );
425 require( SUCCEEDED( err ), exit );
426
427 IServiceProvider * serviceProvider;
428
429 err = oleCommandTarget->QueryInterface( IID_IServiceProvider, (LPVOID *) &serviceProvider );
430 oleCommandTarget->Release();
431 require( SUCCEEDED( err ), exit );
432
433 err = serviceProvider->QueryService( SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID *) &mWebBrowser );
434 serviceProvider->Release();
435 require( SUCCEEDED( err ), exit );
436
437 // Create the main window.
438
439 err = SetupWindow();
440 require_noerr( err, exit );
441
442 exit:
443 return( err );
444 }
445
446 //===========================================================================================================================
447 // GetSite
448 //===========================================================================================================================
449
450 STDMETHODIMP ExplorerBar::GetSite( REFIID inID, LPVOID *outResult )
451 {
452 HRESULT err;
453
454 *outResult = NULL;
455 require_action( mSite, exit, err = E_FAIL );
456
457 err = mSite->QueryInterface( inID, outResult );
458
459 exit:
460 return( err );
461 }
462
463 #if 0
464 #pragma mark -
465 #pragma mark == IPersistStream implementation ==
466 #endif
467
468 //
469 // IPersistStream implementation
470 //
471 // This is only supported to allow the desk band to be dropped on the desktop and to prevent multiple instances of
472 // the desk band from showing up in the context menu. This desk band doesn't actually persist any data.
473 //
474
475 //===========================================================================================================================
476 // GetClassID
477 //===========================================================================================================================
478
479 STDMETHODIMP ExplorerBar::GetClassID( LPCLSID outClassID )
480 {
481 *outClassID = CLSID_ExplorerBar;
482 return( S_OK );
483 }
484
485 //===========================================================================================================================
486 // IsDirty
487 //===========================================================================================================================
488
489 STDMETHODIMP ExplorerBar::IsDirty( void )
490 {
491 return( S_FALSE );
492 }
493
494 //===========================================================================================================================
495 // Load
496 //===========================================================================================================================
497
498 STDMETHODIMP ExplorerBar::Load( LPSTREAM inStream )
499 {
500 DEBUG_UNUSED( inStream );
501
502 return( S_OK );
503 }
504
505 //===========================================================================================================================
506 // Save
507 //===========================================================================================================================
508
509 STDMETHODIMP ExplorerBar::Save( LPSTREAM inStream, BOOL inClearDirty )
510 {
511 DEBUG_UNUSED( inStream );
512 DEBUG_UNUSED( inClearDirty );
513
514 return( S_OK );
515 }
516
517 //===========================================================================================================================
518 // GetSizeMax
519 //===========================================================================================================================
520
521 STDMETHODIMP ExplorerBar::GetSizeMax( ULARGE_INTEGER *outSizeMax )
522 {
523 DEBUG_UNUSED( outSizeMax );
524
525 return( E_NOTIMPL );
526 }
527
528 #if 0
529 #pragma mark -
530 #pragma mark == Other ==
531 #endif
532
533 //===========================================================================================================================
534 // SetupWindow
535 //===========================================================================================================================
536
537 OSStatus ExplorerBar::SetupWindow( void )
538 {
539 OSStatus err;
540 CWnd * window;
541 CRect rect;
542 CString s;
543 BOOL ok;
544
545 window = CWnd::FromHandle( mParentWindow );
546 check( window );
547 window->GetClientRect( rect );
548
549 ok = s.LoadString( IDS_NAME );
550 require_action( ok, exit, err = kNoResourcesErr );
551
552 ok = mWindow.Create( NULL, s, WS_CHILD | WS_VISIBLE, rect, window, 100 ) != 0;
553 require_action( ok, exit, err = kNoResourcesErr );
554
555 mWindow.SetOwner( this );
556 err = kNoErr;
557
558 exit:
559 return( err );
560 }
561
562 //===========================================================================================================================
563 // GoToURL
564 //===========================================================================================================================
565
566 OSStatus ExplorerBar::GoToURL( const CString &inURL )
567 {
568 OSStatus err;
569 BSTR s;
570 VARIANT empty;
571
572 s = inURL.AllocSysString();
573 require_action( s, exit, err = kNoMemoryErr );
574
575 VariantInit( &empty );
576 err = mWebBrowser->Navigate( s, &empty, &empty, &empty, &empty );
577 SysFreeString( s );
578 require_noerr( err, exit );
579
580 exit:
581 return( err );
582 }