[dia] diagram-as-element: serialize relative filenames



commit 4f2d03889116b1c34b915c6bbff6564d62d4b1c9
Author: Hans Breuer <hans breuer org>
Date:   Fri Jul 30 15:30:23 2010 +0200

    diagram-as-element: serialize relative filenames

 objects/Misc/diagram_as_object.c |   42 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 40 insertions(+), 2 deletions(-)
---
diff --git a/objects/Misc/diagram_as_object.c b/objects/Misc/diagram_as_object.c
index cb72d75..42b55ee 100644
--- a/objects/Misc/diagram_as_object.c
+++ b/objects/Misc/diagram_as_object.c
@@ -78,12 +78,14 @@ _dae_create (Point *startpoint,
 	     Handle **handle2);
 static DiaObject *
 _dae_load (ObjectNode obj_node, int version, const char *filename);
+static void
+_dae_save (DiaObject *obj, ObjectNode obj_node, const char *filename);
 
 static ObjectTypeOps _dae_type_ops =
 {
   (CreateFunc) _dae_create,
   (LoadFunc)   _dae_load, /* can't use object_load_using_properties, signature mismatch */
-  (SaveFunc)   object_save_using_properties,
+  (SaveFunc)   _dae_save, /* overwrite for filename normalization */
   (GetDefaultsFunc)   NULL,
   (ApplyDefaultsFunc) NULL
 };
@@ -337,6 +339,42 @@ _dae_create (Point *startpoint,
 static DiaObject *
 _dae_load (ObjectNode obj_node, int version, const char *filename)
 {
-  return object_load_using_properties (&diagram_as_element_type,
+  DiaObject *obj;
+  DiagramAsElement *dae;
+ 
+  obj = object_load_using_properties (&diagram_as_element_type,
                                        obj_node, version, filename);
+  /* filename de-normalization */
+  dae = (DiagramAsElement*)obj;
+  if (strlen(dae->filename) && !g_path_is_absolute (dae->filename)) {
+    gchar *dirname = g_path_get_dirname (filename);
+    gchar *filename = g_build_filename (dirname, dae->filename, NULL);
+    g_free (dae->filename);
+    dae->filename = filename;
+    g_free (dirname);    
+  }
+  return obj;
+}
+
+static void
+_dae_save (DiaObject *obj, ObjectNode obj_node, const char *filename)
+{
+  DiagramAsElement *dae;
+  /* filename normalization */
+  gchar *saved_path = NULL;
+
+  dae = (DiagramAsElement*)obj;
+  if (strlen(dae->filename) && g_path_is_absolute (dae->filename)) {
+    gchar *dirname = g_path_get_dirname (filename);
+    if (strstr (dae->filename, dirname) == dae->filename) {
+      saved_path = dae->filename;
+      dae->filename += (strlen (dirname) + 1);
+    }
+    g_free (dirname);
+  }
+  object_save_using_properties (obj, obj_node, diagram_as_element_type.version, filename);
+  
+  if (saved_path) {
+    dae->filename = saved_path;
+  }
 }



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