glib2.0/gobject/tests/properties-refcount4.c

182 lines
4.2 KiB
C

#include <glib.h>
#include <glib-object.h>
#define MY_TYPE_BADGER (my_badger_get_type ())
#define MY_BADGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_BADGER, MyBadger))
#define MY_IS_BADGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_BADGER))
#define MY_BADGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MY_TYPE_BADGER, MyBadgerClass))
#define MY_IS_BADGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MY_TYPE_BADGER))
#define MY_BADGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MY_TYPE_BADGER, MyBadgerClass))
enum {
PROP_0,
PROP_MAMA
};
typedef struct _MyBadger MyBadger;
typedef struct _MyBadgerClass MyBadgerClass;
struct _MyBadger
{
GObject parent_instance;
MyBadger * mama;
guint mama_notify_count;
};
struct _MyBadgerClass
{
GObjectClass parent_class;
};
static GType my_badger_get_type (void);
G_DEFINE_TYPE (MyBadger, my_badger, G_TYPE_OBJECT)
static void my_badger_dispose (GObject * object);
static void my_badger_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void my_badger_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void my_badger_mama_notify (GObject *object,
GParamSpec *pspec);
static void
my_badger_class_init (MyBadgerClass * klass)
{
GObjectClass *gobject_class;
gobject_class = (GObjectClass *) klass;
gobject_class->dispose = my_badger_dispose;
gobject_class->get_property = my_badger_get_property;
gobject_class->set_property = my_badger_set_property;
g_object_class_install_property (gobject_class,
PROP_MAMA,
g_param_spec_object ("mama",
NULL,
NULL,
MY_TYPE_BADGER,
G_PARAM_READWRITE));
}
static void
my_badger_init (MyBadger * self)
{
g_signal_connect (self, "notify::mama", G_CALLBACK (my_badger_mama_notify),
NULL);
}
static void
my_badger_dispose (GObject * object)
{
MyBadger * self;
self = MY_BADGER (object);
if (self->mama != NULL)
{
g_object_unref (self->mama);
self->mama = NULL;
}
G_OBJECT_CLASS (my_badger_parent_class)->dispose (object);
}
static void
my_badger_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
MyBadger *self;
self = MY_BADGER (object);
switch (prop_id)
{
case PROP_MAMA:
g_value_set_object (value, self->mama);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
my_badger_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
MyBadger *self;
self = MY_BADGER (object);
switch (prop_id)
{
case PROP_MAMA:
if (self->mama)
g_object_unref (self->mama);
self->mama = g_value_dup_object (value);
if (self->mama)
g_object_set (self->mama, "mama", NULL, NULL); /* another notify */
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
my_badger_mama_notify (GObject *object,
GParamSpec *pspec)
{
MyBadger *self;
self = MY_BADGER (object);
self->mama_notify_count++;
}
static void
test_refcount_properties_4 (void)
{
MyBadger * badger1, * badger2;
gpointer test;
badger1 = g_object_new (MY_TYPE_BADGER, NULL);
badger2 = g_object_new (MY_TYPE_BADGER, NULL);
g_object_set (badger1, "mama", badger2, NULL);
g_assert_cmpuint (badger1->mama_notify_count, ==, 1);
g_assert_cmpuint (badger2->mama_notify_count, ==, 1);
g_object_get (badger1, "mama", &test, NULL);
g_assert_cmpmem (test, sizeof (MyBadger), badger2, sizeof (MyBadger));
g_object_unref (test);
g_object_unref (badger1);
g_object_unref (badger2);
}
int
main (int argc, gchar *argv[])
{
g_log_set_always_fatal (G_LOG_LEVEL_WARNING |
G_LOG_LEVEL_CRITICAL |
g_log_set_always_fatal (G_LOG_FATAL_MASK));
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/gobject/refcount/properties-4", test_refcount_properties_4);
return g_test_run ();
}