diff --git a/src/devices/devices_manager.c b/src/devices/devices_manager.c index 8a26488..88b41a0 100644 --- a/src/devices/devices_manager.c +++ b/src/devices/devices_manager.c @@ -190,22 +190,44 @@ int devices_manager_save(devices_manager_t *dm) char *devices_manager_get(devices_manager_t *dm, const char *capability) { -#warning "TODO" - return NULL; + json_object *output_node; + char *output = NULL; + + // Sanity Checks + if (dm == NULL) + return NULL; + + if (capability == kOutletEntry) + { + } + else if (capability == kShutterEntry) + { + } + else if (capability == kSprinklerEntry) + { + output_node = devices_manager_sprinkler_to_json_object(dm); + if (output_node != NULL) + { + output = strdup(json_object_to_json_string(output_node)); + json_object_put(output_node); + } + } + + return output; } /*--------------------------------------------------------------------------*/ char *devices_manager_get_by_id(devices_manager_t *dm, const char *capability, uint32_t id) { - char *output = NULL; + char *output = NULL; // Sanity Checks if (dm == NULL) return NULL; - if (capability == kOutletEntry) - { + if (capability == kOutletEntry) + { outlet_dio_t *outlet_dio; outlet_dio = get_outlet_by_id(dm, id); if (outlet_dio != NULL) @@ -217,9 +239,9 @@ char *devices_manager_get_by_id(devices_manager_t *dm, const char *capability, u json_object_put(output_node); } } - } - else if (capability == kShutterEntry) - { + } + else if (capability == kShutterEntry) + { shutter_t *shutter; shutter = get_shutter_by_id(dm, id); if (shutter != NULL) @@ -231,9 +253,9 @@ char *devices_manager_get_by_id(devices_manager_t *dm, const char *capability, u json_object_put(output_node); } } - } - else if (capability == kSprinklerEntry) - { + } + else if (capability == kSprinklerEntry) + { sprinkler_t *sprinkler; sprinkler = get_sprinkler_by_id(dm, id); if (sprinkler != NULL) @@ -245,13 +267,37 @@ char *devices_manager_get_by_id(devices_manager_t *dm, const char *capability, u json_object_put(output_node); } } - } + } return output; } /*--------------------------------------------------------------------------*/ +struct json_object *devices_manager_to_json_object(devices_manager_t *dm, const char *capability) +{ + struct json_object *root_node; + // Sanity Checks + if (dm == NULL) + return NULL; + + root_node = json_object_new_array(); + + if (capability == kOutletEntry) + { + } + else if (capability == kShutterEntry) + { + } + else if (capability == kSprinklerEntry) + { + } + + return root_node; +} + +/*--------------------------------------------------------------------------*/ + int devices_manager_set(devices_manager_t *dm, const char *capability, struct json_object *node) { #warning "TODO" @@ -290,7 +336,7 @@ int devices_manager_set_state(devices_manager_t *dm, const char *capability, int int devices_manager_create(devices_manager_t *dm, const char *capability, struct json_object *node) { // Sanity checks - if ((dm == NULL) || (node ==NULL)) + if ((dm == NULL) || (node == NULL)) return -1; if (capability == kOutletEntry) @@ -382,4 +428,3 @@ int devices_manager_delete(devices_manager_t *dm, const char *capability, struct return -1; } - diff --git a/src/devices/devices_manager.h b/src/devices/devices_manager.h index b6af72c..41e4fe8 100644 --- a/src/devices/devices_manager.h +++ b/src/devices/devices_manager.h @@ -67,6 +67,8 @@ extern int devices_manager_save(devices_manager_t *dm); extern char *devices_manager_get(devices_manager_t *dm, const char *capability); extern char *devices_manager_get_by_id(devices_manager_t *dm, const char *capability, uint32_t id); +extern struct json_object *devices_manager_to_json_object(devices_manager_t *dm, const char *capability); + extern int devices_manager_set(devices_manager_t *dm, const char *capability, struct json_object *node); extern int devices_manager_set_state(devices_manager_t *dm, const char *capability, int id, bool state); diff --git a/src/devices/devices_manager_internal.c b/src/devices/devices_manager_internal.c index 982b43a..7c87592 100644 --- a/src/devices/devices_manager_internal.c +++ b/src/devices/devices_manager_internal.c @@ -52,6 +52,10 @@ int load_outlets(devices_manager_t *dm, struct json_object *node) { DEBUG("devicesManager-load_outlets\n"); + // Sanity Checks + if (dm == NULL) + return -1; + /* Get Outlets */ if (json_object_get_type(node) == json_type_array) { @@ -81,6 +85,10 @@ struct json_object *save_outlets(devices_manager_t *dm) outlet_dio_t *outlet; qlist_obj_t obj; + // Sanity Checks + if (dm == NULL) + return NULL; + memset((void *)&obj, 0, sizeof(obj)); root_node = json_object_new_array(); @@ -97,7 +105,13 @@ struct json_object *save_outlets(devices_manager_t *dm) int create_outlet(devices_manager_t *dm, struct json_object *node) { - outlet_dio_t *outlet = outlet_dio_new(); + outlet_dio_t *outlet; + + // Sanity Checks + if (dm == NULL) + return -1; + + outlet = outlet_dio_new(); if (outlet_dio_from_json(outlet, node) != 0) { @@ -120,6 +134,10 @@ int remove_outlet(devices_manager_t *dm, uint16_t id) outlet_dio_t *outlet_dio; int position = 0; + // Sanity Checks + if (dm == NULL) + return -1; + memset((void *)&obj, 0, sizeof(obj)); while (qlist_getnext(dm->outlets, &obj, true)) @@ -143,6 +161,10 @@ int update_outlet(devices_manager_t *dm, uint16_t id, struct json_object *node) qlist_obj_t obj; outlet_dio_t *outlet_dio; + // Sanity Checks + if (dm == NULL) + return -1; + memset((void *)&obj, 0, sizeof(obj)); while (qlist_getnext(dm->outlets, &obj, false)) @@ -172,6 +194,10 @@ outlet_dio_t *get_outlet_by_id(devices_manager_t *dm, uint16_t id) qlist_obj_t obj; outlet_dio_t *outlet; + // Sanity Checks + if (dm == NULL) + return NULL; + memset((void *)&obj, 0, sizeof(obj)); while (qlist_getnext(dm->outlets, &obj, false)) @@ -192,6 +218,10 @@ int load_shutters(devices_manager_t *dm, struct json_object *node) { DEBUG("devicesManager-load_shutters\n"); + // Sanity Checks + if (dm == NULL) + return -1; + /* Get Shutters */ if (json_object_get_type(node) == json_type_array) { @@ -221,6 +251,10 @@ struct json_object *save_shutters(devices_manager_t *dm) shutter_t *shutter; qlist_obj_t obj; + // Sanity Checks + if (dm == NULL) + return NULL; + memset((void *)&obj, 0, sizeof(obj)); root_node = json_object_new_array(); @@ -237,7 +271,13 @@ struct json_object *save_shutters(devices_manager_t *dm) int create_shutter(devices_manager_t *dm, struct json_object *node) { - shutter_t *shutter = shutter_new(); + shutter_t *shutter; + + // Sanity Checks + if (dm == NULL) + return -1; + + shutter = shutter_new(); if (shutter_from_json(shutter, node) != 0) { @@ -259,6 +299,11 @@ int remove_shutter(devices_manager_t *dm, uint16_t id) qlist_obj_t obj; shutter_t *shutter; int position = 0; + int remove_position = -1; + + // Sanity Checks + if (dm == NULL) + return -1; memset((void *)&obj, 0, sizeof(obj)); @@ -273,6 +318,12 @@ int remove_shutter(devices_manager_t *dm, uint16_t id) position++; } + if (remove_position != -1) + { + qlist_removeat(dm->shutters, remove_position); + return 0; + } + return -1; } @@ -283,6 +334,10 @@ int update_shutter(devices_manager_t *dm, uint16_t id, struct json_object *node) qlist_obj_t obj; shutter_t *shutter; + // Sanity Checks + if (dm == NULL) + return -1; + memset((void *)&obj, 0, sizeof(obj)); while (qlist_getnext(dm->shutters, &obj, false)) @@ -312,6 +367,10 @@ shutter_t *get_shutter_by_id(devices_manager_t *dm, uint16_t id) qlist_obj_t obj; shutter_t *shutter; + // Sanity Checks + if (dm == NULL) + return NULL; + memset((void *)&obj, 0, sizeof(obj)); while (qlist_getnext(dm->shutters, &obj, false)) @@ -332,6 +391,10 @@ int load_sprinklers(devices_manager_t *dm, struct json_object *node) { DEBUG("devicesManager-load_sprinkler\n"); + // Sanity Checks + if (dm == NULL) + return -1; + /* Get Shutters */ if (json_object_get_type(node) == json_type_array) { @@ -361,6 +424,10 @@ struct json_object *save_sprinklers(devices_manager_t *dm) sprinkler_t *sprinkler; qlist_obj_t obj; + // Sanity Checks + if (dm == NULL) + return NULL; + memset((void *)&obj, 0, sizeof(obj)); root_node = json_object_new_array(); @@ -377,7 +444,13 @@ struct json_object *save_sprinklers(devices_manager_t *dm) int create_sprinkler(devices_manager_t *dm, struct json_object *node) { - sprinkler_t *sprinkler = sprinkler_new(); + sprinkler_t *sprinkler; + + // Sanity Checks + if (dm == NULL) + return -1; + + sprinkler = sprinkler_new(); if (sprinkler_from_json(sprinkler, node) != 0) { @@ -396,23 +469,21 @@ int create_sprinkler(devices_manager_t *dm, struct json_object *node) int remove_sprinkler(devices_manager_t *dm, uint16_t id) { - qlist_obj_t obj; + qlist_obj_t *remove_obj; sprinkler_t *sprinkler; - int position = 0; - memset((void *)&obj, 0, sizeof(obj)); + // Sanity Checks + if (dm == NULL) + return -1; - while (qlist_getnext(dm->sprinklers, &obj, true)) + remove_obj = qlist_popat(dm->sprinklers, id, NULL); + if (remove_obj != NULL) { - sprinkler = obj.data; - if (sprinkler->device->id == id) - { - qlist_removeat(dm->sprinklers, position); - return 0; - } - position++; + sprinkler = remove_obj->data; + sprinkler_free(sprinkler); + return 0; } - + return -1; } @@ -423,6 +494,10 @@ int update_sprinkler(devices_manager_t *dm, uint16_t id, struct json_object *nod qlist_obj_t obj; sprinkler_t *sprinkler; + // Sanity Checks + if (dm == NULL) + return -1; + memset((void *)&obj, 0, sizeof(obj)); while (qlist_getnext(dm->sprinklers, &obj, false)) @@ -444,6 +519,10 @@ int set_sprinkler_state(devices_manager_t *dm, uint16_t id, bool state) qlist_obj_t obj; sprinkler_t *sprinkler; + // Sanity Checks + if (dm == NULL) + return -1; + memset((void *)&obj, 0, sizeof(obj)); while (qlist_getnext(dm->sprinklers, &obj, true)) @@ -466,6 +545,10 @@ sprinkler_t *get_sprinkler_by_id(devices_manager_t *dm, uint16_t id) qlist_obj_t obj; sprinkler_t *sprinkler; + // Sanity Checks + if (dm == NULL) + return NULL; + memset((void *)&obj, 0, sizeof(obj)); while (qlist_getnext(dm->sprinklers, &obj, false)) @@ -479,3 +562,28 @@ sprinkler_t *get_sprinkler_by_id(devices_manager_t *dm, uint16_t id) return NULL; } + +/*--------------------------------------------------------------------------*/ + +struct json_object *devices_manager_sprinkler_to_json_object(devices_manager_t *dm) +{ + struct json_object *root_node; + qlist_obj_t obj; + sprinkler_t *sprinkler; + + // Sanity Checks + if (dm == NULL) + return NULL; + + root_node = json_object_new_array(); + + memset((void *)&obj, 0, sizeof(obj)); + + while (qlist_getnext(dm->sprinklers, &obj, false)) + { + sprinkler = obj.data; + json_object_array_add(root_node, sprinkler_to_json_object(sprinkler)); + } + + return root_node; +} diff --git a/src/devices/devices_manager_internal.h b/src/devices/devices_manager_internal.h index c2cf479..48c98c9 100644 --- a/src/devices/devices_manager_internal.h +++ b/src/devices/devices_manager_internal.h @@ -63,5 +63,6 @@ extern int remove_sprinkler(devices_manager_t *dm, uint16_t id); extern int update_sprinkler(devices_manager_t *dm, uint16_t id, struct json_object *node); extern int set_sprinkler_state(devices_manager_t *dm, uint16_t id, bool state); extern sprinkler_t *get_sprinkler_by_id(devices_manager_t *dm, uint16_t id); +extern struct json_object *devices_manager_sprinkler_to_json_object(devices_manager_t *dm); #endif /* _DEVICES_MANAGER_INTERNAL_H */ diff --git a/src/tests/test_devices.c b/src/tests/test_devices.c index ae32c1c..b6a4f90 100644 --- a/src/tests/test_devices.c +++ b/src/tests/test_devices.c @@ -74,8 +74,58 @@ void device_create_set_state_free(const char *capability, const char *test_name_ /*--------------------------------------------------------------------------*/ -void device_create_three_devices_remove_second(const char *capability) +void device_create_three_devices_remove_second(const char *capability, const char *test_array) { + struct json_object *root_node; + devices_manager_t *dm; + int ret; + char *device_serialized; + + dm = devices_manager_new(); + ASSERT_NOT_NULL(dm); + + // Create a New Entry 1. + root_node = json_object_new_object(); + json_object_object_add(root_node, k_entry_name, json_object_new_string("test1")); + + ret = devices_manager_create(dm, capability, root_node); + /* Clean the json object. */ + json_object_put(root_node); + ASSERT_EQUAL_INT(ret, 0); + + // Create a New Entry 2. + root_node = json_object_new_object(); + json_object_object_add(root_node, k_entry_name, json_object_new_string("test2")); + + ret = devices_manager_create(dm, capability, root_node); + /* Clean the json object. */ + json_object_put(root_node); + ASSERT_EQUAL_INT(ret, 0); + + // Create a New Entry 3. + root_node = json_object_new_object(); + json_object_object_add(root_node, k_entry_name, json_object_new_string("test3")); + + ret = devices_manager_create(dm, capability, root_node); + /* Clean the json object. */ + json_object_put(root_node); + ASSERT_EQUAL_INT(ret, 0); + + // Remove ID 1. + root_node = json_object_new_object(); + json_object_object_add(root_node, k_entry_id, json_object_new_int(2)); + ret = devices_manager_delete(dm, capability, root_node); + json_object_put(root_node); + ASSERT_EQUAL_INT(ret, 0); + + device_serialized = devices_manager_get(dm, capability); + // printf ("device: %s\n", device_serialized); + ASSERT_EQUAL_STR(device_serialized, test_array); + free(device_serialized); + + // Free the Object. + devices_manager_free(dm); + } diff --git a/src/tests/test_sprinkler.c b/src/tests/test_sprinkler.c index 6b1b1e0..0a95be3 100644 --- a/src/tests/test_sprinkler.c +++ b/src/tests/test_sprinkler.c @@ -29,6 +29,7 @@ #define kSprinklerTestNameTrue "{ \"id\": 1, \"name\": \"test_name\", \"state\": true }" #define kSprinklerTestNameFalse "{ \"id\": 1, \"name\": \"test_name\", \"state\": false }" +#define kSprinklerTestRemove "[ { \"id\": 1, \"name\": \"test1\", \"state\": false }, { \"id\": 3, \"name\": \"test3\", \"state\": false } ]" /*--------------------------------------------------------------------------*/ @@ -39,9 +40,9 @@ TEST("Sprinkler - create set_state free\t") /*--------------------------------------------------------------------------*/ -TEST("Sprinkler - create 3 devices and remove second\t") +TEST("Sprinkler - create 3 device remove 2\t") { - device_create_three_devices_remove_second(kSprinklerEntry); + device_create_three_devices_remove_second(kSprinklerEntry, kSprinklerTestRemove); } /*--------------------------------------------------------------------------*/