diff options
Diffstat (limited to 'src/plugins/ds-public/xcalllog/src/plugin_interface.c')
-rwxr-xr-x | src/plugins/ds-public/xcalllog/src/plugin_interface.c | 432 |
1 files changed, 432 insertions, 0 deletions
diff --git a/src/plugins/ds-public/xcalllog/src/plugin_interface.c b/src/plugins/ds-public/xcalllog/src/plugin_interface.c new file mode 100755 index 0000000..3ba4c05 --- /dev/null +++ b/src/plugins/ds-public/xcalllog/src/plugin_interface.c @@ -0,0 +1,432 @@ +/* + * 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 <time.h> + +#include <sync_agent.h> + +#include "plugin_spec.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_XCALLLOG" +#endif + +static char *_convert_key_name(int key); +static sync_agent_da_return_e _convert_service_error_to_common_error(contacts_error_e err); + +static char *_convert_calllog_type(int type); +static char *_convert_date(int date); +static sync_agent_da_return_e _get_calllog_name(int contact_id, char **name); + +static char *_calllog_put_content(char *vcard_stream, char *content_type, char *content_value); + +static char *_convert_key_name(int key) +{ + _INNER_FUNC_ENTER; + + char *key_name = 0; + + switch (key) { + case XCALLLOG_CONTENT_FN: + key_name = "FN"; + break; + case XCALLLOG_CONTENT_X_NUMBER: + key_name = "X-NUMBER"; + break; + case XCALLLOG_CONTENT_X_DATE: + key_name = "X-DATE"; + break; + case XCALLLOG_CONTENT_X_DURATION: + key_name = "X-DURATION"; + break; + case XCALLLOG_CONTENT_X_CALLTYPE: + key_name = "X-CALLTYPE"; + break; + default: + break; + } + + _INNER_FUNC_EXIT; + return key_name; +} + +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 *_convert_calllog_type(int type) +{ + _INNER_FUNC_ENTER; + + char *log_type = NULL; + + switch (type) { + case 1: /*CTS_PLOG_TYPE_VOICE_INCOMMING */ + case 3: /*CTS_PLOG_TYPE_VIDEO_INCOMMING */ + log_type = "1"; + break; + case 2: /*CTS_PLOG_TYPE_VOICE_OUTGOING */ + case 4: /*CTS_PLOG_TYPE_VIDEO_OUTGOING */ + log_type = "2"; + break; + case 5: /*CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN */ + case 6: /*CTS_PLOG_TYPE_VOICE_INCOMMING_SEEN */ + case 7: /*CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN */ + case 8: /*CTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN */ + log_type = "3"; + break; + } + + _INNER_FUNC_EXIT; + return log_type; +} + +static char *_convert_date(int time) +{ + _INNER_FUNC_ENTER; + + char *date = (char *)calloc(17, sizeof(char)); + if (date == NULL) { + _DEBUG_ERROR("CALLOC failed !!!"); + return NULL; + } + + struct tm *tm = localtime((time_t *) & time); + + memset(date, 0, 17); + + snprintf(date, 17, "%04ld%02d%02dT%02d%02d%02dZ", tm->tm_year + 1900L, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); + + _INNER_FUNC_EXIT; + return date; +} + +static sync_agent_da_return_e _get_calllog_name(int contact_id, char **name) +{ + _INNER_FUNC_ENTER; + +// sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS; +// cts_error err = 0; +// CTSstruct *item = 0; +// CTSvalue *value = NULL; +// char *first_name = NULL; +// char *last_name = NULL; +// +// if (contact_id != 0) { +// err = contacts_svc_get_contact(contact_id, &item); +// if (err < CTS_SUCCESS) { +// _DEBUG_ERROR("[da_xcalllog_plugIn] contacts_svc_get_contact() Fail!\n"); +// ret = _convert_service_error_to_common_error(err); +// *name = 0; +// } else { +// _DEBUG_TRACE("[da_xcalllog_plugIn] contacts_svc_get_contact() Success!\n"); +// +// contacts_svc_struct_get_value(item, CTS_CF_NAME_VALUE, &value); +// first_name = (char *)contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR); +// _DEBUG_TRACE("name = %s", first_name); +// +// last_name = (char *)contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR); +// _DEBUG_TRACE("name = %s", last_name); +// *name = g_strdup_printf("%s %s", first_name, last_name); +// } +// } else +// name = 0; + + sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS; + contacts_error_e err = CONTACTS_ERROR_NONE; + contacts_record_h record = NULL; + + if (contact_id != 0) { + err = contacts_db_get_record(_contacts_person_phone_log._uri, contact_id, &record); + if (err != CONTACTS_ERROR_NONE) { + _DEBUG_ERROR("[da_xcalllog_plugIn] contacts_db_get_record() Fail!\n"); + ret = _convert_service_error_to_common_error(err); + *name = 0; + } else { + _DEBUG_TRACE("[da_xcalllog_plugIn] contacts_db_get_record() Success!\n"); + + err = contacts_record_get_str(record, _contacts_person_phone_log.display_name, name); + if (err != CONTACTS_ERROR_NONE) { + _DEBUG_ERROR("[da_xcalllog_plugIn] contacts_db_get_record() Fail!\n"); + ret = _convert_service_error_to_common_error(err); + *name = 0; + } + } + } else + name = 0; + + _INNER_FUNC_EXIT; + return ret; +} + +static char *_calllog_put_content(char *vcard_stream, char *content_type, char *content_value) +{ + _INNER_FUNC_ENTER; + + retvm_if(vcard_stream == NULL, NULL, "vcard_stream is NULL\n"); + retvm_if(content_type == NULL, NULL, "content_type is NULL\n"); + retvm_if(content_value == NULL, NULL, "content_value is NULL\n"); + + char *new_stream = NULL; + + new_stream = g_strdup_printf("%s%s:%s\r\n", vcard_stream, content_type, content_value); + + _DEBUG_TRACE("old stream =%s", vcard_stream); + _DEBUG_TRACE("new stream =%s", new_stream); + + free(vcard_stream); + + _INNER_FUNC_EXIT; + return new_stream; +} + +EXPORT_API void *sync_agent_plugin_alloc_object() +{ + _EXTERN_FUNC_ENTER; + + char *agent_data = strdup("BEGIN:CALLLOG\r\n\ +"); + + _EXTERN_FUNC_EXIT; + return (void *)agent_data; +} + +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 == XCALLLOG_CONTENT_NO_TYPE) + return (void *)new_agent_data; + else if (key == XCALLLOG_CONTENT_EXTENSION) + key_name = extension_key; + else + key_name = _convert_key_name(key); + + new_agent_data = _calllog_put_content(in_object, key_name, value); + + _EXTERN_FUNC_EXIT; + return (void *)new_agent_data; +} + +EXPORT_API int sync_agent_plugin_free_object(void *in_object) +{ + _EXTERN_FUNC_ENTER; + _DEBUG_INFO("[dc_xcalllog_plugIn] Do nothing\n"); + + _EXTERN_FUNC_EXIT; + return 1; +} + +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, "service_data is NULL"); +// +// sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS; +// CTSvalue *plog = (CTSvalue *) service_data; +// +// void *data = NULL; +// char *duration = NULL; +// char *log_type = NULL; +// char *name = NULL; +// char *date = NULL; +// +// /*date */ +// date = _convert_date(contacts_svc_value_get_int(plog, CTS_PLOG_VAL_LOG_TIME_INT)); +// if( date == NULL ) +// return SYNC_AGENT_DA_ERRORS; +// +// /*duration */ +// duration = g_strdup_printf("%d", contacts_svc_value_get_int(plog, CTS_PLOG_VAL_DURATION_INT)); +// +// /* type */ +// log_type = _convert_calllog_type(contacts_svc_value_get_int(plog, CTS_PLOG_VAL_LOG_TYPE_INT)); +// +// /*name */ +// ret = _get_calllog_name(contacts_svc_value_get_int(plog, CTS_PLOG_VAL_RELATED_ID_INT), &name); +// +// /*create default object */ +// data = sync_agent_alloc_object_plugin(); +// +// data = sync_agent_set_value_plugin(data, XCALLLOG_CONTENT_X_NUMBER, NULL, (void *)contacts_svc_value_get_str(plog, CTS_PLOG_VAL_NUMBER_STR)); +// data = sync_agent_set_value_plugin(data, XCALLLOG_CONTENT_X_DATE, NULL, (void *)date); +// data = sync_agent_set_value_plugin(data, XCALLLOG_CONTENT_X_DURATION, NULL, (void *)duration); +// +// if (name != NULL) +// data = sync_agent_set_value_plugin(data, XCALLLOG_CONTENT_FN, NULL, name); +// +// data = sync_agent_set_value_plugin(data, XCALLLOG_CONTENT_X_CALLTYPE, NULL, log_type); +// +// *agent_data = g_strdup_printf("%sEND:CALLLOG", (char *)data); +// +// if (data != NULL) +// free(data); +// +// if (duration != NULL) +// free(duration); +// +// if (name != NULL) +// free(name); +// +// if (date != NULL) { +// free(date); +// } + + retvm_if(service_data == NULL, SYNC_AGENT_DA_ERRORS, "service_data is NULL"); + + sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS; + contacts_error_e err = CONTACTS_ERROR_NONE; + contacts_record_h record = (contacts_record_h) service_data; + + void *data = NULL; + char *duration = NULL; + char *log_type = NULL; + char *name = NULL; + char *date = NULL; + + int log_time; + int temp_duration; + int temp_log_type; + int person_id; + char *number = NULL; + + err = contacts_record_get_int(record, _contacts_phone_log.log_time, &log_time); + if (err != CONTACTS_ERROR_NONE) { + _DEBUG_ERROR("[dc_xcalllog_plugIn] contacts_record_get_int is failed"); + ret = _convert_service_error_to_common_error(err); + goto error; + } + + err = contacts_record_get_int(record, _contacts_phone_log.extra_data1, &temp_duration); + if (err != CONTACTS_ERROR_NONE) { + _DEBUG_ERROR("[dc_xcalllog_plugIn] contacts_record_get_int is failed"); + ret = _convert_service_error_to_common_error(err); + goto error; + } + + err = contacts_record_get_int(record, _contacts_phone_log.log_type, &temp_log_type); + if (err != CONTACTS_ERROR_NONE) { + _DEBUG_ERROR("[dc_xcalllog_plugIn] contacts_record_get_int is failed"); + ret = _convert_service_error_to_common_error(err); + goto error; + } + + err = contacts_record_get_int(record, _contacts_phone_log.person_id, &person_id); + if (err != CONTACTS_ERROR_NONE) { + _DEBUG_ERROR("[dc_xcalllog_plugIn] contacts_record_get_int is failed"); + ret = _convert_service_error_to_common_error(err); + goto error; + } + + err = contacts_record_get_str_p(record, _contacts_phone_log.address, &number); + if (err != CONTACTS_ERROR_NONE) { + _DEBUG_ERROR("[dc_xcalllog_plugIn] contacts_record_get_int is failed"); + ret = _convert_service_error_to_common_error(err); + goto error; + } + + /*date */ + date = _convert_date(log_time); + if (date == NULL) + return SYNC_AGENT_DA_ERRORS; + + /*duration */ + duration = g_strdup_printf("%d", temp_duration); + + /* type */ + log_type = _convert_calllog_type(temp_log_type); + + /*name */ + ret = _get_calllog_name(person_id, &name); + + /*create default object */ + data = sync_agent_plugin_alloc_object(); + + data = sync_agent_plugin_set_value(data, XCALLLOG_CONTENT_X_NUMBER, NULL, (void *)number); + data = sync_agent_plugin_set_value(data, XCALLLOG_CONTENT_X_DATE, NULL, (void *)date); + data = sync_agent_plugin_set_value(data, XCALLLOG_CONTENT_X_DURATION, NULL, (void *)duration); + + if (name != NULL) + data = sync_agent_plugin_set_value(data, XCALLLOG_CONTENT_FN, NULL, name); + + data = sync_agent_plugin_set_value(data, XCALLLOG_CONTENT_X_CALLTYPE, NULL, log_type); + + *agent_data = g_strdup_printf("%sEND:CALLLOG", (char *)data); + + error: + + if (data != NULL) + free(data); + + if (duration != NULL) + free(duration); + + if (name != NULL) + free(name); + + if (date != NULL) { + free(date); + } + + _EXTERN_FUNC_EXIT; + return ret; +} |