/** * @file identity_list.c * @brief implementation of identity list functions * @license GNU General Public License 3.0 - see LICENSE.txt */ #include "pEp_internal.h" #include #include #include "pEpEngine.h" #include "identity_list.h" DYNAMIC_API identity_list *new_identity_list(pEp_identity *ident) { identity_list *id_list = calloc(1, sizeof(identity_list)); assert(id_list); if (id_list == NULL) return NULL; id_list->ident = ident; return id_list; } DYNAMIC_API identity_list *identity_list_dup(const identity_list *src) { assert(src); if (src == NULL) return NULL; if (src->ident == NULL) return new_identity_list(NULL); pEp_identity *_ident = identity_dup(src->ident); if (_ident == NULL) return NULL; identity_list *id_list = new_identity_list(_ident); if (id_list == NULL) { free_identity(_ident); return NULL; } identity_list* src_curr = src->next; identity_list** dst_curr_ptr = &id_list->next; while (src_curr) { _ident = identity_dup(src_curr->ident); if (_ident == NULL) { free_identity_list(id_list); return NULL; } *dst_curr_ptr = new_identity_list(_ident); if (*dst_curr_ptr == NULL) { free_identity(_ident); free_identity_list(id_list); return NULL; } src_curr = src_curr->next; dst_curr_ptr = &((*dst_curr_ptr)->next); } return id_list; } DYNAMIC_API void free_identity_list(identity_list *id_list) { identity_list *curr = id_list; while (curr) { identity_list *next = curr->next; free_identity(curr->ident); free(curr); curr = next; } } DYNAMIC_API identity_list *identity_list_add(identity_list *id_list, pEp_identity *ident) { assert(ident); if (ident == NULL) return NULL; if (id_list == NULL) return new_identity_list(ident); // empty list if (id_list->ident == NULL) { if (id_list->next) return NULL; // invalid list id_list->ident = ident; if (id_list->ident == NULL) return NULL; return id_list; } identity_list* list_curr = id_list; while (list_curr->next) list_curr = list_curr->next; list_curr->next = new_identity_list(ident); return list_curr->next; } // returns *head* of list DYNAMIC_API identity_list* identity_list_join(identity_list *first_list, identity_list *second_list) { if (!first_list) { if (!second_list) return NULL; return second_list; } if (second_list) { identity_list* list_curr = first_list; while (list_curr->next) list_curr = list_curr->next; list_curr->next = second_list; } return first_list; } DYNAMIC_API int identity_list_length(const identity_list *id_list) { int len = 0; for (; id_list && id_list->ident; id_list = id_list->next) ++len; return len; } PEP_STATUS set_all_userids_in_list(identity_list* id_list, const char* user_id) { if (!user_id || user_id[0] == '\0') return PEP_ILLEGAL_VALUE; identity_list* curr_list = id_list; while (curr_list) { if (curr_list->ident) { free(curr_list->ident->user_id); curr_list->ident->user_id = NULL; char* dup_userid = strdup(user_id); if (dup_userid == NULL) return PEP_OUT_OF_MEMORY; curr_list->ident->user_id = dup_userid; } curr_list = curr_list->next; } return PEP_STATUS_OK; }