diff options
Diffstat (limited to 'src/cts-struct.c')
-rwxr-xr-x | src/cts-struct.c | 2927 |
1 files changed, 2927 insertions, 0 deletions
diff --git a/src/cts-struct.c b/src/cts-struct.c new file mode 100755 index 0000000..e701f2c --- /dev/null +++ b/src/cts-struct.c @@ -0,0 +1,2927 @@ +/* + * Contacts Service + * + * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Youngjae Shin <yj99.shin@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 <unistd.h> +#include <errno.h> + +#include "cts-internal.h" +#include "cts-list.h" +#include "cts-utils.h" + +static contact_list *contact_list_mempool=NULL; +static plog_list *plog_list_mempool=NULL; +static change_list *change_list_mempool=NULL; +static numtype_list *numtype_list_mempool=NULL; +static shortcut_list *favorite_list_mempool=NULL; +static cts_group *group_list_mempool=NULL; +static cts_addrbook *addrbook_list_mempool=NULL; +static sdn_list *sdn_list_mempool=NULL; + +API CTSstruct* contacts_svc_struct_new(cts_struct_type type) +{ + CTSstruct* ret_val; + switch (type) + { + case CTS_STRUCT_CONTACT: + ret_val = (CTSstruct*)calloc(1, sizeof(contact_t)); + if (ret_val) ret_val->s_type = CTS_STRUCT_CONTACT; + return ret_val; + default: + ERR("your type is Not supported"); + return NULL; + } +} + +static void cts_number_free(gpointer data, gpointer user_data) +{ + if (NULL == data || !((cts_number*)data)->embedded) + return; + + free(((cts_number*)data)->number); + free(((cts_number*)data)->added_type); + free(data); +} +static void cts_email_free(gpointer data, gpointer user_data) +{ + if (NULL == data || !((cts_email*)data)->embedded) + return; + + free(((cts_email*)data)->email_addr); + free(data); +} +static void cts_group_free(gpointer data, gpointer user_data) +{ + cts_group* data0 = (cts_group*)data; + + if (NULL == data || !data0->embedded) + return; + + free(data0->name); + free(data0->ringtone_path); + free(data0->vcard_group); + free(data); +} +static void cts_event_free(gpointer data, gpointer user_data) +{ + if (NULL == data || !((cts_event*)data)->embedded) + return; + + free(data); +} +static void cts_messenger_free(gpointer data, gpointer user_data) +{ + if (NULL == data || !((cts_messenger*)data)->embedded) + return; + + free(((cts_messenger*)data)->im_id); + free(data); +} +static void cts_postal_free(gpointer data, gpointer user_data) +{ + cts_postal *data0 = (cts_postal *)data; + + if (NULL == data0 || !data0->embedded) + return; + + free(data0->pobox); + free(data0->postalcode); + free(data0->region); + free(data0->locality); + free(data0->street); + free(data0->extended); + free(data0->country); + free(data); +} +static void cts_web_free(gpointer data, gpointer user_data) +{ + if (NULL == data || !((cts_web*)data)->embedded) + return; + + free(((cts_web*)data)->url); + free(data); +} +static void cts_nickname_free(gpointer data, gpointer user_data) +{ + if (NULL == data || !((cts_nickname*)data)->embedded) + return; + + free(((cts_nickname*)data)->nick); + free(data); +} + +static void cts_extend_free(gpointer data, gpointer user_data) +{ + cts_extend *data0 = (cts_extend *)data; + if (NULL == data0 || !data0->embedded) + return; + + free(data0->data2); + free(data0->data3); + free(data0->data4); + free(data0->data5); + free(data0->data6); + free(data0->data7); + free(data0->data8); + free(data0->data9); + free(data0->data10); + free(data); +} + +static inline void cts_name_free(cts_name *name) +{ + if (!name->embedded) + return; + + free(name->first); + free(name->last); + free(name->addition); + free(name->display); + free(name->prefix); + free(name->suffix); + free(name); +} + +static inline void cts_company_free(cts_company *company) +{ + if (!company->embedded) + return; + + free(company->name); + free(company->department); + free(company->jot_title); + free(company->role); + free(company->assistant_name); + free(company); +} + +static inline void cts_contact_free(contact_t *contact) +{ + if (contact->base && contact->base->embedded) { + free(contact->base->uid); + free(contact->base->img_path); + free(contact->base->full_img_path); + free(contact->base->ringtone_path); + free(contact->base->note); + + if (contact->base->vcard_img_path) { + unlink(contact->base->vcard_img_path); + free(contact->base->vcard_img_path); + } + + free(contact->base); + } + + if (contact->name) + cts_name_free(contact->name); + + if (contact->company) + cts_company_free(contact->company); + + if (contact->numbers) { + g_slist_foreach(contact->numbers, cts_number_free, NULL); + g_slist_free(contact->numbers); + } + + if (contact->emails) { + g_slist_foreach(contact->emails, cts_email_free, NULL); + g_slist_free(contact->emails); + } + + if (contact->grouprelations) { + g_slist_foreach(contact->grouprelations, cts_group_free, NULL); + g_slist_free(contact->grouprelations); + } + + if (contact->events) { + g_slist_foreach(contact->events, cts_event_free, NULL); + g_slist_free(contact->events); + } + + if (contact->messengers) { + g_slist_foreach(contact->messengers, cts_messenger_free, NULL); + g_slist_free(contact->messengers); + } + + if (contact->postal_addrs) { + g_slist_foreach(contact->postal_addrs, cts_postal_free, NULL); + g_slist_free(contact->postal_addrs); + } + + if (contact->web_addrs) { + g_slist_foreach(contact->web_addrs, cts_web_free, NULL); + g_slist_free(contact->web_addrs); + } + + if (contact->nicknames) { + g_slist_foreach(contact->nicknames, cts_nickname_free, NULL); + g_slist_free(contact->nicknames); + } + + if (contact->extended_values) { + g_slist_foreach(contact->extended_values, cts_extend_free, NULL); + g_slist_free(contact->extended_values); + } +} + +API int contacts_svc_struct_free(CTSstruct* structure) +{ + retv_if(NULL == structure, CTS_ERR_ARG_NULL); + + switch (structure->s_type) + { + case CTS_STRUCT_CONTACT: + cts_contact_free((contact_t *)structure); + free(structure); + break; + default: + ERR("The structure type(%d) is Not valid", structure->s_type); + return CTS_ERR_ARG_INVALID; + } + return CTS_SUCCESS; +} + +API int contacts_svc_struct_get_list(CTSstruct *contact, + cts_struct_field field, GSList** retlist) +{ + contact_t *record = (contact_t *)contact; + + retv_if(NULL == contact, CTS_ERR_ARG_NULL); + retv_if(NULL == retlist, CTS_ERR_ARG_NULL); + retvm_if(CTS_STRUCT_CONTACT != contact->s_type, CTS_ERR_ARG_INVALID, + "The contact(%d) must be type of CTS_STRUCT_CONTACT.", contact->s_type); + + switch (field) + { + case CTS_CF_NUMBER_LIST: + *retlist = record->numbers; + break; + case CTS_CF_EMAIL_LIST: + *retlist = record->emails; + break; + case CTS_CF_GROUPREL_LIST: + *retlist = record->grouprelations; + break; + case CTS_CF_EVENT_LIST: + *retlist = record->events; + break; + case CTS_CF_MESSENGER_LIST: + *retlist = record->messengers; + break; + case CTS_CF_POSTAL_ADDR_LIST: + *retlist = record->postal_addrs; + break; + case CTS_CF_WEB_ADDR_LIST: + *retlist = record->web_addrs; + break; + case CTS_CF_NICKNAME_LIST: + *retlist = record->nicknames; + break; + default: + ERR("The parameter(field) is invalid" + "You MUST be (CTS_CF_VALUE_MAX < field < CTS_CF_FIELD_MAX)."); + return CTS_ERR_ARG_INVALID; + } + + if (NULL == *retlist) return CTS_ERR_NO_DATA; + + return CTS_SUCCESS; +} + +static cts_extend* cts_extend_slist_search(int type, GSList *list) +{ + cts_extend *tmp_extend; + GSList *tmp_gslist=list; + while (tmp_gslist) + { + tmp_extend = tmp_gslist->data; + retvm_if(CTS_VALUE_EXTEND != tmp_extend->v_type, NULL, + "List has other type"); + if (tmp_extend->type == type) return tmp_extend; + + tmp_gslist = tmp_gslist->next; + } + return NULL; +} + +static inline int cts_contact_get_value(contact_t *contact, + cts_struct_field field, CTSvalue** retval) +{ + + switch (field) + { + case CTS_CF_NAME_VALUE: + *retval = (CTSvalue *)contact->name; + break; + case CTS_CF_BASE_INFO_VALUE: + *retval = (CTSvalue *)contact->base; + break; + case CTS_CF_COMPANY_VALUE: + *retval = (CTSvalue *)contact->company; + break; + default: + if ((int)CTS_DATA_EXTEND_START <= field) { + *retval = (CTSvalue *)cts_extend_slist_search(field, + contact->extended_values); + return CTS_SUCCESS; + } + ERR("The parameter(field:%d) is not interpreted", field); + return CTS_ERR_ARG_INVALID; + } + return CTS_SUCCESS; +} + +API int contacts_svc_struct_get_value(CTSstruct *structure, + cts_struct_field field, CTSvalue **retval) +{ + int ret; + + retv_if(NULL == structure, CTS_ERR_ARG_NULL); + retv_if(NULL == retval, CTS_ERR_ARG_NULL); + + switch (structure->s_type) + { + case CTS_STRUCT_CONTACT: + ret = cts_contact_get_value((contact_t *)structure, field, retval); + if (CTS_SUCCESS != ret) + return ret; + break; + default: + ERR("The structure type(%d) is Not valid", structure->s_type); + return CTS_ERR_ARG_INVALID; + } + + if (NULL == *retval) return CTS_ERR_NO_DATA; + return CTS_SUCCESS; +} + +#define CTS_REMOVE_GSLIST_ITEM(type, loc) \ + do { \ + cts_##type##_free(tmp_##type, NULL); \ + if (prev) { \ + prev->next = tmp_gslist->next; \ + g_slist_free_1(tmp_gslist); \ + tmp_gslist = prev->next; \ + } \ + else { \ + contact->loc = tmp_gslist->next; \ + g_slist_free_1(tmp_gslist); \ + tmp_gslist = contact->loc; \ + } \ + }while(false) + +static inline int cts_struct_store_num_list(contact_t *contact, GSList* list) +{ + cts_number *tmp_number; + + GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; + if (contact->numbers && tmp_gslist == contact->numbers) + { + while (tmp_gslist) + { + tmp_number = tmp_gslist->data; + if (tmp_number) + { + retvm_if(CTS_VALUE_NUMBER != tmp_number->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + + if (!tmp_number->id && tmp_number->deleted) + { + CTS_REMOVE_GSLIST_ITEM(number, numbers); + continue; + } + + if (!tmp_number->embedded) + { + tmp_number->embedded = true; + tmp_number->number = SAFE_STRDUP(tmp_number->number); + } + } + prev = tmp_gslist; + tmp_gslist = tmp_gslist->next; + } + } + else + { + while (tmp_gslist) + { + tmp_number = tmp_gslist->data; + if (tmp_number) + { + retvm_if(tmp_number && CTS_VALUE_NUMBER != tmp_number->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + if (!tmp_number->embedded) + { + tmp_number->embedded = true; + tmp_number->number = SAFE_STRDUP(tmp_number->number); + new_gslist = g_slist_append(new_gslist, tmp_number); + } + } + tmp_gslist = tmp_gslist->next; + } + contact->numbers = g_slist_concat(contact->numbers, new_gslist); + } + return CTS_SUCCESS; +} + +static inline int cts_struct_store_email_list(contact_t *contact, GSList* list) +{ + cts_email *tmp_email; + + GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; + if (contact->emails && tmp_gslist == contact->emails) + { + while (tmp_gslist) + { + tmp_email = tmp_gslist->data; + if (tmp_email) + { + retvm_if(CTS_VALUE_EMAIL != tmp_email->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + + if (!tmp_email->id && tmp_email->deleted) { + CTS_REMOVE_GSLIST_ITEM(email, emails); + continue; + } + + if (!tmp_email->embedded) + { + tmp_email->embedded = true; + tmp_email->email_addr = SAFE_STRDUP(tmp_email->email_addr); + } + } + prev = tmp_gslist; + tmp_gslist = tmp_gslist->next; + } + } + else + { + while (tmp_gslist) + { + tmp_email = tmp_gslist->data; + if (tmp_email) + { + retvm_if(CTS_VALUE_EMAIL != tmp_email->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + if (!tmp_email->embedded) + { + tmp_email->embedded = true; + tmp_email->email_addr = SAFE_STRDUP(tmp_email->email_addr); + new_gslist = g_slist_append(new_gslist, tmp_email); + } + } + tmp_gslist = tmp_gslist->next; + } + contact->emails = g_slist_concat(contact->emails, new_gslist); + } + return CTS_SUCCESS; +} + +static inline int cts_struct_store_grouprel_list(contact_t *contact, GSList* list) +{ + cts_group *tmp_group; + + GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; + if (contact->grouprelations && tmp_gslist == contact->grouprelations) + { + while (tmp_gslist) + { + tmp_group = tmp_gslist->data; + if (tmp_group) + { + retvm_if(CTS_VALUE_GROUP_RELATION != tmp_group->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + + if (!tmp_group->name && tmp_group->deleted) { + CTS_REMOVE_GSLIST_ITEM(group, grouprelations); + continue; + } + + tmp_group->embedded = true; + } + prev = tmp_gslist; + tmp_gslist = tmp_gslist->next; + } + } + else + { + while (tmp_gslist) + { + tmp_group = tmp_gslist->data; + if (tmp_group) + { + retvm_if(CTS_VALUE_GROUP_RELATION != tmp_group->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + if (!tmp_group->embedded) + { + tmp_group->embedded = true; + new_gslist = g_slist_append(new_gslist, tmp_group); + } + } + tmp_gslist = tmp_gslist->next; + } + contact->grouprelations = g_slist_concat(contact->grouprelations, new_gslist); + } + return CTS_SUCCESS; +} + +static inline int cts_struct_store_event_list(contact_t *contact, GSList* list) +{ + cts_event *tmp_event; + + GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; + if (contact->events && tmp_gslist == contact->events) + { + while (tmp_gslist) + { + tmp_event = tmp_gslist->data; + if (tmp_event) + { + retvm_if(CTS_VALUE_EVENT != tmp_event->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + + if (!tmp_event->id && tmp_event->deleted) { + CTS_REMOVE_GSLIST_ITEM(event, events); + continue; + } + + tmp_event->embedded = true; + } + prev = tmp_gslist; + tmp_gslist = tmp_gslist->next; + } + } + else + { + while (tmp_gslist) + { + tmp_event = tmp_gslist->data; + if (tmp_event) + { + retvm_if(CTS_VALUE_EVENT != tmp_event->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + if (!tmp_event->embedded) + { + tmp_event->embedded = true; + new_gslist = g_slist_append(new_gslist, tmp_event); + } + } + tmp_gslist = tmp_gslist->next; + } + contact->events = g_slist_concat(contact->events, new_gslist); + } + return CTS_SUCCESS; +} + +static inline int cts_struct_store_messenger_list(contact_t *contact, GSList* list) +{ + cts_messenger *tmp_messenger; + + GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; + if (contact->messengers && tmp_gslist == contact->messengers) + { + while (tmp_gslist) + { + tmp_messenger = tmp_gslist->data; + if (tmp_messenger) + { + retvm_if(CTS_VALUE_MESSENGER != tmp_messenger->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + + if (!tmp_messenger->id && tmp_messenger->deleted) { + CTS_REMOVE_GSLIST_ITEM(messenger, messengers); + continue; + } + + if (!tmp_messenger->embedded) + { + tmp_messenger->embedded = true; + tmp_messenger->im_id = SAFE_STRDUP(tmp_messenger->im_id); + } + } + prev = tmp_gslist; + tmp_gslist = tmp_gslist->next; + } + } + else + { + while (tmp_gslist) + { + tmp_messenger = tmp_gslist->data; + if (tmp_messenger) + { + retvm_if(CTS_VALUE_MESSENGER != tmp_messenger->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + if (!tmp_messenger->embedded) + { + tmp_messenger->embedded = true; + tmp_messenger->im_id = SAFE_STRDUP(tmp_messenger->im_id); + new_gslist = g_slist_append(new_gslist, tmp_messenger); + } + } + tmp_gslist = tmp_gslist->next; + } + contact->messengers = g_slist_concat(contact->messengers, new_gslist); + } + return CTS_SUCCESS; +} + +static inline int cts_struct_store_postal_list(contact_t *contact, GSList* list) +{ + cts_postal *tmp_postal; + + GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; + if (contact->postal_addrs && tmp_gslist == contact->postal_addrs) + { + while (tmp_gslist) + { + tmp_postal = tmp_gslist->data; + if (tmp_postal) + { + retvm_if(CTS_VALUE_POSTAL != tmp_postal->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + + if (!tmp_postal->id && tmp_postal->deleted) { + CTS_REMOVE_GSLIST_ITEM(postal, postal_addrs); + continue; + } + + if (!tmp_postal->embedded) { + tmp_postal->embedded = true; + tmp_postal->pobox = SAFE_STRDUP(tmp_postal->pobox); + tmp_postal->postalcode = SAFE_STRDUP(tmp_postal->postalcode); + tmp_postal->region = SAFE_STRDUP(tmp_postal->region); + tmp_postal->locality = SAFE_STRDUP(tmp_postal->locality); + tmp_postal->street = SAFE_STRDUP(tmp_postal->street); + tmp_postal->extended = SAFE_STRDUP(tmp_postal->extended); + tmp_postal->country = SAFE_STRDUP(tmp_postal->country); + } + } + prev = tmp_gslist; + tmp_gslist = tmp_gslist->next; + } + } + else + { + //retvm_if(NULL != contact->postal_addrs, CTS_ERR_ARG_INVALID, "New list can be stored when struct has no list"); + while (tmp_gslist) + { + tmp_postal = tmp_gslist->data; + if (tmp_postal) { + retvm_if(tmp_postal && CTS_VALUE_POSTAL != tmp_postal->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + if (!tmp_postal->embedded) { + tmp_postal->embedded = true; + tmp_postal->pobox = SAFE_STRDUP(tmp_postal->pobox); + tmp_postal->postalcode = SAFE_STRDUP(tmp_postal->postalcode); + tmp_postal->region = SAFE_STRDUP(tmp_postal->region); + tmp_postal->locality = SAFE_STRDUP(tmp_postal->locality); + tmp_postal->street = SAFE_STRDUP(tmp_postal->street); + tmp_postal->extended = SAFE_STRDUP(tmp_postal->extended); + tmp_postal->country = SAFE_STRDUP(tmp_postal->country); + new_gslist = g_slist_append(new_gslist, tmp_postal); + } + } + tmp_gslist = tmp_gslist->next; + } + contact->postal_addrs = g_slist_concat(contact->postal_addrs, new_gslist); + } + return CTS_SUCCESS; +} + +static inline int cts_struct_store_web_list(contact_t *contact, GSList* list) +{ + cts_web *tmp_web; + + GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; + if (contact->web_addrs && tmp_gslist == contact->web_addrs) + { + while (tmp_gslist) + { + tmp_web = tmp_gslist->data; + if (tmp_web) + { + retvm_if(CTS_VALUE_WEB != tmp_web->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + + if (!tmp_web->id && tmp_web->deleted) { + CTS_REMOVE_GSLIST_ITEM(web, web_addrs); + continue; + } + + if (!tmp_web->embedded) { + tmp_web->embedded = true; + tmp_web->url = SAFE_STRDUP(tmp_web->url); + } + } + prev = tmp_gslist; + tmp_gslist = tmp_gslist->next; + } + } + else + { + while (tmp_gslist) + { + tmp_web = tmp_gslist->data; + if (tmp_web) + { + retvm_if(tmp_web && CTS_VALUE_WEB != tmp_web->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + if (!tmp_web->embedded) { + tmp_web->embedded = true; + tmp_web->url = SAFE_STRDUP(tmp_web->url); + new_gslist = g_slist_append(new_gslist, tmp_web); + } + } + tmp_gslist = tmp_gslist->next; + } + contact->web_addrs = g_slist_concat(contact->web_addrs, new_gslist); + } + return CTS_SUCCESS; +} + +static inline int cts_struct_store_nickname_list(contact_t *contact, GSList* list) +{ + cts_nickname *tmp_nickname; + + GSList *new_gslist=NULL, *tmp_gslist=list, *prev=NULL; + if (contact->nicknames && tmp_gslist == contact->nicknames) + { + while (tmp_gslist) + { + tmp_nickname = tmp_gslist->data; + if (tmp_nickname) + { + retvm_if(CTS_VALUE_NICKNAME != tmp_nickname->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + + if (!tmp_nickname->id && tmp_nickname->deleted) { + CTS_REMOVE_GSLIST_ITEM(nickname, nicknames); + continue; + } + + if (!tmp_nickname->embedded) { + tmp_nickname->embedded = true; + tmp_nickname->nick = SAFE_STRDUP(tmp_nickname->nick); + } + } + prev = tmp_gslist; + tmp_gslist = tmp_gslist->next; + } + } + else + { + //retvm_if(NULL != contact->web_addrs, CTS_ERR_ARG_INVALID, "New list can be stored when struct has no list"); + while (tmp_gslist) + { + tmp_nickname = tmp_gslist->data; + if (tmp_nickname) { + retvm_if(tmp_nickname && CTS_VALUE_NICKNAME != tmp_nickname->v_type, CTS_ERR_ARG_INVALID, + "List has other type"); + if (!tmp_nickname->embedded) + { + tmp_nickname->embedded = true; + tmp_nickname->nick = SAFE_STRDUP(tmp_nickname->nick); + new_gslist = g_slist_append(new_gslist, tmp_nickname); + } + } + tmp_gslist = tmp_gslist->next; + } + contact->nicknames = g_slist_concat(contact->nicknames, new_gslist); + } + return CTS_SUCCESS; +} + +API int contacts_svc_struct_store_list(CTSstruct *contact, + cts_struct_field field, GSList *list) +{ + int ret; + + retv_if(NULL == contact, CTS_ERR_ARG_NULL); + retv_if(NULL == list, CTS_ERR_ARG_NULL); + retvm_if(CTS_STRUCT_CONTACT != contact->s_type, CTS_ERR_ARG_INVALID, + "The contact(%d) must be type of CTS_STRUCT_CONTACT.", contact->s_type); + + switch (field) + { + case CTS_CF_NUMBER_LIST: + ret = cts_struct_store_num_list((contact_t *)contact, list); + retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_num_list() Failed(%d)",ret); + break; + case CTS_CF_EMAIL_LIST: + ret = cts_struct_store_email_list((contact_t *)contact, list); + retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_email_list() Failed(%d)",ret); + break; + case CTS_CF_GROUPREL_LIST: + ret = cts_struct_store_grouprel_list((contact_t *)contact, list); + retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_grouprel_list() Failed(%d)",ret); + break; + case CTS_CF_EVENT_LIST: + ret = cts_struct_store_event_list((contact_t *)contact, list); + retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_event_list() Failed(%d)",ret); + break; + case CTS_CF_MESSENGER_LIST: + ret = cts_struct_store_messenger_list((contact_t *)contact, list); + retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_messenger_list() Failed(%d)",ret); + break; + case CTS_CF_POSTAL_ADDR_LIST: + ret = cts_struct_store_postal_list((contact_t *)contact, list); + retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_postal_list() Failed(%d)",ret); + break; + case CTS_CF_WEB_ADDR_LIST: + ret = cts_struct_store_web_list((contact_t *)contact, list); + retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_web_list() Failed(%d)",ret); + break; + case CTS_CF_NICKNAME_LIST: + ret = cts_struct_store_nickname_list((contact_t *)contact, list); + retvm_if(CTS_SUCCESS != ret, ret, "cts_struct_store_nickname_list() Failed(%d)",ret); + break; + default: + ERR("The parameter(field) is invalid" + "You MUST be (CTS_CF_VALUE_MAX < field < CTS_CF_FIELD_MAX)."); + return CTS_ERR_ARG_INVALID; + } + return CTS_SUCCESS; +} + +static inline void cts_contact_store_name(contact_t *contact, cts_name *value) +{ + if (contact->name) + { + if (value->is_changed) { + FREEandSTRDUP(contact->name->first, value->first); + FREEandSTRDUP(contact->name->last, value->last); + FREEandSTRDUP(contact->name->addition, value->addition); + FREEandSTRDUP(contact->name->display, value->display); + FREEandSTRDUP(contact->name->prefix, value->prefix); + FREEandSTRDUP(contact->name->suffix, value->suffix); + contact->name->is_changed = true; + } + } + else + { + //contact->name = (cts_name *)contacts_svc_value_new(CTS_VALUE_NAME); + contact->name = value; + contact->name->embedded = true; + contact->name->first = SAFE_STRDUP(value->first); + contact->name->last = SAFE_STRDUP(value->last); + contact->name->addition = SAFE_STRDUP(value->addition); + contact->name->display = SAFE_STRDUP(value->display); + contact->name->prefix = SAFE_STRDUP(value->prefix); + contact->name->suffix = SAFE_STRDUP(value->suffix); + } +} + +static inline void cts_contact_store_base(contact_t *contact, cts_ct_base *value) +{ + if (contact->base) + { + if (value->uid_changed) { + FREEandSTRDUP(contact->base->uid, value->uid); + contact->base->uid_changed = true; + } + if (value->img_changed) { + FREEandSTRDUP(contact->base->img_path, value->img_path); + contact->base->img_changed = true; + } + if (value->full_img_changed) { + FREEandSTRDUP(contact->base->full_img_path, value->full_img_path); + contact->base->full_img_changed = true; + } + if (value->ringtone_changed) { + FREEandSTRDUP(contact->base->ringtone_path, value->ringtone_path); + contact->base->ringtone_changed = true; + } + if (value->note_changed) { + FREEandSTRDUP(contact->base->note, value->note); + contact->base->note_changed = true; + } + } + else + { + contact->base = value; + contact->base->embedded = true; + contact->base->uid = SAFE_STRDUP(value->uid); + contact->base->img_path = SAFE_STRDUP(value->img_path); + contact->base->full_img_path = SAFE_STRDUP(value->full_img_path); + contact->base->ringtone_path = SAFE_STRDUP(value->ringtone_path); + contact->base->note = SAFE_STRDUP(value->note); + } +} + +static inline void cts_contact_store_company(contact_t *contact, cts_company *value) +{ + if (contact->company) + { + FREEandSTRDUP(contact->company->name, value->name); + FREEandSTRDUP(contact->company->department, value->department); + FREEandSTRDUP(contact->company->jot_title, value->jot_title); + FREEandSTRDUP(contact->company->role, value->role); + FREEandSTRDUP(contact->company->assistant_name, value->assistant_name); + } + else + { + //contact->company = (cts_company *)contacts_svc_value_new(CTS_VALUE_COMPANY); + contact->company = value; + contact->company->embedded = true; + contact->company->name = SAFE_STRDUP(value->name); + contact->company->department = SAFE_STRDUP(value->department); + contact->company->jot_title = SAFE_STRDUP(value->jot_title); + contact->company->role = SAFE_STRDUP(value->role); + contact->company->assistant_name = SAFE_STRDUP(value->assistant_name); + } +} + +static inline int cts_contact_store_extend(contact_t *contact, + int type, cts_extend *value) +{ + cts_extend *stored_extend; + + stored_extend = cts_extend_slist_search(type, contact->extended_values); + if (NULL == stored_extend) + { + retvm_if(value->embedded, CTS_ERR_ARG_INVALID, "This Value is already stored"); + value->embedded = true; + value->type = type; + contact->extended_values = g_slist_append(contact->extended_values, value); + value->data2 = SAFE_STRDUP(value->data2); + value->data3 = SAFE_STRDUP(value->data3); + value->data4 = SAFE_STRDUP(value->data4); + value->data5 = SAFE_STRDUP(value->data5); + value->data6 = SAFE_STRDUP(value->data6); + value->data7 = SAFE_STRDUP(value->data7); + value->data8 = SAFE_STRDUP(value->data8); + value->data9 = SAFE_STRDUP(value->data9); + value->data10 = SAFE_STRDUP(value->data10); + } + else + { + retvm_if(stored_extend == value, CTS_SUCCESS, "This value is already stored"); + + FREEandSTRDUP(stored_extend->data2, value->data2); + FREEandSTRDUP(stored_extend->data3, value->data3); + FREEandSTRDUP(stored_extend->data4, value->data4); + FREEandSTRDUP(stored_extend->data5, value->data5); + FREEandSTRDUP(stored_extend->data6, value->data6); + FREEandSTRDUP(stored_extend->data7, value->data7); + FREEandSTRDUP(stored_extend->data8, value->data8); + FREEandSTRDUP(stored_extend->data9, value->data9); + FREEandSTRDUP(stored_extend->data10, value->data10); + } + + return CTS_SUCCESS; +} + +API int contacts_svc_struct_store_value(CTSstruct *contact, + cts_struct_field field, CTSvalue *value) +{ + contact_t *record = (contact_t *)contact; + + retv_if(NULL == contact, CTS_ERR_ARG_NULL); + retv_if(NULL == value, CTS_ERR_ARG_NULL); + retvm_if(CTS_STRUCT_CONTACT != contact->s_type, CTS_ERR_ARG_INVALID, + "The contact(%d) must be type of CTS_STRUCT_CONTACT.", contact->s_type); + CTS_DBG("contact type = %d, field = %d, value type = %d", + contact->s_type, field, value->v_type); + + switch (field) + { + case CTS_CF_NAME_VALUE: + retvm_if(CTS_VALUE_NAME != value->v_type, CTS_ERR_ARG_INVALID, + "The value must be a CTS_VALUE_NAME for field(CTS_CF_NAME_VALUE)."); + if (record->name != (cts_name *)value) + cts_contact_store_name(record, (cts_name *)value); + break; + case CTS_CF_BASE_INFO_VALUE: + retvm_if(CTS_VALUE_CONTACT_BASE_INFO != value->v_type, CTS_ERR_ARG_INVALID, + "The value must be a CTS_VALUE_CONTACT_BASE_INFO for field(CTS_CF_IMAGE_PATH_STR)."); + if (record->base != (cts_ct_base *)value) + cts_contact_store_base(record, (cts_ct_base*)value); + break; + case CTS_CF_COMPANY_VALUE: + retvm_if(CTS_VALUE_COMPANY != value->v_type, CTS_ERR_ARG_INVALID, + "The value must be a CTS_VALUE_COMPANY for field(CTS_CF_COMPANY_VALUE)."); + if (record->company != (cts_company *)value) + cts_contact_store_company(record, (cts_company*)value); + break; + default: + if (CTS_VALUE_EXTEND == value->v_type && (int)CTS_DATA_EXTEND_START <= field) + return cts_contact_store_extend(record, field, (cts_extend*)value); + ERR("The parameter(field:%d) is invalid" + "You MUST be (CTS_CF_NONE < field < CTS_CF_VALUE_MAX).", field); + return CTS_ERR_ARG_INVALID; + } + + return CTS_SUCCESS; +} + +API CTSvalue* contacts_svc_value_new(cts_value_type type) +{ + CTSvalue* ret_val; + switch ((int)type) + { + case CTS_VALUE_BASIC: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_basic)); + break; + case CTS_VALUE_CONTACT_BASE_INFO: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_ct_base)); + break; + case CTS_VALUE_NAME: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_name)); + break; + case CTS_VALUE_EMAIL: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_email)); + break; + case CTS_VALUE_NUMBER: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_number)); + break; + case CTS_VALUE_WEB: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_web)); + break; + case CTS_VALUE_POSTAL: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_postal)); + break; + case CTS_VALUE_EVENT: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_event)); + break; + case CTS_VALUE_MESSENGER: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_messenger)); + if (ret_val) ret_val->v_type = CTS_VALUE_MESSENGER; + break; + case CTS_VALUE_NICKNAME: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_nickname)); + break; + case CTS_VALUE_GROUP_RELATION: + case CTS_VALUE_GROUP: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_group)); + break; + case CTS_VALUE_COMPANY: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_company)); + break; + case CTS_VALUE_PHONELOG: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_plog)); + break; + case CTS_VALUE_EXTEND: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_extend)); + break; + case CTS_VALUE_ADDRESSBOOK: + ret_val = (CTSvalue*)calloc(1, sizeof(cts_addrbook)); + break; + case CTS_VALUE_LIST_CONTACT: + if (contact_list_mempool) { + memset(contact_list_mempool, 0x00, sizeof(contact_list)); + ret_val = (CTSvalue*)contact_list_mempool; + contact_list_mempool = NULL; + } + else + ret_val = (CTSvalue*)calloc(1, sizeof(contact_list)); + break; + case CTS_VALUE_LIST_PLOG: + if (plog_list_mempool) { + memset(plog_list_mempool, 0x00, sizeof(plog_list)); + ret_val = (CTSvalue*)plog_list_mempool; + plog_list_mempool = NULL; + } + else + ret_val = (CTSvalue*)calloc(1, sizeof(plog_list)); + break; + case CTS_VALUE_LIST_CUSTOM_NUM_TYPE: + if (numtype_list_mempool) { + memset(numtype_list_mempool, 0x00, sizeof(numtype_list)); + ret_val = (CTSvalue*)numtype_list_mempool; + numtype_list_mempool = NULL; + } + else + ret_val = (CTSvalue*)calloc(1, sizeof(numtype_list)); + break; + case CTS_VALUE_LIST_CHANGE: + if (change_list_mempool) { + memset(change_list_mempool, 0x00, sizeof(change_list)); + ret_val = (CTSvalue*)change_list_mempool; + change_list_mempool = NULL; + } + else + ret_val = (CTSvalue*)calloc(1, sizeof(change_list)); + break; + case CTS_VALUE_LIST_ADDRBOOK: + if (addrbook_list_mempool) { + memset(addrbook_list_mempool, 0x00, sizeof(cts_addrbook)); + ret_val = (CTSvalue*)addrbook_list_mempool; + addrbook_list_mempool = NULL; + } + else + ret_val = (CTSvalue*)calloc(1, sizeof(cts_addrbook)); + break; + case CTS_VALUE_LIST_GROUP: + if (group_list_mempool) { + memset(group_list_mempool, 0x00, sizeof(cts_group)); + ret_val = (CTSvalue*)group_list_mempool; + group_list_mempool = NULL; + } + else + ret_val = (CTSvalue*)calloc(1, sizeof(cts_group)); + break; + case CTS_VALUE_LIST_SHORTCUT: + if (favorite_list_mempool) { + memset(favorite_list_mempool, 0x00, sizeof(shortcut_list)); + ret_val = (CTSvalue*)favorite_list_mempool; + favorite_list_mempool = NULL; + } + else + ret_val = (CTSvalue*)calloc(1, sizeof(shortcut_list)); + break; + case CTS_VALUE_LIST_SDN: + if (sdn_list_mempool) { + memset(sdn_list_mempool, 0x00, sizeof(sdn_list)); + ret_val = (CTSvalue*)sdn_list_mempool; + sdn_list_mempool = NULL; + } + else + ret_val = (CTSvalue*)calloc(1, sizeof(sdn_list)); + break; + default: + ERR("your type is Not supported"); + return NULL; + } + + if (ret_val) + ret_val->v_type = type; + else + ERR("calloc() Failed(%d)", errno); + + return ret_val; +} + +static inline void cts_internal_value_info_free(CTSvalue *value) +{ + plog_list *plog; + cts_plog *log; + numtype_list *numtype; + contact_list *contact; + change_list *change; + shortcut_list *favorite; + cts_group *group; + cts_addrbook *ab; + sdn_list *sdn; + + switch (value->v_type) + { + case CTS_VALUE_LIST_CONTACT: + case CTS_VALUE_LIST_NUMBERINFO: + case CTS_VALUE_LIST_EMAILINFO: + contact = (contact_list *)value; + free(contact->img_path); + free(contact->first); + free(contact->last); + free(contact->display); + free(contact->connect); + free(contact->normalize); + + if (!contact_list_mempool) { + contact_list_mempool = contact; + } + else + if (contact_list_mempool != contact) + free(contact); + break; + case CTS_VALUE_LIST_PLOG: + plog = (plog_list *)value; + free(plog->first); + free(plog->last); + free(plog->display); + free(plog->img_path); + + if (!plog_list_mempool) { + plog_list_mempool = plog; + } + else + if (plog_list_mempool != plog) + free(plog); + break; + case CTS_VALUE_LIST_CUSTOM_NUM_TYPE: + numtype = (numtype_list *)value; + free(numtype->name); + if (!numtype_list_mempool) { + numtype_list_mempool = numtype; + } + else + if (numtype_list_mempool != numtype) + free(numtype); + break; + case CTS_VALUE_LIST_CHANGE: + change = (change_list *)value; + if (!change_list_mempool) { + change_list_mempool = change; + } + else + if (change_list_mempool != change) + free(change); + break; + case CTS_VALUE_LIST_GROUP: + group = (cts_group *)value; + free(group->name); + + if (!group_list_mempool) { + group_list_mempool = group; + } + else + if (group_list_mempool != group) + free(group); + break; + case CTS_VALUE_LIST_ADDRBOOK: + ab = (cts_addrbook *)value; + free(ab->name); + + if (!addrbook_list_mempool) { + addrbook_list_mempool = ab; + } + else + if (addrbook_list_mempool != ab) + free(ab); + break; + case CTS_VALUE_LIST_SHORTCUT: + favorite = (shortcut_list *)value; + free(favorite->first); + free(favorite->last); + free(favorite->display); + free(favorite->number); + free(favorite->img_path); + + if (!favorite_list_mempool) { + favorite_list_mempool = favorite; + } + else + if (favorite_list_mempool != favorite) + free(favorite); + break; + case CTS_VALUE_LIST_SDN: + sdn = (sdn_list *)value; + free(sdn->name); + free(sdn->number); + + if (!sdn_list_mempool) { + sdn_list_mempool = sdn; + } + else + if (sdn_list_mempool != sdn) + free(sdn); + break; + case CTS_VALUE_RDONLY_NAME: + cts_name_free((cts_name *)value); + break; + case CTS_VALUE_RDONLY_NUMBER: + cts_number_free(value, NULL); + break; + case CTS_VALUE_RDONLY_EMAIL: + cts_email_free(value, NULL); + break; + case CTS_VALUE_RDONLY_COMPANY: + cts_company_free((cts_company *)value); + break; + case CTS_VALUE_RDONLY_PLOG: + log = (cts_plog *)value; + free(log->number); + free(log->extra_data2); + free(log); + break; + default: + ERR("The type of value is unknown type(%d)", value->v_type); + return; + } +} + +API int contacts_svc_value_free(CTSvalue *value) +{ + retv_if(NULL == value, CTS_ERR_ARG_NULL); + + if (CTS_VALUE_LIST_CONTACT <= value->v_type) + cts_internal_value_info_free(value); + else { + switch (value->v_type) { + case CTS_VALUE_GROUP: + if (value->embedded) { + free(((cts_group *)value)->name); + free(((cts_group *)value)->ringtone_path); + } + break; + case CTS_VALUE_ADDRESSBOOK: + if (value->embedded) { + free(((cts_addrbook *)value)->name); + } + break; + default: + if (value->embedded) { + DBG("This is the value of struct. It is really freed with the struct."); + return CTS_SUCCESS; + } + break; + } + free(value); + } + + return CTS_SUCCESS; +} + +API int contacts_svc_value_get_type(CTSvalue *value) +{ + retv_if(NULL == value, CTS_ERR_ARG_NULL); + + return value->v_type; +} + +static inline int cts_value_get_int_base(cts_ct_base *value, int field) +{ + int ret = 0; + + switch (field) + { + case CTS_BASE_VAL_ID_INT: + ret = value->id; + break; + case CTS_BASE_VAL_CHANGED_TIME_INT: + ret = value->changed_time; + break; + case CTS_BASE_VAL_ADDRESSBOOK_ID_INT: + ret = value->addrbook_id; + break; + default: + ERR("The field(%d) is not supported in value(Base_info)", field); + break; + } + return ret; +} + +static inline int cts_value_get_int_plog_list(plog_list *value, int field) +{ + int ret = 0; + + switch (field) + { + case CTS_LIST_PLOG_ID_INT: + ret = value->id; + break; + case CTS_LIST_PLOG_RELATED_ID_INT: + ret = value->related_id; + break; + case CTS_LIST_PLOG_NUM_TYPE_INT: + ret = value->num_type; + break; + case CTS_LIST_PLOG_LOG_TIME_INT: + ret = value->log_time; + break; + case CTS_LIST_PLOG_LOG_TYPE_INT: + ret = value->log_type; + break; + case CTS_LIST_PLOG_DURATION_INT: + case CTS_LIST_PLOG_MSGID_INT: + ret = value->extra_data1; + break; + default: + ERR("The field(%d) is not supported in value(plog list)", field); + break; + } + return ret; +} + +static inline int cts_value_get_int_plog(cts_plog *value, int field) +{ + int ret = 0; + + switch (field) + { + case CTS_PLOG_VAL_ID_INT: + ret = value->id; + break; + case CTS_PLOG_VAL_RELATED_ID_INT: + ret = value->related_id; + break; + case CTS_PLOG_VAL_LOG_TIME_INT: + ret = value->log_time; + break; + case CTS_PLOG_VAL_LOG_TYPE_INT: + ret = value->log_type; + break; + case CTS_PLOG_VAL_DURATION_INT: + case CTS_PLOG_VAL_MSGID_INT: + ret = value->extra_data1; + break; + default: + ERR("The field(%d) is not supported in value(plog)", field); + break; + } + return ret; +} + +static inline int cts_value_get_int_change_list(change_list *value, int field) +{ + int ret = 0; + + switch (field) + { + case CTS_LIST_CHANGE_ID_INT: + ret = value->id; + break; + case CTS_LIST_CHANGE_TYPE_INT: + ret = value->changed_type; + break; + case CTS_LIST_CHANGE_VER_INT: + ret = value->changed_ver; + break; + default: + ERR("The field(%d) is not supported in value(change list)", field); + break; + } + return ret; +} + +static inline int cts_value_get_int_shortcut_list(shortcut_list *value, int field) +{ + int ret = 0; + + switch (field) + { + case CTS_LIST_SHORTCUT_ID_INT: + ret = value->id; + break; + case CTS_LIST_SHORTCUT_CONTACT_ID_INT: + ret = value->contact_id; + break; + case CTS_LIST_SHORTCUT_NUMBER_TYPE_INT: + ret = value->num_type; + break; + case CTS_LIST_SHORTCUT_SPEEDDIAL_INT: + ret = value->speeddial; + break; + default: + ERR("The field(%d) is not supported in value(shorcut list)", field); + break; + } + return ret; +} + +static inline int cts_value_get_int_addrbook(cts_addrbook *value, int field) +{ + int ret = 0; + + switch (field) + { + case CTS_ADDRESSBOOK_VAL_ID_INT: + ret = value->id; + break; + case CTS_ADDRESSBOOK_VAL_ACC_ID_INT: + ret = value->acc_id; + break; + case CTS_ADDRESSBOOK_VAL_ACC_TYPE_INT: + ret = value->acc_type; + break; + case CTS_ADDRESSBOOK_VAL_MODE_INT: + ret = value->mode; + break; + default: + ERR("The field(%d) is not supported in value(addressbook)", field); + break; + } + return ret; +} + +API int contacts_svc_value_get_int(CTSvalue *value, int field) +{ + int ret = 0; + retvm_if(NULL == value, 0, "The Parameter(value) is NULL"); + + switch (value->v_type) + { + case CTS_VALUE_BASIC: + retvm_if(CTS_BASIC_VAL_INT != ((cts_basic*)value)->type, 0, + "The type of Basic_value is not integer"); + ret = ((cts_basic*)value)->val.i; + break; + case CTS_VALUE_CONTACT_BASE_INFO: + ret = cts_value_get_int_base((cts_ct_base *)value, field); + break; + case CTS_VALUE_EXTEND: + if (CTS_EXTEND_VAL_DATA1_INT == field) + ret = ((cts_extend*)value)->data1; + else + ERR("The field(%d) is not supported in value(Extend)", field); + break; + case CTS_VALUE_RDONLY_NUMBER: + case CTS_VALUE_NUMBER: + if (CTS_NUM_VAL_ID_INT == field) + ret = ((cts_number*)value)->id; + else if (CTS_NUM_VAL_TYPE_INT == field) + ret = ((cts_number*)value)->type; + else + ERR("The field(%d) is not supported in value(Number)", field); + break; + case CTS_VALUE_RDONLY_EMAIL: + case CTS_VALUE_EMAIL: + retvm_if(CTS_EMAIL_VAL_TYPE_INT != field, 0, + "The field(%d) is not supported in value(Email)", field); + ret = ((cts_email*)value)->type; + break; + case CTS_VALUE_LIST_PLOG: + ret = cts_value_get_int_plog_list((plog_list *)value, field); + break; + case CTS_VALUE_RDONLY_PLOG: + ret = cts_value_get_int_plog((cts_plog *)value, field); + break; + case CTS_VALUE_LIST_CONTACT: + case CTS_VALUE_LIST_NUMS_EMAILS: + if (CTS_LIST_CONTACT_ID_INT == field) + ret = ((contact_list *)value)->id; + else if (CTS_LIST_CONTACT_ADDRESSBOOK_ID_INT == field) + ret = ((contact_list *)value)->acc_id; + else + ERR("The field(%d) is not supported in value(contact_list)", field); + break; + case CTS_VALUE_ADDRESSBOOK: + case CTS_VALUE_LIST_ADDRBOOK: + ret = cts_value_get_int_addrbook((cts_addrbook *)value, field); + break; + case CTS_VALUE_LIST_NUMBERINFO: + case CTS_VALUE_LIST_EMAILINFO: // CTS_LIST_EMAIL_CONTACT_ID_INT is same to CTS_LIST_NUM_CONTACT_ID_INT + retvm_if(CTS_LIST_NUM_CONTACT_ID_INT != field, 0, + "The field(%d) is not supported in value(Number list)", field); + ret = ((contact_list*)value)->id; + break; + case CTS_VALUE_LIST_GROUP: + if (CTS_LIST_GROUP_ID_INT == field) + ret = ((cts_group *)value)->id; + else if (CTS_LIST_GROUP_ADDRESSBOOK_ID_INT == field) + ret = ((cts_group *)value)->addrbook_id; + else + ERR("Not supported field(%d)", field); + break; + case CTS_VALUE_LIST_CHANGE: + ret = cts_value_get_int_change_list((change_list *)value, field); + break; + case CTS_VALUE_LIST_SHORTCUT: + ret = cts_value_get_int_shortcut_list((shortcut_list *)value, field); + break; + case CTS_VALUE_MESSENGER: + if (CTS_MESSENGER_VAL_TYPE_INT == field) + ret = ((cts_messenger*)value)->type; + else + ERR("Not supported field(%d)", field); + break; + case CTS_VALUE_GROUP_RELATION: + if (CTS_GROUPREL_VAL_ID_INT == field) + ret = ((cts_group*)value)->id; + else + ERR("Not supported field(%d)", field); + break; + case CTS_VALUE_GROUP: + if (CTS_GROUP_VAL_ID_INT == field) + ret = ((cts_group*)value)->id; + if (CTS_GROUP_VAL_ADDRESSBOOK_ID_INT == field) + ret = ((cts_group*)value)->addrbook_id; + else + ERR("Not supported field(%d)", field); + break; + case CTS_VALUE_WEB: + if (CTS_WEB_VAL_TYPE_INT == field) + ret = ((cts_web*)value)->type; + else + ERR("Not supported field(%d)", field); + break; + case CTS_VALUE_POSTAL: + if (CTS_POSTAL_VAL_TYPE_INT == field) + ret = ((cts_postal*)value)->type; + else + ERR("Not supported field(%d)", field); + break; + case CTS_VALUE_EVENT: + if (CTS_EVENT_VAL_TYPE_INT == field) + ret = ((cts_event *)value)->type; + else if (CTS_EVENT_VAL_DATE_INT == field) + ret = ((cts_event *)value)->date; + else + ERR("Not supported field(%d)", field); + break; + case CTS_VALUE_PHONELOG: + /* phonelog value is write only */ + case CTS_VALUE_COMPANY: + /* company value doesn't have interger value */ + case CTS_VALUE_NAME: + /* name value doesn't have interger value */ + default: + ERR("The value has unsupported type"); + break; + } + return ret; +} + +double contacts_svc_value_get_dbl(CTSvalue *value, int field) +{ + retv_if(NULL == value, CTS_ERR_ARG_NULL); + + switch (value->v_type) + { + case CTS_VALUE_BASIC: + retvm_if(CTS_BASIC_VAL_DBL != ((cts_basic*)value)->type, 0.0, + "The type of value is not double"); + return ((cts_basic*)value)->val.d; + case CTS_VALUE_NAME: + case CTS_VALUE_EMAIL: + case CTS_VALUE_NUMBER: + case CTS_VALUE_WEB: + case CTS_VALUE_POSTAL: + case CTS_VALUE_EVENT: + case CTS_VALUE_MESSENGER: + case CTS_VALUE_GROUP_RELATION: + case CTS_VALUE_COMPANY: + default: + ERR("The value has unsupported type"); + return CTS_ERR_ARG_INVALID; + } + +} + +API bool contacts_svc_value_get_bool(CTSvalue *value, int field) +{ + retvm_if(NULL == value, false, "The Parameter(value) is NULL"); + + switch (value->v_type) + { + case CTS_VALUE_CONTACT_BASE_INFO: + if (CTS_BASE_VAL_FAVORITE_BOOL == field) { + return ((cts_ct_base*)value)->is_favorite; + } + else { + ERR("The field(%d) is not supported in value(BASE_INFO)", field); + return false; + } + case CTS_VALUE_RDONLY_NUMBER: + case CTS_VALUE_NUMBER: + if (CTS_NUM_VAL_DEFAULT_BOOL == field) { + return ((cts_number*)value)->is_default; + } + else if (CTS_NUM_VAL_DELETE_BOOL == field) { + return value->deleted; + } + else if (CTS_NUM_VAL_FAVORITE_BOOL == field) { + return ((cts_number*)value)->is_favorite; + } + else { + ERR("The field(%d) is not supported in value(Number)", field); + return false; + } + case CTS_VALUE_RDONLY_EMAIL: + case CTS_VALUE_EMAIL: + if (CTS_EMAIL_VAL_DEFAULT_BOOL == field) { + return ((cts_email*)value)->is_default; + } + else if (CTS_EMAIL_VAL_DELETE_BOOL == field) { + return value->deleted; + } + else { + ERR("The field(%d) is not supported in value(Email)", field); + return false; + } + case CTS_VALUE_GROUP_RELATION: + if (CTS_GROUPREL_VAL_DELETE_BOOL == field) { + return value->deleted; + } + else { + ERR("The field(%d) is not supported in value(Group)", field); + return false; + } + case CTS_VALUE_EVENT: + if (CTS_EVENT_VAL_DELETE_BOOL == field) { + return value->deleted; + } + else { + ERR("The field(%d) is not supported in value(Event)", field); + return false; + } + case CTS_VALUE_MESSENGER: + if (CTS_MESSENGER_VAL_DELETE_BOOL == field) { + return value->deleted; + } + else { + ERR("The field(%d) is not supported in value(Messenger)", field); + return false; + } + case CTS_VALUE_POSTAL: + if (CTS_POSTAL_VAL_DELETE_BOOL == field) { + return value->deleted; + } + else if (CTS_POSTAL_VAL_DEFAULT_BOOL == field) { + return ((cts_postal*)value)->is_default;; + } + else { + ERR("The field(%d) is not supported in value(Postal)", field); + return false; + } + case CTS_VALUE_WEB: + if (CTS_WEB_VAL_DELETE_BOOL == field) { + return value->deleted; + } + else { + ERR("The field(%d) is not supported in value(Web)", field); + return false; + } + case CTS_VALUE_NICKNAME: + if (CTS_NICKNAME_VAL_DELETE_BOOL == field) { + return value->deleted; + } + else { + ERR("The field(%d) is not supported in value(Web)", field); + return false; + } + case CTS_VALUE_EXTEND: + if (CTS_EXTEND_VAL_DELETE_BOOL == field) { + return value->deleted; + } + else { + ERR("The field(%d) is not supported in value(Extend)", field); + return false; + } + case CTS_VALUE_BASIC: + retvm_if(CTS_BASIC_VAL_BOOL != ((cts_basic*)value)->type, false, + "The type of value is not boolean"); + return ((cts_basic*)value)->val.b; + case CTS_VALUE_PHONELOG: + /* phonelog value is write only */ + case CTS_VALUE_LIST_CONTACT: + /* contact list value doesn't have boolean value */ + case CTS_VALUE_LIST_PLOG: + /* plog list value doesn't have boolean value */ + case CTS_VALUE_LIST_CUSTOM_NUM_TYPE: + /* custom number type list value doesn't have boolean value */ + case CTS_VALUE_LIST_CHANGE: + /* Change list value doesn't have boolean value */ + case CTS_VALUE_NAME: + /* name value doesn't have boolean value */ + case CTS_VALUE_COMPANY: + /* company value doesn't have boolean value */ + default: + ERR("The value has unsupported type"); + return false; + } +} + +static inline char* cts_value_get_str_name(int op_code, + cts_name *value, int field) +{ + char *ret_val; + + switch (field) + { + case CTS_NAME_VAL_FIRST_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->first); + break; + case CTS_NAME_VAL_LAST_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->last); + break; + case CTS_NAME_VAL_DISPLAY_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->display); + break; + case CTS_NAME_VAL_ADDITION_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->addition); + break; + case CTS_NAME_VAL_PREFIX_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->prefix); + break; + case CTS_NAME_VAL_SUFFIX_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->suffix); + break; + default: + ERR("The parameter(field:%d) is not interpreted", field); + ret_val = NULL; + break; + } + return ret_val; +} + +static inline char* cts_value_get_str_extend(int op_code, + cts_extend *value, int field) +{ + char *ret_val; + + switch (field) + { + case CTS_EXTEND_VAL_DATA2_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->data2); + break; + case CTS_EXTEND_VAL_DATA3_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->data3); + break; + case CTS_EXTEND_VAL_DATA4_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->data4); + break; + case CTS_EXTEND_VAL_DATA5_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->data5); + break; + case CTS_EXTEND_VAL_DATA6_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->data6); + break; + case CTS_EXTEND_VAL_DATA7_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->data7); + break; + case CTS_EXTEND_VAL_DATA8_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->data8); + break; + case CTS_EXTEND_VAL_DATA9_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->data9); + break; + case CTS_EXTEND_VAL_DATA10_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->data10); + break; + default: + ERR("The parameter(field:%d) is not interpreted", field); + ret_val = NULL; + break; + } + return ret_val; +} + +static inline char* cts_value_get_str_base(int op_code, + cts_ct_base *value, int field) +{ + char *ret_val; + + switch (field) + { + case CTS_BASE_VAL_IMG_PATH_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->img_path); + if (NULL == ret_val && value->vcard_img_path) { + if (CTS_HANDLE_STR_STEAL == op_code) + ret_val = strdup(value->vcard_img_path); + else + ret_val = value->vcard_img_path; + } + break; + case CTS_BASE_VAL_RINGTONE_PATH_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->ringtone_path); + break; + case CTS_BASE_VAL_NOTE_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->note); + break; + case CTS_BASE_VAL_UID_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->uid); + break; + case CTS_BASE_VAL_FULL_IMG_PATH_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->full_img_path); + break; + default: + ERR("The parameter(field:%d) is not interpreted", field); + ret_val = NULL; + break; + } + return ret_val; +} + +static inline char* cts_value_get_str_contact_list(int op_code, + contact_list *value, int field) +{ + char *ret_val; + switch (field) + { + case CTS_LIST_CONTACT_FIRST_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->first); + break; + case CTS_LIST_CONTACT_LAST_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->last); + break; + case CTS_LIST_CONTACT_DISPLAY_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->display); + break; + case CTS_LIST_CONTACT_IMG_PATH_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->img_path); + break; + case CTS_LIST_CONTACT_NUM_OR_EMAIL_STR: + if (CTS_VALUE_LIST_NUMS_EMAILS == value->v_type) { + HANDLE_STEAL_STRING(op_code, ret_val, value->connect); + } else { + ERR("The parameter(field:%d, value type = %d) is not interpreted", + field, value->v_type); + ret_val = NULL; + } + break; + case CTS_LIST_CONTACT_NORMALIZED_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->normalize); + break; + default: + ERR("The parameter(field:%d) is not interpreted", field); + ret_val = NULL; + break; + } + return ret_val; +} + +static inline char* cts_value_get_str_num_email_list(int op_code, + contact_list *value, int field, int type) +{ + char *ret_val; + switch (field) + { + case CTS_LIST_NUM_CONTACT_FIRST_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->first); + break; + case CTS_LIST_NUM_CONTACT_LAST_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->last); + break; + case CTS_LIST_NUM_CONTACT_DISPLAY_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->display); + break; + case CTS_LIST_NUM_CONTACT_IMG_PATH_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->img_path); + break; + case CTS_LIST_NUM_NUMBER_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->connect); + break; + default: + ERR("The parameter(field:%d) is not interpreted", field); + ret_val = NULL; + break; + } + return ret_val; +} + +static inline char* cts_value_get_str_favorite_list(int op_code, + shortcut_list *value, int field) +{ + char *ret_val; + switch (field) + { + case CTS_LIST_SHORTCUT_FIRST_NAME_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->first); + break; + case CTS_LIST_SHORTCUT_LAST_NAME_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->last); + break; + case CTS_LIST_SHORTCUT_DISPLAY_NAME_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->display); + break; + case CTS_LIST_SHORTCUT_IMG_PATH_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->img_path); + break; + case CTS_LIST_SHORTCUT_NUMBER_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->number); + break; + default: + ERR("The parameter(field:%d) is not interpreted", field); + ret_val = NULL; + break; + } + return ret_val; +} + +static inline char* cts_value_get_str_plog_list(int op_code, + plog_list *value, int field) +{ + char *ret_val; + switch (field) + { + case CTS_LIST_PLOG_FIRST_NAME_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->first); + break; + case CTS_LIST_PLOG_LAST_NAME_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->last); + break; + case CTS_LIST_PLOG_DISPLAY_NAME_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->display); + break; + case CTS_LIST_PLOG_NUMBER_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->number); + break; + case CTS_LIST_PLOG_IMG_PATH_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->img_path); + break; + case CTS_LIST_PLOG_SHORTMSG_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->extra_data2); + break; + default: + ERR("The parameter(field:%d) is not interpreted", field); + ret_val = NULL; + break; + } + return ret_val; +} + +static inline char* cts_value_get_str_postal(int op_code, + cts_postal *value, int field) +{ + char *ret_val; + switch (field) + { + case CTS_POSTAL_VAL_POBOX_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->pobox); + break; + case CTS_POSTAL_VAL_POSTALCODE_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->postalcode); + break; + case CTS_POSTAL_VAL_REGION_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->region); + break; + case CTS_POSTAL_VAL_LOCALITY_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->locality); + break; + case CTS_POSTAL_VAL_STREET_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->street); + break; + case CTS_POSTAL_VAL_EXTENDED_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->extended); + break; + case CTS_POSTAL_VAL_COUNTRY_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->country); + break; + default: + ERR("The parameter(field:%d) is not interpreted", field); + ret_val = NULL; + break; + } + return ret_val; +} + +static inline char* cts_value_get_str_company(int op_code, + cts_company *value, int field) +{ + char *ret_val; + switch (field) + { + case CTS_COMPANY_VAL_NAME_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->name); + break; + case CTS_COMPANY_VAL_DEPARTMENT_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->department); + break; + case CTS_COMPANY_VAL_JOB_TITLE_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->jot_title); + break; + case CTS_COMPANY_VAL_ROLE_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->role); + break; + case CTS_COMPANY_VAL_ASSISTANT_NAME_STR: + HANDLE_STEAL_STRING(op_code, ret_val, value->assistant_name); + break; + default: + ERR("The parameter(field:%d) is not interpreted", field); + ret_val = NULL; + break; + } + return ret_val; +} + +static char* cts_value_handle_str(int op_code, CTSvalue *value, int field) +{ + char *ret_val; + retvm_if(NULL == value, NULL, "The Parameter(value) is NULL"); + + switch (value->v_type) + { + case CTS_VALUE_BASIC: + retvm_if(CTS_BASIC_VAL_STR != ((cts_basic *)value)->type, NULL, + "The type of value is not string"); + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_basic *)value)->val.s); + break; + case CTS_VALUE_CONTACT_BASE_INFO: + ret_val = cts_value_get_str_base(op_code, (cts_ct_base *)value, field); + break; + case CTS_VALUE_POSTAL: + ret_val = cts_value_get_str_postal(op_code, (cts_postal *)value, field); + break; + case CTS_VALUE_COMPANY: + case CTS_VALUE_RDONLY_COMPANY: + ret_val = cts_value_get_str_company(op_code, (cts_company *)value, field); + break; + case CTS_VALUE_NAME: + case CTS_VALUE_RDONLY_NAME: + ret_val = cts_value_get_str_name(op_code, (cts_name *)value, field); + break; + case CTS_VALUE_EXTEND: + ret_val = cts_value_get_str_extend(op_code, (cts_extend *)value, field); + break; + case CTS_VALUE_LIST_CONTACT: + case CTS_VALUE_LIST_NUMS_EMAILS: + ret_val = cts_value_get_str_contact_list(op_code, (contact_list *)value, field); + break; + case CTS_VALUE_LIST_NUMBERINFO: + case CTS_VALUE_LIST_EMAILINFO: + ret_val = cts_value_get_str_num_email_list(op_code, (contact_list *)value, field, value->v_type); + break; + case CTS_VALUE_LIST_SHORTCUT: + ret_val = cts_value_get_str_favorite_list(op_code, (shortcut_list *)value, field); + break; + case CTS_VALUE_LIST_PLOG: + ret_val = cts_value_get_str_plog_list(op_code, (plog_list *)value, field); + break; + case CTS_VALUE_RDONLY_PLOG: + if (CTS_PLOG_VAL_NUMBER_STR == field) { + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_plog *)value)->number); + } else if (CTS_PLOG_VAL_SHORTMSG_STR == field) { + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_plog *)value)->extra_data2); + } else { + ERR("Not supported field"); + return NULL; + } + break; + case CTS_VALUE_NUMBER: + case CTS_VALUE_RDONLY_NUMBER: + retvm_if(CTS_NUM_VAL_NUMBER_STR != field, NULL, + "This field(%d) is not supported in value(Number)", field); + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_number *)value)->number); + break; + case CTS_VALUE_EMAIL: + case CTS_VALUE_RDONLY_EMAIL: + retvm_if(CTS_EMAIL_VAL_ADDR_STR != field, NULL, + "This field(%d) is not supported in value(Email)", field); + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_email *)value)->email_addr); + break; + case CTS_VALUE_ADDRESSBOOK: + case CTS_VALUE_LIST_ADDRBOOK: + retvm_if(CTS_ADDRESSBOOK_VAL_NAME_STR != field, NULL, + "This field(%d) is not supported in value(addressbook)", field); + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_addrbook *)value)->name); + break; + case CTS_VALUE_GROUP_RELATION: + if (CTS_GROUPREL_VAL_NAME_STR == field) { + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_group *)value)->name); + } + else if (CTS_GROUPREL_VAL_RINGTONE_STR == field) { + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_group *)value)->ringtone_path); + } + else { + ERR("Not supported field(%d)", field); + ret_val = NULL; + } + break; + case CTS_VALUE_MESSENGER: + if (CTS_MESSENGER_VAL_IM_ID_STR == field) { + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_messenger *)value)->im_id); + } + else { + ERR("Not supported field(%d)", field); + ret_val = NULL; + } + break; + case CTS_VALUE_WEB: + if (CTS_WEB_VAL_ADDR_STR == field) { + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_web *)value)->url); + } + else { + ERR("Not supported field(%d)", field); + ret_val = NULL; + } + break; + case CTS_VALUE_NICKNAME: + if (CTS_NICKNAME_VAL_NAME_STR == field) { + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_nickname *)value)->nick); + } + else { + ERR("Not supported field(%d)", field); + ret_val = NULL; + } + break; + case CTS_VALUE_GROUP: + if (CTS_GROUP_VAL_NAME_STR == field) { + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_group *)value)->name); + } + else if (CTS_GROUP_VAL_RINGTONE_STR == field) { + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_group *)value)->ringtone_path); + } + else { + ERR("Not supported field(%d)", field); + ret_val = NULL; + } + break; + case CTS_VALUE_LIST_GROUP: + if (CTS_LIST_GROUP_NAME_STR == field) { + HANDLE_STEAL_STRING(op_code, ret_val, ((cts_group *)value)->name); + } + else { + ERR("Not supported field(%d)", field); + ret_val = NULL; + } + break; + case CTS_VALUE_LIST_SDN: + if (CTS_LIST_SDN_NAME_STR == field) { + HANDLE_STEAL_STRING(op_code, ret_val, ((sdn_list *)value)->name); + } + else if (CTS_LIST_SDN_NUMBER_STR == field) { + HANDLE_STEAL_STRING(op_code, ret_val, ((sdn_list *)value)->number); + } + else { + ERR("Not supported field(%d)", field); + ret_val = NULL; + } + break; + case CTS_VALUE_PHONELOG: + /* phonelog value is write only */ + case CTS_VALUE_LIST_CHANGE: + /* Change list value doesn't have string value */ + case CTS_VALUE_EVENT: + /* evet value doesn't have string value */ + default: + ERR("The value has unsupported type"); + ret_val = NULL; + break; + } + return ret_val; +} + +API const char* contacts_svc_value_get_str(CTSvalue *value, int field) +{ + return cts_value_handle_str(CTS_HANDLE_STR_GET, value, field); +} + +API char* contacts_svc_value_steal_str(CTSvalue *value, int field) +{ + return cts_value_handle_str(CTS_HANDLE_STR_STEAL, value, field); +} + +static inline int cts_value_set_int_plog(cts_plog *value, int field, int intval) +{ + switch (field) + { + case CTS_PLOG_VAL_LOG_TIME_INT: + value->log_time = intval; + break; + case CTS_PLOG_VAL_LOG_TYPE_INT: + value->log_type = intval; + break; + case CTS_PLOG_VAL_DURATION_INT: + case CTS_PLOG_VAL_MSGID_INT: + value->extra_data1 = intval; + break; + case CTS_PLOG_VAL_RELATED_ID_INT: + value->related_id = intval; + break; + default: + ERR("The field(%d) is not supported in value(plog)", field); + return CTS_ERR_ARG_INVALID; + } + return CTS_SUCCESS; +} + +static inline int cts_value_set_int_addrbook(cts_addrbook *value, + int field, int intval) +{ + switch (field) + { + case CTS_ADDRESSBOOK_VAL_ACC_ID_INT: + value->acc_id = intval; + break; + case CTS_ADDRESSBOOK_VAL_ACC_TYPE_INT: + value->acc_type = intval; + break; + case CTS_ADDRESSBOOK_VAL_MODE_INT: + value->mode = intval; + break; + default: + ERR("The field(%d) is not supported in value(addressbook)", field); + return CTS_ERR_ARG_INVALID; + } + return CTS_SUCCESS; +} + +API int contacts_svc_value_set_int(CTSvalue *value, int field, int intval) +{ + retv_if(NULL == value, CTS_ERR_ARG_NULL); + + switch (value->v_type) + { + case CTS_VALUE_BASIC: + ((cts_basic*)value)->type = CTS_BASIC_VAL_INT; + ((cts_basic*)value)->val.i = intval; + break; + case CTS_VALUE_EXTEND: + retvm_if(CTS_EXTEND_VAL_DATA1_INT != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + ((cts_extend *)value)->data1 = intval; + break; + case CTS_VALUE_EMAIL: + case CTS_VALUE_NUMBER: + retvm_if(CTS_NUM_VAL_TYPE_INT != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + ((cts_number *)value)->type = intval; + break; + case CTS_VALUE_PHONELOG: + return cts_value_set_int_plog((cts_plog *)value, field, intval); + case CTS_VALUE_GROUP_RELATION: + retvm_if(CTS_GROUPREL_VAL_ID_INT != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + retvm_if(value->embedded, CTS_ERR_ARG_INVALID, + "The field is only used for creating"); + ((cts_group *)value)->id = intval; + break; + case CTS_VALUE_GROUP: + retvm_if(CTS_GROUP_VAL_ADDRESSBOOK_ID_INT != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + retvm_if(!value->embedded, CTS_ERR_ARG_INVALID, + "The field is only used for updating"); + ((cts_group *)value)->addrbook_id = intval; + break; + case CTS_VALUE_MESSENGER: + retvm_if(CTS_MESSENGER_VAL_TYPE_INT != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + ((cts_messenger *)value)->type = intval; + break; + case CTS_VALUE_WEB: + retvm_if(CTS_WEB_VAL_TYPE_INT != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + ((cts_web *)value)->type = intval; + break; + case CTS_VALUE_EVENT: + if (CTS_EVENT_VAL_TYPE_INT == field) + ((cts_event *)value)->type = intval; + else if (CTS_EVENT_VAL_DATE_INT == field) + ((cts_event *)value)->date = intval; + else + { + ERR("Not supported field"); + return CTS_ERR_ARG_INVALID; + } + break; + case CTS_VALUE_POSTAL: + retvm_if(CTS_POSTAL_VAL_TYPE_INT != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + ((cts_postal *)value)->type = intval; + break; + case CTS_VALUE_ADDRESSBOOK: + return cts_value_set_int_addrbook((cts_addrbook *)value, field, intval); + case CTS_VALUE_COMPANY: + /* company value doesn't have integer value */ + case CTS_VALUE_NAME: + /* name value doesn't have integer value */ + case CTS_VALUE_CONTACT_BASE_INFO: + /* base_info value doesn't have integer value for set */ + default: + ERR("The value has unsupported type"); + return CTS_ERR_ARG_INVALID; + } + + return CTS_SUCCESS; +} + +int contacts_svc_value_set_dbl(CTSvalue *value, int field, double dblval) +{ + retv_if(NULL == value, CTS_ERR_ARG_NULL); + + switch (value->v_type) + { + case CTS_VALUE_BASIC: + ((cts_basic*)value)->type = CTS_BASIC_VAL_DBL; + ((cts_basic*)value)->val.d = dblval; + break; + case CTS_VALUE_EMAIL: + case CTS_VALUE_NUMBER: + case CTS_VALUE_WEB: + case CTS_VALUE_POSTAL: + case CTS_VALUE_EVENT: + case CTS_VALUE_MESSENGER: + case CTS_VALUE_GROUP_RELATION: + case CTS_VALUE_COMPANY: + case CTS_VALUE_NAME: + case CTS_VALUE_CONTACT_BASE_INFO: + default: + ERR("The value has unsupported type"); + return CTS_ERR_ARG_INVALID; + } + + return CTS_SUCCESS; +} + +API int contacts_svc_value_set_bool(CTSvalue *value, + int field, bool boolval) +{ + retv_if(NULL == value, CTS_ERR_ARG_NULL); + + switch (value->v_type) + { + case CTS_VALUE_CONTACT_BASE_INFO: + if (CTS_BASE_VAL_FAVORITE_BOOL == field) + ((cts_ct_base*)value)->is_favorite = boolval; + else { + ERR("The field(%d) is not supported in value(BASE_INFO)", field); + return CTS_ERR_ARG_INVALID; + } + break; + case CTS_VALUE_NUMBER: + if (CTS_NUM_VAL_DEFAULT_BOOL == field) + ((cts_number *)value)->is_default = boolval; + else if (CTS_NUM_VAL_FAVORITE_BOOL == field) + ((cts_number *)value)->is_favorite = boolval; + else if (CTS_NUM_VAL_DELETE_BOOL == field) { + retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, + "The field is only used for updating"); + value->deleted = boolval; + } + else { + ERR("Not supported field"); + return CTS_ERR_ARG_INVALID; + } + break; + case CTS_VALUE_EMAIL: + if (CTS_EMAIL_VAL_DEFAULT_BOOL == field) + ((cts_email *)value)->is_default = boolval; + else if (CTS_EMAIL_VAL_DELETE_BOOL == field) { + retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, + "The field is only used for updating"); + value->deleted = boolval; + } + else { + ERR("Not supported field"); + return CTS_ERR_ARG_INVALID; + } + break; + case CTS_VALUE_POSTAL: + if (CTS_POSTAL_VAL_DEFAULT_BOOL == field) + ((cts_postal *)value)->is_default = boolval; + else if (CTS_POSTAL_VAL_DELETE_BOOL == field) { + retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, + "The field is only used for updating"); + value->deleted = boolval; + } + else { + ERR("Not supported field"); + return CTS_ERR_ARG_INVALID; + } + break; + case CTS_VALUE_GROUP_RELATION: + retvm_if(CTS_GROUPREL_VAL_DELETE_BOOL != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, + "The field is only used for updating"); + value->deleted = boolval; + break; + case CTS_VALUE_EVENT: + retvm_if(CTS_EVENT_VAL_DELETE_BOOL != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, + "The field is only used for updating"); + value->deleted = boolval; + break; + case CTS_VALUE_MESSENGER: + retvm_if(CTS_MESSENGER_VAL_DELETE_BOOL != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, + "The field is only used for updating"); + value->deleted = boolval; + break; + case CTS_VALUE_WEB: + retvm_if(CTS_WEB_VAL_DELETE_BOOL != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, + "The field is only used for updating"); + value->deleted = boolval; + break; + case CTS_VALUE_NICKNAME: + retvm_if(CTS_NICKNAME_VAL_DELETE_BOOL != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, + "The field is only used for updating"); + value->deleted = boolval; + break; + case CTS_VALUE_EXTEND: + retvm_if(CTS_EXTEND_VAL_DELETE_BOOL != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + retvm_if(false == value->embedded, CTS_ERR_ARG_INVALID, + "The field is only used for updating"); + value->deleted = boolval; + break; + case CTS_VALUE_BASIC: + ((cts_basic*)value)->type = CTS_BASIC_VAL_BOOL; + ((cts_basic*)value)->val.b = boolval; + break; + case CTS_VALUE_COMPANY: + /* company value doesn't have boolean value */ + case CTS_VALUE_NAME: + /* name value doesn't have boolean value */ + default: + ERR("The value has unsupported type"); + return CTS_ERR_ARG_INVALID; + } + + return CTS_SUCCESS; +} + +static inline int cts_base_set_str(cts_ct_base *base, int field, char *strval) +{ + switch (field) + { + case CTS_BASE_VAL_IMG_PATH_STR: + if (base->embedded) + FREEandSTRDUP(base->img_path, strval); + else + base->img_path = strval; + base->img_changed = true; + break; + case CTS_BASE_VAL_RINGTONE_PATH_STR: + if (base->embedded) + FREEandSTRDUP(base->ringtone_path, strval); + else + base->ringtone_path = strval; + base->ringtone_changed = true; + break; + case CTS_BASE_VAL_NOTE_STR: + if (base->embedded) + FREEandSTRDUP(base->note, strval); + else + base->note = strval; + base->note_changed = true; + break; + case CTS_BASE_VAL_UID_STR: + if (base->embedded) + FREEandSTRDUP(base->uid, strval); + else + base->uid = strval; + base->uid_changed = true; + break; + case CTS_BASE_VAL_FULL_IMG_PATH_STR: + if (base->embedded) + FREEandSTRDUP(base->full_img_path, strval); + else + base->full_img_path = strval; + base->full_img_changed = true; + break; + default: + ERR("Not supported field"); + return CTS_ERR_ARG_INVALID; + } + return CTS_SUCCESS; +} + +static inline int cts_name_set_str(cts_name *name, int field, char *strval) +{ + switch (field) + { + case CTS_NAME_VAL_FIRST_STR: + if (name->embedded) { + FREEandSTRDUP(name->first, strval); + } + else + name->first = strval; + break; + case CTS_NAME_VAL_LAST_STR: + if (name->embedded) { + FREEandSTRDUP(name->last, strval); + } + else + name->last = strval; + break; + case CTS_NAME_VAL_ADDITION_STR: + if (name->embedded) { + FREEandSTRDUP(name->addition, strval); + } + else + name->addition = strval; + break; + case CTS_NAME_VAL_DISPLAY_STR: + if (name->embedded) { + FREEandSTRDUP(name->display, strval); + } + else + name->display = strval; + break; + case CTS_NAME_VAL_PREFIX_STR: + if (name->embedded) { + FREEandSTRDUP(name->prefix, strval); + } + else + name->prefix = strval; + break; + case CTS_NAME_VAL_SUFFIX_STR: + if (name->embedded) { + FREEandSTRDUP(name->suffix, strval); + } + else + name->suffix = strval; + break; + default: + ERR("Not supported field"); + return CTS_ERR_ARG_INVALID; + } + name->is_changed = true; + return CTS_SUCCESS; +} + +static inline int cts_postal_set_str(cts_postal *postal, int field, char *strval) +{ + switch (field) + { + case CTS_POSTAL_VAL_POBOX_STR: + if (postal->embedded) { + FREEandSTRDUP(postal->pobox, strval); + } + else + postal->pobox = strval; + break; + case CTS_POSTAL_VAL_POSTALCODE_STR: + if (postal->embedded) { + FREEandSTRDUP(postal->postalcode, strval); + } + else + postal->postalcode = strval; + break; + case CTS_POSTAL_VAL_REGION_STR: + if (postal->embedded) { + FREEandSTRDUP(postal->region, strval); + } + else + postal->region = strval; + break; + case CTS_POSTAL_VAL_LOCALITY_STR: + if (postal->embedded) { + FREEandSTRDUP(postal->locality, strval); + } + else + postal->locality = strval; + break; + case CTS_POSTAL_VAL_STREET_STR: + if (postal->embedded) { + FREEandSTRDUP(postal->street, strval); + } + else + postal->street = strval; + break; + case CTS_POSTAL_VAL_EXTENDED_STR: + if (postal->embedded) { + FREEandSTRDUP(postal->extended, strval); + } + else + postal->extended = strval; + break; + case CTS_POSTAL_VAL_COUNTRY_STR: + if (postal->embedded) { + FREEandSTRDUP(postal->country, strval); + } + else + postal->country = strval; + break; + default: + ERR("Not supported field"); + return CTS_ERR_ARG_INVALID; + } + return CTS_SUCCESS; +} + +static inline int cts_company_set_str( + cts_company *com, int field, char *strval) +{ + switch (field) + { + case CTS_COMPANY_VAL_NAME_STR: + if (com->embedded) { + FREEandSTRDUP(com->name, strval); + } + else + com->name = strval; + break; + case CTS_COMPANY_VAL_DEPARTMENT_STR: + if (com->embedded) { + FREEandSTRDUP(com->department, strval); + } + else + com->department = strval; + break; + case CTS_COMPANY_VAL_JOB_TITLE_STR: + if (com->embedded) { + FREEandSTRDUP(com->jot_title, strval); + } + else + com->jot_title = strval; + break; + case CTS_COMPANY_VAL_ROLE_STR: + if (com->embedded) { + FREEandSTRDUP(com->role, strval); + } + else + com->role = strval; + break; + case CTS_COMPANY_VAL_ASSISTANT_NAME_STR: + if (com->embedded) { + FREEandSTRDUP(com->assistant_name, strval); + } + else + com->assistant_name = strval; + break; + default: + ERR("Not supported field"); + return CTS_ERR_ARG_INVALID; + } + return CTS_SUCCESS; +} + +static inline int cts_group_set_str( + cts_group *group, int field, char *strval) +{ + switch (field) + { + case CTS_GROUP_VAL_NAME_STR: + if (group->embedded) { + FREEandSTRDUP(group->name, strval); + } + else + group->name = strval; + break; + case CTS_GROUP_VAL_RINGTONE_STR: + if (group->embedded) { + FREEandSTRDUP(group->ringtone_path, strval); + } + else + group->ringtone_path = strval; + break; + default: + ERR("Not supported field"); + return CTS_ERR_ARG_INVALID; + } + return CTS_SUCCESS; +} + +static inline int cts_extend_set_str(cts_extend *extend, int field, char *strval) +{ + switch (field) + { + case CTS_EXTEND_VAL_DATA2_STR: + if (extend->embedded) { + FREEandSTRDUP(extend->data2, strval); + } + else + extend->data2 = strval; + break; + case CTS_EXTEND_VAL_DATA3_STR: + if (extend->embedded) { + FREEandSTRDUP(extend->data3, strval); + } + else + extend->data3 = strval; + break; + case CTS_EXTEND_VAL_DATA4_STR: + if (extend->embedded) { + FREEandSTRDUP(extend->data4, strval); + } + else + extend->data4 = strval; + break; + case CTS_EXTEND_VAL_DATA5_STR: + if (extend->embedded) { + FREEandSTRDUP(extend->data5, strval); + } + else + extend->data5 = strval; + break; + case CTS_EXTEND_VAL_DATA6_STR: + if (extend->embedded) { + FREEandSTRDUP(extend->data6, strval); + } + else + extend->data6 = strval; + break; + case CTS_EXTEND_VAL_DATA7_STR: + if (extend->embedded) { + FREEandSTRDUP(extend->data7, strval); + } + else + extend->data7 = strval; + break; + case CTS_EXTEND_VAL_DATA8_STR: + if (extend->embedded) { + FREEandSTRDUP(extend->data8, strval); + } + else + extend->data8 = strval; + break; + case CTS_EXTEND_VAL_DATA9_STR: + if (extend->embedded) { + FREEandSTRDUP(extend->data9, strval); + } + else + extend->data9 = strval; + break; + + case CTS_EXTEND_VAL_DATA10_STR: + if (extend->embedded) { + FREEandSTRDUP(extend->data10, strval); + } + else + extend->data10 = strval; + break; + default: + ERR("Not supported field"); + return CTS_ERR_ARG_INVALID; + } + return CTS_SUCCESS; +} + +API int contacts_svc_value_set_str(CTSvalue *value, int field, const char *strval) +{ + char *str; + + retv_if(NULL == value, CTS_ERR_ARG_NULL); + + if (strval && *strval) + str = (char *)strval; + else + str = NULL; + + switch (value->v_type) + { + case CTS_VALUE_BASIC: + ((cts_basic*)value)->type = CTS_BASIC_VAL_STR; + if (value->embedded) + FREEandSTRDUP(((cts_basic*)value)->val.s, str); + else + ((cts_basic*)value)->val.s = str; + break; + case CTS_VALUE_CONTACT_BASE_INFO: + return cts_base_set_str((cts_ct_base *)value, field, str); + case CTS_VALUE_NAME: + return cts_name_set_str((cts_name *)value, field, str); + case CTS_VALUE_POSTAL: + return cts_postal_set_str((cts_postal *)value, field, str); + case CTS_VALUE_COMPANY: + return cts_company_set_str((cts_company *)value, field, str); + case CTS_VALUE_GROUP: + return cts_group_set_str((cts_group *)value, field, str); + case CTS_VALUE_EXTEND: + return cts_extend_set_str((cts_extend *)value, field, str); + case CTS_VALUE_NUMBER: + retvm_if(CTS_NUM_VAL_NUMBER_STR != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + if (value->embedded) + FREEandSTRDUP(((cts_number*)value)->number, str); + else + ((cts_number *)value)->number = str; + break; + case CTS_VALUE_EMAIL: + retvm_if(CTS_EMAIL_VAL_ADDR_STR != field, CTS_ERR_ARG_INVALID, "Not supported field"); + if (value->embedded) + FREEandSTRDUP(((cts_email*)value)->email_addr, str); + else + ((cts_email *)value)->email_addr = str; + break; + case CTS_VALUE_GROUP_RELATION: + retvm_if(CTS_GROUPREL_VAL_NAME_STR != field, CTS_ERR_ARG_INVALID, + "Not supported field(%d) for CTS_VALUE_GROUP_RELATION", field); + retvm_if(value->embedded, CTS_ERR_ARG_INVALID, + "CTS_GROUPREL_VAL_NAME_STR is readonly"); + ((cts_group *)value)->name = str; + break; + case CTS_VALUE_PHONELOG: /* phonelog value never be embedded*/ + if (CTS_PLOG_VAL_NUMBER_STR == field) + ((cts_plog *)value)->number = str; + else if (CTS_PLOG_VAL_SHORTMSG_STR == field) + ((cts_plog *)value)->extra_data2 = str; + else + { + ERR("Not supported field"); + return CTS_ERR_ARG_INVALID; + } + break; + case CTS_VALUE_MESSENGER: + retvm_if(CTS_MESSENGER_VAL_IM_ID_STR != field, CTS_ERR_ARG_INVALID, "Not supported field"); + if (value->embedded) + FREEandSTRDUP(((cts_messenger *)value)->im_id, str); + else + ((cts_messenger *)value)->im_id = str; + break; + case CTS_VALUE_WEB: + retvm_if(CTS_WEB_VAL_ADDR_STR != field, CTS_ERR_ARG_INVALID, "Not supported field"); + if (value->embedded) + FREEandSTRDUP(((cts_web *)value)->url, str); + else + ((cts_web *)value)->url = str; + break; + case CTS_VALUE_NICKNAME: + retvm_if(CTS_NICKNAME_VAL_NAME_STR != field, CTS_ERR_ARG_INVALID, "Not supported field"); + if (value->embedded) + FREEandSTRDUP(((cts_nickname *)value)->nick, str); + else + ((cts_nickname *)value)->nick = str; + break; + case CTS_VALUE_ADDRESSBOOK: + retvm_if(CTS_ADDRESSBOOK_VAL_NAME_STR != field, CTS_ERR_ARG_INVALID, + "Not supported field"); + if (value->embedded) + FREEandSTRDUP(((cts_addrbook *)value)->name, str); + else + ((cts_addrbook *)value)->name = str; + break; + case CTS_VALUE_EVENT: + /* evet value doesn't have string value */ + default: + ERR("The value has unsupported type"); + return CTS_ERR_ARG_INVALID; + } + + return CTS_SUCCESS; +} |