Store saved mesh network into storage
authorJiwan Kim <ji-wan.kim@samsung.com>
Mon, 20 Mar 2017 09:11:04 +0000 (18:11 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Mon, 17 Jul 2017 02:35:36 +0000 (11:35 +0900)
include/mesh-network.h
include/mesh-request.h
packaging/meshd.spec
src/mesh-network.c
src/mesh-request.c
src/mesh-service-interface.c

index 80d3f94..a26f86e 100644 (file)
@@ -19,6 +19,8 @@
 #ifndef __MESH_NETWORK_H__
 #define __MESH_NETWORK_H__
 
+int mesh_network_load_mesh_network(GList **saved_network);
+
 int mesh_network_add_mesh_network(GList **saved_network, const char *mesh_id,
                int mesh_channel, int security);
 int mesh_network_get_saved_mesh_network(GList **saved_network);
index 0d4164c..c101ec9 100644 (file)
@@ -48,6 +48,7 @@ int mesh_request_cancel_scan(const char* mesh_interface);
 int mesh_request_get_scan_result(const char* mesh_interface, GList **scan_list);
 
 /* Saved network */
+int mesh_request_load_saved_mesh_network(GList **network_list);
 int mesh_request_add_mesh_network(GList **saved_network,
                const char *mesh_id, int channel, int security);
 int mesh_request_get_saved_mesh_network(GList **saved_network);
index 20f03d6..251246c 100644 (file)
@@ -82,6 +82,9 @@ cp meshd.service %{buildroot}%{_unitdir}/meshd.service
 %post
 chmod 755 %{_sbindir}/mesh.sh
 
+# For configuration file
+mkdir -p %TZ_SYS_VAR/lib/mesh
+
 %files
 %manifest meshd.manifest
 %license LICENSE
index d28e4ea..694e328 100644 (file)
@@ -17,6 +17,7 @@
  *
  */
 #include <glib.h>
+#include <tzplatform_config.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -31,6 +32,8 @@
 #include "mesh-service.h"
 #include "mesh-network.h"
 
+#define MESH_NETWORK_LIST_FILE_PATH    tzplatform_mkpath(TZ_SYS_VAR, "/lib/mesh/mesh_network.conf")
+
 static void _list_destroy_notify(gpointer data)
 {
        mesh_network_info_s *info = (mesh_network_info_s*)data;
@@ -41,6 +44,121 @@ static void _list_destroy_notify(gpointer data)
        }
 }
 
