summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2011-10-15 02:52:05 -0700
committerBenjamin Otte <otte@redhat.com>2011-10-16 13:35:16 -0700
commit47504e67af03341185194304d1f2b86a7bd7bedb (patch)
tree2f268b2d775977e1d466e14077469e6843fd72db
parent459b6913bfb5c09d54b6edde9c9a4b16e2a50e1c (diff)
object: Add game_object_load() and game_object_save()
-rw-r--r--libgame/game-object.c105
-rw-r--r--libgame/game-object.h4
2 files changed, 109 insertions, 0 deletions
diff --git a/libgame/game-object.c b/libgame/game-object.c
index 9c7c671..25a5134 100644
--- a/libgame/game-object.c
+++ b/libgame/game-object.c
@@ -154,6 +154,17 @@ game_object_do_copy (GameObject *dest, GameObject *src)
return TRUE;
}
+static gboolean
+game_object_do_load (GameObject *dest, GVariantIter *iter)
+{
+ return TRUE;
+}
+
+static void
+game_object_do_save (GameObject *dest, GVariantBuilder *builder)
+{
+}
+
static void
game_object_base_init (gpointer g_class)
{
@@ -187,6 +198,8 @@ game_object_class_init (gpointer g_class, gpointer class_data)
FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
gameobject_class->copy = game_object_do_copy;
+ gameobject_class->load = game_object_do_load;
+ gameobject_class->save = game_object_do_save;
gameobject_class->to_string = game_object_do_to_string;
}
@@ -239,6 +252,98 @@ game_object_copy (GameObject *object)
return copy;
}
+GameObject *
+game_object_load (GameGame *game,
+ GVariant *variant,
+ GError **error)
+{
+ GameObject *object;
+ GameObjectClass *klass;
+ GVariantIter iter;
+ GVariant *value;
+ GType type;
+
+ g_return_val_if_fail (GAME_IS_GAME (game), NULL);
+ g_return_val_if_fail (variant != NULL, NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ if (g_variant_classify (variant) != G_VARIANT_CLASS_TUPLE)
+ {
+ g_set_error_literal (error, G_VARIANT_PARSE_ERROR, G_VARIANT_PARSE_ERROR_TYPE_ERROR,
+ _("Expected a struct for game_object_load()"));
+ return NULL;
+ }
+
+ g_variant_iter_init (&iter, variant);
+
+ value = g_variant_iter_next_value (&iter);
+ if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
+ {
+ const char *type_name = g_variant_get_string (value, NULL);
+
+ if (type_name)
+ {
+ type = g_type_from_name (g_variant_get_string (value, NULL));
+ if (type == 0)
+ g_set_error (error, G_VARIANT_PARSE_ERROR, G_VARIANT_PARSE_ERROR_FAILED,
+ _("`%s' is not a valid type name"), type_name);
+ else if (!g_type_is_a (type, GAME_TYPE_OBJECT))
+ {
+ g_set_error (error, G_VARIANT_PARSE_ERROR, G_VARIANT_PARSE_ERROR_FAILED,
+ _("`%s' is not a valid object type"), type_name);
+ type = 0;
+ }
+ }
+ else
+ {
+ g_set_error_literal (error, G_VARIANT_PARSE_ERROR, G_VARIANT_PARSE_ERROR_VALUE_EXPECTED,
+ _("No type name given"));
+ }
+ }
+ else
+ {
+ g_set_error_literal (error, G_VARIANT_PARSE_ERROR, G_VARIANT_PARSE_ERROR_INVALID_TYPE_STRING,
+ _("No object type name string given"));
+ type = 0;
+ }
+
+ g_variant_unref (value);
+ if (type == 0)
+ return NULL;
+
+ object = game_game_add_object (game, type, NULL);
+
+ klass = GAME_OBJECT_GET_CLASS (object);
+ if (! klass->load (object, &iter))
+ {
+ g_object_unref (object);
+ return NULL;
+ }
+
+ return object;
+}
+
+GVariant *
+game_object_save (GameObject *object)
+{
+ GameObjectClass *klass;
+ GVariantBuilder builder;
+ GVariant *variant;
+
+ g_return_val_if_fail (GAME_IS_OBJECT (object), NULL);
+
+ klass = GAME_OBJECT_GET_CLASS (object);
+
+ g_variant_builder_init (&builder, G_VARIANT_TYPE_TUPLE);
+ g_variant_builder_add (&builder, "s", G_OBJECT_TYPE_NAME (object));
+
+ klass->save (object, &builder);
+
+ variant = g_variant_builder_end (&builder);
+
+ return variant;
+}
+
gchar *
game_object_to_string (gpointer object)
{
diff --git a/libgame/game-object.h b/libgame/game-object.h
index 2cf2a63..33a2e63 100644
--- a/libgame/game-object.h
+++ b/libgame/game-object.h
@@ -59,6 +59,10 @@ struct _GameObjectClass {
int tick_priority;
/* vfuncs */
void (* tick_func) (GameObject * object);
+ void (* save) (GameObject * object,
+ GVariantBuilder *builder);
+ gboolean (* load) (GameObject * object,
+ GVariantIter * iter);
gboolean (* copy) (GameObject * dest,
GameObject * src);
void (* game_set) (GameObject * object);