summaryrefslogtreecommitdiff
path: root/fpicker
diff options
context:
space:
mode:
authorMatt K <mattkse@gmail.com>2021-04-21 17:34:16 -0500
committerMike Kaganski <mike.kaganski@collabora.com>2021-04-22 22:20:55 +0200
commit1c1226709c6be39c5462f5e6e1262ca630b30b34 (patch)
tree14dc0f683da5bc6c8e08ea7db516da174960679f /fpicker
parent04bd21d483c33c5011e31ac12d02c9e00dc410ce (diff)
tdf#106282 Change Windows File Dialog to run on the main thread
Windows crashes when an IFileDialog object is used on a non-main thread when cancelling a long search operation, when COM is initialized as single-threaded apartment for that thread. Trying to use a non-main thread with COM initialized to multi-threaded apartment hangs the dialog UI. The only solution that works is to run all File Dialogs on the main thread. This has a performance penalty on the application while a File Dialog is open or if multiple dialogs are searching and then cancelled, but it's better than crashing. Other applications like Firefox use only the main thread for File Dialogs, but have additional processes to avoid the performance penalty. Change-Id: Icf8a8179dbea19bd3d749a1c2fe8e67dbfc726c6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114482 Reviewed-by: Matt K <mattkse@gmail.com> Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de> Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com> Tested-by: Jenkins
Diffstat (limited to 'fpicker')
-rw-r--r--fpicker/Library_fps.mk1
-rw-r--r--fpicker/source/win32/VistaFilePicker.cxx212
-rw-r--r--fpicker/source/win32/VistaFilePicker.hxx10
-rw-r--r--fpicker/source/win32/VistaFilePickerEventHandler.cxx36
-rw-r--r--fpicker/source/win32/VistaFilePickerImpl.cxx307
-rw-r--r--fpicker/source/win32/VistaFilePickerImpl.hxx66
-rw-r--r--fpicker/source/win32/asyncrequests.cxx227
-rw-r--r--fpicker/source/win32/asyncrequests.hxx211
-rw-r--r--fpicker/source/win32/requests.hxx76
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: */