diff options
Diffstat (limited to 'lib/details/ct-input-utils.cpp')
-rwxr-xr-x | lib/details/ct-input-utils.cpp | 1762 |
1 files changed, 1762 insertions, 0 deletions
diff --git a/lib/details/ct-input-utils.cpp b/lib/details/ct-input-utils.cpp new file mode 100755 index 0000000..6023741 --- /dev/null +++ b/lib/details/ct-input-utils.cpp @@ -0,0 +1,1762 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * 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 <regex.h> +#include <errno.h> +#include <aul.h> +#include <ui-gadget-module.h> +#include <vconf.h> +#include <vconf-keys.h> +#include <fcntl.h> +#include <app_service.h> +#include <assert.h> + +#include "phone.h" +#include "ct-list.h" +#include "ct-detail.h" +#include "ct-detail-utils.h" +#include "ct-detail-vibration.h" +#include "ct-input-utils.h" +#include "ct-input-view.h" + +#define CT_INPUT_BASE_ADDRBOOK UGDATAIDR"/base_addrbook" + +/** + * @brief This function gets count of events related to @a contactRecord + * @param contactRecord Record attached to _contacts_contact table + * @return Count of events related to contact on success, otherwise 0 + */ +static unsigned int getCountOfEvents(contacts_record_h contactRecord) +{ + unsigned int count(0); + + if(contactRecord) + { + if(CONTACTS_ERROR_NONE != contacts_record_get_child_record_count( + contactRecord, _contacts_contact.event, &count)) + { + count = 0; + } + } + + return count; +} + +static void input_set_base_ab(char* ab_name) +{ + PH_TRACE; + int fd; + char buf[PH_TEXT_MAX_LEN + 1] = { 0 }; + p_ret_if(NULL == ab_name); + fd = open(CT_INPUT_BASE_ADDRBOOK, O_WRONLY | O_CREAT | O_TRUNC, 0644); + p_retm_if(fd < 0, "Open(%s) Failed", CT_INPUT_BASE_ADDRBOOK); + snprintf(buf, sizeof(buf), "%s", ab_name); + if (-1 == write(fd, buf, strlen(buf))) + ERR("write()... Failed(%s)", strerror(errno)); + close(fd); +} + +int ct_input_get_base_ab(void) +{ + PH_TRACE; + int fd = 0; + int size = 0; + char buf[PH_TEXT_MAX_LEN + 1] = { 0, }; + + fd = open(CT_INPUT_BASE_ADDRBOOK, O_RDONLY); + p_retvm_if(fd < 0, 0, "Open(%s) Failed", CT_INPUT_BASE_ADDRBOOK); + size = read(fd, buf, sizeof(buf)); + close(fd); + + if (size > 0) + return ctui_get_addressbook_id(buf); + else + return 0; +} + +static void input_change_photo(ct_input_data *cinput_d, const char *normal, + const char *full) +{ + PH_TRACE; + contacts_record_h record = NULL; + int err = CONTACTS_ERROR_NONE; + + record = ctui_get_record_image(cinput_d->contact); + p_retm_if(NULL == record, "ctui_get_record_image() Failed(%d)"); + + err = contacts_record_set_str(record, _contacts_image.path, normal); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_str() Failed(%d)"); + + ct_input_update_image(cinput_d); +} + +static void input_img_crop_result(ui_gadget_h ug, service_h service, void *data) +{ + PH_TRACE; + char *normal = NULL; + char *full = NULL; + ct_input_data *cinput_d = (ct_input_data *) data; + + p_retm_if(NULL == ug || NULL == data, "ug or data is NULL"); + + if (service) + { + service_get_extra_data(service, "crop_image_path", &normal); + p_retm_if(!normal, "return value is NULL.\n"); + + service_get_extra_data(service, "image_path", &full); + input_change_photo(cinput_d, normal, full); + free(normal); + } +} + +static void input_src_ug_destroy(ui_gadget_h ug, void *priv) +{ + PH_TRACE; + ct_input_data *cinput_d = (ct_input_data *) priv; + p_retm_if(NULL == cinput_d, "cinput_d is NULL"); + p_retm_if(NULL == ug, "ug is NULL"); + + if (cinput_d->child_ug) + { + ug_destroy(cinput_d->child_ug); + cinput_d->child_ug = NULL; + } + + elm_object_tree_focus_allow_set(cinput_d->cdetail_d->navi, EINA_TRUE); +} + +static void input_crop_ug_back_cb(void *data); + +static void input_crop_ug_destroy(ui_gadget_h ug, void *priv) +{ + PH_TRACE; + ct_input_data *cinput_d = (ct_input_data *) priv; + + p_retm_if(NULL == cinput_d, "cinput_d is NULL"); + elm_object_tree_focus_allow_set(cinput_d->cdetail_d->navi, EINA_TRUE); + p_retm_if(NULL == ug, "ug is NULL"); + + if (cinput_d->crop_ug) + { + ug_destroy(ug); + cinput_d->crop_ug = NULL; + } + + if(cinput_d->back_cb == input_crop_ug_back_cb) + { + cinput_d->back_cb = NULL; + } +} + +static void input_crop_ug_back_cb(void *data) +{ + PH_TRACE; + ct_input_data *cinput_d = (ct_input_data *) data; + p_retm_if(NULL == cinput_d, "cinput_d is NULL"); + input_crop_ug_destroy(cinput_d->crop_ug, data); +} + +static void input_gallery_result(ui_gadget_h ug, service_h service, void *data) +{ + PH_TRACE; + char *val = NULL; + ct_input_data *cinput_d = (ct_input_data *) data; + + p_retm_if(NULL == ug || NULL == data, "ug or data is NULL"); + + if (service) + { + struct ug_cbs cbs = { 0 }; + + service_get_extra_data(service, "path", &val); + p_retm_if(!val, "return value is NULL.\n"); + + cbs.result_cb = input_img_crop_result; + cbs.destroy_cb = input_crop_ug_destroy; + cbs.priv = cinput_d; + cinput_d->crop_ug = (ui_gadget_h) phone_image_crop_ug(cinput_d->cdetail_d->ug, val, + &cbs); + cinput_d->back_cb = input_crop_ug_back_cb; + free(val); + } +} + +void ct_input_gallery(ct_input_data *cinput_d) +{ + PH_TRACE; + struct ug_cbs cbs = { 0 }; + service_h service = NULL; + + p_retm_if(NULL == cinput_d, "cinput_d is NULL"); + elm_object_tree_focus_allow_set(cinput_d->cdetail_d->navi, EINA_FALSE); + + service_create(&service); + service_add_extra_data(service, "launch-type", "select-one"); + service_add_extra_data(service, "file-type", "image"); + + cbs.result_cb = input_gallery_result; + cbs.destroy_cb = input_src_ug_destroy; + cbs.layout_cb = ug_common_layout_cb; + cbs.priv = cinput_d; + + cinput_d->child_ug = ug_create(cinput_d->cdetail_d->ug, GALLERY_UG, + UG_MODE_FULLVIEW, service, &cbs); + p_warn_if(NULL == cinput_d->child_ug, "ug_create() Failed"); + + service_destroy(service); + + if (cinput_d->cdetail_d->popup) + { + evas_object_del(cinput_d->cdetail_d->popup); + cinput_d->cdetail_d->popup = NULL; + } +} + +static void input_camera_result(service_h service, service_h reply, + service_result_e result, void* user_data) +{ + PH_TRACE; + char *normal = NULL; + char *full = NULL; + ct_input_data *cinput_d = (ct_input_data *) user_data; + + cinput_d->camera_service_launched = false; + + elm_object_tree_focus_allow_set(cinput_d->cdetail_d->navi, EINA_TRUE); + + service_get_extra_data(reply, "crop_image_path", &normal); + p_retm_if(!normal, "return value is NULL.\n"); + + service_get_extra_data(reply, "image_path", &full); + input_change_photo(cinput_d, normal, full); + + free(normal); + free(full); +} + +void ct_input_camera(ct_input_data *cinput_d) +{ + PH_TRACE; + int ret; + service_h service; + + p_retm_if(NULL == cinput_d, "paramter(ct_input_data) is NULL"); + p_retm_if(NULL == cinput_d->cdetail_d, "cinput_d->cdetail_d is NULL.\n"); + p_ret_if(true == cinput_d->camera_service_launched); + + if (cinput_d->cdetail_d && cinput_d->cdetail_d->popup) + ct_detail_popup_hide_cb(cinput_d->cdetail_d, NULL, NULL); + + service = NULL; + ret = service_create(&service); + p_retm_if(SERVICE_ERROR_NONE != ret, "service_create() Failed(%d)", ret); + + if (NULL == cinput_d->cdetail_d->win) + { + ERR("cinput_d->cdetail_d->win is NULL.\n"); + ret = service_destroy(service); + p_retm_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", + ret); + return; + } + + ret = service_set_window(service, + elm_win_xwindow_get(cinput_d->cdetail_d->win)); + if (SERVICE_ERROR_NONE != ret) + { + ERR("service_set_package() Failed(%d)", ret); + ret = service_destroy(service); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", + ret); + return; + } + + ret = service_set_operation(service, SERVICE_OPERATION_CREATE_CONTENT); + if (SERVICE_ERROR_NONE != ret) + { + ERR("service_set_operation() Failed(%d)", ret); + ret = service_destroy(service); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", + ret); + return; + } + + ret = service_set_mime(service, "image/jpg"); + if (SERVICE_ERROR_NONE != ret) + { + ERR("service_set_mime() Failed(%d)", ret); + ret = service_destroy(service); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", + ret); + return; + } + + ret = service_add_extra_data(service, "CALLER", "contacts"); + if (SERVICE_ERROR_NONE != ret) + { + ERR("service_add_extra_data() Failed(%d)", ret); + ret = service_destroy(service); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", + ret); + return; + } + + ret = service_send_launch_request(service, input_camera_result, cinput_d); + if (SERVICE_ERROR_NONE != ret) + { + ERR("service_send_launch_request() Failed(%d)", ret); + ret = service_destroy(service); + p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", + ret); + return; + } + + cinput_d->camera_service_launched = true; + + ret = service_destroy(service); + p_retm_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret); +} + +static void input_myfile_ringtone_result(ui_gadget_h ug, service_h service, + void *data) +{ + PH_TRACE; + char *val = NULL; + int err = CONTACTS_ERROR_NONE; + ct_input_data *cinput_d = (ct_input_data *) data; + + p_retm_if(NULL == ug || NULL == data, "ug or data is NULL"); + + if (service) + { + service_get_extra_data(service, "result", &val); + p_retm_if(!val, "return value is NULL.\n"); + + err = contacts_record_set_str(cinput_d->contact, + _contacts_contact.ringtone_path, val); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_str() Failed(%d)", err); + + free(val); + + ct_input_update_ringtone(cinput_d->contact, cinput_d->ly_ringtone); + } +} + +static inline ui_gadget_h input_myfile_ug(struct ug_cbs cbs, service_h service, + ct_input_data *cinput_d) +{ + PH_TRACE; + ui_gadget_h ug; + + cbs.layout_cb = ug_common_layout_cb; + cbs.priv = cinput_d; + + ug = ug_create(cinput_d->cdetail_d->ug, MYFILES_UG, UG_MODE_FULLVIEW, + service, &cbs); + p_warn_if(NULL == ug, "ug_create() Failed"); + + return ug; +} + +void ct_input_myfile_ringtone(void *data, Evas_Object *obj, void *event_info) +{ + PH_TRACE; + int err = CONTACTS_ERROR_NONE; + struct ug_cbs cbs = { 0 }; + ct_input_data *cinput_d = (ct_input_data *) data; + const char *ringtone_path = NULL; + char *str = NULL; + char buf[PH_TEXT_MAX_LEN + 1]; + service_h service; + + p_retm_if(NULL == cinput_d, "cinput_d is NULL"); + + service_create(&service); + + service_add_extra_data(service, "path", "/opt/share/settings/Ringtones"); + service_add_extra_data(service, "select_type", "SINGLE_FILE"); + service_add_extra_data(service, "file_type", "SOUND"); + + err = contacts_record_get_str_p(cinput_d->contact, + _contacts_contact.ringtone_path, &str); + if (CONTACTS_ERROR_NONE == err) + ringtone_path = ct_detail_get_ringtone_display_name(str); + + if (ringtone_path && *ringtone_path) + { + snprintf(buf, sizeof(buf), "/opt/share/settings/Ringtones/%s", + ringtone_path); + service_add_extra_data(service, "marked_mode", buf); + } + + cbs.result_cb = input_myfile_ringtone_result; + cbs.destroy_cb = input_src_ug_destroy; + cinput_d->child_ug = input_myfile_ug(cbs, service, cinput_d); + + if (cinput_d->popup) + { + evas_object_del(cinput_d->popup); + cinput_d->popup = NULL; + } + + service_destroy(service); +} + +#define ACCOUNT_RGEX "([a-z0-9!#$%&'*+/=?^_`{|}~-]+[.])*[a-z0-9!#$%&'*+/=?^_`{|}~-]+" +#define DOMAIN_RGEX "([a-z0-9!#$%&'*+/=?^_`{|}~-]+[.])+[a-z0-9!#$%&'*+/=?^_`{|}~-]+" +#define EMAIL_RGEX ACCOUNT_RGEX"@"DOMAIN_RGEX + +int ct_input_valid_email(contacts_record_h record_contact) +{ + PH_TRACE; + int len; + int index = 0; + int result = TRUE; + char *email = NULL; + regex_t compiled; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + while (CONTACTS_ERROR_NONE + == contacts_record_get_child_record_at_p(record_contact, + _contacts_contact.email, index++, &record)) + { + err = contacts_record_get_str_p(record, _contacts_email.email, &email); + if (CONTACTS_ERROR_NONE != err) + { + ERR("contacts_record_get_str_p() Failed(%d)", err); + continue; + } + if (email && strlen(email) > 0) + { + len = strlen(email) + 1; + regmatch_t str[len]; + + if (regcomp(&compiled, EMAIL_RGEX, REG_ICASE | REG_EXTENDED)) + result = FALSE; + if (regexec(&compiled, email, len, str, 0) == REG_NOMATCH) + result = FALSE; + + regfree(&compiled); + } + if (!result) + break; + } + return result; +} + +static int input_is_name_empty(contacts_record_h record_contact) +{ + PH_TRACE; + contacts_record_h record = NULL; + char *name = NULL; + + record = ct_input_get_record_name(record_contact); + p_retvm_if(NULL == record, TRUE, "ct_input_get_record_name() return NULL"); + + contacts_record_get_str_p(record, _contacts_name.first, &name); + if (NULL == name || '\0' == *name) + { + contacts_record_get_str_p(record, _contacts_name.last, &name); + if (NULL == name || '\0' == *name) + { + return TRUE; + } + } + return FALSE; +} + +static int input_is_num_empty(contacts_record_h record_contact) +{ + PH_TRACE; + int index = 0; + char *number; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + while (CONTACTS_ERROR_NONE + == contacts_record_get_child_record_at_p(record_contact, + _contacts_contact.number, index++, &record)) + { + err = contacts_record_get_str_p(record, _contacts_number.number, + &number); + if (CONTACTS_ERROR_NONE != err) + { + ERR("contacts_record_get_str_p() Failed(%d)", err); + continue; + } + if (number && *number) + return FALSE; + } + return TRUE; +} + +static int input_is_email_empty(contacts_record_h record_contact) +{ + PH_TRACE; + int index = 0; + char *email; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + while (CONTACTS_ERROR_NONE + == contacts_record_get_child_record_at_p(record_contact, + _contacts_contact.email, index++, &record)) + { + err = contacts_record_get_str_p(record, _contacts_email.email, &email); + if (CONTACTS_ERROR_NONE != err) + { + ERR("contacts_record_get_str_p() Failed(%d)", err); + continue; + } + if (email && *email) + return FALSE; + } + return TRUE; +} + +static void input_btn_popup(ct_detail_data *cdetail_d, const char *desc) +{ + PH_TRACE; + Evas_Object *popup; + Evas_Object *btn; + + popup = elm_popup_add(cdetail_d->navi); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_text_set(popup, desc); + + btn = elm_button_add(popup); + elm_object_text_set(btn, S_(PH_SYS_SK_OK)); + elm_object_part_content_set(popup, "button1", btn); + elm_object_style_set(btn, "popup_button/default"); + evas_object_smart_callback_add(btn, "clicked", ct_detail_popup_hide_cb,cdetail_d); + + cdetail_d->popup = popup; + evas_object_show(popup); +} + +static int timeToInt(const struct tm& currTime) +{ + return (currTime.tm_year + 1900) * 10000 + (currTime.tm_mon + 1) * 100 + currTime.tm_mday; +} + +/** + * @brief This function sets current date to @a numberOfEvent event + * @param contactsRecord Record attached to _contacts_contact table + * @param numberOfEvents Index number of event to set current date + * @return True if success, otherwise false + */ +static bool setCurrentDateToEvent(contacts_record_h contactsRecord, unsigned int numberOfEvent) +{ + bool isOk(false); + if(contactsRecord) + { + time_t timer = time(NULL); + if(timer != -1) + { + struct tm *currTime = localtime(&timer); + if(currTime) + { + int timeToSet = timeToInt(*currTime); + contacts_record_h eventRecord = NULL; + if(CONTACTS_ERROR_NONE == contacts_record_get_child_record_at_p(contactsRecord, + _contacts_contact.event, numberOfEvent, &eventRecord)) + { + isOk = CONTACTS_ERROR_NONE == contacts_record_set_int(eventRecord, + _contacts_event.date, timeToSet); + } + } + } + } + return isOk; +} + +void ct_input_save_cb(void *data, Evas_Object *obj, void *event_info) +{ + PH_TRACE; + int ret; + int ret_id = 0; + int err = CONTACTS_ERROR_NONE; + ct_detail_data *cdetail_d; + ct_input_data *cinput_d = (ct_input_data *) data; + + p_retm_if(NULL == cinput_d, "cinput_d is NULL"); + + if(getCountOfEvents(cinput_d->contact) == 1) + { + p_retm_if(setCurrentDateToEvent(cinput_d->contact, 0) != true, "setCurrentDateToEvent is failed"); + } + + cdetail_d = cinput_d->cdetail_d; + + err = contacts_record_set_int(cinput_d->contact, + _contacts_contact.address_book_id, cinput_d->base_ab); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + + if (TRUE != (ret = ct_input_valid_email(cinput_d->contact))) + { + input_btn_popup(cdetail_d, T_(CT_GET_TEXT_ERR, CTTEXT_INVALID_EMAIL)); + cinput_d->popup = cdetail_d->popup; + return; + } + + if (input_is_name_empty(cinput_d->contact) + && input_is_num_empty(cinput_d->contact) + && input_is_email_empty(cinput_d->contact)) + { + input_btn_popup(cdetail_d, T_(CT_GET_TEXT_ERR, CTTEXT_SAVE_FAIL)); + cinput_d->popup = cdetail_d->popup; + return; + } + + + if (cinput_d->contact_id) + { + err = contacts_db_update_record(cinput_d->contact); + if (CONTACTS_ERROR_NONE != err) + { + ctui_create_contacts_error_popup(cdetail_d->navi, err); + if (cdetail_d->service_operation) + phone_service_reply_simple(cdetail_d->service_operation, + SERVICE_RESULT_FAILED); + return; + } + else + { + cinput_d->saved = true; + if (cdetail_d->service_operation) + phone_ug_return_value(cdetail_d->service_operation, 0, 0, 0, + cdetail_d->person_id); + } + } + else + { + err = contacts_db_insert_record(cinput_d->contact, &ret_id); + if (CONTACTS_ERROR_NONE != err) + { + ctui_create_contacts_error_popup(cdetail_d->navi, err); + if (cdetail_d->service_operation) + phone_service_reply_simple(cdetail_d->service_operation, + SERVICE_RESULT_FAILED); + return; + } + cinput_d->saved = true; + input_set_base_ab(cinput_d->base_ab_name); + if (NULL == cdetail_d->prev_view_data && cdetail_d->ug) + { + phone_ug_return_id(cdetail_d->ug, ret_id, 0, 0); + if (cdetail_d->service_operation) + phone_ug_return_value(cdetail_d->service_operation, 0, 0, 0, + ret_id); + } + } + + /* evas_object_smart_callback_del() func will be deleted */ + evas_object_smart_callback_del(obj, "clicked", ct_input_save_cb); + + if (cdetail_d->prev_view_data + && ((CT_UG_REQUEST_UPDATE_CONTACT <= cdetail_d->ug_request + && cdetail_d->ug_request <= CT_UG_REQUEST_SAVE_RINGTONE) + || (PH_UG_REQUEST_SET_WITH_NUM <= cdetail_d->ug_request + && cdetail_d->ug_request + <= PH_UG_REQUEST_SET_WITH_RINGTONE))) + { + ug_destroy_me(cdetail_d->ug); + } + else if (cdetail_d->ug && !cdetail_d->has_detail + && NULL == cdetail_d->prev_view_data) + { + ug_destroy_me(cdetail_d->ug); + } + else if (cdetail_d->vcard_path) + elm_exit(); + else + elm_naviframe_item_pop(cdetail_d->navi); +} + +void ct_input_custom_type_rename_cb(void *data, char *str) +{ + PH_TRACE; + int err = CONTACTS_ERROR_NONE; + Evas_Object *btn_type; + ct_input_typed_data *typed_data = (ct_input_typed_data *) data; + p_retm_if(NULL == typed_data, "parameter(typed_data)"); + + if (0 == strcmp(typed_data->view_uri, _contacts_number._uri)) + { + err = contacts_record_set_int(typed_data->record, _contacts_number.type, + CONTACTS_NUMBER_TYPE_CUSTOM); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + err = contacts_record_set_str(typed_data->record, + _contacts_number.label, str); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_str() Failed(%d)", err); + } + else if (0 == strcmp(typed_data->view_uri, _contacts_email._uri)) + { + err = contacts_record_set_int(typed_data->record, _contacts_email.type, + CONTACTS_EMAIL_TYPE_CUSTOM); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + err = contacts_record_set_str(typed_data->record, _contacts_email.label, + str); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_str() Failed(%d)", err); + } + else if (0 == strcmp(typed_data->view_uri, _contacts_address._uri)) + { + err = contacts_record_set_int(typed_data->record, + _contacts_address.type, CONTACTS_ADDRESS_TYPE_CUSTOM); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + err = contacts_record_set_str(typed_data->record, + _contacts_address.label, str); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_str() Failed(%d)", err); + } + else if (0 == strcmp(typed_data->view_uri, _contacts_url._uri)) + { + err = contacts_record_set_int(typed_data->record, _contacts_url.type, + CONTACTS_URL_TYPE_CUSTOM); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + err = contacts_record_set_str(typed_data->record, _contacts_url.label, + str); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_str() Failed(%d)", err); + } + else if (0 == strcmp(typed_data->view_uri, _contacts_messenger._uri)) + { + err = contacts_record_set_int(typed_data->record, + _contacts_messenger.type, CONTACTS_MESSENGER_TYPE_CUSTOM); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + err = contacts_record_set_str(typed_data->record, + _contacts_messenger.label, str); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_str() Failed(%d)", err); + } + else if (0 == strcmp(typed_data->view_uri, _contacts_relationship._uri)) + { + err = contacts_record_set_int(typed_data->record, + _contacts_relationship.type, CONTACTS_RELATIONSHIP_TYPE_CUSTOM); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + err = contacts_record_set_str(typed_data->record, + _contacts_relationship.label, str); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_str() Failed(%d)", err); + } + else if (0 == strcmp(typed_data->view_uri, _contacts_event._uri)) + { + err = contacts_record_set_int(typed_data->record, _contacts_event.type, + CONTACTS_EVENT_TYPE_CUSTOM); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + err = contacts_record_set_str(typed_data->record, _contacts_event.label, + str); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_str() Failed(%d)", err); + } + + btn_type = elm_object_part_content_get(typed_data->ly_content, + "elm.icon.type"); + p_retm_if(NULL == btn_type, "elm_object_part_content_get() return NULL"); + + if (str && *str) + elm_object_text_set(btn_type, str); +} + +void ct_input_entry_changed_cb(void *data, Evas_Object *obj, void *event_info) +{ + PH_TRACE; + if (elm_object_focus_get(obj)) + return; + evas_object_smart_callback_call(obj, "unfocused", NULL); +} + +Evas_Object* ct_input_add_editfield(Evas_Object *parent, const char * title, const char* guide_txt, + Evas_Smart_Cb unfocused_cb, void *unfocused_cb_data) +{ + PH_TRACE; + + Evas_Object * editfield = ctui_create_editfield(parent, title, guide_txt, false); + p_retvm_if(NULL == editfield, NULL, "ctui_create_editfield() return NULL"); + + Evas_Object * entry = elm_object_part_content_get(editfield, "elm.swallow.content"); + evas_object_smart_callback_add(entry, "changed", ct_input_entry_changed_cb, editfield); + + if (unfocused_cb) + { + evas_object_smart_callback_add(entry, "unfocused", unfocused_cb, unfocused_cb_data); + } + + return editfield; +} + +int ct_input_next_number_type(contacts_record_h record_contact) +{ + PH_TRACE; + int i; + int used[CTTEXT_TYPE_RADIO + 1] = { 0 }; + int cts_type; + int type; + int index = 0; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + while (CONTACTS_ERROR_NONE + == contacts_record_get_child_record_at_p(record_contact, + _contacts_contact.number, index++, &record)) + { + err = contacts_record_get_int(record, _contacts_number.type, &cts_type); + if (CONTACTS_ERROR_NONE != err) + { + ERR("contacts_record_get_int() Failed(%d)", err); + continue; + } + type = phone_detail_log_get_phonenumber_type(cts_type); + used[type] = 1; + } + + for (i = CTTEXT_TYPE_MOBILE; i < CTTEXT_TYPE_OTHER; i++) + { + if (0 == used[i]) + return phone_get_number_type_index(i); + } + return CTTEXT_TYPE_OTHER; +} + +int ct_input_next_email_type(contacts_record_h record_contact) +{ + PH_TRACE; + int i; + int used = 0; + int cts_type; + int index = 0; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + while (CONTACTS_ERROR_NONE + == contacts_record_get_child_record_at_p(record_contact, + _contacts_contact.email, index++, &record)) + { + err = contacts_record_get_int(record, _contacts_email.type, &cts_type); + if (CONTACTS_ERROR_NONE != err) + { + ERR("contacts_record_get_int() Failed(%d)", err); + continue; + } + used |= cts_type; + } + for (i = 1; (1 << i) <= CONTACTS_EMAIL_TYPE_WORK; i++) + { + if (!(used & (1 << i))) + return 1 << i; + } + + return CONTACTS_EMAIL_TYPE_OTHER; +} + +int ct_input_next_event_type(contacts_record_h record_contact) +{ + PH_TRACE; + int index = 0; + int cts_type; + bool used_birthday = false; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + while (CONTACTS_ERROR_NONE + == contacts_record_get_child_record_at_p(record_contact, + _contacts_contact.event, index++, &record)) + { + err = contacts_record_get_int(record, _contacts_event.type, &cts_type); + if (CONTACTS_ERROR_NONE != err) + { + ERR("contacts_record_get_int() Failed(%d)", err); + continue; + } + if (CONTACTS_EVENT_TYPE_BIRTH == cts_type) + { + used_birthday = true; + break; + } + } + + if (used_birthday) + return CONTACTS_EVENT_TYPE_ANNIVERSARY; + + return CONTACTS_EVENT_TYPE_BIRTH; +} + +int ct_input_next_address_type(contacts_record_h record_contact) +{ + PH_TRACE; + int i; + int used = 0; + int cts_type; + int index = 0; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + while (CONTACTS_ERROR_NONE + == contacts_record_get_child_record_at_p(record_contact, + _contacts_contact.address, index++, &record)) + { + err = contacts_record_get_int(record, _contacts_address.type, + &cts_type); + if (CONTACTS_ERROR_NONE != err) + { + ERR("contacts_record_get_int() Failed(%d)", err); + continue; + } + used |= cts_type; + } + for (i = 1; (1 << i) <= CONTACTS_ADDRESS_TYPE_WORK; i++) + { + if (!(used & (1 << i))) + return 1 << i; + } + + return CONTACTS_ADDRESS_TYPE_OTHER; +} + +int ct_input_next_web_type(contacts_record_h record_contact) +{ + PH_TRACE; + int i; + int index = 0; + int cts_type; + int used[CONTACTS_URL_TYPE_WORK + 1] = { 0 }; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + while (CONTACTS_ERROR_NONE + == contacts_record_get_child_record_at_p(record_contact, + _contacts_contact.url, index++, &record)) + { + err = contacts_record_get_int(record, _contacts_url.type, &cts_type); + if (CONTACTS_ERROR_NONE != err) + { + ERR("contacts_record_get_int() Failed(%d)", err); + continue; + } + used[cts_type] = 1; + } + + for (i = CONTACTS_URL_TYPE_HOME; i <= CONTACTS_URL_TYPE_WORK; i++) + { + if (0 == used[i]) + return i; + } + return CONTACTS_URL_TYPE_OTHER; +} + +int ct_input_next_relationship_type(contacts_record_h record_contact) +{ + PH_TRACE; + int i; + int index = 0; + int cts_type; + int used[CONTACTS_RELATIONSHIP_TYPE_CUSTOM + 1] = { 0 }; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + while (CONTACTS_ERROR_NONE + == contacts_record_get_child_record_at_p(record_contact, + _contacts_contact.relationship, index++, &record)) + { + err = contacts_record_get_int(record, _contacts_relationship.type, + &cts_type); + if (CONTACTS_ERROR_NONE != err) + { + ERR("contacts_record_get_int() Failed(%d)", err); + continue; + } + used[cts_type] = 1; + } + + for (i = CONTACTS_RELATIONSHIP_TYPE_ASSISTANT; + i <= CONTACTS_RELATIONSHIP_TYPE_CUSTOM; i++) + { + if (!used[i]) + return i; + } + return CONTACTS_RELATIONSHIP_TYPE_CUSTOM; +} + +int ct_input_next_messenger_type(contacts_record_h record_contact) +{ + PH_TRACE; + int i; + int index = 0; + int cts_type; + bool used[CONTACTS_MESSENGER_TYPE_IRC + 1] = { 0 }; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + while (CONTACTS_ERROR_NONE + == contacts_record_get_child_record_at_p(record_contact, + _contacts_contact.messenger, index++, &record)) + { + err = contacts_record_get_int(record, _contacts_messenger.type, + &cts_type); + if (CONTACTS_ERROR_NONE != err) + { + ERR("contacts_record_get_int() Failed(%d)", err); + continue; + } + used[cts_type] = true; + } + + for(i = CONTACTS_MESSENGER_TYPE_SKYPE; i > CONTACTS_MESSENGER_TYPE_OTHER; --i) + { + if( (CONTACTS_MESSENGER_TYPE_FACEBOOK != i) + && (CONTACTS_MESSENGER_TYPE_CUSTOM != i) + && !used[i]) + { + return i; + } + } + + return CONTACTS_MESSENGER_TYPE_OTHER; +} + +Evas_Object* ct_input_create_dg_layout(Evas_Object *parent, const char *theme) +{ + PH_TRACE; + Evas_Object *layout = elm_layout_add(parent); + p_retvm_if(NULL == layout, NULL, "elm_layout_add() return NULL"); + + elm_layout_theme_set(layout, "layout", "dialogue", theme); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, 0.0); + + evas_object_show(layout); + return layout; +} + +void ct_input_typed_layout_del_cb(void *data, Evas *e, Evas_Object *obj, + void *event_info) +{ + PH_TRACE; + ct_input_typed_data *typed_data = (ct_input_typed_data *) data; + p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL"); + free(typed_data); +} + +void ct_input_update_ringtone(contacts_record_h record_contact, + Evas_Object *ly_content) +{ + PH_TRACE; + const char *display; + char *temp; + int err = CONTACTS_ERROR_NONE; + + err = contacts_record_get_str_p(record_contact, + _contacts_contact.ringtone_path, &temp); + p_retm_if(CONTACTS_ERROR_NONE != err && CONTACTS_ERROR_NO_DATA != err, + "contacts_record_get_str_p() Failed(%d)", err); + + display = ct_detail_get_ringtone_display_name((const char *) temp); + + elm_object_part_text_set(ly_content, "elm.text.2", display); +} + +void ct_input_update_vibration(contacts_record_h record_contact, + Evas_Object *ly_content) +{ + PH_TRACE; + char *vibration = NULL; + int err = CONTACTS_ERROR_NONE; + + err = contacts_record_get_str_p(record_contact, _contacts_contact.vibration, + &vibration); + p_retm_if(CONTACTS_ERROR_NONE != err && CONTACTS_ERROR_NO_DATA != err, + "contacts_record_get_str_p() Failed(%d)", err); + + elm_object_part_text_set(ly_content, "elm.text.2", + T_(CT_GET_TEXT_VIBRATION, ct_detail_vibration_get_msgid(vibration))); +} + +unsigned int ct_input_box_idx_get(Evas_Object *box, Evas_Object *obj) +{ + PH_TRACE; + int count = 0; + Eina_List *list, *cursor; + list = elm_box_children_get(box); + void *v_data; + + EINA_LIST_FOREACH(list, cursor, v_data) + { + Evas_Object *data = (Evas_Object *) v_data; + if (data == obj) + break; + count++; + } + eina_list_free(list); + return count; +} + +void ct_input_update_group(void *data) +{ + PH_TRACE; + Evas_Object *ly_content; + char display[PH_TEXT_MAX_LEN + 1]; + ct_input_data *cinput_d = (ct_input_data *) data; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + p_retm_if(NULL == cinput_d->contact || NULL == cinput_d->ly_group, + "parameter is NULL"); + + ct_detail_get_group_names(cinput_d->contact, display, sizeof(display)); + ly_content = cinput_d->ly_group; + elm_object_part_text_set(ly_content, "elm.text.2", display); +} + +void ct_input_save_button_update(ct_input_data *cinput_d) +{ + PH_TRACE; + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + if (cinput_d->save_button) + elm_object_disabled_set(cinput_d->save_button, cinput_d->save_disable); +} + +static inline Eina_Bool input_is_editfield_empty(Evas_Object *editfield) +{ + PH_TRACE; + const char *val; + Evas_Object *entry; + + p_retvm_if(NULL == editfield, EINA_TRUE, "parameter(editfield) is NULL"); + + entry = elm_object_part_content_get(editfield, "elm.swallow.content"); + p_retvm_if(NULL == entry, EINA_TRUE, + "elm_object_part_content_get() return NULL"); + + val = elm_entry_entry_get(entry); + if (val && *val) + return EINA_FALSE; + + return EINA_TRUE; +} + +static bool __input_is_field_filled(Evas_Object *box, Eina_List *list, + Evas_Object *first, Evas_Object *last, const char *part) +{ + PH_TRACE; + int idx = 0; + ; + Evas_Object *ly_content = NULL; + Evas_Object *edit_field = NULL; + + p_retvm_if(NULL == box, false, "parameter(box) is NULL"); + p_retvm_if(NULL == list, false, "parameter(list) is NULL"); + p_retvm_if(NULL == first, false, "parameter(first) is NULL"); + p_retvm_if(NULL == last, false, "parameter(last) is NULL"); + + ly_content = first; + idx = ct_input_box_idx_get(box, ly_content); + while (ly_content) + { + edit_field = elm_object_part_content_get(ly_content, part); + if (EINA_FALSE == input_is_editfield_empty(edit_field)) + return true; + + if (ly_content == last) + break; + ly_content = (Evas_Object *) eina_list_nth(list, ++idx); + } + return false; + +} + +static void __input_mandatory_field_changed_cb(void *data, Evas_Object *obj, + void *event_info) +{ + PH_TRACE; + bool exist_valid_field = false; + Eina_List *list = NULL; + Evas_Object *edit_field = NULL; + ct_input_data *cinput_d = (ct_input_data *) data; + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + + edit_field = elm_object_part_content_get(cinput_d->ly_basic_info, + "elm.icon"); + if (edit_field && EINA_FALSE == input_is_editfield_empty(edit_field)) + { + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + return; + } + + edit_field = elm_object_part_content_get( + cinput_d->ly_basic_info_middle_name, "elm.icon"); + if (edit_field && EINA_FALSE == input_is_editfield_empty(edit_field)) + { + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + return; + } + + edit_field = elm_object_part_content_get(cinput_d->ly_basic_info_last_name, + "elm.icon"); + if (edit_field && EINA_FALSE == input_is_editfield_empty(edit_field)) + { + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + return; + } + + edit_field = elm_object_part_content_get(cinput_d->ly_basic_info_suffix, + "elm.icon"); + if (edit_field && EINA_FALSE == input_is_editfield_empty(edit_field)) + { + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + return; + } + + edit_field = elm_object_part_content_get(cinput_d->ly_basic_info_nickname, + "elm.icon"); + if (edit_field && EINA_FALSE == input_is_editfield_empty(edit_field)) + { + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + return; + } + + edit_field = elm_object_part_content_get(cinput_d->ly_basic_info_job_title, + "elm.icon"); + if (edit_field && EINA_FALSE == input_is_editfield_empty(edit_field)) + { + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + return; + } + + edit_field = elm_object_part_content_get(cinput_d->ly_basic_info_department, + "elm.icon"); + if (EINA_FALSE == input_is_editfield_empty(edit_field)) + { + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + return; + } + + edit_field = elm_object_part_content_get(cinput_d->ly_basic_info_company, + "elm.icon"); + if (edit_field && EINA_FALSE == input_is_editfield_empty(edit_field)) + { + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + return; + } + + list = elm_box_children_get(cinput_d->box); + exist_valid_field = __input_is_field_filled(cinput_d->box, list, + cinput_d->ly_number_first, cinput_d->ly_number_last, "elm.icon"); + if (exist_valid_field) + { + PH_DBG("valid field = number"); + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + eina_list_free(list); + return; + } + + exist_valid_field = __input_is_field_filled(cinput_d->box, list, + cinput_d->ly_email_first, cinput_d->ly_email_last, "elm.icon"); + if (exist_valid_field) + { + PH_DBG("valid field = email"); + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + eina_list_free(list); + return; + } + + exist_valid_field = __input_is_field_filled(cinput_d->box, list, + cinput_d->ly_addr_first, cinput_d->ly_addr_last, "elm.icon"); + if (exist_valid_field) + { + PH_DBG("valid field = address"); + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + eina_list_free(list); + return; + } + + exist_valid_field = __input_is_field_filled(cinput_d->box, list, + cinput_d->ly_messenger_first, cinput_d->ly_messenger_last, + "elm.icon"); + if (exist_valid_field) + { + PH_DBG("valid field = messenger"); + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + eina_list_free(list); + return; + } + + exist_valid_field = __input_is_field_filled(cinput_d->box, list, + cinput_d->ly_url_first, cinput_d->ly_url_last, "elm.icon"); + if (exist_valid_field) + { + PH_DBG("valid field = url"); + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + eina_list_free(list); + return; + } + + exist_valid_field = __input_is_field_filled(cinput_d->box, list, + cinput_d->ly_relationship_first, cinput_d->ly_relationship_last, + "elm.icon"); + if (exist_valid_field) + { + PH_DBG("valid field = url"); + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + eina_list_free(list); + return; + } + + eina_list_free(list); + + edit_field = elm_object_part_content_get(cinput_d->ly_note, "elm.icon"); + if (edit_field && EINA_FALSE == input_is_editfield_empty(edit_field)) + { + cinput_d->save_disable = EINA_FALSE; + ct_input_save_button_update(cinput_d); + return; + } + + PH_DBG("cinput_d->save_disable=%d", cinput_d->save_disable); + if (EINA_TRUE == cinput_d->save_disable) + return; + + cinput_d->save_disable = EINA_TRUE; + ct_input_save_button_update(cinput_d); +} + +void ct_input_add_name_field(Evas_Object *editfield, ct_input_data *cinput_d) +{ + PH_TRACE; + Evas_Object *entry; + + p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL"); + p_retm_if(NULL == editfield, "parameter(editfield) is NULL"); + + entry = elm_object_part_content_get(editfield, "elm.swallow.content"); + p_retm_if(NULL == cinput_d, "elm_object_part_content_get() return NULL"); + + evas_object_smart_callback_add(entry, "changed", + __input_mandatory_field_changed_cb, cinput_d); + evas_object_smart_callback_add(entry, "preedit,changed", + __input_mandatory_field_changed_cb, cinput_d); +} + +int ct_input_get_full_address(contacts_record_h record_postal, char *buf, + int buf_len) +{ + PH_TRACE; + char *code = NULL; + char *region = NULL; + char *locality = NULL; + char *street = NULL; + char *extended = NULL; + char *country = NULL; + char *pobox = NULL; + int err = CONTACTS_ERROR_NONE; + + err = contacts_record_get_str_p(record_postal, + _contacts_address.postal_code, &code); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_get_str_p() Failed(%d)", err); + err = contacts_record_get_str_p(record_postal, _contacts_address.extended, + &extended); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_get_str_p() Failed(%d)", err); + err = contacts_record_get_str_p(record_postal, _contacts_address.postbox, + &pobox); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_get_str_p() Failed(%d)", err); + err = contacts_record_get_str_p(record_postal, _contacts_address.street, + &street); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_get_str_p() Failed(%d)", err); + err = contacts_record_get_str_p(record_postal, _contacts_address.locality, + &locality); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_get_str_p() Failed(%d)", err); + err = contacts_record_get_str_p(record_postal, _contacts_address.region, + ®ion); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_get_str_p() Failed(%d)", err); + err = contacts_record_get_str_p(record_postal, _contacts_address.country, + &country); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_get_str_p() Failed(%d)", err); + + snprintf(buf, buf_len, "%s%s%s%s%s%s%s%s%s%s%s%s%s", SAFE_STR(code) +, STR_BLANK(code, extended), STR_BLANK(extended, pobox), + STR_BLANK(pobox, street), STR_BLANK(street, locality), STR_BLANK(locality, region), STR_BLANK(region, country)); + + return 0; +} + +static contacts_record_h input_get_record(contacts_record_h record_contact, + int property_id) +{ + PH_TRACE; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + p_retvm_if(NULL == record_contact, NULL, + "parameter(record_contact) is NULL"); + + err = contacts_record_get_child_record_at_p(record_contact, property_id, 0, + &record); + p_retvm_if(CONTACTS_ERROR_NONE != err, NULL, + "contacts_record_get_child_record_at_p() Failed(%d)", err); + + return record; +} + +contacts_record_h ct_input_new_record(contacts_record_h contact, + int property_id, const char *view_uri) +{ + PH_TRACE; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + err = contacts_record_create(view_uri, &record); + p_retvm_if(CONTACTS_ERROR_NONE != err, NULL, + "contacts_record_create() Failed(%d)", err); + + err = contacts_record_add_child_record(contact, property_id, record); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_add_child_record() Failed(%d)", err); + + return record; +} + +contacts_record_h ct_input_new_record_relationship(contacts_record_h contact) +{ + PH_TRACE; + int type; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + type = ct_input_next_relationship_type(contact); + PH_DBG("type=%d", type); + + record = ct_input_new_record(contact, _contacts_contact.relationship, + _contacts_relationship._uri); + p_retvm_if(NULL == record, NULL, "ct_input_new_record() return NULL"); + + err = contacts_record_set_int(record, _contacts_relationship.type, type); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + + return record; +} + +contacts_record_h ct_input_new_record_address(contacts_record_h contact) +{ + PH_TRACE; + int type; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + type = ct_input_next_address_type(contact); + PH_DBG("type=%d", type); + + record = ct_input_new_record(contact, _contacts_contact.address, + _contacts_address._uri); + p_retvm_if(NULL == record, NULL, "ct_input_new_record() return NULL"); + + err = contacts_record_set_int(record, _contacts_address.type, type); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + + return record; +} + +contacts_record_h ct_input_new_record_web(contacts_record_h contact) +{ + PH_TRACE; + int type; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + type = ct_input_next_web_type(contact); + PH_DBG("type=%d", type); + + record = ct_input_new_record(contact, _contacts_contact.url, + _contacts_url._uri); + p_retvm_if(NULL == record, NULL, "ct_input_new_record() return NULL"); + + err = contacts_record_set_int(record, _contacts_url.type, type); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + + return record; +} + +contacts_record_h ct_input_new_record_number(contacts_record_h contact) +{ + PH_TRACE; + int type; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + type = ct_input_next_number_type(contact); + PH_DBG("type=%d", type); + + record = ct_input_new_record(contact, _contacts_contact.number, + _contacts_number._uri); + p_retvm_if(NULL == record, NULL, "ct_input_new_record() return NULL"); + + err = contacts_record_set_int(record, _contacts_number.type, type); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + + return record; +} + +contacts_record_h ct_input_new_record_email(contacts_record_h contact) +{ + PH_TRACE; + int type; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + type = ct_input_next_email_type(contact); + PH_DBG("type=%d", type); + + record = ct_input_new_record(contact, _contacts_contact.email, + _contacts_email._uri); + p_retvm_if(NULL == record, NULL, "ct_input_new_record() return NULL"); + + err = contacts_record_set_int(record, _contacts_email.type, type); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + + return record; +} + +contacts_record_h ct_input_new_record_messenger(contacts_record_h contact) +{ + PH_TRACE; + int type; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + type = ct_input_next_messenger_type(contact); + PH_DBG("type=%d", type); + + record = ct_input_new_record(contact, _contacts_contact.messenger, + _contacts_messenger._uri); + p_retvm_if(NULL == record, NULL, "ct_input_new_record() return NULL"); + + err = contacts_record_set_int(record, _contacts_messenger.type, type); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + + return record; +} + +contacts_record_h ct_input_new_record_event(contacts_record_h contact) +{ + PH_TRACE; + int type; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + type = ct_input_next_event_type(contact); + PH_DBG("type=%d", type); + + record = ct_input_new_record(contact, _contacts_contact.event, + _contacts_event._uri); + p_retvm_if(NULL == record, NULL, "ct_input_new_record() return NULL"); + + err = contacts_record_set_int(record, _contacts_event.type, type); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_set_int() Failed(%d)", err); + return record; +} + +contacts_record_h ct_input_get_record_nickname(contacts_record_h record_contact) +{ + PH_TRACE; + contacts_record_h record = NULL; + record = input_get_record(record_contact, _contacts_contact.nickname); + if (NULL == record) + record = ct_input_new_record(record_contact, _contacts_contact.nickname, + _contacts_nickname._uri); + return record; +} + +contacts_record_h ct_input_get_record_name(contacts_record_h record_contact) +{ + PH_TRACE; + contacts_record_h record = NULL; + record = input_get_record(record_contact, _contacts_contact.name); + if (NULL == record) + { + record = ct_input_new_record(record_contact, _contacts_contact.name, + _contacts_name._uri); + PH_DBG("record=%p", record); + } + + return record; +} + +contacts_record_h ct_input_get_record_company(contacts_record_h record_contact) +{ + PH_TRACE; + contacts_record_h record = NULL; + record = input_get_record(record_contact, _contacts_contact.company); + if (NULL == record) + record = ct_input_new_record(record_contact, _contacts_contact.company, + _contacts_company._uri); + return record; +} + +contacts_record_h ct_input_get_record_note(contacts_record_h record_contact) +{ + PH_TRACE; + contacts_record_h record = NULL; + record = input_get_record(record_contact, _contacts_contact.note); + if (NULL == record) + record = ct_input_new_record(record_contact, _contacts_contact.note, + _contacts_note._uri); + return record; +} + +static void input_remove_empty_field(contacts_record_h record_contact, + int property_id, int property_id_str) +{ + PH_TRACE; + int i; + unsigned int count; + char *str; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + p_retm_if(NULL == record_contact, "parameter(record_contact) is NULL"); + + err = contacts_record_get_child_record_count(record_contact, property_id, + &count); + p_retm_if(CONTACTS_ERROR_NONE != err, + "contacts_record_get_child_record_count() Failed(%d)", err); + + for (i = count - 1; 0 <= i; i--) + { + err = contacts_record_get_child_record_at_p(record_contact, property_id, + i, &record); + if (CONTACTS_ERROR_NONE != err) + { + ERR("contacts_record_get_child_record_at_p() Failed(%d)", err); + continue; + } + + err = contacts_record_get_str(record, property_id_str, &str); + if (CONTACTS_ERROR_NONE != err || NULL == str || '\0' == *str) + { + err = contacts_record_remove_child_record(record_contact, + property_id, record); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_remove_child_record() Failed(%d)", err); + + err = contacts_record_destroy(record, true); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_destroy() Failed(%d)", err); + } + free(str); + } +} + +static void input_remove_empty_field_address(contacts_record_h record_contact) +{ + PH_TRACE; + int i; + unsigned int count; + char str[PH_TEXT_MAX_LEN]; + int err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + p_retm_if(NULL == record_contact, "parameter(record_contact) is NULL"); + + err = contacts_record_get_child_record_count(record_contact, + _contacts_contact.address, &count); + p_retm_if(CONTACTS_ERROR_NONE != err, + "contacts_record_get_child_record_count() Failed(%d)", err); + + for (i = count - 1; 0 <= i; i--) + { + err = contacts_record_get_child_record_at_p(record_contact, + _contacts_contact.address, i, &record); + if (CONTACTS_ERROR_NONE != err) + { + ERR("contacts_record_get_child_record_at_p() Failed(%d)", err); + continue; + } + str[0] = '\0'; + ct_detail_get_full_addr(record, str, sizeof(str)); + + if ('\0' == *str) + { + err = contacts_record_remove_child_record(record_contact, + _contacts_contact.address, record); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_remove_child_record() Failed(%d)", err); + + err = contacts_record_destroy(record, true); + p_warn_if(CONTACTS_ERROR_NONE != err, + "contacts_record_destroy() Failed(%d)", err); + } + } + +} + +void ct_input_remove_empty_fields(contacts_record_h record_contact) +{ + PH_TRACE; + p_retm_if(NULL == record_contact, "parameter(record_contact) is NULL"); + input_remove_empty_field(record_contact, _contacts_contact.number, + _contacts_number.number); + input_remove_empty_field(record_contact, _contacts_contact.email, + _contacts_email.email); + input_remove_empty_field_address(record_contact); + input_remove_empty_field(record_contact, _contacts_contact.url, + _contacts_url.url); + input_remove_empty_field(record_contact, _contacts_contact.messenger, + _contacts_messenger.im_id); + input_remove_empty_field(record_contact, _contacts_contact.note, + _contacts_note.note); + input_remove_empty_field(record_contact, _contacts_contact.relationship, + _contacts_relationship.name); +} + |