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 "internal/manager_internal.h"
34 #include "manager_call.h"
35 #include "manager_modem.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);
56 void manager_core_create_modem_board(TcorePlugin *manager_plugin, TcorePlugin *modem_plugin)
58 ModemBoard *mb = NULL;
60 ModemBoardIndex index = manager_core_get_modem_board_index(modem_plugin);
61 PrivateData *priv_data = tcore_plugin_ref_user_data(manager_plugin);
63 if (G_UNLIKELY(!priv_data))
66 if (index == MANAGER_MODEM_BOARD_INDEX_INVALID) {
67 warn("Wrong Modem Index");
71 /* Check Duplicated */
72 for (list = priv_data->board_list; list; list = list->next) {
77 if (mb->index == index) {
78 warn("We already have Modem Index(%d)", index);
83 /* Create Modem Board */
84 mb = g_try_malloc0(sizeof(ModemBoard));
86 err("Memory alloc failed");
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);
96 __create_modem_board_sub_modules(mb);
97 dbg("modem (%d) added, so modem board(%p) added", index, mb);
100 void manager_core_destroy_modem_board(TcorePlugin *manager_plugin, TcorePlugin *modem_plugin)
102 ModemBoard *mb = NULL;
104 PrivateData *priv_data = tcore_plugin_ref_user_data(manager_plugin);
106 if (G_UNLIKELY(!priv_data))
109 /* Traverse through mb list and destroy matching mb */
110 for (list = priv_data->board_list; list; list = list->next) {
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);
122 if (TRUE == mb->fdn_enabled && mb->fdn_contacts)
123 g_hash_table_destroy(mb->fdn_contacts);
124 mb->fdn_contacts = NULL;
128 ModemBoard *manager_core_get_modem_board(Manager *manager, TcorePlugin *modem_plugin)
131 TcorePlugin *manager_plugin = tcore_manager_get_plugin(manager);
132 PrivateData *priv_data = tcore_plugin_ref_user_data(manager_plugin);
134 if (G_UNLIKELY(!priv_data))
137 for (list = priv_data->board_list; list; list = list->next) {
138 ModemBoard *mb = list->data;
141 if (mb->modem_plugin == modem_plugin) {
142 dbg("modem(%d) selected. board(%p)", mb->index, mb);
149 ModemBoardIndex manager_core_get_modem_board_index(TcorePlugin *modem_plugin)
151 const char *cp_name = tcore_server_get_cp_name_by_plugin(modem_plugin);
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;
158 return MANAGER_MODEM_BOARD_INDEX_INVALID;
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)
164 Server *s = tcore_plugin_ref_server(manager_plugin);
166 GSList *modem_plugin_list = tcore_server_get_modem_plugin_list(s);
168 if (G_UNLIKELY(!modem_plugin_list))
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;
175 manager_core_create_modem_board(manager_plugin, modem_plugin);
178 g_slist_free(modem_plugin_list);
181 void manager_core_destroy_modem_board_list(TcorePlugin *manager_plugin)
183 Server *s = tcore_plugin_ref_server(manager_plugin);
185 GSList *modem_plugin_list = tcore_server_get_modem_plugin_list(s);
187 if (G_UNLIKELY(!modem_plugin_list))
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;
194 manager_core_destroy_modem_board(manager_plugin, modem_plugin);
196 g_slist_free(modem_plugin_list);
199 /* Core initializer */
200 gboolean manager_core_init(TcorePlugin *plugin)
203 PrivateData *priv_data = NULL;
206 manager = tcore_manager_new(plugin);
211 * Notification handler
213 if (tcore_manager_set_request_dispatcher(manager,
214 manager_request_handler) != TCORE_RETURN_SUCCESS) {
215 err("Failed to set Request dispatcher");
219 if (tcore_manager_set_notification_handler(manager,
220 manager_notification_handler) != TCORE_RETURN_SUCCESS) {
221 err("Failed to set Notification handler");
225 /* Private data for Manager plug-in */
226 priv_data = g_malloc0(sizeof(PrivateData));
230 /* Link private data to plug-in */
231 tcore_plugin_link_user_data(plugin, priv_data);
234 priv_data->manager = manager;
235 priv_data->board_list = NULL;
237 /* Flag to track dial initiated or not for MO/MT synchronization */
238 priv_data->is_dial_initiated = FALSE;
240 /* Flag to consume end notification when internal end request is raised for MO/MT synchronization */
241 priv_data->is_end_initiated = FALSE;
243 /*Flag to identify if boot is completed*/
244 priv_data->boot_config_completed = FALSE;
246 /* Flag to identify if end all request processing is ongoing due to flight mode enable*/
247 priv_data->is_end_all_initiated = FALSE;
249 /*Flag to identify if dial notification is already sent in case of Emergency call*/
250 priv_data->is_dial_noti_sent = FALSE;
252 /* Create manager modem balckboard cache */
253 manager_core_create_modem_board_list(plugin);
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");
268 /* Destroy manager */
269 tcore_manager_free(plugin, manager);
274 /* Core de-initializer */
275 void manager_core_deinit(TcorePlugin *plugin)
277 PrivateData *priv_data;
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);
284 /* Clear and free Manager queue */
285 manager_queue_deinit(priv_data->manager_queue);
287 /* Destroy manager modem balckboard cache */
288 manager_core_destroy_modem_board_list(plugin);
290 /* Free private data */
292 tcore_plugin_link_user_data(plugin, NULL);