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 ERR("ctsvc_record_copy_base() Fail");
104 __ctsvc_phonelog_destroy((contacts_record_h)out_data, true);
108 *out_record = (contacts_record_h)out_data;
109 return CONTACTS_ERROR_NONE;
112 static int __ctsvc_phonelog_get_int(contacts_record_h record, unsigned int property_id, int *out)
114 ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
116 switch (property_id) {
117 case CTSVC_PROPERTY_PHONELOG_ID:
120 case CTSVC_PROPERTY_PHONELOG_PERSON_ID:
121 *out = phonelog->person_id;
123 case CTSVC_PROPERTY_PHONELOG_LOG_TIME:
124 *out = phonelog->log_time;
126 case CTSVC_PROPERTY_PHONELOG_LOG_TYPE:
127 *out = phonelog->log_type;
129 case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1:
130 *out = phonelog->extra_data1;
132 case CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO:
133 *out = phonelog->sim_slot_no;
136 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
137 return CONTACTS_ERROR_INVALID_PARAMETER;
139 return CONTACTS_ERROR_NONE;
142 static int __ctsvc_phonelog_get_str_real(contacts_record_h record, unsigned int property_id, char **out_str, bool copy)
144 ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
146 switch (property_id) {
147 case CTSVC_PROPERTY_PHONELOG_ADDRESS:
148 *out_str = GET_STR(copy, phonelog->address);
150 case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2:
151 *out_str = GET_STR(copy, phonelog->extra_data2);
154 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
155 return CONTACTS_ERROR_INVALID_PARAMETER;
157 return CONTACTS_ERROR_NONE;
160 static int __ctsvc_phonelog_get_str_p(contacts_record_h record, unsigned int property_id, char **out_str)
162 return __ctsvc_phonelog_get_str_real(record, property_id, out_str, false);
165 static int __ctsvc_phonelog_get_str(contacts_record_h record, unsigned int property_id, char **out_str)
167 return __ctsvc_phonelog_get_str_real(record, property_id, out_str, true);
170 static int __ctsvc_phonelog_set_int(contacts_record_h record, unsigned int property_id, int value, bool *is_dirty)
172 ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
174 switch (property_id) {
175 case CTSVC_PROPERTY_PHONELOG_ID:
176 CHECK_DIRTY_VAL(phonelog->id, value, is_dirty);
177 phonelog->id = value;
179 case CTSVC_PROPERTY_PHONELOG_PERSON_ID:
180 RETVM_IF(0 < phonelog->id, CONTACTS_ERROR_INVALID_PARAMETER,
181 "property_id(%d) is a read-only value (phonelog)", property_id);
182 CHECK_DIRTY_VAL(phonelog->person_id, value, is_dirty);
183 phonelog->person_id = value;
185 case CTSVC_PROPERTY_PHONELOG_LOG_TIME:
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->log_time, value, is_dirty);
189 phonelog->log_time = value;
191 case CTSVC_PROPERTY_PHONELOG_LOG_TYPE:
192 if ((CONTACTS_PLOG_TYPE_NONE <= value
193 && value <= CONTACTS_PLOG_TYPE_VIDEO_BLOCKED)
194 || (CONTACTS_PLOG_TYPE_MMS_INCOMING <= value
195 && value <= CONTACTS_PLOG_TYPE_MMS_BLOCKED)
196 || (CONTACTS_PLOG_TYPE_EMAIL_RECEIVED <= value
197 && value <= CONTACTS_PLOG_TYPE_EMAIL_SENT)
199 CHECK_DIRTY_VAL(phonelog->log_type, value, is_dirty);
200 phonelog->log_type = value;
202 ERR("log type is in invalid range (%d)", value);
203 return CONTACTS_ERROR_INVALID_PARAMETER;
206 case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1:
207 RETVM_IF(0 < phonelog->id, CONTACTS_ERROR_INVALID_PARAMETER,
208 "property_id(%d) is a read-only value (phonelog)", property_id);
209 CHECK_DIRTY_VAL(phonelog->extra_data1, value, is_dirty);
210 phonelog->extra_data1 = value;
212 case CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO:
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->sim_slot_no, value, is_dirty);
216 phonelog->sim_slot_no = value;
219 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
220 return CONTACTS_ERROR_INVALID_PARAMETER;
222 return CONTACTS_ERROR_NONE;
225 static int __ctsvc_phonelog_set_str(contacts_record_h record, unsigned int property_id, const char *str, bool *is_dirty)
227 ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
229 switch (property_id) {
230 case CTSVC_PROPERTY_PHONELOG_ADDRESS:
231 RETVM_IF(0 < phonelog->id, CONTACTS_ERROR_INVALID_PARAMETER,
232 "property_id(%d) is a read-only value (phonelog)", property_id);
233 CHECK_DIRTY_STR(phonelog->address, str, is_dirty);
234 FREEandSTRDUP(phonelog->address, str);
236 case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2:
237 CHECK_DIRTY_STR(phonelog->extra_data2, str, is_dirty);
238 FREEandSTRDUP(phonelog->extra_data2, str);
241 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
242 return CONTACTS_ERROR_INVALID_PARAMETER;
244 return CONTACTS_ERROR_NONE;