[Libreoffice-commits] core.git: Branch 'distro/cib/libreoffice-5-1' - 90 commits - bin/symbolstore.py bin/upload_symbols.py cli_ure/Executable_climaker.mk cli_ure/Library_cli_cppuhelper_native.mk cli_ure/Library_cli_uno.mk config_host/config_features.h.in config_host.mk.in configure.ac desktop/Executable_minidump_upload.mk desktop/inc desktop/Library_crashreport.mk desktop/Library_sofficeapp.mk desktop/Module_desktop.mk desktop/source desktop/StaticLibrary_minidump.mk distro-configs/LibreOfficeLinux.conf distro-configs/LibreOfficeWin32.conf distro-configs/LibreOfficeWin64.conf download.lst external/breakpad external/Module_external.mk framework/Library_fwk.mk framework/source include/desktop include/sal jvmfwk/plugins Makefile.fetch Makefile.gbuild Makefile.in officecfg/registry RepositoryExternal.mk Repository.mk sal/inc sal/Library_sal.mk sal/osl solenv/gbuild svx/Library_svx.mk svx/source svx/uiconfig svx/UIConfig_svx.mk svx/util vcl/Library_vcl.mk vcl/opengl vcl/source

Samuel Mehrbrodt Samuel.Mehrbrodt at cib.de
Thu Jan 19 08:52:22 UTC 2017


 Makefile.fetch                                             |    1 
 Makefile.gbuild                                            |    3 
 Makefile.in                                                |   13 
 Repository.mk                                              |    2 
 RepositoryExternal.mk                                      |   24 
 bin/symbolstore.py                                         |  644 +++++++++++++
 bin/upload_symbols.py                                      |   50 +
 cli_ure/Executable_climaker.mk                             |    2 
 cli_ure/Library_cli_cppuhelper_native.mk                   |    1 
 cli_ure/Library_cli_uno.mk                                 |    1 
 config_host.mk.in                                          |    2 
 config_host/config_features.h.in                           |    5 
 configure.ac                                               |   37 
 desktop/Executable_minidump_upload.mk                      |   27 
 desktop/Library_crashreport.mk                             |   49 
 desktop/Library_sofficeapp.mk                              |    9 
 desktop/Module_desktop.mk                                  |    4 
 desktop/StaticLibrary_minidump.mk                          |   19 
 desktop/inc/lib/init.hxx                                   |    2 
 desktop/source/app/app.cxx                                 |   68 +
 desktop/source/app/crashreport.cxx                         |  137 ++
 desktop/source/app/sofficemain.cxx                         |   64 +
 desktop/source/app/sofficemain.h                           |    2 
 desktop/source/inc/desktopdllapi.h                         |   24 
 desktop/source/minidump/minidump.cxx                       |  207 ++++
 desktop/source/minidump/minidump_upload.cxx                |   32 
 desktop/source/pkgchk/unopkg/unopkg_app.cxx                |    2 
 desktop/source/pkgchk/unopkg/unopkg_main.h                 |    2 
 distro-configs/LibreOfficeLinux.conf                       |    2 
 distro-configs/LibreOfficeWin32.conf                       |    1 
 distro-configs/LibreOfficeWin64.conf                       |    1 
 download.lst                                               |    2 
 external/Module_external.mk                                |    1 
 external/breakpad/ExternalProject_breakpad.mk              |   29 
 external/breakpad/Makefile                                 |   14 
 external/breakpad/Module_breakpad.mk                       |   26 
 external/breakpad/README                                   |   21 
 external/breakpad/StaticLibrary_breakpad.mk                |   37 
 external/breakpad/UnpackedTarball_breakpad.mk              |   21 
 external/breakpad/breakpad-stackwalk.patch.1               |   32 
 external/breakpad/breakpad-use-correct-http-header.patch.1 |   14 
 external/breakpad/breakpad-wshadow.patch.1                 |  232 ++++
 external/breakpad/breakpad-wshadow2.patch.1                |  144 ++
 framework/Library_fwk.mk                                   |    2 
 framework/source/loadenv/loadenv.cxx                       |    2 
 framework/source/services/desktop.cxx                      |   16 
 include/desktop/crashreport.hxx                            |   80 +
 include/desktop/dllapi.h                                   |   30 
 include/desktop/minidump.hxx                               |   25 
 include/sal/config.h                                       |    4 
 jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx        |    3 
 officecfg/registry/data/org/openoffice/Office/Common.xcu   |    2 
 sal/Library_sal.mk                                         |    1 
 sal/inc/internal/signalshared.hxx                          |   42 
 sal/osl/all/signalshared.cxx                               |  164 +++
 sal/osl/unx/signal.cxx                                     |  209 ----
 sal/osl/w32/salinit.cxx                                    |    6 
 sal/osl/w32/signal.cxx                                     |  257 -----
 solenv/gbuild/extensions/pre_MergedLibsList.mk             |    1 
 solenv/gbuild/platform/com_MSC_defs.mk                     |    2 
 svx/Library_svx.mk                                         |    7 
 svx/UIConfig_svx.mk                                        |    1 
 svx/source/dialog/crashreportdlg.cxx                       |   99 +
 svx/source/dialog/crashreportdlg.hxx                       |   45 
 svx/source/dialog/crashreportui.cxx                        |  100 ++
 svx/uiconfig/ui/crashreportdlg.ui                          |  118 ++
 svx/util/svx.component                                     |    4 
 vcl/Library_vcl.mk                                         |    2 
 vcl/opengl/win/WinDeviceInfo.cxx                           |    6 
 vcl/opengl/x11/X11DeviceInfo.cxx                           |    6 
 vcl/source/opengl/OpenGLHelper.cxx                         |    3 
 71 files changed, 2817 insertions(+), 430 deletions(-)

New commits:
commit f15d51ba7829cce0b5d7c62e755d70df3f8b7667
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
Date:   Thu Jan 19 09:50:48 2017 +0100

    Build fixes
    
    Change-Id: I65276eabdf61f766f31c84cbe2c294e391e56c70

diff --git a/desktop/Library_sofficeapp.mk b/desktop/Library_sofficeapp.mk
index a425a87..d4a722c 100644
--- a/desktop/Library_sofficeapp.mk
+++ b/desktop/Library_sofficeapp.mk
@@ -25,7 +25,6 @@ $(eval $(call gb_Library_add_libs,sofficeapp,\
 
 $(eval $(call gb_Library_use_externals,sofficeapp, \
 	$(if $(ENABLE_BREAKPAD),breakpad) \
-	$(if $(filter OPENCL,$(BUILD_TYPE)),clew) \
     boost_headers \
     dbus \
 ))
diff --git a/external/breakpad/ExternalProject_breakpad.mk b/external/breakpad/ExternalProject_breakpad.mk
index ca7db24..10fa6ce 100644
--- a/external/breakpad/ExternalProject_breakpad.mk
+++ b/external/breakpad/ExternalProject_breakpad.mk
@@ -9,8 +9,6 @@
 
 $(eval $(call gb_ExternalProject_ExternalProject,breakpad))
 
-$(eval $(call gb_ExternalProject_use_autoconf,breakpad,build))
-
 $(eval $(call gb_ExternalProject_register_targets,breakpad,\
 	build \
 ))
diff --git a/external/breakpad/Module_breakpad.mk b/external/breakpad/Module_breakpad.mk
index 6cc740a..be91053 100644
--- a/external/breakpad/Module_breakpad.mk
+++ b/external/breakpad/Module_breakpad.mk
@@ -11,7 +11,6 @@ $(eval $(call gb_Module_Module,breakpad))
 
 $(eval $(call gb_Module_add_targets,breakpad,\
 	UnpackedTarball_breakpad \
-	ExternalPackage_breakpad \
 ))
 
 ifneq ($(OS)$(COM),WNTMSC)
diff --git a/svx/source/dialog/crashreportdlg.cxx b/svx/source/dialog/crashreportdlg.cxx
index f9652a8..3d6b61a 100644
--- a/svx/source/dialog/crashreportdlg.cxx
+++ b/svx/source/dialog/crashreportdlg.cxx
@@ -53,7 +53,7 @@ void CrashReportDialog::dispose()
     Dialog::dispose();
 }
 
-IMPL_LINK(CrashReportDialog, BtnHdl, Button*, pBtn)
+IMPL_LINK_TYPED(CrashReportDialog, BtnHdl, Button*, pBtn, void)
 {
     if (pBtn == mpBtnSend.get())
     {
@@ -94,7 +94,6 @@ IMPL_LINK(CrashReportDialog, BtnHdl, Button*, pBtn)
     {
         Close();
     }
-    return 0;
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/dialog/crashreportdlg.hxx b/svx/source/dialog/crashreportdlg.hxx
index f99a4e1..f5416bd 100644
--- a/svx/source/dialog/crashreportdlg.hxx
+++ b/svx/source/dialog/crashreportdlg.hxx
@@ -20,7 +20,7 @@ class CrashReportDialog : public Dialog
 {
 public:
 
-    explicit CrashReportDialog(vcl::Window* pParent);
+    CrashReportDialog(vcl::Window* pParent);
 
     virtual ~CrashReportDialog() override;
 
@@ -37,7 +37,7 @@ private:
 
     OUString maSuccessMsg;
 
-    DECL_LINK(BtnHdl, Button*);
+    DECL_LINK_TYPED(BtnHdl, Button*, void);
 };
 
 #endif
commit 1e0d1aa8c53e305adff87e7cc16a7aff0f7cfdec
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
Date:   Wed Jan 11 18:08:18 2017 +0100

    Fix mismerge
    
    Change-Id: If098e716d33cefc3e0f174c89f749a07b38f3658

diff --git a/sal/osl/w32/signal.cxx b/sal/osl/w32/signal.cxx
index 2f6b9cc..45ff0ab 100644
--- a/sal/osl/w32/signal.cxx
+++ b/sal/osl/w32/signal.cxx
@@ -147,6 +147,4 @@ long WINAPI signalHandlerFunction(LPEXCEPTION_POINTERS lpEP)
 
 }
 
-}
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 6fc763cb20a02f56363e93279ada4a4f8e5a11f3
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
Date:   Fri Jan 13 15:27:41 2017 +0100

    tdf#96011 Document is not focused when opening a second window
    
    This reverts commit fa52e16b3fb1b8b051f8f64a52c126ba3cbf4d54.

diff --git a/officecfg/registry/data/org/openoffice/Office/Common.xcu b/officecfg/registry/data/org/openoffice/Office/Common.xcu
index 074c475..34bb659 100644
--- a/officecfg/registry/data/org/openoffice/Office/Common.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/Common.xcu
@@ -27,7 +27,7 @@
     </node>
     <node oor:name="NewDocumentHandling">
       <prop oor:name="ForceFocusAndToFront">
-        <value install:module="wnt">false</value>
+        <value install:module="wnt">true</value>
       </prop>
     </node>
     <node oor:name="Localisation">
commit 3bdf162f691004cfc171c5f1ed86dac611e68691
Author: Mark Hung <marklh9 at gmail.com>
Date:   Sat Apr 9 23:45:28 2016 +0800

    tdf#48300 bring window to top and restore window when minimized.
    
    While XWindow->ToTop() in Linux do the both for default ( None ),
    ToTopFlags::RestoreWhenMin has to be specified in Windows in order
    to restore the window, and ToTopFlags::ForegroundTask is necessary
    when ToTopFlags::RestoreWhenMin is specified in order to bring
    non-minimized window to the front.
    
    Change-Id: Ief4a825a18d874a0c35211c9022a4261da6bcf8f
    Reviewed-on: https://gerrit.libreoffice.org/23938
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/framework/source/loadenv/loadenv.cxx b/framework/source/loadenv/loadenv.cxx
index 0bed592..b33fad3 100644
--- a/framework/source/loadenv/loadenv.cxx
+++ b/framework/source/loadenv/loadenv.cxx
@@ -1645,7 +1645,7 @@ void LoadEnv::impl_makeFrameWindowVisible(const css::uno::Reference< css::awt::X
         }
 
         if( pWindow->IsVisible() && (bForceFrontAndFocus || bForceToFront) )
-            pWindow->ToTop();
+            pWindow->ToTop( ToTopFlags::RestoreWhenMin | ToTopFlags::ForegroundTask );
         else
             pWindow->Show(true, (bForceFrontAndFocus || bForceToFront) ? ShowFlags::ForegroundTask : ShowFlags::NONE );
     }
commit 4e6c8db47081000c9597d565528db2b1b8cfd8c8
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
Date:   Fri Jan 13 11:50:12 2017 +0100

    Crashdump: Make crash directory configurable
    
    Change-Id: I8106ec674080ede7072581dab2e6700040de5828

