On 03/08/11 11:08, Noel Power wrote:
( /me must remember to reply-all )
Hi Lubos
On 02/08/11 13:58, Lubos Lunak wrote:
  Hello,

last week .docx support was broken because of a mistake during the gbuild changes and I wasted quite some time finding out what was wrong. As something
similar had happened to me already
same for me ( too many times )
  before I'd like to apply the attached
patches. However I have some issues with it:

- the error dialog that pops up just says 'General error. General input/output error.', which is completely unhelpful, however I don't feel like digging more for how to pass the information as far as the place where the dialog is
shown,
hmm I think it would be nicer to handle at least the CannotActivateFactoryException problems from the filter instatiations and pop a dialog ( debug output to terminal especially on weirdy windows is not the best way to see this problem ), I vaguely recall the twisted mechanism for getting some dialogs to pop with the interaction handler stuff, I will have a look

maybe this patch is useful to you, it has the disadvantage of creating the needed error dialog but then it also pops up the "General Error" one after that. I contemplated throwing ( well I actually half implemented it but gave up ) the exception up to allow SfxBaseModel::load to handle it but it appears there is all sorts of stuff inbetween that runs ( not expecting an exception ). Not passing an exception but setting a new ( or reusing an existing ) ERROR_IO_xxx ( or something ) also has problems like you can't easily ( or at all ) pass the error message, also I suppose you could use such a new error type to suppress the second 'General Error' but in the end it all just seemed too much trouble for what probably is just something you want in debug ( I guess ) So.. anyway patch attached if you think it might be useful, feel free to use/disregard/change totally etc.

Noel

diff --git sfx2/source/doc/objstor.cxx sfx2/source/doc/objstor.cxx
index 31ee8f0..0716a48 100644
--- sfx2/source/doc/objstor.cxx
+++ sfx2/source/doc/objstor.cxx
@@ -75,6 +75,8 @@
 
 #include <com/sun/star/document/XDocumentProperties.hpp>
 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+#include <com/sun/star/loader/CannotActivateFactoryException.hpp>
+
 #include <comphelper/processfactory.hxx>
 #include <comphelper/configurationhelper.hxx>
 #include <comphelper/interaction.hxx>
@@ -102,6 +104,7 @@
 #include <comphelper/seqstream.hxx>
 #include <comphelper/documentconstants.hxx>
 #include <comphelper/string.hxx>
+#include <comphelper/interaction.hxx>
 #include <vcl/bitmapex.hxx>
 #include <svtools/embedhlp.hxx>
 #include <rtl/logfile.hxx>
@@ -153,6 +156,33 @@ using namespace ::cppu;
 namespace css = ::com::sun::star;
 
 //=========================================================================
+class FilterActivationHandlerHelper
+{
+    uno::Reference< XInteractionHandler > mxHandler;
+public:
+    FilterActivationHandlerHelper( SfxMedium& rMedium)
+    {
+        mxHandler = rMedium.GetInteractionHandler();
+    }
+    void handleException( const loader::CannotActivateFactoryException& e )
+    {
+// not sure if we want this in non debug builds
+//#if OSL_DEBUG_LEVEL > 0
+        if ( mxHandler.is() )
+        {
+            comphelper::OInteractionRequest* pReq = new comphelper::OInteractionRequest( uno::makeAny( e ) );
+            pReq->addContinuation( new comphelper::OInteractionApprove() );
+            uno::Reference< task::XInteractionRequest > xReq( pReq );
+            mxHandler->handle( xReq );
+        }
+        else
+        {
+            OSL_TRACE("Caught CannotActivateFactoryException: %s", rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr());
+        }
+//#endif
+    }
+};
+
 void impl_addToModelCollection(const css::uno::Reference< css::frame::XModel >& xModel)
 {
     if (!xModel.is())
@@ -2186,7 +2216,13 @@ sal_Bool SfxObjectShell::ImportFrom( SfxMedium& rMedium, bool bInsert )
         try{
         xLoader = uno::Reference< document::XFilter >
             ( xFilterFact->createInstanceWithArguments( aFilterName, uno::Sequence < uno::Any >() ), uno::UNO_QUERY );
-        }catch(const uno::Exception&)
+        }
+        catch(const loader::CannotActivateFactoryException& e )
+        {
+            FilterActivationHandlerHelper helper( rMedium );
+            helper.handleException( e );
+        }
+        catch(const uno::Exception& e)
             { xLoader.clear(); }
     }
     if ( xLoader.is() )
@@ -2281,6 +2317,11 @@ sal_Bool SfxObjectShell::ExportTo( SfxMedium& rMedium )
             try{
             xExporter = uno::Reference< document::XExporter >
                 ( xFilterFact->createInstanceWithArguments( aFilterName, uno::Sequence < uno::Any >() ), uno::UNO_QUERY );
+            }
+            catch(const loader::CannotActivateFactoryException& e )
+            {
+                FilterActivationHandlerHelper helper( rMedium );
+                helper.handleException( e );
             }catch(const uno::Exception&)
                 { xExporter.clear(); }
         }
_______________________________________________
LibreOffice mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to