4 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Suresh Kumar N <suresh.n@samsung.com>
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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.
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 "manager_call.h"
34 #include "manager_modem.h"
35 #include "internal/manager_internal.h"
37 static void __create_modem_board_sub_modules(ModemBoard *mb)
40 /* Initialize network private info cache */
41 manager_network_initialize_private_info(mb);
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);
49 static void __destroy_modem_board_sub_modules(ModemBoard *mb)
52 /* Clear network private info cache */
53 manager_network_clear_private_info(mb);
54 manager_modem_clear_private_info(mb);
57 void manager_core_create_modem_board(TcorePlugin *manager_plugin, TcorePlugin *modem_plugin)
59 ModemBoard *mb = NULL;
61 ModemBoardIndex index = manager_core_get_modem_board_index(modem_plugin);
62 PrivateData *priv_data = tcore_plugin_ref_user_data(manager_plugin);
64 if (G_UNLIKELY(!priv_data))
67 if (index == MANAGER_MODEM_BOARD_INDEX_INVALID) {
68 warn("Wrong Modem Index");
72 /* Check Duplicated */
73 for (list = priv_data->board_list; list; list = list->next) {
78 if (mb->index == index) {
79 warn("We already have Modem Index(%d)", index);
84 /* Create Modem Board */
85 mb = g_try_malloc0(sizeof(ModemBoard));
87 err("Memory alloc failed");
92 mb->modem_plugin = modem_plugin;
93 mb->fdn_enabled = FALSE;
94 mb->fdn_contacts = NULL;
95 priv_data->board_list = g_slist_append(priv_data->board_list, mb);
97 __create_modem_board_sub_modules(mb);
98 dbg("modem (%d) added, so modem board(%p) added", index, mb);
101 void manager_core_destroy_modem_board(TcorePlugin *manager_plugin, TcorePlugin *modem_plugin)
103 ModemBoard *mb = NULL;
105 PrivateData *priv_data = tcore_plugin_ref_user_data(manager_plugin);
107 if (G_UNLIKELY(!priv_data))
110 /* Traverse through mb list and destroy matching mb */
111 for (list = priv_data->board_list; list; list = list->next) {
116 if (mb->modem_plugin == modem_plugin) {
117 dbg("modem(%d) removed, so blackboard(%p) removed", mb->index, mb);
118 __destroy_modem_board_sub_modules(mb);
119 priv_data->board_list = g_slist_remove(priv_data->board_list, mb);
123 if (TRUE == mb->fdn_enabled && mb->fdn_contacts)
124 g_hash_table_destroy(mb->fdn_contacts);
125 mb->fdn_contacts = NULL;
129 ModemBoard *manager_core_get_modem_board(Manager *manager, TcorePlugin *modem_plugin)
132 TcorePlugin *manager_plugin = tcore_manager_get_plugin(manager);
133 PrivateData *priv_data = tcore_plugin_ref_user_data(manager_plugin);
135 if (G_UNLIKELY(!priv_data))
138 for (list = priv_data->board_list; list; list = list->next) {
139 ModemBoard *mb = list->data;
142 if (mb->modem_plugin == modem_plugin) {
143 dbg("modem(%d) selected. board(%p)", mb->index, mb);
147 warn("Cannot find modem board");
151 ModemBoard *manager_core_get_modem_board_by_plugin(TcorePlugin *modem_plugin)
153 Server *server = tcore_plugin_ref_server(modem_plugin);
154 Manager *manager = tcore_server_ref_manager(server);
156 return manager_core_get_modem_board(manager, modem_plugin);
159 ModemBoardIndex manager_core_get_modem_board_index(TcorePlugin *modem_plugin)
161 const char *cp_name = tcore_server_get_cp_name_by_plugin(modem_plugin);
163 if (g_str_has_suffix((const gchar *)cp_name, "0"))
164 return MANAGER_MODEM_BOARD_INDEX_0;
165 else if (g_str_has_suffix((const gchar *)cp_name, "1"))
166 return MANAGER_MODEM_BOARD_INDEX_1;
168 return MANAGER_MODEM_BOARD_INDEX_INVALID;
171 /* Create list for already existing modem plugin's that were present before manager intialization */
172 void manager_core_create_modem_board_list(TcorePlugin *manager_plugin)
174 Server *s = tcore_plugin_ref_server(manager_plugin);
176 GSList *modem_plugin_list = tcore_server_get_modem_plugin_list(s);
178 if (G_UNLIKELY(!modem_plugin_list))
181 /* Traverse through each modem plugin and create mb */
182 for (list = modem_plugin_list; list; list = list->next) {
183 TcorePlugin *modem_plugin = list->data;
185 manager_core_create_modem_board(manager_plugin, modem_plugin);
188 g_slist_free(modem_plugin_list);
191 void manager_core_destroy_modem_board_list(TcorePlugin *manager_plugin)
193 Server *s = tcore_plugin_ref_server(manager_plugin);
195 GSList *modem_plugin_list = tcore_server_get_modem_plugin_list(s);
197 if (G_UNLIKELY(!modem_plugin_list))
200 /* Traverse through each modem plugin and destroy mb */
201 for (list = modem_plugin_list; list; list = list->next) {
202 TcorePlugin *modem_plugin = list->data;
204 manager_core_destroy_modem_board(manager_plugin, modem_plugin);
206 g_slist_free(modem_plugin_list);
209 /* Core initializer */
210 gboolean manager_core_init(TcorePlugin *plugin)
213 PrivateData *priv_data = NULL;
216 manager = tcore_manager_new(plugin);
221 * Notification handler
223 if (tcore_manager_set_request_dispatcher(manager,
224 manager_request_handler) != TCORE_RETURN_SUCCESS) {
225 err("Failed to set Request dispatcher");
229 if (tcore_manager_set_notification_handler(manager,
230 manager_notification_handler) != TCORE_RETURN_SUCCESS) {
231 err("Failed to set Notification handler");
235 /* Private data for Manager plug-in */
236 priv_data = g_malloc0(sizeof(PrivateData));
240 /* Link private data to plug-in */
241 tcore_plugin_link_user_data(plugin, priv_data);
244 priv_data->manager = manager;
245 priv_data->board_list = NULL;
247 /* Flag to track dial initiated or not for MO/MT synchronization */
248 priv_data->is_dial_initiated = FALSE;
250 /* Flag to consume end notification when internal end request is raised for MO/MT synchronization */
251 priv_data->is_end_initiated = FALSE;
253 /*Flag to identify if boot is completed*/
254 priv_data->boot_config_completed = FALSE;
256 /* Flag to identify if end all request processing is ongoing due to flight mode enable*/
257 priv_data->is_end_all_initiated = FALSE;
259 /*Flag to identify if dial notification is already sent in case of Emergency call*/
260 priv_data->is_dial_noti_sent = FALSE;
262 /* Create manager modem balckboard cache */
263 manager_core_create_modem_board_list(plugin);
265 /* Create and initialize Manager queue */
266 priv_data->manager_queue = manager_queue_init();
267 if (G_UNLIKELY(priv_data->manager_queue == NULL)) {
268 err("Failed to create Manager queue");
278 /* Destroy manager */
279 tcore_manager_free(plugin, manager);
284 /* Core de-initializer */
285 void manager_core_deinit(TcorePlugin *plugin)
287 PrivateData *priv_data;
289 priv_data = tcore_plugin_ref_user_data(plugin);
290 if (priv_data != NULL) {
291 /* Destroy manager */
292 tcore_manager_free(plugin, priv_data->manager);
294 /* Clear and free Manager queue */
295 manager_queue_deinit(priv_data->manager_queue);
297 /* Destroy manager modem balckboard cache */
298 manager_core_destroy_modem_board_list(plugin);
300 /* Free private data */
302 tcore_plugin_link_user_data(plugin, NULL);