summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2013-12-28 17:05:40 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-12-28 17:11:31 +0000
commit58ea27124af27bfac21a796b0d13d72354bd0dd3 (patch)
tree283b986474957adf207481a16139e03484c8cc5a
parentfe868bf7cfba864c6f11f068df87c5fdaae7458c (diff)
make FilePicker::createWithMode not crash
i.e. calc->data->XML Source->"browse to set source" calls com_sun_star_comp_svt_FilePicker_get_implementation with its single argument in arguments as opposed to the empty argument expected there. So allow the single-argument case, and pass the argument through and apply it automatically via XInitialization::initialize in Application::createFilePicker. I'm far from sure that this is the right solution, but it has the advantage of working vs crashing. Change-Id: I07c1baae7f47781920eac56763e8fd003a7b99e1
-rw-r--r--include/vcl/svapp.hxx6
-rw-r--r--svtools/source/uno/fpicker.cxx14
-rw-r--r--vcl/source/app/svapp.cxx12
3 files changed, 22 insertions, 10 deletions
diff --git a/include/vcl/svapp.hxx b/include/vcl/svapp.hxx
index 1620efa9f806..57814e0d8cb7 100644
--- a/include/vcl/svapp.hxx
+++ b/include/vcl/svapp.hxx
@@ -389,9 +389,9 @@ public:
/** Create a platform specific file picker, if one is available,
otherwise return an empty reference
*/
- static com::sun::star::uno::Reference< com::sun::star::ui::dialogs::XFilePicker2 >
- createFilePicker( const com::sun::star::uno::Reference<
- com::sun::star::uno::XComponentContext >& rServiceManager );
+ static css::uno::Reference<css::ui::dialogs::XFilePicker2>
+ createFilePicker(const css::uno::Sequence<css::uno::Any>& rArguments,
+ const css::uno::Reference<css::uno::XComponentContext>& rServiceManager);
/** Create a platform specific folder picker, if one is available,
otherwise return an empty reference
diff --git a/svtools/source/uno/fpicker.cxx b/svtools/source/uno/fpicker.cxx
index a9d06ad6d5c7..1034bafa3bdb 100644
--- a/svtools/source/uno/fpicker.cxx
+++ b/svtools/source/uno/fpicker.cxx
@@ -57,19 +57,22 @@ extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
com_sun_star_comp_svt_FilePicker_get_implementation(
css::uno::XComponentContext *context, uno_Sequence * arguments)
{
- assert(arguments != 0 && arguments->nElements == 0); (void) arguments;
+ assert(arguments != 0 && (arguments->nElements == 0 || arguments->nElements == 1));
+ css::uno::Sequence<css::uno::Any> aArgs(reinterpret_cast<css::uno::Any *>(arguments->elements),
+ arguments->nElements);
Reference< css::uno::XInterface > xResult;
Reference< css::lang::XMultiComponentFactory > xFactory (context->getServiceManager());
if (xFactory.is() && SvtMiscOptions().UseSystemFileDialog())
{
- xResult = Reference< css::uno::XInterface >( Application::createFilePicker( context ) );
+ xResult = Reference<css::uno::XInterface>(Application::createFilePicker(aArgs, context));
if (!xResult.is())
{
try
{
- xResult = xFactory->createInstanceWithContext (
+ xResult = xFactory->createInstanceWithArgumentsAndContext(
FilePicker_getSystemPickerServiceName(),
+ aArgs,
context);
}
catch (css::uno::Exception const &)
@@ -83,8 +86,9 @@ com_sun_star_comp_svt_FilePicker_get_implementation(
if (!xResult.is() && xFactory.is())
{
// Always fall back to OfficeFilePicker.
- xResult = xFactory->createInstanceWithContext (
- OUString( "com.sun.star.ui.dialogs.OfficeFilePicker"),
+ xResult = xFactory->createInstanceWithArgumentsAndContext(
+ "com.sun.star.ui.dialogs.OfficeFilePicker",
+ aArgs,
context);
}
if (xResult.is())
diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx
index 5e573d065c90..945229c24b67 100644
--- a/vcl/source/app/svapp.cxx
+++ b/vcl/source/app/svapp.cxx
@@ -62,6 +62,7 @@
#include "com/sun/star/uno/Reference.h"
#include "com/sun/star/awt/XToolkit.hpp"
#include "com/sun/star/uno/XNamingService.hpp"
+#include "com/sun/star/lang/XInitialization.hpp"
#include "com/sun/star/lang/XMultiServiceFactory.hpp"
#include "comphelper/solarmutex.hxx"
#include "osl/process.h"
@@ -1647,10 +1648,17 @@ bool Application::hasNativeFileSelection()
}
Reference< ui::dialogs::XFilePicker2 >
-Application::createFilePicker( const Reference< uno::XComponentContext >& xSM )
+Application::createFilePicker(const uno::Sequence<uno::Any>& rArguments,
+ const Reference< uno::XComponentContext >& xSM)
{
ImplSVData* pSVData = ImplGetSVData();
- return pSVData->mpDefInst->createFilePicker( xSM );
+ Reference< ui::dialogs::XFilePicker2 > xRet(pSVData->mpDefInst->createFilePicker(xSM));
+ if (xRet.is() && rArguments.getLength())
+ {
+ uno::Reference<lang::XInitialization> xInit(xRet, uno::UNO_QUERY_THROW);
+ xInit->initialize(rArguments);
+ }
+ return xRet;
}
Reference< ui::dialogs::XFolderPicker2 >