Fix svace issue
[platform/core/telephony/tel-plugin-manager.git] / src / manager_core.c
1 /*
2  * tel-plugin-manager
3  *
4  * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Suresh Kumar N <suresh.n@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20
21 #include <glib.h>
22 #include <tcore.h>
23 #include <manager.h>
24 #include <plugin.h>
25 #include <server.h>
26
27 #include "manager_core.h"
28 #include "manager_request.h"
29 #include "manager_notification.h"
30 #include "manager_queue.h"
31 #include "manager_network.h"
32 #include "manager_sim.h"
33 #include "internal/manager_internal.h"
34 #include "manager_call.h"
35 #include "manager_modem.h"
36
37 static void __create_modem_board_sub_modules(ModemBoard *mb)
38 {
39         dbg("enter");
40         /* Initialize network private info cache */
41         manager_network_initialize_private_info(mb);
42
43         /*Initialize call private info cache*/
44         manager_call_initialize_private_info(mb);
45         manager_sim_initialize_private_info(mb);
46         manager_modem_initialize_private_info(mb);
47 }
48
49 static void __destroy_modem_board_sub_modules(ModemBoard *mb)
50 {
51         dbg("enter");
52         /* Clear network private info cache */
53         manager_network_clear_private_info(mb);
54 }
55
56 void manager_core_create_modem_board(TcorePlugin *manager_plugin, TcorePlugin *modem_plugin)
57 {
58         ModemBoard *mb = NULL;
59         GSList *list = NULL;
60         ModemBoardIndex index = manager_core_get_modem_board_index(modem_plugin);
61         PrivateData *priv_data = tcore_plugin_ref_user_data(manager_plugin);
62
63         if (G_UNLIKELY(!priv_data))
64                 return;
65
66         if (index == MANAGER_MODEM_BOARD_INDEX_INVALID) {
67                 warn("Wrong Modem Index");
68                 return;
69         }
70
71         /* Check Duplicated */
72         for (list = priv_data->board_list; list; list = list->next) {
73                 mb = list->data;
74                 if (G_UNLIKELY(!mb))
75                         continue;
76
77                 if (mb->index == index) {
78                         warn("We already have Modem Index(%d)", index);
79                         return;
80                 }
81         }
82
83         /* Create Modem Board */
84         mb = g_try_malloc0(sizeof(ModemBoard));
85         if(mb == NULL) {
86                 err("Memory alloc failed");
87                 return;
88         }
89
90         mb->index = index;
91         mb->modem_plugin = modem_plugin;
92         mb->fdn_enabled = FALSE;
93         mb->fdn_contacts = NULL;
94         priv_data->board_list = g_slist_append(priv_data->board_list, mb);
95
96         __create_modem_board_sub_modules(mb);
97         dbg("modem (%d) added, so modem board(%p) added", index, mb);
98 }
99
100 void manager_core_destroy_modem_board(TcorePlugin *manager_plugin, TcorePlugin *modem_plugin)
101 {
102         ModemBoard *mb = NULL;
103         GSList *list = NULL;
104         PrivateData *priv_data = tcore_plugin_ref_user_data(manager_plugin);
105
106         if (G_UNLIKELY(!priv_data))
107                 return;
108
109         /* Traverse through mb list and destroy matching mb */
110         for (list = priv_data->board_list; list; list = list->next) {
111                 mb = list->data;
112                 if (G_UNLIKELY(!mb))
113                         continue;
114
115                 if (mb->modem_plugin == modem_plugin) {
116                         dbg("modem(%d) removed, so blackboard(%p) removed", mb->index, mb);
117                         __destroy_modem_board_sub_modules(mb);
118                         priv_data->board_list = g_slist_remove(priv_data->board_list, mb);
119                         break;
120                 }
121
122                 if (TRUE == mb->fdn_enabled && mb->fdn_contacts)
123                         g_hash_table_destroy(mb->fdn_contacts);
124                 mb->fdn_contacts = NULL;
125         }
126 }
127
128 ModemBoard *manager_core_get_modem_board(Manager *manager, TcorePlugin *modem_plugin)
129 {
130         GSList *list = NULL;
131         TcorePlugin *manager_plugin = tcore_manager_get_plugin(manager);
132         PrivateData *priv_data = tcore_plugin_ref_user_data(manager_plugin);
133
134         if (G_UNLIKELY(!priv_data))
135                 return NULL;
136
137         for (list = priv_data->board_list; list; list = list->next) {
138                 ModemBoard *mb = list->data;
139                 if (G_UNLIKELY(!mb))
140                         continue;
141                 if (mb->modem_plugin == modem_plugin) {
142                         dbg("modem(%d) selected. board(%p)", mb->index, mb);
143                         return mb;
144                 }
145         }
146         return NULL;
147 }
148
149 ModemBoardIndex manager_core_get_modem_board_index(TcorePlugin *modem_plugin)
150 {
151         const char *cp_name = tcore_server_get_cp_name_by_plugin(modem_plugin);
152
153         if (g_str_has_suffix((const gchar *)cp_name, "0"))
154                 return MANAGER_MODEM_BOARD_INDEX_0;
155         else if (g_str_has_suffix((const gchar *)cp_name, "1"))
156                 return MANAGER_MODEM_BOARD_INDEX_1;
157         else
158                 return MANAGER_MODEM_BOARD_INDEX_INVALID;
159 }
160
161 /* Create list for already existing modem plugin's that were present before manager intialization */
162 void manager_core_create_modem_board_list(TcorePlugin *manager_plugin)
163 {
164         Server *s = tcore_plugin_ref_server(manager_plugin);
165         GSList *list = NULL;
166         GSList *modem_plugin_list = tcore_server_get_modem_plugin_list(s);
167
168         if (G_UNLIKELY(!modem_plugin_list))
169                 return;
170
171         /* Traverse through each modem plugin and create mb */
172         for (list = modem_plugin_list; list; list = list->next) {
173                 TcorePlugin *modem_plugin = list->data;
174                 if (modem_plugin)
175                         manager_core_create_modem_board(manager_plugin, modem_plugin);
176         }
177
178         g_slist_free(modem_plugin_list);
179 }
180
181 void manager_core_destroy_modem_board_list(TcorePlugin *manager_plugin)
182 {
183         Server *s = tcore_plugin_ref_server(manager_plugin);
184         GSList *list = NULL;
185         GSList *modem_plugin_list = tcore_server_get_modem_plugin_list(s);
186
187         if (G_UNLIKELY(!modem_plugin_list))
188                 return;
189
190         /* Traverse through each modem plugin and destroy mb */
191         for (list = modem_plugin_list; list; list = list->next) {
192                 TcorePlugin *modem_plugin = list->data;
193                 if (modem_plugin)
194                         manager_core_destroy_modem_board(manager_plugin, modem_plugin);
195         }
196         g_slist_free(modem_plugin_list);
197 }
198
199 /* Core initializer */
200 gboolean manager_core_init(TcorePlugin *plugin)
201 {
202         Manager *manager;
203         PrivateData *priv_data = NULL;
204
205         /* Create manager */
206         manager = tcore_manager_new(plugin);
207
208         /*
209          * Set handlers -
210          *    Request dispatcher
211          *    Notification handler
212          */
213         if (tcore_manager_set_request_dispatcher(manager,
214                                                  manager_request_handler) != TCORE_RETURN_SUCCESS) {
215                 err("Failed to set Request dispatcher");
216                 goto ERROR;
217         }
218
219         if (tcore_manager_set_notification_handler(manager,
220                                                    manager_notification_handler) != TCORE_RETURN_SUCCESS) {
221                 err("Failed to set Notification handler");
222                 goto ERROR;
223         }
224
225         /* Private data for Manager plug-in */
226         priv_data = g_malloc0(sizeof(PrivateData));
227         if (!priv_data)
228                 goto ERROR;
229
230         /* Link private data to plug-in */
231         tcore_plugin_link_user_data(plugin, priv_data);
232
233         /* Update Manager */
234         priv_data->manager = manager;
235         priv_data->board_list = NULL;
236
237         /* Flag to track dial initiated or not for MO/MT synchronization */
238         priv_data->is_dial_initiated = FALSE;
239
240         /* Flag to consume end notification when internal end request is raised for MO/MT synchronization */
241         priv_data->is_end_initiated = FALSE;
242
243         /*Flag to identify if boot is completed*/
244         priv_data->boot_config_completed = FALSE;
245
246         /* Flag to identify if end all request processing is ongoing due to flight mode enable*/
247         priv_data->is_end_all_initiated = FALSE;
248
249         /*Flag to identify if dial notification is already sent in case of Emergency call*/
250         priv_data->is_dial_noti_sent = FALSE;
251
252         /* Create manager modem balckboard cache */
253         manager_core_create_modem_board_list(plugin);
254
255         /* Create and initialize Manager queue */
256         priv_data->manager_queue = manager_queue_init();
257         if (G_UNLIKELY(priv_data->manager_queue == NULL)) {
258                 err("Failed to create Manager queue");
259                 goto ERROR;
260         }
261
262         return TRUE;
263
264  ERROR:
265         /* Free resource */
266         g_free(priv_data);
267
268         /* Destroy manager */
269         tcore_manager_free(plugin, manager);
270
271         return FALSE;
272 }
273
274 /* Core de-initializer */
275 void manager_core_deinit(TcorePlugin *plugin)
276 {
277         PrivateData *priv_data;
278
279         priv_data = tcore_plugin_ref_user_data(plugin);
280         if (priv_data != NULL) {
281                 /* Destroy manager */
282                 tcore_manager_free(plugin, priv_data->manager);
283
284                 /* Clear and free Manager queue */
285                 manager_queue_deinit(priv_data->manager_queue);
286
287                 /* Destroy manager modem balckboard cache */
288                 manager_core_destroy_modem_board_list(plugin);
289
290                 /* Free private data */
291                 g_free(priv_data);
292                 tcore_plugin_link_user_data(plugin, NULL);
293         }
294 }