1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_fpicker.hxx"
26 
27 //------------------------------------------------------------------------
28 // includes
29 //------------------------------------------------------------------------
30 
31 #include <tchar.h>
32 #include <com/sun/star/lang/DisposedException.hpp>
33 #include <cppuhelper/interfacecontainer.h>
34 #include <osl/diagnose.h>
35 
36 #ifndef _FILEPICKER_HXX_
37 #include "filepicker.hxx"
38 #endif
39 #include "WinFileOpenImpl.hxx"
40 
41 #include "FPServiceInfo.hxx"
42 #include "..\misc\WinImplHelper.hxx"
43 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
44 #include "filepickereventnotification.hxx"
45 
46 #include <comphelper/sequenceasvector.hxx>
47 
48 //------------------------------------------------------------------------
49 // namespace directives
50 //------------------------------------------------------------------------
51 
52 using namespace com::sun::star;
53 
54 using namespace ::com::sun::star::ui::dialogs;
55 using namespace ::com::sun::star::ui::dialogs::TemplateDescription;
56 
57 //------------------------------------------------------------------------
58 // defines
59 //------------------------------------------------------------------------
60 
61 #define FILE_PICKER_DLL_NAME  TEXT("fps.dll")
62 
63 //------------------------------------------------------------------------
64 // helper functions
65 //------------------------------------------------------------------------
66 
67 namespace
68 {
69     // controlling event notifications
70     const bool STARTUP_SUSPENDED = true;
71     const bool STARTUP_ALIVE     = false;
72 
FilePicker_getSupportedServiceNames()73 	uno::Sequence<rtl::OUString> SAL_CALL FilePicker_getSupportedServiceNames()
74 	{
75 		uno::Sequence<rtl::OUString> aRet(2);
76         aRet[0] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.FilePicker");
77 		aRet[1] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.SystemFilePicker");
78 		return aRet;
79 	}
80 }
81 
82 //-----------------------------------------------------------------------------------------
83 //
84 //-----------------------------------------------------------------------------------------
85 
CFilePicker(const uno::Reference<lang::XMultiServiceFactory> & xServiceMgr)86 CFilePicker::CFilePicker( const uno::Reference<lang::XMultiServiceFactory>& xServiceMgr) :
87 	cppu::WeakComponentImplHelper10<
88 		XFilterManager,
89         XFilterGroupManager,
90         XFilePickerControlAccess,
91 		XFilePickerNotifier,
92         XFilePreview,
93         XFilePicker2,
94 		lang::XInitialization,
95 		util::XCancellable,
96 		lang::XEventListener,
97 		lang::XServiceInfo>(m_rbHelperMtx),
98 		m_xServiceMgr(xServiceMgr),
99 		m_aAsyncEventNotifier(rBHelper)
100 {
101     HINSTANCE hInstance = GetModuleHandle(FILE_PICKER_DLL_NAME);
102 	OSL_POSTCOND( hInstance, "The name of the service dll must have changed" );
103 
104 	// create a default FileOpen dialog without any additional ui elements
105 	m_pImpl = std::auto_ptr< CWinFileOpenImpl >(
106         new CWinFileOpenImpl(
107             this,
108             true,
109 			0,
110 			0,
111 			hInstance ) );
112 }
113 
114 //------------------------------------------------------------------------------------
115 // XFPEventListenerManager
116 //------------------------------------------------------------------------------------
117 
addFilePickerListener(const uno::Reference<XFilePickerListener> & xListener)118 void SAL_CALL CFilePicker::addFilePickerListener(const uno::Reference<XFilePickerListener>& xListener)
119 	throw(uno::RuntimeException)
120 {
121 	if ( rBHelper.bDisposed )
122 		throw lang::DisposedException(
123 			rtl::OUString::createFromAscii( "object is already disposed" ),
124 			static_cast< XFilePicker2* >( this ) );
125 
126 	if ( !rBHelper.bInDispose && !rBHelper.bDisposed )
127 		rBHelper.aLC.addInterface( getCppuType( &xListener ), xListener );
128 }
129 
130 //-----------------------------------------------------------------------------------------
131 //
132 //-----------------------------------------------------------------------------------------
133 
removeFilePickerListener(const uno::Reference<XFilePickerListener> & xListener)134 void SAL_CALL CFilePicker::removeFilePickerListener(const uno::Reference<XFilePickerListener>& xListener )
135 	throw(uno::RuntimeException)
136 {
137 	if ( rBHelper.bDisposed )
138 		throw lang::DisposedException(
139 			rtl::OUString::createFromAscii( "object is already disposed" ),
140 			static_cast< XFilePicker2* >( this ) );
141 
142 	rBHelper.aLC.removeInterface( getCppuType( &xListener ), xListener );
143 }
144 
145 // -------------------------------------------------
146 // XEventListener
147 // -------------------------------------------------
148 
disposing(const lang::EventObject & aEvent)149 void SAL_CALL CFilePicker::disposing(const lang::EventObject& aEvent) throw(uno::RuntimeException)
150 {
151 	uno::Reference<XFilePickerListener> xFilePickerListener(aEvent.Source, ::com::sun::star::uno::UNO_QUERY);
152 
153 	if (xFilePickerListener.is())
154 		removeFilePickerListener(xFilePickerListener);
155 }
156 
157 //-----------------------------------------------------------------------------------------
158 //
159 //-----------------------------------------------------------------------------------------
160 
fileSelectionChanged(FilePickerEvent aEvent)161 void SAL_CALL CFilePicker::fileSelectionChanged(FilePickerEvent aEvent)
162 {
163 	aEvent.Source = uno::Reference<uno::XInterface>(static_cast<XFilePickerNotifier*>(this));
164 	m_aAsyncEventNotifier.notifyEvent(
165 		new CFilePickerParamEventNotification(&XFilePickerListener::fileSelectionChanged,aEvent));
166 }
167 
168 //-----------------------------------------------------------------------------------------
169 //
170 //-----------------------------------------------------------------------------------------
171 
directoryChanged(FilePickerEvent aEvent)172 void SAL_CALL CFilePicker::directoryChanged(FilePickerEvent aEvent)
173 {
174 	aEvent.Source = uno::Reference<uno::XInterface>(static_cast<XFilePickerNotifier*>(this));
175 	m_aAsyncEventNotifier.notifyEvent(
176 		new CFilePickerParamEventNotification(&XFilePickerListener::directoryChanged,aEvent));
177 }
178 
179 //-----------------------------------------------------------------------------------------
180 //
181 //-----------------------------------------------------------------------------------------
182 
controlStateChanged(FilePickerEvent aEvent)183 void SAL_CALL CFilePicker::controlStateChanged(FilePickerEvent aEvent)
184 {
185 	aEvent.Source = uno::Reference<uno::XInterface>(static_cast<XFilePickerNotifier*>(this));
186 	m_aAsyncEventNotifier.notifyEvent(
187 		new CFilePickerParamEventNotification(&XFilePickerListener::controlStateChanged,aEvent));
188 }
189 
190 //-----------------------------------------------------------------------------------------
191 //
192 //-----------------------------------------------------------------------------------------
193 
dialogSizeChanged()194 void SAL_CALL CFilePicker::dialogSizeChanged()
195 {
196 	m_aAsyncEventNotifier.notifyEvent(
197 		new CFilePickerEventNotification(&XFilePickerListener::dialogSizeChanged));
198 }
199 
200 //-----------------------------------------------------------------------------------------
201 // If there are more then one listener the return value of the last one wins
202 //-----------------------------------------------------------------------------------------
203 
helpRequested(FilePickerEvent aEvent) const204 rtl::OUString SAL_CALL CFilePicker::helpRequested(FilePickerEvent aEvent) const
205 {
206     rtl::OUString aHelpText;
207 
208 	::cppu::OInterfaceContainerHelper* pICHelper =
209 		rBHelper.getContainer( getCppuType((uno::Reference<XFilePickerListener>*)0));
210 
211 	if (pICHelper)
212 	{
213 		::cppu::OInterfaceIteratorHelper iter(*pICHelper);
214 
215 		while(iter.hasMoreElements())
216 		{
217 			try
218 			{
219 				/*
220                   if there are multiple listeners responding
221                   to this notification the next response
222                   overwrittes  the one before if it is not empty
223                 */
224 
225                 rtl::OUString temp;
226 
227 				uno::Reference<XFilePickerListener> xFPListener(iter.next(), uno::UNO_QUERY);
228 				if (xFPListener.is())
229                 {
230 					temp = xFPListener->helpRequested(aEvent);
231                     if (temp.getLength())
232 						aHelpText = temp;
233                 }
234 
235 			}
236 			catch(uno::RuntimeException&)
237 			{
238 				OSL_ENSURE( false, "RuntimeException during event dispatching" );
239 			}
240 		}
241 	}
242 
243     return aHelpText;
244 }
245 
246 //-------------------------------------
247 //
248 //-------------------------------------
249 
startupEventNotification(bool bStartupSuspended)250 bool CFilePicker::startupEventNotification(bool bStartupSuspended)
251 {
252     return m_aAsyncEventNotifier.startup(bStartupSuspended);
253 }
254 
255 //-------------------------------------
256 //
257 //-------------------------------------
258 
shutdownEventNotification()259 void CFilePicker::shutdownEventNotification()
260 {
261     m_aAsyncEventNotifier.shutdown();
262 }
263 
264 //-------------------------------------
265 //
266 //-------------------------------------
267 
suspendEventNotification()268 void CFilePicker::suspendEventNotification()
269 {
270     m_aAsyncEventNotifier.suspend();
271 }
272 
273 //-------------------------------------
274 //
275 //-------------------------------------
276 
resumeEventNotification()277 void CFilePicker::resumeEventNotification()
278 {
279     m_aAsyncEventNotifier.resume();
280 }
281 
282 //------------------------------------------------------------------------------------
283 // XFilePicker functions
284 //------------------------------------------------------------------------------------
285 
setMultiSelectionMode(sal_Bool bMode)286 void SAL_CALL CFilePicker::setMultiSelectionMode(sal_Bool bMode) throw(uno::RuntimeException)
287 {
288 	OSL_ASSERT(0 != m_pImpl.get());
289 	osl::MutexGuard aGuard(m_aMutex);
290 	m_pImpl->setMultiSelectionMode(bMode);
291 }
292 
293 //-----------------------------------------------------------------------------------------
294 //
295 //-----------------------------------------------------------------------------------------
296 
setTitle(const rtl::OUString & aTitle)297 void SAL_CALL CFilePicker::setTitle(const rtl::OUString& aTitle) throw(uno::RuntimeException)
298 {
299 	OSL_ASSERT(0 != m_pImpl.get());
300 	osl::MutexGuard aGuard(m_aMutex);
301 	m_pImpl->setTitle(aTitle);
302 }
303 
304 //-----------------------------------------------------------------------------------------
305 //
306 //-----------------------------------------------------------------------------------------
307 
appendFilter(const rtl::OUString & aTitle,const rtl::OUString & aFilter)308 void SAL_CALL CFilePicker::appendFilter(const rtl::OUString& aTitle, const rtl::OUString& aFilter)
309 	throw(lang::IllegalArgumentException, uno::RuntimeException)
310 {
311 	OSL_ASSERT(0 != m_pImpl.get());
312 	osl::MutexGuard aGuard(m_aMutex);
313 	m_pImpl->appendFilter(aTitle, aFilter);
314 }
315 
316 //-----------------------------------------------------------------------------------------
317 //
318 //-----------------------------------------------------------------------------------------
319 
setCurrentFilter(const rtl::OUString & aTitle)320 void SAL_CALL CFilePicker::setCurrentFilter(const rtl::OUString& aTitle)
321 	throw(lang::IllegalArgumentException, uno::RuntimeException)
322 {
323 	OSL_ASSERT(0 != m_pImpl.get());
324 	osl::MutexGuard aGuard(m_aMutex);
325 	m_pImpl->setCurrentFilter(aTitle);
326 }
327 
328 //-----------------------------------------------------------------------------------------
329 //
330 //-----------------------------------------------------------------------------------------
331 
getCurrentFilter()332 rtl::OUString SAL_CALL CFilePicker::getCurrentFilter() throw(uno::RuntimeException)
333 {
334 	OSL_ASSERT(0 != m_pImpl.get());
335 	osl::MutexGuard aGuard(m_aMutex);
336 	return m_pImpl->getCurrentFilter();
337 }
338 
339 //-----------------------------------------------------------------------------------------
340 //
341 //-----------------------------------------------------------------------------------------
342 
appendFilterGroup(const rtl::OUString & sGroupTitle,const uno::Sequence<beans::StringPair> & aFilters)343 void SAL_CALL CFilePicker::appendFilterGroup(const rtl::OUString& sGroupTitle, const uno::Sequence<beans::StringPair>& aFilters)
344 	throw (lang::IllegalArgumentException, uno::RuntimeException)
345 {
346     OSL_ASSERT(0 != m_pImpl.get());
347 	osl::MutexGuard aGuard(m_aMutex);
348 	m_pImpl->appendFilterGroup(sGroupTitle, aFilters);
349 }
350 
351 //-----------------------------------------------------------------------------------------
352 //
353 //-----------------------------------------------------------------------------------------
354 
setDefaultName(const rtl::OUString & aName)355 void SAL_CALL CFilePicker::setDefaultName(const rtl::OUString& aName)
356 	throw(uno::RuntimeException)
357 {
358 	OSL_ASSERT(0 != m_pImpl.get());
359 	osl::MutexGuard aGuard(m_aMutex);
360 	m_pImpl->setDefaultName(aName);
361 }
362 
363 //-----------------------------------------------------------------------------------------
364 //
365 //-----------------------------------------------------------------------------------------
366 
setDisplayDirectory(const rtl::OUString & aDirectory)367 void SAL_CALL CFilePicker::setDisplayDirectory(const rtl::OUString& aDirectory)
368 	throw(lang::IllegalArgumentException, uno::RuntimeException)
369 {
370 	OSL_ASSERT(0 != m_pImpl.get());
371 	osl::MutexGuard aGuard(m_aMutex);
372 	m_pImpl->setDisplayDirectory(aDirectory);
373 }
374 
375 //-----------------------------------------------------------------------------------------
376 //
377 //-----------------------------------------------------------------------------------------
378 
getDisplayDirectory()379 rtl::OUString SAL_CALL CFilePicker::getDisplayDirectory() throw(uno::RuntimeException)
380 {
381 	OSL_ASSERT(0 != m_pImpl.get());
382 	osl::MutexGuard aGuard(m_aMutex);
383 	return m_pImpl->getDisplayDirectory();
384 }
385 
386 //-----------------------------------------------------------------------------------------
387 //
388 //-----------------------------------------------------------------------------------------
389 
getFiles()390 uno::Sequence<rtl::OUString> SAL_CALL CFilePicker::getFiles() throw(uno::RuntimeException)
391 {
392 	OSL_ASSERT(0 != m_pImpl.get());
393 	osl::MutexGuard aGuard(m_aMutex);
394 	return m_pImpl->getFiles();
395 }
396 
397 //-----------------------------------------------------------------------------------------
398 //
399 //-----------------------------------------------------------------------------------------
getSelectedFiles()400 uno::Sequence< ::rtl::OUString > SAL_CALL CFilePicker::getSelectedFiles() throw (uno::RuntimeException)
401 {
402 	OSL_ASSERT(0 != m_pImpl.get());
403 	osl::MutexGuard aGuard(m_aMutex);
404 
405 	const uno::Sequence< ::rtl::OUString > lSource = m_pImpl->getFiles();
406     const ::sal_Int32                      c       = lSource.getLength();
407     if (c < 2)
408         return lSource;
409 
410 	const ::rtl::OUString                                   sPath  = lSource[0];
411           ::comphelper::SequenceAsVector< ::rtl::OUString > lTarget;
412           ::sal_Int32                                       i      = 1;
413     for (i=1; i<c; ++i)
414 	{
415         const ::rtl::OUString sFile = lSource[i];
416         if (sFile.indexOf ('/') > 0)
417         {
418             // a) file contains own path !
419             lTarget.push_back(sFile);
420         }
421         else
422         {
423             // b) file is relative to given path
424             ::rtl::OUStringBuffer sFull(256);
425 
426             sFull.append     (sPath);
427             sFull.appendAscii("/"  );
428             sFull.append     (sFile);
429 
430             lTarget.push_back(sFull.makeStringAndClear());
431         }
432 	}
433 
434     return lTarget.getAsConstList();
435 }
436 
437 //-----------------------------------------------------------------------------------------
438 //
439 //-----------------------------------------------------------------------------------------
440 
execute()441 sal_Int16 SAL_CALL CFilePicker::execute() throw(uno::RuntimeException)
442 {
443 	OSL_ASSERT(0 != m_pImpl.get());
444 
445 	sal_Int16 ret;
446 
447 	if (startupEventNotification(STARTUP_SUSPENDED))
448 	{
449 		// we should not block in this call else
450 		// in the case of an event the client can't
451 		// call another function an we run into a
452 		// deadlock !!!!!
453 		ret = m_pImpl->execute( );
454 
455 		shutdownEventNotification();
456 	}
457 	else
458 	{
459 		OSL_ENSURE(sal_False, "Could not start event notifier thread!");
460 
461 		throw uno::RuntimeException(
462 			rtl::OUString::createFromAscii("Error executing dialog"),
463 			static_cast<XFilePicker2*>(this));
464 	}
465 
466 	return ret;
467 }
468 
469 //------------------------------------------------------------------------------------
470 // XFilePicker functions
471 //------------------------------------------------------------------------------------
472 
setValue(sal_Int16 aControlId,sal_Int16 aControlAction,const uno::Any & aValue)473 void SAL_CALL CFilePicker::setValue(sal_Int16 aControlId, sal_Int16 aControlAction, const uno::Any& aValue)
474 	throw(uno::RuntimeException)
475 {
476 	OSL_ASSERT(0 != m_pImpl.get());
477 
478     osl::MutexGuard aGuard(m_aMutex);
479 	m_pImpl->setValue(aControlId, aControlAction, aValue);
480 }
481 
482 //-----------------------------------------------------------------------------------------
483 //
484 //-----------------------------------------------------------------------------------------
485 
getValue(sal_Int16 aControlId,sal_Int16 aControlAction)486 uno::Any SAL_CALL CFilePicker::getValue(sal_Int16 aControlId, sal_Int16 aControlAction)
487 	throw(uno::RuntimeException)
488 {
489 	OSL_ASSERT(0 != m_pImpl.get());
490 
491     osl::MutexGuard aGuard(m_aMutex);
492 	return m_pImpl->getValue(aControlId, aControlAction);
493 }
494 
495 //-----------------------------------------------------------------------------------------
496 //
497 //-----------------------------------------------------------------------------------------
498 
enableControl(sal_Int16 aControlId,sal_Bool bEnable)499 void SAL_CALL CFilePicker::enableControl(sal_Int16 aControlId, sal_Bool bEnable)
500 throw(uno::RuntimeException)
501 {
502 	OSL_ASSERT( 0 != m_pImpl.get( ) );
503 
504     osl::MutexGuard aGuard( m_aMutex );
505 	m_pImpl->enableControl( aControlId, bEnable );
506 }
507 
508 //-----------------------------------------------------------------------------------------
509 //
510 //-----------------------------------------------------------------------------------------
511 
setLabel(sal_Int16 aControlId,const::rtl::OUString & aLabel)512 void SAL_CALL CFilePicker::setLabel(sal_Int16 aControlId, const ::rtl::OUString& aLabel)
513 	throw (uno::RuntimeException)
514 {
515     OSL_ASSERT(0 != m_pImpl.get());
516 
517     osl::MutexGuard aGuard(m_aMutex);
518     m_pImpl->setLabel(aControlId, aLabel);
519 }
520 
521 //-----------------------------------------------------------------------------------------
522 //
523 //-----------------------------------------------------------------------------------------
524 
getLabel(sal_Int16 aControlId)525 rtl::OUString SAL_CALL CFilePicker::getLabel(sal_Int16 aControlId)
526 	throw (uno::RuntimeException)
527 {
528     OSL_ASSERT(0 != m_pImpl.get());
529 
530     osl::MutexGuard aGuard(m_aMutex);
531 	return m_pImpl->getLabel(aControlId);
532 }
533 
534 //------------------------------------------------------------------------------------
535 //
536 //------------------------------------------------------------------------------------
537 
getSupportedImageFormats()538 uno::Sequence<sal_Int16> SAL_CALL CFilePicker::getSupportedImageFormats() throw (uno::RuntimeException)
539 {
540     OSL_ASSERT(0 != m_pImpl.get());
541 
542     osl::MutexGuard aGuard(m_aMutex);
543     return m_pImpl->getSupportedImageFormats();
544 }
545 
546 //------------------------------------------------------------------------------------
547 //
548 //------------------------------------------------------------------------------------
549 
getTargetColorDepth()550 sal_Int32 SAL_CALL CFilePicker::getTargetColorDepth() throw (uno::RuntimeException)
551 {
552     OSL_ASSERT(0 != m_pImpl.get());
553 
554     osl::MutexGuard aGuard(m_aMutex);
555     return m_pImpl->getTargetColorDepth();
556 }
557 
558 //------------------------------------------------------------------------------------
559 //
560 //------------------------------------------------------------------------------------
561 
getAvailableWidth()562 sal_Int32 SAL_CALL CFilePicker::getAvailableWidth() throw (uno::RuntimeException)
563 {
564     OSL_ASSERT(0 != m_pImpl.get());
565 
566     osl::MutexGuard aGuard(m_aMutex);
567     return m_pImpl->getAvailableWidth();
568 }
569 
570 //------------------------------------------------------------------------------------
571 //
572 //------------------------------------------------------------------------------------
573 
getAvailableHeight()574 sal_Int32 SAL_CALL CFilePicker::getAvailableHeight() throw (uno::RuntimeException)
575 {
576     OSL_ASSERT(0 != m_pImpl.get());
577 
578     osl::MutexGuard aGuard(m_aMutex);
579     return m_pImpl->getAvailableHeight();
580 }
581 
582 //------------------------------------------------------------------------------------
583 //
584 //------------------------------------------------------------------------------------
585 
setImage(sal_Int16 aImageFormat,const uno::Any & aImage)586 void SAL_CALL CFilePicker::setImage(sal_Int16 aImageFormat, const uno::Any& aImage)
587 	throw (lang::IllegalArgumentException, uno::RuntimeException)
588 {
589     OSL_ASSERT(0 != m_pImpl.get());
590 
591     osl::MutexGuard aGuard(m_aMutex);
592     m_pImpl->setImage(aImageFormat, aImage);
593 }
594 
595 //------------------------------------------------------------------------------------
596 //
597 //------------------------------------------------------------------------------------
598 
setShowState(sal_Bool bShowState)599 sal_Bool SAL_CALL CFilePicker::setShowState(sal_Bool bShowState) throw (uno::RuntimeException)
600 {
601     OSL_ASSERT(0 != m_pImpl.get());
602 
603     osl::MutexGuard aGuard(m_aMutex);
604     return m_pImpl->setShowState(bShowState);
605 }
606 
607 //------------------------------------------------------------------------------------
608 //
609 //------------------------------------------------------------------------------------
610 
getShowState()611 sal_Bool SAL_CALL CFilePicker::getShowState() throw (uno::RuntimeException)
612 {
613     OSL_ASSERT(0 != m_pImpl.get());
614 
615     osl::MutexGuard aGuard(m_aMutex);
616     return m_pImpl->getShowState();
617 }
618 
619 //------------------------------------------------------------------------------------
620 //
621 //------------------------------------------------------------------------------------
622 
initialize(const uno::Sequence<uno::Any> & aArguments)623 void SAL_CALL CFilePicker::initialize(const uno::Sequence<uno::Any>& aArguments)
624 	throw( uno::Exception, uno::RuntimeException)
625 {
626 	// parameter checking
627 	uno::Any aAny;
628 	if ( 0 == aArguments.getLength( ) )
629 		throw lang::IllegalArgumentException(
630 			rtl::OUString::createFromAscii( "no arguments" ),
631 			static_cast<XFilePicker2*>(this), 1);
632 
633     aAny = aArguments[0];
634 
635     if ( (aAny.getValueType() != ::getCppuType((sal_Int16*)0)) &&
636          (aAny.getValueType() != ::getCppuType((sal_Int8*)0)) )
637 		 throw lang::IllegalArgumentException(
638             rtl::OUString::createFromAscii("invalid argument type"),
639             static_cast<XFilePicker2*>(this), 1);
640 
641 	sal_Int16 templateId = -1;
642 	aAny >>= templateId;
643 
644 	sal_Bool   bFileOpenDialog  = sal_True;
645 	sal_uInt32 winResTemplateId = 0;
646 	sal_Bool   bIsWin2000       = IsWindows2000Platform();
647 
648     switch ( templateId )
649     {
650     case FILEOPEN_SIMPLE:
651         bFileOpenDialog = sal_True;
652         break;
653 
654     case FILESAVE_SIMPLE:
655         bFileOpenDialog = sal_False;
656         break;
657 
658     case FILESAVE_AUTOEXTENSION_PASSWORD:
659         bFileOpenDialog = sal_False;
660         if ( bIsWin2000 )
661             winResTemplateId = TMPL2000_FILESAVE_AUTOEXT_PASSWORD_BOX_ID;
662         else
663             winResTemplateId = TMPL95_FILESAVE_AUTOEXT_PASSWORD_BOX_ID;
664         break;
665 
666     case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
667         bFileOpenDialog = sal_False;
668         if ( bIsWin2000 )
669             winResTemplateId = TMPL2000_AUTOEXT_PASSWORD_FILTEROPTION_BOX;
670         else
671             winResTemplateId = TMPL95_AUTOEXT_PASSWORD_FILTEROPTION_BOX;
672         break;
673 
674     case FILESAVE_AUTOEXTENSION_SELECTION:
675         bFileOpenDialog = sal_False;
676         if ( bIsWin2000 )
677             winResTemplateId = TMPL2000_AUTOEXT_SELECTION_BOX;
678         else
679             winResTemplateId = TMPL95_AUTOEXT_SELECTION_BOX;
680         break;
681 
682     case FILESAVE_AUTOEXTENSION_TEMPLATE:
683         bFileOpenDialog = sal_False;
684         if ( bIsWin2000 )
685             winResTemplateId = TMPL2000_FILEOPEN_AUTOEXT_TEMPLATE_BOX_ID;
686         else
687             winResTemplateId = TMPL95_FILEOPEN_AUTOEXT_TEMPLATE_BOX_ID;
688         break;
689 
690     case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE:
691         if ( bIsWin2000 )
692             winResTemplateId = TMPL2000_FILEOPEN_LINK_PREVIEW_BOX_ID;
693         else
694             winResTemplateId = TMPL95_FILEOPEN_LINK_PREVIEW_BOX_ID;
695         break;
696 
697     case FILEOPEN_PLAY:
698         if ( bIsWin2000 )
699             winResTemplateId = TMPL2000_PLAY_PUSHBUTTON;
700         else
701             winResTemplateId = TMPL95_PLAY_PUSHBUTTON;
702         break;
703 
704     case FILEOPEN_READONLY_VERSION:
705         if ( bIsWin2000 )
706             winResTemplateId = TMPL2000_FILEOPEN_READONLY_VERSION_BOX_ID;
707         else
708             winResTemplateId = TMPL95_FILEOPEN_READONLY_VERSION_BOX_ID;
709         break;
710 
711     case FILEOPEN_LINK_PREVIEW:
712         if ( bIsWin2000 )
713             winResTemplateId = TMPL2000_FILEOPEN_LINK_PREVIEW_BOX_SIMPLE_ID;
714         else
715             winResTemplateId = TMPL95_FILEOPEN_LINK_PREVIEW_BOX_SIMPLE_ID;
716         break;
717 
718     case FILESAVE_AUTOEXTENSION:
719         bFileOpenDialog = sal_False;
720         if ( bIsWin2000 )
721             winResTemplateId = TMPL2000_FILESAVE_AUTOEXT;
722         else
723             winResTemplateId = TMPL95_FILESAVE_AUTOEXT;
724         break;
725 
726     default:
727         throw lang::IllegalArgumentException(
728 			rtl::OUString::createFromAscii( "Unknown template" ),
729 			static_cast< XFilePicker2* >( this ),
730 			1 );
731     }
732 
733 	HINSTANCE hInstance = GetModuleHandle( FILE_PICKER_DLL_NAME );
734 	OSL_POSTCOND( hInstance, "The name of the service dll must have changed" );
735 
736 	// create a new impl-class here based on the
737 	// given string, if the given string is empty
738 	// we do nothing
739 	m_pImpl = std::auto_ptr< CWinFileOpenImpl >(
740 		new CWinFileOpenImpl(
741 			this,
742 			bFileOpenDialog,
743 			0,
744 			winResTemplateId,
745 			hInstance ) );
746 }
747 
748 //------------------------------------------------------------------------------------
749 //
750 //------------------------------------------------------------------------------------
751 
cancel()752 void SAL_CALL CFilePicker::cancel()
753 	throw(uno::RuntimeException)
754 {
755     OSL_ASSERT(m_pImpl.get());
756 
757     osl::MutexGuard aGuard(m_aMutex);
758     m_pImpl->cancel();
759 }
760 
761 // -------------------------------------------------
762 // XServiceInfo
763 // -------------------------------------------------
764 
getImplementationName()765 rtl::OUString SAL_CALL CFilePicker::getImplementationName()
766 	throw(uno::RuntimeException)
767 {
768 	return rtl::OUString::createFromAscii(FILE_PICKER_IMPL_NAME);
769 }
770 
771 // -------------------------------------------------
772 //	XServiceInfo
773 // -------------------------------------------------
774 
supportsService(const rtl::OUString & ServiceName)775 sal_Bool SAL_CALL CFilePicker::supportsService(const rtl::OUString& ServiceName)
776 	throw(uno::RuntimeException )
777 {
778 	uno::Sequence <rtl::OUString> SupportedServicesNames = FilePicker_getSupportedServiceNames();
779 
780 	for (sal_Int32 n = SupportedServicesNames.getLength(); n--;)
781 		if (SupportedServicesNames[n].compareTo(ServiceName) == 0)
782 			return sal_True;
783 
784 	return sal_False;
785 }
786 
787 // -------------------------------------------------
788 //	XServiceInfo
789 // -------------------------------------------------
790 
getSupportedServiceNames()791 uno::Sequence<rtl::OUString> SAL_CALL CFilePicker::getSupportedServiceNames()
792 	throw(uno::RuntimeException)
793 {
794 	return FilePicker_getSupportedServiceNames();
795 }
796