[gnumeric] xls: fix escher container lengths.



commit a823e563958f2e0c45591ddf7dbe200c46f44ff3
Author: Morten Welinder <terra gnome org>
Date:   Wed Oct 7 09:09:02 2009 -0400

    xls: fix escher container lengths.

 plugins/excel/ChangeLog        |    9 +++++++++
 plugins/excel/ms-escher.c      |    6 +++---
 plugins/excel/ms-excel-write.c |   20 ++++++++++++++++----
 3 files changed, 28 insertions(+), 7 deletions(-)
---
diff --git a/plugins/excel/ChangeLog b/plugins/excel/ChangeLog
index 4288ba5..ed0c670 100644
--- a/plugins/excel/ChangeLog
+++ b/plugins/excel/ChangeLog
@@ -1,3 +1,12 @@
+2009-10-07  Morten Welinder  <terra gnome org>
+
+	* ms-excel-write.c (excel_write_textbox_v8): Make sure the textbox
+	gets to be part of the container.
+
+	* ms-escher.c (ms_escher_opt_end): Docs were wrong.  Do not
+	include own header in length.
+	(ms_escher_opt_add_str_wchar): Fix type error.
+
 2009-10-06  Morten Welinder  <terra gnome org>
 
 	* ms-excel-read.c (ms_sheet_realize_obj): Restore colour reading.
diff --git a/plugins/excel/ms-escher.c b/plugins/excel/ms-escher.c
index 3ff3758..9de5ba6 100644
--- a/plugins/excel/ms-escher.c
+++ b/plugins/excel/ms-escher.c
@@ -2209,8 +2209,8 @@ ms_escher_spcontainer_start (GString *buf)
 void
 ms_escher_spcontainer_end (GString *buf, gsize marker)
 {
-	/* Length includes header.  */
-	gsize len = buf->len - marker;
+	/* Length does not include header.  */
+	gsize len = buf->len - marker - 8;
 	GSF_LE_SET_GUINT32 (buf->str + marker + 4, len);
 }
 
@@ -2263,7 +2263,7 @@ void
 ms_escher_opt_add_str_wchar (GString *buf, gsize marker, GString *extra,
 			     guint16 pid, const char *str)
 {
-	gsize ic;
+	glong ic;
 	gunichar2 *str16 = g_utf8_to_utf16 (str, -1, NULL, &ic, NULL);
 	guint8 tmp[6];
 
diff --git a/plugins/excel/ms-excel-write.c b/plugins/excel/ms-excel-write.c
index f231d22..5cb677a 100644
--- a/plugins/excel/ms-excel-write.c
+++ b/plugins/excel/ms-excel-write.c
@@ -4258,6 +4258,8 @@ excel_write_textbox_v8 (ExcelWriteSheet *esheet, SheetObject *so)
 	SheetObjectAnchor anchor;
 	SheetObjectAnchor const *real_anchor = sheet_object_get_anchor (so);
 	guint8 zero[4] = { 0, 0, 0, 0 };
+	gsf_off_t sppos;
+	guint32 splen;
 	gsize spmark, optmark;
 	guint16 flags;
 	int type;
@@ -4312,7 +4314,7 @@ excel_write_textbox_v8 (ExcelWriteSheet *esheet, SheetObject *so)
 	spmark = ms_escher_spcontainer_start (escher);
 
 	ms_escher_sp (escher, id, shape, 0x00000a00);  /* fHaveAnchor+fHaveSpt */
-	
+
 	optmark = ms_escher_opt_start (escher);
 	extra = g_string_new (NULL);
 	ms_escher_opt_add_simple (escher, optmark,
@@ -4343,11 +4345,17 @@ excel_write_textbox_v8 (ExcelWriteSheet *esheet, SheetObject *so)
 
 	ms_escher_clientdata (escher, NULL, 0);
 
+	/* At this point we're still missing the textbox below.  */
+
 	ms_escher_spcontainer_end (escher, spmark);
 
+	sppos = bp->streamPos + 4;
+	splen = GSF_LE_GET_GUINT32 (escher->str + spmark + 4);
+
+	draw_len += escher->len;
+
 	ms_biff_put_var_write (bp, escher->str, escher->len);
 	ms_biff_put_commit (bp);
-	draw_len += escher->len;
 
 	g_string_free (escher, TRUE);
 
@@ -4359,8 +4367,12 @@ excel_write_textbox_v8 (ExcelWriteSheet *esheet, SheetObject *so)
 
 	ms_biff_put_commit (bp);
 
-	if (1 || do_textbox)
-		draw_len += excel_write_ClientTextbox (ewb, so);
+	if (1 || do_textbox) {
+		gsize this_len = excel_write_ClientTextbox (ewb, so);
+		draw_len += this_len;
+		splen += this_len;
+		ms_biff_put_abs_write (bp, sppos + 4, &splen, 4);
+	}
 
 	return draw_len;
 }



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