forked from enlightenment/efl
Eobj: eobj_generic_data_*->EOBJ_BASE_DATA_*.
And also split the base class away from eobj.c SVN revision: 70267
This commit is contained in:
parent
bad7533b67
commit
2764023655
|
@ -30,7 +30,7 @@ _constructor(Eobj *obj, void *class_data __UNUSED__)
|
||||||
fail_if(eobj_composite_is(obj));
|
fail_if(eobj_composite_is(obj));
|
||||||
fail_if(!eobj_composite_is(simple));
|
fail_if(!eobj_composite_is(simple));
|
||||||
|
|
||||||
eobj_generic_data_set(obj, "simple-obj", simple);
|
eobj_do(obj, EOBJ_BASE_DATA_SET("simple-obj", simple, NULL));
|
||||||
|
|
||||||
eobj_unref(simple);
|
eobj_unref(simple);
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,8 @@ main(int argc, char *argv[])
|
||||||
fail_if(a != 1);
|
fail_if(a != 1);
|
||||||
|
|
||||||
/* disable the callback forwarder, and fail if it's still called. */
|
/* disable the callback forwarder, and fail if it's still called. */
|
||||||
Eobj *simple = eobj_generic_data_get(obj, "simple-obj");
|
Eobj *simple;
|
||||||
|
eobj_do(obj, EOBJ_BASE_DATA_GET("simple-obj", (void **) &simple));
|
||||||
eobj_ref(simple);
|
eobj_ref(simple);
|
||||||
eobj_event_callback_forwarder_del(simple, SIG_A_CHANGED, obj);
|
eobj_event_callback_forwarder_del(simple, SIG_A_CHANGED, obj);
|
||||||
|
|
||||||
|
|
|
@ -32,14 +32,16 @@ const Eobj_Class *evas_object_class_get(void) EINA_CONST;
|
||||||
static inline Evas_Object *
|
static inline Evas_Object *
|
||||||
eobj_evas_object_get(Eobj *obj)
|
eobj_evas_object_get(Eobj *obj)
|
||||||
{
|
{
|
||||||
return eobj_generic_data_get(obj, EVAS_OBJ_STR);
|
void *data;
|
||||||
|
eobj_do(obj, EOBJ_BASE_DATA_GET(EVAS_OBJ_STR, &data));
|
||||||
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: Hack in the meanwhile. */
|
/* FIXME: Hack in the meanwhile. */
|
||||||
static inline void
|
static inline void
|
||||||
eobj_evas_object_set(Eobj *obj, Evas_Object *evas_obj)
|
eobj_evas_object_set(Eobj *obj, Evas_Object *evas_obj)
|
||||||
{
|
{
|
||||||
eobj_generic_data_set(obj, EVAS_OBJ_STR, evas_obj);
|
eobj_do(obj, EOBJ_BASE_DATA_SET(EVAS_OBJ_STR, evas_obj, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -70,7 +70,7 @@ _constructor(Eobj *obj, void *class_data __UNUSED__)
|
||||||
eobj_event_callback_add(obj, EOBJ_EV_CALLBACK_ADD, _cb_added, NULL);
|
eobj_event_callback_add(obj, EOBJ_EV_CALLBACK_ADD, _cb_added, NULL);
|
||||||
eobj_event_callback_add(obj, EOBJ_EV_CALLBACK_DEL, _cb_deled, NULL);
|
eobj_event_callback_add(obj, EOBJ_EV_CALLBACK_DEL, _cb_deled, NULL);
|
||||||
|
|
||||||
eobj_generic_data_set(obj, "cb_count", (intptr_t) 0);
|
eobj_do(obj, EOBJ_BASE_DATA_SET("cb_count", (intptr_t) 0, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
LIST(APPEND EOBJ_CC_SOURCES
|
LIST(APPEND EOBJ_CC_SOURCES
|
||||||
eobj.c
|
eobj.c
|
||||||
|
eobj_base_class.c
|
||||||
)
|
)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
|
|
|
@ -407,40 +407,6 @@ EAPI int eobj_ref_get(const Eobj *obj);
|
||||||
*/
|
*/
|
||||||
EAPI void eobj_del(Eobj *obj);
|
EAPI void eobj_del(Eobj *obj);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set generic data to object.
|
|
||||||
* @param obj the object to work on.
|
|
||||||
* @param key the key associated with the data
|
|
||||||
* @param data the data to set.
|
|
||||||
* @return the previous data associated with the key.
|
|
||||||
*
|
|
||||||
* @see eobj_generic_data_get()
|
|
||||||
* @see eobj_generic_data_del()
|
|
||||||
*/
|
|
||||||
EAPI void *eobj_generic_data_set(Eobj *obj, const char *key, const void *data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get generic data from object.
|
|
||||||
* @param obj the object to work on.
|
|
||||||
* @param key the key associated with the data
|
|
||||||
* @return the data associated with the key.
|
|
||||||
*
|
|
||||||
* @see eobj_generic_data_set()
|
|
||||||
* @see eobj_generic_data_del()
|
|
||||||
*/
|
|
||||||
EAPI void *eobj_generic_data_get(const Eobj *obj, const char *key);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Del generic data from object.
|
|
||||||
* @param obj the object to work on.
|
|
||||||
* @param key the key associated with the data
|
|
||||||
* @return the data previously associated with the key.
|
|
||||||
*
|
|
||||||
* @see eobj_generic_data_set()
|
|
||||||
* @see eobj_generic_data_get()
|
|
||||||
*/
|
|
||||||
EAPI void *eobj_generic_data_del(Eobj *obj, const char *key);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var _EOBJ_EV_FREE
|
* @var _EOBJ_EV_FREE
|
||||||
* see #EOBJ_EV_FREE
|
* see #EOBJ_EV_FREE
|
||||||
|
@ -682,6 +648,65 @@ EAPI extern const Eobj_Event_Description _EOBJ_EV_CALLBACK_DEL;
|
||||||
* */
|
* */
|
||||||
EAPI const Eobj_Class *eobj_base_class_get(void) EINA_CONST;
|
EAPI const Eobj_Class *eobj_base_class_get(void) EINA_CONST;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef eobj_base_data_free_func
|
||||||
|
* Data free func prototype.
|
||||||
|
*/
|
||||||
|
typedef void (*eobj_base_data_free_func)(void *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var EOBJ_BASE_BASE_ID
|
||||||
|
* #EOBJ_BASE_CLASS 's base id.
|
||||||
|
*/
|
||||||
|
extern EAPI Eobj_Op EOBJ_BASE_BASE_ID;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
EOBJ_BASE_SUB_ID_DATA_SET,
|
||||||
|
EOBJ_BASE_SUB_ID_DATA_GET,
|
||||||
|
EOBJ_BASE_SUB_ID_DATA_DEL,
|
||||||
|
EOBJ_BASE_SUB_ID_LAST
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @def EOBJ_BASE_ID(sub_id)
|
||||||
|
* Helper macro to get the full Op ID out of the sub_id for EOBJ_BASE.
|
||||||
|
* @param sub_id the sub id inside EOBJ_BASE.
|
||||||
|
*/
|
||||||
|
#define EOBJ_BASE_ID(sub_id) (EOBJ_BASE_BASE_ID + sub_id)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @def EOBJ_BASE_DATA_SET(key, data, free_func)
|
||||||
|
* Set generic data to object.
|
||||||
|
* @param key the key associated with the data
|
||||||
|
* @param data the data to set.
|
||||||
|
* @param free_func the func to free data with (NULL means "do nothing").
|
||||||
|
*
|
||||||
|
* @see #EOBJ_BASE_DATA_GET
|
||||||
|
* @see #EOBJ_BASE_DATA_DEL
|
||||||
|
*/
|
||||||
|
#define EOBJ_BASE_DATA_SET(key, data, free_func) EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_DATA_SET), EOBJ_TYPECHECK(const char *, key), EOBJ_TYPECHECK(const void *, data), EOBJ_TYPECHECK(eobj_base_data_free_func, free_func)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @def EOBJ_BASE_DATA_GET(key, data)
|
||||||
|
* Get generic data from object.
|
||||||
|
* @param key the key associated with the data
|
||||||
|
* @param data the data for the key
|
||||||
|
*
|
||||||
|
* @see #EOBJ_BASE_DATA_SET
|
||||||
|
* @see #EOBJ_BASE_DATA_DEL
|
||||||
|
*/
|
||||||
|
#define EOBJ_BASE_DATA_GET(key, data) EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_DATA_GET), EOBJ_TYPECHECK(const char *, key), EOBJ_TYPECHECK(void **, data)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @def EOBJ_BASE_DATA_DEL(key)
|
||||||
|
* Get generic data from object.
|
||||||
|
* @param key the key associated with the data
|
||||||
|
*
|
||||||
|
* @see #EOBJ_BASE_DATA_SET
|
||||||
|
* @see #EOBJ_BASE_DATA_DEL
|
||||||
|
*/
|
||||||
|
#define EOBJ_BASE_DATA_DEL(key) EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_DATA_DEL), EOBJ_TYPECHECK(const char *, key)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,48 +1,23 @@
|
||||||
#include <Eina.h>
|
#include <Eina.h>
|
||||||
|
|
||||||
#include "Eobj.h"
|
#include "Eobj.h"
|
||||||
|
#include "eobj_private.h"
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
typedef int Eobj_Class_Id;
|
typedef int Eobj_Class_Id;
|
||||||
|
|
||||||
static int _eobj_log_dom = -1;
|
int _eobj_log_dom = -1;
|
||||||
|
|
||||||
static Eobj_Class **_eobj_classes;
|
static Eobj_Class **_eobj_classes;
|
||||||
static Eobj_Class_Id _eobj_classes_last_id;
|
static Eobj_Class_Id _eobj_classes_last_id;
|
||||||
static Eina_Bool _eobj_init_count = 0;
|
static Eina_Bool _eobj_init_count = 0;
|
||||||
|
|
||||||
static void _eobj_callback_remove_all(Eobj *obj);
|
static void _eobj_callback_remove_all(Eobj *obj);
|
||||||
static void _eobj_generic_data_del_all(Eobj *obj);
|
|
||||||
static void eobj_class_constructor(Eobj *obj, const Eobj_Class *klass);
|
static void eobj_class_constructor(Eobj *obj, const Eobj_Class *klass);
|
||||||
static void eobj_class_destructor(Eobj *obj, const Eobj_Class *klass);
|
static void eobj_class_destructor(Eobj *obj, const Eobj_Class *klass);
|
||||||
static void eobj_constructor_error_unset(Eobj *obj);
|
static void eobj_constructor_error_unset(Eobj *obj);
|
||||||
|
|
||||||
#ifdef CRITICAL
|
|
||||||
#undef CRITICAL
|
|
||||||
#endif
|
|
||||||
#define CRITICAL(...) EINA_LOG_DOM_CRIT(_eobj_log_dom, __VA_ARGS__)
|
|
||||||
|
|
||||||
#ifdef ERR
|
|
||||||
#undef ERR
|
|
||||||
#endif
|
|
||||||
#define ERR(...) EINA_LOG_DOM_ERR(_eobj_log_dom, __VA_ARGS__)
|
|
||||||
|
|
||||||
#ifdef WRN
|
|
||||||
#undef WRN
|
|
||||||
#endif
|
|
||||||
#define WRN(...) EINA_LOG_DOM_WARN(_eobj_log_dom, __VA_ARGS__)
|
|
||||||
|
|
||||||
#ifdef INF
|
|
||||||
#undef INF
|
|
||||||
#endif
|
|
||||||
#define INF(...) EINA_LOG_DOM_INFO(_eobj_log_dom, __VA_ARGS__)
|
|
||||||
|
|
||||||
#ifdef DBG
|
|
||||||
#undef DBG
|
|
||||||
#endif
|
|
||||||
#define DBG(...) EINA_LOG_DOM_DBG(_eobj_log_dom, __VA_ARGS__)
|
|
||||||
|
|
||||||
typedef struct _Eobj_Callback_Description Eobj_Callback_Description;
|
typedef struct _Eobj_Callback_Description Eobj_Callback_Description;
|
||||||
|
|
||||||
struct _Eobj {
|
struct _Eobj {
|
||||||
|
@ -56,8 +31,6 @@ struct _Eobj {
|
||||||
Eina_Inlist *callbacks;
|
Eina_Inlist *callbacks;
|
||||||
int walking_list;
|
int walking_list;
|
||||||
|
|
||||||
Eina_Inlist *generic_data;
|
|
||||||
|
|
||||||
Eina_Inlist *kls_itr;
|
Eina_Inlist *kls_itr;
|
||||||
|
|
||||||
Eina_Bool delete:1;
|
Eina_Bool delete:1;
|
||||||
|
@ -846,8 +819,6 @@ eobj_unref(Eobj *obj)
|
||||||
if (obj->data_blob)
|
if (obj->data_blob)
|
||||||
free(obj->data_blob);
|
free(obj->data_blob);
|
||||||
|
|
||||||
_eobj_generic_data_del_all(obj);
|
|
||||||
|
|
||||||
free(obj);
|
free(obj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -952,97 +923,6 @@ eobj_data_get(Eobj *obj, const Eobj_Class *klass)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
EINA_INLIST;
|
|
||||||
Eina_Stringshare *key;
|
|
||||||
void *data;
|
|
||||||
} Eobj_Generic_Data_Node;
|
|
||||||
|
|
||||||
static void
|
|
||||||
_eobj_generic_data_node_free(Eobj_Generic_Data_Node *node)
|
|
||||||
{
|
|
||||||
eina_stringshare_del(node->key);
|
|
||||||
free(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_eobj_generic_data_del_all(Eobj *obj)
|
|
||||||
{
|
|
||||||
Eina_Inlist *nnode;
|
|
||||||
Eobj_Generic_Data_Node *node;
|
|
||||||
|
|
||||||
EINA_INLIST_FOREACH_SAFE(obj->generic_data, nnode, node)
|
|
||||||
{
|
|
||||||
obj->generic_data = eina_inlist_remove(obj->generic_data,
|
|
||||||
EINA_INLIST_GET(node));
|
|
||||||
|
|
||||||
_eobj_generic_data_node_free(node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI void *
|
|
||||||
eobj_generic_data_set(Eobj *obj, const char *key, const void *data)
|
|
||||||
{
|
|
||||||
void *prev_data;
|
|
||||||
Eobj_Generic_Data_Node *node;
|
|
||||||
|
|
||||||
if (!key) return NULL;
|
|
||||||
if (!data) return NULL;
|
|
||||||
|
|
||||||
prev_data = eobj_generic_data_del(obj, key);
|
|
||||||
|
|
||||||
node = malloc(sizeof(Eobj_Generic_Data_Node));
|
|
||||||
node->key = eina_stringshare_add(key);
|
|
||||||
node->data = (void *) data;
|
|
||||||
obj->generic_data = eina_inlist_prepend(obj->generic_data,
|
|
||||||
EINA_INLIST_GET(node));
|
|
||||||
|
|
||||||
return prev_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI void *
|
|
||||||
eobj_generic_data_get(const Eobj *obj, const char *key)
|
|
||||||
{
|
|
||||||
Eobj_Generic_Data_Node *node;
|
|
||||||
|
|
||||||
if (!key) return NULL;
|
|
||||||
|
|
||||||
EINA_INLIST_FOREACH(obj->generic_data, node)
|
|
||||||
{
|
|
||||||
if (!strcmp(node->key, key))
|
|
||||||
{
|
|
||||||
((Eobj *) obj)->generic_data =
|
|
||||||
eina_inlist_promote(obj->generic_data, EINA_INLIST_GET(node));
|
|
||||||
return node->data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI void *
|
|
||||||
eobj_generic_data_del(Eobj *obj, const char *key)
|
|
||||||
{
|
|
||||||
Eobj_Generic_Data_Node *node;
|
|
||||||
|
|
||||||
if (!key) return NULL;
|
|
||||||
|
|
||||||
EINA_INLIST_FOREACH(obj->generic_data, node)
|
|
||||||
{
|
|
||||||
if (!strcmp(node->key, key))
|
|
||||||
{
|
|
||||||
void *data;
|
|
||||||
|
|
||||||
data = node->data;
|
|
||||||
obj->generic_data = eina_inlist_remove(obj->generic_data,
|
|
||||||
EINA_INLIST_GET(node));
|
|
||||||
_eobj_generic_data_node_free(node);
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI Eina_Bool
|
EAPI Eina_Bool
|
||||||
eobj_init(void)
|
eobj_init(void)
|
||||||
{
|
{
|
||||||
|
@ -1312,56 +1192,3 @@ eobj_event_callback_forwarder_del(Eobj *obj, const Eobj_Event_Description *desc,
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOBJ_CLASS_BASE stuff */
|
|
||||||
static const Eobj_Class *_my_class = NULL;
|
|
||||||
|
|
||||||
/* FIXME: Set proper type descriptions. */
|
|
||||||
EAPI const Eobj_Event_Description _EOBJ_EV_CALLBACK_ADD =
|
|
||||||
EOBJ_EVENT_DESCRIPTION("callback,add", "?", "A callback was added.");
|
|
||||||
EAPI const Eobj_Event_Description _EOBJ_EV_CALLBACK_DEL =
|
|
||||||
EOBJ_EVENT_DESCRIPTION("callback,del", "?", "A callback was deleted.");
|
|
||||||
EAPI const Eobj_Event_Description _EOBJ_EV_FREE =
|
|
||||||
EOBJ_EVENT_DESCRIPTION("free", "", "Obj is being freed.");
|
|
||||||
EAPI const Eobj_Event_Description _EOBJ_EV_DEL =
|
|
||||||
EOBJ_EVENT_DESCRIPTION("del", "", "Obj is being deleted.");
|
|
||||||
|
|
||||||
static void
|
|
||||||
_constructor(Eobj *obj, void *class_data __UNUSED__)
|
|
||||||
{
|
|
||||||
DBG("%p - %s.", obj, _my_class->desc->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_destructor(Eobj *obj, void *class_data __UNUSED__)
|
|
||||||
{
|
|
||||||
DBG("%p - %s.", obj, _my_class->desc->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI const Eobj_Class *
|
|
||||||
eobj_base_class_get(void)
|
|
||||||
{
|
|
||||||
if (_my_class) return _my_class;
|
|
||||||
|
|
||||||
static const Eobj_Event_Description *event_desc[] = {
|
|
||||||
EOBJ_EV_CALLBACK_ADD,
|
|
||||||
EOBJ_EV_CALLBACK_DEL,
|
|
||||||
EOBJ_EV_FREE,
|
|
||||||
EOBJ_EV_DEL,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const Eobj_Class_Description class_desc = {
|
|
||||||
"Eobj Base",
|
|
||||||
EOBJ_CLASS_TYPE_REGULAR_NO_INSTANT,
|
|
||||||
EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
|
|
||||||
event_desc,
|
|
||||||
0,
|
|
||||||
_constructor,
|
|
||||||
_destructor,
|
|
||||||
NULL,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
return _my_class = eobj_class_new(&class_desc, NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,190 @@
|
||||||
|
#include <Eina.h>
|
||||||
|
|
||||||
|
#include "Eobj.h"
|
||||||
|
#include "eobj_private.h"
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
EAPI Eobj_Op EOBJ_BASE_BASE_ID = EOBJ_NOOP;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Eina_Inlist *generic_data;
|
||||||
|
} Private_Data;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
EINA_INLIST;
|
||||||
|
Eina_Stringshare *key;
|
||||||
|
void *data;
|
||||||
|
eobj_base_data_free_func free_func;
|
||||||
|
} Eobj_Generic_Data_Node;
|
||||||
|
|
||||||
|
static void
|
||||||
|
_eobj_generic_data_node_free(Eobj_Generic_Data_Node *node)
|
||||||
|
{
|
||||||
|
eina_stringshare_del(node->key);
|
||||||
|
if (node->free_func)
|
||||||
|
node->free_func(node->data);
|
||||||
|
free(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_eobj_generic_data_del_all(Private_Data *pd)
|
||||||
|
{
|
||||||
|
Eina_Inlist *nnode;
|
||||||
|
Eobj_Generic_Data_Node *node;
|
||||||
|
|
||||||
|
EINA_INLIST_FOREACH_SAFE(pd->generic_data, nnode, node)
|
||||||
|
{
|
||||||
|
pd->generic_data = eina_inlist_remove(pd->generic_data,
|
||||||
|
EINA_INLIST_GET(node));
|
||||||
|
|
||||||
|
_eobj_generic_data_node_free(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_data_set(Eobj *obj, void *class_data, va_list *list)
|
||||||
|
{
|
||||||
|
Private_Data *pd = class_data;
|
||||||
|
const char *key = va_arg(*list, const char *);
|
||||||
|
const void *data = va_arg(*list, const void *);
|
||||||
|
eobj_base_data_free_func free_func = va_arg(*list, eobj_base_data_free_func);
|
||||||
|
|
||||||
|
Eobj_Generic_Data_Node *node;
|
||||||
|
|
||||||
|
if (!key) return;
|
||||||
|
|
||||||
|
eobj_do(obj, EOBJ_BASE_DATA_DEL(key));
|
||||||
|
|
||||||
|
node = malloc(sizeof(Eobj_Generic_Data_Node));
|
||||||
|
node->key = eina_stringshare_add(key);
|
||||||
|
node->data = (void *) data;
|
||||||
|
node->free_func = free_func;
|
||||||
|
pd->generic_data = eina_inlist_prepend(pd->generic_data,
|
||||||
|
EINA_INLIST_GET(node));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_data_get(Eobj *obj __UNUSED__, void *class_data, va_list *list)
|
||||||
|
{
|
||||||
|
Private_Data *pd = class_data;
|
||||||
|
const char *key = va_arg(*list, const char *);
|
||||||
|
void **data = va_arg(*list, void **);
|
||||||
|
Eobj_Generic_Data_Node *node;
|
||||||
|
|
||||||
|
if (!data) return;
|
||||||
|
*data = NULL;
|
||||||
|
|
||||||
|
if (!key) return;
|
||||||
|
|
||||||
|
EINA_INLIST_FOREACH(pd->generic_data, node)
|
||||||
|
{
|
||||||
|
if (!strcmp(node->key, key))
|
||||||
|
{
|
||||||
|
pd->generic_data =
|
||||||
|
eina_inlist_promote(pd->generic_data, EINA_INLIST_GET(node));
|
||||||
|
*data = node->data;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_data_del(Eobj *obj __UNUSED__, void *class_data, va_list *list)
|
||||||
|
{
|
||||||
|
Private_Data *pd = class_data;
|
||||||
|
const char *key = va_arg(*list, const char *);
|
||||||
|
|
||||||
|
Eobj_Generic_Data_Node *node;
|
||||||
|
|
||||||
|
if (!key) return;
|
||||||
|
|
||||||
|
EINA_INLIST_FOREACH(pd->generic_data, node)
|
||||||
|
{
|
||||||
|
if (!strcmp(node->key, key))
|
||||||
|
{
|
||||||
|
pd->generic_data = eina_inlist_remove(pd->generic_data,
|
||||||
|
EINA_INLIST_GET(node));
|
||||||
|
_eobj_generic_data_node_free(node);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOBJ_CLASS_BASE stuff */
|
||||||
|
static const Eobj_Class *_my_class = NULL;
|
||||||
|
|
||||||
|
/* FIXME: Set proper type descriptions. */
|
||||||
|
EAPI const Eobj_Event_Description _EOBJ_EV_CALLBACK_ADD =
|
||||||
|
EOBJ_EVENT_DESCRIPTION("callback,add", "?", "A callback was added.");
|
||||||
|
EAPI const Eobj_Event_Description _EOBJ_EV_CALLBACK_DEL =
|
||||||
|
EOBJ_EVENT_DESCRIPTION("callback,del", "?", "A callback was deleted.");
|
||||||
|
EAPI const Eobj_Event_Description _EOBJ_EV_FREE =
|
||||||
|
EOBJ_EVENT_DESCRIPTION("free", "", "Obj is being freed.");
|
||||||
|
EAPI const Eobj_Event_Description _EOBJ_EV_DEL =
|
||||||
|
EOBJ_EVENT_DESCRIPTION("del", "", "Obj is being deleted.");
|
||||||
|
|
||||||
|
static void
|
||||||
|
_constructor(Eobj *obj, void *class_data __UNUSED__)
|
||||||
|
{
|
||||||
|
DBG("%p - %s.", obj, eobj_class_name_get(_my_class));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_destructor(Eobj *obj, void *class_data)
|
||||||
|
{
|
||||||
|
DBG("%p - %s.", obj, eobj_class_name_get(_my_class));
|
||||||
|
|
||||||
|
_eobj_generic_data_del_all(class_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_class_constructor(Eobj_Class *klass)
|
||||||
|
{
|
||||||
|
const Eobj_Op_Func_Description func_desc[] = {
|
||||||
|
EOBJ_OP_FUNC(EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_DATA_SET), _data_set),
|
||||||
|
EOBJ_OP_FUNC(EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_DATA_GET), _data_get),
|
||||||
|
EOBJ_OP_FUNC(EOBJ_BASE_ID(EOBJ_BASE_SUB_ID_DATA_DEL), _data_del),
|
||||||
|
EOBJ_OP_FUNC_SENTINEL
|
||||||
|
};
|
||||||
|
|
||||||
|
eobj_class_funcs_set(klass, func_desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI const Eobj_Class *
|
||||||
|
eobj_base_class_get(void)
|
||||||
|
{
|
||||||
|
if (_my_class) return _my_class;
|
||||||
|
|
||||||
|
static const Eobj_Op_Description op_desc[] = {
|
||||||
|
EOBJ_OP_DESCRIPTION(EOBJ_BASE_SUB_ID_DATA_SET, "?", "Set data for key."),
|
||||||
|
EOBJ_OP_DESCRIPTION(EOBJ_BASE_SUB_ID_DATA_GET, "?", "Get data for key."),
|
||||||
|
EOBJ_OP_DESCRIPTION(EOBJ_BASE_SUB_ID_DATA_DEL, "?", "Del key."),
|
||||||
|
EOBJ_OP_DESCRIPTION_SENTINEL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const Eobj_Event_Description *event_desc[] = {
|
||||||
|
EOBJ_EV_CALLBACK_ADD,
|
||||||
|
EOBJ_EV_CALLBACK_DEL,
|
||||||
|
EOBJ_EV_FREE,
|
||||||
|
EOBJ_EV_DEL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const Eobj_Class_Description class_desc = {
|
||||||
|
"Eobj Base",
|
||||||
|
EOBJ_CLASS_TYPE_REGULAR_NO_INSTANT,
|
||||||
|
EOBJ_CLASS_DESCRIPTION_OPS(&EOBJ_BASE_BASE_ID, op_desc, EOBJ_BASE_SUB_ID_LAST),
|
||||||
|
event_desc,
|
||||||
|
sizeof(Private_Data),
|
||||||
|
_constructor,
|
||||||
|
_destructor,
|
||||||
|
_class_constructor,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
return _my_class = eobj_class_new(&class_desc, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
#ifndef _EOBJ_PRIVATE_H
|
||||||
|
#define _EOBJ_PRIVATE_H
|
||||||
|
|
||||||
|
extern int _eobj_log_dom;
|
||||||
|
|
||||||
|
#ifdef CRITICAL
|
||||||
|
#undef CRITICAL
|
||||||
|
#endif
|
||||||
|
#define CRITICAL(...) EINA_LOG_DOM_CRIT(_eobj_log_dom, __VA_ARGS__)
|
||||||
|
|
||||||
|
#ifdef ERR
|
||||||
|
#undef ERR
|
||||||
|
#endif
|
||||||
|
#define ERR(...) EINA_LOG_DOM_ERR(_eobj_log_dom, __VA_ARGS__)
|
||||||
|
|
||||||
|
#ifdef WRN
|
||||||
|
#undef WRN
|
||||||
|
#endif
|
||||||
|
#define WRN(...) EINA_LOG_DOM_WARN(_eobj_log_dom, __VA_ARGS__)
|
||||||
|
|
||||||
|
#ifdef INF
|
||||||
|
#undef INF
|
||||||
|
#endif
|
||||||
|
#define INF(...) EINA_LOG_DOM_INFO(_eobj_log_dom, __VA_ARGS__)
|
||||||
|
|
||||||
|
#ifdef DBG
|
||||||
|
#undef DBG
|
||||||
|
#endif
|
||||||
|
#define DBG(...) EINA_LOG_DOM_DBG(_eobj_log_dom, __VA_ARGS__)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -53,21 +53,33 @@ START_TEST(eobj_generic_data)
|
||||||
{
|
{
|
||||||
eobj_init();
|
eobj_init();
|
||||||
Eobj *obj = eobj_add(SIMPLE_CLASS, NULL);
|
Eobj *obj = eobj_add(SIMPLE_CLASS, NULL);
|
||||||
|
void *data;
|
||||||
|
|
||||||
eobj_generic_data_set(obj, "test1", (void *) 1);
|
eobj_do(obj, EOBJ_BASE_DATA_SET("test1", (void *) 1, NULL));
|
||||||
fail_if(1 != (int) eobj_generic_data_get(obj, "test1"));
|
eobj_do(obj, EOBJ_BASE_DATA_GET("test1", &data));
|
||||||
fail_if(1 != (int) eobj_generic_data_del(obj, "test1"));
|
fail_if(1 != (int) data);
|
||||||
fail_if(eobj_generic_data_del(obj, "test1"));
|
eobj_do(obj, EOBJ_BASE_DATA_DEL("test1"));
|
||||||
|
eobj_do(obj, EOBJ_BASE_DATA_GET("test1", &data));
|
||||||
|
fail_if(data);
|
||||||
|
|
||||||
eobj_generic_data_set(obj, "test1", (void *) 1);
|
eobj_do(obj, EOBJ_BASE_DATA_SET("test1", (void *) 1, NULL));
|
||||||
eobj_generic_data_set(obj, "test2", (void *) 2);
|
eobj_do(obj, EOBJ_BASE_DATA_SET("test2", (void *) 2, NULL));
|
||||||
fail_if(2 != (int) eobj_generic_data_get(obj, "test2"));
|
eobj_do(obj, EOBJ_BASE_DATA_GET("test1", &data));
|
||||||
fail_if(2 != (int) eobj_generic_data_del(obj, "test2"));
|
fail_if(1 != (int) data);
|
||||||
fail_if(eobj_generic_data_del(obj, "test2"));
|
eobj_do(obj, EOBJ_BASE_DATA_GET("test2", &data));
|
||||||
|
fail_if(2 != (int) data);
|
||||||
|
|
||||||
fail_if(1 != (int) eobj_generic_data_get(obj, "test1"));
|
eobj_do(obj, EOBJ_BASE_DATA_GET("test2", &data));
|
||||||
fail_if(1 != (int) eobj_generic_data_del(obj, "test1"));
|
fail_if(2 != (int) data);
|
||||||
fail_if(eobj_generic_data_del(obj, "test1"));
|
eobj_do(obj, EOBJ_BASE_DATA_DEL("test2"));
|
||||||
|
eobj_do(obj, EOBJ_BASE_DATA_GET("test2", &data));
|
||||||
|
fail_if(data);
|
||||||
|
|
||||||
|
eobj_do(obj, EOBJ_BASE_DATA_GET("test1", &data));
|
||||||
|
fail_if(1 != (int) data);
|
||||||
|
eobj_do(obj, EOBJ_BASE_DATA_DEL("test1"));
|
||||||
|
eobj_do(obj, EOBJ_BASE_DATA_GET("test1", &data));
|
||||||
|
fail_if(data);
|
||||||
|
|
||||||
eobj_unref(obj);
|
eobj_unref(obj);
|
||||||
eobj_shutdown();
|
eobj_shutdown();
|
||||||
|
|
Loading…
Reference in New Issue