Add alias appid option using metadata 39/244739/4
authorJusung Son <jusung07.son@samsung.com>
Thu, 24 Sep 2020 00:31:09 +0000 (09:31 +0900)
committerJusung Son <jusung07.son@samsung.com>
Thu, 24 Sep 2020 02:17:21 +0000 (11:17 +0900)
If you want to publish with alias appid
please add metadata in the tizen-manifest.xml as below:
+----------------------------------------------------------------------------------+
|<metadata key="http://tizen.org/metadata/app-event/alias-appid-mode" value="yes"/>|
+----------------------------------------------------------------------------------+

Change-Id: Id0e549e91da72029f37c5b6331da34af6c4614f0
Signed-off-by: Jusung Son <jusung07.son@samsung.com>
packaging/capi-appfw-event.spec
src/CMakeLists.txt
src/event.c

index e32add0..2593d15 100644 (file)
@@ -13,6 +13,7 @@ BuildRequires:  pkgconfig(eventsystem)
 BuildRequires:  pkgconfig(capi-base-common)
 BuildRequires:  pkgconfig(aul)
 BuildRequires:  pkgconfig(gmock)
+BuildRequires:  pkgconfig(pkgmgr-info)
 
 %if 0%{?gcov:1}
 BuildRequires:  lcov
index 14c5f04..25f865a 100644 (file)
@@ -9,7 +9,7 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX})
 SET(INC_DIR ${CMAKE_SOURCE_DIR}/include)
 INCLUDE_DIRECTORIES(${INC_DIR})
 
-SET(requires "glib-2.0 dlog bundle eventsystem capi-base-common aul")
+SET(requires "glib-2.0 dlog bundle eventsystem capi-base-common aul pkgmgr-info")
 SET(pc_requires "capi-base-common")
 
 INCLUDE(FindPkgConfig)
index c0d3cbe..bcb660f 100644 (file)
@@ -23,6 +23,8 @@
 #include <app_event.h>
 #include <eventsystem.h>
 #include <aul_svc.h>
+#include <aul.h>
+#include <pkgmgr-info.h>
 
 #ifdef LOG_TAG
 #undef LOG_TAG
 
 #define LOG_TAG "CAPI_APPFW_EVENT"
 #define MAX_SIZE 100
+#define MAX_APP_ID_LEN 256
+
+enum alias_appid_mode {
+       ALIAS_APPID_MODE_UNKNOWN,
+       ALIAS_APPID_MODE_OFF,
+       ALIAS_APPID_MODE_ON
+};
 
 typedef struct event_handler {
        char *event_name;
@@ -44,8 +53,52 @@ static void *earlier_user_data;
 static pthread_mutex_t register_sync_lock = PTHREAD_MUTEX_INITIALIZER;
 static GHashTable *event_table;
 
+#define KEY_ALIAS_APP_ID "http://tizen.org/metadata/app-event/alias-appid-mode"
+
+int check_alias_appid_mode(const char *real_appid)
+{
+       pkgmgrinfo_appinfo_h handle;
+       int ret;
+       char *on_off;
+       int alias_mode = ALIAS_APPID_MODE_OFF;
+
+       ret = pkgmgrinfo_appinfo_get_appinfo(real_appid, &handle);
+       if (ret != PMINFO_R_OK) {
+               LOGE("fail to get %s appinfo %d", real_appid, ret);
+               return ALIAS_APPID_MODE_UNKNOWN;
+       }
+
+       ret = pkgmgrinfo_appinfo_get_metadata_value(handle, KEY_ALIAS_APP_ID, &on_off);
+       if (ret == PMINFO_R_OK && strcmp(on_off, "yes") == 0)
+               alias_mode = ALIAS_APPID_MODE_ON;
+
+       pkgmgrinfo_appinfo_destroy_appinfo(handle);
+       LOGD("alias_appid_mode %d", alias_mode);
+
+       return alias_mode;
+}
+
+int get_publication_alias_appid_mode(void)
+{
+       static int alias_appid_mode = ALIAS_APPID_MODE_UNKNOWN;
+       int ret;
+       char buffer[MAX_APP_ID_LEN] = {0, };
+
+       if (alias_appid_mode != ALIAS_APPID_MODE_UNKNOWN)
+               return alias_appid_mode;
+
+       ret = aul_app_get_appid_bypid(getpid(), buffer, sizeof(buffer));
+       if(ret != AUL_R_OK) {
+               LOGE("Failed to get the application ID: %d", ret);
+               return alias_appid_mode;
+       }
+
+       alias_appid_mode = check_alias_appid_mode(buffer);
+       return alias_appid_mode;
+}
+
 bool get_real_event_name(const char *event_name,
-       char **real_event_name)
+       char **real_event_name, bool publish)
 {
        char *prefix, *user_defined_name;
        char *real_appid, *alias_appid, *real_event;
@@ -76,11 +129,15 @@ bool get_real_event_name(const char *event_name,
 
        prefix += 1;
        snprintf(alias_appid, len, "%s", prefix);
+
        ret = aul_svc_get_appid_by_alias_appid(alias_appid, &real_appid);
        free(alias_appid);
        if (ret < 0)
                return false;
 
+       if (publish == false && check_alias_appid_mode(real_appid) != ALIAS_APPID_MODE_ON)
+               return false;
+
        len = 6 /* event. */ + strlen(real_appid)
                + 1 /* . */ + strlen(user_defined_name);
        real_event = malloc(sizeof(char) * len + 1);
@@ -224,7 +281,7 @@ int event_add_event_handler(const char *event_name, event_cb callback,
                                __FUNCTION__, NULL);
        }
 
-       if (get_real_event_name(event_name, &real_event_name)) {
+       if (get_real_event_name(event_name, &real_event_name, false)) {
                handler->event_name = real_event_name;
                ret = set_real_event_info(real_event_name, event_name);
                if (ret != ES_R_OK)
@@ -308,7 +365,10 @@ int event_publish_app_event(const char *event_name, bundle *event_data)
        if (event_data == NULL || event_name == NULL)
                return event_error(EVENT_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
 
-       if (get_real_event_name(event_name, &real_event_name)) {
+       ret = get_publication_alias_appid_mode();
+
+       if (ret == ALIAS_APPID_MODE_ON
+                       && get_real_event_name(event_name, &real_event_name, true)) {
                ret = eventsystem_send_user_event(real_event_name, event_data, false);
                free(real_event_name);
        } else {
@@ -329,7 +389,10 @@ int event_publish_trusted_app_event(const char *event_name, bundle *event_data)
        if (event_data == NULL || event_name == NULL)
                return event_error(EVENT_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
 
-       if (get_real_event_name(event_name, &real_event_name)) {
+       ret = get_publication_alias_appid_mode();
+
+       if (ret == ALIAS_APPID_MODE_ON
+                       && get_real_event_name(event_name, &real_event_name, true)) {
                ret = eventsystem_send_user_event(real_event_name, event_data, true);
                free(real_event_name);
        } else {
@@ -350,7 +413,7 @@ int event_keep_last_event_data(const char *event_name)
        if (event_name == NULL)
                return event_error(EVENT_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
 
-       if (get_real_event_name(event_name, &real_event_name)) {
+       if (get_real_event_name(event_name, &real_event_name, false)) {
                ret = set_real_event_info(real_event_name, event_name);
                if (ret != ES_R_OK)
                        goto out;