aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--widgets/table/e-cell-progress.c6
-rw-r--r--widgets/table/e-table-specification.c37
-rw-r--r--widgets/table/e-table-state.c35
-rw-r--r--widgets/table/e-table.c32
-rw-r--r--widgets/table/e-tree-table-adapter.c36
5 files changed, 125 insertions, 21 deletions
diff --git a/widgets/table/e-cell-progress.c b/widgets/table/e-cell-progress.c
index 41edac7ef3..d38adb5082 100644
--- a/widgets/table/e-cell-progress.c
+++ b/widgets/table/e-cell-progress.c
@@ -26,7 +26,13 @@
* 02111-1307, USA.
*/
+
+#ifdef HAVE_CONFIG_H
#include <config.h>
+#endif
+
+#include <string.h>
+
#include <gtk/gtkenums.h>
#include <gtk/gtkentry.h>
#include <gtk/gtkwindow.h>
diff --git a/widgets/table/e-table-specification.c b/widgets/table/e-table-specification.c
index 4c04d78c80..92f8b42921 100644
--- a/widgets/table/e-table-specification.c
+++ b/widgets/table/e-table-specification.c
@@ -21,12 +21,18 @@
* 02111-1307, USA.
*/
+#ifdef HAVE_CONFIG_H
#include <config.h>
+#endif
#include "e-table-specification.h"
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
#include <gtk/gtksignal.h>
#include <gnome-xml/parser.h>
#include <gnome-xml/xmlmemory.h>
@@ -272,21 +278,44 @@ e_table_specification_load_from_node (ETableSpecification *specification,
*
* This routine stores the @specification into @filename.
*
- * Returns: the number of bytes written or -1 on error.
+ * Returns: 0 on success or -1 on error.
*/
int
e_table_specification_save_to_file (ETableSpecification *specification,
const char *filename)
{
+ char *tmp, *slash;
xmlDoc *doc;
-
+ int ret;
+
g_return_val_if_fail (specification != NULL, -1);
g_return_val_if_fail (filename != NULL, -1);
g_return_val_if_fail (E_IS_TABLE_SPECIFICATION (specification), -1);
- doc = xmlNewDoc ("1.0");
+ if ((doc = xmlNewDoc ("1.0")) == NULL) {
+ errno = ENOMEM;
+ return -1;
+ }
+
xmlDocSetRootElement (doc, e_table_specification_save_to_node (specification, doc));
- return xmlSaveFile (filename, doc);
+
+ tmp = alloca (strlen (filename) + 5);
+ slash = strrchr (filename, '/');
+ if (slash)
+ sprintf (tmp, "%.*s.#%s", slash - filename + 1, filename, slash + 1);
+ else
+ sprintf (tmp, ".#%s", filename);
+
+ ret = e_xml_save_file (tmp, doc);
+ if (ret != -1)
+ ret = rename (tmp, filename);
+
+ if (ret == -1)
+ unlink (tmp);
+
+ xmlFreeDoc (doc);
+
+ return ret;
}
/**
diff --git a/widgets/table/e-table-state.c b/widgets/table/e-table-state.c
index a0d746bf36..59a05f6738 100644
--- a/widgets/table/e-table-state.c
+++ b/widgets/table/e-table-state.c
@@ -21,9 +21,17 @@
* 02111-1307, USA.
*/
+
+#ifdef HAVE_CONFIG_H
#include <config.h>
+#endif
+
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
#include <gtk/gtksignal.h>
#include <gtk/gtkobject.h>
#include <gnome-xml/parser.h>
@@ -179,11 +187,30 @@ void
e_table_state_save_to_file (ETableState *state,
const char *filename)
{
+ char *tmp, *slash;
xmlDoc *doc;
- doc = xmlNewDoc("1.0");
- xmlDocSetRootElement(doc, e_table_state_save_to_node(state, NULL));
- xmlSaveFile(filename, doc);
- xmlFreeDoc(doc);
+ int ret;
+
+ if ((doc = xmlNewDoc ("1.0")) == NULL)
+ return;
+
+ xmlDocSetRootElement (doc, e_table_state_save_to_node (state, NULL));
+
+ tmp = alloca (strlen (filename) + 5);
+ slash = strrchr (filename, '/');
+ if (slash)
+ sprintf (tmp, "%.*s.#%s", slash - filename + 1, filename, slash + 1);
+ else
+ sprintf (tmp, ".#%s", filename);
+
+ ret = e_xml_save_file (tmp, doc);
+ if (ret != -1)
+ ret = rename (tmp, filename);
+
+ if (ret == -1)
+ unlink (tmp);
+
+ xmlFreeDoc (doc);
}
char *
diff --git a/widgets/table/e-table.c b/widgets/table/e-table.c
index 13873f12b0..2fba247dab 100644
--- a/widgets/table/e-table.c
+++ b/widgets/table/e-table.c
@@ -22,11 +22,16 @@
* 02111-1307, USA.
*/
+
+#ifdef HAVE_CONFIG_H
#include <config.h>
-#include <stdlib.h>
+#endif
+
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
-#include <stdio.h>
+#include <unistd.h>
+
#include <gdk/gdkkeysyms.h>
#include <gtk/gtksignal.h>
#include <libgnomeui/gnome-canvas.h>
@@ -1785,15 +1790,30 @@ e_table_set_specification (ETable *e_table, const char *spec)
}
void
-e_table_save_specification (ETable *e_table, gchar *filename)
+e_table_save_specification (ETable *e_table, const char *filename)
{
xmlDoc *doc = et_build_tree (e_table);
-
+ char *tmp, *slash;
+ int ret;
+
g_return_if_fail(e_table != NULL);
g_return_if_fail(E_IS_TABLE(e_table));
g_return_if_fail(filename != NULL);
-
- xmlSaveFile (filename, doc);
+
+ tmp = alloca (strlen (filename) + 5);
+ slash = strrchr (filename, '/');
+ if (slash)
+ sprintf (tmp, "%.*s.#%s", slash - filename + 1, filename, slash + 1);
+ else
+ sprintf (tmp, ".#%s", filename);
+
+ ret = e_xml_save_file (tmp, doc);
+ if (ret != -1)
+ ret = rename (tmp, filename);
+
+ if (ret == -1)
+ unlink (tmp);
+
xmlFreeDoc (doc);
}
diff --git a/widgets/table/e-tree-table-adapter.c b/widgets/table/e-tree-table-adapter.c
index 20f41e6ebc..552b15ddf6 100644
--- a/widgets/table/e-tree-table-adapter.c
+++ b/widgets/table/e-tree-table-adapter.c
@@ -22,9 +22,17 @@
* 02111-1307, USA.
*/
+
+#ifdef HAVE_CONFIG_H
#include <config.h>
+#endif
+
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
#include <gtk/gtksignal.h>
#include <gnome-xml/tree.h>
#include <gnome-xml/parser.h>
@@ -931,11 +939,13 @@ save_expanded_state_func (gpointer keyp, gpointer value, gpointer data)
void
e_tree_table_adapter_save_expanded_state (ETreeTableAdapter *etta, const char *filename)
{
- xmlDoc *doc;
- xmlNode *root;
ETreeTableAdapterPriv *priv;
+ char *tmp, *slash;
TreeAndRoot tar;
-
+ xmlDocPtr doc;
+ xmlNode *root;
+ int ret;
+
g_return_if_fail(etta != NULL);
priv = etta->priv;
@@ -951,13 +961,25 @@ e_tree_table_adapter_save_expanded_state (ETreeTableAdapter *etta, const char *f
tar.root = root;
tar.tree = etta->priv->source;
-
+
g_hash_table_foreach (priv->attributes,
save_expanded_state_func,
&tar);
-
- xmlSaveFile (filename, doc);
-
+
+ tmp = alloca (strlen (filename) + 5);
+ slash = strrchr (filename, '/');
+ if (slash)
+ sprintf (tmp, "%.*s.#%s", slash - filename + 1, filename, slash + 1);
+ else
+ sprintf (tmp, ".#%s", filename);
+
+ ret = e_xml_save_file (tmp, doc);
+ if (ret != -1)
+ ret = rename (tmp, filename);
+
+ if (ret == -1)
+ unlink (tmp);
+
xmlFreeDoc (doc);
}