yakov pushed a commit to branch master.

http://git.enlightenment.org/tools/erigo.git/commit/?id=cd548b2917abfc023ea1f9d42bd8ec2ccc954856

commit cd548b2917abfc023ea1f9d42bd8ec2ccc954856
Author: Yakov Goldberg <[email protected]>
Date:   Thu Mar 5 15:24:32 2015 +0200

    Add black list of classes and funcs
---
 data/config/CMakeLists.txt  |   1 +
 data/config/black_list.json |  48 ++++++++++++++++++++
 src/bin/main.c              |   3 +-
 src/lib/database.c          | 107 +++++++++++++++++++++++++++++++++++++++++---
 src/lib/database.h          |   2 +-
 src/lib/gui_widget.c        |   4 +-
 src/lib/gui_widget.h        |   2 +-
 7 files changed, 155 insertions(+), 12 deletions(-)

diff --git a/data/config/CMakeLists.txt b/data/config/CMakeLists.txt
index 92faf77..93dee0c 100644
--- a/data/config/CMakeLists.txt
+++ b/data/config/CMakeLists.txt
@@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 2.8.1)
 
 LIST(APPEND CONFIG_FILES
      func_names.json
+     black_list.json
      egui_all.eo
     )
 #always copy config files into build directory, so egui_cmd will be able to 
generate egui_auto
diff --git a/data/config/black_list.json b/data/config/black_list.json
new file mode 100644
index 0000000..ba52da8
--- /dev/null
+++ b/data/config/black_list.json
@@ -0,0 +1,48 @@
+{
+   "Evas_3D_Texture": [],
+   "Evas_3D_Light": [],
+   "Evas_3D_Camera": [],
+   "Evas_3D_Material": [],
+   "Evas_3D_Node": [],
+   "Evas_3D_Mesh": [],
+   "Evas_3D_Object": [],
+   "Evas_3D_Scene": [],
+
+   "Eo.Base": [],
+   "Edje.Object": [],
+   "Elm_Interface_Atspi_Text": [],
+   "Elm_Interface_Atspi_Action": [],
+   "Elm_Interface_Atspi_Accessible": [],
+   "Elm_Interface_Atspi_Widget_Action": [],
+   "Evas.Common_Interface": [],
+   "Elm_Container": ["content_swallow_list"],
+   "Elm_Interface_Fileselector": ["mode", "selected_paths", "sort_method", 
"custom_filter_append"],
+   "Elm_Interface_Scrollable":["edge_top_cb", "edge_bottom_cb", 
"edge_right_cb", "vbar_unpress_cb", "vbar_drag_cb", "edge_left_cb", 
"scroll_right_cb", "animate_stop_cb", "scroll_cb", "scroll_down_cb", 
"animate_start_cb", "page_change_cb", "drag_stop_cb", "hbae_unpress_cb", 
"hbar_press_cb", "hbar_unpress_cb", "vbar_press_cb", "scroll_left_cb", 
"content_viewport_resize_cb", "drag_start_cb", "hbar_drag_cb", "scroll_up_cb", 
"single_direction", "movement_block"],
+   "Evas.Object_Smart": ["data", "attach", "callback_description_find", 
"callbacks_descriptions_get", "callbacks_descriptions_set"],
+   "Evas.Object":["size_hint_display_mode", "map", "render_op", 
"pointer_mode", "key_grab", "key_ungrab"],
+   "Elm_Hoversel":["item_add"],
+   "Evas.Image":["orient", "filter_source", "scene", "data_copy", "mmap", 
"pixels_get_callback", "colorspace", "scale_hint", "native_surface", 
"border_center_fill", "fill_spread", "video_surface_caps", "video_surface", 
"content_hint", "pixels_import", "data_convert", "data_set"],
+   
"Elm_Widget":["newest_focus_order_get","cursor_add","focus_next_object_get", 
"focus_next_object_set", 
"focus_highlight_geometry_get","activate","event","event_callback_add","cursor_del","event_callback_del","focus_cycle","focus_direction","event_propagate","signal_callback_add","focus_list_direction_get","tooltip_del","focus_next_get","focus_next","focus_list_next_get","focus_direction_get","signal_callback_del","tooltip_add","theme","focus_custom_chain","display_mode","on_show_region
 [...]
+   "Elm_Entry": 
["context_menu_item_add","markup_filter_prepend","cnp_mode","input_panel_language","autocapital_type","file","input_hint","input_panel_layout","input_panel_return_key_type","line_wrap","input_panel_imdata_get","markup_filter_remove","item_provider_append","markup_filter_append","markup_filter_remove","markup_filter_append","item_provider_append","item_provider_prepend","item_provider_remove"],
+   "Elm_Image":["orient","mmap","memfile"],
+   "Elm_Label":["slide_mode", "line_wrap"],
+   "Elm_Icon":["order_lookup"],
+   
"Elm_Genlist":["item_insert_before","item_insert_after","item_prepend","item_append","item_sorted_insert","mode","item_sorted_insert","search_by_text_item_get","multi_select_mode"],
+   
"Elm_Flip":["interaction_direction_hitsize_get","interaction_direction_enabled_set","interaction","interaction_direction_hitsize_set","interaction_direction_enabled_get"],
+   
"Elm_Dayselector":["weekdays_names_set","day_selected_set","day_selected_get","week_start","weekend_length","weekend_start"],
+   
"Elm_Gengrid":["item_insert_before","item_insert_after","item_append","item_prepend","item_sorted_insert","search_by_text_item_get","multi_select_mode"],
+   "Elm_Toolbar":["icon_order_lookup"],
+   "Elm_Scroller":["page_scroll_limit_get"],
+   
"Elm_Calendar":["displayed_time_get","first_day_of_week","selectable","weekdays_names","select_mode","format_function","selected_time_get","selected_time_set","mark_add"],
+   "Elm_Bubble":["pos"],
+   "Elm_Actionslider":["indicator_pos","magnet_pos","enabled_pos"],
+   "Elm_Radio":["value_pointer"],
+   "Elm_Check":["state_pointer"],
+   "Elm_Clock":["edit_mode"],
+   
"Elm_Layout":["signal_callback_add","signal_callback_add","box_insert_before","box_insert_at","signal_callback_del","table_pack","text_aliases","content_aliases"],
+   "Elm_Colorselector":["mode"],
+   "Elm_Ctxpopup":["direction_priority"],
+   "Elm_Box":["layout"],
+   "Elm_Win": 
["illume_command_send","wm_available_rotations","available_profiles","keyboard_mode","indicator_opacity","indicator_mode","trap_data","fake_canvas"],
+   "Elm_Bg":["option"]
+}
diff --git a/src/bin/main.c b/src/bin/main.c
index 176b482..9e14ddb 100644
--- a/src/bin/main.c
+++ b/src/bin/main.c
@@ -243,7 +243,8 @@ main(int argc, char **argv)
         goto end;
      }
 
