Tizen 2.0 Release
[pkgs/o/oma-ds-service.git] / src / plugins / ds-public / xcalllog / src / plugin_interface.c
1 /*
2  * oma-ds-agent
3  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4  *
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
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  */
17
18 #include <stdio.h>
19 #include <contacts.h>
20 #include <glib.h>
21 #include <time.h>
22
23 #include <sync_agent.h>
24
25 #include "plugin_spec.h"
26 #include "encoding_util.h"
27
28 #ifndef EXPORT_API
29 #define EXPORT_API __attribute__ ((visibility("default")))
30 #endif
31
32 #ifndef OMADS_AGENT_LOG
33 #undef LOG_TAG
34 #define LOG_TAG "PLUGIN_XCALLLOG"
35 #endif
36
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);
39
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);
43
44 static char *_calllog_put_content(char *vcard_stream, char *content_type, char *content_value);
45
46 static char *_convert_key_name(int key)
47 {
48         _INNER_FUNC_ENTER;
49
50         char *key_name = 0;
51
52         switch (key) {
53         case XCALLLOG_CONTENT_FN:
54                 key_name = "FN";
55                 break;
56         case XCALLLOG_CONTENT_X_NUMBER:
57                 key_name = "X-NUMBER";
58                 break;
59         case XCALLLOG_CONTENT_X_DATE:
60                 key_name = "X-DATE";
61                 break;
62         case XCALLLOG_CONTENT_X_DURATION:
63                 key_name = "X-DURATION";
64                 break;
65         case XCALLLOG_CONTENT_X_CALLTYPE:
66                 key_name = "X-CALLTYPE";
67                 break;
68         default:
69                 break;
70         }
71
72         _INNER_FUNC_EXIT;
73         return key_name;
74 }
75
76 static sync_agent_da_return_e _convert_service_error_to_common_error(contacts_error_e err)
77 {
78         _INNER_FUNC_ENTER;
79
80         sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
81         _DEBUG_TRACE("[da_contact_plugIn] Error Code : %d\n", err);
82
83         switch (err) {
84         case CONTACTS_ERROR_NONE:
85                 ret = SYNC_AGENT_DA_SUCCESS;
86                 break;
87         case CONTACTS_ERROR_OUT_OF_MEMORY:
88                 ret = SYNC_AGENT_DA_ERR_MEMORY_FULL;
89                 break;
90         case CONTACTS_ERROR_INVALID_PARAMETER:
91                 ret = SYNC_AGENT_DA_ERR_INVALID_PARAMETER;
92                 break;
93         case CONTACTS_ERROR_NO_DATA:
94                 ret = SYNC_AGENT_DA_ERR_NO_DATA;
95                 break;
96         case CONTACTS_ERROR_DB:
97                 ret = SYNC_AGENT_DA_ERR_SERVICE_DB;
98                 break;
99         case CONTACTS_ERROR_IPC:
100                 ret = SYNC_AGENT_DA_ERR_SERVICE_IPC;
101                 break;
102         default:
103                 ret = SYNC_AGENT_DA_ERRORS;
104                 break;
105         }
106
107         _INNER_FUNC_EXIT;
108
109         return ret;
110 }
111
112 static char *_convert_calllog_type(int type)
113 {
114         _INNER_FUNC_ENTER;
115
116         char *log_type = NULL;
117
118         switch (type) {
119         case 1:         /*CTS_PLOG_TYPE_VOICE_INCOMMING */
120         case 3:         /*CTS_PLOG_TYPE_VIDEO_INCOMMING */
121                 log_type = "1";
122                 break;
123         case 2:         /*CTS_PLOG_TYPE_VOICE_OUTGOING */
124         case 4:         /*CTS_PLOG_TYPE_VIDEO_OUTGOING */
125                 log_type = "2";
126                 break;
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 */
131                 log_type = "3";
132                 break;
133         }
134
135         _INNER_FUNC_EXIT;
136         return log_type;
137 }
138
139 static char *_convert_date(int time)
140 {
141         _INNER_FUNC_ENTER;
142
143         char *date = (char *)calloc(17, sizeof(char));
144         if (date == NULL) {
145                 _DEBUG_ERROR("CALLOC failed !!!");
146                 return NULL;
147         }
148
149         struct tm *tm = localtime((time_t *) & time);
150
151         memset(date, 0, 17);
152
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);
154
155         _INNER_FUNC_EXIT;
156         return date;
157 }
158
159 static sync_agent_da_return_e _get_calllog_name(int contact_id, char **name)
160 {
161         _INNER_FUNC_ENTER;
162
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;
169 //
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);
175 //                      *name = 0;
176 //              } else {
177 //                      _DEBUG_TRACE("[da_xcalllog_plugIn] contacts_svc_get_contact() Success!\n");
178 //
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);
182 //
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);
186 //              }
187 //      } else
188 //              name = 0;
189
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;
193
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);
199                         *name = 0;
200                 } else {
201                         _DEBUG_TRACE("[da_xcalllog_plugIn] contacts_db_get_record() Success!\n");
202
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);
207                                 *name = 0;
208                         }
209                 }
210         } else
211                 name = 0;
212
213         _INNER_FUNC_EXIT;
214         return ret;
215 }
216
217 static char *_calllog_put_content(char *vcard_stream, char *content_type, char *content_value)
218 {
219         _INNER_FUNC_ENTER;
220
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");
224
225         char *new_stream = NULL;
226
227         new_stream = g_strdup_printf("%s%s:%s\r\n", vcard_stream, content_type, content_value);
228
229         _DEBUG_TRACE("old stream =%s", vcard_stream);
230         _DEBUG_TRACE("new stream =%s", new_stream);
231
232         free(vcard_stream);
233
234         _INNER_FUNC_EXIT;
235         return new_stream;
236 }
237
238 EXPORT_API void *sync_agent_plugin_alloc_object()
239 {
240         _EXTERN_FUNC_ENTER;
241
242         char *agent_data = strdup("BEGIN:CALLLOG\r\n\
243 ");
244
245         _EXTERN_FUNC_EXIT;
246         return (void *)agent_data;
247 }
248
249 EXPORT_API void *sync_agent_plugin_set_value(void *in_object, int key, char *extension_key, void *value)
250 {
251         _EXTERN_FUNC_ENTER;
252
253         char *new_agent_data = 0;
254         char *key_name = 0;
255
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;
260         else
261                 key_name = _convert_key_name(key);
262
263         new_agent_data = _calllog_put_content(in_object, key_name, value);
264
265         _EXTERN_FUNC_EXIT;
266         return (void *)new_agent_data;
267 }
268
269 EXPORT_API int sync_agent_plugin_free_object(void *in_object)
270 {
271         _EXTERN_FUNC_ENTER;
272         _DEBUG_INFO("[dc_xcalllog_plugIn] Do nothing\n");
273
274         _EXTERN_FUNC_EXIT;
275         return 1;
276 }
277
278 EXPORT_API sync_agent_da_return_e sync_agent_plugin_reverse_converter(void *service_data, void **agent_data)
279 {
280         _EXTERN_FUNC_ENTER;
281
282 //      retvm_if(service_data == NULL, SYNC_AGENT_DA_ERRORS, "service_data is NULL");
283 //
284 //      sync_agent_da_return_e ret = SYNC_AGENT_DA_SUCCESS;
285 //      CTSvalue *plog = (CTSvalue *) service_data;
286 //
287 //      void *data = NULL;
288 //      char *duration = NULL;
289 //      char *log_type = NULL;
290 //      char *name = NULL;
291 //      char *date = NULL;
292 //
293 //      /*date */
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;
297 //
298 //      /*duration */
299 //      duration = g_strdup_printf("%d", contacts_svc_value_get_int(plog, CTS_PLOG_VAL_DURATION_INT));
300 //
301 //      /* type */
302 //      log_type = _convert_calllog_type(contacts_svc_value_get_int(plog, CTS_PLOG_VAL_LOG_TYPE_INT));
303 //
304 //      /*name */
305 //      ret = _get_calllog_name(contacts_svc_value_get_int(plog, CTS_PLOG_VAL_RELATED_ID_INT), &name);
306 //
307 //      /*create default object */
308 //      data = sync_agent_alloc_object_plugin();
309 //
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);
313 //
314 //      if (name != NULL)
315 //              data = sync_agent_set_value_plugin(data, XCALLLOG_CONTENT_FN, NULL, name);
316 //
317 //      data = sync_agent_set_value_plugin(data, XCALLLOG_CONTENT_X_CALLTYPE, NULL, log_type);
318 //
319 //      *agent_data = g_strdup_printf("%sEND:CALLLOG", (char *)data);
320 //
321 //      if (data != NULL)
322 //              free(data);
323 //
324 //      if (duration != NULL)
325 //              free(duration);
326 //
327 //      if (name != NULL)
328 //              free(name);
329 //
330 //      if (date != NULL) {
331 //              free(date);
332 //      }
333
334         retvm_if(service_data == NULL, SYNC_AGENT_DA_ERRORS, "service_data is NULL");
335
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;
339
340         void *data = NULL;
341         char *duration = NULL;
342         char *log_type = NULL;
343         char *name = NULL;
344         char *date = NULL;
345
346         int log_time;
347         int temp_duration;
348         int temp_log_type;
349         int person_id;
350         char *number = NULL;
351
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);
356                 goto error;
357         }
358
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);
363                 goto error;
364         }
365
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);
370                 goto error;
371         }
372
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);
377                 goto error;
378         }
379
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);
384                 goto error;
385         }
386
387         /*date */
388         date = _convert_date(log_time);
389         if (date == NULL)
390                 return SYNC_AGENT_DA_ERRORS;
391
392         /*duration */
393         duration = g_strdup_printf("%d", temp_duration);
394
395         /* type */
396         log_type = _convert_calllog_type(temp_log_type);
397
398         /*name */
399         ret = _get_calllog_name(person_id, &name);
400
401         /*create default object */
402         data = sync_agent_plugin_alloc_object();
403
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);
407
408         if (name != NULL)
409                 data = sync_agent_plugin_set_value(data, XCALLLOG_CONTENT_FN, NULL, name);
410
411         data = sync_agent_plugin_set_value(data, XCALLLOG_CONTENT_X_CALLTYPE, NULL, log_type);
412
413         *agent_data = g_strdup_printf("%sEND:CALLLOG", (char *)data);
414
415  error:
416
417         if (data != NULL)
418                 free(data);
419
420         if (duration != NULL)
421                 free(duration);
422
423         if (name != NULL)
424                 free(name);
425
426         if (date != NULL) {
427                 free(date);
428         }
429
430         _EXTERN_FUNC_EXIT;
431         return ret;
432 }