[gnumeric] Gnumeric & odf: force xml tag sync after each sheet



commit f8034b05ac2793c7521731fcd68a4016594b5abd
Author: Morten Welinder <terra gnome org>
Date:   Sun Aug 30 12:47:50 2020 -0400

    Gnumeric & odf: force xml tag sync after each sheet
    
    Verify that we're closing the right xml tag after each sheet.  This shouldn't
    matter (because everything is supposed to be paired, after all), but it ever
    does it should make sure that at least subsequent sheets aren't mangled.

 plugins/openoffice/openoffice-write.c | 19 ++++---------------
 src/gutils.c                          | 23 +++++++++++++++++++++++
 src/gutils.h                          |  1 +
 src/xml-sax-write.c                   |  2 +-
 4 files changed, 29 insertions(+), 16 deletions(-)
---
diff --git a/plugins/openoffice/openoffice-write.c b/plugins/openoffice/openoffice-write.c
index df92601eb..d7c03b958 100644
--- a/plugins/openoffice/openoffice-write.c
+++ b/plugins/openoffice/openoffice-write.c
@@ -219,17 +219,6 @@ static void odf_write_gog_style_graphic (GnmOOExport *state, GOStyle const *styl
 static void odf_write_gog_style_text (GnmOOExport *state, GOStyle const *style);
 
 
-static void
-odf_xml_end_element_check (GsfXMLOut *xout, char const *id)
-{
-       while (TRUE) {
-               const char *cid = gsf_xml_out_end_element (xout);
-               if (g_str_equal (cid, id))
-                       return;
-               g_critical ("Unbalanced xml tags while writing, please report");
-       }
-}
-
 /*****************************************************************************/
 
 #define PROGRESS_STEPS 500
@@ -5103,7 +5092,7 @@ odf_write_content (GnmOOExport *state, GsfOutput *child)
                                gsf_xml_out_end_element (state->xml); /* </gnm:selections> */
                        }
                }
-               gsf_xml_out_end_element (state->xml); /* </table:table> */
+               gnm_xml_out_end_element_check (state->xml, TABLE "table");
 
                has_autofilters |= (sheet->filters != NULL);
                odf_update_progress (state, state->sheet_progress);
@@ -5130,7 +5119,7 @@ odf_write_content (GnmOOExport *state, GsfOutput *child)
        gsf_xml_out_end_element (state->xml); /* </office:spreadsheet> */
        gsf_xml_out_end_element (state->xml); /* </office:body> */
 
-       odf_xml_end_element_check (state->xml, OFFICE "document-content");
+       gnm_xml_out_end_element_check (state->xml, OFFICE "document-content");
        g_object_unref (state->xml);
        state->xml = NULL;
 }
@@ -5823,7 +5812,7 @@ odf_write_styles (GnmOOExport *state, GsfOutput *child)
        odf_write_automatic_styles (state);
        odf_write_master_styles (state);
 
-       odf_xml_end_element_check (state->xml, OFFICE "document-styles");
+       gnm_xml_out_end_element_check (state->xml, OFFICE "document-styles");
 
        g_object_unref (state->xml);
        state->xml = NULL;
@@ -6357,7 +6346,7 @@ odf_write_settings (GnmOOExport *state, GsfOutput *child)
        odf_write_ooo_settings (state);
 
        gsf_xml_out_end_element (state->xml); /* </office:settings> */
-       odf_xml_end_element_check (state->xml, OFFICE "document-settings");
+       gnm_xml_out_end_element_check (state->xml, OFFICE "document-settings");
        g_object_unref (state->xml);
        state->xml = NULL;
 }
diff --git a/src/gutils.c b/src/gutils.c
index cf7f54d30..a2a5696a8 100644
--- a/src/gutils.c
+++ b/src/gutils.c
@@ -852,6 +852,29 @@ gnm_xml_in_doc_dispose_on_exit (GsfXMLInDoc **pdoc)
        gutils_xml_in_docs = g_slist_prepend (gutils_xml_in_docs, pdoc);
 }
 
+/**
+ * gnm_xml_out_end_element_check:
+ * @xout: #GsfXMLOut sink
+ * @id: expected tag being closed
+ *
+ * Closes an xml tag, expected it to be @id.  If it is not, tags will
+ * continue to be closed until the expected one is found in the hope
+ * that getting back to sync will make the result less corrupted.
+ */
+void
+gnm_xml_out_end_element_check (GsfXMLOut *xout, char const *id)
+{
+       while (TRUE) {
+               const char *cid = gsf_xml_out_end_element (xout);
+               if (!cid)
+                       return;
+               if (g_str_equal (cid, id))
+                       return;
+               g_critical ("Unbalanced xml tags while writing, please report");
+       }
+}
+
+
 /* ------------------------------------------------------------------------- */
 
 /**
diff --git a/src/gutils.h b/src/gutils.h
index 78894fbd8..945b5a425 100644
--- a/src/gutils.h
+++ b/src/gutils.h
@@ -60,6 +60,7 @@ void gnm_hash_table_foreach_ordered (GHashTable *h,
                                     gpointer user);
 
 void gnm_xml_in_doc_dispose_on_exit (GsfXMLInDoc **pdoc);
+void gnm_xml_out_end_element_check (GsfXMLOut *xout, char const *id);
 
 Sheet *gnm_file_saver_get_sheet (GOFileSaver const *fs,
                                 WorkbookView const *wbv);
diff --git a/src/xml-sax-write.c b/src/xml-sax-write.c
index f512c36f5..c0f18cb7b 100644
--- a/src/xml-sax-write.c
+++ b/src/xml-sax-write.c
@@ -1400,7 +1400,7 @@ xml_write_sheet (GnmOutputXML *state, Sheet const *sheet)
        xml_write_solver (state);
        xml_write_scenarios (state);
 
-       gsf_xml_out_end_element (state->output); /* </gnm:Sheet> */
+       gnm_xml_out_end_element_check (state->output, GNM "Sheet");
        state->sheet = NULL;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]