-   if (!egui_init(PACKAGE_DATA_DIR"/config/func_names.json", 
PACKAGE_DATA_DIR"/config/egui_all.eo"))
+   if (!egui_init(PACKAGE_DATA_DIR"/config/func_names.json", 
PACKAGE_DATA_DIR"/config/egui_all.eo",
+                  PACKAGE_DATA_DIR"/config/black_list.json"))
      {
         EINA_LOG_ERR("Could not start Erigo");
         egui_shutdown();
diff --git a/src/lib/database.c b/src/lib/database.c
index 47bf6d4..e0b84d4 100644
--- a/src/lib/database.c
+++ b/src/lib/database.c
@@ -826,8 +826,6 @@ _op_settings_init(const char *db_path)
    return EINA_TRUE;
 }
 
-/* Read operations settings file and save data in a list.
-*/
 static void
 _op_settings_shutdown()
 {
@@ -941,8 +939,70 @@ _default_settings_shutdown()
    eina_hash_free(def_props_table);
 }
 
+typedef struct
+{
+   Eina_Stringshare *cl_name;
+   Eina_List *black_funcs_lst;
+} _Black_Class;
+
+Eina_List *_black_lst = NULL;
+
+static void
+_black_list_init(const char *black_list)
+{
+   Eina_Json_Value *jv;
+
+   /* Get JSON object from DB by path. */
+   jv = _db_json_object_get(black_list);
+
+   Eina_Json_Value *black_list_item = NULL;
+
+   Eina_Iterator *it = eina_json_object_iterator_new(jv);
+   EINA_ITERATOR_FOREACH(it, black_list_item)
+     {
+        _Black_Class *blk = NULL;
+        const char *class_name = eina_json_pair_name_get(black_list_item);
+        blk = calloc(1, sizeof(_Black_Class));
+        blk->cl_name = eina_stringshare_add(class_name);
+        _black_lst = eina_list_append(_black_lst, blk);
+
+        Eina_Json_Value *black_funcs_arr = 
eina_json_pair_value_get(black_list_item);
+        Eina_Iterator *it_arr = eina_json_array_iterator_new(black_funcs_arr);
+        Eina_Json_Value *black_list_func = NULL;
+
+        EINA_ITERATOR_FOREACH(it_arr, black_list_func)
+          {
+             const char *str = eina_json_string_get(black_list_func);
+             if (str && strlen(str))
+               {
+                  Eina_Stringshare *_str = eina_stringshare_add(str);
+                  blk->black_funcs_lst = 
eina_list_append(blk->black_funcs_lst, _str);
+               }
+          }
+        eina_iterator_free(it_arr);
+     }
+   eina_iterator_free(it);
+   eina_json_value_free(jv);
+}
+
+static void
+_black_list_shutdown()
+{
+   _Black_Class *blk;
+   EINA_LIST_FREE(_black_lst, blk)
+     {
+        eina_stringshare_del(blk->cl_name);
+        Eina_Stringshare *_str;
+        EINA_LIST_FREE(blk->black_funcs_lst, _str)
+          {
+             eina_stringshare_del(_str);
+          }
+        free(blk);
+     }
+}
+
 Eina_Bool