+static void _save_current_list_into_storage(GList *saved_network)
+{
+       GKeyFile* storage = NULL;
+       gboolean res = FALSE;
+       GError* error = NULL;
+       mesh_network_info_s *info = NULL;
+
+       GList *iter = NULL;
+       char str_group[16];
+       int group_index = 1;
+
+       storage = g_key_file_new();
+
+       /* Insert list item into storage list */
+       iter = saved_network;
+       while (iter != NULL) {
+               info = (mesh_network_info_s*)iter->data;
+
+               /* Generate item group */
+               snprintf(str_group, 16, "Item%d", group_index++);
+               g_key_file_set_string(storage, str_group, "mesh_id", info->mesh_id);
+               g_key_file_set_integer(storage, str_group, "channel", info->channel);
+               g_key_file_set_integer(storage, str_group, "security", info->security);
+
+               iter = g_list_next(iter);
+       }
+
+       MESH_LOGD("Saving network information list into storage..");
+       res = g_key_file_save_to_file(storage, MESH_NETWORK_LIST_FILE_PATH, &error);
+       if (FALSE == res) {
+               MESH_LOGE("Failed to save mesh network list into storage !");
+               MESH_LOGE("    [%s]", error->message);
+               g_error_free(error);
+       }
+
+       g_key_file_free(storage);
+}
+
+int mesh_network_load_mesh_network(GList **saved_network)
+{
+       GKeyFile* storage;
+       gboolean res = FALSE;
+       GError* error = NULL;
+
+       gsize list_count = 0;
+       gchar** group_list = NULL;
+       mesh_network_info_s *info = NULL;
+       char *mesh_id = NULL;
+       int mesh_channel;
+       int security;
+
+       gsize idx = 0;
+
+       /* Check if stored file exists */
+       res = g_file_test(MESH_NETWORK_LIST_FILE_PATH, G_FILE_TEST_EXISTS);
+       if (FALSE == res) {
+               MESH_LOGD("There is no saved networks on storage");
+               return MESHD_ERROR_NONE;
+       }
+
+       /* Get stored contents */
+       storage = g_key_file_new();
+       res = g_key_file_load_from_file(storage, MESH_NETWORK_LIST_FILE_PATH,
+                               G_KEY_FILE_NONE, &error);
+       if (FALSE == res) {
+               MESH_LOGE("Failed to get saved network list from storage !");
+               g_key_file_free(storage);
+               return MESHD_ERROR_IO_ERROR;
+       }
+
+       group_list = g_key_file_get_groups(storage, &list_count);
+       if (group_list) {
+               for(idx = 0; idx < list_count ; idx++) {
+                       mesh_id = g_key_file_get_string(storage, group_list[idx],
+                                               "mesh_id", NULL);
+                       mesh_channel = g_key_file_get_integer(storage, group_list[idx],
+                                               "channel", NULL);
+                       security = g_key_file_get_integer(storage, group_list[idx],
+                                               "security", NULL);
+
+                       MESH_LOGD("=========[%d / %d]==========", idx, list_count);
+                       MESH_LOGD("[%s] : ", group_list[idx]);
+                       MESH_LOGD("    mesh_id  : [%s]", mesh_id);
+                       MESH_LOGD("    channel  : [%d]", mesh_channel);
+                       MESH_LOGD("    security : [%d]", security);
+
+                       info = g_try_new0(mesh_network_info_s, 1);
+                       if (NULL == info) {
+                               MESH_LOGE("Failed to allocate memory !");
+                               g_key_file_free(storage);
+                               g_strfreev(group_list);
+                               return MESHD_ERROR_OUT_OF_MEMORY;
+                       }
+                       info->mesh_id = mesh_id;
+                       info->bssid = NULL;
+                       info->channel = mesh_channel;
+                       info->security = security;
+
+                       *saved_network = g_list_prepend(*saved_network, info);
+               }
+               /* Reverse list order to place higher priority sequence */
+               *saved_network = g_list_reverse(*saved_network);
+
+               g_strfreev(group_list);
+       } else {
+               MESH_LOGE("File exists but there is no data");
+               g_key_file_free(storage);
+               return MESHD_ERROR_NO_DATA;
+       }
+
+       g_key_file_free(storage);
+
+       return MESHD_ERROR_NONE;
+}
+
 int mesh_network_add_mesh_network(GList **saved_network, const char *mesh_id,
                int mesh_channel, int security)
 {
@@ -83,6 +201,8 @@ int mesh_network_add_mesh_network(GList **saved_network, const char *mesh_id,
 
        *saved_network = g_list_prepend(*saved_network, info);
 
+       _save_current_list_into_storage(*saved_network);
+
        return ret;
 }
 
@@ -191,6 +311,8 @@ int mesh_network_select_saved_mesh_network(GList **saved_network,
                ret = MESHD_ERROR_NO_DATA;
        }
 
+       _save_current_list_into_storage(*saved_network);
+
        return ret;
 }
 
@@ -227,6 +349,8 @@ int mesh_network_forget_saved_mesh_network(GList **saved_network,
                ret = MESHD_ERROR_NO_DATA;
        }
 
+       _save_current_list_into_storage(*saved_network);
+
        return ret;
 }
 
index 56806fd..0041ea2 100644 (file)
@@ -456,6 +456,21 @@ int mesh_request_remove_bridge_interface(const char* bridge_interface,
        return MESHD_ERROR_NONE;
 }
 
+int mesh_request_load_saved_mesh_network(GList **network_list)
+{
+       int ret = MESHD_ERROR_NONE;
+
+       MESH_LOGD("Load saved mesh network from storage...");
+
+       ret = mesh_network_load_mesh_network(network_list);
+       if(MESHD_ERROR_NONE != ret) {
+               MESH_LOGE("Failed to load mesh network");
+               return ret;
+       }
+
+       return MESHD_ERROR_NONE;
+}
+
 int mesh_request_add_mesh_network(GList **network_list,
                const char *mesh_id, int channel, int security)
 {
index 7d09b1e..16e1e58 100644 (file)
@@ -176,6 +176,12 @@ static gboolean _meshd_dbus_handle_enable(Manager *object,
                goto FINISH;
        }
 
+       ret = mesh_request_load_saved_mesh_network(&service->saved_mesh_network);
+       if (MESHD_ERROR_NONE != ret) {
+               MESH_LOGE("Failed to mesh_request_load_saved_mesh_network [%d]", ret);
+               goto FINISH;
+       }
+
 FINISH:
        net_mesh_emit_mesh_enabled(meshd_dbus_get_object(), ret);