+static void aggregate_layer_marshall( VikAggregateLayer *val, guint8 **data, gint *datalen )
+{
+ GList *child = val->children;
+ VikLayer *child_layer;
+ guint8 *ld;
+ gint ll;
+ GByteArray* b = g_byte_array_new ();
+ gint len;
+
+#define alm_append(obj, sz) \
+ len = (sz); \
+ g_byte_array_append ( b, (guint8 *)&len, sizeof(len) ); \
+ g_byte_array_append ( b, (guint8 *)(obj), len );
+
+ vik_layer_marshall_params(VIK_LAYER(val), &ld, &ll);
+ alm_append(ld, ll);
+ g_free(ld);
+
+ while (child) {
+ child_layer = VIK_LAYER(child->data);
+ vik_layer_marshall ( child_layer, &ld, &ll );
+ if (ld) {
+ alm_append(ld, ll);
+ g_free(ld);
+ }
+ child = child->next;
+ }
+ *data = b->data;
+ *datalen = b->len;
+ g_byte_array_free(b, FALSE);
+#undef alm_append
+}
+
+static VikAggregateLayer *aggregate_layer_unmarshall( guint8 *data, gint len, VikViewport *vvp )
+{
+#define alm_size (*(gint *)data)
+#define alm_next \
+ len -= sizeof(gint) + alm_size; \
+ data += sizeof(gint) + alm_size;
+
+ VikAggregateLayer *rv = vik_aggregate_layer_new();
+ VikLayer *child_layer;
+
+ vik_layer_unmarshall_params ( VIK_LAYER(rv), data+sizeof(gint), alm_size, vvp );
+ alm_next;
+
+ while (len>0) {
+ child_layer = vik_layer_unmarshall ( data + sizeof(gint), alm_size, vvp );
+ if (child_layer) {
+ rv->children = g_list_append ( rv->children, child_layer );
+ g_signal_connect_swapped ( G_OBJECT(child_layer), "update", G_CALLBACK(vik_layer_emit_update), rv );
+ }
+ alm_next;
+ }
+ // g_print("aggregate_layer_unmarshall ended with len=%d\n", len);
+ return rv;
+#undef alm_size
+#undef alm_next
+}
+