diff --git a/desktop/source/app/crashreport.cxx b/desktop/source/app/crashreport.cxx
index b98267a..e694171 100644
--- a/desktop/source/app/crashreport.cxx
+++ b/desktop/source/app/crashreport.cxx
@@ -83,22 +83,34 @@ void CrashReporter::writeCommonInfo()
 
 namespace {
 
-OUString getCrashUserProfileDirectory()
+OUString getCrashDirectory()
 {
-    OUString url("${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}/crash/");
-    rtl::Bootstrap::expandMacros(url);
-    osl::Directory::create(url);
+    OUString aCrashURL;
 
-    OUString aProfilePath;
-    osl::FileBase::getSystemPathFromFileURL(url, aProfilePath);
-    return aProfilePath;
+    // First check whether a user-defined path is available (crashreport.ini)
+    OUString aCrashPath("${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE("crashreport") ":CrashDirectory}");
+    rtl::Bootstrap::expandMacros(aCrashPath);
+    osl::FileBase::getFileURLFromSystemPath(aCrashPath, aCrashURL);
+
+    // Fall back to user profile
+    if (aCrashPath.isEmpty())
+    {
+        aCrashURL = "${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}/crash";
+        rtl::Bootstrap::expandMacros(aCrashURL);
+    }
+
+    if (!aCrashURL.endsWith("/"))
+        aCrashURL += "/";
+    osl::FileBase::RC rc = osl::Directory::create(aCrashURL);
+    osl::FileBase::getSystemPathFromFileURL(aCrashURL, aCrashPath);
+    return aCrashPath;
 }
 
 }
 
 void CrashReporter::updateMinidumpLocation()
 {
-    OUString aURL = getCrashUserProfileDirectory();
+    OUString aURL = getCrashDirectory();
     OString aOStringUrl = OUStringToOString(aURL, RTL_TEXTENCODING_UTF8);
 
 #if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID
@@ -116,7 +128,7 @@ void CrashReporter::storeExceptionHandler(google_breakpad::ExceptionHandler* pEx
 
 std::string CrashReporter::getIniFileName()
 {
-    OUString url = getCrashUserProfileDirectory() + "dump.ini";
+    OUString url = getCrashDirectory() + "dump.ini";
     OString aUrl = OUStringToOString(url, RTL_TEXTENCODING_UTF8);
     std::string aRet(aUrl.getStr());
     return aRet;
commit fb1925f72ce7f60c52791f13d5f5508ab87d5962
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
Date:   Thu Jan 12 16:47:40 2017 +0100

    Disable CrashReportUI
    
    since we don't offer upload - only want the dumps
    
    Change-Id: I6d084757d83204cb960905d7eb78571b13f8f875

diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index 216bf38..d21eb8b 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -1050,7 +1050,8 @@ bool crashReportInfoExists()
 #if HAVE_FEATURE_BREAKPAD
 void handleCrashReport()
 {
-    static const char SERVICENAME_CRASHREPORT[] = "com.sun.star.comp.svx.CrashReportUI";
+    // Don't show the dialog since we don't offer upload - only want the dumps
+    /*static const char SERVICENAME_CRASHREPORT[] = "com.sun.star.comp.svx.CrashReportUI";
 
     css::uno::Reference< css::uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
 
@@ -1064,7 +1065,7 @@ void handleCrashReport()
     css::util::URL aURL;
     css::uno::Any aRet = xRecoveryUI->dispatchWithReturnValue(aURL, css::uno::Sequence< css::beans::PropertyValue >());
     bool bRet = false;
-    aRet >>= bRet;
+    aRet >>= bRet;*/
 }
 #endif
 
commit 9d092042cd9b4e6ebb09f931f4e1d7a504f4e039
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
Date:   Thu Jan 12 16:46:45 2017 +0100

    Add build id to crash metadata
    
    Change-Id: I0e11a96936ea08cc439fcc1b1e3ff1f59c636665

diff --git a/desktop/Library_crashreport.mk b/desktop/Library_crashreport.mk
index ba2f348..d6d9b8b 100644
--- a/desktop/Library_crashreport.mk
+++ b/desktop/Library_crashreport.mk
@@ -36,6 +36,7 @@ $(eval $(call gb_Library_use_libraries,crashreport,\
     cppuhelper \
     sal \
     salhelper \
+    utl \
 	$(gb_UWINAPI) \
 ))
 
diff --git a/desktop/source/app/crashreport.cxx b/desktop/source/app/crashreport.cxx
index 69baf88..b98267a 100644
--- a/desktop/source/app/crashreport.cxx
+++ b/desktop/source/app/crashreport.cxx
@@ -10,6 +10,7 @@
 #include <desktop/crashreport.hxx>
 #include <rtl/bootstrap.hxx>
 #include <osl/file.hxx>
+#include <unotools/bootstrap.hxx>
 
 #include <config_version.h>
 #include <config_folders.h>
@@ -66,6 +67,7 @@ void CrashReporter::writeCommonInfo()
     std::ofstream minidump_file(ini_path, std::ios_base::trunc);
     minidump_file << "ProductName=LibreOffice\n";
     minidump_file << "Version=" LIBO_VERSION_DOTTED "\n";
+    minidump_file << "BuildID=" << utl::Bootstrap::getBuildIdData("") << "\n";
     minidump_file << "URL=http://crashreport.libreoffice.org/submit/\n";
     for (auto& keyValue : maKeyValues)
     {
commit 074ae797164820f5ec80f9d41555c3498660b620
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
Date:   Thu Jan 12 13:49:17 2017 +0100

    Fix CrashReportDialog
    
    Change-Id: I0a4ba001dcd8dc5d1027f798c8abbf6d2162314e

diff --git a/svx/source/dialog/crashreportdlg.cxx b/svx/source/dialog/crashreportdlg.cxx
index a05a8e0..f9652a8 100644
--- a/svx/source/dialog/crashreportdlg.cxx
+++ b/svx/source/dialog/crashreportdlg.cxx
@@ -33,7 +33,7 @@ CrashReportDialog::CrashReportDialog(vcl::Window* pParent):
     mpBtnSend->SetClickHdl(LINK(this, CrashReportDialog, BtnHdl));
     mpBtnCancel->SetClickHdl(LINK(this, CrashReportDialog, BtnHdl));
     mpBtnClose->SetClickHdl(LINK(this, CrashReportDialog, BtnHdl));
-    mpEditPostUpload->SetReadOnly(true);
+    mpEditPostUpload->SetReadOnly();
 }
 
 CrashReportDialog::~CrashReportDialog()
@@ -53,19 +53,7 @@ void CrashReportDialog::dispose()
     Dialog::dispose();
 }
 
-namespace {
-
-OUString getLibDir()
-{
-    OUString aOriginal = "$BRAND_BASE_DIR/" LIBO_LIBEXEC_FOLDER;
-    rtl::Bootstrap::expandMacros(aOriginal);
-
-    return aOriginal;
-}
-
-}
-
-IMPL_LINK_TYPED(CrashReportDialog, BtnHdl, Button*, pBtn, void)
+IMPL_LINK(CrashReportDialog, BtnHdl, Button*, pBtn)
 {
     if (pBtn == mpBtnSend.get())
     {
@@ -106,6 +94,7 @@ IMPL_LINK_TYPED(CrashReportDialog, BtnHdl, Button*, pBtn, void)
     {
         Close();
     }
+    return 0;
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/source/dialog/crashreportdlg.hxx b/svx/source/dialog/crashreportdlg.hxx
index 89f567a..f99a4e1 100644
--- a/svx/source/dialog/crashreportdlg.hxx
+++ b/svx/source/dialog/crashreportdlg.hxx
@@ -20,9 +20,9 @@ class CrashReportDialog : public Dialog
 {
 public:
 
-    CrashReportDialog(vcl::Window* pParent);
+    explicit CrashReportDialog(vcl::Window* pParent);
 
-    ~CrashReportDialog();
+    virtual ~CrashReportDialog() override;
 
     virtual void dispose() override;
 
@@ -37,7 +37,7 @@ private:
 
     OUString maSuccessMsg;
 
-    DECL_LINK_TYPED(BtnHdl, Button*, void);
+    DECL_LINK(BtnHdl, Button*);
 };
 
 #endif
commit 62cb0f4cb2f02cc5111e0bcb614ae7edf68801cb
Author: Samuel Mehrbrodt <Samuel.Mehrbrodt at cib.de>
Date:   Thu Jan 12 10:20:39 2017 +0100

    Update crashreportdlg.ui from master
    
    Easier than backporting changes
    
    Change-Id: Ic62d587c47d3840df5a33eb07b13b8dc1145d84e

diff --git a/svx/uiconfig/ui/crashreportdlg.ui b/svx/uiconfig/ui/crashreportdlg.ui
index c148ee8..9dd35f6 100644
--- a/svx/uiconfig/ui/crashreportdlg.ui
+++ b/svx/uiconfig/ui/crashreportdlg.ui
@@ -4,22 +4,27 @@
   <requires lib="gtk+" version="3.12"/>
   <object class="GtkDialog" id="CrashReportDialog">
     <property name="can_focus">False</property>
+    <property name="border_width">6</property>
+    <property name="title" translatable="yes">Crash Report</property>
+    <property name="resizable">False</property>
     <property name="type_hint">dialog</property>
     <child internal-child="vbox">
       <object class="GtkBox" id="dialog-vbox1">
         <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
-        <property name="spacing">2</property>
+        <property name="spacing">12</property>
         <child internal-child="action_area">
           <object class="GtkButtonBox" id="dialog-action_area1">
             <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
               <object class="GtkButton" id="btn_send">
-                <property name="label" translatable="yes">Send report</property>
+                <property name="label" translatable="yes">_Send Crash Report</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
+                <property name="has_default">True</property>
                 <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
               </object>
               <packing>
                 <property name="expand">True</property>
@@ -29,10 +34,11 @@
             </child>
             <child>
               <object class="GtkButton" id="btn_cancel">
-                <property name="label" translatable="yes">Don't send report</property>
+                <property name="label" translatable="yes">_Don’t Send</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
               </object>
               <packing>
                 <property name="expand">True</property>
@@ -63,9 +69,9 @@
           <object class="GtkLabel" id="ed_pre">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="label" translatable="yes">We are sorry but it seems that %PRODUCTNAME crashed the last time.
+            <property name="label" translatable="yes">Unfortunately it seems that %PRODUCTNAME crashed when it was last run.
 
-You can help us fix this issue by sending the crash report to the %PRODUCTNAME crash reporting server.</property>
+You can help us to fix this issue by sending an anonymous crash report to the %PRODUCTNAME crash reporting server.</property>
             <property name="wrap">True</property>
           </object>
           <packing>
@@ -80,7 +86,7 @@ You can help us fix this issue by sending the crash report to the %PRODUCTNAME c
             <property name="valign">center</property>
             <property name="xalign">0</property>
             <property name="label" translatable="yes">The crash report was successfully uploaded.
-You can soon find the report on:
+You can soon find the report at:
 crashreport.libreoffice.org/stats/crash_details/%CRASHID</property>
             <property name="wrap">True</property>
             <property name="selectable">True</property>
@@ -96,7 +102,7 @@ crashreport.libreoffice.org/stats/crash_details/%CRASHID</property>
             <property name="can_focus">False</property>
             <property name="label" translatable="yes">Please check the report and if no bug report is connected to the crash report yet, open a new bug report at bugs.documentfoundation.org.
 Add detailed instructions on how to reproduce the crash and the shown crash ID into the crash report field.
-Thank you for your help in improving LibreOffice.</property>
+Thank you for your help in improving %PRODUCTNAME.</property>
             <property name="wrap">True</property>
           </object>
           <packing>
commit 2be8ad42782ca77241949454a4a643368bc1360e
Author: Michael Stahl <mstahl at redhat.com>
Date:   Fri Jan 6 17:15:17 2017 +0100

    breakpad: document how to read mini-dumps locally
    
    Change-Id: I888930079fc93c609769ac31a025c410b9adad96

diff --git a/external/breakpad/README b/external/breakpad/README
index 41fbde6..dfd2bf9 100644
--- a/external/breakpad/README
+++ b/external/breakpad/README
@@ -1 +1,21 @@
-Render glTF 3D models.
+Google breakpad crash-reporting library
+
+https://chromium.googlesource.com/breakpad/breakpad
+
+When this is enabled and soffice.bin crashes, a "mini-dump" file is written
+as "instdir/crash/*.dmp".
+
+There is an UI to upload the mini-dump to a TDF server but of course
+that only makes sense if the server has symbols available that match
+the build, which is not the case if you have built LO yourself.
+
+If you want to get the backtrace from local mini-dump files:
+
+* with Visual Studio:
+  1. open the *.dmp file from the Visual Studio IDE File->Open->File
+  2. then click "Debug Native Only"
+
+* otherwise:
+  1. run "make symbols" to extract the debuginfo from the binaries
+  2. run "workdir/UnpackedTarball/breakpad/src/processor/minidump_stackwalk foo.dmp workdir/symbols"
+
commit d4555cdb9bea76e602d0acc21febe9f29e664286
Author: Michael Stahl <mstahl at redhat.com>
Date:   Tue Jul 19 14:25:14 2016 +0200

    desktop: simplify $(ENABLE_BREAKPAD) checks
    
    Change-Id: Ibe2da6214b1f6555922313b22e2882a2ddb4b9e7

diff --git a/desktop/Library_sofficeapp.mk b/desktop/Library_sofficeapp.mk
index 7f96873..a425a87 100644
--- a/desktop/Library_sofficeapp.mk
+++ b/desktop/Library_sofficeapp.mk
@@ -23,11 +23,12 @@ $(eval $(call gb_Library_add_libs,sofficeapp,\
     ) \
 ))
 
-$(eval $(call gb_Library_use_external,sofficeapp,boost_headers))
-
-ifeq ($(ENABLE_BREAKPAD),TRUE)
-$(eval $(call gb_Library_use_external,sofficeapp,breakpad))
-endif
+$(eval $(call gb_Library_use_externals,sofficeapp, \
+	$(if $(ENABLE_BREAKPAD),breakpad) \
+	$(if $(filter OPENCL,$(BUILD_TYPE)),clew) \
+    boost_headers \
+    dbus \
+))
 
 $(eval $(call gb_Library_use_custom_headers,sofficeapp,\
 	officecfg/registry \
@@ -49,7 +50,7 @@ $(eval $(call gb_Library_use_libraries,sofficeapp,\
     comphelper \
     cppu \
     cppuhelper \
-    $(if $(filter TRUE,$(ENABLE_BREAKPAD)), \
+    $(if $(ENABLE_BREAKPAD), \
         crashreport \
     ) \
     deploymentmisc \
commit d4bfd57db03953b066db72069b9cc40badaeb284
Author: Michael Stahl <mstahl at redhat.com>
Date:   Thu Mar 31 23:58:14 2016 +0200

    breakpad: fix module makefile
    
    ff9b7d118b34b53ec947af881fccd822e2aeb1fd removed the ExternalPackage
    instead of the ExternalProject.
    
    Change-Id: I9240526b29d0559e1485253383d39b5858e4039b

diff --git a/external/breakpad/Module_breakpad.mk b/external/breakpad/Module_breakpad.mk
index 3880760..6cc740a 100644
--- a/external/breakpad/Module_breakpad.mk
+++ b/external/breakpad/Module_breakpad.mk
@@ -10,8 +10,8 @@
 $(eval $(call gb_Module_Module,breakpad))
 
 $(eval $(call gb_Module_add_targets,breakpad,\
-	ExternalProject_breakpad \
 	UnpackedTarball_breakpad \
+	ExternalPackage_breakpad \
 ))
 
 ifneq ($(OS)$(COM),WNTMSC)
commit bffec9b931853efc311e6ac9e3fb22ac364e3c86
Author: Rene Engelhard <rene at debian.org>
Date:   Mon Mar 28 22:39:12 2016 +0200

    don't build/install minidump_upload with ENABLE_BREAKPAD=
    
    Change-Id: I0f7d9811d669c2884b0c1704878678b01529e52f

diff --git a/Repository.mk b/Repository.mk
index 932257a..2fc0767 100644
--- a/Repository.mk
+++ b/Repository.mk
@@ -89,7 +89,7 @@ $(eval $(call gb_Helper_register_executables_for_install,SDK,sdk, \
 ))
 
 $(eval $(call gb_Helper_register_executables_for_install,OOO,brand, \
-	minidump_upload \
+	$(call gb_Helper_optional,BREAKPAD,minidump_upload) \
 	$(if $(filter-out ANDROID IOS MACOSX WNT,$(OS)),oosplash) \
 	soffice_bin \
 	$(if $(filter DESKTOP,$(BUILD_TYPE)),unopkg_bin) \
diff --git a/desktop/Module_desktop.mk b/desktop/Module_desktop.mk
index 2be6896..e52c1b5 100644
--- a/desktop/Module_desktop.mk
+++ b/desktop/Module_desktop.mk
@@ -36,7 +36,7 @@ ifneq (,$(filter DESKTOP,$(BUILD_TYPE)))
 $(eval $(call gb_Module_add_targets,desktop,\
     Executable_soffice_bin \
     Executable_unopkg_bin \
-    Executable_minidump_upload \
+    $(if $(ENABLE_BREAKPAD),Executable_minidump_upload) \
     Library_migrationoo2 \
     Library_migrationoo3 \
     Library_unopkgapp \
commit 7bdcda7b95847a6ed3fefa7f35f4825f39562298
Author: Michael Stahl <mstahl at redhat.com>
Date:   Mon Feb 29 16:30:48 2016 +0100

    desktop: fix infinite loop with --enable-breakpad
    
    Change-Id: I81a0405edc29fa7205d00a5cb920b2d0e800602e

diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index 38b7367..216bf38 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -1030,7 +1030,7 @@ bool crashReportInfoExists()
 #if HAVE_FEATURE_BREAKPAD
     std::string path = CrashReporter::getIniFileName();
     std::ifstream aFile(path);
-    while (!aFile.eof())
+    while (aFile.good())
     {
         std::string line;
         std::getline(aFile, line);
commit 743da5b4a67e51832565564e11d7af3c52b54075
Author: David Tardon <dtardon at redhat.com>
Date:   Mon Feb 15 07:48:58 2016 +0100

    actually allow gbuild to see breakpad makefiles...
    
    Change-Id: I12ba34f30508c0a888445a2d9b68d48807b74e8c

diff --git a/external/Module_external.mk b/external/Module_external.mk
index 7c78c7d..ab47148 100644
--- a/external/Module_external.mk
+++ b/external/Module_external.mk
@@ -24,6 +24,7 @@ $(eval $(call gb_Module_add_moduledirs,external,\
 	$(call gb_Helper_optional,APACHE_COMMONS,apache-commons) \
 	$(call gb_Helper_optional,APR,apr) \
 	$(call gb_Helper_optional,BOOST,boost) \
+	$(call gb_Helper_optional,BREAKPAD,breakpad) \
 	$(call gb_Helper_optional,BSH,beanshell) \
 	$(call gb_Helper_optional,BZIP2,bzip2) \
 	$(call gb_Helper_optional,CAIRO,cairo) \
commit 528abdbf0b087c6663df43df6db2ceefde4efbae
Author: Michael Stahl <mstahl at redhat.com>
Date:   Mon Feb 29 21:56:49 2016 +0100

    desktop: fix undefined CrashReporter::AddKeyValue on MSVC
    
    Change-Id: Ie10b4849957734c2548c73dff8485cc673769e13

diff --git a/include/desktop/crashreport.hxx b/include/desktop/crashreport.hxx
index b774862..f4616e8 100644
--- a/include/desktop/crashreport.hxx
+++ b/include/desktop/crashreport.hxx
@@ -33,7 +33,12 @@ class ExceptionHandler;
  *      * AdapterDeviceId
  *
  */
-class CRASHREPORT_DLLPUBLIC CrashReporter
+class
+#if HAVE_FEATURE_BREAKPAD
+// MSVC 2013 has undefined symbols for inline functions if it's exported
+CRASHREPORT_DLLPUBLIC
+#endif
+/*class*/ CrashReporter
 {
 public:
     static void AddKeyValue(const OUString& rKey, const OUString& rValue);
commit f24917bebd692d8a892339e4fa5cca7554084ee0
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu Jan 5 22:35:52 2017 +0100

    add the locale info to the crashreporter metadata
    
    We have a few crashes that seem locale dependent. Especially the font
    related problems.
    
    Change-Id: I0cc977413dc2328ea705c96c2d4048e4f3c58bbc
    Reviewed-on: https://gerrit.libreoffice.org/32764
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx
index 2243eb2..38b7367 100644
--- a/desktop/source/app/app.cxx
+++ b/desktop/source/app/app.cxx
@@ -2352,6 +2352,8 @@ void Desktop::OpenClients()
     }
 #if HAVE_FEATURE_BREAKPAD
     CrashReporter::writeCommonInfo();
+    // write this information here to avoid depending on vcl in the crash reporter lib
+    CrashReporter::AddKeyValue("Language", Application::GetSettings().GetLanguageTag().getBcp47());
 #endif
 
     OfficeIPCThread::EnableRequests();
commit 30324b38f70885d03d0671fc98a55bb16bd96b73
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Wed Dec 28 23:57:36 2016 +0100

    add a crashreporter entry when we start the shutdown
    
    This will help us identify shutdown related crashes.
    
    Change-Id: Id09c3dfdc94c430d5dcb2aebb017f17db80f17e5
    Reviewed-on: https://gerrit.libreoffice.org/32485
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/framework/Library_fwk.mk b/framework/Library_fwk.mk
index 3efd330..9299285 100644
--- a/framework/Library_fwk.mk
+++ b/framework/Library_fwk.mk
@@ -41,6 +41,8 @@ $(eval $(call gb_Library_use_libraries,fwk,\
     comphelper \
     cppu \
     cppuhelper \
+    $(call gb_Helper_optional,BREAKPAD, \
+		crashreport) \
     fwe \
     fwi \
     i18nlangtag \
diff --git a/framework/source/services/desktop.cxx b/framework/source/services/desktop.cxx
index edbadd8..925a5bf 100644
--- a/framework/source/services/desktop.cxx
+++ b/framework/source/services/desktop.cxx
@@ -61,6 +61,7 @@
 #include <comphelper/sequence.hxx>
 #include <cppuhelper/supportsservice.hxx>
 #include <vcl/svapp.hxx>
+#include <desktop/crashreport.hxx>
 
 #include <tools/errinf.hxx>
 #include <unotools/configmgr.hxx>
@@ -300,13 +301,14 @@ sal_Bool SAL_CALL Desktop::terminate()
         impl_sendCancelTerminationEvent(lCalledTerminationListener);
     else
     {
-            // "Protect" us against dispose before terminate calls!
-            // see dispose() for further information.
-            /* SAFE AREA --------------------------------------------------------------------------------------- */
-            SolarMutexClearableGuard aWriteLock;
-            m_bIsTerminated = true;
-            aWriteLock.clear();
-            /* UNSAFE AREA ------------------------------------------------------------------------------------- */
+        // "Protect" us against dispose before terminate calls!
+        // see dispose() for further information.
+        /* SAFE AREA --------------------------------------------------------------------------------------- */
+        SolarMutexClearableGuard aWriteLock;
+        CrashReporter::AddKeyValue("ShutDown", OUString::boolean(true));
+        m_bIsTerminated = true;
+        aWriteLock.clear();
+        /* UNSAFE AREA ------------------------------------------------------------------------------------- */
 
         impl_sendNotifyTerminationEvent();
 
commit 4cedb4492035c965c9077293f4a0447581e72b3b
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sun Dec 11 00:06:47 2016 +0100

    don't overwrite the crashreport info that are written before upload
    
    There was a race condition that the OpenGL code was initialized before
    the old report has been uploaded. Therefore the OpenGL setting was
    overwritten by the new start and we were not getting the old value.
    
    Now we store any value that wants to be added before the dump.ini is
    ready in a temporary map and will write them as soon as we write all the
    common information.
    
    This problem was introduced by the dialog requesting permission to
    upload the crash report.
    
    Change-Id: I29391a1ff56bac6381218c5a4aefb58c2c03f024
    Reviewed-on: https://gerrit.libreoffice.org/31846
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/desktop/source/app/crashreport.cxx b/desktop/source/app/crashreport.cxx
index 2b8a3d07..69baf88 100644
--- a/desktop/source/app/crashreport.cxx
+++ b/desktop/source/app/crashreport.cxx
@@ -28,28 +28,54 @@ osl::Mutex CrashReporter::maMutex;
 #endif
 
 google_breakpad::ExceptionHandler* CrashReporter::mpExceptionHandler = nullptr;
+bool CrashReporter::mbInit = false;
+std::map<OUString, OUString> CrashReporter::maKeyValues;
+
+namespace {
+
+void writeToStream(std::ofstream& strm, const OUString& rKey, const OUString& rValue)
+{
+    strm << rtl::OUStringToOString(rKey, RTL_TEXTENCODING_UTF8).getStr() << "=";
+    strm << rtl::OUStringToOString(rValue, RTL_TEXTENCODING_UTF8).getStr() << "\n";
+}
+
+}
 
 void CrashReporter::AddKeyValue(const OUString& rKey, const OUString& rValue)
 {
     osl::MutexGuard aGuard(maMutex);
-    std::string ini_path = getIniFileName();
-    std::ofstream ini_file(ini_path, std::ios_base::app);
-    ini_file << rtl::OUStringToOString(rKey, RTL_TEXTENCODING_UTF8).getStr() << "=";
-    ini_file << rtl::OUStringToOString(rValue, RTL_TEXTENCODING_UTF8).getStr() << "\n";
+    if (mbInit)
+    {
+        std::string ini_path = getIniFileName();
+        std::ofstream ini_file(ini_path, std::ios_base::app);
+        writeToStream(ini_file, rKey, rValue);
+    }
+    else
+    {
+        maKeyValues.insert(std::pair<OUString, OUString>(rKey, rValue));
+    }
 }
 
 #endif
 
 void CrashReporter::writeCommonInfo()
 {
+    osl::MutexGuard aGuard(maMutex);
     // limit the amount of code that needs to be executed before the crash reporting
     std::string ini_path = CrashReporter::getIniFileName();
     std::ofstream minidump_file(ini_path, std::ios_base::trunc);
     minidump_file << "ProductName=LibreOffice\n";
     minidump_file << "Version=" LIBO_VERSION_DOTTED "\n";
     minidump_file << "URL=http://crashreport.libreoffice.org/submit/\n";
+    for (auto& keyValue : maKeyValues)
+    {
+        writeToStream(minidump_file, keyValue.first, keyValue.second);
+    }
+    maKeyValues.clear();
     minidump_file.close();
 
+    mbInit = true;
+
     updateMinidumpLocation();
 }
 
diff --git a/include/desktop/crashreport.hxx b/include/desktop/crashreport.hxx
index 47e1fba..b774862 100644
--- a/include/desktop/crashreport.hxx
+++ b/include/desktop/crashreport.hxx
@@ -52,6 +52,10 @@ private:
 
     static osl::Mutex maMutex;
 
+    static bool mbInit;
+
+    static std::map<OUString, OUString> maKeyValues; // used to temporarily save entries before the old info has been uploaded
+
     static google_breakpad::ExceptionHandler* mpExceptionHandler;
 };
 
commit 9c26c30a2e0344502904a6746430d9ce25431844
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Wed Jun 8 12:14:30 2016 +0200

    use a dynamic library for minidump shared code
    
    This has the disadvantage to make the minidump_upload executable depend on LibreOffice libraries but there seems to be no other way to make the 7.1 SDK happy.
    
    Change-Id: I82c37f503ed29cb50711eae7db22063f49747a48
    Reviewed-on: https://gerrit.libreoffice.org/26055
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    (cherry picked from commit 3498cd3e7b2c820fc3f3025eb4434666a444fda1)
    Reviewed-on: https://gerrit.libreoffice.org/26915
    Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice at googlemail.com>

diff --git a/desktop/Executable_minidump_upload.mk b/desktop/Executable_minidump_upload.mk
index 2c02023..959d4af8 100644
--- a/desktop/Executable_minidump_upload.mk
+++ b/desktop/Executable_minidump_upload.mk
@@ -10,11 +10,12 @@
 $(eval $(call gb_Executable_Executable,minidump_upload))
 
 $(eval $(call gb_Executable_use_libraries,minidump_upload,\
+	crashreport \
     sal \
 ))
 
-$(eval $(call gb_Executable_use_static_libraries,minidump_upload,\
-	minidump \
+$(eval $(call gb_Executable_add_defs,minidump_upload,\
+	-DUNICODE \
 ))
 
 $(eval $(call gb_Executable_use_external,minidump_upload,curl))
diff --git a/desktop/Library_crashreport.mk b/desktop/Library_crashreport.mk
index 5b14519..ba2f348 100644
--- a/desktop/Library_crashreport.mk
+++ b/desktop/Library_crashreport.mk
@@ -14,7 +14,10 @@ $(eval $(call gb_Library_set_include,crashreport,\
     -I$(SRCDIR)/desktop/inc \
 ))
 
-$(eval $(call gb_Library_use_external,crashreport,breakpad))
+$(eval $(call gb_Library_use_externals,crashreport,\
+    breakpad \
+curl \
+))
 
 $(eval $(call gb_Library_add_defs,crashreport,\
     -DCRASHREPORT_DLLIMPLEMENTATION \
@@ -38,6 +41,7 @@ $(eval $(call gb_Library_use_libraries,crashreport,\
 
 $(eval $(call gb_Library_add_exception_objects,crashreport,\
     desktop/source/app/crashreport \
+    desktop/source/minidump/minidump \
 ))
 
 
diff --git a/desktop/Module_desktop.mk b/desktop/Module_desktop.mk
index 6ea8c7d..2be6896 100644
--- a/desktop/Module_desktop.mk
+++ b/desktop/Module_desktop.mk
@@ -19,7 +19,7 @@ $(eval $(call gb_Module_add_targets,desktop,\
     Library_sofficeapp \
     $(if $(ENABLE_BREAKPAD), \
         Library_crashreport \
-        StaticLibrary_minidump) \
+        ) \
     $(if $(ENABLE_HEADLESS),,Library_spl) \
     Package_branding \
     $(if $(CUSTOM_BRAND_DIR),Package_branding_custom) \
diff --git a/desktop/source/minidump/minidump.cxx b/desktop/source/minidump/minidump.cxx
index 135b24a..e44fc4c 100644
--- a/desktop/source/minidump/minidump.cxx
+++ b/desktop/source/minidump/minidump.cxx
@@ -13,6 +13,7 @@
 #include <memory>
 #include <fstream>
 #include <sstream>
+#include <string>
 
 #include <curl/curl.h>
 
@@ -178,6 +179,8 @@ bool uploadContent(std::map<std::string, std::string>& parameters, std::string&
     return true;
 }
 
+namespace crashreport {
+
 bool readConfig(const std::string& iniPath, std::string& response)
 {
     std::ifstream file(iniPath);
@@ -199,4 +202,6 @@ bool readConfig(const std::string& iniPath, std::string& response)
     return uploadContent(parameters, response);
 }
 
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/desktop/source/minidump/minidump_upload.cxx b/desktop/source/minidump/minidump_upload.cxx
index 934f1ad..ded2f1d 100644
--- a/desktop/source/minidump/minidump_upload.cxx
+++ b/desktop/source/minidump/minidump_upload.cxx
@@ -10,6 +10,7 @@
 #include <desktop/minidump.hxx>
 
 #include <iostream>
+#include <string>
 
 int main(int argc, char** argv)
 {
@@ -21,7 +22,7 @@ int main(int argc, char** argv)
 
     std::string iniPath(argv[1]);
     std::string response;
-    if (!readConfig(iniPath, response))
+    if (!crashreport::readConfig(iniPath, response))
         return EXIT_FAILURE;
 
     std::cout << "Response: " << response << std::endl;
diff --git a/include/desktop/minidump.hxx b/include/desktop/minidump.hxx
index bdd91b2..63336ca 100644
--- a/include/desktop/minidump.hxx
+++ b/include/desktop/minidump.hxx
@@ -12,7 +12,13 @@
 
 #include <string>
 
-bool readConfig(const std::string& iniPath, std::string& response);
+#include <desktop/dllapi.h>
+
+namespace crashreport {
+
+CRASHREPORT_DLLPUBLIC bool readConfig(const std::string& iniPath, std::string& response);
+
+}
 
 #endif
 
diff --git a/svx/Library_svx.mk b/svx/Library_svx.mk
index 66c72e5..f29ebeb 100644
--- a/svx/Library_svx.mk
+++ b/svx/Library_svx.mk
@@ -40,14 +40,6 @@ $(eval $(call gb_Library_add_defs,svx,\
 
 $(eval $(call gb_Library_set_precompiled_header,svx,$(SRCDIR)/svx/inc/pch/precompiled_svx))
 
-ifeq ($(ENABLE_BREAKPAD),TRUE)
-
-$(eval $(call gb_Library_use_static_libraries,svx, \
-	minidump \
-))
-
-endif
-
 $(eval $(call gb_Library_use_libraries,svx,\
     basegfx \
     sb \
diff --git a/svx/source/dialog/crashreportdlg.cxx b/svx/source/dialog/crashreportdlg.cxx
index 0d800b8..a05a8e0 100644
--- a/svx/source/dialog/crashreportdlg.cxx
+++ b/svx/source/dialog/crashreportdlg.cxx
@@ -72,7 +72,7 @@ IMPL_LINK_TYPED(CrashReportDialog, BtnHdl, Button*, pBtn, void)
         std::string ini_path = CrashReporter::getIniFileName();
 
         std::string response;
-        bool bSuccess = readConfig(ini_path, response);
+        bool bSuccess = crashreport::readConfig(ini_path, response);
 
         OUString aCrashID = OUString::createFromAscii(response.c_str());
 
commit 7d8f0f264463f3ec7e0448049a4b144fcd96e337
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon Jun 27 04:42:22 2016 +0200

    I screwed up with the breakpad minidump_stackwalk patch
    
    This does not affect normal LibreOffice and is only important for the
    server side.
    
    Change-Id: I270262ed6e1b22c3ef41099fda19fa386f386203

diff --git a/external/breakpad/breakpad-stackwalk.patch.1 b/external/breakpad/breakpad-stackwalk.patch.1
index 9a3ce95..8df1fa3 100644
--- a/external/breakpad/breakpad-stackwalk.patch.1
+++ b/external/breakpad/breakpad-stackwalk.patch.1
@@ -24,9 +24,9 @@ diff -ur breakpad.org/src/processor/stackwalk_common.cc breakpad/src/processor/s
             kOutputSeparator, base_address + module->size() - 1,
             kOutputSeparator,
 -           main_module != NULL && base_address == main_address ? 1 : 0);
-+           main_module != NULL && base_address == main_address ? 1 : 0),
++           main_module != NULL && base_address == main_address ? 1 : 0,
 +           kOutputSeparator,
-+           StripSeparator(PathnameStripper::File(module->code_identifier())).c_str();
++           StripSeparator(PathnameStripper::File(module->code_identifier())).c_str());
    }
  }
  
commit 3009d35f7a527f375e5b80d6fb9a5fad71746f84
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon Jun 27 04:41:57 2016 +0200

    always compile breakpad with O2
    
    Change-Id: I4cda93fee47244cf3eb7b13bb6cb2a3eab007cf0

diff --git a/external/breakpad/ExternalProject_breakpad.mk b/external/breakpad/ExternalProject_breakpad.mk
index 221a92e..ca7db24 100644
--- a/external/breakpad/ExternalProject_breakpad.mk
+++ b/external/breakpad/ExternalProject_breakpad.mk
@@ -22,7 +22,7 @@ else # !ifeq($(COM),MSC)
 
 $(call gb_ExternalProject_get_state_target,breakpad,build) :
 	$(call gb_ExternalProject_run,build,\
-		./configure \
+		CXX_FLAGS="-O2" ./configure \
 		&& $(MAKE) \
 	)
 
commit 03fa24ec6850f078502694b9596582ed84a85d6c
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon Jun 27 02:14:58 2016 +0200

    better use a backward compatible way to change the output
    
    Change-Id: If5829e321db8af1f09cccafaf34a18343492f514

diff --git a/external/breakpad/breakpad-stackwalk.patch.1 b/external/breakpad/breakpad-stackwalk.patch.1
index 26803f1..9a3ce95 100644
--- a/external/breakpad/breakpad-stackwalk.patch.1
+++ b/external/breakpad/breakpad-stackwalk.patch.1
@@ -1,16 +1,32 @@
 diff -ur breakpad.org/src/processor/stackwalk_common.cc breakpad/src/processor/stackwalk_common.cc
---- breakpad.org/src/processor/stackwalk_common.cc	2016-06-25 01:38:53.282302964 +0200
-+++ breakpad/src/processor/stackwalk_common.cc	2016-06-25 01:42:58.463821357 +0200
-@@ -767,9 +767,11 @@
+--- breakpad.org/src/processor/stackwalk_common.cc	2016-06-27 02:06:43.304932691 +0200
++++ breakpad/src/processor/stackwalk_common.cc	2016-06-27 02:10:22.815642476 +0200
+@@ -750,7 +750,7 @@
+ // one per line, in the following machine-readable pipe-delimited
+ // text format:
+ // Module|{Module Filename}|{Version}|{Debug Filename}|{Debug Identifier}|
+-// {Base Address}|{Max Address}|{Main}
++// {Base Address}|{Max Address}|{Main}|{Code Identifier}
+ static void PrintModulesMachineReadable(const CodeModules *modules) {
+   if (!modules)
+     return;
+@@ -767,7 +767,7 @@
         ++module_sequence) {
      const CodeModule *module = modules->GetModuleAtSequence(module_sequence);
      uint64_t base_address = module->base_address();
 -    printf("Module%c%s%c%s%c%s%c%s%c0x%08" PRIx64 "%c0x%08" PRIx64 "%c%d\n",
-+    printf("Module%c%s%c%s%c%s%c%s%c%s%c0x%08" PRIx64 "%c0x%08" PRIx64 "%c%d\n",
++    printf("Module%c%s%c%s%c%s%c%s%c0x%08" PRIx64 "%c0x%08" PRIx64 "%c%d%c%s\n",
             kOutputSeparator,
             StripSeparator(PathnameStripper::File(module->code_file())).c_str(),
-+           kOutputSeparator,
-+           StripSeparator(PathnameStripper::File(module->code_identifier())).c_str(),
             kOutputSeparator, StripSeparator(module->version()).c_str(),
+@@ -778,7 +778,9 @@
+            kOutputSeparator, base_address,
+            kOutputSeparator, base_address + module->size() - 1,
             kOutputSeparator,
-            StripSeparator(PathnameStripper::File(module->debug_file())).c_str(),
+-           main_module != NULL && base_address == main_address ? 1 : 0);
++           main_module != NULL && base_address == main_address ? 1 : 0),
++           kOutputSeparator,
++           StripSeparator(PathnameStripper::File(module->code_identifier())).c_str();
+   }
+ }
+ 
commit 803d2a50aff5042e29d84e90740b9eac906365d0
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sat Jun 25 02:10:51 2016 +0200

    add some info how to use the symbol upload script
    
    Change-Id: Ic1d1b57966661b6012efcda0b007b9e75b6be0ef
    Reviewed-on: https://gerrit.libreoffice.org/26650
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/bin/upload_symbols.py b/bin/upload_symbols.py
index d382f70..f708797 100755
--- a/bin/upload_symbols.py
+++ b/bin/upload_symbols.py
@@ -16,6 +16,7 @@ def main():
     if len(sys.argv) != 4:
         print(sys.argv)
         print("Invalid number of parameters")
+        print("Usage: upload-symbols.py symbols.zip config.ini \"long explanation\"")
         sys.exit(1)
 
     upload_url = "http://crashreport.libreoffice.org/upload/"
commit 18c57fd66317fc166b0c6e7cc376a362529fb417
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sat Jun 25 02:03:47 2016 +0200

    add code_id to the minidump_stackwalk
    
    Change-Id: Ibcc32344780b7ad5814678cf7dd9a2167ede1661
    Reviewed-on: https://gerrit.libreoffice.org/26649
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/external/breakpad/UnpackedTarball_breakpad.mk b/external/breakpad/UnpackedTarball_breakpad.mk
index 59073eb..445047b 100644
--- a/external/breakpad/UnpackedTarball_breakpad.mk
+++ b/external/breakpad/UnpackedTarball_breakpad.mk
@@ -15,6 +15,7 @@ $(eval $(call gb_UnpackedTarball_add_patches,breakpad,\
 	external/breakpad/breakpad-use-correct-http-header.patch.1 \
 	external/breakpad/breakpad-wshadow.patch.1 \
 	external/breakpad/breakpad-wshadow2.patch.1 \
+	external/breakpad/breakpad-stackwalk.patch.1 \
 ))
 
 # vim: set noet sw=4 ts=4:
diff --git a/external/breakpad/breakpad-stackwalk.patch.1 b/external/breakpad/breakpad-stackwalk.patch.1
new file mode 100644
index 0000000..26803f1
--- /dev/null
+++ b/external/breakpad/breakpad-stackwalk.patch.1
@@ -0,0 +1,16 @@
+diff -ur breakpad.org/src/processor/stackwalk_common.cc breakpad/src/processor/stackwalk_common.cc
+--- breakpad.org/src/processor/stackwalk_common.cc	2016-06-25 01:38:53.282302964 +0200
++++ breakpad/src/processor/stackwalk_common.cc	2016-06-25 01:42:58.463821357 +0200
+@@ -767,9 +767,11 @@
+        ++module_sequence) {
+     const CodeModule *module = modules->GetModuleAtSequence(module_sequence);
+     uint64_t base_address = module->base_address();
+-    printf("Module%c%s%c%s%c%s%c%s%c0x%08" PRIx64 "%c0x%08" PRIx64 "%c%d\n",
++    printf("Module%c%s%c%s%c%s%c%s%c%s%c0x%08" PRIx64 "%c0x%08" PRIx64 "%c%d\n",
+            kOutputSeparator,
+            StripSeparator(PathnameStripper::File(module->code_file())).c_str(),
++           kOutputSeparator,
++           StripSeparator(PathnameStripper::File(module->code_identifier())).c_str(),
+            kOutputSeparator, StripSeparator(module->version()).c_str(),
+            kOutputSeparator,
+            StripSeparator(PathnameStripper::File(module->debug_file())).c_str(),
commit e9e8d04d1eea72f7d7a4ea177e6490bbe2b31501
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jun 17 21:44:49 2016 +0200

    add some OpenGL info to the crash reporter
    
    Change-Id: Id377bc3bd814fad822d577603b1f147b71ad9ae2
    Reviewed-on: https://gerrit.libreoffice.org/26445
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/vcl/opengl/win/WinDeviceInfo.cxx b/vcl/opengl/win/WinDeviceInfo.cxx
index 427ee2d..a3b0e5c 100644
--- a/vcl/opengl/win/WinDeviceInfo.cxx
+++ b/vcl/opengl/win/WinDeviceInfo.cxx
@@ -574,8 +574,10 @@ void writeToLog(SvStream& rStrm, const char* pKey, const OUString rVal)
 
 bool WinOpenGLDeviceInfo::isDeviceBlocked()
 {
-    // CrashReporter::AddKeyAndValue("AdapterVendorId", maAdapterVendorID);
-    // CrashReporter::AddKeyAndValue("AdapterDeviceId", maAdapterDeviceID);
+    CrashReporter::AddKeyValue("OpenGLVendor", maAdapterVendorID);
+    CrashReporter::AddKeyValue("OpenGLDevice", maAdapterDeviceID);
+    CrashReporter::AddKeyValue("OpenGLDriver", maDriverVersion);
+
     SAL_INFO("vcl.opengl", maDriverVersion);
     SAL_INFO("vcl.opengl", maDriverDate);
     SAL_INFO("vcl.opengl", maDeviceID);
commit 6b4756e7a32de307d36dfa3f84cb0c4a5b0f10cc
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jun 17 21:26:34 2016 +0200

    move the code for tdf#99410 to the sal init windows code
    
    Change-Id: I4ead30fa1736a3a99fb3379e89367934c8df2809
    Reviewed-on: https://gerrit.libreoffice.org/26444
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/desktop/source/app/sofficemain.cxx b/desktop/source/app/sofficemain.cxx
index 903a7fc..6c25999 100644
--- a/desktop/source/app/sofficemain.cxx
+++ b/desktop/source/app/sofficemain.cxx
@@ -100,12 +100,6 @@ static bool dumpCallback(const wchar_t* path, const wchar_t* id,
 #endif
 extern "C" int DESKTOP_DLLPUBLIC soffice_main()
 {
-#if defined(_WIN64) && _MSC_VER <= 1800
-    // tdf#99410: MSVC 2013 runtime library has problems with some math functions if
-    // the CPU supports them and they are disabled in the OS
-    _set_FMA3_enable(0);
-#endif
-
 #if HAVE_FEATURE_BREAKPAD
 
 #if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID
diff --git a/sal/osl/w32/salinit.cxx b/sal/osl/w32/salinit.cxx
index 04fab27..a03f8ae 100644
--- a/sal/osl/w32/salinit.cxx
+++ b/sal/osl/w32/salinit.cxx
@@ -55,6 +55,12 @@ extern "C" void invalidParameterHandler(
 
 void sal_detail_initialize(int argc, char ** argv)
 {
+#if defined(_WIN64) && _MSC_VER <= 1800
+    // tdf#99410: MSVC 2013 runtime library has problems with some math functions if
+    // the CPU supports them and they are disabled in the OS
+    _set_FMA3_enable(0);
+#endif
+
     sal_initGlobalTimer();
     // SetProcessDEPPolicy(PROCESS_DEP_ENABLE);
     // SetDllDirectoryW(L"");
commit fcd31da936136378da5aa0cc230adef48fd8c1b9
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jun 17 18:49:26 2016 +0200

    better message for crash report dialog
    
    Change-Id: I02903cda46809798ec7664cf620c06ea7687e54e
    Reviewed-on: https://gerrit.libreoffice.org/26443
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/svx/source/dialog/crashreportdlg.cxx b/svx/source/dialog/crashreportdlg.cxx
index 00dcedd..0d800b8 100644
--- a/svx/source/dialog/crashreportdlg.cxx
+++ b/svx/source/dialog/crashreportdlg.cxx
@@ -26,10 +26,14 @@ CrashReportDialog::CrashReportDialog(vcl::Window* pParent):
     get(mpBtnClose, "btn_close");
     get(mpEditPreUpload, "ed_pre");
     get(mpEditPostUpload, "ed_post");
+    get(mpFtBugReport, "ed_bugreport");
+
+    maSuccessMsg = mpEditPostUpload->GetText();
 
     mpBtnSend->SetClickHdl(LINK(this, CrashReportDialog, BtnHdl));
     mpBtnCancel->SetClickHdl(LINK(this, CrashReportDialog, BtnHdl));
     mpBtnClose->SetClickHdl(LINK(this, CrashReportDialog, BtnHdl));
+    mpEditPostUpload->SetReadOnly(true);
 }
 
 CrashReportDialog::~CrashReportDialog()
@@ -44,6 +48,7 @@ void CrashReportDialog::dispose()
     mpBtnClose.clear();
     mpEditPreUpload.clear();
     mpEditPostUpload.clear();
+    mpFtBugReport.clear();
 
     Dialog::dispose();
 }
@@ -72,15 +77,26 @@ IMPL_LINK_TYPED(CrashReportDialog, BtnHdl, Button*, pBtn, void)
         OUString aCrashID = OUString::createFromAscii(response.c_str());
 
         if (bSuccess)
-            mpEditPostUpload->SetText(mpEditPostUpload->GetText() + " " + aCrashID);
+        {
+            OUString aProcessedMessage = maSuccessMsg.replaceAll("%CRASHID", aCrashID.replaceAll("Crash-ID=",""));
+
+            // vclbuilder seems to replace _ with ~ even in text
+            mpEditPostUpload->SetText(aProcessedMessage.replaceAll("~", "_"));
+        }
         else
-            mpEditPostUpload->SetText(mpEditPostUpload->GetText() + " Error!");
+            mpEditPostUpload->SetText("Error!");
 
         mpBtnClose->Show();
+        mpFtBugReport->Show();
         mpEditPreUpload->Hide();
         mpEditPostUpload->Show();
         mpBtnSend->Hide();
+        mpBtnSend->Disable();
         mpBtnCancel->Hide();
+        mpBtnCancel->Disable();
+        mpBtnClose->GrabFocus();
+
+        this->setOptimalLayoutSize();
     }
     else if (pBtn == mpBtnCancel.get())
     {
diff --git a/svx/source/dialog/crashreportdlg.hxx b/svx/source/dialog/crashreportdlg.hxx
index 3ea5ab2..89f567a 100644
--- a/svx/source/dialog/crashreportdlg.hxx
+++ b/svx/source/dialog/crashreportdlg.hxx
@@ -14,6 +14,7 @@
 #include <vcl/button.hxx>
 #include <vcl/fixed.hxx>
 #include <vcl/edit.hxx>
+#include <vcl/vclmedit.hxx>
 
 class CrashReportDialog : public Dialog
 {
@@ -31,7 +32,10 @@ private:
     VclPtr<Button> mpBtnCancel;
     VclPtr<Button> mpBtnClose;
     VclPtr<FixedText> mpEditPreUpload;
-    VclPtr<FixedText> mpEditPostUpload;
+    VclPtr<VclMultiLineEdit> mpEditPostUpload;
+    VclPtr<VclMultiLineEdit> mpFtBugReport;
+
+    OUString maSuccessMsg;
 
     DECL_LINK_TYPED(BtnHdl, Button*, void);
 };
diff --git a/svx/uiconfig/ui/crashreportdlg.ui b/svx/uiconfig/ui/crashreportdlg.ui
index 0bed5a6..c148ee8 100644
--- a/svx/uiconfig/ui/crashreportdlg.ui
+++ b/svx/uiconfig/ui/crashreportdlg.ui
@@ -56,16 +56,17 @@
           <packing>
             <property name="expand">False</property>
             <property name="fill">False</property>
-            <property name="position">3</property>
+            <property name="position">4</property>
           </packing>
         </child>
         <child>
           <object class="GtkLabel" id="ed_pre">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="label" translatable="yes">We are sorry but it seems that LibreOffice crashed the last time.
-You can help us fix this issue by sending the crash report to the
-LibreOffice crash reporting server.</property>
+            <property name="label" translatable="yes">We are sorry but it seems that %PRODUCTNAME crashed the last time.
+
+You can help us fix this issue by sending the crash report to the %PRODUCTNAME crash reporting server.</property>
+            <property name="wrap">True</property>
           </object>
           <packing>
             <property name="expand">False</property>
@@ -74,14 +75,15 @@ LibreOffice crash reporting server.</property>
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="ed_post">
+          <object class="GtkTextView" id="ed_post">
             <property name="can_focus">False</property>
             <property name="valign">center</property>
             <property name="xalign">0</property>
             <property name="label" translatable="yes">The crash report was successfully uploaded.
-You can soon find the report on crashreport.libreoffice.org.
-The report can be found by</property>
+You can soon find the report on:
+crashreport.libreoffice.org/stats/crash_details/%CRASHID</property>
             <property name="wrap">True</property>
+            <property name="selectable">True</property>
           </object>
           <packing>
             <property name="expand">False</property>
@@ -89,6 +91,20 @@ The report can be found by</property>
             <property name="position">1</property>
           </packing>
         </child>
+        <child>
+          <object class="GtkTextView" id="ed_bugreport">
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">Please check the report and if no bug report is connected to the crash report yet, open a new bug report at bugs.documentfoundation.org.
+Add detailed instructions on how to reproduce the crash and the shown crash ID into the crash report field.
+Thank you for your help in improving LibreOffice.</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
       </object>
     </child>
   </object>
commit c703e9196574477e3b7f11e20f8aa4b44d466fce
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Wed Jun 15 22:32:44 2016 +0200

    work around MSVCR2013 bug around AVX, tdf#99410
    
    http://crashreport.libreoffice.org/stats/crash_details/d7bc6c8a-e8c2-4c1f-8291-ccab84ea892c
    
    Change-Id: I76f9614bc54988c001c9b252707e4b5d4c588112
    Reviewed-on: https://gerrit.libreoffice.org/26339
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/desktop/source/app/sofficemain.cxx b/desktop/source/app/sofficemain.cxx
index 6c25999..903a7fc 100644
--- a/desktop/source/app/sofficemain.cxx
+++ b/desktop/source/app/sofficemain.cxx
@@ -100,6 +100,12 @@ static bool dumpCallback(const wchar_t* path, const wchar_t* id,
 #endif
 extern "C" int DESKTOP_DLLPUBLIC soffice_main()
 {
+#if defined(_WIN64) && _MSC_VER <= 1800
+    // tdf#99410: MSVC 2013 runtime library has problems with some math functions if
+    // the CPU supports them and they are disabled in the OS
+    _set_FMA3_enable(0);
+#endif
+
 #if HAVE_FEATURE_BREAKPAD
 
 #if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID
commit afc41d6a63f21e85c2405a0da5d917ce8963e097
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Wed Jun 15 20:15:20 2016 +0200

    passing a NULL pointer to fileno is not allowed
    
    See crash reports at
    http://crashreport.libreoffice.org/stats/signature/do_msvcr_magic+0x7
    and documentation at
    https://msdn.microsoft.com/en-us/library/zs6wbdhx.aspx
    
    Change-Id: Ia9166d3b9fa10b87585821504e39cdfecbd22eda
    Reviewed-on: https://gerrit.libreoffice.org/26317
    Reviewed-by: Michael Stahl <mstahl at redhat.com>
    Tested-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
index 52d1a3c..50739c7 100644
--- a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
+++ b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
@@ -559,6 +559,9 @@ static void do_msvcr_magic(rtl_uString *jvm_dll)
 
     FILE *f = _wfopen(reinterpret_cast<LPCWSTR>(Module->buffer), L"rb");
 
+    if (!f)
+        return;
+
     if (fstat(fileno(f), &st) == -1)
     {
         fclose(f);
commit 16c13a1d9082548d988aee1aa05fdf07a68e41ba
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon Jun 13 01:20:08 2016 +0200

    we are using our own minidump_upload executable
    
    Change-Id: Icee770ff8e2db019031d618528a9aab83041389d
    Reviewed-on: https://gerrit.libreoffice.org/26244
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk
index de3baf2..c60832e 100644
--- a/RepositoryExternal.mk
+++ b/RepositoryExternal.mk
@@ -3424,9 +3424,7 @@ endif
 
 $(call gb_LinkTarget_use_external_project,$(1),breakpad)
 
-$(eval $(call gb_Helper_register_packages_for_install,ooo,\
-	breakpad \
-))
+endef
 
 endif # ENABLE_BREAKPAD
 
diff --git a/external/breakpad/ExternalPackage_breakpad.mk b/external/breakpad/ExternalPackage_breakpad.mk
deleted file mode 100644
index 6c0d0bf..0000000
--- a/external/breakpad/ExternalPackage_breakpad.mk
+++ /dev/null
@@ -1,20 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# 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/.
-#
-
-$(eval $(call gb_ExternalPackage_ExternalPackage,breakpad,breakpad))
-
-$(eval $(call gb_ExternalPackage_use_external_project,breakpad,breakpad))
-
-ifeq ($(OS),LINUX)
-$(eval $(call gb_ExternalPackage_add_file,breakpad,$(LIBO_LIB_FOLDER)/minidump_upload,src/tools/linux/symupload/minidump_upload))
-else ifeq ($(OS)),WNT)
-$(eval $(call gb_ExternalPackage_add_file,breakpad,$(LIBO_LIB_FOLDER)/minidump_upload,src/tools/linux/symupload/minidump_upload))
-endif
-
-# vim: set noet sw=4 ts=4:
commit 8ce8a83d50fae5b8dc6ce6564e5fdb1d19d66896
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sun Jun 5 22:34:26 2016 +0200

    enable breakpad in distro configs
    
    Change-Id: Ib321a62223c77e3f62d48f358a228465280458ad
    Reviewed-on: https://gerrit.libreoffice.org/26022
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/distro-configs/LibreOfficeLinux.conf b/distro-configs/LibreOfficeLinux.conf
index ffb10a7..796fa7c 100644
--- a/distro-configs/LibreOfficeLinux.conf
+++ b/distro-configs/LibreOfficeLinux.conf
@@ -32,6 +32,7 @@
 --enable-epm
 --enable-python=internal
 --enable-online-update
+--enable-breakpad
 --disable-dconf
 --disable-randr-link
 --enable-mergelibs
diff --git a/distro-configs/LibreOfficeWin32.conf b/distro-configs/LibreOfficeWin32.conf
index cf32f30..2b08ded 100644
--- a/distro-configs/LibreOfficeWin32.conf
+++ b/distro-configs/LibreOfficeWin32.conf
@@ -7,6 +7,7 @@
 --enable-ext-wiki-publisher
 --enable-ext-nlpsolver
 --enable-online-update
+--enable-breakpad
 --with-help
 --with-myspell-dicts
 --with-package-format=msi
diff --git a/distro-configs/LibreOfficeWin64.conf b/distro-configs/LibreOfficeWin64.conf
index e2d7aca..de9172b 100644
--- a/distro-configs/LibreOfficeWin64.conf
+++ b/distro-configs/LibreOfficeWin64.conf
@@ -8,6 +8,7 @@
 --enable-ext-wiki-publisher
 --enable-ext-nlpsolver
 --enable-online-update
+--enable-breakpad
 --with-help
 --with-myspell-dicts
 --with-package-format=msi
commit 92b9c1b564a2701a80d523e3537fda1d0428b395
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sun Jun 5 22:26:25 2016 +0200

    remove old debug output
    
    Change-Id: Icf0e38c6725a129d3afb22b1cc79f72071c8e919
    Reviewed-on: https://gerrit.libreoffice.org/25934
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/desktop/source/minidump/minidump.cxx b/desktop/source/minidump/minidump.cxx
index 0075ca9..135b24a 100644
--- a/desktop/source/minidump/minidump.cxx
+++ b/desktop/source/minidump/minidump.cxx
@@ -11,7 +11,6 @@
 
 #include <map>
 #include <memory>
-#include <iostream>
 #include <fstream>
 #include <sstream>
 
@@ -162,8 +161,6 @@ bool uploadContent(std::map<std::string, std::string>& parameters, std::string&
                 curl_easy_strerror(cc));
 #endif
 
-    const char* error_description = curl_easy_strerror(cc);
-
     if (formpost != nullptr)
     {
         curl_formfree(formpost);
@@ -173,8 +170,6 @@ bool uploadContent(std::map<std::string, std::string>& parameters, std::string&
         curl_slist_free_all(headerlist);
     }
 
-    std::cerr << response_body << " " << error_description << std::endl;
-
     response = response_body;
 
     if( CURLE_OK != cc )
@@ -191,13 +186,13 @@ bool readConfig(const std::string& iniPath, std::string& response)
     // make sure that at least the mandatory parameters are in there
     if (parameters.find("DumpFile") == parameters.end())
     {
-        std::cerr << "ini file needs to contain a key DumpFile!";
+        response = "ini file needs to contain a key DumpFile!";
         return false;
     }
 
     if (parameters.find("Version") == parameters.end())
     {
-        std::cerr << "ini file needs to contain a key Version!";
+        response = "ini file needs to contain a key Version!";
         return false;
     }
 
commit d9728cc248c2c41f642293da652d9c9ee0174a66
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jun 3 13:26:46 2016 +0200

    report the crash id back to the user
    
    Change-Id: I5cc1e698294a5674d691529af8cc14e4cd87a711
    Reviewed-on: https://gerrit.libreoffice.org/25865
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/desktop/source/minidump/minidump.cxx b/desktop/source/minidump/minidump.cxx
index c0d68c2..0075ca9 100644
--- a/desktop/source/minidump/minidump.cxx
+++ b/desktop/source/minidump/minidump.cxx
@@ -82,7 +82,7 @@ std::string generate_json(const std::map<std::string, std::string>& parameters)
     return stream.str();
 }
 
-bool uploadContent(std::map<std::string, std::string>& parameters)
+bool uploadContent(std::map<std::string, std::string>& parameters, std::string& response)
 {
     CURL* curl = curl_easy_init();
     if (!curl)
@@ -175,6 +175,7 @@ bool uploadContent(std::map<std::string, std::string>& parameters)
 
     std::cerr << response_body << " " << error_description << std::endl;
 
+    response = response_body;
 
     if( CURLE_OK != cc )
         return false;
@@ -182,7 +183,7 @@ bool uploadContent(std::map<std::string, std::string>& parameters)
     return true;
 }
 
-bool readConfig(const std::string& iniPath)
+bool readConfig(const std::string& iniPath, std::string& response)
 {
     std::ifstream file(iniPath);
     std::map<std::string, std::string> parameters = readStrings(file);
@@ -200,7 +201,7 @@ bool readConfig(const std::string& iniPath)
         return false;
     }
 
-    return uploadContent(parameters);
+    return uploadContent(parameters, response);
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/desktop/source/minidump/minidump_upload.cxx b/desktop/source/minidump/minidump_upload.cxx
index 6a581db..934f1ad 100644
--- a/desktop/source/minidump/minidump_upload.cxx
+++ b/desktop/source/minidump/minidump_upload.cxx
@@ -20,9 +20,11 @@ int main(int argc, char** argv)
     }
 
     std::string iniPath(argv[1]);
-    if (!readConfig(iniPath))
+    std::string response;
+    if (!readConfig(iniPath, response))
         return EXIT_FAILURE;
 
+    std::cout << "Response: " << response << std::endl;
     return EXIT_SUCCESS;
 }
 
diff --git a/include/desktop/minidump.hxx b/include/desktop/minidump.hxx
index 21d52e8..bdd91b2 100644
--- a/include/desktop/minidump.hxx
+++ b/include/desktop/minidump.hxx
@@ -12,7 +12,7 @@
 
 #include <string>
 
-bool readConfig(const std::string& iniPath);
+bool readConfig(const std::string& iniPath, std::string& response);
 
 #endif
 
diff --git a/svx/source/dialog/crashreportdlg.cxx b/svx/source/dialog/crashreportdlg.cxx
index 511199b..00dcedd 100644
--- a/svx/source/dialog/crashreportdlg.cxx
+++ b/svx/source/dialog/crashreportdlg.cxx
@@ -23,9 +23,13 @@ CrashReportDialog::CrashReportDialog(vcl::Window* pParent):
 {
     get(mpBtnSend, "btn_send");
     get(mpBtnCancel, "btn_cancel");
+    get(mpBtnClose, "btn_close");
+    get(mpEditPreUpload, "ed_pre");
+    get(mpEditPostUpload, "ed_post");
 
     mpBtnSend->SetClickHdl(LINK(this, CrashReportDialog, BtnHdl));
     mpBtnCancel->SetClickHdl(LINK(this, CrashReportDialog, BtnHdl));
+    mpBtnClose->SetClickHdl(LINK(this, CrashReportDialog, BtnHdl));
 }
 
 CrashReportDialog::~CrashReportDialog()
@@ -37,6 +41,9 @@ void CrashReportDialog::dispose()
 {
     mpBtnSend.clear();
     mpBtnCancel.clear();
+    mpBtnClose.clear();
+    mpEditPreUpload.clear();
+    mpEditPostUpload.clear();
 
     Dialog::dispose();
 }
@@ -59,17 +66,29 @@ IMPL_LINK_TYPED(CrashReportDialog, BtnHdl, Button*, pBtn, void)
     {
         std::string ini_path = CrashReporter::getIniFileName();
 
-        readConfig(ini_path);
-        // TODO: moggi: return the id for the user to look it up
-        Close();
+        std::string response;
+        bool bSuccess = readConfig(ini_path, response);
+
+        OUString aCrashID = OUString::createFromAscii(response.c_str());
+
+        if (bSuccess)
+            mpEditPostUpload->SetText(mpEditPostUpload->GetText() + " " + aCrashID);
+        else
+            mpEditPostUpload->SetText(mpEditPostUpload->GetText() + " Error!");
+
+        mpBtnClose->Show();
+        mpEditPreUpload->Hide();
+        mpEditPostUpload->Show();
+        mpBtnSend->Hide();
+        mpBtnCancel->Hide();
     }
     else if (pBtn == mpBtnCancel.get())
     {
         Close();
     }
-    else
+    else if (pBtn == mpBtnClose.get())
     {
-        assert(false);
+        Close();
     }
 }
 
diff --git a/svx/source/dialog/crashreportdlg.hxx b/svx/source/dialog/crashreportdlg.hxx
index e6041f8..3ea5ab2 100644
--- a/svx/source/dialog/crashreportdlg.hxx
+++ b/svx/source/dialog/crashreportdlg.hxx
@@ -12,6 +12,8 @@
 
 #include <vcl/dialog.hxx>
 #include <vcl/button.hxx>
+#include <vcl/fixed.hxx>
+#include <vcl/edit.hxx>
 
 class CrashReportDialog : public Dialog
 {
@@ -27,6 +29,9 @@ private:
 
     VclPtr<Button> mpBtnSend;
     VclPtr<Button> mpBtnCancel;
+    VclPtr<Button> mpBtnClose;
+    VclPtr<FixedText> mpEditPreUpload;
+    VclPtr<FixedText> mpEditPostUpload;
 
     DECL_LINK_TYPED(BtnHdl, Button*, void);
 };
diff --git a/svx/uiconfig/ui/crashreportdlg.ui b/svx/uiconfig/ui/crashreportdlg.ui
index e8d1355..0bed5a6 100644
--- a/svx/uiconfig/ui/crashreportdlg.ui
+++ b/svx/uiconfig/ui/crashreportdlg.ui
@@ -40,15 +40,27 @@
                 <property name="position">1</property>
               </packing>
             </child>
+            <child>
+              <object class="GtkButton" id="btn_close">
+                <property name="label" translatable="yes">Close</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
           </object>
           <packing>
             <property name="expand">False</property>
             <property name="fill">False</property>
-            <property name="position">0</property>
+            <property name="position">3</property>
           </packing>
         </child>
         <child>
-          <object class="GtkLabel" id="label1">
+          <object class="GtkLabel" id="ed_pre">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="label" translatable="yes">We are sorry but it seems that LibreOffice crashed the last time.
@@ -58,10 +70,27 @@ LibreOffice crash reporting server.</property>
           <packing>
             <property name="expand">False</property>
             <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="ed_post">
+            <property name="can_focus">False</property>
+            <property name="valign">center</property>
+            <property name="xalign">0</property>
+            <property name="label" translatable="yes">The crash report was successfully uploaded.
+You can soon find the report on crashreport.libreoffice.org.
+The report can be found by</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
             <property name="position">1</property>
           </packing>
         </child>
       </object>
     </child>
   </object>
+  <object class="GtkActionGroup" id="actiongroup1"/>
 </interface>
commit 16eeb2fb918a84e8929c862f630df769670a9c2f
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jun 3 12:38:14 2016 +0200

    don't just silently ignore the return value
    
    Change-Id: Ia65c29b61e78de4b908b11cd803d93da4b7e3a2d
    Reviewed-on: https://gerrit.libreoffice.org/25864
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/desktop/source/minidump/minidump.cxx b/desktop/source/minidump/minidump.cxx
index 64303d4..c0d68c2 100644
--- a/desktop/source/minidump/minidump.cxx
+++ b/desktop/source/minidump/minidump.cxx
@@ -200,9 +200,7 @@ bool readConfig(const std::string& iniPath)
         return false;
     }
 
-    uploadContent(parameters);
-
-    return true;
+    return uploadContent(parameters);
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit dc8db9f1a7b9c3f9a3e4bacf966446dcaac96177
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jun 3 12:37:18 2016 +0200

    integrate the minidump upload into the normal LibreOffice
    
    Change-Id: Id1808ceebf6c54698f7d1656a0ce96bcaece89ac
    Reviewed-on: https://gerrit.libreoffice.org/25863
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/desktop/source/minidump/minidump.cxx b/desktop/source/minidump/minidump.cxx
index 371d17c..64303d4 100644
--- a/desktop/source/minidump/minidump.cxx
+++ b/desktop/source/minidump/minidump.cxx
@@ -7,7 +7,7 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  */
 
-#include "minidump.hxx"
+#include <desktop/minidump.hxx>
 
 #include <map>
 #include <memory>
diff --git a/desktop/source/minidump/minidump_upload.cxx b/desktop/source/minidump/minidump_upload.cxx
index 51bba7f..6a581db 100644
--- a/desktop/source/minidump/minidump_upload.cxx
+++ b/desktop/source/minidump/minidump_upload.cxx
@@ -7,10 +7,9 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  */
 
+#include <desktop/minidump.hxx>
 
-#include "minidump.hxx"
-
-#include<iostream>
+#include <iostream>
 
 int main(int argc, char** argv)
 {
diff --git a/desktop/source/minidump/minidump.hxx b/include/desktop/minidump.hxx
similarity index 100%
rename from desktop/source/minidump/minidump.hxx
rename to include/desktop/minidump.hxx
diff --git a/svx/Library_svx.mk b/svx/Library_svx.mk
index d5b8b7d..66c72e5 100644
--- a/svx/Library_svx.mk
+++ b/svx/Library_svx.mk
@@ -40,6 +40,14 @@ $(eval $(call gb_Library_add_defs,svx,\
 
 $(eval $(call gb_Library_set_precompiled_header,svx,$(SRCDIR)/svx/inc/pch/precompiled_svx))
 
+ifeq ($(ENABLE_BREAKPAD),TRUE)
+
+$(eval $(call gb_Library_use_static_libraries,svx, \
+	minidump \
+))
+
+endif
+
 $(eval $(call gb_Library_use_libraries,svx,\
     basegfx \
     sb \
@@ -74,6 +82,8 @@ $(eval $(call gb_Library_use_libraries,svx,\
 
 $(eval $(call gb_Library_use_externals,svx,\
 	boost_headers \
+    $(call gb_Helper_optional,BREAKPAD, \
+		curl) \
 	icuuc \
 	icu_headers \
 ))
diff --git a/svx/source/dialog/crashreportdlg.cxx b/svx/source/dialog/crashreportdlg.cxx
index aeb5c14..511199b 100644
--- a/svx/source/dialog/crashreportdlg.cxx
+++ b/svx/source/dialog/crashreportdlg.cxx
@@ -9,10 +9,12 @@
 
 #include "crashreportdlg.hxx"
 
+
 #include <config_folders.h>
 
 #include <rtl/bootstrap.hxx>
 #include <desktop/crashreport.hxx>
+#include <desktop/minidump.hxx>
 #include <osl/file.hxx>
 
 CrashReportDialog::CrashReportDialog(vcl::Window* pParent):
@@ -56,13 +58,8 @@ IMPL_LINK_TYPED(CrashReportDialog, BtnHdl, Button*, pBtn, void)
     if (pBtn == mpBtnSend.get())
     {
         std::string ini_path = CrashReporter::getIniFileName();
-        OUString aCommand;
-        osl::FileBase::getSystemPathFromFileURL(getLibDir() + "/minidump_upload" + SAL_EXEEXTENSION, aCommand);
 
-        aCommand = aCommand;
-        OString aOStringCommand = rtl::OUStringToOString(aCommand, RTL_TEXTENCODING_UTF8) + " " + ini_path.c_str();
-        int retVal = std::system(aOStringCommand.getStr());
-        SAL_WARN_IF(retVal != 0, "svx.dialog", "Failed to upload minidump. Error Code: " << retVal);
+        readConfig(ini_path);
         // TODO: moggi: return the id for the user to look it up
         Close();
     }
commit 875005e83725c4ec992b6936816175b0ecb206d7
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu Jun 2 19:15:47 2016 +0200

    extract the minidump uploader code into a static lib
    
    The plan for the near future is to still ship the executable but replace
    the interal use if possible with using the static library.
    
    At some point when it is not needed for debugging anymore and everything
    works correctly we should only build the uploader executable in dev
    configurations. The huge disadvantage of the interal solution is that it
    is nearly impossible for a user to upload a crash report if LibO starts
    working correctly. Also LibO overwrites the file with the information
    after the upload whereas the executable does not.
    
    Change-Id: Ib9854946be3a34e580964c18e1a9c0cce16221d1
    Reviewed-on: https://gerrit.libreoffice.org/25862
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/desktop/Executable_minidump_upload.mk b/desktop/Executable_minidump_upload.mk
index 7fe9546..2c02023 100644
--- a/desktop/Executable_minidump_upload.mk
+++ b/desktop/Executable_minidump_upload.mk
@@ -13,6 +13,10 @@ $(eval $(call gb_Executable_use_libraries,minidump_upload,\
     sal \
 ))
 
+$(eval $(call gb_Executable_use_static_libraries,minidump_upload,\
+	minidump \
+))
+
 $(eval $(call gb_Executable_use_external,minidump_upload,curl))
 
 $(eval $(call gb_Executable_add_exception_objects,minidump_upload,\
diff --git a/desktop/Module_desktop.mk b/desktop/Module_desktop.mk
index 619c060..6ea8c7d 100644
--- a/desktop/Module_desktop.mk
+++ b/desktop/Module_desktop.mk
@@ -17,7 +17,9 @@ $(eval $(call gb_Module_add_targets,desktop,\
     Library_deploymentmisc \
     Library_offacc \
     Library_sofficeapp \
-    $(if $(ENABLE_BREAKPAD),Library_crashreport) \
+    $(if $(ENABLE_BREAKPAD), \
+        Library_crashreport \
+        StaticLibrary_minidump) \
     $(if $(ENABLE_HEADLESS),,Library_spl) \
     Package_branding \
     $(if $(CUSTOM_BRAND_DIR),Package_branding_custom) \
diff --git a/desktop/StaticLibrary_minidump.mk b/desktop/StaticLibrary_minidump.mk
new file mode 100644
index 0000000..70cab1a
--- /dev/null
+++ b/desktop/StaticLibrary_minidump.mk
@@ -0,0 +1,19 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+#
+# 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/.
+#
+
+$(eval $(call gb_StaticLibrary_StaticLibrary,minidump))
+
+$(eval $(call gb_StaticLibrary_use_external,minidump,curl))
+
+$(eval $(call gb_StaticLibrary_add_exception_objects,minidump,\
+    desktop/source/minidump/minidump \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/desktop/source/minidump/minidump.cxx b/desktop/source/minidump/minidump.cxx
new file mode 100644
index 0000000..371d17c
--- /dev/null
+++ b/desktop/source/minidump/minidump.cxx
@@ -0,0 +1,208 @@
+/* -*- 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/.
+ */
+
+#include "minidump.hxx"
+
+#include <map>
+#include <memory>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+#include <curl/curl.h>
+
+static const char kUserAgent[] = "Breakpad/1.0 (Linux)";
+
+std::map<std::string, std::string> readStrings(std::istream& file)
+{
+    std::map<std::string, std::string> parameters;
+
+    while (!file.eof())
+    {
+        std::string line;
+        std::getline(file, line);
+        int sep = line.find('=');
+        if (sep >= 0)
+        {
+            std::string key = line.substr(0, sep);
+            std::string value = line.substr(sep + 1);
+            parameters[key] = value;
+        }
+    }
+
+    return parameters;
+}
+
+// Callback to get the response data from server.
+static size_t WriteCallback(void *ptr, size_t size,
+                            size_t nmemb, void *userp)
+{
+  if (!userp)
+    return 0;
+
+  std::string* response = static_cast<std::string *>(userp);
+  size_t real_size = size * nmemb;
+  response->append(static_cast<char *>(ptr), real_size);
+  return real_size;
+}
+
+void getProperty(const std::string& key, std::string& value,
+        std::map<std::string, std::string>& parameters)
+{
+    auto itr = parameters.find(key);
+    if (itr != parameters.end())
+    {
+        value = itr->second;
+        parameters.erase(itr);
+    }
+}
+
+std::string generate_json(const std::map<std::string, std::string>& parameters)
+{
+    std::ostringstream stream;
+    stream << "{\n";
+    bool first = true;
+    for (auto itr = parameters.begin(), itrEnd = parameters.end(); itr != itrEnd; ++itr)
+    {
+        if (!first)
+        {
+            stream << ",\n";
+        }
+        first = false;
+        stream << "\"" << itr->first << "\": \"" << itr->second << "\"";
+    }
+    stream << "\n}";
+
+    return stream.str();
+}
+
+bool uploadContent(std::map<std::string, std::string>& parameters)
+{
+    CURL* curl = curl_easy_init();
+    if (!curl)
+        return false;
+
+    std::string proxy, proxy_user_pwd, ca_certificate_file, file, url, version;
+
+    getProperty("Proxy", proxy, parameters);
+    getProperty("ProxyUserPW", proxy_user_pwd, parameters);
+    getProperty("CAFile", ca_certificate_file, parameters);
+
+    getProperty("DumpFile", file, parameters);
+    getProperty("URL", url, parameters);
+    getProperty("Version", version, parameters);
+    if (url.empty())
+        return false;
+
+    if (file.empty())
+        return false;
+
+    if (version.empty())
+        return false;
+
+    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
+    curl_easy_setopt(curl, CURLOPT_USERAGENT, kUserAgent);
+    // Set proxy information if necessary.
+    if (!proxy.empty())
+        curl_easy_setopt(curl, CURLOPT_PROXY, proxy.c_str());
+    if (!proxy_user_pwd.empty())
+        curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, proxy_user_pwd.c_str());
+
+    if (!ca_certificate_file.empty())
+        curl_easy_setopt(curl, CURLOPT_CAINFO, ca_certificate_file.c_str());
+
+    curl_httppost* formpost = nullptr;
+    curl_httppost* lastptr = nullptr;
+    std::string additional_data = generate_json(parameters);
+    curl_formadd(&formpost, &lastptr,
+            CURLFORM_COPYNAME, "AdditionalData",
+            CURLFORM_COPYCONTENTS, additional_data.c_str(),
+            CURLFORM_END);
+
+    curl_formadd(&formpost, &lastptr,
+            CURLFORM_COPYNAME, "Version",
+            CURLFORM_COPYCONTENTS, version.c_str(),
+            CURLFORM_END);
+
+    std::string response_body;
+    long response_code;
+    curl_formadd(&formpost, &lastptr,
+            CURLFORM_COPYNAME, "upload_file_minidump",
+            CURLFORM_FILE, file.c_str(),
+            CURLFORM_END);
+
+    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
+
+
+    // Disable 100-continue header.
+    char buf[] = "Expect:";
+    curl_slist* headerlist = nullptr;
+    headerlist = curl_slist_append(headerlist, buf);
+    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
+
+    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
+    curl_easy_setopt(curl, CURLOPT_WRITEDATA,
+            static_cast<void *>(&response_body));
+
+    // Fail if 400+ is returned from the web server.
+    curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
+
+    CURLcode cc = curl_easy_perform(curl);
+    curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
+#ifndef NDEBUG
+    if (cc != CURLE_OK)
+        fprintf(stderr, "Failed to send http request to %s, error: %s\n",
+                url.c_str(),
+                curl_easy_strerror(cc));
+#endif
+
+    const char* error_description = curl_easy_strerror(cc);
+
+    if (formpost != nullptr)
+    {
+        curl_formfree(formpost);
+    }
+    if (headerlist != nullptr)
+    {
+        curl_slist_free_all(headerlist);
+    }
+
+    std::cerr << response_body << " " << error_description << std::endl;
+
+
+    if( CURLE_OK != cc )
+        return false;
+
+    return true;
+}
+
+bool readConfig(const std::string& iniPath)
+{
+    std::ifstream file(iniPath);
+    std::map<std::string, std::string> parameters = readStrings(file);
+
+    // make sure that at least the mandatory parameters are in there
+    if (parameters.find("DumpFile") == parameters.end())
+    {
+        std::cerr << "ini file needs to contain a key DumpFile!";
+        return false;
+    }
+
+    if (parameters.find("Version") == parameters.end())
+    {
+        std::cerr << "ini file needs to contain a key Version!";
+        return false;
+    }
+
+    uploadContent(parameters);
+
+    return true;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/desktop/source/minidump/minidump.hxx b/desktop/source/minidump/minidump.hxx
new file mode 100644
index 0000000..21d52e8
--- /dev/null
+++ b/desktop/source/minidump/minidump.hxx
@@ -0,0 +1,19 @@
+/* -*- 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/.
+ */
+
+#ifndef INCLUDED_DESKTOP_MINIDUMP_MINIDUMP_HXX
+#define INCLUDED_DESKTOP_MINIDUMP_MINIDUMP_HXX
+
+#include <string>
+
+bool readConfig(const std::string& iniPath);
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/desktop/source/minidump/minidump_upload.cxx b/desktop/source/minidump/minidump_upload.cxx
index 597580d..51bba7f 100644
--- a/desktop/source/minidump/minidump_upload.cxx
+++ b/desktop/source/minidump/minidump_upload.cxx
@@ -7,189 +7,12 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  */
 
-#include <string>
-#include <map>
-#include <memory>
-#include <iostream>
-#include <fstream>
 
-#include <curl/curl.h>
+#include "minidump.hxx"
 
-static const char kUserAgent[] = "Breakpad/1.0 (Linux)";
+#include<iostream>
 
-std::map<std::string, std::string> readStrings(std::istream& file)
-{
-    std::map<std::string, std::string> parameters;
-
-
-    while (!file.eof())
-    {
-        std::string line;
-        std::getline(file, line);
-        int sep = line.find('=');
-        if (sep >= 0)
-        {
-            std::string key = line.substr(0, sep);
-            std::string value = line.substr(sep + 1);
-            parameters[key] = value;
-        }
-    }
-
-    return parameters;
-}
-
-// Callback to get the response data from server.
-static size_t WriteCallback(void *ptr, size_t size,
-                            size_t nmemb, void *userp)
-{
-  if (!userp)
-    return 0;
-
-  std::string* response = reinterpret_cast<std::string *>(userp);
-  size_t real_size = size * nmemb;
-  response->append(reinterpret_cast<char *>(ptr), real_size);
-  return real_size;
-}
-
-void getProperty(const std::string& key, std::string& value,
-        std::map<std::string, std::string>& parameters)
-{
-    auto itr = parameters.find(key);
-    if (itr != parameters.end())
-    {
-        value = itr->second;
-        parameters.erase(itr);
-    }
-}
-
-bool uploadContent(std::map<std::string, std::string>& parameters)
-{
-    CURL* curl = curl_easy_init();
-    if (!curl)
-        return false;
-
-    std::string proxy, proxy_user_pwd, ca_certificate_file, file, url;
-
-    getProperty("Proxy", proxy, parameters);
-    getProperty("ProxyUserPW", proxy_user_pwd, parameters);
-    getProperty("CAFile", ca_certificate_file, parameters);
-
-    getProperty("DumpFile", file, parameters);
-    getProperty("URL", url, parameters);
-    if (url.empty())
-        return false;
-
-    if (file.empty())
-        return false;
-
-    if (version.empty())
-        return false;
-
-    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
-    curl_easy_setopt(curl, CURLOPT_USERAGENT, kUserAgent);
-    // Set proxy information if necessary.
-    if (!proxy.empty())
-        curl_easy_setopt(curl, CURLOPT_PROXY, proxy.c_str());
-    if (!proxy_user_pwd.empty())
-        curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, proxy_user_pwd.c_str());
-
-    if (!ca_certificate_file.empty())
-        curl_easy_setopt(curl, CURLOPT_CAINFO, ca_certificate_file.c_str());
-
-    curl_httppost* formpost = nullptr;
-    curl_httppost* lastptr = nullptr;
-    for (auto itr = parameters.begin(), itEnd = parameters.end(); itr != itEnd; ++itr)
-    {
-        curl_formadd(&formpost, &lastptr,
-                CURLFORM_COPYNAME, itr->first.c_str(),
-                CURLFORM_COPYCONTENTS, itr->second.c_str(),
-                CURLFORM_END);
-    }
-
-    std::string response_body;
-    long response_code;
-    curl_formadd(&formpost, &lastptr,
-            CURLFORM_COPYNAME, "upload_file_minidump",
-            CURLFORM_FILE, file.c_str(),
-            CURLFORM_END);
-
-    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
-
-
-    // Disable 100-continue header.
-    char buf[] = "Expect:";
-    curl_slist* headerlist = NULL;
-    headerlist = curl_slist_append(headerlist, buf);
-    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
-
-    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
-    curl_easy_setopt(curl, CURLOPT_WRITEDATA,
-            reinterpret_cast<void *>(&response_body));
-
-    // Fail if 400+ is returned from the web server.
-    curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
-
-    CURLcode cc = curl_easy_perform(curl);
-    curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
-#ifndef NDEBUG
-    if (cc != CURLE_OK)
-        fprintf(stderr, "Failed to send http request to %s, error: %s\n",
-                url.c_str(),
-                curl_easy_strerror(cc));
-#endif
-
-    const char* error_description = curl_easy_strerror(cc);
-
-    if (formpost != NULL)
-    {
-        curl_formfree(formpost);
-    }
-    if (headerlist != NULL)
-    {
-        curl_slist_free_all(headerlist);
-    }
-
-    std::cerr << response_body << " " << error_description << std::endl;
-
-
-    if( CURLE_OK != cc )
-        return false;
-
-    return true;
-}
-
-bool readConfig(char** argv)
-{
-    std::string iniPath = argv[1];
-
-    std::ifstream file(iniPath);
-    std::map<std::string, std::string> parameters = readStrings(file);
-
-    // make sure that at least the mandatory parameters are in there
-    if (parameters.find("DumpFile") == parameters.end())
-    {
-        std::cerr << "ini file needs to contain a key DumpFile!";
-        return false;
-    }
-
-    if (parameters.find("Version") == parameters.end())
-    {
-        std::cerr << "ini file needs to contain a key Version!";
-        return false;
-    }
-
-    if (parameters.find("ProductName") == parameters.end())
-    {
-        std::cerr << "ini file needs to contain a ket ProductName!";
-        return false;
-    }
-
-    uploadContent(parameters);
-
-    return true;
-}
-
-int main(int argc, char* argv[])
+int main(int argc, char** argv)
 {
     if (argc < 2)
     {
@@ -197,7 +20,8 @@ int main(int argc, char* argv[])
         return EXIT_FAILURE;
     }
 
-    if (!readConfig(argv))
+    std::string iniPath(argv[1]);
+    if (!readConfig(iniPath))
         return EXIT_FAILURE;
 
     return EXIT_SUCCESS;
commit 7bba14fed7c869104e7c0d2fea366be5b55b608d
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Thu Jun 2 17:04:27 2016 +0200

    add some more error checking to minidump uploader
    
    Change-Id: Ia06fec80ea67e88b8c26cdeb5bfc9cee2459ad4a
    Reviewed-on: https://gerrit.libreoffice.org/25861
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/desktop/source/minidump/minidump_upload.cxx b/desktop/source/minidump/minidump_upload.cxx
index 24039e5..597580d 100644
--- a/desktop/source/minidump/minidump_upload.cxx
+++ b/desktop/source/minidump/minidump_upload.cxx
@@ -79,6 +79,12 @@ bool uploadContent(std::map<std::string, std::string>& parameters)
     if (url.empty())
         return false;
 
+    if (file.empty())
+        return false;
+
+    if (version.empty())
+        return false;
+
     curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
     curl_easy_setopt(curl, CURLOPT_USERAGENT, kUserAgent);
     // Set proxy information if necessary.
commit ee982056ea78410216d71d011dcda227b8d90cfe
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Mon May 30 05:51:36 2016 +0200

    use the existing url to path function also in the ini file part
    
    Change-Id: Ia92261a63cfe1d51f68f312a27d5ba4b42719c47
    Reviewed-on: https://gerrit.libreoffice.org/25647
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/desktop/source/app/crashreport.cxx b/desktop/source/app/crashreport.cxx
index 50f1a1e..2b8a3d07 100644
--- a/desktop/source/app/crashreport.cxx
+++ b/desktop/source/app/crashreport.cxx
@@ -61,11 +61,9 @@ OUString getCrashUserProfileDirectory()
     rtl::Bootstrap::expandMacros(url);
     osl::Directory::create(url);
 
-#if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID
-    return url.copy(7);
-#elif defined WNT
-    return url.copy(8);
-#endif
+    OUString aProfilePath;
+    osl::FileBase::getSystemPathFromFileURL(url, aProfilePath);
+    return aProfilePath;
 }
 
 }
commit c800d84d7c8eb8fb85e0677610d8c195a8c59a56
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Sun May 29 12:15:18 2016 +0200

    use the existing URL to path tools
    
    Change-Id: I20aa47556205f5efc70f8f5ea39c63009110f986
    Reviewed-on: https://gerrit.libreoffice.org/25646
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
    Tested-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/include/sal/config.h b/include/sal/config.h
index c86b12f..5f65098 100644
--- a/include/sal/config.h
+++ b/include/sal/config.h
@@ -29,6 +29,7 @@
 #ifdef WIN32
 #define SAL_W32
 #define SAL_DLLEXTENSION ".dll"
+#define SAL_EXEEXTENSION ".exe"
 #define SAL_PATHSEPARATOR ';'
 #define SAL_PATHDELIMITER '\\'
 #define SAL_NEWLINE_STRING "\r\n"
@@ -56,6 +57,7 @@
     defined(AIX) || defined(OPENBSD) || defined(DRAGONFLY) || defined(ANDROID)
 #define SAL_UNX
 #define SAL_DLLEXTENSION ".so"
+#define SAL_EXEEXTENSION ""
 #define SAL_DLLPREFIX "lib"
 #define SAL_PATHSEPARATOR ':'
 #define SAL_PATHDELIMITER '/'
@@ -66,6 +68,7 @@
 #ifdef EMSCRIPTEN
 #define SAL_UNX
 #define SAL_DLLEXTENSION ".bc"
+#define SAL_EXEEXTENSION ""
 #define SAL_DLLPREFIX "lib"
 #define SAL_PATHSEPARATOR ':'
 #define SAL_PATHDELIMITER '/'
@@ -76,6 +79,7 @@
 #ifdef MACOSX
 #define SAL_UNX
 #define SAL_DLLEXTENSION ".dylib"
+#define SAL_EXEEXTENSION ""
 #define SAL_DLLPREFIX "lib"
 #define SAL_PATHSEPARATOR ':'
 #define SAL_PATHDELIMITER '/'
diff --git a/svx/source/dialog/crashreportdlg.cxx b/svx/source/dialog/crashreportdlg.cxx
index 730dff5..aeb5c14 100644
--- a/svx/source/dialog/crashreportdlg.cxx
+++ b/svx/source/dialog/crashreportdlg.cxx
@@ -13,6 +13,7 @@
 
 #include <rtl/bootstrap.hxx>
 #include <desktop/crashreport.hxx>
+#include <osl/file.hxx>
 
 CrashReportDialog::CrashReportDialog(vcl::Window* pParent):
     Dialog(pParent, "CrashReportDialog",
@@ -40,12 +41,12 @@ void CrashReportDialog::dispose()
 
 namespace {
 
-OString getLibDir()
+OUString getLibDir()
 {
     OUString aOriginal = "$BRAND_BASE_DIR/" LIBO_LIBEXEC_FOLDER;
     rtl::Bootstrap::expandMacros(aOriginal);
 
-    return rtl::OUStringToOString(aOriginal, RTL_TEXTENCODING_UTF8);
+    return aOriginal;
 }
 
 }
@@ -55,13 +56,14 @@ IMPL_LINK_TYPED(CrashReportDialog, BtnHdl, Button*, pBtn, void)
     if (pBtn == mpBtnSend.get())
     {
         std::string ini_path = CrashReporter::getIniFileName();
-#if defined WNT
-        OString aCommand = getLibDir().copy(8) + "/minidump_upload.exe " + ini_path.c_str();
-#else
-        OString aCommand = getLibDir().copy(7) + "/minidump_upload " + ini_path.c_str();
-#endif
-        int retVal = std::system(aCommand.getStr());
-        SAL_WARN_IF(retVal != 0, "crashreport", "Failed to upload minidump. Error Code: " << retVal);
+        OUString aCommand;
+        osl::FileBase::getSystemPathFromFileURL(getLibDir() + "/minidump_upload" + SAL_EXEEXTENSION, aCommand);
+
+        aCommand = aCommand;
+        OString aOStringCommand = rtl::OUStringToOString(aCommand, RTL_TEXTENCODING_UTF8) + " " + ini_path.c_str();
+        int retVal = std::system(aOStringCommand.getStr());
+        SAL_WARN_IF(retVal != 0, "svx.dialog", "Failed to upload minidump. Error Code: " << retVal);
+        // TODO: moggi: return the id for the user to look it up
         Close();
     }
     else if (pBtn == mpBtnCancel.get())
commit fc4e9b660a3228a7268366c4a7e101f0f05744ea
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Wed May 25 00:09:21 2016 +0200

    crash report lib should be part of mergelib
    
    Change-Id: I23c338f9fcf7eeea4a440013ea6c1b9206e040f3
    Reviewed-on: https://gerrit.libreoffice.org/25430
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/solenv/gbuild/extensions/pre_MergedLibsList.mk b/solenv/gbuild/extensions/pre_MergedLibsList.mk
index 20cc510..0aa9be6 100644
--- a/solenv/gbuild/extensions/pre_MergedLibsList.mk
+++ b/solenv/gbuild/extensions/pre_MergedLibsList.mk
@@ -17,6 +17,7 @@ MERGE_LIBRARY_LIST := \
 	canvastools \
 	configmgr \
 	cppcanvas \
+	$(call gb_Helper_optional,BREAKPAD,crashreport) \
 	$(call gb_Helper_optional,DBCONNECTIVITY,dbtools) \
 	deployment \
 	deploymentmisc \
commit 5d80c3d57fcd4d7332550132db030c8cc7031b63
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue May 24 21:31:32 2016 +0200

    don't use the VM URL anywhere
    
    Change-Id: I0967c8fcea972b2dde58e3481f4767e225d3b2ba

diff --git a/bin/upload_symbols.py b/bin/upload_symbols.py
index fd4246e..d382f70 100755
--- a/bin/upload_symbols.py
+++ b/bin/upload_symbols.py
@@ -18,8 +18,8 @@ def main():
         print("Invalid number of parameters")
         sys.exit(1)
 
-    upload_url = "http://vm171.documentfoundation.org/upload/"
-    login_url = "http://vm171.documentfoundation.org/accounts/login/"
+    upload_url = "http://crashreport.libreoffice.org/upload/"
+    login_url = "http://crashreport.libreoffice.org/accounts/login/"
 
     config = configparser.ConfigParser()
     config.read(sys.argv[2])
commit 1245559e495e2de90b93474889e4ee9d6ade5211
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue May 24 21:05:02 2016 +0200

    use correct path for minidump_upload on windows
    
    Change-Id: I1cd60d8b8b1c55b039f76bdaa4f73dc31e654d12

diff --git a/svx/source/dialog/crashreportdlg.cxx b/svx/source/dialog/crashreportdlg.cxx
index 74066a8..730dff5 100644
--- a/svx/source/dialog/crashreportdlg.cxx
+++ b/svx/source/dialog/crashreportdlg.cxx
@@ -55,7 +55,11 @@ IMPL_LINK_TYPED(CrashReportDialog, BtnHdl, Button*, pBtn, void)
     if (pBtn == mpBtnSend.get())
     {
         std::string ini_path = CrashReporter::getIniFileName();
+#if defined WNT
+        OString aCommand = getLibDir().copy(8) + "/minidump_upload.exe " + ini_path.c_str();
+#else
         OString aCommand = getLibDir().copy(7) + "/minidump_upload " + ini_path.c_str();
+#endif
         int retVal = std::system(aCommand.getStr());
         SAL_WARN_IF(retVal != 0, "crashreport", "Failed to upload minidump. Error Code: " << retVal);
         Close();
commit ad2f8f5dd65dc2fdff240b8fb4edf57e29cd0b7e
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue May 24 21:03:35 2016 +0200

    add the file extension for minidumps on windows
    
    Change-Id: Ib5692ef839c500cac7d2551d0b0ee6faf141132a

diff --git a/desktop/source/app/sofficemain.cxx b/desktop/source/app/sofficemain.cxx
index ee54883..6c25999 100644
--- a/desktop/source/app/sofficemain.cxx
+++ b/desktop/source/app/sofficemain.cxx
@@ -89,7 +89,7 @@ static bool dumpCallback(const wchar_t* path, const wchar_t* id,
     std::ofstream minidump_file(ini_path, std::ios_base::app);
     // TODO: moggi: can we avoid this conversion
     std::wstring_convert<std::codecvt_utf8<wchar_t>> conv1;
-    std::string aPath = conv1.to_bytes(std::wstring(path)) + conv1.to_bytes(std::wstring(id));
+    std::string aPath = conv1.to_bytes(std::wstring(path)) + conv1.to_bytes(std::wstring(id)) + ".dmp";
     minidump_file << "DumpFile=" << aPath << "\n";;
     minidump_file.close();
     SAL_WARN("desktop", "minidump generated: " << aPath);
commit cd5cfdf9d9df5d5e31b888f891f4e1daca25fdba
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue May 24 21:02:58 2016 +0200

    use correct URL for crashreport
    
    Change-Id: Ia7d584685961e8573c1c35f2560a66664632f5f7

diff --git a/desktop/source/app/crashreport.cxx b/desktop/source/app/crashreport.cxx
index 830fe84..50f1a1e 100644
--- a/desktop/source/app/crashreport.cxx
+++ b/desktop/source/app/crashreport.cxx
@@ -47,7 +47,7 @@ void CrashReporter::writeCommonInfo()
     std::ofstream minidump_file(ini_path, std::ios_base::trunc);
     minidump_file << "ProductName=LibreOffice\n";
     minidump_file << "Version=" LIBO_VERSION_DOTTED "\n";
-    minidump_file << "URL=http://crashreport.libreoffice.org/submit\n";
+    minidump_file << "URL=http://crashreport.libreoffice.org/submit/\n";
     minidump_file.close();
 
     updateMinidumpLocation();
commit c46abf51c97eb1c3f994fe32366d889873bae532
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Tue May 24 20:51:32 2016 +0200

    copy and paste error in minidump uploader
    
    Change-Id: I114325f2de2f2953d158b88f5f0e0a3bac853368

diff --git a/desktop/source/minidump/minidump_upload.cxx b/desktop/source/minidump/minidump_upload.cxx
index 658918a..24039e5 100644
--- a/desktop/source/minidump/minidump_upload.cxx
+++ b/desktop/source/minidump/minidump_upload.cxx

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list