+ *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);