diff options
Diffstat (limited to 'src/user-awareness-users.c')
-rw-r--r-- | src/user-awareness-users.c | 892 |
1 files changed, 763 insertions, 129 deletions
diff --git a/src/user-awareness-users.c b/src/user-awareness-users.c index 2e45115..c6f6669 100644 --- a/src/user-awareness-users.c +++ b/src/user-awareness-users.c @@ -32,10 +32,493 @@ static GSList *ua_devices_list; static GSList *ua_users_db_list; static GSList *ua_devices_db_list; -ua_user_h _ua_user_add_to_list(ua_user_info_t *user) +void _ua_free_ua_device_info_t(ua_dev_info_t *device) { FUNC_ENTRY; + ret_if(NULL == device); + + if (device->mac) + g_free(device->mac); + + if (device->bssid) + g_free(device->bssid); + + if (device->ipv4) + g_free(device->ipv4); + + if (device->ipv6) + g_free(device->ipv6); + + if (device->mobile_id) + g_free(device->mobile_id); + + g_free(device); + + FUNC_EXIT; +} + +void _ua_free_ua_user_info_t(ua_user_info_t *user) +{ + FUNC_ENTRY; + + ret_if(NULL == user); + + if (user->account) + g_free(user->account); + + if (user->name) + g_free(user->name); + + g_free(user); + + FUNC_EXIT; +} + +int _ua_add_user_info_to_local_db(ua_user_info_t* user_info) +{ + FUNC_ENTRY; + UA_VALIDATE_INPUT_PARAMETER(user_info); + ua_users_db_list = g_slist_append(ua_users_db_list, user_info); + + return UA_ERROR_NONE; + FUNC_EXIT; +} + +int _ua_mark_user_info_state_db(char* account, int state) +{ + FUNC_ENTRY; + GSList *l; + ua_user_info_t *u; + UA_VALIDATE_INPUT_PARAMETER(account); + + for (l = ua_users_list; l; l = g_slist_next(l)) { + u = (ua_user_info_t *)l->data; + + if (!g_strcmp0(account, u->account)) { + UA_INFO("User found [%s]", u->account); + u->state = state; + break; + } + } + + return UA_ERROR_NONE; + FUNC_EXIT; +} + +bool _ua_check_all_users_absence() +{ + FUNC_ENTRY; + GSList *l; + ua_user_info_t *u; + + for (l = ua_users_list; l; l = g_slist_next(l)) { + u = (ua_user_info_t *)l->data; + + if (u->state == UA_PRESENCE_STATE_ACTIVATE) { + UA_INFO("User found [%s]", u->account); + return false; + } + } + + return true; +} + +int _ua_remove_user_info_from_local_db(ua_user_info_t* user_info) +{ + FUNC_ENTRY; + UA_VALIDATE_INPUT_PARAMETER(user_info); + ua_users_db_list = g_slist_remove(ua_users_db_list, user_info); + _ua_free_ua_user_info_t(user_info); + + return UA_ERROR_NONE; + FUNC_EXIT; +} + +int _ua_is_user_exist(char* account, gboolean* is_exist) +{ + GSList *l; + UA_VALIDATE_INPUT_PARAMETER(account); + ua_user_info_t *user_info; + *is_exist = false; + + for (l = ua_users_list; l; l = g_slist_next(l)) { + user_info = (ua_user_info_t *)l->data; + + if (!g_strcmp0(account, user_info->account)) { + UA_INFO("User found [%s]", user_info->account); + *is_exist = true; + } + } + + return UA_ERROR_NONE; +} + +int _ua_is_device_exist(char* mobile_id, char* mac, ua_mac_type_e type, gboolean* is_exist) +{ + GSList *l; + UA_VALIDATE_INPUT_PARAMETER(is_exist); + ua_dev_info_t *dev; + *is_exist = false; + + for (l = ua_devices_list; l; l = g_slist_next(l)) { + dev = (ua_dev_info_t *)l->data; + + if ((int)type == (int)dev->type) { + if (mobile_id && !g_strcmp0(mobile_id, dev->mobile_id)) { + UA_INFO("Device found, mobile id[%s]", dev->mobile_id); + *is_exist = true; + } + + if (mac && !g_strcmp0(mac, dev->mac)) { + UA_INFO("Device found, mac address[%s]", dev->mac); + *is_exist = true; + } + } + } + + return UA_ERROR_NONE; +} + +int _ua_add_user_info_to_list_from_uapi_data(uam_user_info_t* uam_info) +{ + FUNC_ENTRY; + ua_user_info_t* user_info; + gboolean status = false; + UA_VALIDATE_INPUT_PARAMETER(uam_info); + int ret; + + ret = _ua_is_user_exist(uam_info->account, &status); + if (ret == UA_ERROR_NONE) { + if (status) + return UA_ERROR_ALREADY_DONE; + } else + return ret; + + user_info = g_malloc0(sizeof(ua_user_info_t)); + + if (!user_info) { + UA_ERR("g_malloc0 failed"); + return UA_ERROR_OUT_OF_MEMORY; + } + + user_info->account = strndup(uam_info->account, UAM_USER_ACCOUNT_MAX_STRING_SIZE); + + if (user_info->account == NULL) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_user_info_t(user_info); + return UA_ERROR_OUT_OF_MEMORY; + } + + user_info->name = strndup(uam_info->name, UAM_USER_NAME_MAX_STRING_SIZE); + + if (user_info->name == NULL) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_user_info_t(user_info); + return UA_ERROR_OUT_OF_MEMORY; + } + + user_info->isadded = true; + user_info->user_handle = (ua_user_h)user_info; + + /* Set user state by default INACTIVATE as this field will be use + * during absence detection where by default all users and in INACTIVATE state + * user will go in ACTIVATE state after presence is detected for thst user. + */ + user_info->state = UA_PRESENCE_STATE_INACTIVATE; + ua_users_list = g_slist_append(ua_users_list, user_info); + + return UA_ERROR_NONE; + FUNC_EXIT; +} + +int _ua_add_user_info_to_list(ua_user_info_t* ua_info) +{ + FUNC_ENTRY; + ua_user_info_t* user_info; + gboolean status = false; + UA_VALIDATE_INPUT_PARAMETER(ua_info); + int ret; + + ret = _ua_is_user_exist(ua_info->account, &status); + if (ret == UA_ERROR_NONE) { + if (status) + return UA_ERROR_ALREADY_DONE; + } else + return ret; + + user_info = g_malloc0(sizeof(ua_user_info_t)); + + if (!user_info) { + UA_ERR("g_malloc0 failed"); + return UA_ERROR_OUT_OF_MEMORY; + } + + user_info->account = strndup(ua_info->account, UAM_USER_ACCOUNT_MAX_STRING_SIZE); + + if (user_info->account == NULL) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_user_info_t(user_info); + return UA_ERROR_OUT_OF_MEMORY; + } + + user_info->name = strndup(ua_info->name, UAM_USER_NAME_MAX_STRING_SIZE); + + if (user_info->name == NULL) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_user_info_t(user_info); + return UA_ERROR_OUT_OF_MEMORY; + } + + user_info->isadded = true; + user_info->user_handle = (ua_user_h)user_info; + + /* Set user state by default INACTIVATE as this field will be use + * during absence detection where by default all users and in INACTIVATE state + * user will go in ACTIVATE state after presence is detected for thst user. + */ + user_info->state = UA_PRESENCE_STATE_INACTIVATE; + ua_users_list = g_slist_append(ua_users_list, user_info); + + return UA_ERROR_NONE; + FUNC_EXIT; +} + +int _ua_remove_user_info_from_list(char* account) +{ + FUNC_ENTRY; + GSList *l; + GSList *m; + ua_user_info_t *u; + ua_dev_info_t *dev; + UA_VALIDATE_INPUT_PARAMETER(account); + + + for (l = ua_users_list; l; l = g_slist_next(l)) { + u = (ua_user_info_t *)l->data; + + if (!g_strcmp0(account, u->account)) { + if (u->create_by_app == false) { + UA_INFO("User found [%s]", u->account); + + for (m = ua_devices_list; m; m = g_slist_next(l)) { + dev = (ua_dev_info_t *)m->data; + if (u == dev->user) { + dev->user = NULL; + break; + } + } + + ua_users_list = g_slist_remove(ua_users_list, u); + _ua_free_ua_user_info_t(u); + break; + } else { + UA_INFO("User created by APP"); + u->isadded = false; + } + } + } + + return UA_ERROR_NONE; + FUNC_EXIT; +} + +int _ua_add_device_info_to_list(uam_device_info_t* uam_info) +{ + FUNC_ENTRY; + GSList *l; + ua_dev_info_t* dev; + UA_VALIDATE_INPUT_PARAMETER(uam_info); + + for (l = ua_devices_list; l; l = g_slist_next(l)) { + dev = (ua_dev_info_t *)l->data; + + if ((int)uam_info->type == (int)dev->type) { + if (!g_strcmp0(uam_info->device_id, dev->mobile_id)) { + UA_INFO("Device found, mobile id[%s]", dev->mobile_id); + return UA_ERROR_ALREADY_DONE; + } + + if (!g_strcmp0(uam_info->mac, dev->mac)) { + UA_INFO("Device found, mac address[%s]", dev->mac); + return UA_ERROR_ALREADY_DONE; + } + } + } + + dev = g_malloc0(sizeof(ua_dev_info_t)); + if (!dev) { + UA_ERR("g_malloc0 failed"); + return UA_ERROR_OUT_OF_MEMORY; + } + dev->user = NULL; + dev->bssid = NULL; + dev->ipv6 = NULL; + + dev->mac = strndup(uam_info->mac, UA_MAC_ADDRESS_STRING_SIZE); + if (dev->mac == NULL) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_device_info_t(dev); + return UA_ERROR_OUT_OF_MEMORY; + } + + dev->ipv4 = strndup(uam_info->ipv4_addr, UA_IPV4_ADDRESS_STRING_SIZE); + if (dev->ipv4 == NULL) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_device_info_t(dev); + return UA_ERROR_OUT_OF_MEMORY; + } + + dev->mobile_id = strndup(uam_info->device_id, UA_MOBILE_ID_STRING_SIZE); + if (dev->mobile_id == NULL) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_device_info_t(dev); + return UA_ERROR_OUT_OF_MEMORY; + } + dev->type = uam_info->type;; + dev->pairing_required = FALSE; + dev->os = uam_info->operating_system; + dev->isadded = true; + + /* Add device to list of devices */ + dev->handle = (ua_device_h)dev; + ua_devices_list = g_slist_append(ua_devices_list, dev); + + return UA_ERROR_NONE; + FUNC_EXIT; +} + +int _ua_remove_device_info_from_list(uam_device_info_t* uam_info) +{ + FUNC_ENTRY; + GSList *l; + ua_dev_info_t *u; + UA_VALIDATE_INPUT_PARAMETER(uam_info); + + + for (l = ua_devices_list; l; l = g_slist_next(l)) { + u = (ua_dev_info_t *)l->data; + + if ((int)uam_info->type == (int)u->type) { + if (!g_strcmp0(uam_info->device_id, u->mobile_id)) { + if (u->create_by_app == false) { + UA_INFO("Device found, mobile id[%s]", u->mobile_id); + ua_devices_list = g_slist_remove(ua_devices_list, u); + _ua_free_ua_device_info_t(u); + break; + } else { + UA_INFO("Device created by APP"); + u->isadded = false; + } + } + + if (!g_strcmp0(uam_info->mac, u->mac)) { + if (u->create_by_app == false) { + UA_INFO("Device found, mac address[%s]", u->mac); + ua_devices_list = g_slist_remove(ua_devices_list, u); + _ua_free_ua_device_info_t(u); + break; + } else { + UA_INFO("Device created by APP"); + u->isadded = false; + } + } + } + } + return UA_ERROR_NONE; + FUNC_EXIT; +} + +ua_user_h _ua_make_user_handle_from_uapi_data(uam_user_info_t *ptr) +{ + ua_user_info_t *user_info; + user_info = g_malloc0(sizeof(ua_user_info_t)); + + if (!user_info) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_user_info_t(user_info); + return NULL; + } + + user_info->account = strndup(ptr->account, UAM_USER_ACCOUNT_MAX_STRING_SIZE); + + if (user_info->account == NULL) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_user_info_t(user_info); + return NULL; + } + + user_info->name = strndup(ptr->name, UAM_USER_NAME_MAX_STRING_SIZE); + + if (user_info->name == NULL) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_user_info_t(user_info); + return NULL; + } + + user_info->isadded = true; + user_info->user_handle = (ua_user_h)user_info; + user_info->state = ptr->presence_state; + ua_users_db_list = g_slist_append(ua_users_db_list, user_info); + + return (user_info->user_handle); +} + +ua_user_h _ua_make_user_handle_from_local_data(ua_user_info_t *ptr) +{ + ua_user_info_t *user_info; + user_info = g_malloc0(sizeof(ua_user_info_t)); + + if (!user_info) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_user_info_t(user_info); + return NULL; + } + + user_info->account = strndup(ptr->account, UAM_USER_ACCOUNT_MAX_STRING_SIZE); + + if (user_info->account == NULL) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_user_info_t(user_info); + return NULL; + } + + user_info->name = strndup(ptr->name, UAM_USER_NAME_MAX_STRING_SIZE); + + if (user_info->name == NULL) { + UA_ERR("g_malloc0 failed"); + _ua_free_ua_user_info_t(user_info); + return NULL; + } + + user_info->isadded = true; + user_info->user_handle = (ua_user_h)user_info; + user_info->state = ptr->state; + ua_users_db_list = g_slist_append(ua_users_db_list, user_info); + + return (user_info->user_handle); +} + +ua_user_h _ua_get_user_handle_by_account(char* account) +{ + FUNC_ENTRY; + GSList *l; + ua_user_info_t *u; + + if (account == NULL) { + UA_INFO("Account is NULL"); + return NULL; + } + + for (l = ua_users_list; l; l = g_slist_next(l)) { + u = (ua_user_info_t *)l->data; + + if (!g_strcmp0(account, u->account)) { + UA_INFO("User found [%s]", u->account); + return (u->user_handle); + } + } + FUNC_EXIT; return NULL; } @@ -46,9 +529,18 @@ int ua_create_user(const char* account, ua_user_h *user_handle) int ret; ua_user_info_t *user = NULL; uam_user_info_t uam_user; + gboolean status = false; UA_VALIDATE_INPUT_PARAMETER(user_handle); UA_VALIDATE_INPUT_PARAMETER(account); + UA_INITIALIZE(); + + ret = _ua_is_user_exist((char *)account, &status); + if (ret == UA_ERROR_NONE) { + if (status) + return UA_ERROR_ALREADY_DONE; + } else + return ret; user = g_malloc0(sizeof(ua_user_info_t)); if (!user) { @@ -66,7 +558,10 @@ int ua_create_user(const char* account, ua_user_h *user_handle) g_strlcpy(user->account, account, UAM_USER_ACCOUNT_MAX_STRING_SIZE); - UA_INITIALIZE(); + /* TODO : We can remove this call(_uam_request_get_user_by_account) as all users + * list are updated in foreach during init and during add_user and remove_user + * events from us daemon + */ ret = _ua_get_error_code(_uam_request_get_user_by_account(user->account, &uam_user)); @@ -84,6 +579,7 @@ int ua_create_user(const char* account, ua_user_h *user_handle) /* Add monitor to list of monitors */ *user_handle = (ua_user_h)user; user->user_handle = (ua_user_h)user; + user->create_by_app = true; ua_users_list = g_slist_append(ua_users_list, user); FUNC_EXIT; @@ -99,11 +595,10 @@ int ua_add_user(ua_user_h user_handle) UA_VALIDATE_INPUT_PARAMETER(user_handle); UA_VALIDATE_HANDLE(user_handle, ua_users_list); + UA_INITIALIZE(); retv_if(NULL == user->account, UA_ERROR_INVALID_PARAMETER); - UA_INITIALIZE(); - memset(&uam_user, 0, sizeof(uam_user_info_t)); g_strlcpy(uam_user.account, user->account, UAM_USER_ACCOUNT_MAX_STRING_SIZE); @@ -118,7 +613,6 @@ int ua_add_user(ua_user_h user_handle) } user->isadded = true; - FUNC_EXIT; return UA_ERROR_NONE; } @@ -158,9 +652,20 @@ int ua_get_default_user(ua_user_h* user_handle) int ret; uam_user_info_t uam_user; ua_user_info_t *user = NULL; + GSList *l; UA_VALIDATE_INPUT_PARAMETER(user_handle); + for (l = ua_users_list; l; l = g_slist_next(l)) { + user = (ua_user_info_t *)l->data; + + if (user->default_user == true) { + UA_INFO("User found [%s]", user->account); + *user_handle = (ua_user_h)user; + return UA_ERROR_NONE; + } + } + UA_INITIALIZE(); ret = _ua_get_error_code(_uam_get_default_user(&uam_user)); @@ -186,6 +691,9 @@ int ua_get_default_user(ua_user_h* user_handle) user->user_handle = (ua_user_h)user; *user_handle = (ua_user_h)user; + user->default_user = true; + user->isadded = true; + ua_users_list = g_slist_append(ua_users_list, user); FUNC_EXIT; return UA_ERROR_NONE; } @@ -200,6 +708,7 @@ int ua_user_get_account( UA_VALIDATE_INPUT_PARAMETER(user_handle); UA_VALIDATE_HANDLE(user_handle, ua_users_list); UA_VALIDATE_INPUT_PARAMETER(account); + UA_INITIALIZE(); *account = strndup(user->account, UAM_USER_ACCOUNT_MAX_STRING_SIZE); @@ -222,6 +731,7 @@ int ua_user_get_name( UA_VALIDATE_INPUT_PARAMETER(user_handle); UA_VALIDATE_HANDLE(user_handle, ua_users_list); UA_VALIDATE_INPUT_PARAMETER(name); + UA_INITIALIZE(); retv_if(NULL == user->name, UA_ERROR_INVALID_PARAMETER); @@ -246,6 +756,7 @@ int ua_user_set_name( UA_VALIDATE_INPUT_PARAMETER(handle); UA_VALIDATE_INPUT_PARAMETER(name); UA_VALIDATE_HANDLE(handle, ua_users_list); + UA_INITIALIZE(); retv_if(user->isadded, UA_ERROR_INVALID_PARAMETER); retv_if((strlen(name) > UAM_USER_NAME_MAX_STRING_SIZE), UA_ERROR_INVALID_PARAMETER); @@ -263,61 +774,29 @@ int ua_user_set_name( return UA_ERROR_NONE; } -static void __ua_free_ua_device_info_t(ua_dev_info_t *device) -{ - FUNC_ENTRY; - - ret_if(NULL == device); - - if (device->mac) - g_free(device->mac); - - if (device->bssid) - g_free(device->bssid); - - if (device->ipv4) - g_free(device->ipv4); - - if (device->ipv6) - g_free(device->ipv6); - - if (device->mobile_id) - g_free(device->mobile_id); - - g_free(device); - - FUNC_EXIT; -} - -static void __ua_free_ua_user_info_t(ua_user_info_t *user) -{ - FUNC_ENTRY; - - ret_if(NULL == user); - - if (user->account) - g_free(user->account); - - if (user->name) - g_free(user->name); - - g_free(user); - - FUNC_EXIT; -} - int ua_destroy_user(ua_user_h user_handle) { FUNC_ENTRY; ua_user_info_t *user = (ua_user_info_t *)user_handle; + ua_dev_info_t* dev; + GSList *l; UA_VALIDATE_INPUT_PARAMETER(user_handle); UA_VALIDATE_HANDLE(user_handle, ua_users_list); + UA_INITIALIZE(); + + for (l = ua_devices_list; l; l = g_slist_next(l)) { + dev = (ua_dev_info_t *)l->data; + + if (dev->user == user_handle) { + UA_INFO("User found in device handle"); + dev->user = NULL; + } + } ua_users_list = g_slist_remove(ua_users_list, user); - __ua_free_ua_user_info_t(user); + _ua_free_ua_user_info_t(user); - //TODO mark NULL as user handle in device handle FUNC_EXIT; return UA_ERROR_NONE; } @@ -329,6 +808,7 @@ int ua_create_device(ua_mac_type_e mac_type, ua_device_h *device_handle) retv_if(mac_type, UA_MAC_TYPE_INVALID); UA_VALIDATE_INPUT_PARAMETER(device_handle); + UA_INITIALIZE(); device = g_malloc0(sizeof(ua_dev_info_t)); if (!device) { @@ -351,6 +831,7 @@ int ua_create_device(ua_mac_type_e mac_type, ua_device_h *device_handle) /* Add device to list of devices */ *device_handle = (ua_device_h)device; device->handle = *device_handle; + device->create_by_app = true; ua_devices_list = g_slist_append(ua_devices_list, device); FUNC_EXIT; @@ -364,9 +845,10 @@ int ua_destroy_device(ua_device_h device_handle) UA_VALIDATE_INPUT_PARAMETER(device_handle); UA_VALIDATE_HANDLE(device_handle, ua_devices_list); + UA_INITIALIZE(); ua_devices_list = g_slist_remove(ua_devices_list, device); - __ua_free_ua_device_info_t(device); + _ua_free_ua_device_info_t(device); FUNC_EXIT; return UA_ERROR_NONE; @@ -377,13 +859,28 @@ int ua_device_set_mac_address( const char* mac_address) { FUNC_ENTRY; + int ret; + gboolean status = false; ua_dev_info_t *device = (ua_dev_info_t *)handle; UA_VALIDATE_INPUT_PARAMETER(handle); UA_VALIDATE_INPUT_PARAMETER(mac_address); UA_VALIDATE_HANDLE(handle, ua_devices_list); + UA_INITIALIZE(); retv_if(device->isadded, UA_ERROR_INVALID_PARAMETER); + + /* This code will check if app try to add mac address which is already set for same + * or for some other device handle, Then it does not allow to set and restrict to make + * suplicate entry as mac address is suppose to same for one device. + */ + ret = _ua_is_device_exist(NULL, (char*)mac_address, device->type, &status); + if (ret == UA_ERROR_NONE) { + if (status) + return UA_ERROR_ALREADY_DONE; + } else + return ret; + retv_if((strlen(mac_address) != (UA_MAC_ADDRESS_STRING_SIZE -1)), UA_ERROR_INVALID_PARAMETER); device->mac = g_malloc0(UA_MAC_ADDRESS_STRING_SIZE); @@ -408,6 +905,7 @@ int ua_device_set_os_info( UA_VALIDATE_INPUT_PARAMETER(handle); UA_VALIDATE_HANDLE(handle, ua_devices_list); + UA_INITIALIZE(); retv_if(device->isadded, UA_ERROR_INVALID_PARAMETER); @@ -428,12 +926,26 @@ int ua_device_set_wifi_mobile_id( { FUNC_ENTRY; ua_dev_info_t *device = (ua_dev_info_t *)handle; + int ret; + gboolean status = false; UA_VALIDATE_INPUT_PARAMETER(handle); UA_VALIDATE_INPUT_PARAMETER(mobile_id); UA_VALIDATE_HANDLE(handle, ua_devices_list); + UA_INITIALIZE(); retv_if(device->isadded, UA_ERROR_INVALID_PARAMETER); + /* This code will check if app try to add mobile id which is already set for same + * or for some other device handle, Then it does not allow to set and restrict to make + * suplicate entry as mobile id is suppose to same for one device. + */ + ret = _ua_is_device_exist((char*)mobile_id, NULL, device->type, &status); + if (ret == UA_ERROR_NONE) { + if (status) + return UA_ERROR_ALREADY_DONE; + } else + return ret; + retv_if((strlen(mobile_id) != (UA_MOBILE_ID_STRING_SIZE -1)), UA_ERROR_INVALID_PARAMETER); device->mobile_id = g_malloc0(UA_MOBILE_ID_STRING_SIZE); @@ -459,6 +971,7 @@ int ua_device_set_wifi_bssid( UA_VALIDATE_INPUT_PARAMETER(handle); UA_VALIDATE_INPUT_PARAMETER(bssid); UA_VALIDATE_HANDLE(handle, ua_devices_list); + UA_INITIALIZE(); retv_if(device->isadded, UA_ERROR_INVALID_PARAMETER); retv_if((strlen(bssid) != (UA_MAC_ADDRESS_STRING_SIZE -1)), UA_ERROR_INVALID_PARAMETER); @@ -486,6 +999,7 @@ int ua_device_set_wifi_ipv4_address( UA_VALIDATE_INPUT_PARAMETER(handle); UA_VALIDATE_INPUT_PARAMETER(ipv4_address); UA_VALIDATE_HANDLE(handle, ua_devices_list); + UA_INITIALIZE(); retv_if(device->isadded, UA_ERROR_INVALID_PARAMETER); retv_if((strlen(ipv4_address) != (UA_IPV4_ADDRESS_STRING_SIZE -1)), UA_ERROR_INVALID_PARAMETER); @@ -503,16 +1017,6 @@ int ua_device_set_wifi_ipv4_address( return UA_ERROR_NONE; } -int ua_user_get_dev_info( - ua_user_h handle, - ua_dev_info_t *dev_info) -{ - FUNC_ENTRY; - - FUNC_EXIT; - return UA_ERROR_NONE; -} - int ua_device_get_mac_address( ua_device_h device_handle, char** mac_address) @@ -523,6 +1027,7 @@ int ua_device_get_mac_address( UA_VALIDATE_INPUT_PARAMETER(device_handle); UA_VALIDATE_HANDLE(device_handle, ua_devices_list); UA_VALIDATE_INPUT_PARAMETER(mac_address); + UA_INITIALIZE(); if (!device->mac) { *mac_address = NULL; @@ -541,6 +1046,24 @@ done: return UA_ERROR_NONE; } +int ua_device_get_os_info( + ua_device_h device_handle, + ua_os_type_e* os_info + ) +{ + FUNC_ENTRY; + ua_dev_info_t *device = (ua_dev_info_t *)device_handle; + + UA_VALIDATE_INPUT_PARAMETER(device_handle); + UA_VALIDATE_HANDLE(device_handle, ua_devices_list); + UA_VALIDATE_INPUT_PARAMETER(os_info); + UA_INITIALIZE(); + + *os_info = device->os; + FUNC_EXIT; + return UA_ERROR_NONE; +} + int ua_device_get_wifi_mobile_id( ua_device_h device_handle, char** mobile_id) @@ -551,6 +1074,7 @@ int ua_device_get_wifi_mobile_id( UA_VALIDATE_INPUT_PARAMETER(device_handle); UA_VALIDATE_HANDLE(device_handle, ua_devices_list); UA_VALIDATE_INPUT_PARAMETER(mobile_id); + UA_INITIALIZE(); if (!device->mobile_id) { *mobile_id = NULL; @@ -579,6 +1103,7 @@ int ua_device_get_wifi_bssid( UA_VALIDATE_INPUT_PARAMETER(device_handle); UA_VALIDATE_HANDLE(device_handle, ua_devices_list); UA_VALIDATE_INPUT_PARAMETER(bssid); + UA_INITIALIZE(); if (!device->bssid) { *bssid = NULL; @@ -607,6 +1132,7 @@ int ua_device_get_wifi_ipv4_address( UA_VALIDATE_INPUT_PARAMETER(device_handle); UA_VALIDATE_HANDLE(device_handle, ua_devices_list); UA_VALIDATE_INPUT_PARAMETER(ipv4_address); + UA_INITIALIZE(); if (!device->ipv4) { *ipv4_address = NULL; @@ -672,7 +1198,7 @@ int ua_device_get_handle_by_mac_address( if (dev->mac == NULL) { UA_ERR("g_malloc0 failed"); *device_handle = NULL; - __ua_free_ua_device_info_t(dev); + _ua_free_ua_device_info_t(dev); return UA_ERROR_OUT_OF_MEMORY; } @@ -681,7 +1207,7 @@ int ua_device_get_handle_by_mac_address( if (dev->ipv4 == NULL) { UA_ERR("g_malloc0 failed"); *device_handle = NULL; - __ua_free_ua_device_info_t(dev); + _ua_free_ua_device_info_t(dev); return UA_ERROR_OUT_OF_MEMORY; } @@ -690,7 +1216,7 @@ int ua_device_get_handle_by_mac_address( if (dev->mobile_id == NULL) { UA_ERR("g_malloc0 failed"); *device_handle = NULL; - __ua_free_ua_device_info_t(dev); + _ua_free_ua_device_info_t(dev); return UA_ERROR_OUT_OF_MEMORY; } dev->type = uam_dev.type;; @@ -727,7 +1253,7 @@ int ua_device_get_handle_by_mobile_id( for (l = ua_devices_list; l; l = g_slist_next(l)) { dev = (ua_dev_info_t *)l->data; - if (!g_strcmp0(mobile_id, dev->mobile_id)) { + if ((mac_type == dev->type) && !g_strcmp0(mobile_id, dev->mobile_id)) { UA_INFO("Mobile ID found [%s]", dev->mobile_id); *device_handle = (ua_device_h)dev; goto done; @@ -760,7 +1286,7 @@ int ua_device_get_handle_by_mobile_id( if (dev->mac == NULL) { UA_ERR("g_malloc0 failed"); *device_handle = NULL; - __ua_free_ua_device_info_t(dev); + _ua_free_ua_device_info_t(dev); return UA_ERROR_OUT_OF_MEMORY; } @@ -769,7 +1295,7 @@ int ua_device_get_handle_by_mobile_id( if (dev->ipv4 == NULL) { UA_ERR("g_malloc0 failed"); *device_handle = NULL; - __ua_free_ua_device_info_t(dev); + _ua_free_ua_device_info_t(dev); return UA_ERROR_OUT_OF_MEMORY; } @@ -778,7 +1304,7 @@ int ua_device_get_handle_by_mobile_id( if (dev->mobile_id == NULL) { UA_ERR("g_malloc0 failed"); *device_handle = NULL; - __ua_free_ua_device_info_t(dev); + _ua_free_ua_device_info_t(dev); return UA_ERROR_OUT_OF_MEMORY; } dev->type = uam_dev.type;; @@ -801,11 +1327,32 @@ int ua_foreach_registered_users( void *user_data) { FUNC_ENTRY; + GSList *l; + ua_user_info_t *u; + + UA_VALIDATE_INPUT_PARAMETER(foreach_cb); + UA_INITIALIZE(); + + for (l = ua_users_list; l; l = g_slist_next(l)) { + u = (ua_user_info_t *)l->data; + + if (!foreach_cb(u->user_handle, user_data)) + break; + } + + FUNC_EXIT; + return UA_ERROR_NONE; +} + +int _ua_foreach_registered_users( + ua_registered_user_cb foreach_cb, + void *user_data) +{ + FUNC_ENTRY; int i; int ret; GPtrArray *user_list = NULL; uam_user_info_t *ptr; - GSList *l; UA_VALIDATE_INPUT_PARAMETER(foreach_cb); UA_INITIALIZE(); @@ -830,7 +1377,7 @@ int ua_foreach_registered_users( if (!user_info) { UA_ERR("g_malloc0 failed"); ret = UA_ERROR_OUT_OF_MEMORY; - __ua_free_ua_user_info_t(user_info); + _ua_free_ua_user_info_t(user_info); goto done; } @@ -839,7 +1386,7 @@ int ua_foreach_registered_users( if (user_info->account == NULL) { UA_ERR("g_malloc0 failed"); ret = UA_ERROR_OUT_OF_MEMORY; - __ua_free_ua_user_info_t(user_info); + _ua_free_ua_user_info_t(user_info); goto done; } @@ -848,14 +1395,18 @@ int ua_foreach_registered_users( if (user_info->name == NULL) { UA_ERR("g_malloc0 failed"); ret = UA_ERROR_OUT_OF_MEMORY; - __ua_free_ua_user_info_t(user_info); + _ua_free_ua_user_info_t(user_info); goto done; } user_info->isadded = true; user_info->user_handle = (ua_user_h)user_info; user_info->state = ptr->presence_state; - ua_users_db_list = g_slist_append(ua_users_db_list, user_info); + if (!foreach_cb(user_info->user_handle, user_data)) { + _ua_free_ua_user_info_t(user_info); + break; + } else + _ua_free_ua_user_info_t(user_info); } else { UA_ERR("OPERATION_FAILED(0x%08x)", UA_ERROR_OPERATION_FAILED); @@ -864,27 +1415,7 @@ int ua_foreach_registered_users( } } - for (l = ua_users_db_list; l; l = g_slist_next(l)) { - ua_user_info_t *u = l->data; - - if (NULL == u) - continue; - - if (!foreach_cb(u->user_handle, user_data)) - break; - } - done: - for (l = ua_users_db_list; l; l = g_slist_next(l)) { - ua_user_info_t *u = l->data; - - if (NULL == u) - continue; - - ua_users_list = g_slist_remove(ua_users_db_list, u); - __ua_free_ua_user_info_t(u); - } - g_ptr_array_foreach(user_list, (GFunc)g_free, NULL); g_ptr_array_free(user_list, TRUE); @@ -902,6 +1433,8 @@ int ua_user_clone(ua_user_h *cloned, UA_VALIDATE_INPUT_PARAMETER(cloned); UA_VALIDATE_INPUT_PARAMETER(origin); UA_VALIDATE_HANDLE(origin, ua_users_db_list); + UA_EXIST_HANDLE(origin, ua_users_list); + UA_INITIALIZE(); user = g_malloc0(sizeof(ua_user_info_t)); @@ -915,7 +1448,7 @@ int ua_user_clone(ua_user_h *cloned, if (user->account == NULL) { UA_ERR("g_malloc0 failed"); - __ua_free_ua_user_info_t(user); + _ua_free_ua_user_info_t(user); return UA_ERROR_OUT_OF_MEMORY; } @@ -923,7 +1456,7 @@ int ua_user_clone(ua_user_h *cloned, if (user->name == NULL) { UA_ERR("g_malloc0 failed"); - __ua_free_ua_user_info_t(user); + _ua_free_ua_user_info_t(user); return UA_ERROR_OUT_OF_MEMORY; } @@ -932,6 +1465,7 @@ int ua_user_clone(ua_user_h *cloned, /* Add user to list of users */ *cloned = (ua_user_h)user; user->user_handle = (ua_user_h)user; + user->create_by_app = true; ua_users_list = g_slist_append(ua_users_list, user); FUNC_EXIT; @@ -943,6 +1477,7 @@ int ua_device_clone(ua_device_h *cloned, { FUNC_ENTRY; int ret; + gboolean status = false; ua_dev_info_t *device = NULL; uam_user_info_t uam_user; ua_dev_info_t *org_device = (ua_dev_info_t *)origin; @@ -950,6 +1485,16 @@ int ua_device_clone(ua_device_h *cloned, UA_VALIDATE_INPUT_PARAMETER(cloned); UA_VALIDATE_INPUT_PARAMETER(origin); UA_VALIDATE_HANDLE(origin, ua_devices_db_list); + UA_EXIST_HANDLE(origin, ua_devices_list); + + ret = _ua_is_device_exist(org_device->mobile_id, org_device->mac, org_device->type, &status); + if (ret == UA_ERROR_NONE) { + if (status) + return UA_ERROR_ALREADY_DONE; + } else + return ret; + + UA_INITIALIZE(); device = g_malloc0(sizeof(ua_dev_info_t)); if (!device) { @@ -960,21 +1505,21 @@ int ua_device_clone(ua_device_h *cloned, device->mac = strndup(org_device->mac, UA_MAC_ADDRESS_STRING_SIZE); if (device->mac == NULL) { UA_ERR("g_malloc0 failed"); - __ua_free_ua_device_info_t(device); + _ua_free_ua_device_info_t(device); return UA_ERROR_OUT_OF_MEMORY; } device->ipv4 = strndup(org_device->ipv4, UA_IPV4_ADDRESS_STRING_SIZE); if (device->ipv4 == NULL) { UA_ERR("g_malloc0 failed"); - __ua_free_ua_device_info_t(device); + _ua_free_ua_device_info_t(device); return UA_ERROR_OUT_OF_MEMORY; } device->mobile_id = strndup(org_device->mobile_id, UA_MOBILE_ID_STRING_SIZE); if (device->mobile_id == NULL) { UA_ERR("g_malloc0 failed"); - __ua_free_ua_device_info_t(device); + _ua_free_ua_device_info_t(device); return UA_ERROR_OUT_OF_MEMORY; } @@ -984,32 +1529,33 @@ int ua_device_clone(ua_device_h *cloned, if (!device->user) { UA_INITIALIZE(); + /* Currently user info will be create and store at this point */ ret = _ua_get_error_code(_uam_request_get_user_by_deviceid(device->mobile_id, &uam_user)); if (UA_ERROR_NONE != ret) { UA_ERR("Failed with error: %s(0x%X)", _ua_get_error_string(ret), ret); - __ua_free_ua_device_info_t(device); + _ua_free_ua_device_info_t(device); return ret; } else { ua_user_info_t* user = g_malloc0(sizeof(ua_user_info_t)); if (!user) { UA_ERR("g_malloc0 failed"); - __ua_free_ua_device_info_t(device); + _ua_free_ua_device_info_t(device); return UA_ERROR_OUT_OF_MEMORY; } else { user->account = strndup(uam_user.account, UAM_USER_ACCOUNT_MAX_STRING_SIZE); if (user->account == NULL) { UA_ERR("g_malloc0 failed"); - __ua_free_ua_device_info_t(device); - __ua_free_ua_user_info_t(user); + _ua_free_ua_device_info_t(device); + _ua_free_ua_user_info_t(user); return UA_ERROR_OUT_OF_MEMORY; } user->name = strndup(uam_user.name, UAM_USER_NAME_MAX_STRING_SIZE); if (user->name == NULL) { UA_ERR("g_malloc0 failed"); - __ua_free_ua_device_info_t(device); - __ua_free_ua_user_info_t(user); + _ua_free_ua_device_info_t(device); + _ua_free_ua_user_info_t(user); return UA_ERROR_OUT_OF_MEMORY; } @@ -1026,6 +1572,7 @@ int ua_device_clone(ua_device_h *cloned, /* Add user to list of users */ *cloned = (ua_device_h)device; device->handle = (ua_device_h)device; + device->create_by_app = true; ua_devices_list = g_slist_append(ua_devices_list, device); FUNC_EXIT; @@ -1037,15 +1584,16 @@ int ua_user_add_device(ua_user_h user_handle, ua_device_h device_handle) FUNC_ENTRY; int ret; ua_user_h handle = NULL; + ua_user_h temp_handle = NULL; ua_dev_info_t *device = (ua_dev_info_t *) device_handle; - uam_user_info_t uam_user; ua_user_info_t* user = NULL; uam_device_info_t uam_device; UA_VALIDATE_INPUT_PARAMETER(device_handle); UA_VALIDATE_HANDLE(device_handle, ua_devices_list); - retv_if(device->mobile_id, UA_ERROR_INVALID_PARAMETER); + retv_if((((device->mobile_id == NULL) && (device->mac == NULL)) || (UA_MAC_TYPE_INVALID == device->type)), UA_ERROR_INVALID_PARAMETER); + temp_handle = device->user; if (user_handle == NULL) { ret = ua_get_default_user(&handle); if (ret != UA_ERROR_NONE) { @@ -1061,11 +1609,6 @@ int ua_user_add_device(ua_user_h user_handle, ua_device_h device_handle) user = (ua_user_info_t *)device->user; memset(&uam_device, 0, sizeof(uam_device_info_t)); - memset(&uam_user, 0, sizeof(uam_user_info_t)); - g_strlcpy(uam_user.account, user->account, UAM_USER_ACCOUNT_MAX_STRING_SIZE); - - if (user->name) - g_strlcpy(uam_user.name, user->name, UAM_USER_NAME_MAX_STRING_SIZE); uam_device.operating_system = device->os; uam_device.type = device->type; @@ -1080,11 +1623,12 @@ int ua_user_add_device(ua_user_h user_handle, ua_device_h device_handle) UA_INITIALIZE(); - ret = _ua_get_error_code(_uam_request_add_device(&uam_user, &uam_device)); + ret = _ua_get_error_code(_uam_request_add_device(user->account, &uam_device)); if (UA_ERROR_NONE != ret) { UA_ERR("Failed with error: %s(0x%X)", _ua_get_error_string(ret), ret); + device->user = temp_handle; return ret; } @@ -1104,7 +1648,7 @@ int ua_user_remove_device(ua_user_h user_handle, ua_device_h device_handle) UA_VALIDATE_INPUT_PARAMETER(device_handle); UA_VALIDATE_HANDLE(device_handle, ua_devices_list); - retv_if(device->mobile_id, UA_ERROR_INVALID_PARAMETER); + retv_if((((device->mobile_id == NULL) && (device->mac == NULL)) || (UA_MAC_TYPE_INVALID == device->type)), UA_ERROR_INVALID_PARAMETER); if (user_handle == NULL) { ret = ua_get_default_user(&handle); @@ -1157,6 +1701,7 @@ int ua_remove_device_by_address(const char* mac) int found = 0; UA_VALIDATE_INPUT_PARAMETER(mac); + UA_INITIALIZE(); for (l = ua_devices_list; l; l = g_slist_next(l)) { device = (ua_dev_info_t *)l->data; @@ -1169,8 +1714,6 @@ int ua_remove_device_by_address(const char* mac) } if (found) { - UA_INITIALIZE(); - ret = _ua_get_error_code(_uam_request_remove_device_by_mac(mac)); if (UA_ERROR_NONE != ret) { @@ -1196,6 +1739,7 @@ int ua_remove_device_by_mobile_id(const char* mobile_id, ua_mac_type_e mac_type) int found = 0; UA_VALIDATE_INPUT_PARAMETER(mobile_id); + UA_INITIALIZE(); retv_if(mac_type, UA_MAC_TYPE_INVALID); for (l = ua_devices_list; l; l = g_slist_next(l)) { @@ -1209,8 +1753,6 @@ int ua_remove_device_by_mobile_id(const char* mobile_id, ua_mac_type_e mac_type) } if (found) { - UA_INITIALIZE(); - ret = _ua_get_error_code(_uam_request_remove_device_by_deviceid(mobile_id, mac_type)); if (UA_ERROR_NONE != ret) { @@ -1266,7 +1808,7 @@ int ua_foreach_all_registered_dev_info( device_info->mac = strndup(ptr->mac, UA_MAC_ADDRESS_STRING_SIZE); if (device_info->mac == NULL) { UA_ERR("g_malloc0 failed"); - __ua_free_ua_device_info_t(device_info); + _ua_free_ua_device_info_t(device_info); ret = UA_ERROR_OUT_OF_MEMORY; goto done; } @@ -1274,7 +1816,7 @@ int ua_foreach_all_registered_dev_info( device_info->ipv4 = strndup(ptr->ipv4_addr, UA_IPV4_ADDRESS_STRING_SIZE); if (device_info->ipv4 == NULL) { UA_ERR("g_malloc0 failed"); - __ua_free_ua_device_info_t(device_info); + _ua_free_ua_device_info_t(device_info); ret = UA_ERROR_OUT_OF_MEMORY; goto done; } @@ -1283,7 +1825,7 @@ int ua_foreach_all_registered_dev_info( if (device_info->mobile_id == NULL) { UA_ERR("g_malloc0 failed"); ret = UA_ERROR_OUT_OF_MEMORY; - __ua_free_ua_device_info_t(device_info); + _ua_free_ua_device_info_t(device_info); goto done; } @@ -1317,8 +1859,8 @@ done: if (NULL == u) continue; - ua_devices_list = g_slist_remove(ua_devices_db_list, u); - __ua_free_ua_device_info_t(u); + ua_devices_db_list = g_slist_remove(ua_devices_db_list, u); + _ua_free_ua_device_info_t(u); } g_ptr_array_foreach(devices_list, (GFunc)g_free, NULL); @@ -1372,7 +1914,7 @@ int ua_foreach_registered_dev_info_by_user( if (device_info->mac == NULL) { UA_ERR("g_malloc0 failed"); ret = UA_ERROR_OUT_OF_MEMORY; - __ua_free_ua_device_info_t(device_info); + _ua_free_ua_device_info_t(device_info); goto done; } @@ -1380,7 +1922,7 @@ int ua_foreach_registered_dev_info_by_user( if (device_info->ipv4 == NULL) { UA_ERR("g_malloc0 failed"); ret = UA_ERROR_OUT_OF_MEMORY; - __ua_free_ua_device_info_t(device_info); + _ua_free_ua_device_info_t(device_info); goto done; } @@ -1388,7 +1930,7 @@ int ua_foreach_registered_dev_info_by_user( if (device_info->mobile_id == NULL) { UA_ERR("g_malloc0 failed"); ret = UA_ERROR_OUT_OF_MEMORY; - __ua_free_ua_device_info_t(device_info); + _ua_free_ua_device_info_t(device_info); goto done; } @@ -1423,8 +1965,8 @@ done: if (NULL == u) continue; - ua_devices_list = g_slist_remove(ua_devices_db_list, u); - __ua_free_ua_device_info_t(u); + ua_devices_db_list = g_slist_remove(ua_devices_db_list, u); + _ua_free_ua_device_info_t(u); } g_ptr_array_foreach(devices_list, (GFunc)g_free, NULL); @@ -1434,12 +1976,104 @@ done: return ret; } -int ua_user_get_is_pairing_required( - ua_user_h handle, +int ua_device_get_pairing_required( + ua_device_h handle, bool *pairing_required) { FUNC_ENTRY; + int ret; + ua_dev_info_t *device = (ua_dev_info_t *)handle; + gboolean is_registered = FALSE; + uam_device_info_t uam_device; + + UA_VALIDATE_INPUT_PARAMETER(handle); + UA_VALIDATE_HANDLE(handle, ua_devices_list); + UA_VALIDATE_INPUT_PARAMETER(pairing_required); + retv_if((((device->mobile_id == NULL) && (device->mac == NULL)) || (UA_MAC_TYPE_INVALID == device->type)), UA_ERROR_INVALID_PARAMETER); + + memset(&uam_device, 0, sizeof(uam_device_info_t)); + + uam_device.operating_system = device->os; + uam_device.type = device->type; + + if (device->mac) + g_strlcpy(uam_device.mac, device->mac, UAM_MAC_ADDRESS_STRING_SIZE); + + if (device->mobile_id) + g_strlcpy(uam_device.device_id, device->mobile_id, UA_MOBILE_ID_STRING_SIZE); + + if (device->ipv4) + g_strlcpy(uam_device.ipv4_addr, device->ipv4, UA_IPV4_ADDRESS_STRING_SIZE); + + UA_INITIALIZE(); + + ret = _ua_get_error_code(_uam_is_device_registered(&uam_device, &is_registered)); + if (UA_ERROR_NONE != ret) { + UA_ERR("Failed with error: %s(0x%X)", + _ua_get_error_string(ret), ret); + return ret; + } + + *pairing_required = is_registered ? false : true; + + FUNC_EXIT; + return UA_ERROR_NONE; +} + +int _ua_intr_foreach_registered_users( + _ua_intr_registered_user_cb foreach_cb, + void *user_data) +{ + int ret; + UA_VALIDATE_INPUT_PARAMETER(foreach_cb); + + ret = _ua_foreach_registered_users(foreach_cb, user_data); + return ret; +} + +int _ua_intr_get_default_user() +{ + FUNC_ENTRY; + int ret; + uam_user_info_t uam_user; + ua_user_info_t *user = NULL; + GSList *l; + + ret = _ua_get_error_code(_uam_get_default_user(&uam_user)); + if (UA_ERROR_NONE != ret) { + UA_ERR("Failed with error: %s(0x%X)", + _ua_get_error_string(ret), ret); + return ret; + } + + for (l = ua_users_list; l; l = g_slist_next(l)) { + user = (ua_user_info_t *)l->data; + + if (!g_strcmp0(uam_user.account, user->account)) { + UA_INFO("User found [%s]", user->account); + user->default_user = true; + user->isadded = true; + return UA_ERROR_NONE; + } + } + + user = g_malloc0(sizeof(ua_user_info_t)); + + if (!user) { + UA_ERR("g_malloc0 failed"); + return UA_ERROR_OUT_OF_MEMORY; + } + + g_strlcpy(user->account, uam_user.account, UAM_USER_ACCOUNT_MAX_STRING_SIZE); + g_strlcpy(user->name, uam_user.name, UAM_USER_NAME_MAX_STRING_SIZE); + + user->state = uam_user.presence_state; + user->user_handle = (ua_user_h)user; + user->default_user = true; + user->isadded = true; + + ua_users_list = g_slist_append(ua_users_list, user); FUNC_EXIT; return UA_ERROR_NONE; } |