diff options
-rw-r--r-- | fpicker/Library_fps.mk | 1 | ||||
-rw-r--r-- | fpicker/source/win32/VistaFilePicker.cxx | 212 | ||||
-rw-r--r-- | fpicker/source/win32/VistaFilePicker.hxx | 10 | ||||
-rw-r--r-- | fpicker/source/win32/VistaFilePickerEventHandler.cxx | 36 | ||||
-rw-r--r-- | fpicker/source/win32/VistaFilePickerImpl.cxx | 307 | ||||
-rw-r--r-- | fpicker/source/win32/VistaFilePickerImpl.hxx | 66 | ||||
-rw-r--r-- | fpicker/source/win32/asyncrequests.cxx | 227 | ||||
-rw-r--r-- | fpicker/source/win32/asyncrequests.hxx | 211 | ||||
-rw-r--r-- | fpicker/source/win32/requests.hxx | 76 |
9 files changed, 334 insertions, 812 deletions
diff --git a/fpicker/Library_fps.mk b/fpicker/Library_fps.mk index e41a8a40a081..047e888e3954 100644 --- a/fpicker/Library_fps.mk +++ b/fpicker/Library_fps.mk @@ -54,7 +54,6 @@ $(eval $(call gb_Library_add_libs,fps,\ endif $(eval $(call gb_Library_add_exception_objects,fps,\ - fpicker/source/win32/asyncrequests \ fpicker/source/win32/FilterContainer \ fpicker/source/win32/VistaFilePicker \ fpicker/source/win32/VistaFilePickerEventHandler \ diff --git a/fpicker/source/win32/VistaFilePicker.cxx b/fpicker/source/win32/VistaFilePicker.cxx index e391bcf53c58..367f938dd3a6 100644 --- a/fpicker/source/win32/VistaFilePicker.cxx +++ b/fpicker/source/win32/VistaFilePicker.cxx @@ -19,8 +19,6 @@ #include <sal/config.h> -#include <memory> - #include "VistaFilePicker.hxx" #include "WinImplHelper.hxx" @@ -36,7 +34,6 @@ #include <cppuhelper/interfacecontainer.h> #include <cppuhelper/supportsservice.hxx> #include <comphelper/processfactory.hxx> -#include <osl/mutex.hxx> #include <osl/file.hxx> #include <officecfg/Office/Common.hxx> @@ -48,9 +45,6 @@ namespace vista{ VistaFilePicker::VistaFilePicker(bool bFolderPicker) : TVistaFilePickerBase (m_aMutex ) - , m_rDialog (std::make_shared<VistaFilePickerImpl>()) - , m_aAsyncExecute (m_rDialog ) - , m_nFilePickerThreadId (0 ) , m_bInitialized (false ) , m_bFolderPicker (bFolderPicker ) { @@ -62,20 +56,20 @@ VistaFilePicker::~VistaFilePicker() void SAL_CALL VistaFilePicker::addFilePickerListener(const css::uno::Reference< css::ui::dialogs::XFilePickerListener >& xListener) { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_ADD_PICKER_LISTENER); - rRequest->setArgument(PROP_PICKER_LISTENER, xListener); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_ADD_PICKER_LISTENER); + rRequest.setArgument(PROP_PICKER_LISTENER, xListener); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + m_rDialog.doRequest(rRequest); } void SAL_CALL VistaFilePicker::removeFilePickerListener(const css::uno::Reference< css::ui::dialogs::XFilePickerListener >& xListener ) { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_REMOVE_PICKER_LISTENER); - rRequest->setArgument(PROP_PICKER_LISTENER, xListener); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_REMOVE_PICKER_LISTENER); + rRequest.setArgument(PROP_PICKER_LISTENER, xListener); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + m_rDialog.doRequest(rRequest); } void VistaFilePicker::disposing(const css::lang::EventObject& /*aEvent*/) @@ -86,95 +80,95 @@ void SAL_CALL VistaFilePicker::setMultiSelectionMode(sal_Bool bMode) { ensureInit(); - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_SET_MULTISELECTION_MODE); - rRequest->setArgument(PROP_MULTISELECTION_MODE, bMode); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_SET_MULTISELECTION_MODE); + rRequest.setArgument(PROP_MULTISELECTION_MODE, bMode); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + m_rDialog.doRequest(rRequest); } void SAL_CALL VistaFilePicker::setTitle(const OUString& sTitle) { ensureInit(); - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_SET_TITLE); - rRequest->setArgument(PROP_TITLE, sTitle); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_SET_TITLE); + rRequest.setArgument(PROP_TITLE, sTitle); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + m_rDialog.doRequest(rRequest); } void SAL_CALL VistaFilePicker::appendFilter(const OUString& sTitle , const OUString& sFilter) { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_APPEND_FILTER); - rRequest->setArgument(PROP_FILTER_TITLE, sTitle ); - rRequest->setArgument(PROP_FILTER_VALUE, sFilter); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_APPEND_FILTER); + rRequest.setArgument(PROP_FILTER_TITLE, sTitle ); + rRequest.setArgument(PROP_FILTER_VALUE, sFilter); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + m_rDialog.doRequest(rRequest); } void SAL_CALL VistaFilePicker::setCurrentFilter(const OUString& sTitle) { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_SET_CURRENT_FILTER); - rRequest->setArgument(PROP_FILTER_TITLE, sTitle); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_SET_CURRENT_FILTER); + rRequest.setArgument(PROP_FILTER_TITLE, sTitle); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + m_rDialog.doRequest(rRequest); } OUString SAL_CALL VistaFilePicker::getCurrentFilter() { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_GET_CURRENT_FILTER); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_GET_CURRENT_FILTER); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::BLOCKED); + m_rDialog.doRequest(rRequest); - const OUString sTitle = rRequest->getArgumentOrDefault(PROP_FILTER_TITLE, OUString()); + const OUString sTitle = rRequest.getArgumentOrDefault(PROP_FILTER_TITLE, OUString()); return sTitle; } void SAL_CALL VistaFilePicker::appendFilterGroup(const OUString& /*sGroupTitle*/, const css::uno::Sequence< css::beans::StringPair >& rFilters ) { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_APPEND_FILTERGROUP); - rRequest->setArgument(PROP_FILTER_GROUP, rFilters); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_APPEND_FILTERGROUP); + rRequest.setArgument(PROP_FILTER_GROUP, rFilters); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + m_rDialog.doRequest(rRequest); } void SAL_CALL VistaFilePicker::setDefaultName(const OUString& sName ) { ensureInit(); - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_SET_DEFAULT_NAME); - rRequest->setArgument(PROP_FILENAME, sName); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_SET_DEFAULT_NAME); + rRequest.setArgument(PROP_FILENAME, sName); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + m_rDialog.doRequest(rRequest); } void SAL_CALL VistaFilePicker::setDisplayDirectory(const OUString& sDirectory) { ensureInit(); - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_SET_DIRECTORY); - rRequest->setArgument(PROP_DIRECTORY, sDirectory); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_SET_DIRECTORY); + rRequest.setArgument(PROP_DIRECTORY, sDirectory); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + m_rDialog.doRequest(rRequest); } OUString SAL_CALL VistaFilePicker::getDisplayDirectory() { ensureInit(); - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_GET_DIRECTORY); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::BLOCKED); - const OUString sDirectory = rRequest->getArgumentOrDefault(PROP_DIRECTORY, OUString()); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_GET_DIRECTORY); + m_rDialog.doRequest(rRequest); + const OUString sDirectory = rRequest.getArgumentOrDefault(PROP_DIRECTORY, OUString()); return sDirectory; } @@ -193,37 +187,26 @@ css::uno::Sequence< OUString > SAL_CALL VistaFilePicker::getFiles() css::uno::Sequence< OUString > SAL_CALL VistaFilePicker::getSelectedFiles() { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_GET_SELECTED_FILES); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_GET_SELECTED_FILES); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::BLOCKED); + m_rDialog.doRequest(rRequest); - const css::uno::Sequence< OUString > lFiles = rRequest->getArgumentOrDefault(PROP_SELECTED_FILES, css::uno::Sequence< OUString >()); + const css::uno::Sequence< OUString > lFiles = rRequest.getArgumentOrDefault(PROP_SELECTED_FILES, css::uno::Sequence< OUString >()); m_lLastFiles = lFiles; return lFiles; } void VistaFilePicker::ensureInit() { - bool bInitialized(false); - { - osl::MutexGuard aGuard(m_aMutex); - bInitialized = m_bInitialized; - } - - if ( !bInitialized ) + if ( !m_bInitialized ) { if (m_bFolderPicker) { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_CREATE_FOLDER_PICKER); - if ( ! m_aAsyncExecute.isRunning()) - m_aAsyncExecute.create(); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); - { - osl::MutexGuard aGuard(m_aMutex); - m_bInitialized = true; - } + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_CREATE_FOLDER_PICKER); + m_rDialog.doRequest(rRequest); + m_bInitialized = true; } else { @@ -238,14 +221,14 @@ void VistaFilePicker::ensureInit() { ensureInit(); - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_SHOW_DIALOG_MODAL); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_SHOW_DIALOG_MODAL); - // if we want to show a modal window, the calling thread needs to process messages - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::PROCESS_MESSAGES); + // show a modal window + m_rDialog.doRequest(rRequest); - const bool bOK = rRequest->getArgumentOrDefault(PROP_DIALOG_SHOW_RESULT, false ); - m_lLastFiles = rRequest->getArgumentOrDefault(PROP_SELECTED_FILES , css::uno::Sequence< OUString >()); + const bool bOK = rRequest.getArgumentOrDefault(PROP_DIALOG_SHOW_RESULT, false ); + m_lLastFiles = rRequest.getArgumentOrDefault(PROP_SELECTED_FILES , css::uno::Sequence< OUString >()); ::sal_Int16 nResult = css::ui::dialogs::ExecutableDialogResults::CANCEL; if (bOK) @@ -259,57 +242,57 @@ void SAL_CALL VistaFilePicker::setValue( ::sal_Int16 nControlId , ::sal_Int16 nControlAction, const css::uno::Any& aValue ) { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_SET_CONTROL_VALUE); - rRequest->setArgument(PROP_CONTROL_ID , nControlId ); - rRequest->setArgument(PROP_CONTROL_ACTION, nControlAction); - rRequest->setArgument(PROP_CONTROL_VALUE , aValue ); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_SET_CONTROL_VALUE); + rRequest.setArgument(PROP_CONTROL_ID , nControlId ); + rRequest.setArgument(PROP_CONTROL_ACTION, nControlAction); + rRequest.setArgument(PROP_CONTROL_VALUE , aValue ); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + m_rDialog.doRequest(rRequest); } css::uno::Any SAL_CALL VistaFilePicker::getValue(::sal_Int16 nControlId , ::sal_Int16 nControlAction) { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_GET_CONTROL_VALUE); - rRequest->setArgument(PROP_CONTROL_ID , nControlId ); - rRequest->setArgument(PROP_CONTROL_ACTION, nControlAction); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_GET_CONTROL_VALUE); + rRequest.setArgument(PROP_CONTROL_ID , nControlId ); + rRequest.setArgument(PROP_CONTROL_ACTION, nControlAction); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::BLOCKED); - return rRequest->getValue(PROP_CONTROL_VALUE); + m_rDialog.doRequest(rRequest); + return rRequest.getValue(PROP_CONTROL_VALUE); } void SAL_CALL VistaFilePicker::enableControl(::sal_Int16 nControlId, sal_Bool bEnable ) { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_ENABLE_CONTROL); - rRequest->setArgument(PROP_CONTROL_ID , nControlId); - rRequest->setArgument(PROP_CONTROL_ENABLE, bEnable ); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_ENABLE_CONTROL); + rRequest.setArgument(PROP_CONTROL_ID , nControlId); + rRequest.setArgument(PROP_CONTROL_ENABLE, bEnable ); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + m_rDialog.doRequest(rRequest); } void SAL_CALL VistaFilePicker::setLabel( ::sal_Int16 nControlId, const OUString& sLabel ) { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_SET_CONTROL_LABEL); - rRequest->setArgument(PROP_CONTROL_ID , nControlId); - rRequest->setArgument(PROP_CONTROL_LABEL, sLabel ); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_SET_CONTROL_LABEL); + rRequest.setArgument(PROP_CONTROL_ID , nControlId); + rRequest.setArgument(PROP_CONTROL_LABEL, sLabel ); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + m_rDialog.doRequest(rRequest); } OUString SAL_CALL VistaFilePicker::getLabel(::sal_Int16 nControlId) { - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (VistaFilePickerImpl::E_GET_CONTROL_LABEL); - rRequest->setArgument(PROP_CONTROL_ID, nControlId); + Request rRequest; + rRequest.setRequest (VistaFilePickerImpl::E_GET_CONTROL_LABEL); + rRequest.setArgument(PROP_CONTROL_ID, nControlId); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::BLOCKED); - const OUString sLabel = rRequest->getArgumentOrDefault(PROP_CONTROL_LABEL, OUString()); + m_rDialog.doRequest(rRequest); + const OUString sLabel = rRequest.getArgumentOrDefault(PROP_CONTROL_LABEL, OUString()); return sLabel; } @@ -479,23 +462,18 @@ void SAL_CALL VistaFilePicker::initialize(const css::uno::Sequence< css::uno::An { lArguments[1] >>= xParentWindow; } - RequestRef rRequest = std::make_shared<Request>(); + Request rRequest; if (bFileOpenDialog) - rRequest->setRequest (VistaFilePickerImpl::E_CREATE_OPEN_DIALOG); + rRequest.setRequest (VistaFilePickerImpl::E_CREATE_OPEN_DIALOG); else - rRequest->setRequest (VistaFilePickerImpl::E_CREATE_SAVE_DIALOG); - rRequest->setArgument(PROP_FEATURES, nFeatures); - rRequest->setArgument(PROP_TEMPLATE_DESCR, nTemplate); + rRequest.setRequest (VistaFilePickerImpl::E_CREATE_SAVE_DIALOG); + rRequest.setArgument(PROP_FEATURES, nFeatures); + rRequest.setArgument(PROP_TEMPLATE_DESCR, nTemplate); if(xParentWindow.is()) - rRequest->setArgument(PROP_PARENT_WINDOW, xParentWindow); - if ( ! m_aAsyncExecute.isRunning()) - m_aAsyncExecute.create(); - m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); + rRequest.setArgument(PROP_PARENT_WINDOW, xParentWindow); + m_rDialog.doRequest(rRequest); - { - osl::MutexGuard aGuard(m_aMutex); - m_bInitialized = true; - } + m_bInitialized = true; } void SAL_CALL VistaFilePicker::cancel() diff --git a/fpicker/source/win32/VistaFilePicker.hxx b/fpicker/source/win32/VistaFilePicker.hxx index 026c0e859c09..db4235a1dc5f 100644 --- a/fpicker/source/win32/VistaFilePicker.hxx +++ b/fpicker/source/win32/VistaFilePicker.hxx @@ -19,7 +19,7 @@ #pragma once -#include "asyncrequests.hxx" +#include "requests.hxx" #include "VistaFilePickerImpl.hxx" #include "VistaFilePickerEventHandler.hxx" @@ -211,13 +211,7 @@ public: css::uno::Sequence< OUString > m_lLastFiles; - /** execute the COM dialog within a STA thread - * Must be used on the heap ... because it's implemented as OSL thread .-) - */ - RequestHandlerRef m_rDialog; - AsyncRequests m_aAsyncExecute; - - oslThreadIdentifier m_nFilePickerThreadId; + VistaFilePickerImpl m_rDialog; bool m_bInitialized; const bool m_bFolderPicker; diff --git a/fpicker/source/win32/VistaFilePickerEventHandler.cxx b/fpicker/source/win32/VistaFilePickerEventHandler.cxx index c4a231164ef8..74e7682392c4 100644 --- a/fpicker/source/win32/VistaFilePickerEventHandler.cxx +++ b/fpicker/source/win32/VistaFilePickerEventHandler.cxx @@ -19,11 +19,9 @@ #include <sal/config.h> -#include <memory> - #include "VistaFilePickerEventHandler.hxx" -#include "asyncrequests.hxx" +#include "requests.hxx" #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/embed/XStorage.hpp> @@ -238,21 +236,18 @@ const OUStringLiteral PROP_PICKER_LISTENER = u"picker_listener"; namespace { -class AsyncPickerEvents : public RequestHandler +class PickerEvents { public: - AsyncPickerEvents() - {} - - virtual void before() override + PickerEvents() {} - virtual void doRequest(const RequestRef& rRequest) override + void doRequest(Request& rRequest) { - const ::sal_Int32 nEventID = rRequest->getRequest(); - const ::sal_Int16 nControlID = rRequest->getArgumentOrDefault(PROP_CONTROL_ID, ::sal_Int16(0)); - const css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener = rRequest->getArgumentOrDefault(PROP_PICKER_LISTENER, css::uno::Reference< css::ui::dialogs::XFilePickerListener >()); + const ::sal_Int32 nEventID = rRequest.getRequest(); + const ::sal_Int16 nControlID = rRequest.getArgumentOrDefault(PROP_CONTROL_ID, ::sal_Int16(0)); + const css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener = rRequest.getArgumentOrDefault(PROP_PICKER_LISTENER, css::uno::Reference< css::ui::dialogs::XFilePickerListener >()); if ( ! xListener.is()) return; @@ -285,9 +280,6 @@ public: // no default here. Let compiler detect changes on enum set ! } } - - virtual void after() override - {} }; } @@ -295,8 +287,7 @@ public: void VistaFilePickerEventHandler::impl_sendEvent( EEventType eEventType, ::sal_Int16 nControlID) { - // See special handling in ~AsyncRequests for this static - static AsyncRequests aNotify(std::make_shared<AsyncPickerEvents>()); + static PickerEvents aNotify; ::cppu::OInterfaceContainerHelper* pContainer = m_lListener.getContainer( cppu::UnoType<css::ui::dialogs::XFilePickerListener>::get()); if ( ! pContainer) @@ -309,14 +300,13 @@ void VistaFilePickerEventHandler::impl_sendEvent( EEventType eEventType, { css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener (pIterator.next(), css::uno::UNO_QUERY); - RequestRef rRequest = std::make_shared<Request>(); - rRequest->setRequest (eEventType); - rRequest->setArgument(PROP_PICKER_LISTENER, xListener); + Request rRequest; + rRequest.setRequest (eEventType); + rRequest.setArgument(PROP_PICKER_LISTENER, xListener); if ( nControlID ) - rRequest->setArgument(PROP_CONTROL_ID, nControlID); + rRequest.setArgument(PROP_CONTROL_ID, nControlID); - aNotify.triggerRequestDirectly(rRequest); - //aNotify.triggerRequestNonBlocked(rRequest); + aNotify.doRequest(rRequest); } catch(const css::uno::RuntimeException&) { diff --git a/fpicker/source/win32/VistaFilePickerImpl.cxx b/fpicker/source/win32/VistaFilePickerImpl.cxx index 5e275e4657c8..0c1518b9527c 100644 --- a/fpicker/source/win32/VistaFilePickerImpl.cxx +++ b/fpicker/source/win32/VistaFilePickerImpl.cxx @@ -34,7 +34,6 @@ #include <fpicker/strings.hrc> #include <fpsofficeResMgr.hxx> #include <osl/file.hxx> -#include <osl/mutex.hxx> #include <rtl/process.h> #include <o3tl/char16_t2wchar_t.hxx> #include "WinImplHelper.hxx" @@ -112,10 +111,13 @@ public: virtual sal::systools::COMReference<IShellItemArray> getResult(bool bInExecute) { sal::systools::COMReference<IShellItem> iItem; - if (bInExecute) - m_iDialog->GetCurrentSelection(&iItem); - else - m_iDialog->GetResult(&iItem); + if (m_iDialog.is()) + { + if (bInExecute) + m_iDialog->GetCurrentSelection(&iItem); + else + m_iDialog->GetResult(&iItem); + } void* iItems = nullptr; if (iItem.is()) SHCreateShellItemArrayFromShellItem(iItem.get(), IID_IShellItemArray, &iItems); @@ -144,8 +146,15 @@ public: { sal::systools::COMReference<IShellItemArray> iItems; TFileOpenDialog iDialog(getComPtr(), sal::systools::COM_QUERY_THROW); - if (FAILED(bInExecute ? iDialog->GetSelectedItems(&iItems) : iDialog->GetResults(&iItems))) + bool bGetResult = false; + if (!iDialog.is()) + bGetResult = true; + else if (FAILED(bInExecute ? iDialog->GetSelectedItems(&iItems) : iDialog->GetResults(&iItems))) + bGetResult = true; + + if (bGetResult) iItems = TDialogImplBase::getResult(bInExecute); + return iItems; } }; @@ -249,7 +258,6 @@ VistaFilePickerImpl::VistaFilePickerImpl() , m_hParentWindow(nullptr) , m_sDirectory () , m_sFilename () - , mnNbCallCoInitializeExForReinit(0) { } @@ -259,24 +267,11 @@ VistaFilePickerImpl::~VistaFilePickerImpl() } -void VistaFilePickerImpl::before() -{ - // SYNCHRONIZED-> - osl::MutexGuard aLock(m_aMutex); - - // TRICKY .-) - // osl::Thread class initializes COm already in MTA mode because it's needed - // by VCL and UNO so. There is no way to change that from outside... - // but we need a STA environment... - o3tl::safeCoInitializeEx(COINIT_APARTMENTTHREADED, mnNbCallCoInitializeExForReinit); -} - - -void VistaFilePickerImpl::doRequest(const RequestRef& rRequest) +void VistaFilePickerImpl::doRequest(Request& rRequest) { try { - switch(rRequest->getRequest()) + switch(rRequest.getRequest()) { case E_ADD_PICKER_LISTENER : impl_sta_addFilePickerListener(rRequest); @@ -374,73 +369,47 @@ void VistaFilePickerImpl::doRequest(const RequestRef& rRequest) } -void VistaFilePickerImpl::after() -{ - o3tl::safeCoUninitializeReinit(COINIT_MULTITHREADED, mnNbCallCoInitializeExForReinit); -} - - -void VistaFilePickerImpl::impl_sta_addFilePickerListener(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_addFilePickerListener(Request& rRequest) { - // SYNCHRONIZED outside ! - const css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener = rRequest->getArgumentOrDefault(PROP_PICKER_LISTENER, css::uno::Reference< css::ui::dialogs::XFilePickerListener >()); + const css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener = rRequest.getArgumentOrDefault(PROP_PICKER_LISTENER, css::uno::Reference< css::ui::dialogs::XFilePickerListener >()); if ( ! xListener.is()) return; - // SYNCHRONIZED-> - osl::ClearableMutexGuard aLock(m_aMutex); - TFileDialogEvents iHandler = m_iEventHandler; - aLock.clear(); - // <- SYNCHRONIZED - - if (iHandler.is()) + if (m_iEventHandler.is()) { - auto* pHandlerImpl = static_cast<VistaFilePickerEventHandler*>(iHandler.get()); + auto* pHandlerImpl = static_cast<VistaFilePickerEventHandler*>(m_iEventHandler.get()); pHandlerImpl->addFilePickerListener(xListener); } } -void VistaFilePickerImpl::impl_sta_removeFilePickerListener(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_removeFilePickerListener(Request& rRequest) { - // SYNCHRONIZED outside ! - const css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener = rRequest->getArgumentOrDefault(PROP_PICKER_LISTENER, css::uno::Reference< css::ui::dialogs::XFilePickerListener >()); + const css::uno::Reference< css::ui::dialogs::XFilePickerListener > xListener = rRequest.getArgumentOrDefault(PROP_PICKER_LISTENER, css::uno::Reference< css::ui::dialogs::XFilePickerListener >()); if ( ! xListener.is()) return; - // SYNCHRONIZED-> - osl::ClearableMutexGuard aLock(m_aMutex); - TFileDialogEvents iHandler = m_iEventHandler; - aLock.clear(); - // <- SYNCHRONIZED - - if (iHandler.is()) + if (m_iEventHandler.is()) { - auto* pHandlerImpl = static_cast<VistaFilePickerEventHandler*>(iHandler.get()); + auto* pHandlerImpl = static_cast<VistaFilePickerEventHandler*>(m_iEventHandler.get()); pHandlerImpl->removeFilePickerListener(xListener); } } -void VistaFilePickerImpl::impl_sta_appendFilter(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_appendFilter(Request& rRequest) { - const OUString sTitle = rRequest->getArgumentOrDefault(PROP_FILTER_TITLE, OUString()); - const OUString sFilter = rRequest->getArgumentOrDefault(PROP_FILTER_VALUE, OUString()); - - // SYNCHRONIZED-> - osl::MutexGuard aLock(m_aMutex); + const OUString sTitle = rRequest.getArgumentOrDefault(PROP_FILTER_TITLE, OUString()); + const OUString sFilter = rRequest.getArgumentOrDefault(PROP_FILTER_VALUE, OUString()); m_lFilters.addFilter(sTitle, sFilter); } -void VistaFilePickerImpl::impl_sta_appendFilterGroup(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_appendFilterGroup(Request& rRequest) { const css::uno::Sequence< css::beans::StringPair > aFilterGroup = - rRequest->getArgumentOrDefault(PROP_FILTER_GROUP, css::uno::Sequence< css::beans::StringPair >()); - - // SYNCHRONIZED-> - osl::MutexGuard aLock(m_aMutex); + rRequest.getArgumentOrDefault(PROP_FILTER_GROUP, css::uno::Sequence< css::beans::StringPair >()); if ( m_lFilters.numFilter() > 0 && aFilterGroup.getLength() > 0 ) m_lFilters.addFilter( STRING_SEPARATOR, "", true ); @@ -455,20 +424,20 @@ void VistaFilePickerImpl::impl_sta_appendFilterGroup(const RequestRef& rRequest) } -void VistaFilePickerImpl::impl_sta_setCurrentFilter(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_setCurrentFilter(Request& rRequest) { - const OUString sTitle = rRequest->getArgumentOrDefault(PROP_FILTER_TITLE, OUString()); - - // SYNCHRONIZED-> - osl::MutexGuard aLock(m_aMutex); + const OUString sTitle = rRequest.getArgumentOrDefault(PROP_FILTER_TITLE, OUString()); m_lFilters.setCurrentFilter(sTitle); } -void VistaFilePickerImpl::impl_sta_getCurrentFilter(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_getCurrentFilter(Request& rRequest) { TFileDialog iDialog = impl_getBaseDialogInterface(); + if (!iDialog.is()) + return; + UINT nIndex = UINT_MAX; HRESULT hResult = iDialog->GetFileTypeIndex(&nIndex); if ( @@ -477,43 +446,32 @@ void VistaFilePickerImpl::impl_sta_getCurrentFilter(const RequestRef& rRequest) ) return; - // SYNCHRONIZED-> - osl::MutexGuard aLock(m_aMutex); - OUString sTitle; ::sal_Int32 nRealIndex = nIndex-1; // COM dialog base on 1 ... filter container on 0 .-) if ( (nRealIndex >= 0 ) && (m_lFilters.getFilterNameByIndex(nRealIndex, sTitle)) ) - rRequest->setArgument(PROP_FILTER_TITLE, sTitle); + rRequest.setArgument(PROP_FILTER_TITLE, sTitle); else if ( nRealIndex == -1 ) // Dialog not visible yet { sTitle = m_lFilters.getCurrentFilter(); - rRequest->setArgument(PROP_FILTER_TITLE, sTitle); + rRequest.setArgument(PROP_FILTER_TITLE, sTitle); } - // <- SYNCHRONIZED } template <class TDialogImplClass> void VistaFilePickerImpl::impl_sta_CreateDialog() { - // SYNCHRONIZED-> - osl::ClearableMutexGuard aLock(m_aMutex); m_pDialog = std::make_shared<TDialogImplClass>(); } -void VistaFilePickerImpl::impl_sta_InitDialog(const RequestRef& rRequest, DWORD nOrFlags) +void VistaFilePickerImpl::impl_sta_InitDialog(Request& rRequest, DWORD nOrFlags) { - // SYNCHRONIZED-> - osl::ClearableMutexGuard aLock(m_aMutex); - TFileDialog iDialog = impl_getBaseDialogInterface(); - TFileDialogEvents iHandler = m_iEventHandler; - - aLock.clear(); - // <- SYNCHRONIZED + if (!iDialog.is()) + return; DWORD nFlags = 0; iDialog->GetOptions ( &nFlags ); @@ -525,7 +483,7 @@ void VistaFilePickerImpl::impl_sta_InitDialog(const RequestRef& rRequest, DWORD iDialog->SetOptions ( nFlags ); - css::uno::Reference<css::awt::XWindow> xWindow = rRequest->getArgumentOrDefault(PROP_PARENT_WINDOW, css::uno::Reference<css::awt::XWindow>()); + css::uno::Reference<css::awt::XWindow> xWindow = rRequest.getArgumentOrDefault(PROP_PARENT_WINDOW, css::uno::Reference<css::awt::XWindow>()); if(xWindow.is()) { css::uno::Reference<css::awt::XSystemDependentWindowPeer> xSysDepWin(xWindow,css::uno::UNO_QUERY); @@ -537,39 +495,38 @@ void VistaFilePickerImpl::impl_sta_InitDialog(const RequestRef& rRequest, DWORD aAny >>= tmp; if(tmp != 0) { - osl::MutexGuard aLock2(m_aMutex); m_hParentWindow = reinterpret_cast<HWND>(tmp); } } } - ::sal_Int32 nFeatures = rRequest->getArgumentOrDefault(PROP_FEATURES, ::sal_Int32(0)); - ::sal_Int32 nTemplate = rRequest->getArgumentOrDefault(PROP_TEMPLATE_DESCR, ::sal_Int32(0)); + ::sal_Int32 nFeatures = rRequest.getArgumentOrDefault(PROP_FEATURES, ::sal_Int32(0)); + ::sal_Int32 nTemplate = rRequest.getArgumentOrDefault(PROP_TEMPLATE_DESCR, ::sal_Int32(0)); impl_sta_enableFeatures(nFeatures, nTemplate); - if (iHandler.is()) + if (m_iEventHandler.is()) { - auto* pHandlerImpl = static_cast<VistaFilePickerEventHandler*>(iHandler.get()); + auto* pHandlerImpl = static_cast<VistaFilePickerEventHandler*>(m_iEventHandler.get()); pHandlerImpl->startListening(iDialog); } } -void VistaFilePickerImpl::impl_sta_CreateOpenDialog(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_CreateOpenDialog(Request& rRequest) { impl_sta_CreateDialog<TOpenDialogImpl>(); impl_sta_InitDialog(rRequest, FOS_FILEMUSTEXIST | FOS_OVERWRITEPROMPT); } -void VistaFilePickerImpl::impl_sta_CreateSaveDialog(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_CreateSaveDialog(Request& rRequest) { impl_sta_CreateDialog<TSaveDialogImpl>(); impl_sta_InitDialog(rRequest, FOS_FILEMUSTEXIST | FOS_OVERWRITEPROMPT); } -void VistaFilePickerImpl::impl_sta_CreateFolderPicker(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_CreateFolderPicker(Request& rRequest) { impl_sta_CreateDialog<TFolderPickerDialogImpl>(); impl_sta_InitDialog(rRequest, FOS_PICKFOLDERS); @@ -638,9 +595,12 @@ void VistaFilePickerImpl::impl_sta_enableFeatures(::sal_Int32 nFeatures, ::sal_I break; } TFileDialog iDialog = impl_getBaseDialogInterface(); - iDialog->SetClientGuid ( aGUID ); + if (iDialog.is()) + iDialog->SetClientGuid ( aGUID ); TFileDialogCustomize iCustom = impl_getCustomizeInterface(); + if (!iCustom.is()) + return; if ((nFeatures & FEATURE_VERSION) == FEATURE_VERSION) { @@ -739,15 +699,13 @@ void VistaFilePickerImpl::impl_sta_enableFeatures(::sal_Int32 nFeatures, ::sal_I } -void VistaFilePickerImpl::impl_sta_SetMultiSelectionMode(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_SetMultiSelectionMode(Request& rRequest) { - const bool bMultiSelection = rRequest->getArgumentOrDefault(PROP_MULTISELECTION_MODE, true); + const bool bMultiSelection = rRequest.getArgumentOrDefault(PROP_MULTISELECTION_MODE, true); - // SYNCHRONIZED-> - osl::ClearableMutexGuard aLock(m_aMutex); TFileDialog iDialog = impl_getBaseDialogInterface(); - aLock.clear(); - // <- SYNCHRONIZED + if (!iDialog.is()) + return; DWORD nFlags = 0; iDialog->GetOptions(&nFlags); @@ -761,37 +719,33 @@ void VistaFilePickerImpl::impl_sta_SetMultiSelectionMode(const RequestRef& rRequ } -void VistaFilePickerImpl::impl_sta_SetTitle(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_SetTitle(Request& rRequest) { - OUString sTitle = rRequest->getArgumentOrDefault(PROP_TITLE, OUString()); + OUString sTitle = rRequest.getArgumentOrDefault(PROP_TITLE, OUString()); - // SYNCHRONIZED-> - osl::ClearableMutexGuard aLock(m_aMutex); TFileDialog iDialog = impl_getBaseDialogInterface(); - aLock.clear(); - // <- SYNCHRONIZED + if (!iDialog.is()) + return; iDialog->SetTitle(o3tl::toW(sTitle.getStr())); } -void VistaFilePickerImpl::impl_sta_SetFileName(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_SetFileName(Request& rRequest) { - OUString sFileName = rRequest->getArgumentOrDefault(PROP_FILENAME, OUString()); + OUString sFileName = rRequest.getArgumentOrDefault(PROP_FILENAME, OUString()); - // SYNCHRONIZED-> - osl::ClearableMutexGuard aLock(m_aMutex); TFileDialog iDialog = impl_getBaseDialogInterface(); - aLock.clear(); - // <- SYNCHRONIZED + if (!iDialog.is()) + return; iDialog->SetFileName(o3tl::toW(sFileName.getStr())); } -void VistaFilePickerImpl::impl_sta_SetDirectory(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_SetDirectory(Request& rRequest) { - OUString sDirectory = rRequest->getArgumentOrDefault(PROP_DIRECTORY, OUString()); + OUString sDirectory = rRequest.getArgumentOrDefault(PROP_DIRECTORY, OUString()); if( !m_bInExecute) { @@ -803,11 +757,9 @@ void VistaFilePickerImpl::impl_sta_SetDirectory(const RequestRef& rRequest) m_sDirectory = sDirectory; } - // SYNCHRONIZED-> - osl::ClearableMutexGuard aLock(m_aMutex); TFileDialog iDialog = impl_getBaseDialogInterface(); - aLock.clear(); - // <- SYNCHRONIZED + if (!iDialog.is()) + return; sal::systools::COMReference<IShellItem> pFolder; if ( !createFolderItem(sDirectory, pFolder) ) @@ -819,6 +771,8 @@ void VistaFilePickerImpl::impl_sta_SetDirectory(const RequestRef& rRequest) OUString VistaFilePickerImpl::GetDirectory() { TFileDialog iDialog = impl_getBaseDialogInterface(); + if (!iDialog.is()) + return OUString(); sal::systools::COMReference<IShellItem> pFolder; HRESULT hResult = iDialog->GetFolder( &pFolder ); if ( FAILED(hResult) ) @@ -826,17 +780,19 @@ OUString VistaFilePickerImpl::GetDirectory() return lcl_getURLFromShellItem(pFolder.get()); } -void VistaFilePickerImpl::impl_sta_GetDirectory(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_GetDirectory(Request& rRequest) { const OUString sFolder = m_sDirectory.isEmpty() ? GetDirectory() : m_sDirectory; if (!sFolder.isEmpty()) - rRequest->setArgument(PROP_DIRECTORY, sFolder); + rRequest.setArgument(PROP_DIRECTORY, sFolder); } -void VistaFilePickerImpl::impl_sta_SetDefaultName(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_SetDefaultName(Request& rRequest) { - OUString sFilename = rRequest->getArgumentOrDefault(PROP_FILENAME, OUString()); + OUString sFilename = rRequest.getArgumentOrDefault(PROP_FILENAME, OUString()); TFileDialog iDialog = impl_getBaseDialogInterface(); + if (!iDialog.is()) + return; TFileDialogCustomize iCustom = impl_getCustomizeInterface(); if ( ! iCustom.is()) @@ -862,19 +818,17 @@ void VistaFilePickerImpl::impl_sta_SetDefaultName(const RequestRef& rRequest) void VistaFilePickerImpl::impl_sta_setFiltersOnDialog() { - // SYNCHRONIZED-> - osl::ClearableMutexGuard aLock(m_aMutex); - std::vector<OUString> vStrings; // to hold the adjusted filter names, pointers to which will be // stored in lFilters ::std::vector< COMDLG_FILTERSPEC > lFilters = lcl_buildFilterList(m_lFilters, vStrings); OUString sCurrentFilter = m_lFilters.getCurrentFilter(); sal_Int32 nCurrentFilter = m_lFilters.getFilterPos(sCurrentFilter); TFileDialog iDialog = impl_getBaseDialogInterface(); + if (!iDialog.is()) + return; TFileDialogCustomize iCustomize = impl_getCustomizeInterface(); - - aLock.clear(); - // <- SYNCHRONIZED + if (!iCustomize.is()) + return; if (lFilters.empty()) return; @@ -901,23 +855,14 @@ void VistaFilePickerImpl::impl_sta_setFiltersOnDialog() } -void VistaFilePickerImpl::impl_sta_getSelectedFiles(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_getSelectedFiles(Request& rRequest) { - // SYNCHRONIZED-> - osl::ClearableMutexGuard aLock(m_aMutex); - - std::shared_ptr<TDialogImplBase> pDialog(m_pDialog); - bool bInExecute = m_bInExecute; - - aLock.clear(); - // <- SYNCHRONIZED - - if (!pDialog) + if (m_pDialog == nullptr) return; // ask dialog for results // we must react different if dialog is in execute or not .-( - sal::systools::COMReference<IShellItemArray> iItems = pDialog->getResult(bInExecute); + sal::systools::COMReference<IShellItemArray> iItems = m_pDialog->getResult(m_bInExecute); if (!iItems.is()) return; @@ -936,18 +881,17 @@ void VistaFilePickerImpl::impl_sta_getSelectedFiles(const RequestRef& rRequest) } } - rRequest->setArgument(PROP_SELECTED_FILES, comphelper::containerToSequence(lFiles)); + rRequest.setArgument(PROP_SELECTED_FILES, comphelper::containerToSequence(lFiles)); } -void VistaFilePickerImpl::impl_sta_ShowDialogModal(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_ShowDialogModal(Request& rRequest) { impl_sta_setFiltersOnDialog(); - // SYNCHRONIZED-> - ::osl::ResettableMutexGuard aLock(m_aMutex); - TFileDialog iDialog = impl_getBaseDialogInterface(); + if (!iDialog.is()) + return; // it's important to know if we are showing the dialog. // Some dialog interface methods can't be called then or some @@ -956,9 +900,6 @@ void VistaFilePickerImpl::impl_sta_ShowDialogModal(const RequestRef& rRequest) m_bWasExecuted = true; - aLock.clear(); - // <- SYNCHRONIZED - // we set the directory only if we have a save dialog and a filename // for the other cases, the file dialog remembers its last location // according to its client guid. @@ -976,6 +917,8 @@ void VistaFilePickerImpl::impl_sta_ShowDialogModal(const RequestRef& rRequest) aFileURL += m_sFilename; TFileDialogCustomize iCustom = impl_getCustomizeInterface(); + if (!iCustom.is()) + return; BOOL bValue = FALSE; HRESULT hResult = iCustom->GetCheckButtonState( css::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, &bValue); @@ -1016,32 +959,28 @@ void VistaFilePickerImpl::impl_sta_ShowDialogModal(const RequestRef& rRequest) } HRESULT hResult = E_FAIL; - HWND hParentWindow; - { - osl::MutexGuard aLock2(m_aMutex); - // Note that there is a potential race between retrieving and - // using parent window (window might get destroyed) - hParentWindow = m_hParentWindow ? m_hParentWindow : choose_parent_window(); - } try { // show dialog and wait for user decision - hResult = iDialog->Show(hParentWindow); // parent window needed + hResult = iDialog->Show(m_hParentWindow ? m_hParentWindow + : choose_parent_window()); // parent window needed } catch(...) {} - // SYNCHRONIZED-> - aLock.reset(); m_bInExecute = false; - aLock.clear(); - // <- SYNCHRONIZED + + if (m_iEventHandler.is()) + { + auto* pHandlerImpl = static_cast<VistaFilePickerEventHandler*>(m_iEventHandler.get()); + pHandlerImpl->stopListening(); + } if ( FAILED(hResult) ) return; impl_sta_getSelectedFiles(rRequest); - rRequest->setArgument(PROP_DIALOG_SHOW_RESULT, true); + rRequest.setArgument(PROP_DIALOG_SHOW_RESULT, true); } @@ -1049,9 +988,7 @@ TFileDialog VistaFilePickerImpl::impl_getBaseDialogInterface() { TFileDialog iDialog; - // SYNCHRONIZED-> - osl::MutexGuard aLock(m_aMutex); - if (m_pDialog) + if (m_pDialog != nullptr) iDialog = m_pDialog->getComPtr(); return iDialog; @@ -1060,10 +997,7 @@ TFileDialog VistaFilePickerImpl::impl_getBaseDialogInterface() TFileDialogCustomize VistaFilePickerImpl::impl_getCustomizeInterface() { - // SYNCHRONIZED-> - osl::MutexGuard aLock(m_aMutex); - - if (m_pDialog) + if (m_pDialog != nullptr) return { m_pDialog->getComPtr(), sal::systools::COM_QUERY_THROW }; return {}; @@ -1081,11 +1015,11 @@ static void lcl_removeControlItemsWorkaround(const TFileDialogCustomize& iCustom } -void VistaFilePickerImpl::impl_sta_SetControlValue(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_SetControlValue(Request& rRequest) { - ::sal_Int16 nId = rRequest->getArgumentOrDefault(PROP_CONTROL_ID , INVALID_CONTROL_ID ); - ::sal_Int16 nAction = rRequest->getArgumentOrDefault(PROP_CONTROL_ACTION, INVALID_CONTROL_ACTION); - css::uno::Any aValue = rRequest->getValue(PROP_CONTROL_VALUE); + ::sal_Int16 nId = rRequest.getArgumentOrDefault(PROP_CONTROL_ID , INVALID_CONTROL_ID ); + ::sal_Int16 nAction = rRequest.getArgumentOrDefault(PROP_CONTROL_ACTION, INVALID_CONTROL_ACTION); + css::uno::Any aValue = rRequest.getValue(PROP_CONTROL_VALUE); // don't check for right values here ... // most parameters are optional ! @@ -1156,9 +1090,9 @@ void VistaFilePickerImpl::impl_sta_SetControlValue(const RequestRef& rRequest) } -void VistaFilePickerImpl::impl_sta_GetControlValue(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_GetControlValue(Request& rRequest) { - ::sal_Int16 nId = rRequest->getArgumentOrDefault(PROP_CONTROL_ID , INVALID_CONTROL_ID ); + ::sal_Int16 nId = rRequest.getArgumentOrDefault(PROP_CONTROL_ID , INVALID_CONTROL_ID ); // don't check for right values here ... // most parameters are optional ! @@ -1202,14 +1136,14 @@ void VistaFilePickerImpl::impl_sta_GetControlValue(const RequestRef& rRequest) } if (aValue.hasValue()) - rRequest->setArgument(PROP_CONTROL_VALUE, aValue); + rRequest.setArgument(PROP_CONTROL_VALUE, aValue); } -void VistaFilePickerImpl::impl_sta_SetControlLabel(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_SetControlLabel(Request& rRequest) { - ::sal_Int16 nId = rRequest->getArgumentOrDefault(PROP_CONTROL_ID , INVALID_CONTROL_ID ); - OUString sLabel = rRequest->getArgumentOrDefault(PROP_CONTROL_LABEL, OUString() ); + ::sal_Int16 nId = rRequest.getArgumentOrDefault(PROP_CONTROL_ID , INVALID_CONTROL_ID ); + OUString sLabel = rRequest.getArgumentOrDefault(PROP_CONTROL_LABEL, OUString() ); // don't check for right values here ... // most parameters are optional ! @@ -1221,15 +1155,15 @@ void VistaFilePickerImpl::impl_sta_SetControlLabel(const RequestRef& rRequest) } -void VistaFilePickerImpl::impl_sta_GetControlLabel(const RequestRef& /*rRequest*/) +void VistaFilePickerImpl::impl_sta_GetControlLabel(Request& /*rRequest*/) { } -void VistaFilePickerImpl::impl_sta_EnableControl(const RequestRef& rRequest) +void VistaFilePickerImpl::impl_sta_EnableControl(Request& rRequest) { - ::sal_Int16 nId = rRequest->getArgumentOrDefault(PROP_CONTROL_ID , INVALID_CONTROL_ID ); - bool bEnabled = rRequest->getArgumentOrDefault(PROP_CONTROL_ENABLE, true); + ::sal_Int16 nId = rRequest.getArgumentOrDefault(PROP_CONTROL_ID , INVALID_CONTROL_ID ); + bool bEnabled = rRequest.getArgumentOrDefault(PROP_CONTROL_ENABLE, true); // don't check for right values here ... // most parameters are optional ! @@ -1250,6 +1184,9 @@ void VistaFilePickerImpl::impl_sta_EnableControl(const RequestRef& rRequest) void VistaFilePickerImpl::impl_SetDefaultExtension( const OUString& currentFilter ) { TFileDialog iDialog = impl_getBaseDialogInterface(); + if (!iDialog.is()) + return; + if (currentFilter.getLength()) { OUString FilterExt; @@ -1269,18 +1206,14 @@ void VistaFilePickerImpl::impl_SetDefaultExtension( const OUString& currentFilte void VistaFilePickerImpl::onAutoExtensionChanged (bool bChecked) { - // SYNCHRONIZED-> - osl::ClearableMutexGuard aLock(m_aMutex); - const OUString sFilter = m_lFilters.getCurrentFilter (); OUString sExt ; if (!m_lFilters.getFilterByName(sFilter, sExt)) return; TFileDialog iDialog = impl_getBaseDialogInterface(); - - aLock.clear(); - // <- SYNCHRONIZED + if (!iDialog.is()) + return; PCWSTR pExt = nullptr; if ( bChecked ) diff --git a/fpicker/source/win32/VistaFilePickerImpl.hxx b/fpicker/source/win32/VistaFilePickerImpl.hxx index ec7d1e2cddf6..d0eb8e112efa 100644 --- a/fpicker/source/win32/VistaFilePickerImpl.hxx +++ b/fpicker/source/win32/VistaFilePickerImpl.hxx @@ -23,7 +23,7 @@ #include <shobjidl.h> -#include "asyncrequests.hxx" +#include "requests.hxx" #include "vistatypes.h" #include "FilterContainer.hxx" #include "VistaFilePickerEventHandler.hxx" @@ -31,10 +31,8 @@ #include "resourceprovider.hxx" #include <cppuhelper/interfacecontainer.h> -#include <cppuhelper/basemutex.hxx> #include <osl/thread.hxx> #include <osl/conditn.hxx> -#include <o3tl/safeCoInitUninit.hxx> #include <rtl/ustring.hxx> namespace fpicker{ @@ -84,12 +82,10 @@ class TDialogImplBase; /** native implementation of the file picker on Vista and upcoming windows versions. * This dialog uses COM internally. Further it marshall every request so it will - * be executed within its own STA thread ! + * be executed on the main thread which is an STA thread ! */ -class VistaFilePickerImpl : private ::cppu::BaseMutex - , public RequestHandler - , public IVistaFilePickerInternalNotify +class VistaFilePickerImpl : public IVistaFilePickerInternalNotify { public: @@ -131,15 +127,12 @@ class VistaFilePickerImpl : private ::cppu::BaseMutex // ctor/dtor - nothing special VistaFilePickerImpl(); - virtual ~VistaFilePickerImpl() override; + ~VistaFilePickerImpl(); // RequestHandler - - virtual void before() override; - virtual void doRequest(const RequestRef& rRequest) override; - virtual void after() override; + void doRequest(Request& rRequest); // IVistaFilePickerInternalNotify @@ -152,91 +145,91 @@ class VistaFilePickerImpl : private ::cppu::BaseMutex OUString GetDirectory(); /// implementation of request E_ADD_FILEPICKER_LISTENER - void impl_sta_addFilePickerListener(const RequestRef& rRequest); + void impl_sta_addFilePickerListener(Request& rRequest); /// implementation of request E_REMOVE_FILEPICKER_LISTENER - void impl_sta_removeFilePickerListener(const RequestRef& rRequest); + void impl_sta_removeFilePickerListener(Request& rRequest); /// implementation of request E_APPEND_FILTER - void impl_sta_appendFilter(const RequestRef& rRequest); + void impl_sta_appendFilter(Request& rRequest); /// implementation of request E_APPEND_FILTERGROUP - void impl_sta_appendFilterGroup(const RequestRef& rRequest); + void impl_sta_appendFilterGroup(Request& rRequest); /// implementation of request E_SET_CURRENT_FILTER - void impl_sta_setCurrentFilter(const RequestRef& rRequest); + void impl_sta_setCurrentFilter(Request& rRequest); /// implementation of request E_GET_CURRENT_FILTER - void impl_sta_getCurrentFilter(const RequestRef& rRequest); + void impl_sta_getCurrentFilter(Request& rRequest); /// implementation of request E_CREATE_OPEN_DIALOG - void impl_sta_CreateOpenDialog(const RequestRef& rRequest); + void impl_sta_CreateOpenDialog(Request& rRequest); /// implementation of request E_CREATE_SAVE_DIALOG - void impl_sta_CreateSaveDialog(const RequestRef& rRequest); + void impl_sta_CreateSaveDialog(Request& rRequest); /// implementation of request E_CREATE_FOLDER_PICKER - void impl_sta_CreateFolderPicker(const RequestRef& rRequest); + void impl_sta_CreateFolderPicker(Request& rRequest); /// implementation of request E_SET_MULTISELECTION_MODE - void impl_sta_SetMultiSelectionMode(const RequestRef& rRequest); + void impl_sta_SetMultiSelectionMode(Request& rRequest); /// implementation of request E_SET_TITLE - void impl_sta_SetTitle(const RequestRef& rRequest); + void impl_sta_SetTitle(Request& rRequest); /// implementation of request E_SET_FILENAME - void impl_sta_SetFileName(const RequestRef& rRequest); + void impl_sta_SetFileName(Request& rRequest); /// implementation of request E_SET_DIRECTORY - void impl_sta_SetDirectory(const RequestRef& rRequest); + void impl_sta_SetDirectory(Request& rRequest); /// implementation of request E_GET_DIRECTORY - void impl_sta_GetDirectory(const RequestRef& rRequest); + void impl_sta_GetDirectory(Request& rRequest); /// implementation of request E_SET_DEFAULT_NAME - void impl_sta_SetDefaultName(const RequestRef& rRequest); + void impl_sta_SetDefaultName(Request& rRequest); /// implementation of request E_GET_SELECTED_FILES - void impl_sta_getSelectedFiles(const RequestRef& rRequest); + void impl_sta_getSelectedFiles(Request& rRequest); /// implementation of request E_SHOW_DIALOG_MODAL - void impl_sta_ShowDialogModal(const RequestRef& rRequest); + void impl_sta_ShowDialogModal(Request& rRequest); /// implementation of request E_SET_CONTROL_VALUE - void impl_sta_SetControlValue(const RequestRef& rRequest); + void impl_sta_SetControlValue(Request& rRequest); /// implementation of request E_GET_CONTROL_VALUE - void impl_sta_GetControlValue(const RequestRef& rRequest); + void impl_sta_GetControlValue(Request& rRequest); /// implementation of request E_SET_CONTROL_LABEL - void impl_sta_SetControlLabel(const RequestRef& rRequest); + void impl_sta_SetControlLabel(Request& rRequest); /// implementation of request E_GET_CONTROL_LABEL - static void impl_sta_GetControlLabel(const RequestRef& rRequest); + static void impl_sta_GetControlLabel(Request& rRequest); /// implementation of request E_ENABLE_CONTROL - void impl_sta_EnableControl(const RequestRef& rRequest); + void impl_sta_EnableControl(Request& rRequest); /** create all needed (optional!) UI controls addressed by the field nFeatures. * The given number nFeatures is used as a flag field. Use const values FEATURE_XXX @@ -278,7 +271,7 @@ class VistaFilePickerImpl : private ::cppu::BaseMutex private: template <class TDialogImplClass> void impl_sta_CreateDialog(); - void impl_sta_InitDialog(const RequestRef& rRequest, DWORD nOrFlags); + void impl_sta_InitDialog(Request& rRequest, DWORD nOrFlags); /// object representing a file dialog @@ -308,9 +301,6 @@ class VistaFilePickerImpl : private ::cppu::BaseMutex OUString m_sFilename; - - // to put back all the inits with COINIT_MULTITHREADED if needed - int mnNbCallCoInitializeExForReinit; }; } // namespace vista diff --git a/fpicker/source/win32/asyncrequests.cxx b/fpicker/source/win32/asyncrequests.cxx deleted file mode 100644 index bfecc42125a3..000000000000 --- a/fpicker/source/win32/asyncrequests.cxx +++ /dev/null @@ -1,227 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#include "asyncrequests.hxx" -#include <vcl/svapp.hxx> -#include <vcl/winscheduler.hxx> -#include <osl/mutex.hxx> - -namespace fpicker{ -namespace win32{ -namespace vista{ - -static void lcl_sleep( ::osl::Condition& aCondition, - ::sal_Int32 nMilliSeconds ) -{ - if (nMilliSeconds < 1) - aCondition.wait(); - else - { - TimeValue aTime; - aTime.Seconds = (nMilliSeconds / 1000); - aTime.Nanosec = (nMilliSeconds % 1000) * 1000000; - aCondition.wait(&aTime); - } -} - -void Request::wait( ::sal_Int32 nMilliSeconds ) -{ - SolarMutexReleaser aReleaser; - - lcl_sleep( m_aJoiner, nMilliSeconds ); -} - -void Request::waitProcessMessages() -{ - SolarMutexGuard aGuard; - while ( !m_aJoiner.check() && !Application::IsQuit()) - Application::Yield(); -} - -void Request::notify() -{ - m_aJoiner.set(); - // Make sure that main loop receives at least this message to return from GetMessage and recheck - // the condition, even in case when there's no visible application windows present, and thus no - // other messages might arrive to the main loop. - WinScheduler::PostDummyMessage(); -} - -AsyncRequests::AsyncRequests(const RequestHandlerRef& rHandler) - : ::cppu::BaseMutex( ) - , ::osl::Thread ( ) - , m_bFinish (false) - , m_rHandler (rHandler ) - , m_lRequests ( ) -{ -} - -AsyncRequests::~AsyncRequests() -{ - // SYNCHRONIZED -> - { - osl::MutexGuard aLock(m_aMutex); - m_bFinish = true; - } - // <- SYNCHRONIZED - - // The static AsyncRequests aNotify in VistaFilePickerEventHandler::impl_sendEvent - // is destructed at DLL atexit. But it won't run, so needs no join and release of - // the already destructed SolarMutex, which would crash LO on exit. - if (isRunning()) - { - // tdf#123502: make sure we actually hold the mutex before releasing it - // UNO directly destroys the VistaFilePicker object, so we need GUI protection in there. - // But since we redirect GUI stuff to the async thread we also have to release it, so we - // can join it, if the thread currently blocks on the SolarMutex. - SolarMutexGuard aGuard; - SolarMutexReleaser aReleaser; - join(); - } -} - -void AsyncRequests::triggerJobExecution() -{ - if ( ! isRunning()) - create(); - else - maWait.set(); -} - -void AsyncRequests::triggerRequestProcessMessages (const RequestRef& rRequest) -{ - // SYNCHRONIZED -> - { - osl::MutexGuard aLock(m_aMutex); - m_lRequests.push(rRequest); - } - // <- SYNCHRONIZED - - rRequest->waitProcessMessages(); -} - -void AsyncRequests::triggerRequestBlocked(const RequestRef& rRequest) -{ - // SYNCHRONIZED -> - { - osl::MutexGuard aLock(m_aMutex); - m_lRequests.push(rRequest); - } - // <- SYNCHRONIZED - - triggerJobExecution(); - - rRequest->wait(); -} - -void AsyncRequests::triggerRequestNonBlocked(const RequestRef& rRequest) -{ - // SYNCHRONIZED -> - { - osl::MutexGuard aLock(m_aMutex); - m_lRequests.push(rRequest); - } - // <- SYNCHRONIZED - - triggerJobExecution(); -} - -void AsyncRequests::triggerRequestDirectly(const RequestRef& rRequest) -{ - // SYNCHRONIZED -> - osl::ClearableMutexGuard aLock(m_aMutex); - RequestHandlerRef rHandler = m_rHandler; - aLock.clear(); - // <- SYNCHRONIZED - - if (rHandler != nullptr) - rHandler->doRequest(rRequest); -} - -void AsyncRequests::triggerRequestThreadAware(const RequestRef& rRequest, - ::sal_Int16 nWait ) -{ - oslThreadIdentifier nOurThreadId = getIdentifier(); - oslThreadIdentifier nCallerThreadId = ::osl::Thread::getCurrentIdentifier(); - SolarMutexGuard aGuard; - if (nOurThreadId == nCallerThreadId) - triggerRequestDirectly(rRequest); - else if (nWait == BLOCKED) - triggerRequestBlocked(rRequest); - else if (nWait == PROCESS_MESSAGES) - triggerRequestProcessMessages(rRequest); - else - triggerRequestNonBlocked(rRequest); -} - -void SAL_CALL AsyncRequests::run() -{ - osl_setThreadName("fpicker::win32::vista::AsyncRequests"); - - static const ::sal_Int32 TIME_TO_WAIT_FOR_NEW_REQUESTS = 250; - - // SYNCHRONIZED -> - ::osl::ResettableMutexGuard aLock(m_aMutex); - RequestHandlerRef rHandler = m_rHandler; - bool bFinished = m_bFinish; - aLock.clear(); - // <- SYNCHRONIZED - - if (rHandler != nullptr) - rHandler->before(); - - while ( ! bFinished) - { - // SYNCHRONIZED -> - aLock.reset(); - - RequestRef rRequest; - if ( ! m_lRequests.empty()) - { - rRequest = m_lRequests.front(); - m_lRequests.pop(); - } - bFinished = m_bFinish; - - aLock.clear(); - // <- SYNCHRONIZED - - if (rRequest == nullptr) - { - lcl_sleep(maWait, TIME_TO_WAIT_FOR_NEW_REQUESTS); - maWait.reset(); - continue; - } - - if (rHandler != nullptr) - { - rHandler->doRequest(rRequest); - rRequest->notify(); - } - } - - if (rHandler != nullptr) - rHandler->after(); -} - -} // namespace vista -} // namespace win32 -} // namespace fpicker - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/win32/asyncrequests.hxx b/fpicker/source/win32/asyncrequests.hxx deleted file mode 100644 index 410d4241311e..000000000000 --- a/fpicker/source/win32/asyncrequests.hxx +++ /dev/null @@ -1,211 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#pragma once - -#include <cppuhelper/basemutex.hxx> -#include <comphelper/sequenceashashmap.hxx> -#include <osl/conditn.hxx> -#include <osl/thread.hxx> -#include <osl/time.h> -#include <queue> -#include <memory> - -namespace fpicker{ -namespace win32{ -namespace vista{ - - -/** @todo document me - */ -class Request -{ - - public: - - static const ::sal_Int32 WAIT_INFINITE = 0; - - - // interface - - - public: - - - explicit Request() - : m_aJoiner ( ) - , m_nRequest (-1) - , m_lArguments( ) - { - m_aJoiner.reset(); - } - - - virtual ~Request() {}; - - - void setRequest(::sal_Int32 nRequest) - { - m_nRequest = nRequest; - } - - - ::sal_Int32 getRequest() - { - return m_nRequest; - } - - - void clearArguments() - { - m_lArguments.clear(); - } - - - template< class TArgumentType > - void setArgument(const OUString& sName , - const TArgumentType& aValue) - { - m_lArguments[sName] = css::uno::toAny(aValue); - } - - - template< class TArgumentType > - TArgumentType getArgumentOrDefault(const OUString& sName , - const TArgumentType& aDefault) - { - return m_lArguments.getUnpackedValueOrDefault(sName, aDefault); - } - - css::uno::Any getValue(OUString const & key) const - { - return m_lArguments.getValue(key); - } - - void wait(::sal_Int32 nMilliSeconds = WAIT_INFINITE); - - void waitProcessMessages(); - - - void notify(); - - - // member - - - private: - - ::osl::Condition m_aJoiner; - ::sal_Int32 m_nRequest; - ::comphelper::SequenceAsHashMap m_lArguments; -}; - -typedef std::shared_ptr< Request > RequestRef; -typedef std::queue< RequestRef > RequestQueue; - - -class RequestHandler -{ - public: - virtual ~RequestHandler() {} - virtual void before() = 0; - virtual void doRequest(const RequestRef& rRequest) = 0; - virtual void after() = 0; -}; - -typedef std::shared_ptr< RequestHandler > RequestHandlerRef; - - -/** @todo document me - */ -class AsyncRequests final: private ::cppu::BaseMutex - , public ::osl::Thread -{ - public: - static const ::sal_Int16 PROCESS_MESSAGES = 2; - static const ::sal_Int16 BLOCKED = 1; - static const ::sal_Int16 NON_BLOCKED = 0; - - - /** creates the new asynchronous request executor. - */ - explicit AsyncRequests(const RequestHandlerRef& rHandler); - - void setHandler(const RequestHandlerRef& rHandler) - { - m_rHandler = rHandler; - } - - /// ensure the execution thread gets going. - void triggerJobExecution(); - - - /** does nothing special / excepting to make sure our class won't be inline .-) - */ - virtual ~AsyncRequests() override; - - - /** @todo document me - */ - void triggerRequestProcessMessages (const RequestRef& rRequest); - - - /** @todo document me - */ - void triggerRequestBlocked(const RequestRef& rRequest); - - - /** @todo document me - */ - void triggerRequestNonBlocked(const RequestRef& rRequest); - - - /** @todo document me - */ - void triggerRequestDirectly(const RequestRef& rRequest); - - - /** @todo document me - */ - void triggerRequestThreadAware(const RequestRef& rRequest, - ::sal_Int16 nWait ); - - private: - - - /** our STA .-) - * Will run between start() & finish(). Internally it runs a loop ... - * waiting for requests. Every request will be executed synchronously - * in blocked mode. - */ - virtual void SAL_CALL run() override; - - private: - - bool m_bFinish; - RequestHandlerRef m_rHandler; - RequestQueue m_lRequests; - osl::Condition maWait; -}; - -} // namespace vista -} // namespace win32 -} // namespace fpicker - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/fpicker/source/win32/requests.hxx b/fpicker/source/win32/requests.hxx new file mode 100644 index 000000000000..a12f61ad8df7 --- /dev/null +++ b/fpicker/source/win32/requests.hxx @@ -0,0 +1,76 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <comphelper/sequenceashashmap.hxx> + +namespace fpicker +{ +namespace win32 +{ +namespace vista +{ +/** @todo document me + */ +class Request +{ + // interface + +public: + explicit Request() + : m_nRequest(-1) + , m_lArguments() + { + } + + virtual ~Request(){}; + + void setRequest(::sal_Int32 nRequest) { m_nRequest = nRequest; } + + ::sal_Int32 getRequest() { return m_nRequest; } + + void clearArguments() { m_lArguments.clear(); } + + template <class TArgumentType> + void setArgument(const OUString& sName, const TArgumentType& aValue) + { + m_lArguments[sName] = css::uno::toAny(aValue); + } + + template <class TArgumentType> + TArgumentType getArgumentOrDefault(const OUString& sName, const TArgumentType& aDefault) + { + return m_lArguments.getUnpackedValueOrDefault(sName, aDefault); + } + + css::uno::Any getValue(OUString const& key) const { return m_lArguments.getValue(key); } + + // member + +private: + ::sal_Int32 m_nRequest; + ::comphelper::SequenceAsHashMap m_lArguments; +}; + +} // namespace vista +} // namespace win32 +} // namespace fpicker + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ |