diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2025-03-12 11:45:22 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2025-03-12 17:18:28 +0100 |
commit | ccd010346cb2afc6f8c9d9880c03e82ba5fceb9a (patch) | |
tree | f0816de0d9a0514a665f0d5602ee90832aa46d58 /xmloff | |
parent | b320ade8f9d5205d552fb6fa7de9072eccb867d8 (diff) |
cool#11320 xmloff lok: improve error reporting
When processing a report on failed ODF save, it can be tricky to find
reproduction steps. A typical source of errors is some uncaught
exception. Currently we just report which stream failed to save:
0x70c23(Error Area:Sw Class:Write Code:35) arg1=SfxBaseModel::storeSelf: 0x70c23(Error Area:Sw Class:Write Code:35) arg1=styles.xml at sfx2/source/doc/sfxbasemodel.cxx:1735
Improve this to also report what would appear on stderr in a dbgutil
build:
com.sun.star.lang.IllegalArgumentException: "SwXMLExport::exportTheme() failed at sw/source/filter/xml/xmlfmte.cxx:189"
In case e.g. the theme export throws an exception for testing purposes.
Change-Id: I85ec1ac4f932851401aa3b25a753219eb20638a4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/182831
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
Diffstat (limited to 'xmloff')
-rw-r--r-- | xmloff/source/core/xmlerror.cxx | 26 | ||||
-rw-r--r-- | xmloff/source/core/xmlexp.cxx | 7 | ||||
-rw-r--r-- | xmloff/source/core/xmlimp.cxx | 2 |
3 files changed, 32 insertions, 3 deletions
diff --git a/xmloff/source/core/xmlerror.cxx b/xmloff/source/core/xmlerror.cxx index 75315f78e077..6079797e823b 100644 --- a/xmloff/source/core/xmlerror.cxx +++ b/xmloff/source/core/xmlerror.cxx @@ -27,6 +27,10 @@ #include <com/sun/star/uno/Reference.hxx> #include <com/sun/star/uno/Sequence.hxx> #include <rtl/ustrbuf.hxx> +#include <comphelper/lok.hxx> +#include <tools/json_writer.hxx> +#include <vcl/IDialogRenderable.hxx> +#include <LibreOfficeKit/LibreOfficeKitEnums.h> using ::com::sun::star::uno::Any; using ::com::sun::star::uno::Sequence; @@ -78,7 +82,8 @@ ErrorRecord::ErrorRecord( sal_Int32 nID, const Sequence<OUString>& rParams, { } -XMLErrors::XMLErrors() +XMLErrors::XMLErrors(vcl::ILibreOfficeKitNotifier* pNotifier) + : mpNotifier(pNotifier) { } @@ -98,6 +103,25 @@ void XMLErrors::AddRecord( m_aErrors.emplace_back( nId, rParams, rExceptionMessage, nRow, nColumn, rPublicId, rSystemId ); + if (comphelper::LibreOfficeKit::isActive() && mpNotifier) + { + // The outer error is logged in sfx2, mentioning just the stream name. Also log here the + // inner error, which potentially contains the location of an uncaught exception. + sal_Int32 nFlags = (nId & XMLERROR_MASK_FLAG); + if (nFlags & (XMLERROR_FLAG_ERROR | XMLERROR_FLAG_SEVERE | XMLERROR_API)) + { + tools::JsonWriter aWriter; + { + aWriter.put("classification", "error"); + aWriter.put("code", ""); + aWriter.put("kind", ""); + aWriter.put("cmd", ""); + aWriter.put("message", rExceptionMessage); + } + mpNotifier->libreOfficeKitViewCallback(LOK_CALLBACK_ERROR, aWriter.finishAndGetAsOString()); + } + } + #ifdef DBG_UTIL // give detailed assertion on this message diff --git a/xmloff/source/core/xmlexp.cxx b/xmloff/source/core/xmlexp.cxx index 2cec3eb32f89..4d77d6bc26db 100644 --- a/xmloff/source/core/xmlexp.cxx +++ b/xmloff/source/core/xmlexp.cxx @@ -2286,7 +2286,7 @@ void SvXMLExport::SetError( // create error list on demand if ( mpXMLErrors == nullptr ) - mpXMLErrors.reset( new XMLErrors() ); + mpXMLErrors.reset( new XMLErrors(mpNotifier) ); // save error information mpXMLErrors->AddRecord( nId, rMsgParams, rExceptionMessage, rLocator ); @@ -2442,6 +2442,11 @@ OUString const & SvXMLExport::GetImageFilterName() const return msImgFilterName; } +void SvXMLExport::SetLibreOfficeKitNotifier(vcl::ILibreOfficeKitNotifier* pNotifier) +{ + mpNotifier = pNotifier; +} + void SvXMLElementExport::StartElement( const sal_uInt16 nPrefixKey, const OUString& rLName, diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx index 3c405d21a0d0..94bf7e41b7a7 100644 --- a/xmloff/source/core/xmlimp.cxx +++ b/xmloff/source/core/xmlimp.cxx @@ -1784,7 +1784,7 @@ void SvXMLImport::SetError( { // create error list on demand if ( !mpXMLErrors ) - mpXMLErrors = std::make_unique<XMLErrors>(); + mpXMLErrors = std::make_unique<XMLErrors>(nullptr); // save error information // use document locator (if none supplied) |