Add missing deserialization functions 05/147705/7
authorKonrad Kuchciak <k.kuchciak@samsung.com>
Mon, 4 Sep 2017 14:29:00 +0000 (16:29 +0200)
committerKonrad Kuchciak <k.kuchciak@samsung.com>
Tue, 5 Sep 2017 15:20:50 +0000 (17:20 +0200)
Change-Id: I8e418657bd8631317ffe96dfe422a51c78e8c39b
Signed-off-by: Konrad Kuchciak <k.kuchciak@samsung.com>
src/event_types/action_executed_event.c
src/event_types/decision_made_event.c
src/event_types/faultd_started_event.c

index 9886983e0c95b4fca03be33ba3a5553d24b76151..34c9554a4c7a30c0e95b6f3e268065e2faf2434f 100644 (file)
@@ -67,6 +67,70 @@ free_ae_ev:
        return ret;
 }
 
+static int deserialize_ae_event(struct faultd_event_type *type,
+                                                               struct faultd_object *data, struct faultd_event **ev)
+{
+       int ret = -EINVAL;
+       struct ae_event_data ae_ev_data;
+       struct faultd_object *obj;
+
+       memset(&ae_ev_data, 0, sizeof(ae_ev_data));
+
+       list_for_each_entry(obj, &data->val.children, node) {
+               if ((obj->type == TYPE_OID) &&
+                       (strcmp(AE_EV_REASON, obj->key) == 0)) {
+
+                       ret = database_get_event(&obj->val.oid, &ae_ev_data.reason);
+                       if (ret)
+                               goto finish;
+
+               } else if ((obj->type == TYPE_STRING) &&
+                                  (strcmp(AE_EV_ACTION, obj->key) == 0)) {
+
+                       ae_ev_data.action = obj->val.s;
+
+               } else if ((obj->type == TYPE_STRING) &&
+                                  (strcmp(AE_EV_ACTION_IMPL, obj->key) == 0)) {
+
+                       ae_ev_data.action_impl = obj->val.s;
+
+               } else if ((obj->type == TYPE_OBJECT) &&
+                       (strcmp(AE_EV_ACTION_LOG, obj->key) == 0)) {
+
+                       ae_ev_data.action_log = obj;
+               } else if ((obj->type == TYPE_INT) &&
+                       (strcmp(AE_EV_RESULT, obj->key) == 0)) {
+
+                       ae_ev_data.result = obj->val.i;
+               }
+       }
+
+       if (!ae_ev_data.reason ||
+               !ae_ev_data.action ||
+               !ae_ev_data.action_impl ||
+               !ae_ev_data.action_log) {
+                       ret = -EINVAL;
+                       goto finish;
+               }
+
+       ret = allocate_ae_event(type, &ae_ev_data, ev);
+       if (ret < 0)
+               goto finish;
+
+       ret = faultd_event_deserialize_internal(data, type, *ev);
+       if (ret < 0) {
+               struct action_executed_event *ae_ev =
+                       to_action_executed_event(*ev);
+               faultd_event_unref(ae_ev->reason);
+               faultd_event_unref(&ae_ev->event);
+               goto finish;
+       }
+
+       ret = 0;
+finish:
+       return ret;
+}
+
 static void ae_event_release(struct faultd_event *ev)
 {
        struct action_executed_event *ae_ev =
@@ -88,7 +152,7 @@ static char *ae_event_to_string(struct faultd_event *ev)
        char *str;
        int ret;
 
-       /* TODO: add serialization? 
+       /* TODO: add serialization?
        bson2json(ae_ev->action_log.data, &buf, &len); */
 
        ret = asprintf(&str, "Action Executed Event:"
@@ -126,6 +190,7 @@ static struct faultd_event_type action_executed_event_type = {
                .to_string = ae_event_to_string,
        },
        .allocate_event = allocate_ae_event,
+       .deserialize_event = deserialize_ae_event,
        .node = LIST_HEAD_INIT(action_executed_event_type.node),
 };
 
index fedc73619d0b7e2cd26a74d74561a99dea3037f5..63d7c94f9fbd46d34c60f0bc6c8609963b4c9c2a 100644 (file)
@@ -65,6 +65,66 @@ free_dm_ev:
        return ret;
 }
 
