improve line coverage
[platform/core/pim/contacts-service.git] / common / ctsvc_record_group.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 #include "ctsvc_internal.h"
22 #include "ctsvc_record.h"
23 #include "ctsvc_view.h"
24
25 static int __ctsvc_group_create(contacts_record_h *out_record);
26 static int __ctsvc_group_destroy(contacts_record_h record, bool delete_child);
27 static int __ctsvc_group_clone(contacts_record_h record, contacts_record_h *out_record);
28 static int __ctsvc_group_get_int(contacts_record_h record, unsigned int property_id, int *out);
29 static int __ctsvc_group_get_str(contacts_record_h record, unsigned int property_id, char **out_str);
30 static int __ctsvc_group_get_str_p(contacts_record_h record, unsigned int property_id, char **out_str);
31 static int __ctsvc_group_get_bool(contacts_record_h record, unsigned int property_id, bool *value);
32 static int __ctsvc_group_set_int(contacts_record_h record, unsigned int property_id, int value, bool *is_dirty);
33 static int __ctsvc_group_set_str(contacts_record_h record, unsigned int property_id, const char *str, bool *is_dirty);
34 static int __ctsvc_group_set_bool(contacts_record_h record, unsigned int property_id, bool value, bool *is_dirty);
35
36
37 ctsvc_record_plugin_cb_s group_plugin_cbs = {
38         .create = __ctsvc_group_create,
39         .destroy = __ctsvc_group_destroy,
40         .clone = __ctsvc_group_clone,
41         .get_str = __ctsvc_group_get_str,
42         .get_str_p = __ctsvc_group_get_str_p,
43         .get_int = __ctsvc_group_get_int,
44         .get_bool = __ctsvc_group_get_bool,
45         .get_lli = NULL,
46         .get_double = NULL,
47         .set_str = __ctsvc_group_set_str,
48         .set_int = __ctsvc_group_set_int,
49         .set_bool = __ctsvc_group_set_bool,
50         .set_lli = NULL,
51         .set_double = NULL,
52         .add_child_record = NULL,
53         .remove_child_record = NULL,
54         .get_child_record_count = NULL,
55         .get_child_record_at_p = NULL,
56         .clone_child_record_list = NULL,
57 };
58
59 static int __ctsvc_group_create(contacts_record_h *out_record)
60 {
61         ctsvc_group_s *group;
62
63         group = calloc(1, sizeof(ctsvc_group_s));
64         RETVM_IF(NULL == group, CONTACTS_ERROR_OUT_OF_MEMORY, "calloc() Fail");
65
66         *out_record = (contacts_record_h)group;
67         return CONTACTS_ERROR_NONE;
68 }
69
70 static int __ctsvc_group_destroy(contacts_record_h record, bool delete_child)
71 {
72         ctsvc_group_s *group = (ctsvc_group_s*)record;
73         group->base.plugin_cbs = NULL; /* help to find double destroy bug (refer to the contacts_record_destroy) */
74         free(group->base.properties_flags);
75
76         free(group->name);
77         free(group->ringtone_path);
78         free(group->vibration);
79         free(group->message_alert);
80         free(group->image_thumbnail_path);
81         free(group->extra_data);
82         free(group);
83
84         return CONTACTS_ERROR_NONE;
85 }
86
87 static int __ctsvc_group_clone(contacts_record_h record, contacts_record_h *out_record)
88 {
89         ctsvc_group_s *out_data = NULL;
90         ctsvc_group_s *src_data = NULL;
91
92         src_data = (ctsvc_group_s*)record;
93         out_data = calloc(1, sizeof(ctsvc_group_s));
94         RETVM_IF(NULL == out_data, CONTACTS_ERROR_OUT_OF_MEMORY,
95                         "Out of memeory : calloc(ctsvc_group_s) Fail(%d)",
96                         CONTACTS_ERROR_OUT_OF_MEMORY);
97
98         out_data->id = src_data->id;
99         out_data->addressbook_id = src_data->addressbook_id;
100         out_data->is_read_only = src_data->is_read_only;
101         out_data->name = SAFE_STRDUP(src_data->name);
102         out_data->extra_data = SAFE_STRDUP(src_data->extra_data);
103         out_data->vibration = SAFE_STRDUP(src_data->vibration);
104         out_data->message_alert = SAFE_STRDUP(src_data->message_alert);
105         out_data->ringtone_path = SAFE_STRDUP(src_data->ringtone_path);
106         out_data->image_thumbnail_path = SAFE_STRDUP(src_data->image_thumbnail_path);
107
108         int ret = ctsvc_record_copy_base(&(out_data->base), &(src_data->base));
109         if (CONTACTS_ERROR_NONE != ret) {
110                 /* LCOV_EXCL_START */
111                 ERR("ctsvc_record_copy_base() Fail");
112                 __ctsvc_group_destroy((contacts_record_h)out_data, true);
113                 return ret;
114                 /* LCOV_EXCL_STOP */
115         }
116
117         *out_record = (contacts_record_h)out_data;
118         return CONTACTS_ERROR_NONE;
119 }
120
121 static int __ctsvc_group_get_int(contacts_record_h record, unsigned int property_id, int *out)
122 {
123         ctsvc_group_s *group = (ctsvc_group_s*)record;
124
125         switch (property_id) {
126         case CTSVC_PROPERTY_GROUP_ID:
127                 *out = group->id;
128                 break;
129         case CTSVC_PROPERTY_GROUP_ADDRESSBOOK_ID:
130                 *out = group->addressbook_id;
131                 break;
132         default:
133                 /* LCOV_EXCL_START */
134                 ERR("property_id(%d) is not supported in value(group)", property_id);
135                 return CONTACTS_ERROR_INVALID_PARAMETER;
136                 /* LCOV_EXCL_STOP */
137         }
138         return CONTACTS_ERROR_NONE;
139 }
140
141 static int __ctsvc_group_get_str_real(contacts_record_h record, unsigned int property_id, char **out_str, bool copy)
142 {
143         ctsvc_group_s *group = (ctsvc_group_s*)record;
144
145         switch (property_id) {
146         case CTSVC_PROPERTY_GROUP_NAME:
147                 *out_str = GET_STR(copy, group->name);
148                 break;
149         case CTSVC_PROPERTY_GROUP_RINGTONE:
150                 *out_str = GET_STR(copy, group->ringtone_path);
151                 break;
152         case CTSVC_PROPERTY_GROUP_IMAGE:
153                 *out_str = GET_STR(copy, group->image_thumbnail_path);
154                 break;
155         case CTSVC_PROPERTY_GROUP_VIBRATION:
156                 *out_str = GET_STR(copy, group->vibration);
157                 break;
158         case CTSVC_PROPERTY_GROUP_MESSAGE_ALERT:
159                 *out_str = GET_STR(copy, group->message_alert);
160                 break;
161         case CTSVC_PROPERTY_GROUP_EXTRA_DATA:
162                 *out_str = GET_STR(copy, group->extra_data);
163                 break;
164         default:
165                 /* LCOV_EXCL_START */
166                 ERR("property_id(%d) is not supported in value(group)", property_id);
167                 return CONTACTS_ERROR_INVALID_PARAMETER;
168                 /* LCOV_EXCL_STOP */
169         }
170         return CONTACTS_ERROR_NONE;
171 }
172
173 static int __ctsvc_group_get_str_p(contacts_record_h record, unsigned int property_id, char **out_str)
174 {
175         return __ctsvc_group_get_str_real(record, property_id, out_str, false);
176 }
177
178 static int __ctsvc_group_get_str(contacts_record_h record, unsigned int property_id, char **out_str)
179 {
180         return __ctsvc_group_get_str_real(record, property_id, out_str, true);
181 }
182
183 static int __ctsvc_group_set_int(contacts_record_h record, unsigned int property_id, int value, bool *is_dirty)
184 {
185         ctsvc_group_s *group = (ctsvc_group_s*)record;
186
187         switch (property_id) {
188         case CTSVC_PROPERTY_GROUP_ID:
189                 CHECK_DIRTY_VAL(group->id, value, is_dirty);
190                 group->id = value;
191                 break;
192         case CTSVC_PROPERTY_GROUP_ADDRESSBOOK_ID:
193                 RETVM_IF(0 < group->id, CONTACTS_ERROR_INVALID_PARAMETER,
194                                 "property_id(%d) is a read-only value (group)", property_id);
195                 CHECK_DIRTY_VAL(group->addressbook_id, value, is_dirty);
196                 group->addressbook_id = value;
197                 break;
198         default:
199                 /* LCOV_EXCL_START */
200                 ERR("property_id(%d) is not supported in value(group)", property_id);
201                 return CONTACTS_ERROR_INVALID_PARAMETER;
202                 /* LCOV_EXCL_STOP */
203         }
204         return CONTACTS_ERROR_NONE;
205 }
206
207 static int __ctsvc_group_set_str(contacts_record_h record, unsigned int property_id, const char *str, bool *is_dirty)
208 {
209         ctsvc_group_s *group = (ctsvc_group_s*)record;
210
211         switch (property_id) {
212         case CTSVC_PROPERTY_GROUP_NAME:
213                 CHECK_DIRTY_STR(group->name, str, is_dirty);
214                 FREEandSTRDUP(group->name, str);
215                 break;
216         case CTSVC_PROPERTY_GROUP_RINGTONE:
217                 CHECK_DIRTY_STR(group->ringtone_path, str, is_dirty);
218                 FREEandSTRDUP(group->ringtone_path, str);
219                 break;
220         case CTSVC_PROPERTY_GROUP_IMAGE:
221                 CHECK_DIRTY_STR(group->image_thumbnail_path, str, is_dirty);
222                 FREEandSTRDUP(group->image_thumbnail_path, str);
223                 break;
224         case CTSVC_PROPERTY_GROUP_VIBRATION:
225                 CHECK_DIRTY_STR(group->vibration, str, is_dirty);
226                 FREEandSTRDUP(group->vibration, str);
227                 break;
228         case CTSVC_PROPERTY_GROUP_MESSAGE_ALERT:
229                 CHECK_DIRTY_STR(group->message_alert, str, is_dirty);
230                 FREEandSTRDUP(group->message_alert, str);
231                 break;
232         case CTSVC_PROPERTY_GROUP_EXTRA_DATA:
233                 CHECK_DIRTY_STR(group->extra_data, str, is_dirty);
234                 FREEandSTRDUP(group->extra_data, str);
235                 break;
236         default:
237                 /* LCOV_EXCL_START */
238                 ERR("property_id(%d) is not supported in value(group)", property_id);
239                 return CONTACTS_ERROR_INVALID_PARAMETER;
240                 /* LCOV_EXCL_STOP */
241         }
242         return CONTACTS_ERROR_NONE;
243 }
244
245 static int __ctsvc_group_get_bool(contacts_record_h record, unsigned int property_id, bool *value)
246 {
247         ctsvc_group_s *group = (ctsvc_group_s*)record;
248         switch (property_id) {
249         case CTSVC_PROPERTY_GROUP_IS_READ_ONLY:
250                 *value = group->is_read_only;
251                 break;
252         default:
253                 /* LCOV_EXCL_START */
254                 ERR("property_id(%d) is not supported in value(group)", property_id);
255                 return CONTACTS_ERROR_INVALID_PARAMETER;
256                 /* LCOV_EXCL_STOP */
257         }
258         return CONTACTS_ERROR_NONE;
259 }
260
261 static int __ctsvc_group_set_bool(contacts_record_h record, unsigned int property_id, bool value, bool *is_dirty)
262 {
263         ctsvc_group_s *group = (ctsvc_group_s*)record;
264
265         switch (property_id) {
266         case CTSVC_PROPERTY_GROUP_IS_READ_ONLY:
267                 RETVM_IF(0 < group->id, CONTACTS_ERROR_INVALID_PARAMETER,
268                                 "property_id(%d) is a read-only value (group)", property_id);
269                 CHECK_DIRTY_VAL(group->is_read_only, value, is_dirty);
270                 group->is_read_only = value;
271                 break;
272         default:
273                 /* LCOV_EXCL_START */
274                 ERR("property_id(%d) is not supported in value(group)", property_id);
275                 return CONTACTS_ERROR_INVALID_PARAMETER;
276                 /* LCOV_EXCL_STOP */
277         }
278         return CONTACTS_ERROR_NONE;
279 }