gui: Add option to enable unsolicited data caching

Change-Id: I53ccf0d7d63fc9212154d00298dab54188959535
diff --git a/app/src/main/jni/Android.mk b/app/src/main/jni/Android.mk
index 248db74..6237abf 100644
--- a/app/src/main/jni/Android.mk
+++ b/app/src/main/jni/Android.mk
@@ -4,9 +4,9 @@
 include $(CLEAR_VARS)
 LOCAL_MODULE := nfd-wrapper
 LOCAL_SRC_FILES := nfd-wrapper.cpp
-LOCAL_SHARED_LIBRARIES := nfd_shared ndn_cxx_shared boost_system_shared boost_thread_shared boost_log_shared
+LOCAL_SHARED_LIBRARIES := nfd_shared ndn_cxx_shared boost_system_shared boost_thread_shared boost_log_shared boost_stacktrace_basic_shared
 LOCAL_LDLIBS := -llog -latomic
-LOCAL_CFLAGS := -DBOOST_LOG_DYN_LINK=1
+LOCAL_CFLAGS := -DBOOST_LOG_DYN_LINK -DBOOST_STACKTRACE_DYN_LINK
 include $(BUILD_SHARED_LIBRARY)
 
 $(call import-module,../packages/nfd/0.6.6)
diff --git a/app/src/main/jni/nfd-wrapper.cpp b/app/src/main/jni/nfd-wrapper.cpp
index d7ebed5..7b72430 100644
--- a/app/src/main/jni/nfd-wrapper.cpp
+++ b/app/src/main/jni/nfd-wrapper.cpp
@@ -19,19 +19,20 @@
 
 #include "nfd-wrapper.hpp"
 
-#include <nfd.hpp>
-#include <rib/service.hpp>
+#include <daemon/common/config-file.hpp>
+#include <daemon/common/global.hpp>
+#include <daemon/common/logger.hpp>
+#include <daemon/common/privilege-helper.hpp>
+#include <daemon/nfd.hpp>
+#include <daemon/rib/service.hpp>
 
-#include <common/config-file.hpp>
-#include <common/global.hpp>
-#include <common/logger.hpp>
-#include <common/privilege-helper.hpp>
+#include <ndn-cxx/util/exception.hpp>
+#include <ndn-cxx/util/logging.hpp>
 
 #include <boost/property_tree/info_parser.hpp>
-#include <boost/thread.hpp>
+
+#include <thread>
 #include <mutex>
-#include <ndn-cxx/util/logging.hpp>
-#include <stdlib.h>
 
 NFD_LOG_INIT(NfdWrapper);
 
@@ -108,6 +109,12 @@
     std::istringstream input(initialConfig);
     boost::property_tree::read_info(input, m_config);
 
+    // now, the start procedure can update config if needed
+  }
+
+  void
+  finishInit()
+  {
     m_nfd.reset(new Nfd(m_config, m_keyChain));
     m_ribService.reset(new rib::Service(m_config, m_keyChain));
 
@@ -144,6 +151,12 @@
     }
   }
 
+  nfd::ConfigSection&
+  getConfig()
+  {
+    return m_config;
+  }
+
 private:
   std::mutex m_pointerMutex;
   boost::asio::io_service* m_io;
@@ -155,7 +168,7 @@
 };
 
 static unique_ptr<Runner> g_runner;
-static boost::thread g_thread;
+static std::thread g_thread;
 static std::map<std::string, std::string> g_params;
 
 } // namespace nfd
@@ -212,16 +225,25 @@
     ::setenv("HOME", nfd::g_params["homePath"].c_str(), true);
     NFD_LOG_INFO("Use [" << nfd::g_params["homePath"] << "] as a security storage");
 
-    nfd::g_thread = boost::thread([] {
+    nfd::g_thread = std::thread([] {
         nfd::resetGlobalIoService();
 
         NFD_LOG_INFO("Starting NFD...");
         try {
           nfd::g_runner.reset(new nfd::Runner());
+          // update config
+          for (const auto& pair : nfd::g_params) {
+            if (pair.first == "homePath")
+              continue;
+
+            nfd::g_runner->getConfig().put(pair.first, pair.second);
+          }
+          nfd::g_runner->finishInit();
+
           nfd::g_runner->run();
         }
         catch (const std::exception& e) {
-          NFD_LOG_FATAL(e.what());
+          NFD_LOG_FATAL(boost::diagnostic_information(e));
         }
         catch (const nfd::PrivilegeHelper::Error& e) {
           NFD_LOG_FATAL("PrivilegeHelper: " << e.what());