yakov pushed a commit to branch master. http://git.enlightenment.org/tools/erigo.git/commit/?id=07c02bda0034f27d02194612e694a30f900ab55b
commit 07c02bda0034f27d02194612e694a30f900ab55b Author: Yakov Goldberg <[email protected]> Date: Tue Feb 17 10:17:36 2015 +0200 Refactoring Eolian functions lookup Iterate over all Eolian classes and add function for each property. Add Display name, params overrides, containers according to func_names. Filter out classes and functions according to black list --- data/config/func_names.json | 5 - src/lib/database.c | 652 +++++++++++++++++++++++++------------------- 2 files changed, 377 insertions(+), 280 deletions(-) diff --git a/data/config/func_names.json b/data/config/func_names.json index f7f7c01..b0a0064 100644 --- a/data/config/func_names.json +++ b/data/config/func_names.json @@ -430,11 +430,6 @@ }, { "class" : "Elm_Table", - "name" : "pack", - "container_behavior_data":["OBJ_CONTAINER", "CONTAINER_REPACK"] - }, - { - "class" : "Elm_Table", "name" : "clear", "container_behavior_data":["OBJ_CONTAINER", "CONTAINER_UNPACK_ALL"] }, diff --git a/src/lib/database.c b/src/lib/database.c index b0bdc48..47bf6d4 100644 --- a/src/lib/database.c +++ b/src/lib/database.c @@ -31,10 +31,10 @@ typedef struct _Container_Behavior_Data struct _Op_Desc { - char *cl_name; /* "Evas_Object" */ - char *op_name; /* "visibility_set" */ + Eina_Stringshare *cl_name; /* "Evas_Object" */ + Eina_Stringshare *op_name; /* "visibility_set" */ char *op_name_full; /* Evas_Object::visibility_set */ - char *display_name; /* "Visibility" */ + const char *display_name; /* "Visibility" */ char *func_set_name; /*func to used in eo_do "evas_obj_visibility_set"*/ void *func_set; /* Pointer to Eo2 API. T.e. func evas_obj_box_pack_end*/ void *func_get; /* Pointer to Eo2 API. T.e. func evas_obj_box_pack_end*/ @@ -185,10 +185,9 @@ _cl_table_free_cb(void *_data) free(param_desc->gui_type_name); free(param_desc); } - free(op->cl_name); - free(op->op_name); + eina_stringshare_del(op->cl_name); + eina_stringshare_del(op->op_name); free(op->op_name_full); - free(op->display_name); free(op->func_set_name); free(op); } @@ -663,67 +662,59 @@ end: return ret; } -Eina_Bool -db_init(const char *db_path, const char *all_eo_path) -{ - const char *log_dom = "egui_db"; - const Eina_List *itr; - Eina_Hash *typedef_table = NULL; /* Hash ["Evas_Coord"]-> GUI_TYPE_INT */ +/* List and structure to keep data about ops from settings list. */ +Eina_List *_op_settings_list = NULL; - /* initializing operation table */ - if (_db_init_count++ > 0) - return EINA_TRUE; +typedef struct +{ + Eina_Stringshare *cl_name; + Eina_Stringshare *op_name; + char *display_name; + Eina_List *params_override_list; /* array to keep list of overriden paramters. */ + Container_Type container_type; + Container_Behavior_Type container_op_behavior_type; +} Op_Settings; - _db_log_dom = eina_log_domain_register(log_dom, EINA_COLOR_LIGHTBLUE); - if (_db_log_dom < 0) +static Op_Settings* +_op_settings_get(const char *class_name, const char *op_name) +{ + Eina_List *itr; + Op_Settings *_op_set; + EINA_LIST_FOREACH(_op_settings_list, itr, _op_set) { - EINA_LOG_ERR("Could not register log domain: %s", log_dom); - return EINA_FALSE; + /* Comparing stringshares */ + if ((_op_set->cl_name == class_name) && + (_op_set->op_name == op_name)) + return _op_set; } + return NULL; +} - eo_init(); - - if (!eolian_eo_file_parse(all_eo_path)) - return EINA_FALSE; - +/* Read operations settings file and save data in a list. + * Data to be saved: + * - class name; + * - op name; + * - display name; + * - container info; + * - parameter overriding info. */ +static Eina_Bool +_op_settings_init(const char *db_path) +{ Eina_Json_Value *jv, *tmp = NULL, *json_op_desc; + Eina_Hash *container_typedef_table = NULL; /* Hash ["Evas_Coord"]-> GUI_TYPE_INT */ + container_typedef_table = eina_hash_string_superfast_new(NULL); + + eina_hash_add(container_typedef_table, "OBJ_CONTAINER", (void *) (uintptr_t) OBJ_CONTAINER); + eina_hash_add(container_typedef_table, "ITEM_CONTAINER", (void *) (uintptr_t) ITEM_CONTAINER); + eina_hash_add(container_typedef_table, "CONTAINER_PACK", (void *) (uintptr_t) CONTAINER_PACK); + eina_hash_add(container_typedef_table, "CONTAINER_UNPACK", (void *) (uintptr_t) CONTAINER_UNPACK); + eina_hash_add(container_typedef_table, "CONTAINER_UNPACK_ALL", (void *) (uintptr_t) CONTAINER_UNPACK_ALL); + eina_hash_add(container_typedef_table, "CONTAINER_REPACK", (void *) (uintptr_t) CONTAINER_REPACK); /* Get JSON object from DB by path. */ jv = _db_json_object_get(db_path); if (!jv) return EINA_FALSE; - typedef_table = eina_hash_string_superfast_new(NULL); - eina_hash_add(typedef_table, "Evas_Coord", (void *) (uintptr_t) GUI_TYPE_SINT); - eina_hash_add(typedef_table, "int", (void *) (uintptr_t) GUI_TYPE_SINT); - eina_hash_add(typedef_table, "short", (void *) (uintptr_t) GUI_TYPE_SINT); - eina_hash_add(typedef_table, "double", (void *) (uintptr_t) GUI_TYPE_DOUBLE); - eina_hash_add(typedef_table, "Evas_Object*", (void *) (uintptr_t) GUI_TYPE_OBJECT); - eina_hash_add(typedef_table, "Evas_Object *", (void *) (uintptr_t) GUI_TYPE_OBJECT); - eina_hash_add(typedef_table, "Eina_Bool", (void *) (uintptr_t) GUI_TYPE_BOOL); - eina_hash_add(typedef_table, "bool", (void *) (uintptr_t) GUI_TYPE_BOOL); - eina_hash_add(typedef_table, "const char *", (void *) (uintptr_t) GUI_TYPE_STRING); - eina_hash_add(typedef_table, "const void *", (void *) (uintptr_t) GUI_TYPE_VOID); - eina_hash_add(typedef_table, "Evas_Smart_Cb", (void *) (uintptr_t) GUI_TYPE_CB); - eina_hash_add(typedef_table, "Elm_Interface_Scrollable_Min_Limit_Cb", (void *) (uintptr_t) GUI_TYPE_CB); - eina_hash_add(typedef_table, "Elm_Object_Item *", (void *) (uintptr_t) GUI_TYPE_OBJECT_ITEM); - - eina_hash_add(typedef_table, "OBJ_CONTAINER", (void *) (uintptr_t) OBJ_CONTAINER); - eina_hash_add(typedef_table, "ITEM_CONTAINER", (void *) (uintptr_t) ITEM_CONTAINER); - eina_hash_add(typedef_table, "CONTAINER_PACK", (void *) (uintptr_t) CONTAINER_PACK); - eina_hash_add(typedef_table, "CONTAINER_UNPACK", (void *) (uintptr_t) CONTAINER_UNPACK); - eina_hash_add(typedef_table, "CONTAINER_UNPACK_ALL", (void *) (uintptr_t) CONTAINER_UNPACK_ALL); - eina_hash_add(typedef_table, "CONTAINER_REPACK", (void *) (uintptr_t) CONTAINER_REPACK); - - eina_hash_add(typedef_table, "GUI_TYPE_FILE", (void *) (uintptr_t) GUI_TYPE_FILE); - - /* initializing enum table */ - _enum_table_init(); - /* initializing enum types */ - _enum_types_table_init(typedef_table); - - /* initializing class desc table */ - _cl_table_init(); - tmp = EINA_JSON_OBJECT_VALUE_GET(jv, "OPERATIONS"); if (!tmp || (eina_json_type_get(tmp) != EINA_JSON_TYPE_ARRAY)) { @@ -731,20 +722,17 @@ db_init(const char *db_path, const char *all_eo_path) return EINA_FALSE; } - /* Iterate over: OPERATIONS array */ Eina_Iterator *it = eina_json_array_iterator_new(tmp); EINA_ITERATOR_FOREACH(it, json_op_desc) { - const char *cl_name = NULL, *op_name = NULL, *display_name = NULL; - /* array to keep list of overriden paramters. */ - Eina_List *params_override_list = NULL; - - Container_Type container_type = NOT_CONTAINER; - Container_Behavior_Type op_behavior_type = CONTAINER_NONE; + Op_Settings *_op_set = calloc(1, sizeof(Op_Settings)); + _op_set->container_type = NOT_CONTAINER; + _op_set->container_op_behavior_type = CONTAINER_NONE; /* start iterating over JSON fields of operation */ Eina_Iterator *it2 = eina_json_object_iterator_new(json_op_desc); Eina_Json_Value *j; + EINA_ITERATOR_FOREACH(it2, j) { Eina_Json_Value *cur; @@ -752,21 +740,21 @@ db_init(const char *db_path, const char *all_eo_path) cur = eina_json_pair_value_get(j); if (!strcmp("class", pair_name)) { - cl_name = eina_json_string_get(cur); + _op_set->cl_name = eina_stringshare_add((eina_json_string_get(cur))); } else if (!strcmp("name", pair_name)) { - op_name = eina_json_string_get(cur); + _op_set->op_name = eina_stringshare_add(eina_json_string_get(cur)); } else if (!strcmp("display_name", pair_name)) { - display_name = eina_json_string_get(cur); + _op_set->display_name = strdup(eina_json_string_get(cur)); } else if (!strcmp("container_behavior_data", pair_name)) { if (eina_json_type_get(cur) != EINA_JSON_TYPE_ARRAY) { - ERR("\"container_behavior_data\" is not an ARRAY TYPE in: %s::%s", cl_name, op_name); + ERR("\"container_behavior_data\" is not an ARRAY TYPE in: %s::%s", _op_set->cl_name, _op_set->op_name); } else { @@ -774,8 +762,8 @@ db_init(const char *db_path, const char *all_eo_path) cont_type = eina_json_string_get(eina_json_array_nth_get(cur, 0)); op_behavior = eina_json_string_get(eina_json_array_nth_get(cur, 1)); /* in case of NOT_CONTAINER and CONTAINER_NONE, NULL will be returned. */ - container_type = (Container_Type) (uintptr_t) eina_hash_find(typedef_table, cont_type); - op_behavior_type = (Container_Behavior_Type) (uintptr_t) eina_hash_find(typedef_table, op_behavior); + _op_set->container_type = (Container_Type) (uintptr_t) eina_hash_find(container_typedef_table, cont_type); + _op_set->container_op_behavior_type = (Container_Behavior_Type) (uintptr_t) eina_hash_find(container_typedef_table, op_behavior); } } else if (!strcmp("param", pair_name)) @@ -801,239 +789,76 @@ db_init(const char *db_path, const char *all_eo_path) if (strlen(param_default_values_str)) p_flags->param_default_values_str = strdup(param_default_values_str); } - params_override_list = eina_list_append(params_override_list, p_flags); + _op_set->params_override_list = eina_list_append(_op_set->params_override_list, p_flags); } } } eina_iterator_free(it2); - if (!cl_name) + if (!_op_set->cl_name) { ERR("\"class\" is absent in one of descriptions. Fix OPs database."); + /* FIXME: free(_op_set)*/ continue; } - if (!op_name) + if (!_op_set->op_name) { - ERR("\"name\" is absent in one of descriptions for class \"%s\". Fix OPs database.", cl_name); + ERR("\"name\" is absent in one of descriptions for class \"%s\". Fix OPs database.", _op_set->cl_name); + /* FIXME: free(_op_set)*/ continue; } - /* end iterating over JSON fields of operation */ - /* Looking for a record for current class*/ - Class_Props *class_props = eina_hash_find(cl_table, cl_name); - if (!class_props) - { - ERR("Class: \"%s\" was not registered in Egui. This means, that class was not provided by Eolian", cl_name); - continue; - } - - const Eolian_Class *kl = eolian_class_get_by_name(cl_name); - if (!kl) - ERR("Eolian class \"%s\" not found", cl_name); - const Eolian_Function *func; - func = eolian_class_function_get_by_name(kl, op_name, EOLIAN_UNRESOLVED); - if (!func) - { - ERR("Function \"%s\" was not found in class: \"%s\"", op_name, cl_name); - continue; - } - - Op_Desc *op_desc = calloc(1, sizeof(Op_Desc)); - Eolian_Function_Type f_type = eolian_function_type_get(func); - - char *func_set_name = NULL, *func_get_name = NULL; - func_set_name = _class_func_set_name_get(kl, func); - if (!func_set_name) + if (!_op_settings_get(_op_set->cl_name, _op_set->op_name)) { - ERR("func_set_name cannot be generated (IMPOSSIBLE) for %s::%s", cl_name, op_name); + _op_settings_list = eina_list_append(_op_settings_list, _op_set); } - /* if method is not PROPERTY or PROP_GET, NULL will be returned. */ - func_get_name = _class_func_get_name_get(kl, func); - - op_desc->cl_name = strdup(cl_name); - op_desc->op_name = strdup(op_name); - - char name_full[PATH_MAX] = {'\0'}; - sprintf(name_full, "%s%s%s", op_desc->cl_name, CLASS_PROP_DELIMETER, op_desc->op_name); - op_desc->op_name_full = strdup(name_full); - - if (display_name) - { - op_desc->display_name = strdup(display_name); - } - op_desc->func_set_name = strdup(func_set_name); - op_desc->func_type = f_type; - op_desc->is_constructor = eolian_function_is_constructor(func, kl); - - op_desc->func_set = dlsym(RTLD_DEFAULT, op_desc->func_set_name); - if (!op_desc->func_set) - ERR("DLSYM not found for %s", op_desc->func_set_name); - - /* Name of get function is not saved, because w don't need to generate it. */ - if (func_get_name) + else { - op_desc->func_get = dlsym(RTLD_DEFAULT, func_get_name); + ERR("Duplication entry: %s %s", _op_set->cl_name, _op_set->op_name); + /* FIXME: free(_op_set)*/ } + } + eina_iterator_free(it); - /* As long as struct holds ints, we can assign struct to struct. */ - op_desc->container_behavior_data.container_type = container_type; - op_desc->container_behavior_data.op_behavior_type = op_behavior_type; - - /* Copying parameters from table to Eina List */ - { - /* params list must be freed */ - Eina_List *params_list = _eolian_func_params_get(func); - /* Iterate over parameters in order to assign GUI_TYPE, - * and types overrides. */ - int i = 0; - Eolian_Function_Parameter *eolian_param; - EINA_LIST_FOREACH(params_list, itr, eolian_param) - { - const char *c_type; - char c_type2[PATH_MAX]; - const Eolian_Type *param_eolian_type = eolian_parameter_type_get(eolian_param); - if (eolian_type_type_get(param_eolian_type) == EOLIAN_TYPE_REGULAR) - { - c_type = eolian_type_name_get(param_eolian_type); - sprintf(c_type2, "%s", c_type); - } - else - { - const Eolian_Type *base = eolian_type_base_type_get(param_eolian_type); - if ((eolian_type_type_get(base) == EOLIAN_TYPE_REGULAR) || - (eolian_type_type_get(base) == EOLIAN_TYPE_CLASS)) - { - c_type = eolian_type_name_get(base); - } - else if (eolian_type_type_get(base) == EOLIAN_TYPE_POINTER) - { - c_type = "AGAIN POINTER"; - } - else if (eolian_type_type_get(base) == EOLIAN_TYPE_VOID) - { - c_type = "void"; - } - else - { - c_type = "NULL"; - } - sprintf(c_type2, "%s%s *", eolian_type_is_const(base) ? "const " : "", c_type); - } - void *p = eina_hash_find(typedef_table, c_type2); - if (!p) - ERR("no typedef for type: %s, class: %s, func: %s", c_type2, op_desc->cl_name, (char *) op_desc->func_set_name); - - Op_Param_Desc *param_desc = calloc(1, sizeof(Op_Param_Desc)); - param_desc->gui_type = (Gui_Type) (uintptr_t) p; - param_desc->gui_type_name = strdup(c_type); - param_desc->name = eolian_parameter_name_get(eolian_param); - - /* if parameters were overriden */ - if (params_override_list) - { - const Param_Flags *p_flags = _param_flags_by_idx_get(params_override_list, i); - /* if current parameter has overriden type or default values */ - if (p_flags) - { - _param_desc_fill(param_desc, p_flags, typedef_table, op_desc); - } - } - op_desc->params = eina_list_append(op_desc->params, param_desc); - i++; - } - eina_list_free(params_list); - } + eina_hash_free(container_typedef_table); - free(func_set_name); - free(func_get_name); + eina_json_value_free(jv); + return EINA_TRUE; +} - /* Add record into property_table */ - if (!eina_hash_add(class_props->cl_props_hash, op_desc->op_name, op_desc)) - { - printf("can not add value to hash table\n"); - } - else - { - class_props->cl_props_list = eina_list_append(class_props->cl_props_list, op_desc); - } - /* if op belongs to CONTAINER GROUP, fill structure of functions. */ - if (op_desc->container_behavior_data.container_type != NOT_CONTAINER) - { - if (!container_table) - { - container_table = eina_hash_string_superfast_new(free); - } - Container_Desc *container_desc = eina_hash_find(container_table, op_desc->cl_name); - if (!container_desc) - { - container_desc = CONTAINER_DESC_BUILD(); - eina_hash_set(container_table, op_desc->cl_name, container_desc); - } - switch (op_desc->container_behavior_data.op_behavior_type) - { - case CONTAINER_PACK: - { - container_desc->_op_pack = op_desc; - break; - } - case CONTAINER_REPACK: - { - container_desc->_op_repack = op_desc; - break; - } - case CONTAINER_UNPACK: - { - container_desc->_op_unpack = op_desc; - break; - } - case CONTAINER_UNPACK_ALL: - { - container_desc->_op_unpack_all = op_desc; - break; - } - case NOT_CONTAINER: - { - break; - } - } - } +/* Read operations settings file and save data in a list. +*/ +static void +_op_settings_shutdown() +{ + Op_Settings *_op_set; + EINA_LIST_FREE(_op_settings_list, _op_set) + { + eina_stringshare_del(_op_set->cl_name); + eina_stringshare_del(_op_set->op_name); + free(_op_set->display_name); Param_Flags *p; - EINA_LIST_FREE(params_override_list, p) + EINA_LIST_FREE(_op_set->params_override_list, p) { free(p->param_overrides); free(p->param_default_values_str); free(p); } - params_override_list = NULL; + free(_op_set); } - eina_iterator_free(it); +} - /*Iterate over classes one more time, to fill container dependencies. */ - Eina_Iterator *all_classes_list = eolian_all_classes_get(); - Eolian_Class *ekl; - EINA_ITERATOR_FOREACH(all_classes_list, ekl) - { - Class_Props *class_props; - const char *class_name = eolian_class_full_name_get(ekl); - class_props = eina_hash_find(cl_table, class_name); +static Eina_Bool +_default_settings_init(const char *db_path) +{ + Eina_Json_Value *jv, *tmp = NULL; - /* Get inheritance list of widget being created.*/ - Eina_List *itr2, *kl_list = eo_class_mro_get(class_name); - const char *cont_class; - EINA_LIST_FOREACH(kl_list, itr2, cont_class) - { - if (db_container_desc_get(cont_class)) - { - class_props->inherit_containers = eina_list_append(class_props->inherit_containers, cont_class); - } - } - eina_list_free(kl_list); - } - eina_iterator_free(all_classes_list); + /* Get JSON object from DB by path. */ + jv = _db_json_object_get(db_path); + if (!jv) return EINA_FALSE; tmp = EINA_JSON_OBJECT_VALUE_GET(jv, "DEFAULTS"); - if (!tmp || (eina_json_type_get(tmp) != EINA_JSON_TYPE_OBJECT)) { ERR("\"DEFAULTS\" section is absent or is not a json object!"); @@ -1043,11 +868,11 @@ db_init(const char *db_path, const char *all_eo_path) def_props_table = eina_hash_string_superfast_new(_def_props_del); Eina_Json_Value *defwdg = NULL; - it = eina_json_object_iterator_new(tmp); + Eina_Iterator *it = eina_json_object_iterator_new(tmp); EINA_ITERATOR_FOREACH(it, defwdg) { - const char* wdgname = eina_json_pair_name_get(defwdg); + const char *wdgname = eina_json_pair_name_get(defwdg); Eina_Json_Value *defprops = eina_json_pair_value_get(defwdg); Eina_Iterator *props = eina_json_object_iterator_new(defprops); Eina_Json_Value *jprop = NULL; @@ -1078,7 +903,7 @@ db_init(const char *db_path, const char *all_eo_path) { ERR("Cannot find op description: \"%s\" for class: \"%s\"\n" "Setting default property will not take effect.", prop_name, wdgname); - continue; + goto cont; } unsigned int db_param_count = 0, json_arr_param_count = 0; @@ -1089,7 +914,7 @@ db_init(const char *db_path, const char *all_eo_path) ERR("Setting default property value error!\ Widget: \"%s\", property: \"%s\". Param count: %d, should be: %d.", wdgname, prop_name, json_arr_param_count, db_param_count); - continue; + goto cont; } Gui_Widget_Property *defprop = prop_create_for_op(op); @@ -1097,6 +922,7 @@ db_init(const char *db_path, const char *all_eo_path) prop_ref(defprop); proplist = eina_list_append(proplist, defprop); +cont: free(prop_name_tmp); } eina_hash_set(def_props_table, wdgname, proplist); @@ -1106,8 +932,283 @@ db_init(const char *db_path, const char *all_eo_path) eina_iterator_free(it); eina_json_value_free(jv); + return EINA_TRUE; +} + +static void +_default_settings_shutdown() +{ + eina_hash_free(def_props_table); +} + +Eina_Bool +db_init(const char *db_path, const char *all_eo_path) +{ + const char *log_dom = "egui_db"; + const Eina_List *itr; + Eina_Hash *typedef_table = NULL; /* Hash ["Evas_Coord"]-> GUI_TYPE_INT */ + + /* initializing operation table */ + if (_db_init_count++ > 0) + return EINA_TRUE; + + _db_log_dom = eina_log_domain_register(log_dom, EINA_COLOR_LIGHTBLUE); + if (_db_log_dom < 0) + { + EINA_LOG_ERR("Could not register log domain: %s", log_dom); + return EINA_FALSE; + } + + eo_init(); + + if (!eolian_eo_file_parse(all_eo_path)) + return EINA_FALSE; + + if (!_op_settings_init(db_path)) return EINA_FALSE; + + typedef_table = eina_hash_string_superfast_new(NULL); + eina_hash_add(typedef_table, "Evas_Coord", (void *) (uintptr_t) GUI_TYPE_SINT); + eina_hash_add(typedef_table, "int", (void *) (uintptr_t) GUI_TYPE_SINT); + eina_hash_add(typedef_table, "short", (void *) (uintptr_t) GUI_TYPE_SINT); + eina_hash_add(typedef_table, "double", (void *) (uintptr_t) GUI_TYPE_DOUBLE); + eina_hash_add(typedef_table, "Evas_Object*", (void *) (uintptr_t) GUI_TYPE_OBJECT); + eina_hash_add(typedef_table, "Evas_Object *", (void *) (uintptr_t) GUI_TYPE_OBJECT); + eina_hash_add(typedef_table, "Eina_Bool", (void *) (uintptr_t) GUI_TYPE_BOOL); + eina_hash_add(typedef_table, "bool", (void *) (uintptr_t) GUI_TYPE_BOOL); + eina_hash_add(typedef_table, "const char *", (void *) (uintptr_t) GUI_TYPE_STRING); + eina_hash_add(typedef_table, "const void *", (void *) (uintptr_t) GUI_TYPE_VOID); + eina_hash_add(typedef_table, "Evas_Smart_Cb", (void *) (uintptr_t) GUI_TYPE_CB); + eina_hash_add(typedef_table, "Elm_Interface_Scrollable_Min_Limit_Cb", (void *) (uintptr_t) GUI_TYPE_CB); + eina_hash_add(typedef_table, "Elm_Object_Item *", (void *) (uintptr_t) GUI_TYPE_OBJECT_ITEM); + + eina_hash_add(typedef_table, "GUI_TYPE_FILE", (void *) (uintptr_t) GUI_TYPE_FILE); + + /* initializing enum table */ + _enum_table_init(); + /* initializing enum types */ + _enum_types_table_init(typedef_table); + + /* initializing class desc table */ + _cl_table_init(); + + Eina_Iterator *_all_classes_list = eolian_all_classes_get(); + Eolian_Class *_ekl; + EINA_ITERATOR_FOREACH(_all_classes_list, _ekl) + { + const char *class_name = eolian_class_full_name_get(_ekl); + const Eolian_Function *func; + + /* Looking for a record for current class*/ + Class_Props *class_props = eina_hash_find(cl_table, class_name); + if (!class_props) + { + ERR("Class: \"%s\" was not registered in Egui. This means, that class was not provided by Eolian", class_name); + continue; + } + + Eina_Iterator *funcs; + Eolian_Function_Type _eolian_type_itr[3] = {EOLIAN_METHOD, EOLIAN_PROPERTY, EOLIAN_UNRESOLVED}, *type_p; + type_p = _eolian_type_itr; + + while (*type_p != EOLIAN_UNRESOLVED) + { + funcs = eolian_class_functions_get(_ekl, *type_p); + EINA_ITERATOR_FOREACH(funcs, func) + { + Op_Desc *op_desc = NULL; + char *func_set_name = NULL, *func_get_name = NULL; + + Eolian_Function_Type f_type = eolian_function_type_get(func); + + if (f_type == EOLIAN_UNRESOLVED) continue; + + op_desc = calloc(1, sizeof(Op_Desc)); + op_desc->func_type = f_type; + + if ((f_type == EOLIAN_PROPERTY) || (f_type == EOLIAN_PROP_SET) || (f_type == EOLIAN_METHOD)) + { + func_set_name = _class_func_set_name_get(_ekl, func); + op_desc->func_set_name = strdup(func_set_name); + op_desc->func_set = dlsym(RTLD_DEFAULT, op_desc->func_set_name); + if (!op_desc->func_set) + ERR("DLSYM not found for %s", op_desc->func_set_name); + free(func_set_name); + } + + /* if method is not PROPERTY or PROP_GET, NULL will be returned. */ + func_get_name = _class_func_get_name_get(_ekl, func); + /* Name of get function is not saved, because we don't need to generate it. */ + if (func_get_name) + { + op_desc->func_get = dlsym(RTLD_DEFAULT, func_get_name); + free(func_get_name); + } + + op_desc->cl_name = eina_stringshare_add(class_name); + op_desc->op_name = eina_stringshare_add(eolian_function_name_get(func)); + + Op_Settings *_op_set = _op_settings_get(op_desc->cl_name, op_desc->op_name); + + char name_full[PATH_MAX] = {'\0'}; + sprintf(name_full, "%s%s%s", op_desc->cl_name, CLASS_PROP_DELIMETER, op_desc->op_name); + op_desc->op_name_full = strdup(name_full); + + op_desc->display_name = (_op_set && _op_set->display_name) ? _op_set->display_name : op_desc->op_name_full; + + op_desc->is_constructor = eolian_function_is_constructor(func, _ekl); + + op_desc->container_behavior_data.container_type = _op_set ? _op_set->container_type : NOT_CONTAINER; + op_desc->container_behavior_data.op_behavior_type = _op_set ? _op_set->container_op_behavior_type : CONTAINER_NONE; + + /* Add record into property_table */ + if (!eina_hash_add(class_props->cl_props_hash, op_desc->op_name, op_desc)) + { + printf("can not add value to hash table\n"); + } + else + { + class_props->cl_props_list = eina_list_append(class_props->cl_props_list, op_desc); + } + + /* if op belongs to CONTAINER GROUP, fill structure of functions. */ + if (op_desc->container_behavior_data.container_type != NOT_CONTAINER) + { + if (!container_table) + { + container_table = eina_hash_string_superfast_new(free); + } + Container_Desc *container_desc = eina_hash_find(container_table, op_desc->cl_name); + if (!container_desc) + { + container_desc = CONTAINER_DESC_BUILD(); + eina_hash_set(container_table, op_desc->cl_name, container_desc); + } + switch (op_desc->container_behavior_data.op_behavior_type) + { + case CONTAINER_PACK: + { + container_desc->_op_pack = op_desc; + break; + } + case CONTAINER_REPACK: + { + container_desc->_op_repack = op_desc; + break; + } + case CONTAINER_UNPACK: + { + container_desc->_op_unpack = op_desc; + break; + } + case CONTAINER_UNPACK_ALL: + { + container_desc->_op_unpack_all = op_desc; + break; + } + case NOT_CONTAINER: + { + break; + } + } + } + + /* Copying parameters from table to Eina List */ + { + /* params list must be freed */ + Eina_List *params_list = _eolian_func_params_get(func); + /* Iterate over parameters in order to assign GUI_TYPE, + * and types overrides. */ + int i = 0; + Eolian_Function_Parameter *eolian_param; + EINA_LIST_FOREACH(params_list, itr, eolian_param) + { + const char *c_type; + char c_type2[PATH_MAX]; + const Eolian_Type *param_eolian_type = eolian_parameter_type_get(eolian_param); + if (eolian_type_type_get(param_eolian_type) == EOLIAN_TYPE_REGULAR) + { + c_type = eolian_type_name_get(param_eolian_type); + sprintf(c_type2, "%s", c_type); + } + else + { + const Eolian_Type *base = eolian_type_base_type_get(param_eolian_type); + if ((eolian_type_type_get(base) == EOLIAN_TYPE_REGULAR) || + (eolian_type_type_get(base) == EOLIAN_TYPE_CLASS)) + { + c_type = eolian_type_name_get(base); + } + else if (eolian_type_type_get(base) == EOLIAN_TYPE_POINTER) + { + c_type = "AGAIN POINTER"; + } + else if (eolian_type_type_get(base) == EOLIAN_TYPE_VOID) + { + c_type = "void"; + } + else + { + c_type = "NULL"; + } + sprintf(c_type2, "%s%s *", eolian_type_is_const(base) ? "const " : "", c_type); + } + void *p = eina_hash_find(typedef_table, c_type2); + if (!p) + ERR("no typedef for type: %s, class: %s, func: %s", c_type2, op_desc->cl_name, (char *) op_desc->func_set_name); + + Op_Param_Desc *param_desc = calloc(1, sizeof(Op_Param_Desc)); + param_desc->gui_type = (Gui_Type) (uintptr_t) p; + param_desc->gui_type_name = strdup(c_type); + param_desc->name = eolian_parameter_name_get(eolian_param); + + /* if parameters were overriden */ + if (_op_set && _op_set->params_override_list) + { + const Param_Flags *p_flags = _param_flags_by_idx_get(_op_set->params_override_list, i); + /* if current parameter has overriden type or default values */ + if (p_flags) + { + _param_desc_fill(param_desc, p_flags, typedef_table, op_desc); + } + } + op_desc->params = eina_list_append(op_desc->params, param_desc); + i++; + } + eina_list_free(params_list); + } + } + eina_iterator_free(funcs); + type_p++; + } + } + eina_iterator_free(_all_classes_list); + + /*Iterate over classes one more time, to fill container dependencies. */ + Eina_Iterator *all_classes_list = eolian_all_classes_get(); + Eolian_Class *ekl; + EINA_ITERATOR_FOREACH(all_classes_list, ekl) + { + Class_Props *class_props; + const char *class_name = eolian_class_full_name_get(ekl); + class_props = eina_hash_find(cl_table, class_name); + + /* Get inheritance list of widget being created.*/ + Eina_List *itr2, *kl_list = eo_class_mro_get(class_name); + const char *cont_class; + EINA_LIST_FOREACH(kl_list, itr2, cont_class) + { + if (db_container_desc_get(cont_class)) + { + class_props->inherit_containers = eina_list_append(class_props->inherit_containers, cont_class); + } + } + eina_list_free(kl_list); + } + eina_iterator_free(all_classes_list); eina_hash_free(typedef_table); + /* Init default settings */ + if (!_default_settings_init(db_path)) return EINA_FALSE; return EINA_TRUE; } @@ -1133,7 +1234,8 @@ db_shutdown() op_id_op_desc_table = NULL; #endif eina_hash_free(container_table); - eina_hash_free(def_props_table); + _op_settings_shutdown(); + _default_settings_shutdown(); cl_table = enum_table = enum_types_table = container_table = def_props_table = NULL; --
