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;
 

-- 


Reply via email to