person.h:
#ifndef _PERSON_H
#define _PERSON_H
#include
#include
#include
#define PERSON_TYPE ( person_get_type() )
#define PERSON(obj) ( G_TYPE_CHECK_INSTANCE_CAST((obj), PERSON_TYPE, CPerson) )
#define PERSON_CLASS(klass) ( G_TYPE_CHECK_CLASS_CAST((klass), PERSON_TYPE, CPersonClass ) )
#define IS_PERSON(obj) ( G_TYPE_CHECK_INSTANCE_TYPE((obj), PERSON_TYPE) )
#define IS_PERSONCALSS(klass) ( G_TYPE_CHECK_CLASS_TYPE((klass), PERSON_TYPE) )
#define PERSON_GET_CLASS(obj) ( G_TYPE_INSTANCE_GET_CLASS(), PERSON_TYPE, CPersonClass )
typedef struct _CPerson CPerson;
typedef struct _CPersonClass CPersonClass;
struct _CPerson
{
GObject parent;
gchar* name;
};
struct _CPersonClass
{
GObjectClass parent_class;
};
/* all of internal interface */
GType person_get_type(void);
/*{@ property definition for person
*/
#define PERSON_PROPERTY_INDEX_NAME 1
/*@} end definition
*/
/* print function name*/
#define PERSON_PRINT_SELF() g_printf("%s\n",__FUNCTION__);
/* user interface */
CPerson* person_new();
#endif/* person.h*/
person.c:
#include "person.h"
#include
#include
static void person_set_property( GObject* object, guint property_id, GValue *value, GParamSpec* spec);
static void person_get_property( GObject* object, guint property_id, GValue *value, GParamSpec* spec);
static void person_init( CPerson* person)
{
g_print("%s\n", __FUNCTION__);
person->name = "none";
}
static void class_init(CPersonClass* klass)
{
GObjectClass* obj_class = G_OBJECT_CLASS(klass);
obj_class->set_property = person_set_property;
obj_class->get_property = person_get_property;
g_object_class_install_property(obj_class,1, g_param_spec_string("name", "name", "name of this person", "none", G_PARAM_READABLE|G_PARAM_WRITABLE));
PERSON_PRINT_SELF();
}
GType person_get_type(void)
{
static GType person_type = 0;
if(!person_type){
GTypeInfo info = { sizeof(CPersonClass),
/* base init&finalize*/
NULL,
NULL,
/*Class init & finalize*/
(GClassInitFunc)class_init,
NULL,
NULL,
sizeof(CPerson),
0,
(GInstanceInitFunc)person_init
};
person_type = g_type_register_static( G_TYPE_OBJECT, "person", &info, 0);
}
return person_type;
}
static void person_set_property( GObject* object, guint property_id, GValue *value, GParamSpec* spec)
{
CPerson* person = PERSON(object);
PERSON_PRINT_SELF();
switch(property_id)
{
case 1:
person->name = g_value_dup_string(value);
break;
default:
break;
}
}
static void person_get_property( GObject* object, guint property_id, GValue *value, GParamSpec* spec)
{
CPerson* person = PERSON(object);
PERSON_PRINT_SELF();
switch(property_id)
{
case 1:
g_value_set_string(value, person->name);
break;
default:
break;
}
}
CPerson* person_new()
{
CPerson* person = 0;
//if used the gtype system, we'd call this API for init.
g_type_init();
person = g_object_new(PERSON_TYPE, NULL);
return person;
}
main.c:
#include "person.h"
gint main(gint argc, gchar* argv[])
{
CPerson* you=0;
gchar* name = 0;
you = person_new();
g_object_set(G_OBJECT(you),"name", "test", NULL);
g_object_get(G_OBJECT(you), "name", &name, NULL);
g_print("default name=%s\n", name);
}
发表于 @ 2008年07月21日 10:08:00|评论(loading...)|收藏