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.
22 #include "ctsvc_internal.h"
23 #include "ctsvc_record.h"
24 #include "ctsvc_view.h"
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);
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,
45 .set_str = __ctsvc_phonelog_set_str,
46 .set_int = __ctsvc_phonelog_set_int,
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,
57 static int __ctsvc_phonelog_create(contacts_record_h *out_record)
59 ctsvc_phonelog_s *phonelog;
61 phonelog = calloc(1, sizeof(ctsvc_phonelog_s));
62 RETVM_IF(NULL == phonelog, CONTACTS_ERROR_OUT_OF_MEMORY, "calloc() Fail");
64 *out_record = (contacts_record_h)phonelog;
66 return CONTACTS_ERROR_NONE;
69 static int __ctsvc_phonelog_destroy(contacts_record_h record, bool delete_child)
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);
75 free(phonelog->address);
76 free(phonelog->extra_data2);
79 return CONTACTS_ERROR_NONE;
82 static int __ctsvc_phonelog_clone(contacts_record_h record, contacts_record_h *out_record)
84 ctsvc_phonelog_s *out_data = NULL;
85 ctsvc_phonelog_s *src_data = NULL;
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);
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;
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);
110 *out_record = (contacts_record_h)out_data;
111 return CONTACTS_ERROR_NONE;
114 static int __ctsvc_phonelog_get_int(contacts_record_h record, unsigned int property_id, int *out)
116 ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
118 switch (property_id) {
119 case CTSVC_PROPERTY_PHONELOG_ID:
122 case CTSVC_PROPERTY_PHONELOG_PERSON_ID:
123 *out = phonelog->person_id;
125 case CTSVC_PROPERTY_PHONELOG_LOG_TIME:
126 *out = phonelog->log_time;
128 case CTSVC_PROPERTY_PHONELOG_LOG_TYPE:
129 *out = phonelog->log_type;
131 case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1:
132 *out = phonelog->extra_data1;
134 case CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO:
135 *out = phonelog->sim_slot_no;
138 /* LCOV_EXCL_START */
139 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
140 return CONTACTS_ERROR_INVALID_PARAMETER;
143 return CONTACTS_ERROR_NONE;
146 static int __ctsvc_phonelog_get_str_real(contacts_record_h record, unsigned int property_id, char **out_str, bool copy)
148 ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
150 switch (property_id) {
151 case CTSVC_PROPERTY_PHONELOG_ADDRESS:
152 *out_str = GET_STR(copy, phonelog->address);
154 case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2:
155 *out_str = GET_STR(copy, phonelog->extra_data2);
158 /* LCOV_EXCL_START */
159 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
160 return CONTACTS_ERROR_INVALID_PARAMETER;
163 return CONTACTS_ERROR_NONE;
166 static int __ctsvc_phonelog_get_str_p(contacts_record_h record, unsigned int property_id, char **out_str)
168 return __ctsvc_phonelog_get_str_real(record, property_id, out_str, false);
171 static int __ctsvc_phonelog_get_str(contacts_record_h record, unsigned int property_id, char **out_str)
173 return __ctsvc_phonelog_get_str_real(record, property_id, out_str, true);
176 static int __ctsvc_phonelog_set_int(contacts_record_h record, unsigned int property_id, int value, bool *is_dirty)
178 ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
180 switch (property_id) {
181 case CTSVC_PROPERTY_PHONELOG_ID:
182 CHECK_DIRTY_VAL(phonelog->id, value, is_dirty);
183 phonelog->id = value;
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;
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;
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)
205 CHECK_DIRTY_VAL(phonelog->log_type, value, is_dirty);
206 phonelog->log_type = value;
208 ERR("log type is in invalid range (%d)", value);
209 return CONTACTS_ERROR_INVALID_PARAMETER;
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;
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;
225 /* LCOV_EXCL_START */
226 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
227 return CONTACTS_ERROR_INVALID_PARAMETER;
230 return CONTACTS_ERROR_NONE;
233 static int __ctsvc_phonelog_set_str(contacts_record_h record, unsigned int property_id, const char *str, bool *is_dirty)
235 ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
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);
244 case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2:
245 CHECK_DIRTY_STR(phonelog->extra_data2, str, is_dirty);
246 FREEandSTRDUP(phonelog->extra_data2, str);
249 /* LCOV_EXCL_START */
250 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
251 return CONTACTS_ERROR_INVALID_PARAMETER;
254 return CONTACTS_ERROR_NONE;