69d45da11a936daa720ac6fc0308261980fab0c1
[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                 ERR("ctsvc_record_copy_base() Fail");
104                 __ctsvc_phonelog_destroy((contacts_record_h)out_data, true);
105                 return ret;
106         }
107
108         *out_record = (contacts_record_h)out_data;
109         return CONTACTS_ERROR_NONE;
110 }
111
112 static int __ctsvc_phonelog_get_int(contacts_record_h record, unsigned int property_id, int *out)
113 {
114         ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
115
116         switch (property_id) {
117         case CTSVC_PROPERTY_PHONELOG_ID:
118                 *out = phonelog->id;
119                 break;
120         case CTSVC_PROPERTY_PHONELOG_PERSON_ID:
121                 *out = phonelog->person_id;
122                 break;
123         case CTSVC_PROPERTY_PHONELOG_LOG_TIME:
124                 *out = phonelog->log_time;
125                 break;
126         case CTSVC_PROPERTY_PHONELOG_LOG_TYPE:
127                 *out = phonelog->log_type;
128                 break;
129         case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA1:
130                 *out = phonelog->extra_data1;
131                 break;
132         case CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO:
133                 *out = phonelog->sim_slot_no;
134                 break;
135         default:
136                 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
137                 return CONTACTS_ERROR_INVALID_PARAMETER;
138         }
139         return CONTACTS_ERROR_NONE;
140 }
141
142 static int __ctsvc_phonelog_get_str_real(contacts_record_h record, unsigned int property_id, char **out_str, bool copy)
143 {
144         ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
145
146         switch (property_id) {
147         case CTSVC_PROPERTY_PHONELOG_ADDRESS:
148                 *out_str = GET_STR(copy, phonelog->address);
149                 break;
150         case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2:
151                 *out_str = GET_STR(copy, phonelog->extra_data2);
152                 break;
153         default:
154                 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
155                 return CONTACTS_ERROR_INVALID_PARAMETER;
156         }
157         return CONTACTS_ERROR_NONE;
158 }
159
160 static int __ctsvc_phonelog_get_str_p(contacts_record_h record, unsigned int property_id, char **out_str)
161 {
162         return __ctsvc_phonelog_get_str_real(record, property_id, out_str, false);
163 }
164
165 static int __ctsvc_phonelog_get_str(contacts_record_h record, unsigned int property_id, char **out_str)
166 {
167         return __ctsvc_phonelog_get_str_real(record, property_id, out_str, true);
168 }
169
170 static int __ctsvc_phonelog_set_int(contacts_record_h record, unsigned int property_id, int value, bool *is_dirty)
171 {
172         ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
173
174         switch (property_id) {
175         case CTSVC_PROPERTY_PHONELOG_ID:
176                 CHECK_DIRTY_VAL(phonelog->id, value, is_dirty);
177                 phonelog->id = value;
178                 break;
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;
184                 break;
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;
190                 break;
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)
198                    ) {
199                         CHECK_DIRTY_VAL(phonelog->log_type, value, is_dirty);
200                         phonelog->log_type = value;
201                 } else {
202                         ERR("log type is in invalid range (%d)", value);
203                         return CONTACTS_ERROR_INVALID_PARAMETER;
204                 }
205                 break;
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;
211                 break;
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;
217                 break;
218         default:
219                 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
220                 return CONTACTS_ERROR_INVALID_PARAMETER;
221         }
222         return CONTACTS_ERROR_NONE;
223 }
224
225 static int __ctsvc_phonelog_set_str(contacts_record_h record, unsigned int property_id, const char *str, bool *is_dirty)
226 {
227         ctsvc_phonelog_s *phonelog = (ctsvc_phonelog_s*)record;
228
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);
235                 break;
236         case CTSVC_PROPERTY_PHONELOG_EXTRA_DATA2:
237                 CHECK_DIRTY_STR(phonelog->extra_data2, str, is_dirty);
238                 FREEandSTRDUP(phonelog->extra_data2, str);
239                 break;
240         default:
241                 ERR("property_id(%d) is not supported in value(phonelog)", property_id);
242                 return CONTACTS_ERROR_INVALID_PARAMETER;
243         }
244         return CONTACTS_ERROR_NONE;
245 }
246