improve line coverage
[platform/core/pim/contacts-service.git] / common / ctsvc_record_phonelog.c
1 /*
2  * Contacts Service
3  *
4  * Copyright (c) 2010 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include "contacts.h"
21
22 #include "ctsvc_internal.h"
23 #include "ctsvc_record.h"
24 #include "ctsvc_view.h"
25
26 static int __ctsvc_phonelog_create(contacts_record_h *out_record);
27 static int __ctsvc_phonelog_destroy(contacts_record_h record, bool delete_child);
28 static int __ctsvc_phonelog_clone(contacts_record_h record, contacts_record_h *out_record);
29 static int __ctsvc_phonelog_get_int(contacts_record_h record, unsigned int property_id, int *out);
30 static int __ctsvc_phonelog_get_str(contacts_record_h record, unsigned int property_id, char **out_str);
31 static int __ctsvc_phonelog_get_str_p(contacts_record_h record, unsigned int property_id, char **out_str);
32 static int __ctsvc_phonelog_set_int(contacts_record_h record, unsigned int property_id, int value, bool *is_dirty);
33 static int __ctsvc_phonelog_set_str(contacts_record_h record, unsigned int property_id, const char *str, bool *is_dirty);
34
35 ctsvc_record_plugin_cb_s phonelog_plugin_cbs = {
36         .create = __ctsvc_phonelog_create,
37         .destroy = __ctsvc_phonelog_destroy,
38         .clone = __ctsvc_phonelog_clone,
39         .get_str = __ctsvc_phonelog_get_str,
40         .get_str_p = __ctsvc_phonelog_get_str_p,
41         .get_int = __ctsvc_phonelog_get_int,
42         .get_bool = NULL,
43         .get_lli = NULL,
44         .get_double = NULL,
45         .set_str = __ctsvc_phonelog_set_str,
46         .set_int = __ctsvc_phonelog_set_int,
47         .set_bool = NULL,
48         .set_lli = NULL,
49         .set_double = NULL,
50         .add_child_record = NULL,
51         .remove_child_record = NULL,
52         .get_child_record_count = NULL,
53         .get_child_record_at_p = NULL,
54         .clone_child_record_list = NULL,
55 };
56
57 static int __ctsvc_phonelog_create(contacts_record_h *out_record)
58 {
59         ctsvc_phonelog_s *phonelog;
60
61         phonelog = calloc(1, sizeof(ctsvc_phonelog_s));
62         RETVM_IF(NULL == phonelog, CONTACTS_ERROR_OUT_OF_MEMORY, "calloc() Fail");
63
64         *out_record = (contacts_record_h)phonelog;
65
66         return CONTACTS_ERROR_NONE;
67 }
68
69 static int __ctsvc_phonelog_destroy(contacts_record_h record, bool delete_child)
70 {
71         ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
72         phonelog->base.plugin_cbs = NULL; /* help to find double destroy bug (refer to the contacts_record_destroy) */
73         free(phonelog->base.properties_flags);
74
75         free(phonelog->address);
76         free(phonelog->extra_data2);
77         free(phonelog);
78
79         return CONTACTS_ERROR_NONE;
80 }
81
82 static int __ctsvc_phonelog_clone(contacts_record_h record, contacts_record_h *out_record)
83 {
84         ctsvc_phonelog_s *out_data = NULL;
85         ctsvc_phonelog_s *src_data = NULL;
86
87         src_data = (ctsvc_phonelog_s*)record;
88         out_data = calloc(1, sizeof(ctsvc_phonelog_s));
89         RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY,
90                         "Out of memeory : calloc(ctsvc_phonelog_s) Fail(%d)", CONTACTS_ERROR_OUT_OF_MEMORY);
91
92         out_data->id = src_data->id;
93         out_data->address = SAFE_STRDUP(src_data->address);
94         out_data->person_id = src_data->person_id;
95         out_data->log_time = src_data->log_time;
96         out_data->log_type = src_data->log_type;
97         out_data->extra_data1 = src_data->extra_data1;
98         out_data->extra_data2 = SAFE_STRDUP(src_data->extra_data2);
99         out_data->sim_slot_no = src_data->sim_slot_no;
100
101         int ret = ctsvc_record_copy_base(&(out_data->base), &(src_data->base));
102         if (CONTACTS_ERROR_NONE != ret) {
103                 /* LCOV_EXCL_START */
104                 ERR("ctsvc_record_copy_base() Fail");
105                 __ctsvc_phonelog_destroy((contacts_record_h)out_data, true);
106                 return ret;
107                 /* LCOV_EXCL_STOP */
108         }
109
110         *out_record = (contacts_record_h)out_data;
111         return CONTACTS_ERROR_NONE;
112 }
113
114 static int __ctsvc_phonelog_get_int(contacts_record_h record, unsigned int property_id, int *out)
115 {
116         ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
117
118         switch (property_id) {
119         case CTSVC_PROPERTY_PHONELOG_ID:
120                 *out = phonelog->id;
121                 break;
122         case CTSVC_PROPERTY_PHONELOG_PERSON_ID:
123                 *out = phonelog->person_id;
124                 break;
125         case CTSVC_PROPERTY_PHONELOG_LOG_TIME:
126                 *out = phonelog->log_time;
127                 break;
128         case CTSVC_PROPERTY_PHONELOG_LOG_TYPE:
129                 *out = phonelog->log_type;
130                 break;
131         case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1:
132                 *out = phonelog->extra_data1;
133                 break;
134         case CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO:
135                 *out = phonelog->sim_slot_no;
136                 break;
137         default:
138                 /* LCOV_EXCL_START */
139                 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
140                 return CONTACTS_ERROR_INVALID_PARAMETER;
141                 /* LCOV_EXCL_STOP */
142         }
143         return CONTACTS_ERROR_NONE;
144 }
145
146 static int __ctsvc_phonelog_get_str_real(contacts_record_h record, unsigned int property_id, char **out_str, bool copy)
147 {
148         ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
149
150         switch (property_id) {
151         case CTSVC_PROPERTY_PHONELOG_ADDRESS:
152                 *out_str = GET_STR(copy, phonelog->address);
153                 break;
154         case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2:
155                 *out_str = GET_STR(copy, phonelog->extra_data2);
156                 break;
157         default:
158                 /* LCOV_EXCL_START */
159                 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
160                 return CONTACTS_ERROR_INVALID_PARAMETER;
161                 /* LCOV_EXCL_STOP */
162         }
163         return CONTACTS_ERROR_NONE;
164 }
165
166 static int __ctsvc_phonelog_get_str_p(contacts_record_h record, unsigned int property_id, char **out_str)
167 {
168         return __ctsvc_phonelog_get_str_real(record, property_id, out_str, false);
169 }
170
171 static int __ctsvc_phonelog_get_str(contacts_record_h record, unsigned int property_id, char **out_str)
172 {
173         return __ctsvc_phonelog_get_str_real(record, property_id, out_str, true);
174 }
175
176 static int __ctsvc_phonelog_set_int(contacts_record_h record, unsigned int property_id, int value, bool *is_dirty)
177 {
178         ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
179
180         switch (property_id) {
181         case CTSVC_PROPERTY_PHONELOG_ID:
182                 CHECK_DIRTY_VAL(phonelog->id, value, is_dirty);
183                 phonelog->id = value;
184                 break;
185         case CTSVC_PROPERTY_PHONELOG_PERSON_ID:
186                 RETVM_IF(0 < phonelog->id, CONTACTS_ERROR_INVALID_PARAMETER,
187                                 "property_id(%d) is a read-only value (phonelog)", property_id);
188                 CHECK_DIRTY_VAL(phonelog->person_id, value, is_dirty);
189                 phonelog->person_id = value;
190                 break;
191         case CTSVC_PROPERTY_PHONELOG_LOG_TIME:
192                 RETVM_IF(0 < phonelog->id, CONTACTS_ERROR_INVALID_PARAMETER,
193                                 "property_id(%d) is a read-only value (phonelog)", property_id);
194                 CHECK_DIRTY_VAL(phonelog->log_time, value, is_dirty);
195                 phonelog->log_time = value;
196                 break;
197         case CTSVC_PROPERTY_PHONELOG_LOG_TYPE:
198                 if ((CONTACTS_PLOG_TYPE_NONE <= value
199                                         && value <= CONTACTS_PLOG_TYPE_VIDEO_BLOCKED)
200                                 || (CONTACTS_PLOG_TYPE_MMS_INCOMING <= value
201                                         && value <= CONTACTS_PLOG_TYPE_MMS_BLOCKED)
202                                 || (CONTACTS_PLOG_TYPE_EMAIL_RECEIVED <= value
203                                         && value <= CONTACTS_PLOG_TYPE_EMAIL_SENT)
204                    ) {
205                         CHECK_DIRTY_VAL(phonelog->log_type, value, is_dirty);
206                         phonelog->log_type = value;
207                 } else {
208                         ERR("log type is in invalid range (%d)", value);
209                         return CONTACTS_ERROR_INVALID_PARAMETER;
210                 }
211                 break;
212         case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1:
213                 RETVM_IF(0 < phonelog->id, CONTACTS_ERROR_INVALID_PARAMETER,
214                                 "property_id(%d) is a read-only value (phonelog)", property_id);
215                 CHECK_DIRTY_VAL(phonelog->extra_data1, value, is_dirty);
216                 phonelog->extra_data1 = value;
217                 break;
218         case CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO:
219                 RETVM_IF(0 < phonelog->id, CONTACTS_ERROR_INVALID_PARAMETER,
220                                 "property_id(%d) is a read-only value (phonelog)", property_id);
221                 CHECK_DIRTY_VAL(phonelog->sim_slot_no, value, is_dirty);
222                 phonelog->sim_slot_no = value;
223                 break;
224         default:
225                 /* LCOV_EXCL_START */
226                 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
227                 return CONTACTS_ERROR_INVALID_PARAMETER;
228                 /* LCOV_EXCL_STOP */
229         }
230         return CONTACTS_ERROR_NONE;
231 }
232
233 static int __ctsvc_phonelog_set_str(contacts_record_h record, unsigned int property_id, const char *str, bool *is_dirty)
234 {
235         ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
236
237         switch (property_id) {
238         case CTSVC_PROPERTY_PHONELOG_ADDRESS:
239                 RETVM_IF(0 < phonelog->id, CONTACTS_ERROR_INVALID_PARAMETER,
240                                 "property_id(%d) is a read-only value (phonelog)", property_id);
241                 CHECK_DIRTY_STR(phonelog->address, str, is_dirty);
242                 FREEandSTRDUP(phonelog->address, str);
243                 break;
244         case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2:
245                 CHECK_DIRTY_STR(phonelog->extra_data2, str, is_dirty);
246                 FREEandSTRDUP(phonelog->extra_data2, str);
247                 break;
248         default:
249                 /* LCOV_EXCL_START */
250                 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
251                 return CONTACTS_ERROR_INVALID_PARAMETER;
252                 /* LCOV_EXCL_STOP */
253         }
254         return CONTACTS_ERROR_NONE;
255 }
256