/* * Contacts Service * * Copyright (c) 2010 - 2012 Samsung Electronics Co., Ltd. All rights reserved. * * Contact: Youngjae Shin * * 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 #include #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; }