summaryrefslogtreecommitdiff
path: root/src/plugins/ds-public/vcard/src/plugin_interface.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/ds-public/vcard/src/plugin_interface.c')
-rwxr-xr-xsrc/plugins/ds-public/vcard/src/plugin_interface.c998
1 files changed, 998 insertions, 0 deletions
diff --git a/src/plugins/ds-public/vcard/src/plugin_interface.c b/src/plugins/ds-public/vcard/src/plugin_interface.c
new file mode 100755
index 0000000..5131f38
--- /dev/null
+++ b/src/plugins/ds-public/vcard/src/plugin_interface.c
@@ -0,0 +1,998 @@
+/*
+ * oma-ds-agent
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd.
+ *
+ * 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 <stdio.h>
+#include <contacts.h>
+#include <glib.h>
+
+#include <sync_agent.h>
+
+#include "plugin_spec.h"
+#include "in_datastore_info_vcard.h"
+#include "encoding_util.h"
+
+#ifndef EXPORT_API
+#define EXPORT_API __attribute__ ((visibility("default")))
+#endif
+
+#ifndef OMADS_AGENT_LOG
+#undef LOG_TAG
+#define LOG_TAG "PLUGIN_VCARD"
+#endif
+
+static int _free_obj_field_info(sync_agent_plugin_field_info_s * field_list, int count);
+static int _set_obj_field_info(sync_agent_plugin_field_info_s ** field_list, int count, vcard_field_list_s * input_list);
+static char *_convert_key_name(int key);
+
+static int _get_content(const char *value, void *data);
+
+static sync_agent_da_return_e _convert_service_error_to_common_error(contacts_error_e err);
+static char *_contacts_vcard_put_content(const char *vcard_stream, const char *content_type, const char *content_value);
+static int _contacts_vcard_get_content(const char *vcard_stream, const char *content_type, int (*fn) (const char *content_value, void *data), void *data);
+
+static void _contacts_struct_merge(contacts_record_h old, contacts_record_h new);
+static void __contacts_struct_property_merge(contacts_record_h old, contacts_record_h new);
+static void __contacts_struct_child_property_merge(unsigned int property_id, contacts_record_h old, contacts_record_h new);
+
+//static void _remove_vcard_field(CTSstruct *contact);
+//static void _remove_vcard_gslist_field(gpointer data, gpointer user_data);
+
+EXPORT_API sync_agent_da_return_e sync_agent_plugin_converter(const void *agent_data, void **service_data)
+{
+ _EXTERN_FUNC_ENTER;
+
+// retvm_if(agent_data == NULL, SYNC_AGENT_DA_ERRORS, "[dc_vcard_plugIn] agent_data is NULL");
+//
+// sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
+// int err = 0;
+// CTSstruct *temp_service_data = 0;
+//
+// /* decoding & convert */
+// _DEBUG_INFO("[dc_vcard_plugIn] agent data : %s\n", agent_data);
+// char *de_agent_data;
+// int src_len = strlen(agent_data);
+// int de_agent_data_len = 0;
+//
+// if (check_encoding_data(agent_data) == 1) {
+// err = proc_decoding(agent_data, src_len, &de_agent_data, &de_agent_data_len);
+// if (err == 0) {
+// _DEBUG_ERROR("[dc_vcard_plugIn] proc_decoding() Fail!\n");
+// ret = SYNC_AGENT_DA_ERRORS;
+// return ret;
+// }
+//
+// err = contacts_svc_get_contact_from_vcard((const void *)de_agent_data, &temp_service_data);
+//
+// /*memory free */
+// if (de_agent_data != NULL)
+// free(de_agent_data);
+// } else {
+// err = contacts_svc_get_contact_from_vcard(agent_data, &temp_service_data);
+// }
+//
+// if (err < CTS_SUCCESS) {
+// _DEBUG_ERROR("[dc_vcard_plugIn] contacts_svc_get_contact_from_vcard() Fail!\n");
+// ret = _convert_service_error_to_common_error(err);
+// *service_data = 0;
+// } else {
+// _DEBUG_INFO("[dc_vcard_plugIn] contacts_svc_get_contact_from_vcard() Success!\n");
+// *service_data = (void *)temp_service_data;
+// }
+
+ retvm_if(agent_data == NULL, SYNC_AGENT_DA_ERRORS, "[dc_vcard_plugIn] agent_data is NULL");
+
+ sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+ contacts_list_h list = NULL;
+ contacts_record_h record = NULL;
+ contacts_record_h cloned_record = NULL;
+
+ /* decoding & convert */
+ _DEBUG_INFO("[dc_vcard_plugIn] agent data : %s\n", agent_data);
+ char *de_agent_data;
+ int src_len = strlen(agent_data);
+ int de_agent_data_len = 0;
+
+ if (check_encoding_data(agent_data) == 1) {
+ err = proc_decoding(agent_data, src_len, &de_agent_data, &de_agent_data_len);
+ if (err == 0) {
+ _DEBUG_ERROR("[dc_vcard_plugIn] proc_decoding() Fail!\n");
+ ret = SYNC_AGENT_DA_ERRORS;
+ return ret;
+ }
+
+ err = contacts_vcard_parse_to_contacts(de_agent_data, &list);
+
+ /*memory free */
+ if (de_agent_data != NULL)
+ free(de_agent_data);
+ } else {
+ err = contacts_vcard_parse_to_contacts(agent_data, &list);
+ }
+
+ if (err != CONTACTS_ERROR_NONE) {
+ _DEBUG_ERROR("[dc_vcard_plugIn] contacts_vcard_parse_to_contacts() Fail!\n");
+ ret = _convert_service_error_to_common_error(err);
+ *service_data = 0;
+ } else {
+ _DEBUG_INFO("[dc_vcard_plugIn] contacts_vcard_parse_to_contacts() Success!\n");
+ err = contacts_list_get_current_record_p(list, &record);
+ if (err != CONTACTS_ERROR_NONE) {
+ _DEBUG_ERROR("[dc_vcard_plugIn] contacts_list_get_current_record_p() Fail!\n");
+ ret = _convert_service_error_to_common_error(err);
+ *service_data = 0;
+ contacts_list_destroy(list, true);
+ return ret;
+ }
+
+ err = contacts_record_clone(record, &cloned_record);
+ if (err != CONTACTS_ERROR_NONE) {
+ _DEBUG_ERROR("[dc_vcard_plugIn] contacts_record_clone() Fail!\n");
+ ret = _convert_service_error_to_common_error(err);
+ *service_data = 0;
+ contacts_list_destroy(list, true);
+ return ret;
+ }
+
+ *service_data = (void *)cloned_record;
+ contacts_list_destroy(list, true);
+ }
+
+ _EXTERN_FUNC_EXIT;
+ return ret;
+}
+
+EXPORT_API sync_agent_da_return_e sync_agent_plugin_replace_converter(void *old_service_data, const void *agent_data, void **new_service_data)
+{
+ _EXTERN_FUNC_ENTER;
+
+// retvm_if(old_service_data == NULL, SYNC_AGENT_DA_ERRORS, "[dc_vcard_plugIn] old_service_data is NULL");
+// retvm_if(agent_data == NULL, SYNC_AGENT_DA_ERRORS, "[dc_vcard_plugIn] agent_data is NULL");
+//
+// sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
+// int err = 0;
+// CTSstruct *temp_new_service_data = 0;
+// CTSstruct *temp_old_service_data = (CTSstruct *)old_service_data;
+//
+// /* 1. agent_data encoding check
+// * 2. decoding
+// * 3. copy to new_service_data
+// */
+// /* decoding */
+// char *de_agent_data;
+// int src_len = strlen(agent_data);
+// int de_agent_data_len = 0;
+//
+// if (check_encoding_data(agent_data) == 1) {
+// err = proc_decoding(agent_data, src_len, &de_agent_data, &de_agent_data_len);
+// if (err == 0) {
+// _DEBUG_ERROR("[dc_vcard_plugIn] proc_decoding() Fail!\n");
+///* ret = SYNC_AGENT_DA_ERRORS;
+// return ret;*/
+// err = contacts_svc_get_contact_from_vcard(agent_data, &temp_new_service_data);
+// } else {
+// _DEBUG_INFO("[dc_vcard_plugIn] proc_decoding() Success l!\n");
+// err = contacts_svc_get_contact_from_vcard((const void *)de_agent_data, &temp_new_service_data);
+//
+// /*memory free */
+// if (de_agent_data != NULL)
+// free(de_agent_data);
+// }
+// } else {
+// err = contacts_svc_get_contact_from_vcard(agent_data, &temp_new_service_data);
+// }
+//
+// if (err < CTS_SUCCESS) {
+// _DEBUG_ERROR("[dc_vcard_plugIn] contacts_svc_get_contact_from_vcard() Fail!\n");
+// ret = _convert_service_error_to_common_error(err);
+// *new_service_data = 0;
+//
+// /* memory free */
+// if (temp_old_service_data != NULL)
+// contacts_svc_struct_free(temp_old_service_data);
+//
+// } else {
+// _DEBUG_INFO("[dc_vcard_plugIn] contacts_svc_get_contact_from_vcard() Success!\n");
+// _remove_vcard_field(temp_old_service_data);
+// err = contacts_svc_struct_merge(temp_old_service_data, temp_new_service_data);
+// if (err < CTS_SUCCESS) {
+// _DEBUG_ERROR("[dc_vcard_plugIn] contacts_svc_struct_merge() Fail!\n");
+// ret = _convert_service_error_to_common_error(err);
+// *new_service_data = 0;
+//
+// /* memory free */
+// if (temp_old_service_data != NULL)
+// contacts_svc_struct_free(temp_old_service_data);
+// } else {
+// _DEBUG_INFO("[dc_vcard_plugIn] contacts_svc_struct_merge() Success!\n");
+// *new_service_data = (void *)temp_old_service_data;
+// }
+// }
+//
+// /* memory free */
+// if (temp_new_service_data != NULL)
+// contacts_svc_struct_free(temp_new_service_data);
+
+ retvm_if(old_service_data == NULL, SYNC_AGENT_DA_ERRORS, "[dc_vcard_plugIn] old_service_data is NULL");
+ retvm_if(agent_data == NULL, SYNC_AGENT_DA_ERRORS, "[dc_vcard_plugIn] agent_data is NULL");
+
+ sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
+
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+ contacts_list_h list = NULL;
+
+ contacts_record_h temp_new_service_data = NULL;
+ contacts_record_h temp_old_service_data = (contacts_record_h) old_service_data;
+
+ /* 1. agent_data encoding check
+ * 2. decoding
+ * 3. copy to new_service_data
+ */
+ /* decoding */
+ char *de_agent_data;
+ int src_len = strlen(agent_data);
+ int de_agent_data_len = 0;
+
+ if (check_encoding_data(agent_data) == 1) {
+ err = proc_decoding(agent_data, src_len, &de_agent_data, &de_agent_data_len);
+ if (err == 0) {
+ _DEBUG_ERROR("[dc_vcard_plugIn] proc_decoding() Fail!\n");
+/* ret = SYNC_AGENT_DA_ERRORS;
+ return ret;*/
+ err = contacts_vcard_parse_to_contacts(agent_data, &list);
+ } else {
+ _DEBUG_INFO("[dc_vcard_plugIn] proc_decoding() Success l!\n");
+ err = contacts_vcard_parse_to_contacts(de_agent_data, &list);
+
+ /*memory free */
+ if (de_agent_data != NULL)
+ free(de_agent_data);
+ }
+ } else {
+ err = contacts_vcard_parse_to_contacts(agent_data, &list);
+ }
+
+ if (err != CONTACTS_ERROR_NONE) {
+ _DEBUG_ERROR("[dc_vcard_plugIn] contacts_vcard_parse_to_contacts() Fail!\n");
+ ret = _convert_service_error_to_common_error(err);
+ *new_service_data = 0;
+
+ } else {
+ _DEBUG_INFO("[dc_vcard_plugIn] contacts_vcard_parse_to_contacts() Success!\n");
+
+ err = contacts_list_get_current_record_p(list, &temp_new_service_data);
+ if (err != CONTACTS_ERROR_NONE) {
+ _DEBUG_ERROR("[dc_vcard_plugIn] contacts_list_get_current_record_p() Fail!\n");
+ ret = _convert_service_error_to_common_error(err);
+ *new_service_data = 0;
+ goto DACI_FINISH;
+ }
+
+ _contacts_struct_merge(temp_old_service_data, temp_new_service_data);
+
+ *new_service_data = (void *)temp_old_service_data;
+ }
+
+ DACI_FINISH:
+
+ contacts_list_destroy(list, true);
+
+ _EXTERN_FUNC_EXIT;
+ return ret;
+}
+
+EXPORT_API sync_agent_da_return_e sync_agent_plugin_reverse_converter(void *service_data, void **agent_data)
+{
+ _EXTERN_FUNC_ENTER;
+
+// retvm_if(service_data == NULL, SYNC_AGENT_DA_ERRORS, "[dc_vcard_plugIn] service_data is NULL");
+//
+// sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
+// int err = 0;
+// char *temp_agent_data = 0;
+// CTSstruct *temp_service_data = (CTSstruct *)service_data;
+//
+// /* Reverse_Converter */
+// err = contacts_svc_get_vcard_from_contact(temp_service_data, &temp_agent_data);
+// if (err < CTS_SUCCESS) {
+// _DEBUG_INFO("[dc_vcard_plugIn] contacts_svc_get_vcard_from_contact() Fail!\n");
+// ret = _convert_service_error_to_common_error(err);
+// *agent_data = 0;
+// } else {
+// _DEBUG_INFO("[dc_vcard_plugIn] contacts_svc_get_vcard_from_contact() Success!\n");
+// *agent_data = (void *)temp_agent_data;
+// }
+//
+// /* memory free */
+// if (temp_service_data != NULL)
+// contacts_svc_struct_free(temp_service_data);
+
+ retvm_if(service_data == NULL, SYNC_AGENT_DA_ERRORS, "[dc_vcard_plugIn] service_data is NULL");
+
+ sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+
+ char *temp_agent_data = 0;
+ contacts_record_h record = (contacts_record_h) service_data;
+
+ char *display_name = NULL;
+ int id;
+ contacts_record_get_str_p(record, _contacts_contact.display_name, &display_name);
+ contacts_record_get_int(record, _contacts_contact.id, &id);
+
+ _DEBUG_INFO("display_name = %s", display_name);
+ _DEBUG_INFO("id = %d", id);
+
+ /* Reverse_Converter */
+ err = contacts_vcard_make_from_contact(record, &temp_agent_data);
+ if (err != CONTACTS_ERROR_NONE) {
+ _DEBUG_ERROR("[dc_vcard_plugIn] contacts_vcard_make_from_contact() Fail!\n");
+ ret = _convert_service_error_to_common_error(err);
+ *agent_data = 0;
+ } else {
+ _DEBUG_INFO("[dc_vcard_plugIn] contacts_vcard_make_from_contact() Success!\n");
+ *agent_data = (void *)temp_agent_data;
+ _DEBUG_INFO("temp_agent_data = %s", temp_agent_data);
+ }
+
+ contacts_record_destroy(record, true);
+
+ _EXTERN_FUNC_EXIT;
+ return ret;
+}
+
+EXPORT_API void *sync_agent_plugin_alloc_object()
+{
+ _EXTERN_FUNC_ENTER;
+
+ char *agent_data = "BEGIN:VCARD\r\n\
+VERSION:2.1\r\n\
+END:VCARD";
+
+ _EXTERN_FUNC_EXIT;
+ return (void *)agent_data;
+}
+
+EXPORT_API int sync_agent_plugin_free_object(void *in_object)
+{
+ _EXTERN_FUNC_ENTER;
+ _DEBUG_INFO("[dc_vcard_plugIn] Do nothing\n");
+
+ return 1;
+}
+
+EXPORT_API void *sync_agent_plugin_set_value(void *in_object, int key, char *extension_key, void *value)
+{
+ _EXTERN_FUNC_ENTER;
+
+ char *new_agent_data = 0;
+ char *key_name = 0;
+
+ if (key == VCARD_CONTENT_NO_TYPE)
+ return (void *)new_agent_data;
+ else if (key == VCARD_CONTENT_EXTENSION)
+ key_name = extension_key;
+ else
+ key_name = _convert_key_name(key);
+
+ new_agent_data = _contacts_vcard_put_content((const char *)in_object, (const char *)key_name, (const char *)value);
+
+ _EXTERN_FUNC_EXIT;
+ return (void *)new_agent_data;
+}
+
+EXPORT_API void *sync_agent_plugin_get_value(void *in_object, int key, char *extension_key)
+{
+ _EXTERN_FUNC_ENTER;
+
+ char data[5000] = { 0, }; /* hard coding : size 1000 */
+ char *key_name = 0;
+ int result;
+
+ if (key == VCARD_CONTENT_NO_TYPE)
+ return 0;
+ else if (key == VCARD_CONTENT_EXTENSION)
+ key_name = extension_key;
+ else
+ key_name = _convert_key_name(key);
+
+ result = _contacts_vcard_get_content((const char *)in_object, (const char *)key_name, _get_content, data);
+ if (result == 0) {
+ _EXTERN_FUNC_EXIT;
+ return 0;
+ }
+
+ _EXTERN_FUNC_EXIT;
+
+ if (strlen(data) == 0)
+ return 0;
+ else
+ return strdup(data);
+}
+
+EXPORT_API sync_agent_plugin_object_info_s *sync_agent_plugin_get_obj_info()
+{
+ _EXTERN_FUNC_ENTER;
+
+ sync_agent_plugin_object_info_s *obj_info = (sync_agent_plugin_object_info_s *) calloc(1, sizeof(sync_agent_plugin_object_info_s));
+ if (obj_info == NULL) {
+ _DEBUG_ERROR("CALLOC failed !!!");
+ return NULL;
+ }
+
+ obj_info->type = VCARD_TYPE;
+ obj_info->version = VCARD_VERSION;
+ obj_info->field_cnt = sizeof(vcard_field_list) / sizeof(vcard_field_list_s);
+
+ if (obj_info->field_cnt > 0)
+ if (_set_obj_field_info(&(obj_info->field_list), obj_info->field_cnt, vcard_field_list) == 0) {
+ /* for prevent */
+ if (obj_info != NULL)
+ free(obj_info);
+
+ return NULL;
+ }
+
+ _EXTERN_FUNC_EXIT;
+ return obj_info;
+}
+
+EXPORT_API int sync_agent_plugin_free_obj_info(sync_agent_plugin_object_info_s * obj_info)
+{
+ _EXTERN_FUNC_ENTER;
+
+ if (obj_info != NULL) {
+ if (obj_info->field_cnt > 0)
+ if (_free_obj_field_info(obj_info->field_list, obj_info->field_cnt) == 0)
+ return 0;
+
+ free(obj_info);
+ }
+
+ _EXTERN_FUNC_EXIT;
+ return 1;
+}
+
+static int _free_obj_field_info(sync_agent_plugin_field_info_s * field_list, int count)
+{
+ _INNER_FUNC_ENTER;
+
+ int field_count = 0;
+ sync_agent_plugin_field_info_s *child = NULL;
+
+ if (field_list != NULL) {
+ for (field_count = 0; field_count < count; field_count++) {
+ child = field_list + field_count;
+ if (child->field_child_cnt > 0)
+ if (_free_obj_field_info(child->field_child_list, child->field_child_cnt) == 0)
+ return 0;
+ }
+ free(field_list);
+ }
+
+ _INNER_FUNC_EXIT;
+ return 1;
+}
+
+static int _set_obj_field_info(sync_agent_plugin_field_info_s ** field_list, int count, vcard_field_list_s * input_list)
+{
+ _INNER_FUNC_ENTER;
+
+ int field_count = 0;
+ sync_agent_plugin_field_info_s *child = NULL;
+
+ *field_list = (sync_agent_plugin_field_info_s *) calloc(count, sizeof(sync_agent_plugin_field_info_s));
+ if (*field_list == NULL) {
+ _DEBUG_ERROR("CALLOC failed !!!");
+ return 0;
+ }
+
+ for (field_count = 0; field_count < count; field_count++) {
+ child = (*field_list) + field_count;
+ child->field_name = input_list[field_count].field_name;
+ _DEBUG_TRACE("[%s]", child->field_name);
+
+ if (input_list[field_count].field_enum == VCARD_FIELD_BEGIN || input_list[field_count].field_enum == VCARD_FIELD_END) {
+ child->field_child_cnt = sizeof(vcard_field_list_begin_end) / sizeof(vcard_field_list_s);
+ _DEBUG_TRACE("----------");
+ _set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcard_field_list_begin_end);
+ _DEBUG_TRACE("==========");
+ } else if (input_list[field_count].field_enum == VCARD_FIELD_VERSION) {
+ child->field_child_cnt = sizeof(vcard_field_list_version) / sizeof(vcard_field_list_s);
+ _DEBUG_TRACE("----------");
+ _set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcard_field_list_version);
+ _DEBUG_TRACE("==========");
+ } else if (input_list[field_count].field_enum == VCARD_FIELD_ADR) {
+ child->field_child_cnt = sizeof(vcard_field_list_adr) / sizeof(vcard_field_list_s);
+ _DEBUG_TRACE("----------");
+ _set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcard_field_list_adr);
+ _DEBUG_TRACE("==========");
+ } else if (input_list[field_count].field_enum == VCARD_FIELD_TEL) {
+ child->field_child_cnt = sizeof(vcard_field_list_tel) / sizeof(vcard_field_list_s);
+ _DEBUG_TRACE("----------");
+ _set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcard_field_list_tel);
+ _DEBUG_TRACE("==========");
+ } else if (input_list[field_count].field_enum == VCARD_FIELD_EMAIL) {
+ child->field_child_cnt = sizeof(vcard_field_list_email) / sizeof(vcard_field_list_s);
+ _DEBUG_TRACE("----------");
+ _set_obj_field_info(&(child->field_child_list), child->field_child_cnt, vcard_field_list_email);
+ _DEBUG_TRACE("==========");
+ }
+ }
+
+ _INNER_FUNC_EXIT;
+ return 1;
+}
+
+static char *_convert_key_name(int key)
+{
+ _INNER_FUNC_ENTER;
+
+ char *key_name = 0;
+
+ switch (key) {
+ case VCARD_CONTENT_FN:
+ key_name = "FN";
+ break;
+ case VCARD_CONTENT_N:
+ key_name = "N";
+ break;
+ case VCARD_CONTENT_NICKNAME:
+ key_name = "NICKNAME";
+ break;
+ case VCARD_CONTENT_PHOTO:
+ key_name = "PHOTO";
+ break;
+ case VCARD_CONTENT_BDAY:
+ key_name = "BDAY";
+ break;
+ case VCARD_CONTENT_ADR:
+ key_name = "ADR";
+ break;
+ case VCARD_CONTENT_LABEL:
+ key_name = "LABEL";
+ break;
+ case VCARD_CONTENT_TEL:
+ key_name = "TEL";
+ break;
+ case VCARD_CONTENT_EMAIL:
+ key_name = "EMAIL";
+ break;
+ case VCARD_CONTENT_TITLE:
+ key_name = "TITLE";
+ break;
+ case VCARD_CONTENT_ROLE:
+ key_name = "ROLE";
+ break;
+ case VCARD_CONTENT_ORG:
+ key_name = "ORG";
+ break;
+ case VCARD_CONTENT_NOTE:
+ key_name = "NOTE";
+ break;
+ case VCARD_CONTENT_REV:
+ key_name = "REV";
+ break;
+ case VCARD_CONTENT_UID:
+ key_name = "UID";
+ break;
+ case VCARD_CONTENT_URL:
+ key_name = "URL";
+ break;
+ case VCARD_CONTENT_X_ANNIVERSARY:
+ key_name = "X-ANNIVERSARY";
+ break;
+ case VCARD_CONTENT_X_IRMC_LUID:
+ key_name = "X-IRMC-LUID";
+ break;
+ default:
+ break;
+ }
+
+ _INNER_FUNC_EXIT;
+ return key_name;
+}
+
+static int _get_content(const char *value, void *data)
+{
+ _INNER_FUNC_ENTER;
+
+ retvm_if(value == NULL, SYNC_AGENT_DA_ERRORS, "[dc_vcard_plugIn] value is NULL");
+
+ const char *line_breaker = "\r";
+ char *colon_loc = 0;
+ char *line_breaker_loc = 0;
+ int data_size = 0;
+
+ colon_loc = (char *)value;
+ line_breaker_loc = strstr(colon_loc, line_breaker);
+ data_size = line_breaker_loc - colon_loc;
+ _DEBUG_TRACE("[dc_vcard_plugIn] value : %s", value);
+ _DEBUG_TRACE("[dc_vcard_plugIn] colon_loc : %s", colon_loc);
+ _DEBUG_TRACE("[dc_vcard_plugIn] line_breaker_loc : %s", line_breaker_loc);
+ _DEBUG_TRACE("[dc_vcard_plugIn] data_size : %d", data_size);
+
+ /* hard coding : size 5000 */
+ memcpy((char *)data, colon_loc, data_size);
+
+ _INNER_FUNC_EXIT;
+ return 1;
+}
+
+static sync_agent_da_return_e _convert_service_error_to_common_error(contacts_error_e err)
+{
+ _INNER_FUNC_ENTER;
+
+ sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
+ _DEBUG_TRACE("[da_contact_plugIn] Error Code : %d\n", err);
+
+ switch (err) {
+ case CONTACTS_ERROR_NONE:
+ ret = SYNC_AGENT_DA_SUCCESS;
+ break;
+ case CONTACTS_ERROR_OUT_OF_MEMORY:
+ ret = SYNC_AGENT_DA_ERR_MEMORY_FULL;
+ break;
+ case CONTACTS_ERROR_INVALID_PARAMETER:
+ ret = SYNC_AGENT_DA_ERR_INVALID_PARAMETER;
+ break;
+ case CONTACTS_ERROR_NO_DATA:
+ ret = SYNC_AGENT_DA_ERR_NO_DATA;
+ break;
+ case CONTACTS_ERROR_DB:
+ ret = SYNC_AGENT_DA_ERR_SERVICE_DB;
+ break;
+ case CONTACTS_ERROR_IPC:
+ ret = SYNC_AGENT_DA_ERR_SERVICE_IPC;
+ break;
+ default:
+ ret = SYNC_AGENT_DA_ERRORS;
+ break;
+ }
+
+ _INNER_FUNC_EXIT;
+
+ return ret;
+}
+
+static char *_contacts_vcard_put_content(const char *vcard_stream, const char *content_type, const char *content_value)
+{
+ _INNER_FUNC_ENTER;
+
+ int i, org_len, new_len;
+ char *new_stream, *cur;
+ const char *end_content = "END:VCARD";
+
+ retvm_if(NULL == vcard_stream, NULL, "vcard_stream is NULL");
+ retvm_if(NULL == content_type, NULL, "content_type is NULL");
+ retvm_if(NULL == content_value, NULL, "content_value is NULL");
+
+ org_len = strlen(vcard_stream);
+ new_len = org_len + strlen(content_type) + strlen(content_value) + 8;
+
+ new_stream = malloc(new_len);
+ retvm_if(NULL == new_stream, NULL, "malloc() Failed");
+
+ memcpy(new_stream, vcard_stream, org_len);
+
+ i = 1;
+ for (cur = new_stream + new_len - 1; cur; cur--) {
+ if (end_content[9 - i] == *cur) {
+ if (9 == i)
+ break;
+ i++;
+ continue;
+ } else {
+ i = 1;
+ }
+ }
+ if (9 != i) {
+ _DEBUG_ERROR("vcard_stream is invalid(%s)", vcard_stream);
+ free(new_stream);
+ _INNER_FUNC_EXIT;
+ return NULL;
+ }
+
+ cur += snprintf(cur, new_len - (cur - new_stream), "%s:", content_type);
+ cur = strncpy(cur, content_value, new_len - (cur - new_stream));
+ snprintf(cur, new_len - (cur - new_stream), "\r\n%s\r\n", end_content);
+
+ _INNER_FUNC_EXIT;
+
+ return new_stream;
+}
+
+static int _contacts_vcard_get_content(const char *vcard_stream, const char *content_type, int (*fn) (const char *content_value, void *data), void *data)
+{
+ _INNER_FUNC_ENTER;
+
+ int len, buf_size, type_len;
+ char *cursor, *found, *value;
+
+ retv_if(NULL == vcard_stream, 0);
+ retv_if(NULL == content_type, 0);
+ retv_if(NULL == fn, 0);
+
+ type_len = strlen(content_type);
+ value = malloc(1024);
+ retvm_if(NULL == value, 0, "malloc() Failed");
+ buf_size = 1024;
+
+ while ((found = strstr(vcard_stream, content_type))) {
+ if ((found != vcard_stream && '\n' != *(found - 1))
+ && ':' != *(found + type_len + 1))
+ continue;
+
+ cursor = found;
+ while (*cursor) {
+ if ('\r' == *cursor)
+ cursor++;
+ if ('\n' == *cursor) {
+ if (' ' != *(cursor + 1))
+ break;
+ }
+
+ cursor++;
+ }
+ len = cursor - found;
+ if (len < buf_size)
+ memcpy(value, found, len);
+ else {
+ value = realloc(value, len + 1);
+ if (value) {
+ buf_size = len + 1;
+ memcpy(value, found, len);
+ } else {
+ vcard_stream = found + type_len;
+ continue;
+ }
+ }
+ value[len] = '\0';
+ if (fn)
+ if (fn(value + type_len + 1, data)) {
+ free(value);
+ _INNER_FUNC_EXIT;
+ return 0;
+ }
+ vcard_stream = found + type_len;
+ }
+
+ free(value);
+
+ _INNER_FUNC_EXIT;
+ return 1;
+}
+
+static void _contacts_struct_merge(contacts_record_h old, contacts_record_h new)
+{
+ _INNER_FUNC_ENTER;
+
+ __contacts_struct_property_merge(old, new);
+
+ __contacts_struct_child_property_merge(_contacts_contact.name, old, new);
+ __contacts_struct_child_property_merge(_contacts_contact.image, old, new);
+ __contacts_struct_child_property_merge(_contacts_contact.company, old, new);
+ __contacts_struct_child_property_merge(_contacts_contact.note, old, new);
+ __contacts_struct_child_property_merge(_contacts_contact.number, old, new);
+ __contacts_struct_child_property_merge(_contacts_contact.email, old, new);
+ __contacts_struct_child_property_merge(_contacts_contact.event, old, new);
+ __contacts_struct_child_property_merge(_contacts_contact.messenger, old, new);
+ __contacts_struct_child_property_merge(_contacts_contact.address, old, new);
+ __contacts_struct_child_property_merge(_contacts_contact.url, old, new);
+ __contacts_struct_child_property_merge(_contacts_contact.nickname, old, new);
+ __contacts_struct_child_property_merge(_contacts_contact.profile, old, new);
+// __contacts_struct_child_property_merge(_contacts_contact.relationship, old, new);
+// __contacts_struct_child_property_merge(_contacts_contact.group_relation, old, new);
+ __contacts_struct_child_property_merge(_contacts_contact.extension, old, new);
+
+ _INNER_FUNC_EXIT;
+}
+
+static void __contacts_struct_property_merge(contacts_record_h old, contacts_record_h new)
+{
+ _INNER_FUNC_ENTER;
+
+// contacts_error_e err = CONTACTS_ERROR_NONE;
+//
+// char *ringtone_path = NULL;
+// char *image_thumbnail_path = NULL;
+// char *uid = NULL;
+// char *vibration = NULL;
+//
+// err = contacts_record_get_str_p(new, _contacts_contact.ringtone_path, &ringtone_path);
+// if (err != CONTACTS_ERROR_NONE)
+// _DEBUG_ERROR("contacts_record_get_str_p(ringtone_path) is failed");
+//
+// if (ringtone_path != NULL) {
+// _DEBUG_TRACE("ringtone_path = %s", ringtone_path);
+// err = contacts_record_set_str(old, _contacts_contact.ringtone_path, ringtone_path);
+// if (err != CONTACTS_ERROR_NONE)
+// _DEBUG_ERROR("contacts_record_set_str(%s) is failed", ringtone_path);
+// }
+//
+// err = contacts_record_get_str_p(new, _contacts_contact.image_thumbnail_path, &image_thumbnail_path);
+// if (err != CONTACTS_ERROR_NONE)
+// _DEBUG_ERROR("contacts_record_get_str_p(image_thumbnail_path) is failed");
+//
+// if (image_thumbnail_path != NULL) {
+// _DEBUG_TRACE("image_thumbnail_path = %s", image_thumbnail_path);
+// err = contacts_record_set_str(old, _contacts_contact.image_thumbnail_path, image_thumbnail_path);
+// if (err != CONTACTS_ERROR_NONE)
+// _DEBUG_ERROR("contacts_record_set_str(%s) is failed", image_thumbnail_path);
+// }
+//
+// err = contacts_record_get_str_p(new, _contacts_contact.uid, &uid);
+// if (err != CONTACTS_ERROR_NONE)
+// _DEBUG_ERROR("contacts_record_get_str_p(uid) is failed");
+//
+// if (uid != NULL) {
+// _DEBUG_TRACE("uid = %s", uid);
+// err = contacts_record_set_str(old, _contacts_contact.uid, uid);
+// if (err != CONTACTS_ERROR_NONE)
+// _DEBUG_ERROR("contacts_record_set_str(%s) is failed", uid);
+// }
+//
+// err = contacts_record_get_str_p(new, _contacts_contact.vibration, &vibration);
+// if (err != CONTACTS_ERROR_NONE)
+// _DEBUG_ERROR("contacts_record_get_str_p(vibration) is failed");
+//
+// if (vibration != NULL) {
+// _DEBUG_TRACE("vibration = %s", vibration);
+// err = contacts_record_set_str(old, _contacts_contact.vibration, vibration);
+// if (err != CONTACTS_ERROR_NONE)
+// _DEBUG_ERROR("contacts_record_set_str(%s) is failed", vibration);
+// }
+
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+
+ char *image_thumbnail_path = NULL;
+
+ err = contacts_record_get_str_p(new, _contacts_contact.image_thumbnail_path, &image_thumbnail_path);
+ if (err != CONTACTS_ERROR_NONE)
+ _DEBUG_ERROR("contacts_record_get_str_p(image_thumbnail_path) is failed");
+
+ if (image_thumbnail_path != NULL) {
+ _DEBUG_TRACE("image_thumbnail_path = %s", image_thumbnail_path);
+ err = contacts_record_set_str(old, _contacts_contact.image_thumbnail_path, image_thumbnail_path);
+ if (err != CONTACTS_ERROR_NONE)
+ _DEBUG_ERROR("contacts_record_set_str(%s) is failed", image_thumbnail_path);
+ }
+
+ _INNER_FUNC_EXIT;
+}
+
+static void __contacts_struct_child_property_merge(unsigned int property_id, contacts_record_h old, contacts_record_h new)
+{
+ _INNER_FUNC_ENTER;
+
+ contacts_error_e err = CONTACTS_ERROR_NONE;
+
+ unsigned int old_count = 0;
+ unsigned int new_count = 0;
+
+ contacts_record_h old_record = NULL;
+ contacts_record_h new_record = NULL;
+ contacts_record_h new_cloned_record = NULL;
+
+ _DEBUG_TRACE("property_id = %d", property_id);
+
+ err = contacts_record_get_child_record_count(old, property_id, &old_count);
+ if (err != CONTACTS_ERROR_NONE)
+ _DEBUG_ERROR("contacts_record_get_child_record_count is failed");
+
+ _DEBUG_TRACE("old_count = %d", old_count);
+
+ int i;
+ for (i = 0; i < old_count; i++) {
+
+ err = contacts_record_get_child_record_at_p(old, property_id, 0, &old_record);
+ if (err != CONTACTS_ERROR_NONE)
+ _DEBUG_ERROR("contacts_record_get_child_record_at_p is failed");
+
+ err = contacts_record_remove_child_record(old, property_id, old_record);
+ if (err != CONTACTS_ERROR_NONE)
+ _DEBUG_ERROR("contacts_record_remove_child_record is failed");
+ }
+
+ err = contacts_record_get_child_record_count(new, property_id, &new_count);
+ if (err != CONTACTS_ERROR_NONE)
+ _DEBUG_ERROR("contacts_record_get_child_record_count is failed");
+
+ _DEBUG_TRACE("new_count = %d", new_count);
+
+ for (i = 0; i < new_count; i++) {
+
+ err = contacts_record_get_child_record_at_p(new, property_id, i, &new_record);
+ if (err != CONTACTS_ERROR_NONE)
+ _DEBUG_ERROR("contacts_record_get_child_record_at_p is failed");
+
+ err = contacts_record_clone(new_record, &new_cloned_record);
+ if (err != CONTACTS_ERROR_NONE)
+ _DEBUG_ERROR("contacts_record_clone is failed");
+
+ err = contacts_record_add_child_record(old, property_id, new_cloned_record);
+ if (err != CONTACTS_ERROR_NONE)
+ _DEBUG_ERROR("contacts_record_add_child_record is failed");
+ }
+
+ _INNER_FUNC_EXIT;
+}
+
+//static void _remove_vcard_field(CTSstruct *contact)
+//{
+// _INNER_FUNC_ENTER;
+//
+// GSList *numbers = 0, *email = 0, *event = 0, *postal = 0, *web = 0, *nick = 0;
+// CTSvalue *name = 0, *company = 0, *base = 0;
+//
+// /* free name */
+// contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &name);
+// contacts_svc_value_set_str(name, CTS_NAME_VAL_FIRST_STR, 0);
+// contacts_svc_value_set_str(name, CTS_NAME_VAL_LAST_STR, 0);
+// contacts_svc_value_set_str(name, CTS_NAME_VAL_ADDITION_STR, 0);
+// contacts_svc_value_set_str(name, CTS_NAME_VAL_SUFFIX_STR, 0);
+// contacts_svc_value_set_str(name, CTS_NAME_VAL_PREFIX_STR, 0);
+// contacts_svc_value_set_str(name, CTS_NAME_VAL_FIRST_STR, 0);
+//
+// /* free company */
+// contacts_svc_struct_get_value(contact, CTS_VALUE_COMPANY, &company);
+// contacts_svc_value_set_str(company, CTS_COMPANY_VAL_NAME_STR, 0);
+// contacts_svc_value_set_str(company, CTS_COMPANY_VAL_DEPARTMENT_STR, 0);
+// contacts_svc_value_set_str(company, CTS_COMPANY_VAL_JOB_TITLE_STR, 0);
+// contacts_svc_value_set_str(company, CTS_COMPANY_VAL_ROLE_STR, 0);
+//
+// /* free base */
+// contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &base);
+// contacts_svc_value_set_str(base, CTS_BASE_VAL_IMG_PATH_STR, 0);
+// //contacts_svc_value_set_str(base, CTS_BASE_VAL_FULL_IMG_PATH_STR, 0);
+// contacts_svc_value_set_str(base, CTS_NOTE_VAL_NOTE_STR, 0);
+//
+// /* free number */
+// contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &numbers);
+// g_slist_foreach(numbers, _remove_vcard_gslist_field, (gpointer) CTS_NUM_VAL_DELETE_BOOL);
+//
+// /* free email */
+// contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &email);
+// g_slist_foreach(email, _remove_vcard_gslist_field, (gpointer) CTS_EMAIL_VAL_DELETE_BOOL);
+//
+// /* free event */
+// contacts_svc_struct_get_list(contact, CTS_CF_EVENT_LIST, &event);
+// g_slist_foreach(event, _remove_vcard_gslist_field, (gpointer) CTS_EVENT_VAL_DELETE_BOOL);
+//
+// /* free postal */
+// contacts_svc_struct_get_list(contact, CTS_CF_POSTAL_ADDR_LIST, &postal);
+// g_slist_foreach(postal, _remove_vcard_gslist_field, (gpointer) CTS_POSTAL_VAL_DEFAULT_BOOL);
+//
+// /* free web */
+// contacts_svc_struct_get_list(contact, CTS_CF_WEB_ADDR_LIST, &web);
+// g_slist_foreach(web, _remove_vcard_gslist_field, (gpointer) CTS_WEB_VAL_DELETE_BOOL);
+//
+// /* free nick */
+// contacts_svc_struct_get_list(contact, CTS_CF_NICKNAME_LIST, &nick);
+// g_slist_foreach(nick, _remove_vcard_gslist_field, (gpointer) CTS_NICKNAME_VAL_DELETE_BOOL);
+//
+// _INNER_FUNC_EXIT;
+//}
+//
+//static void _remove_vcard_gslist_field(gpointer data, gpointer user_data)
+//{
+// _INNER_FUNC_ENTER;
+//
+// contacts_svc_value_set_bool((CTSvalue *) data, (int)user_data, 1);
+//
+// _INNER_FUNC_EXIT;
+//}