+static int deserialize_dm_event(struct faultd_event_type *type,
+                                                               struct faultd_object *data, struct faultd_event **ev)
+{
+       int ret = -EINVAL;
+       struct dm_event_data dm_ev_data;
+       struct faultd_object *obj;
+
+       memset(&dm_ev_data, 0, sizeof(dm_ev_data));
+
+       list_for_each_entry(obj, &data->val.children, node) {
+               if ((obj->type == TYPE_OID) &&
+                       (strcmp(DM_EV_REASON, obj->key) == 0)) {
+
+                       ret = database_get_event(&obj->val.oid, &dm_ev_data.reason);
+                       if (ret)
+                               goto finish;
+
+               } else if ((obj->type == TYPE_STRING) &&
+                                  (strcmp(DM_EV_WHO, obj->key) == 0)) {
+
+                       dm_ev_data.who_made = obj->val.s;
+
+               } else if ((obj->type == TYPE_STRING) &&
+                                  (strcmp(DM_EV_ACTION, obj->key) == 0)) {
+
+                       dm_ev_data.action = obj->val.s;
+
+               } else if ((obj->type == TYPE_OBJECT) &&
+                       (strcmp(DM_EV_ACTION_DATA, obj->key) == 0)) {
+
+                       dm_ev_data.action_data = obj;
+               }
+       }
+
+       if (!dm_ev_data.reason ||
+               !dm_ev_data.who_made ||
+               !dm_ev_data.action ||
+               !dm_ev_data.action_data) {
+                       ret = -EINVAL;
+                       goto finish;
+               }
+
+       ret = allocate_dm_event(type, &dm_ev_data, ev);
+       if (ret < 0)
+               goto finish;
+
+       ret = faultd_event_deserialize_internal(data, type, *ev);
+       if (ret < 0) {
+               struct decision_made_event *dm_ev =
+                       to_decision_made_event(*ev);
+               faultd_event_unref(dm_ev->reason);
+               faultd_event_unref(&dm_ev->event);
+               goto finish;
+       }
+
+       ret = 0;
+finish:
+       return ret;
+}
+
 static void dm_event_release(struct faultd_event *ev)
 {
        struct decision_made_event *dm_ev =
@@ -118,6 +178,7 @@ static struct faultd_event_type decision_made_event_type = {
                .to_string = dm_event_to_string,
        },
        .allocate_event = allocate_dm_event,
+       .deserialize_event = deserialize_dm_event,
        .node = LIST_HEAD_INIT(decision_made_event_type.node),
 };
 
index cd9cd22adef44c53b25dd8b1134571c976001bec..12f6a0b7052d6136ac8855953e9c99885c70cdc5 100644 (file)
@@ -25,6 +25,28 @@ free_fs_ev:
        return ret;
 }
 
+static int deserialize_fs_event(struct faultd_event_type *type,
+                                                               struct faultd_object *data, struct faultd_event **ev)
+{
+       int ret = -EINVAL;
+
+       ret = fs_event_allocate(type, NULL, ev);
+       if (ret < 0)
+               goto finish;
+
+       ret = faultd_event_deserialize_internal(data, type, *ev);
+       if (ret < 0) {
+               struct faultd_started_event *fs_ev =
+                       to_faultd_started_event(*ev);
+               free(fs_ev);
+               goto finish;
+       }
+
+       ret = 0;
+finish:
+       return ret;
+}
+
 static void fs_event_release(struct faultd_event *ev)
 {
        struct faultd_started_event *fs_ev = 
@@ -61,6 +83,7 @@ static struct faultd_event_type faultd_started_event_type = {
                .to_string = fs_event_to_string,
        },
        .allocate_event = fs_event_allocate,
+       .deserialize_event = deserialize_fs_event,
        .node = LIST_HEAD_INIT(faultd_started_event_type.node),
 };