diff options
Diffstat (limited to 'common/ctsvc_list.c')
-rw-r--r-- | common/ctsvc_list.c | 424 |
1 files changed, 424 insertions, 0 deletions
diff --git a/common/ctsvc_list.c b/common/ctsvc_list.c new file mode 100644 index 0000000..3e4879a --- /dev/null +++ b/common/ctsvc_list.c @@ -0,0 +1,424 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Dohyung Jin <dh.jin@samsung.com> + * Jongwon Lee <gogosing.lee@samsung.com> + * Donghee Ye <donghee.ye@samsung.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include <glib.h> + +#include "contacts.h" +#include "ctsvc_internal.h" +#include "ctsvc_list.h" +#include "ctsvc_record.h" + +API int contacts_list_create( contacts_list_h* out_list ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == out_list, CONTACTS_ERROR_INVALID_PARAMETER); + *out_list = NULL; + + list_s = (ctsvc_list_s*)calloc(1, sizeof(ctsvc_list_s)); + RETVM_IF(NULL == list_s, CONTACTS_ERROR_OUT_OF_MEMORY, "Out of memory : calloc is failed"); + + list_s->l_type = -1; + *out_list = (contacts_list_h)list_s; + return CONTACTS_ERROR_NONE; +} + +API int contacts_list_get_count( contacts_list_h list, unsigned int *count ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == count, CONTACTS_ERROR_INVALID_PARAMETER); + *count = 0; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + *count = list_s->count; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_add_child( contacts_list_h list, contacts_record_h child_record ) +{ + ctsvc_list_s *s_list; + ctsvc_record_s *s_record; + bool is_first = false; + + RETV_IF(NULL == list || NULL == child_record, CONTACTS_ERROR_INVALID_PARAMETER); + s_list = (ctsvc_list_s *)list; + s_record = (ctsvc_record_s *)child_record; + + if (-1 == s_list->l_type) { + s_list->l_type = s_record->r_type; + is_first = true; + } + else if (s_list->l_type != s_record->r_type) + return CONTACTS_ERROR_INVALID_PARAMETER; + + s_list->records = g_list_append(s_list->records, child_record); + + if (s_list->count == 0) + s_list->cursor = s_list->records; + + s_list->count++; + return CONTACTS_ERROR_NONE; +} + +API int contacts_list_add( contacts_list_h list, contacts_record_h child_record ) +{ + ctsvc_list_s *s_list; + ctsvc_record_s *s_record; + bool is_first = false; + + RETV_IF(NULL == list || NULL == child_record, CONTACTS_ERROR_INVALID_PARAMETER); + s_list = (ctsvc_list_s *)list; + s_record = (ctsvc_record_s *)child_record; + + if (-1 == s_list->l_type) { + s_list->l_type = s_record->r_type; + is_first = true; + } + else if (s_list->l_type != s_record->r_type) + return CONTACTS_ERROR_INVALID_PARAMETER; + + s_list->records = g_list_append(s_list->records, child_record); + + if (s_list->count == 0) + s_list->cursor = s_list->records; + + s_list->count++; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_prepend( contacts_list_h list, contacts_record_h child_record ) +{ + ctsvc_list_s *s_list; + ctsvc_record_s *s_record; + bool is_first = false; + + RETV_IF(NULL == list || NULL == child_record, CONTACTS_ERROR_INVALID_PARAMETER); + s_list = (ctsvc_list_s *)list; + s_record = (ctsvc_record_s *)child_record; + + if (-1 == s_list->l_type) { + s_list->l_type = s_record->r_type; + is_first = true; + } + else if (s_list->l_type != s_record->r_type) + return CONTACTS_ERROR_INVALID_PARAMETER; + + s_list->records = g_list_prepend(s_list->records, child_record); + + if (s_list->count == 0) + s_list->cursor = s_list->records; + + s_list->count++; + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_reverse( contacts_list_h list) +{ + ctsvc_list_s *s_list; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + s_list = (ctsvc_list_s *)list; + + + if (s_list->count != 0) + s_list->records = g_list_reverse (s_list->records); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_remove_child( contacts_list_h list, contacts_record_h record, bool insert_delete_list ) +{ + GList *cursor = NULL; + ctsvc_list_s *s_list; + ctsvc_record_s *s_record; + contacts_record_h delete_record; + contacts_error_e err = CONTACTS_ERROR_NONE; + + RETV_IF(NULL == list || NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_list = (ctsvc_list_s *)list; + s_record = (ctsvc_record_s *)record; + + if (s_list->l_type != s_record->r_type) + return CONTACTS_ERROR_INVALID_PARAMETER; + + for (cursor=s_list->records;cursor;cursor=cursor->next) { + ctsvc_record_s *data = (ctsvc_record_s *)cursor->data; + if (data == s_record){ + s_list->count--; + if (s_list->cursor == cursor) + s_list->cursor = cursor->next; + + s_list->records = g_list_remove(s_list->records, s_record); + if (insert_delete_list) { + err = contacts_record_clone(record, &delete_record); + RETVM_IF(CONTACTS_ERROR_NONE != err, err,"contacts_record_clone() Failed(%d)", err); + s_list->deleted_records = g_list_append(s_list->deleted_records, delete_record); + } + return CONTACTS_ERROR_NONE; + } + } + + return CONTACTS_ERROR_NO_DATA; +} + +API int contacts_list_remove( contacts_list_h list, contacts_record_h record ) +{ + GList *cursor = NULL; + ctsvc_list_s *s_list; + ctsvc_record_s *s_record; + + RETV_IF(NULL == list || NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + s_list = (ctsvc_list_s *)list; + s_record = (ctsvc_record_s *)record; + + if (s_list->l_type != s_record->r_type) + return CONTACTS_ERROR_INVALID_PARAMETER; + + for (cursor=s_list->records;cursor;cursor=cursor->next) { + ctsvc_record_s *data = (ctsvc_record_s *)cursor->data; + if (data == s_record){ + s_list->count--; + if (s_list->cursor == cursor) + s_list->cursor = cursor->next; + s_list->records = g_list_remove(s_list->records, s_record); + return CONTACTS_ERROR_NONE; + } + } + + return CONTACTS_ERROR_NO_DATA; +} + +API int contacts_list_get_current_record_p( contacts_list_h list, contacts_record_h* record ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + *record = NULL; + + RETV_IF(NULL == list || NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + if (NULL == list_s->cursor) { + *record = NULL; + return CONTACTS_ERROR_NO_DATA; + } + + *record = list_s->cursor->data; + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_get_nth_record_p( contacts_list_h list, int index, contacts_record_h* record ) +{ + GList *cursor = NULL; + ctsvc_list_s *list_s; + ctsvc_record_s *data; + int i, j; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + *record = NULL; + + RETV_IF(NULL == list || NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + for (i=0,j=0,cursor=list_s->records;cursor;cursor=cursor->next, i++) { + data = (ctsvc_record_s *)cursor->data; + if (j == index) { + *record = (contacts_record_h)cursor->data; + return CONTACTS_ERROR_NONE; + } + j++; + } + *record = NULL; + return CONTACTS_ERROR_NO_DATA; +} + +static int __ctsvc_list_move_cursor( contacts_list_h list, bool next ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + if (NULL == list_s->cursor) + return CONTACTS_ERROR_NO_DATA; + + list_s->cursor = next ? list_s->cursor->next : list_s->cursor->prev ; + + if (NULL == list_s->cursor) + return CONTACTS_ERROR_NO_DATA; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_list_prev( contacts_list_h list ) +{ + return __ctsvc_list_move_cursor(list, false); +} + +API int contacts_list_next( contacts_list_h list ) +{ + return __ctsvc_list_move_cursor(list, true); +} + + + +API int contacts_list_first( contacts_list_h list ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + list_s->cursor = list_s->records; + if (NULL == list_s->cursor) + return CONTACTS_ERROR_NO_DATA; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_list_last( contacts_list_h list ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + list_s->cursor = g_list_last(list_s->records); + if (NULL == list_s->cursor) + return CONTACTS_ERROR_NO_DATA; + + return CONTACTS_ERROR_NONE; +} + +API int contacts_list_destroy( contacts_list_h list, bool delete_child ) +{ + ctsvc_list_s *s_list; + GList *cursor = NULL; + + RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, "Invalid parameter : The list is null"); + s_list = (ctsvc_list_s *)list; + + if (delete_child) { + for(cursor = s_list->records;cursor;cursor=cursor->next) + contacts_record_destroy((contacts_record_h)(cursor->data), true); + g_list_free(s_list->records); + } + + for(cursor = s_list->deleted_records;cursor;cursor=cursor->next) + contacts_record_destroy((contacts_record_h)(cursor->data), true); + g_list_free(s_list->deleted_records); + + free(s_list); + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_clone(contacts_list_h list, contacts_list_h* out_list) +{ + ctsvc_list_s *list_s; + ctsvc_record_s *data; + contacts_record_h new_record; + contacts_list_h new_list; + GList *cursor = NULL; + contacts_error_e err = CONTACTS_ERROR_NONE; + + RETVM_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER, + "The list is null"); + list_s = (ctsvc_list_s *)list; + + contacts_list_create(&new_list); + for(cursor = list_s->records;cursor;cursor=cursor->next) { + data = (ctsvc_record_s *)cursor->data; + err = contacts_record_clone((contacts_record_h)cursor->data, &new_record); + RETVM_IF(CONTACTS_ERROR_NONE != err, err,"contacts_record_clone() Failed(%d)", err); + ctsvc_list_prepend(new_list, new_record); + } + ctsvc_list_reverse(new_list); + + for(cursor = list_s->deleted_records;cursor;cursor=cursor->next) { + data = (ctsvc_record_s *)cursor->data; + err = contacts_record_clone((contacts_record_h)cursor->data, &new_record); + RETVM_IF(CONTACTS_ERROR_NONE != err, err,"contacts_record_clone() Failed(%d)", err); + ((ctsvc_list_s*)new_list)->deleted_records = g_list_prepend(((ctsvc_list_s*)new_list)->deleted_records, new_record); + } + if (((ctsvc_list_s*)new_list)->deleted_records) + ((ctsvc_list_s*)new_list)->deleted_records = g_list_reverse(((ctsvc_list_s*)new_list)->deleted_records); + + *out_list = new_list; + + return CONTACTS_ERROR_NONE; +} + + +int ctsvc_list_get_deleted_count(contacts_list_h list, unsigned int *count ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == count, CONTACTS_ERROR_INVALID_PARAMETER); + *count = 0; + + RETV_IF(NULL == list, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + if( NULL == list_s->deleted_records ) + { + return CONTACTS_ERROR_NONE; + } + + *count = g_list_length(list_s->deleted_records); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_get_deleted_nth_record_p( contacts_list_h list, int index, contacts_record_h* record ) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + *record = NULL; + + RETV_IF(NULL == list || NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + list_s = (ctsvc_list_s *)list; + + RETV_IF(NULL == list_s->deleted_records, CONTACTS_ERROR_NO_DATA); + + *record = (ctsvc_record_s *)g_list_nth_data(list_s->deleted_records, index); + + return CONTACTS_ERROR_NONE; +} + +int ctsvc_list_append_deleted_record(contacts_list_h list, contacts_record_h record) +{ + ctsvc_list_s *list_s; + + RETV_IF(NULL == list || NULL == record, CONTACTS_ERROR_INVALID_PARAMETER); + + list_s = (ctsvc_list_s *)list; + + list_s->deleted_records = g_list_append(list_s->deleted_records, record); + + return CONTACTS_ERROR_NONE; +} |