4 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Ja-young Gu <jygu@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.
29 #include <tzplatform_config.h>
34 #include <libxml/xmlmemory.h>
35 #include <libxml/parser.h>
36 #include <libxml/tree.h>
38 #define DATABASE_PATH tzplatform_mkpath(TZ_SYS_DB, ".dnet.db")
39 #define msg(fmt, args...) do { printf(fmt "\n", ##args); fflush(stdout); } while (0)
53 CONTEXT_ROLE_INTERNET,
55 CONTEXT_ROLE_PREPAID_INTERNET,
56 CONTEXT_ROLE_PREPAID_MMS,
57 CONTEXT_ROLE_TETHERING,
58 CONTEXT_ROLE_USER_DEFINED,
61 static int __system_command(char *command)
65 const char *environ[] = { NULL };
81 argv[2] = (char *)command;
84 execve("/bin/sh", argv, (char **)environ);
89 if (waitpid(pid, &status, 0) == -1) {
93 if (WIFEXITED(status))
94 return WEXITSTATUS(status);
95 else if (WIFSIGNALED(status))
96 return WTERMSIG(status);
97 else if (WIFSTOPPED(status))
98 return WSTOPSIG(status);
100 } while (!WIFEXITED(status) && !WIFSIGNALED(status));
105 static void __load_xml_file(const char *docname, const char *groupname, void **i_doc, void **i_root_node)
107 xmlDocPtr *doc = (xmlDocPtr *)i_doc;
108 xmlNodePtr *root_node = (xmlNodePtr *)i_root_node;
110 msg("docname:%s, groupname:%s", docname, groupname);
112 *doc = xmlParseFile(docname);
114 *root_node = xmlDocGetRootElement(*doc);
116 msg("*root_node->name:%s", (*root_node)->name);
117 if (0 == xmlStrcmp((*root_node)->name, (const unsigned char *)groupname)) {
118 msg("root_node is found !!!");
121 msg("Cannot find root node.");
128 msg("fail to parse doc(%s)", docname);
132 static void __unload_xml_file(void **i_doc, void **i_root_node)
134 xmlDocPtr *doc = (xmlDocPtr *)i_doc;
135 xmlNodePtr *root_node = (xmlNodePtr *)i_root_node;
137 msg("unloading XML");
146 static void *create_handle(const char *path)
149 sqlite3 *handle = NULL;
151 rv = db_util_open(path, &handle, 0);
152 if (rv != SQLITE_OK) {
153 msg("fail to connect database rv(%d)", rv);
157 msg("connected to %s", path);
161 static gboolean remove_handle(void *handle)
166 db_util_close(handle);
168 msg("disconnected from database");
172 static gboolean read_query_database(void *handle, const char *query, GHashTable *in_param,
173 GHashTable *out_param, int out_param_cnt)
175 int rv = 0, index = 0, outter_index = 0;
176 sqlite3_stmt *stmt = NULL;
177 char szQuery[5000+1]; /* +1 is for NULL Termination Character '\0' */
184 memset(szQuery, '\0', 5001);
185 strncpy(szQuery, query, 5000);
187 rv = sqlite3_prepare_v2(handle, szQuery, strlen(szQuery), &stmt, NULL);
188 if (rv != SQLITE_OK) {
189 msg("fail to connect to table (%d)", rv);
194 g_hash_table_iter_init(&iter, in_param);
195 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
196 msg("key(%s), value(%s)", (const char *)key, (const char *)value);
198 if (!value || g_strcmp0((const char *) value, "") == 0) {
200 rv = sqlite3_bind_null(stmt, atoi((const char *) key));
203 rv = sqlite3_bind_text(stmt, atoi((const char *) key), (const char *) value, strlen((const char *) value),
207 if (rv != SQLITE_OK) {
208 msg("fail to bind data (%d)", rv);
214 rv = sqlite3_step(stmt);
215 msg("read query executed (%d)", rv);
217 while (rv == SQLITE_ROW) {
219 char tmp_key_outter[10];
220 GHashTable *out_param_data;
222 out_param_data = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
224 for (index = 0; index < out_param_cnt; index++) {
225 char *tmp = NULL, tmp_key[10];
226 tmp = (char *) sqlite3_column_text(stmt, index);
227 snprintf(tmp_key, sizeof(tmp_key), "%d", index);
228 g_hash_table_insert(out_param_data, g_strdup(tmp_key), g_strdup(tmp));
231 snprintf(tmp_key_outter, sizeof(tmp_key_outter), "%d", outter_index);
232 g_hash_table_insert(out_param, g_strdup(tmp_key_outter), out_param_data);
234 rv = sqlite3_step(stmt);
237 sqlite3_finalize(stmt);
241 static gboolean query_database(void *handle, const char *query, GHashTable *in_param)
244 sqlite3_stmt *stmt = NULL;
245 char szQuery[5000+1]; /* +1 is for NULL Termination Character '\0' */
249 msg("query database");
251 memset(szQuery, '\0', 5001);
252 strncpy(szQuery, query, 5000);
254 rv = sqlite3_prepare_v2(handle, szQuery, strlen(szQuery), &stmt, NULL);
255 if (rv != SQLITE_OK) {
256 msg("fail to connect to table (%d)", rv);
261 g_hash_table_iter_init(&iter, in_param);
262 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
263 msg("key(%s), value(%s)", (const char *)key, (const char *)value);
265 if (!value || g_strcmp0((const char *) value, "") == 0) {
267 rv = sqlite3_bind_null(stmt, atoi((const char *) key));
270 rv = sqlite3_bind_text(stmt, atoi((const char *) key), (const char *) value, strlen((const char *) value),
274 if (rv != SQLITE_OK) {
275 msg("fail to bind data (%d)", rv);
281 rv = sqlite3_step(stmt);
282 msg("query executed (%d)", rv);
283 sqlite3_finalize(stmt);
285 if (rv != SQLITE_DONE)
291 static gboolean __reset_database(void)
297 /* Initialize Storage */
298 handle = create_handle(DATABASE_PATH);
299 if (handle == NULL) {
300 msg("Failed to get Storage handle");
305 memset(szQuery, 0x0, sizeof(szQuery));
306 strcat(szQuery, " delete from pdp_profile");
308 rv = query_database(handle, szQuery, NULL);
309 msg("Reset profile table: [%s]", (rv == TRUE ? "SUCCESS" : "FAIL"));
311 /* De-initialize Storage */
312 remove_handle(handle);
317 static int __insert_network_id_to_database(gchar *mccmnc)
320 GHashTable *in_param, *out_param;
328 /* Initialize Database */
329 handle = create_handle(DATABASE_PATH);
330 if (handle == NULL) {
331 msg("Failed to get Storage handle");
336 * Check the maximum Network ID that exists in database,
337 * if NONE exists, then 'Network ID' would be equal to 1
338 * else if there exists a valid maximum entry; 'Network ID' would be incremented value.
340 out_param = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
341 (GDestroyNotify) g_hash_table_destroy);
344 memset(szQuery, 0x0, sizeof(szQuery));
345 strcpy(szQuery, "select max(network_info_id) as network_id from network_info");
347 rv = read_query_database(handle, szQuery, NULL, out_param, 1);
348 msg("Read Database: [%s]", (rv == TRUE ? "SUCCESS" : "FAIL"));
350 g_hash_table_iter_init(&iter, out_param);
351 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
352 GHashTableIter iter2;
353 gpointer key2, value2;
356 g_hash_table_iter_init(&iter2, (GHashTable *)value);
357 while (g_hash_table_iter_next(&iter2, &key2, &value2) == TRUE) {
358 msg("key2(%s) value2(%s)", (const char *)key2, (const char *)value2);
359 if (g_str_equal(key2, "0") == TRUE) {
360 if (!value2 || g_strcmp0((const char *)value2, "") == 0)
363 network_id = atoi((const char *)value2);
365 /* TODO - Check this logic */
373 g_hash_table_destroy(out_param);
375 /* Increment Network ID */
379 memset(szQuery, 0x0, sizeof(szQuery));
380 strcpy(szQuery, " insert into network_info(network_info_id, network_name, mccmnc) values(?, ?, ?) ");
382 /* Initialize parameters */
383 in_param = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
384 g_hash_table_insert(in_param, "1", g_strdup_printf("%d", network_id)); /* Network ID */
385 g_hash_table_insert(in_param, "2", g_strdup_printf("PLMN_%s", mccmnc));
386 g_hash_table_insert(in_param, "3", g_strdup(mccmnc));
388 rv = query_database(handle, szQuery, in_param);
390 msg("Failed to insert query to Storage");
395 g_hash_table_destroy(in_param);
397 /* De-initialize Storage */
398 remove_handle(handle);
404 static int __load_network_id_from_database(gchar *mccmnc)
407 GHashTable *in_param, *out_param;
416 /* Initialize Storage */
417 handle = create_handle(DATABASE_PATH);
418 if (handle == NULL) {
419 msg("Failed to get Storage handle");
423 /* Initialize parameters */
424 in_param = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
425 g_hash_table_insert(in_param, "1", g_strdup(mccmnc));
427 out_param = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
428 (GDestroyNotify) g_hash_table_destroy);
431 memset(szQuery, 0x0, sizeof(szQuery));
432 strcpy(szQuery, "select network_info_id from network_info where mccmnc = ? ");
434 rv = read_query_database(handle, szQuery, in_param, out_param, 1);
435 msg("Read Database: [%s]", (rv == TRUE ? "SUCCESS" : "FAIL"));
437 g_hash_table_iter_init(&iter, out_param);
438 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
439 GHashTableIter iter2;
440 gpointer key2, value2;
443 g_hash_table_iter_init(&iter2, (GHashTable *)value);
444 while (g_hash_table_iter_next(&iter2, &key2, &value2) == TRUE) {
445 if (g_str_equal(key2, "0") == TRUE) {
446 if (!value2 || (g_strcmp0((const char *)value2, "") == 0))
449 network_id = atoi((const char *)value2);
451 /* TODO - Check this out */
459 g_hash_table_destroy(in_param);
460 g_hash_table_destroy(out_param);
462 /* De-initialize Storage */
463 remove_handle(handle);
469 static int __get_network_id(gchar *mccmnc)
473 network_id = __load_network_id_from_database(mccmnc);
474 msg("network id(%d)", network_id);
478 network_id = __insert_network_id_to_database(mccmnc);
485 static int __load_profile_id_from_database(void)
488 GHashTable *out_param;
497 /* Initialize Database */
498 handle = create_handle(DATABASE_PATH);
499 if (handle == NULL) {
500 msg("Failed to get Storage handle");
504 /* Initialize parameters */
505 out_param = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
506 (GDestroyNotify) g_hash_table_destroy);
509 memset(szQuery, 0x0, sizeof(szQuery));
510 strcpy(szQuery, "select max(profile_id) as last_profile from pdp_profile");
512 rv = read_query_database(handle, szQuery, NULL, out_param, 1);
513 msg("Read Database: [%s]", (rv == TRUE ? "SUCCESS" : "FAIL"));
515 g_hash_table_iter_init(&iter, out_param);
516 while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
517 GHashTableIter iter2;
518 gpointer key2, value2;
521 g_hash_table_iter_init(&iter2, (GHashTable *)value);
522 while (g_hash_table_iter_next(&iter2, &key2, &value2) == TRUE) {
523 if (g_str_equal(key2, "0") == TRUE) {
524 if (!value2 || (g_strcmp0((const char *)value2, "") == 0))
527 profile_id = atoi((const char *)value2);
529 /* TODO - Check this logic */
537 g_hash_table_destroy(out_param);
538 /* De-initialize Storage */
539 remove_handle(handle);
543 static gboolean __get_default_profile_from_database(int network_info_id, int svc_category_id)
546 GHashTable *in_param, *out_param;
548 gboolean rv, ret = FALSE;
551 /* Initialize Storage */
552 handle = create_handle(DATABASE_PATH);
553 if (handle == NULL) {
554 msg("Failed to get Storage handle");
558 /* Initialize parameters */
559 in_param = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
560 g_hash_table_insert(in_param, "1", g_strdup_printf("%d", network_info_id));
561 g_hash_table_insert(in_param, "2", g_strdup_printf("%d", svc_category_id));
563 out_param = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
564 (GDestroyNotify) g_hash_table_destroy);
567 memset(szQuery, 0x0, sizeof(szQuery));
568 strcpy(szQuery, "select profile_id from pdp_profile ");
569 strcat(szQuery, "where network_info_id = ? and svc_category_id = ? and default_internet_con = 1");
571 rv = read_query_database(handle, szQuery, in_param, out_param, 1);
572 msg("Read Database: [%s]", (rv == TRUE ? "SUCCESS" : "FAIL"));
574 profile_cnt = g_hash_table_size(out_param);
575 if (profile_cnt > 0) {
576 msg("default profile for (svc_category_id: %d, network_info_id: %d) exists: count[%d]",
577 svc_category_id, network_info_id, profile_cnt);
581 g_hash_table_destroy(in_param);
582 g_hash_table_destroy(out_param);
584 /* De-initialize Database */
585 remove_handle(handle);
589 static gboolean __insert_apns_to_database(GHashTable *in_param)
595 if (in_param == NULL) {
596 msg("in_param is NULL !!!");
600 /* Initialize Database */
601 handle = create_handle(DATABASE_PATH);
602 if (handle == NULL) {
603 msg("Failed to get db handle");
607 memset(szQuery, 0x0, sizeof(szQuery));
608 strcpy(szQuery, " insert into pdp_profile(");
609 strcat(szQuery, " profile_id, profile_name, apn, auth_type, auth_id, auth_pwd, ");
610 strcat(szQuery, " pdp_protocol, svc_category_id, proxy_ip_addr, home_url, linger_time, ");
611 strcat(szQuery, " network_info_id, hidden, editable, default_internet_con, user_defined) values(");
612 strcat(szQuery, " ?, ?, ?, ?, ?, ?, ");/* 1, 2, 3, 4, 5, 6(auth_pwd) */
613 strcat(szQuery, " ?, ?, ?, ?, 300, ");/* 7, 8, 9, 10(home_url) */
614 strcat(szQuery, " ?, 0, 1, ?, 0)");/* 11, 12(default_internet_con) */
616 rv = query_database(handle, szQuery, in_param);
617 msg("Insert to Database: [%s]", (rv == TRUE ? "SUCCESS" : "FAIL"));
619 /* De-initialize Database */
620 remove_handle(handle);
624 static gboolean __duplicate_profile_by_type(GHashTable *in_param, gpointer node, int svc_category_id)
627 xmlNode *cur_node = node;
628 gchar *in_tuple = NULL;
631 if (!in_param || !node)
634 tmp = g_hash_table_lookup(in_param, "1");
635 if (tmp) { /* profile_id */
636 profile_index = atoi((char *)tmp);
638 g_hash_table_insert(in_param, "1", g_strdup_printf("%d", profile_index));
639 msg("profile_id = %d", profile_index);
644 {/* svc_category_id */
645 g_hash_table_insert(in_param, "8", g_strdup_printf("%d", svc_category_id));
646 msg("svc_category_id = %d", svc_category_id);
650 gchar *proxy_ip_addr = NULL, *proxy = NULL, *port = NULL;
652 if (svc_category_id == CONTEXT_ROLE_MMS) {
653 proxy = (char *)xmlGetProp(cur_node, (const unsigned char *)"mmsproxy");
654 port = (char *)xmlGetProp(cur_node, (const unsigned char *)"mmsport");
656 proxy = (char *)xmlGetProp(cur_node, (const unsigned char *)"proxy");
657 port = (char *)xmlGetProp(cur_node, (const unsigned char *)"port");
660 proxy_ip_addr = g_strdup_printf("%s:%s", proxy, port);
661 in_tuple = g_strdup(proxy_ip_addr);
662 g_free(proxy_ip_addr);
664 in_tuple = g_strdup("");
666 g_hash_table_insert(in_param, "9", g_strdup(in_tuple));
667 msg("proxy_ip_addr = %s", in_tuple);
673 mmsc = (char *)xmlGetProp(cur_node, (const unsigned char *)"mmsc");
674 if (mmsc && svc_category_id == CONTEXT_ROLE_MMS)
675 in_tuple = g_strdup(mmsc);
677 in_tuple = g_strdup("");
678 g_hash_table_insert(in_param, "10", g_strdup(in_tuple));
679 msg("home_url = %s", in_tuple);
683 {/* default internet connection */
684 int default_internet_con = 1; /* default */
686 tmp = g_hash_table_lookup(in_param, "11"); /* network_info_id */
688 int network_info_id = atoi((char *)tmp);
689 msg("network_info_id = %d", network_info_id);
690 if (network_info_id > 0 && __get_default_profile_from_database(network_info_id, svc_category_id))
691 default_internet_con = 0;
693 g_hash_table_insert(in_param, "12", g_strdup_printf("%d", default_internet_con));
694 msg("default_internet_con = %d", default_internet_con);
697 /* insert duplacte profile to database. */
698 return __insert_apns_to_database(in_param);
701 static GHashTable *__construct_profile_tuples(gpointer node)
703 xmlNode *cur_node = node;
704 GHashTable *in_param = NULL;
705 gchar *in_tuple = NULL;
706 int profile_id = 0, network_info_id = -1, svc_category_id = 0;
711 /* Initialize parameters */
712 in_param = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
715 profile_id = __load_profile_id_from_database();
717 g_hash_table_insert(in_param, "1", g_strdup_printf("%d", profile_id));
718 msg("profile_id = %d", profile_id);
722 gchar *profile_name = NULL;
723 profile_name = (char *)xmlGetProp(cur_node, (const unsigned char *)"carrier");
725 in_tuple = g_strdup(profile_name);
727 in_tuple = g_strdup_printf("TEMP_PROFILE_%d", profile_id);
729 g_hash_table_insert(in_param, "2", g_strdup(in_tuple));
730 msg("profile_name = %s", in_tuple);
736 apn = (char *)xmlGetProp(cur_node, (const unsigned char *)"apn");
738 in_tuple = g_strdup(apn);
740 in_tuple = g_strdup("");
741 g_hash_table_insert(in_param, "3", g_strdup(in_tuple));
742 msg("apn = %s", in_tuple);
747 gchar *auth_type = NULL, *auth = NULL;
748 auth_type = (char *)xmlGetProp(cur_node, (const unsigned char *)"auth_type");
749 auth = (char *)xmlGetProp(cur_node, (const unsigned char *)"auth");
751 in_tuple = g_strdup(auth_type);
753 in_tuple = g_strdup(auth);
755 in_tuple = g_strdup("0"); /* CONTEXT_AUTH_NONE */
757 g_hash_table_insert(in_param, "4", g_strdup(in_tuple));
758 msg("auth_type = %s", in_tuple);
763 gchar *auth_id = NULL;
764 auth_id = (char *)xmlGetProp(cur_node, (const unsigned char *)"user");
766 in_tuple = g_strdup(auth_id);
768 in_tuple = g_strdup("");
769 g_hash_table_insert(in_param, "5", g_strdup(in_tuple));
770 msg("auth_id = %s", in_tuple);
775 gchar *auth_pwd = NULL;
776 auth_pwd = (char *)xmlGetProp(cur_node, (const unsigned char *)"password");
778 in_tuple = g_strdup(auth_pwd);
780 in_tuple = g_strdup("");
781 g_hash_table_insert(in_param, "6", g_strdup(in_tuple));
782 msg("auth_pwd = %s", in_tuple);
787 gchar *protocol = NULL;
788 int pdp_protocol = CONTEXT_TYPE_IP;
789 protocol = (char *)xmlGetProp(cur_node, (const unsigned char *)"protocol");
791 if (!g_strcmp0(protocol, "IPV6"))
792 pdp_protocol = CONTEXT_TYPE_IPV6;
793 else if (!g_strcmp0(protocol, "IPV4V6"))
794 pdp_protocol = CONTEXT_TYPE_IPV4V6;
796 g_hash_table_insert(in_param, "7", g_strdup_printf("%d", pdp_protocol));
797 msg("protocol = %s", protocol);
800 {/* service category id */
801 gchar *svc_type = NULL;
802 svc_type = (char *)xmlGetProp(cur_node, (const unsigned char *)"type");
803 if (NULL != g_strrstr(svc_type, "default"))
804 svc_category_id = CONTEXT_ROLE_INTERNET;
805 else if (!g_strcmp0(svc_type, "mms"))
806 svc_category_id = CONTEXT_ROLE_MMS;
807 else if (!g_strcmp0(svc_type, "dun"))
808 svc_category_id = CONTEXT_ROLE_TETHERING;
810 g_hash_table_insert(in_param, "8", g_strdup_printf("%d", svc_category_id));
811 msg("svc_category_id = %d", svc_category_id);
815 gchar *proxy_ip_addr = NULL, *proxy = NULL, *port = NULL;
817 if (svc_category_id == CONTEXT_ROLE_MMS) {
818 proxy = (char *)xmlGetProp(cur_node, (const unsigned char *)"mmsproxy");
819 port = (char *)xmlGetProp(cur_node, (const unsigned char *)"mmsport");
821 proxy = (char *)xmlGetProp(cur_node, (const unsigned char *)"proxy");
822 port = (char *)xmlGetProp(cur_node, (const unsigned char *)"port");
825 proxy_ip_addr = g_strdup_printf("%s:%s", proxy, port);
826 in_tuple = g_strdup(proxy_ip_addr);
827 g_free(proxy_ip_addr);
829 in_tuple = g_strdup("");
831 g_hash_table_insert(in_param, "9", g_strdup(in_tuple));
832 msg("proxy_ip_addr = %s", in_tuple);
838 mmsc = (char *)xmlGetProp(cur_node, (const unsigned char *)"mmsc");
839 if (mmsc && svc_category_id == CONTEXT_ROLE_MMS)
840 in_tuple = g_strdup(mmsc);
842 in_tuple = g_strdup("");
843 g_hash_table_insert(in_param, "10", g_strdup(in_tuple));
844 msg("home_url = %s", in_tuple);
848 {/* network info id */
849 gchar *plmn = NULL, *mcc = NULL, *mnc = NULL;
850 mcc = (char *)xmlGetProp(cur_node, (const unsigned char *)"mcc");
851 mnc = (char *)xmlGetProp(cur_node, (const unsigned char *)"mnc");
854 plmn = g_strdup_printf("%s%s", mcc, mnc);
855 msg("mccmnc = %s", plmn);
856 network_info_id = __get_network_id(plmn);
859 g_hash_table_insert(in_param, "11", g_strdup_printf("%d", network_info_id));
860 msg("network_info_id = %d", network_info_id);
863 {/* default internet connection */
864 int default_internet_con = 1;
865 if (__get_default_profile_from_database(network_info_id, svc_category_id))
866 default_internet_con = 0;
867 g_hash_table_insert(in_param, "12", g_strdup_printf("%d", default_internet_con));
868 msg("default_internet_con = %d", default_internet_con);
874 static gboolean __init_global_apns_from_xml(const char *file_path)
876 xmlNode *cur_node = NULL;
877 xmlNodePtr cur, root_node;
878 void *xml_doc = NULL, *xml_root_node = NULL;
879 char *version = NULL;
880 gboolean ret = FALSE;
882 /* remove pdp_profile table first. */
885 __load_xml_file(file_path, "apns", &xml_doc, &xml_root_node);
886 if (!xml_root_node) {
887 msg("[APNS CONF] Load error - Root node is NULL.");
890 root_node = (xmlNodePtr)xml_root_node;
891 version = (char *)xmlGetProp(root_node, (const unsigned char *)"version");
893 msg("apns-conf.xml <apns version=\"%s\">", version);
894 cur = root_node->xmlChildrenNode;
895 /* Compare property */
896 for (cur_node = cur; cur_node; cur_node = cur_node->next) {
897 if (cur_node->type == XML_ELEMENT_NODE) {
898 GHashTable *in_param = NULL;
899 gchar *svc_type = NULL;
902 in_param = __construct_profile_tuples(cur_node);
903 rv = __insert_apns_to_database(in_param);
907 /* duplicate profiles for the same APNs */
908 svc_type = (char *)xmlGetProp(cur_node, (const unsigned char *)"type");
909 if (NULL != g_strrstr(svc_type, "default")) {
910 if (NULL != g_strrstr(svc_type, "mms")) {
911 /* type="default, supl, mms" */
912 __duplicate_profile_by_type(in_param, cur_node, CONTEXT_ROLE_MMS);
913 if (NULL != g_strrstr(svc_type, "dun")) {
914 /* type="default, supl, mms, dun" */
915 __duplicate_profile_by_type(in_param, cur_node, CONTEXT_ROLE_TETHERING);
917 } else if (NULL != g_strrstr(svc_type, "dun")) {
918 /* type="default, supl, dun" */
919 __duplicate_profile_by_type(in_param, cur_node, CONTEXT_ROLE_TETHERING);
922 g_hash_table_destroy(in_param);
926 __unload_xml_file(&xml_doc, &xml_root_node);
931 int main(int arg, char **argv)
934 gchar *command = NULL;
935 __init_global_apns_from_xml("/usr/share/ps-plugin/apns-conf.xml");
936 rv = __system_command("/bin/mkdir /opt/usr/share/telephony");
937 msg("system command sent, rv(%d)", rv);
938 /* remove exist sql */
939 rv = __system_command("/bin/rm /opt/usr/share/telephony/dnet_db_init.sql");
940 msg("system command sent, rv(%d)", rv);
941 /* Dump pdp_profile to sql */
942 command = g_strdup_printf("/usr/bin/sqlite3 %s .dump | grep \"INSERT INTO \\\"pdp_profile\\\"\" > /opt/usr/share/telephony/dnet_db_init.sql", DATABASE_PATH);
943 rv = __system_command(command);
944 msg("system command sent, rv(%d)", rv);