-db_init(const char *db_path, const char *all_eo_path)
+db_init(const char *db_path, const char *all_eo_path, const char *black_list)
 {
    const char *log_dom = "egui_db";
    const Eina_List *itr;
@@ -965,6 +1025,7 @@ db_init(const char *db_path, const char *all_eo_path)
      return EINA_FALSE;
 
    if (!_op_settings_init(db_path)) return EINA_FALSE;
+   _black_list_init(black_list);
 
    typedef_table = eina_hash_string_superfast_new(NULL);
    eina_hash_add(typedef_table, "Evas_Coord", (void *) (uintptr_t) 
GUI_TYPE_SINT);
@@ -995,9 +1056,27 @@ db_init(const char *db_path, const char *all_eo_path)
    Eolian_Class *_ekl;
    EINA_ITERATOR_FOREACH(_all_classes_list, _ekl)
      {
-        const char *class_name = eolian_class_full_name_get(_ekl);
+        Eina_Stringshare *class_name = 
eina_stringshare_add(eolian_class_full_name_get(_ekl));
         const Eolian_Function *func;
 
+        _Black_Class *blk = NULL;
+        Eina_List *it;
+        Eina_Bool class_in_black_list = EINA_FALSE;
+        EINA_LIST_FOREACH(_black_lst, it, blk)
+          {
+             /* if current class is in black list break iterations */
+             if (class_name == blk->cl_name)
+               {
+                  /* Only if funcs list is empty exclude class. */
+                  if (!blk->black_funcs_lst)
+                    {
+                       class_in_black_list = EINA_TRUE;
+                    }
+                  break;
+               }
+          }
+        if (class_in_black_list) continue;
+
         /* Looking for a record for current class*/
         Class_Props *class_props = eina_hash_find(cl_table, class_name);
         if (!class_props)
@@ -1015,6 +1094,7 @@ db_init(const char *db_path, const char *all_eo_path)
              funcs = eolian_class_functions_get(_ekl, *type_p);
              EINA_ITERATOR_FOREACH(funcs, func)
                {
+                  Eina_Stringshare *func_name;
                   Op_Desc *op_desc = NULL;
                   char *func_set_name = NULL, *func_get_name = NULL;
 
@@ -1022,6 +1102,15 @@ db_init(const char *db_path, const char *all_eo_path)
 
                   if (f_type == EOLIAN_UNRESOLVED) continue;
 
+                  func_name = 
eina_stringshare_add(eolian_function_name_get(func));
+
+                  /* Check if this current func is in black list */
+                  if (blk && eina_list_data_find(blk->black_funcs_lst, 
func_name))
+                    {
+                       eina_stringshare_del(func_name);
+                       continue;
+                    }
+
                   op_desc = calloc(1, sizeof(Op_Desc));
                   op_desc->func_type = f_type;
 
@@ -1045,7 +1134,7 @@ db_init(const char *db_path, const char *all_eo_path)
                     }
 
                   op_desc->cl_name = eina_stringshare_add(class_name);
-                  op_desc->op_name = 
eina_stringshare_add(eolian_function_name_get(func));
+                  op_desc->op_name = eina_stringshare_add(func_name);
 
                   Op_Settings *_op_set = _op_settings_get(op_desc->cl_name, 
op_desc->op_name);
 
@@ -1154,7 +1243,7 @@ db_init(const char *db_path, const char *all_eo_path)
                               }
                             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);
