4 * Copyright (c) 2010 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 #include "ctsvc_internal.h"
22 #include "ctsvc_record.h"
23 #include "ctsvc_view.h"
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);
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,
47 .set_str = __ctsvc_group_set_str,
48 .set_int = __ctsvc_group_set_int,
49 .set_bool = __ctsvc_group_set_bool,
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,
59 static int __ctsvc_group_create(contacts_record_h *out_record)
63 group = calloc(1, sizeof(ctsvc_group_s));
64 RETVM_IF(NULL == group, CONTACTS_ERROR_OUT_OF_MEMORY, "calloc() Fail");
66 *out_record = (contacts_record_h)group;
67 return CONTACTS_ERROR_NONE;
70 static int __ctsvc_group_destroy(contacts_record_h record, bool delete_child)
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);
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);
84 return CONTACTS_ERROR_NONE;
87 static int __ctsvc_group_clone(contacts_record_h record, contacts_record_h *out_record)
89 ctsvc_group_s *out_data = NULL;
90 ctsvc_group_s *src_data = NULL;
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);
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);
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);
117 *out_record = (contacts_record_h)out_data;
118 return CONTACTS_ERROR_NONE;
121 static int __ctsvc_group_get_int(contacts_record_h record, unsigned int property_id, int *out)
123 ctsvc_group_s *group = (ctsvc_group_s*)record;
125 switch (property_id) {
126 case CTSVC_PROPERTY_GROUP_ID:
129 case CTSVC_PROPERTY_GROUP_ADDRESSBOOK_ID:
130 *out = group->addressbook_id;
133 /* LCOV_EXCL_START */
134 ERR("property_id(%d) is not supported in value(group)", property_id);
135 return CONTACTS_ERROR_INVALID_PARAMETER;
138 return CONTACTS_ERROR_NONE;
141 static int __ctsvc_group_get_str_real(contacts_record_h record, unsigned int property_id, char **out_str, bool copy)
143 ctsvc_group_s *group = (ctsvc_group_s*)record;
145 switch (property_id) {
146 case CTSVC_PROPERTY_GROUP_NAME:
147 *out_str = GET_STR(copy, group->name);
149 case CTSVC_PROPERTY_GROUP_RINGTONE:
150 *out_str = GET_STR(copy, group->ringtone_path);
152 case CTSVC_PROPERTY_GROUP_IMAGE:
153 *out_str = GET_STR(copy, group->image_thumbnail_path);
155 case CTSVC_PROPERTY_GROUP_VIBRATION:
156 *out_str = GET_STR(copy, group->vibration);
158 case CTSVC_PROPERTY_GROUP_MESSAGE_ALERT:
159 *out_str = GET_STR(copy, group->message_alert);
161 case CTSVC_PROPERTY_GROUP_EXTRA_DATA:
162 *out_str = GET_STR(copy, group->extra_data);
165 /* LCOV_EXCL_START */
166 ERR("property_id(%d) is not supported in value(group)", property_id);
167 return CONTACTS_ERROR_INVALID_PARAMETER;
170 return CONTACTS_ERROR_NONE;
173 static int __ctsvc_group_get_str_p(contacts_record_h record, unsigned int property_id, char **out_str)
175 return __ctsvc_group_get_str_real(record, property_id, out_str, false);
178 static int __ctsvc_group_get_str(contacts_record_h record, unsigned int property_id, char **out_str)
180 return __ctsvc_group_get_str_real(record, property_id, out_str, true);
183 static int __ctsvc_group_set_int(contacts_record_h record, unsigned int property_id, int value, bool *is_dirty)
185 ctsvc_group_s *group = (ctsvc_group_s*)record;
187 switch (property_id) {
188 case CTSVC_PROPERTY_GROUP_ID:
189 CHECK_DIRTY_VAL(group->id, value, is_dirty);
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;
199 /* LCOV_EXCL_START */
200 ERR("property_id(%d) is not supported in value(group)", property_id);
201 return CONTACTS_ERROR_INVALID_PARAMETER;
204 return CONTACTS_ERROR_NONE;
207 static int __ctsvc_group_set_str(contacts_record_h record, unsigned int property_id, const char *str, bool *is_dirty)
209 ctsvc_group_s *group = (ctsvc_group_s*)record;
211 switch (property_id) {
212 case CTSVC_PROPERTY_GROUP_NAME:
213 CHECK_DIRTY_STR(group->name, str, is_dirty);
214 FREEandSTRDUP(group->name, str);
216 case CTSVC_PROPERTY_GROUP_RINGTONE:
217 CHECK_DIRTY_STR(group->ringtone_path, str, is_dirty);
218 FREEandSTRDUP(group->ringtone_path, str);
220 case CTSVC_PROPERTY_GROUP_IMAGE:
221 CHECK_DIRTY_STR(group->image_thumbnail_path, str, is_dirty);
222 FREEandSTRDUP(group->image_thumbnail_path, str);
224 case CTSVC_PROPERTY_GROUP_VIBRATION:
225 CHECK_DIRTY_STR(group->vibration, str, is_dirty);
226 FREEandSTRDUP(group->vibration, str);
228 case CTSVC_PROPERTY_GROUP_MESSAGE_ALERT:
229 CHECK_DIRTY_STR(group->message_alert, str, is_dirty);
230 FREEandSTRDUP(group->message_alert, str);
232 case CTSVC_PROPERTY_GROUP_EXTRA_DATA:
233 CHECK_DIRTY_STR(group->extra_data, str, is_dirty);
234 FREEandSTRDUP(group->extra_data, str);
237 /* LCOV_EXCL_START */
238 ERR("property_id(%d) is not supported in value(group)", property_id);
239 return CONTACTS_ERROR_INVALID_PARAMETER;
242 return CONTACTS_ERROR_NONE;
245 static int __ctsvc_group_get_bool(contacts_record_h record, unsigned int property_id, bool *value)
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;
253 /* LCOV_EXCL_START */
254 ERR("property_id(%d) is not supported in value(group)", property_id);
255 return CONTACTS_ERROR_INVALID_PARAMETER;
258 return CONTACTS_ERROR_NONE;
261 static int __ctsvc_group_set_bool(contacts_record_h record, unsigned int property_id, bool value, bool *is_dirty)
263 ctsvc_group_s *group = (ctsvc_group_s*)record;
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;
273 /* LCOV_EXCL_START */
274 ERR("property_id(%d) is not supported in value(group)", property_id);
275 return CONTACTS_ERROR_INVALID_PARAMETER;
278 return CONTACTS_ERROR_NONE;