#include <unistd.h>
#include <cstring>
#include "hs-appinfo.h"
+#include "hs-helper.h"
#include "hs-clientmanager.h"
#define RETRY_CNT 10
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
usleep(100000); // 100ms
} while(1);
+ for(auto &ref : concerned_event_list) {
+ setEventHook(ref.first.c_str(), eventHandler);
+ }
+
return 0;
}
* - 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;
}
/**
* - 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);
if(j_found == nullptr) {
AFB_INFO( "installed application isn't runnables.");
json_object_put(j_runnable);
- return;
+ return 1;
}
- addAppDetail(j_found);
+ addAppDetail(json_object_get(j_found));
pushAppListChangedEvent(_keyInstall, j_found);
}
else {
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);
+ pushAppListChangedEvent(_keyUninstall, json_object_get(obj_data));
removeAppDetail(appid);
}
else {
AFB_ERROR("operation error.");
}
+ return 1;
}
/**
{
std::string appid;
std::size_t pos = id.find("@");
- if(pos != std::string::npos) {
- appid = id.substr(0,pos);
- }
- else {
- AFB_WARNING("input id error.");
- }
+ appid = id.substr(0,pos);
return appid;
}