Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index



 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 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, so I'd like to add at least debug output

- the debug output in the patch is done just using fprintf(stderr), as I 
cannot find anything that would simply log a debug message and not do more - 
is there anything like that in LO?

- osl_loadModule*() functions are plain C functions from stable API, so no 
overloading to add the extra argument for the error message, the best I've 
come up with was simply a wrapper around dlerror(), which I admit is not very 
nice API either, would there be any better approach?

-- 
 Lubos Lunak
 l.lunak@suse.cz
diff --git a/cppuhelper/source/shlib.cxx b/cppuhelper/source/shlib.cxx
index a979454..1beed1f 100644
--- a/cppuhelper/source/shlib.cxx
+++ b/cppuhelper/source/shlib.cxx
@@ -367,9 +367,14 @@ Reference< XInterface > SAL_CALL loadSharedLibComponentFactory(
         aModulePath.pData, SAL_LOADMODULE_LAZY | SAL_LOADMODULE_GLOBAL );
     if (! lib)
     {
-        throw loader::CannotActivateFactoryException(
-            OUSTR("loading component library failed: ") + aModulePath,
-            Reference< XInterface >() );
+        OUStringBuffer message = OUSTR("loading component library failed: ") + aModulePath;
+        if( const char* error = osl_loadModuleLastError())
+        {
+            message.appendAscii( " (" );
+            message.append( OStringToOUString( error, RTL_TEXTENCODING_UTF8 ));
+            message.appendAscii( ")" );
+        }
+        throw loader::CannotActivateFactoryException( message.makeStringAndClear(), Reference< 
XInterface >() );
     }
 
     Reference< XInterface > xRet;
diff --git a/sal/inc/osl/module.h b/sal/inc/osl/module.h
index 803b0b6..2a92d39 100644
--- a/sal/inc/osl/module.h
+++ b/sal/inc/osl/module.h
@@ -102,6 +102,16 @@ oslModule SAL_CALL osl_loadModuleAscii(const sal_Char *pModuleName, sal_Int32 
nR
 oslModule SAL_CALL osl_loadModuleRelative(
     oslGenericFunction baseModule, rtl_uString * relativePath, sal_Int32 mode);
 
+/**
+    Return an error message for the last error in any of the osl_loadModule*() functions,
+    or NULL if none.
+    @since 3.5.0
+*/
+// TODO 4.0: this is kind of retarded, the osl_loadModule functions themselves should provide
+// this, but this is stable API and C-only, so no simple extending is possible and I don't
+// feel like making the API even more ugly by introducing osl_loadModule*WithError() copies
+const char* SAL_CALL osl_loadModuleLastError();
+
 /** Retrieve the handle of an already loaded module.
 
     This function can be used to search for a function symbol in the process address space.
diff --git a/sal/osl/unx/module.c b/sal/osl/unx/module.c
index a5beea9..7b7ca6f 100644
--- a/sal/osl/unx/module.c
+++ b/sal/osl/unx/module.c
@@ -104,6 +104,11 @@ oslModule SAL_CALL osl_loadModuleAscii(const sal_Char *pModuleName, sal_Int32 
nR
     return NULL;
 }
 
+const char* SAL_CALL osl_loadModuleLastError()
+{
+    return dlerror();
+}
+
 /*****************************************************************************/
 /* osl_getModuleHandle */
 /*****************************************************************************/
diff --git a/sal/osl/w32/module.cxx b/sal/osl/w32/module.cxx
index a332d3a..1a906dd 100644
--- a/sal/osl/w32/module.cxx
+++ b/sal/osl/w32/module.cxx
@@ -144,6 +144,11 @@ oslModule SAL_CALL osl_loadModuleAscii(const sal_Char *pModuleName, sal_Int32 
nR
     return ret;
 }
 
+const char* SAL_CALL osl_loadModuleLastError()
+{
+    return NULL; // TODO
+}
+
 /*****************************************************************************/
 /* osl_getModuleHandle */
 /*****************************************************************************/
diff --git a/sal/util/sal.map b/sal/util/sal.map
index 152b023..b4367e2 100755
--- a/sal/util/sal.map
+++ b/sal/util/sal.map
@@ -609,6 +609,7 @@ LIBO_UDK_3.5 { # symbols available in >= LibO 3.5
     global:
         rtl_stringbuffer_remove;
         rtl_uStringbuffer_remove;
+        osl_loadModuleLastError;
 } UDK_3.10;
 
 PRIVATE_1.0 {
diff --git a/sfx2/source/doc/objstor.cxx b/sfx2/source/doc/objstor.cxx
index 31ee8f0..fca227b 100644
--- a/sfx2/source/doc/objstor.cxx
+++ b/sfx2/source/doc/objstor.cxx
@@ -2281,8 +2281,13 @@ sal_Bool SfxObjectShell::ExportTo( SfxMedium& rMedium )
             try{
             xExporter = uno::Reference< document::XExporter >
                 ( xFilterFact->createInstanceWithArguments( aFilterName, uno::Sequence < uno::Any 
() ), uno::UNO_QUERY );
-            }catch(const uno::Exception&)
-                { xExporter.clear(); }
+            }catch(const uno::Exception& e)
+            {
+#if OSL_DEBUG_LEVEL > 0
+                fprintf( stderr, "%s\n", rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 
).getStr());
+#endif
+                xExporter.clear();
+            }
         }
     }
 

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.