]> git.street.me.uk Git - andy/viking.git/blobdiff - src/viktrwlayer.c
Added layer marshalling support; for now trw and map layers are implemented.
[andy/viking.git] / src / viktrwlayer.c
index 6a4c93d1d13bf0bd5fa9c736152dcc8190977000..58ce9105a718e52fb5acadfd25bb97e7d857dcc1 100644 (file)
@@ -31,6 +31,7 @@
 #include "garminsymbols.h"
 #include "thumbnails.h"
 #include "background.h"
+#include "gpx.h"
 
 #include <math.h>
 #include <string.h>
@@ -186,6 +187,9 @@ static gboolean tool_new_waypoint ( VikTrwLayer *vtl, GdkEventButton *event, Vik
 static gboolean tool_new_track ( VikTrwLayer *vtl, GdkEventButton *event, VikViewport *vvp );
 
 static VikTrwLayer *trw_layer_copy ( VikTrwLayer *vtl, gpointer vp );
+static void trw_layer_marshall( VikTrwLayer *vtl, guint8 **data, gint *len );
+static VikTrwLayer *trw_layer_unmarshall( gpointer data, gint len, VikViewport *vvp );
+
 static gboolean trw_layer_set_param ( VikTrwLayer *vtl, guint16 id, VikLayerParamData data, VikViewport *vp );
 static VikLayerParamData trw_layer_get_param ( VikTrwLayer *vtl, guint16 id );
 
@@ -318,6 +322,8 @@ VikLayerInterface vik_trw_layer_interface = {
   (VikLayerFuncSublayerToggleVisible)   vik_trw_layer_sublayer_toggle_visible,
 
   (VikLayerFuncCopy)                    trw_layer_copy,
+  (VikLayerFuncMarshall)                trw_layer_marshall,
+  (VikLayerFuncUnmarshall)              trw_layer_unmarshall,
 
   (VikLayerFuncSetParam)                trw_layer_set_param,
   (VikLayerFuncGetParam)                trw_layer_get_param,
@@ -530,6 +536,59 @@ static void track_copy ( const gchar *name, VikTrack *tr, GHashTable *dest )
   g_hash_table_insert ( dest, g_strdup ( name ), vik_track_copy(tr) );
 }
 
+static void trw_layer_marshall( VikTrwLayer *vtl, guint8 **data, gint *len )
+{
+  guint8 *pd, *dd;
+  gint pl, dl;
+  gchar *tmpname;
+  FILE *f;
+
+  *data = NULL;
+
+  if ((f = fdopen(g_file_open_tmp (NULL, &tmpname, NULL), "r+"))) {
+    a_gpx_write_file(vtl, f);
+    vik_layer_marshall_params(VIK_LAYER(vtl), &pd, &pl);
+    fclose(f);
+    g_file_get_contents(tmpname, (void *)&dd, &dl, NULL);
+    *len = sizeof(pl) + pl + dl;
+    *data = g_malloc(*len);
+    memcpy(*data, &pl, sizeof(pl));
+    memcpy(*data + sizeof(pl), pd, pl);
+    memcpy(*data + sizeof(pl) + pl, dd, dl);
+    
+    g_free(pd);
+    g_free(dd);
+    remove(tmpname);
+    g_free(tmpname);
+  }
+}
+
+static VikTrwLayer *trw_layer_unmarshall( gpointer data, gint len, VikViewport *vvp )
+{
+  VikTrwLayer *rv = VIK_TRW_LAYER(vik_layer_create ( VIK_LAYER_TRW, vvp, NULL, FALSE ));
+  guint pl;
+  gchar *tmpname;
+  FILE *f;
+
+
+  memcpy(&pl, data, sizeof(pl));
+  data += sizeof(pl);
+  vik_layer_unmarshall_params ( VIK_LAYER(rv), data, pl, vvp );
+  data += pl;
+
+  if (!(f = fdopen(g_file_open_tmp (NULL, &tmpname, NULL), "r+"))) {
+    g_critical("couldn't open temp file\n");
+    exit(1);
+  }
+  fwrite(data, len - pl - sizeof(pl), 1, f);
+  rewind(f);
+  a_gpx_read_file(rv, f);
+  fclose(f);
+  remove(tmpname);
+  g_free(tmpname);
+  return rv;
+}
+
 static VikTrwLayer *trw_layer_copy ( VikTrwLayer *vtl, gpointer vp )
 {
   VikTrwLayer *rv = vik_trw_layer_new ( vtl->drawmode );
@@ -1568,8 +1627,8 @@ static void trw_layer_drag_drop_request ( VikTrwLayer *vtl_src, VikTrwLayer *vtl
   gint type = vik_treeview_item_get_data(vt, src_item_iter);
 
   if (!vik_treeview_item_get_pointer(vt, src_item_iter)) {
-    GSList *items = NULL;
-    GSList *iter;
+    GList *items = NULL;
+    GList *iter;
 
     if (type==VIK_TRW_LAYER_SUBLAYER_TRACKS) {
       g_hash_table_foreach ( vtl_src->tracks, (GHFunc)trw_layer_enum_item, &items);