3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Apache License, Version 2.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
23 #include <sync_agent.h>
25 #include "plugin_spec.h"
26 #include "encoding_util.h"
29 #define EXPORT_API __attribute__ ((visibility("default")))
32 #ifndef OMADS_AGENT_LOG
34 #define LOG_TAG "PLUGIN_XCALLLOG"
37 static char *_convert_key_name(int key);
38 static sync_agent_da_return_e _convert_service_error_to_common_error(contacts_error_e err);
40 static char *_convert_calllog_type(int type);
41 static char *_convert_date(int date);
42 static sync_agent_da_return_e _get_calllog_name(int contact_id, char **name);
44 static char *_calllog_put_content(char *vcard_stream, char *content_type, char *content_value);
46 static char *_convert_key_name(int key)
53 case XCALLLOG_CONTENT_FN:
56 case XCALLLOG_CONTENT_X_NUMBER:
57 key_name = "X-NUMBER";
59 case XCALLLOG_CONTENT_X_DATE:
62 case XCALLLOG_CONTENT_X_DURATION:
63 key_name = "X-DURATION";
65 case XCALLLOG_CONTENT_X_CALLTYPE:
66 key_name = "X-CALLTYPE";
76 static sync_agent_da_return_e _convert_service_error_to_common_error(contacts_error_e err)
80 sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
81 _DEBUG_TRACE("[da_contact_plugIn] Error Code : %d\n", err);
84 case CONTACTS_ERROR_NONE:
85 ret = SYNC_AGENT_DA_SUCCESS;
87 case CONTACTS_ERROR_OUT_OF_MEMORY:
88 ret = SYNC_AGENT_DA_ERR_MEMORY_FULL;
90 case CONTACTS_ERROR_INVALID_PARAMETER:
91 ret = SYNC_AGENT_DA_ERR_INVALID_PARAMETER;
93 case CONTACTS_ERROR_NO_DATA:
94 ret = SYNC_AGENT_DA_ERR_NO_DATA;
96 case CONTACTS_ERROR_DB:
97 ret = SYNC_AGENT_DA_ERR_SERVICE_DB;
99 case CONTACTS_ERROR_IPC:
100 ret = SYNC_AGENT_DA_ERR_SERVICE_IPC;
103 ret = SYNC_AGENT_DA_ERRORS;
112 static char *_convert_calllog_type(int type)
116 char *log_type = NULL;
119 case 1: /*CTS_PLOG_TYPE_VOICE_INCOMMING */
120 case 3: /*CTS_PLOG_TYPE_VIDEO_INCOMMING */
123 case 2: /*CTS_PLOG_TYPE_VOICE_OUTGOING */
124 case 4: /*CTS_PLOG_TYPE_VIDEO_OUTGOING */
127 case 5: /*CTS_PLOG_TYPE_VOICE_INCOMMING_UNSEEN */
128 case 6: /*CTS_PLOG_TYPE_VOICE_INCOMMING_SEEN */
129 case 7: /*CTS_PLOG_TYPE_VIDEO_INCOMMING_UNSEEN */
130 case 8: /*CTS_PLOG_TYPE_VIDEO_INCOMMING_SEEN */
139 static char *_convert_date(int time)
143 char *date = (char *)calloc(17, sizeof(char));
145 _DEBUG_ERROR("CALLOC failed !!!");
149 struct tm *tm = localtime((time_t *) & time);
153 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);
159 static sync_agent_da_return_e _get_calllog_name(int contact_id, char **name)
163 // sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
164 // cts_error err = 0;
165 // CTSstruct *item = 0;
166 // CTSvalue *value = NULL;
167 // char *first_name = NULL;
168 // char *last_name = NULL;
170 // if (contact_id != 0) {
171 // err = contacts_svc_get_contact(contact_id, &item);
172 // if (err < CTS_SUCCESS) {
173 // _DEBUG_ERROR("[da_xcalllog_plugIn] contacts_svc_get_contact() Fail!\n");
174 // ret = _convert_service_error_to_common_error(err);
177 // _DEBUG_TRACE("[da_xcalllog_plugIn] contacts_svc_get_contact() Success!\n");
179 // contacts_svc_struct_get_value(item, CTS_CF_NAME_VALUE, &value);
180 // first_name = (char *)contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR);
181 // _DEBUG_TRACE("name = %s", first_name);
183 // last_name = (char *)contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR);
184 // _DEBUG_TRACE("name = %s", last_name);
185 // *name = g_strdup_printf("%s %s", first_name, last_name);
190 sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
191 contacts_error_e err = CONTACTS_ERROR_NONE;
192 contacts_record_h record = NULL;
194 if (contact_id != 0) {
195 err = contacts_db_get_record(_contacts_person_phone_log._uri, contact_id, &record);
196 if (err != CONTACTS_ERROR_NONE) {
197 _DEBUG_ERROR("[da_xcalllog_plugIn] contacts_db_get_record() Fail!\n");
198 ret = _convert_service_error_to_common_error(err);
201 _DEBUG_TRACE("[da_xcalllog_plugIn] contacts_db_get_record() Success!\n");
203 err = contacts_record_get_str(record, _contacts_person_phone_log.display_name, name);
204 if (err != CONTACTS_ERROR_NONE) {
205 _DEBUG_ERROR("[da_xcalllog_plugIn] contacts_db_get_record() Fail!\n");
206 ret = _convert_service_error_to_common_error(err);
217 static char *_calllog_put_content(char *vcard_stream, char *content_type, char *content_value)
221 retvm_if(vcard_stream == NULL, NULL, "vcard_stream is NULL\n");
222 retvm_if(content_type == NULL, NULL, "content_type is NULL\n");
223 retvm_if(content_value == NULL, NULL, "content_value is NULL\n");
225 char *new_stream = NULL;
227 new_stream = g_strdup_printf("%s%s:%s\r\n", vcard_stream, content_type, content_value);
229 _DEBUG_TRACE("old stream =%s", vcard_stream);
230 _DEBUG_TRACE("new stream =%s", new_stream);
238 EXPORT_API void *sync_agent_plugin_alloc_object()
242 char *agent_data = strdup("BEGIN:CALLLOG\r\n\
246 return (void *)agent_data;
249 EXPORT_API void *sync_agent_plugin_set_value(void *in_object, int key, char *extension_key, void *value)
253 char *new_agent_data = 0;
256 if (key == XCALLLOG_CONTENT_NO_TYPE)
257 return (void *)new_agent_data;
258 else if (key == XCALLLOG_CONTENT_EXTENSION)
259 key_name = extension_key;
261 key_name = _convert_key_name(key);
263 new_agent_data = _calllog_put_content(in_object, key_name, value);
266 return (void *)new_agent_data;
269 EXPORT_API int sync_agent_plugin_free_object(void *in_object)
272 _DEBUG_INFO("[dc_xcalllog_plugIn] Do nothing\n");
278 EXPORT_API sync_agent_da_return_e sync_agent_plugin_reverse_converter(void *service_data, void **agent_data)
282 // retvm_if(service_data == NULL, SYNC_AGENT_DA_ERRORS, "service_data is NULL");
284 // sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
285 // CTSvalue *plog = (CTSvalue *) service_data;
287 // void *data = NULL;
288 // char *duration = NULL;
289 // char *log_type = NULL;
290 // char *name = NULL;
291 // char *date = NULL;
294 // date = _convert_date(contacts_svc_value_get_int(plog, CTS_PLOG_VAL_LOG_TIME_INT));
295 // if( date == NULL )
296 // return SYNC_AGENT_DA_ERRORS;
299 // duration = g_strdup_printf("%d", contacts_svc_value_get_int(plog, CTS_PLOG_VAL_DURATION_INT));
302 // log_type = _convert_calllog_type(contacts_svc_value_get_int(plog, CTS_PLOG_VAL_LOG_TYPE_INT));
305 // ret = _get_calllog_name(contacts_svc_value_get_int(plog, CTS_PLOG_VAL_RELATED_ID_INT), &name);
307 // /*create default object */
308 // data = sync_agent_alloc_object_plugin();
310 // data = sync_agent_set_value_plugin(data, XCALLLOG_CONTENT_X_NUMBER, NULL, (void *)contacts_svc_value_get_str(plog, CTS_PLOG_VAL_NUMBER_STR));
311 // data = sync_agent_set_value_plugin(data, XCALLLOG_CONTENT_X_DATE, NULL, (void *)date);
312 // data = sync_agent_set_value_plugin(data, XCALLLOG_CONTENT_X_DURATION, NULL, (void *)duration);
315 // data = sync_agent_set_value_plugin(data, XCALLLOG_CONTENT_FN, NULL, name);
317 // data = sync_agent_set_value_plugin(data, XCALLLOG_CONTENT_X_CALLTYPE, NULL, log_type);
319 // *agent_data = g_strdup_printf("%sEND:CALLLOG", (char *)data);
324 // if (duration != NULL)
330 // if (date != NULL) {
334 retvm_if(service_data == NULL, SYNC_AGENT_DA_ERRORS, "service_data is NULL");
336 sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
337 contacts_error_e err = CONTACTS_ERROR_NONE;
338 contacts_record_h record = (contacts_record_h) service_data;
341 char *duration = NULL;
342 char *log_type = NULL;
352 err = contacts_record_get_int(record, _contacts_phone_log.log_time, &log_time);
353 if (err != CONTACTS_ERROR_NONE) {
354 _DEBUG_ERROR("[dc_xcalllog_plugIn] contacts_record_get_int is failed");
355 ret = _convert_service_error_to_common_error(err);
359 err = contacts_record_get_int(record, _contacts_phone_log.extra_data1, &temp_duration);
360 if (err != CONTACTS_ERROR_NONE) {
361 _DEBUG_ERROR("[dc_xcalllog_plugIn] contacts_record_get_int is failed");
362 ret = _convert_service_error_to_common_error(err);
366 err = contacts_record_get_int(record, _contacts_phone_log.log_type, &temp_log_type);
367 if (err != CONTACTS_ERROR_NONE) {
368 _DEBUG_ERROR("[dc_xcalllog_plugIn] contacts_record_get_int is failed");
369 ret = _convert_service_error_to_common_error(err);
373 err = contacts_record_get_int(record, _contacts_phone_log.person_id, &person_id);
374 if (err != CONTACTS_ERROR_NONE) {
375 _DEBUG_ERROR("[dc_xcalllog_plugIn] contacts_record_get_int is failed");
376 ret = _convert_service_error_to_common_error(err);
380 err = contacts_record_get_str_p(record, _contacts_phone_log.address, &number);
381 if (err != CONTACTS_ERROR_NONE) {
382 _DEBUG_ERROR("[dc_xcalllog_plugIn] contacts_record_get_int is failed");
383 ret = _convert_service_error_to_common_error(err);
388 date = _convert_date(log_time);
390 return SYNC_AGENT_DA_ERRORS;
393 duration = g_strdup_printf("%d", temp_duration);
396 log_type = _convert_calllog_type(temp_log_type);
399 ret = _get_calllog_name(person_id, &name);
401 /*create default object */
402 data = sync_agent_plugin_alloc_object();
404 data = sync_agent_plugin_set_value(data, XCALLLOG_CONTENT_X_NUMBER, NULL, (void *)number);
405 data = sync_agent_plugin_set_value(data, XCALLLOG_CONTENT_X_DATE, NULL, (void *)date);
406 data = sync_agent_plugin_set_value(data, XCALLLOG_CONTENT_X_DURATION, NULL, (void *)duration);
409 data = sync_agent_plugin_set_value(data, XCALLLOG_CONTENT_FN, NULL, name);
411 data = sync_agent_plugin_set_value(data, XCALLLOG_CONTENT_X_CALLTYPE, NULL, log_type);
413 *agent_data = g_strdup_printf("%sEND:CALLLOG", (char *)data);
420 if (duration != NULL)