e_policy: added interceptor APIs 99/82499/3
authorMinJeong Kim <minjjj.kim@samsung.com>
Tue, 2 Aug 2016 09:04:57 +0000 (18:04 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Thu, 4 Aug 2016 00:59:10 +0000 (17:59 -0700)
External policy system can intercept e_policy fuctions using interceptor
APIs.

Change-Id: I63909cf32f972e2551add8cb2b8f38e7fce8ec9d
Signed-off-by: MinJeong Kim <minjjj.kim@samsung.com>
src/bin/e_policy.c
src/bin/e_policy.h

index 115862c2adf252bd28873c1fc629747ed8557513..e54aec721b2ce759d5f21c6ce8a835d5a4acb992 100644 (file)
@@ -12,6 +12,13 @@ E_Policy_System_Info e_policy_system_info =
    { -1, -1, EINA_FALSE}
 };
 
+static int _e_policy_interceptors_walking = 0;
+static int _e_policy_interceptors_delete = 0;
+
+E_Policy_Interceptor *_e_policy_interceptors[] =
+{
+};
+
 static Eina_List *handlers = NULL;
 static Eina_List *hooks_ec = NULL;
 static Eina_List *hooks_cp = NULL;
@@ -1323,6 +1330,57 @@ e_policy_client_is_cursor(E_Client *ec)
    return EINA_FALSE;
 }
 
+void
+e_policy_interceptors_clean(void)
+{
+   E_Policy_Interceptor *pi;
+   unsigned int x;
+
+   for (x = 0; x < E_POLICY_INTERCEPT_LAST; x++)
+     {
+        pi = _e_policy_interceptors[x];
+        if (!pi->delete_me) continue;
+        _e_policy_interceptors[x] = NULL;
+        free(pi);
+     }
+}
+
+/*
+ * It returns
+ * EINA_TRUE,
+ *  if interceptor process something successfully at its intercept point,
+ * EINA_FALSE,
+ *  if interceptor failed or there is no interceptor.
+ */
+Eina_Bool
+e_policy_interceptor_call(E_Policy_Intercept_Point ipoint, E_Client *ec, ...)
+{
+   va_list list;
+   E_Policy_Interceptor *pi;
+   Eina_Bool ret = EINA_TRUE;
+
+   if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
+   pi = _e_policy_interceptors[ipoint];
+   if (!pi) return EINA_FALSE;
+
+   va_start(list, ec);
+
+   e_object_ref(E_OBJECT(ec));
+   _e_policy_interceptors_walking++;
+   if (!pi->delete_me)
+     {
+        if (!(pi->func(pi->data, ec, list)))
+          ret = EINA_FALSE;
+     }
+   _e_policy_interceptors_walking--;
+   if ((_e_policy_interceptors_walking == 0) && (_e_policy_interceptors_delete > 0))
+     e_policy_interceptors_clean();
+
+   va_end(list);
+   e_object_unref(E_OBJECT(ec));
+   return ret;
+}
+
 E_API Eina_Bool
 e_policy_aux_message_use_get(E_Client *ec)
 {
@@ -1347,6 +1405,35 @@ e_policy_aux_message_send(E_Client *ec, const char *key, const char *val, Eina_L
    e_policy_wl_aux_message_send(ec, key, val, options);
 }
 
+E_API E_Policy_Interceptor *
+e_policy_interceptor_add(E_Policy_Intercept_Point ipoint, E_Policy_Intercept_Cb func, const void *data)
+{
+   E_Policy_Interceptor *pi;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(ipoint >= E_POLICY_INTERCEPT_LAST, NULL);
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(!!_e_policy_interceptors[ipoint], NULL);
+   pi = E_NEW(E_Policy_Interceptor, 1);
+   if (!pi) return NULL;
+   pi->ipoint = ipoint;
+   pi->func = func;
+   pi->data = (void*)data;
+   _e_policy_interceptors[ipoint] = pi;
+   return pi;
+}
+
+E_API void
+e_policy_interceptor_del(E_Policy_Interceptor *pi)
+{
+   pi->delete_me = 1;
+   if (_e_policy_interceptors_walking == 0)
+     {
+        _e_policy_interceptors[pi->ipoint] = NULL;
+        free(pi);
+     }
+   else
+     _e_policy_interceptors_delete++;
+}
+
 E_API void
 e_policy_deferred_job(void)
 {
index 6065adb6de238199bb3c988bd1336eff625b0f88..93232909f6a7c9004693337fec52a9cd64ac670a 100644 (file)
@@ -7,6 +7,14 @@ typedef struct _E_Policy_Config_Desk  E_Policy_Config_Desk;
 typedef struct _E_Policy_Config       E_Policy_Config;
 typedef struct _E_Policy          E_Policy;
 typedef struct _E_Policy_System_Info E_Policy_System_Info;
+typedef struct _E_Policy_Interceptor E_Policy_Interceptor;
+
+typedef enum _E_Policy_Intercept_Point
+{
+   E_POLICY_INTERCEPT_LAST,
+} E_Policy_Intercept_Point;
+
+typedef Eina_Bool (*E_Policy_Intercept_Cb)(void *data, E_Client *ec, va_list list);
 
 # else
 # ifndef E_POLICY_H
@@ -82,6 +90,14 @@ struct _E_Policy_System_Info
    } brightness;
 };
 
+struct _E_Policy_Interceptor
+{
+   E_Policy_Intercept_Point ipoint;
+   E_Policy_Intercept_Cb    func;
+   void                    *data;
+   unsigned int             delete_me : 1;
+};
+
 extern E_Policy *e_policy;
 extern E_Policy_System_Info e_policy_system_info;
 
@@ -131,9 +147,15 @@ EINTERN void             e_policy_stack_clients_restack_above_lockscreen(E_Clien
 EINTERN Eina_Bool        e_policy_stack_check_above_lockscreen(E_Client *ec, E_Layer layer, E_Layer *new_layer, Eina_Bool set_layer);
 
 
+EINTERN void             e_policy_interceptors_clean(void);
+EINTERN Eina_Bool        e_policy_interceptor_call(E_Policy_Intercept_Point ipoint, E_Client *ec, ...);
+
 E_API Eina_Bool e_policy_aux_message_use_get(E_Client *ec);
 E_API void      e_policy_aux_message_send(E_Client *ec, const char *key, const char *val, Eina_List *options);
 
+E_API E_Policy_Interceptor *e_policy_interceptor_add(E_Policy_Intercept_Point ipoint, E_Policy_Intercept_Cb func, const void *data);
+E_API void                  e_policy_interceptor_del(E_Policy_Interceptor *pi);
+
 E_API void e_policy_deferred_job(void);
 E_API int  e_policy_init(void);
 E_API int  e_policy_shutdown(void);