diff options
author | Benjamin Otte <otte@redhat.com> | 2011-10-15 02:52:05 -0700 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2011-10-16 13:35:16 -0700 |
commit | 47504e67af03341185194304d1f2b86a7bd7bedb (patch) | |
tree | 2f268b2d775977e1d466e14077469e6843fd72db | |
parent | 459b6913bfb5c09d54b6edde9c9a4b16e2a50e1c (diff) |
object: Add game_object_load() and game_object_save()
-rw-r--r-- | libgame/game-object.c | 105 | ||||
-rw-r--r-- | libgame/game-object.h | 4 |
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); |