summaryrefslogtreecommitdiff
path: root/src/plugins/ds-public/xcalllog/src/plugin_interface.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/ds-public/xcalllog/src/plugin_interface.c')
-rwxr-xr-xsrc/plugins/ds-public/xcalllog/src/plugin_interface.c432
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;
+}