summaryrefslogtreecommitdiffstats
path: root/src/hs-appinfo.cpp
diff options
context:
space:
mode:
authorwang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com>2019-03-26 14:55:18 +0800
committerJosé Bollo <jose.bollo@iot.bzh>2019-03-28 11:00:52 +0000
commit2d1c8cc2f43d021ad75adc16f0606fb52615d9a6 (patch)
treea5907015c127922568f291a5b1451600380bd960 /src/hs-appinfo.cpp
parentaa43a07d4e86421aefec8c603018d14f5e249087 (diff)
Impove event process
1. manager event list in hs_instance. 2. add setEventHook interface to hook event. Change-Id: I65a64f2d16343eb68d22fd1ad9d5fbf565f5967a Signed-off-by: wang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com>
Diffstat (limited to 'src/hs-appinfo.cpp')
-rw-r--r--src/hs-appinfo.cpp54
1 files changed, 42 insertions, 12 deletions
diff --git a/src/hs-appinfo.cpp b/src/hs-appinfo.cpp
index 700594f..6b22265 100644
--- a/src/hs-appinfo.cpp
+++ b/src/hs-appinfo.cpp
@@ -17,6 +17,7 @@
#include <unistd.h>
#include <cstring>
#include "hs-appinfo.h"
+#include "hs-helper.h"
#include "hs-clientmanager.h"
#define RETRY_CNT 10
@@ -31,6 +32,28 @@ const char _keyStart[] = "start";
const char _keyApplistChanged[] = "application-list-changed";
HS_AppInfo* HS_AppInfo::me = nullptr;
+const std::unordered_map<std::string, HS_AppInfo::func_handler> HS_AppInfo::concerned_event_list {
+ {"afm-main/application-list-changed", &HS_AppInfo::updateAppDetailList}
+};
+
+
+/**
+ * event hook function
+ *
+ * #### Parameters
+ * - api : the api serving the request
+ * - event : event name
+ * - object : event json object
+ *
+ * #### Return
+ * 0 : continue transfer
+ * 1 : blocked
+ *
+ */
+static int eventHandler(afb_api_t api, const char *event, struct json_object *object)
+{
+ return HS_AppInfo::instance()->onEvent(api, event, object);
+}
/**
* get application property function
@@ -125,6 +148,10 @@ int HS_AppInfo::init(afb_api_t api)
usleep(100000); // 100ms
} while(1);
+ for(auto &ref : concerned_event_list) {
+ setEventHook(ref.first.c_str(), eventHandler);
+ }
+
return 0;
}
@@ -137,16 +164,17 @@ int HS_AppInfo::init(afb_api_t api)
* - object : event json object
*
* #### Return
- * None
- *
+ * 0 : continue transfer
+ * 1 : blocked
*/
-void HS_AppInfo::onEvent(afb_api_t api, const char *event, struct json_object *object)
+int HS_AppInfo::onEvent(afb_api_t api, const char *event, struct json_object *object)
{
+ int ret = 0;
auto ip = concerned_event_list.find(std::string(event));
if(ip != concerned_event_list.end()) {
- AFB_INFO("[%s] event received.", event);
- (this->*(ip->second))(api, object);
+ ret = (this->*(ip->second))(api, object);
}
+ return ret;
}
/**
@@ -182,29 +210,30 @@ void HS_AppInfo::createAppDetailList(struct json_object *object)
* - object : the detail of all applications
*
* #### Return
- * None
+ * 0 : continue transfer
+ * 1 : blocked
*
*/
-void HS_AppInfo::updateAppDetailList(afb_api_t api, struct json_object *object)
+int HS_AppInfo::updateAppDetailList(afb_api_t api, struct json_object *object)
{
AFB_DEBUG("update:%s", json_object_to_json_string(object));
if(json_object_get_type(object) != json_type_object) {
AFB_ERROR("input detail object error.");
- return;
+ return 1;
}
struct json_object *obj_oper, *obj_data;
if(json_object_object_get_ex(object, _keyOperation, &obj_oper) == 0
|| json_object_object_get_ex(object, _keyData, &obj_data) == 0) {
AFB_ERROR("can't find key=%s, %s.", _keyOperation, _keyData);
- return;
+ return 1;
}
std::string id = json_object_get_string(obj_data);
std::string appid = id2appid(id);
if(isPeripheryApp(appid.c_str())) {
AFB_INFO( "install/uninstall application is periphery.");
- return;
+ return 1;
}
std::string oper = json_object_get_string(obj_oper);
@@ -216,7 +245,7 @@ void HS_AppInfo::updateAppDetailList(afb_api_t api, struct json_object *object)
if(j_found == nullptr) {
AFB_INFO( "installed application isn't runnables.");
json_object_put(j_runnable);
- return;
+ return 1;
}
addAppDetail(j_found);
pushAppListChangedEvent(_keyInstall, j_found);
@@ -230,7 +259,7 @@ void HS_AppInfo::updateAppDetailList(afb_api_t api, struct json_object *object)
std::string appid_checked = checkAppId(appid);
if(appid_checked.empty()) {
AFB_INFO("uninstalled application isn't in runnables list, appid=%s.", appid.c_str());
- return;
+ return 1;
}
pushAppListChangedEvent(_keyUninstall, obj_data);
removeAppDetail(appid);
@@ -238,6 +267,7 @@ void HS_AppInfo::updateAppDetailList(afb_api_t api, struct json_object *object)
else {
AFB_ERROR("operation error.");
}
+ return 1;
}
/**