+                              ERR("no typedef for type: %s, class: %s, eolian 
func: %s", c_type2, op_desc->cl_name, func_name);
 
                             Op_Param_Desc *param_desc = calloc(1, 
sizeof(Op_Param_Desc));
                             param_desc->gui_type = (Gui_Type) (uintptr_t) p;
@@ -1176,10 +1265,12 @@ db_init(const char *db_path, const char *all_eo_path)
                          }
                        eina_list_free(params_list);
                     }
+                  eina_stringshare_del(func_name);
                }
              eina_iterator_free(funcs);
              type_p++;
           }
+        eina_stringshare_del(class_name);
      }
    eina_iterator_free(_all_classes_list);
 
@@ -1234,9 +1325,11 @@ db_shutdown()
    op_id_op_desc_table = NULL;
 #endif
    eina_hash_free(container_table);
-   _op_settings_shutdown();
    _default_settings_shutdown();
 
+   _black_list_shutdown();
+   _op_settings_shutdown();
+
    cl_table = enum_table = enum_types_table = container_table = 
def_props_table = NULL;
 
    eina_log_domain_unregister(_db_log_dom);
diff --git a/src/lib/database.h b/src/lib/database.h
index 33224c6..8cc8a66 100644
--- a/src/lib/database.h
+++ b/src/lib/database.h
@@ -130,7 +130,7 @@ typedef struct _Container_Desc Container_Desc;
 #define ITEM_PUSH "item_push"
 
 Eina_Bool
-db_init(const char *db_path, const char *all_eo_path);
+db_init(const char *db_path, const char *all_eo_path, const char *black_list);
 
 Eina_Bool
 db_shutdown();
diff --git a/src/lib/gui_widget.c b/src/lib/gui_widget.c
index 27c9cba..480f900 100644
--- a/src/lib/gui_widget.c
+++ b/src/lib/gui_widget.c
@@ -822,7 +822,7 @@ gui_all_contexts_del()
 */
 
 Eina_Bool
-egui_init(const char *db_path, const char *all_eo_path)
+egui_init(const char *db_path, const char *all_eo_path, const char *black_list)
 {
    const char *log_dom = "egui";
    if (!db_path)
@@ -855,7 +855,7 @@ egui_init(const char *db_path, const char *all_eo_path)
    eolian_directory_scan(EOLIAN_EO_DIR"/efl-1");
    eolian_directory_scan(EOLIAN_EO_DIR"/elementary-1");
 
-   if (!db_init(db_path, all_eo_path))
+   if (!db_init(db_path, all_eo_path, black_list))
      return EINA_FALSE;
 
    return EINA_TRUE;
diff --git a/src/lib/gui_widget.h b/src/lib/gui_widget.h
index 1880ed1..5af8349 100644
--- a/src/lib/gui_widget.h
+++ b/src/lib/gui_widget.h
@@ -105,7 +105,7 @@ enum
 };
 
 Eina_Bool
-egui_init(const char *db_path, const char *all_eo_path);
+egui_init(const char *db_path, const char *all_eo_path, const char 
*black_list);
 
 Eina_Bool
 egui_shutdown();

-- 


Reply via email to