Make fmwup-api for things sdk 85/156585/3
authorhhk86.heo <hhk86.heo@samsung.com>
Thu, 19 Oct 2017 04:42:58 +0000 (13:42 +0900)
committerhhk86.heo <hhk86.heo@samsung.com>
Thu, 19 Oct 2017 04:48:40 +0000 (13:48 +0900)
Change-Id: I50e1c8456d58e402200cba0d6bfc174ca9fcae35

13 files changed:
.cproject
.project
inc/fmwup_api.h
inc/fmwup_log.h [deleted file]
lib/liboicdastack.so [new file with mode: 0644]
src/fmwup_api.c
src/fmwup_util_data.c [new file with mode: 0644]
src/fmwup_util_data.h [new file with mode: 0644]
src/fmwup_util_http.c [new file with mode: 0644]
src/fmwup_util_http.h [new file with mode: 0644]
src/fmwup_util_internal.c [new file with mode: 0644]
src/fmwup_util_internal.h [new file with mode: 0644]
src/fmwup_util_log.h [new file with mode: 0644]

index b810638b9871281c4bcf50a4c6515216e27b78a9..42279acbc58c7f27a30a9b10f0475ff58218dc27 100644 (file)
--- a/.cproject
+++ b/.cproject
@@ -92,6 +92,7 @@
                                                                        <listOptionValue builtIn="false" value="TIZEN_DEPRECATION"/>
                                                                        <listOptionValue builtIn="false" value="DEPRECATION_WARNING"/>
                                                                        <listOptionValue builtIn="false" value="_DEBUG"/>
+                                                                       <listOptionValue builtIn="false" value="_USE_WWST_=_USE_WWST_"/>
                                                                </option>
                                                                <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.88951645" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
                                                        </tool>
                                                                        <listOptionValue builtIn="false" value="TIZEN_DEPRECATION"/>
                                                                        <listOptionValue builtIn="false" value="DEPRECATION_WARNING"/>
                                                                        <listOptionValue builtIn="false" value="_DEBUG"/>
+                                                                       <listOptionValue builtIn="false" value="_USE_WWST_=_USE_WWST_"/>
                                                                </option>
                                                                <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.2106397814" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
                                                        </tool>
                                                                <option id="gnu.cpp.link.option.paths.2127407685" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
                                                                        <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/lib}&quot;"/>
                                                                </option>
+                                                               <option id="gnu.cpp.link.option.libs.534068022" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
+                                                                       <listOptionValue builtIn="false" srcPrefixMapping="" srcRootPath="" value="sdkapi"/>
+                                                               </option>
                                                                <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1734114204" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
                                                                        <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
                                                                        <additionalInput kind="additionalinput" paths="$(LIBS)"/>
                                                                <option id="sbi.gnu.cpp.compiler.option.frameworks.core.324855741" name="Tizen-Frameworks" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs">
                                                                        <listOptionValue builtIn="false" value="Native_API"/>
                                                                </option>
+                                                               <option id="sbi.gnu.cpp.compiler.option.preprocessor.def.deprecation.740506885" superClass="sbi.gnu.cpp.compiler.option.preprocessor.def.deprecation" valueType="definedSymbols">
+                                                                       <listOptionValue builtIn="false" value="TIZEN_DEPRECATION"/>
+                                                                       <listOptionValue builtIn="false" value="DEPRECATION_WARNING"/>
+                                                                       <listOptionValue builtIn="false" value="_USE_WWST_=_USE_WWST_"/>
+                                                               </option>
                                                                <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.342932899" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
                                                        </tool>
                                                        <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.1771217314" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler">
                                                                <option id="sbi.gnu.c.compiler.option.frameworks.core.752867410" name="Tizen-Frameworks" superClass="sbi.gnu.c.compiler.option.frameworks.core" valueType="userObjs">
                                                                        <listOptionValue builtIn="false" value="Native_API"/>
                                                                </option>
+                                                               <option id="sbi.gnu.c.compiler.option.preprocessor.def.symbols.deprecation.2066869501" superClass="sbi.gnu.c.compiler.option.preprocessor.def.symbols.deprecation" valueType="definedSymbols">
+                                                                       <listOptionValue builtIn="false" value="TIZEN_DEPRECATION"/>
+                                                                       <listOptionValue builtIn="false" value="DEPRECATION_WARNING"/>
+                                                                       <listOptionValue builtIn="false" value="_USE_WWST_=_USE_WWST_"/>
+                                                               </option>
                                                                <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1056387077" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
                                                        </tool>
                                                        <tool id="org.tizen.nativeide.tool.sbi.gnu.c.linker.base.927082769" name="C Linker" superClass="org.tizen.nativeide.tool.sbi.gnu.c.linker.base"/>
index 14971bc691491529c9ad3bdb4090e33338df1adf..89b62d375faa1b689a8bfb8b47d5a9d1ef21b73d 100644 (file)
--- a/.project
+++ b/.project
@@ -5,6 +5,11 @@
        <projects>
        </projects>
        <buildSpec>
+               <buildCommand>
+                       <name>org.tizen.nativecore.apichecker.apicheckerbuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
                <buildCommand>
                        <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
                        <arguments>
@@ -22,6 +27,7 @@
                <nature>org.eclipse.cdt.core.ccnature</nature>
                <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
                <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+               <nature>org.tizen.nativecore.apichecker.apicheckernature</nature>
        </natures>
        <filteredResources>
                <filter>
index d02b6308d5dcba6b1f1d071b90933abcc992d18b..a35d9ff9ec5ed05c8a05ca47356a92179cdedb32 100644 (file)
@@ -6,6 +6,7 @@
  */
 #include <stdbool.h>
 #include <tizen.h>
+#include "st_things.h"
 #include "st_things_types.h"
 
 #ifdef __cplusplus
@@ -18,8 +19,9 @@ extern "C" {
  */
 typedef enum {
        FMWUP_ERROR_NONE                =  0, /**< Successful */
-       FMWUP_ERROR_INVALID_PARAMETER   = -1, /**< Invalid parameter (If parameter is null or empty)*/
-       FMWUP_ERROR_OPERATION_FAILED    = -2, /**< Operation Failed */
+       FMWUP_ERROR_INVALID_PARAMETER   = ST_THINGS_ERROR_INVALID_PARAMETER, /**< Invalid parameter (If parameter is null or empty)*/
+       FMWUP_ERROR_OPERATION_FAILED    = ST_THINGS_ERROR_OPERATION_FAILED, /**< Operation Failed */
+       FMWUP_ERROR_MEMORY_ERR                  = -3, /**< Allocation Failed */
 } fmwup_things_error_e;
 
 
@@ -62,7 +64,7 @@ typedef enum {
 } fmwup_update_e;
 
 
-typedef void (*fmwup_state_changed_cb)(fmwup_state_e value);
+typedef void (*fmwup_state_changed_cb)(fmwup_state_e state, fmwup_result_e result);
 
 typedef void (*fmwup_is_new_firmware_cb)(bool is_new_firmware);
 
diff --git a/inc/fmwup_log.h b/inc/fmwup_log.h
deleted file mode 100644 (file)
index 11853f6..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * fmwup_log.h
- *
- *  Created on: Oct 11, 2017
- *      Author: hhk86heo
- */
-
-#ifndef FMWUP_LOG_H_
-#define FMWUP_LOG_H_
-
-#include <dlog.h>
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#endif
-#define LOG_TAG "ST-THINGS-APP"
-
-#define ERR(fmt, args...) dlog_print(DLOG_ERROR, LOG_TAG, fmt"\n", ##args)
-#define WARN(fmt, args...) dlog_print(DLOG_WARN, LOG_TAG, fmt"\n", ##args)
-#define INFO(fmt, args...)  dlog_print(DLOG_INFO, LOG_TAG, fmt"\n", ##args)
-#define DBG(fmt, args...) dlog_print(DLOG_DEBUG, LOG_TAG, fmt"\n", ##args)
-
-#define FN_CALL dlog_print(DLOG_DEBUG, LOG_TAG, ">>>>>>>> called")
-#define FN_END dlog_print(DLOG_DEBUG, LOG_TAG, "<<<<<<<< ended")
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
-
-#endif /* FMWUP_LOG_H_ */
diff --git a/lib/liboicdastack.so b/lib/liboicdastack.so
new file mode 100644 (file)
index 0000000..ca5cd19
Binary files /dev/null and b/lib/liboicdastack.so differ
index 5d14681ef20adb4d6217b0d3ab24572049e3057f..573b63d97c4db862f042dd430002549fb9ab91c1 100644 (file)
 /**
  * This file contains the exported symbol.
  */
+#include <glib.h>
+
 #include "fmwup_api.h"
+#include "fmwup_util_log.h"
+#include "fmwup_util_data.h"
+#include "fmwup_util_internal.h"
+#include "st_things.h"
+
+fmwup_state_changed_cb g_state_changed_cb = NULL;
+fmwup_is_new_firmware_cb g_is_new_cb = NULL;
+char *g_download_path = NULL;
+
+
+int _fmwup_get_data(st_things_representation_s *resp_rep)
+{
+       FN_CALL;
+       if (!resp_rep) {
+               ERR("Inavlid parameter, response representation is NULL");
+               return FMWUP_ERROR_INVALID_PARAMETER;
+       }
+
+       fmwup_data_s *fmwup_data;
+       fmwup_data = fmwup_data_get_properties();
+
+       /* save to key manager(ckmc) */
+       resp_rep->set_int_value(resp_rep, FIRMWARE_PROPERTY_UPDATE, (int64_t)fmwup_data->update);
+       resp_rep->set_str_value(resp_rep, FIRMWARE_PROPERTY_UPDATE_TIME, fmwup_data->update_time);
+       resp_rep->set_str_value(resp_rep, FIRMWARE_PROPERTY_DESCRIPTION, fmwup_data->description);
+       resp_rep->set_int_value(resp_rep, FIRMWARE_PROPERTY_STATE, (int64_t)fmwup_data->state);
+       resp_rep->set_int_value(resp_rep, FIRMWARE_PROPERTY_RESULT, (int64_t)fmwup_data->result);
+       resp_rep->set_int_value(resp_rep, FIRMWARE_PROPERTY_PROGRESS, (int64_t)fmwup_data->progress);
+
+       resp_rep->set_str_value(resp_rep, FIRMWARE_PROPERTY_NEW_VERSION, fmwup_data->new_version);
+       resp_rep->set_str_value(resp_rep, FIRMWARE_PROPERTY_PACKAGE_URI, fmwup_data->package_uri);
+       resp_rep->set_int_value(resp_rep, FIRMWARE_PROPERTY_PACKAGE_SIZE, (int64_t)fmwup_data->package_size);
+       resp_rep->set_str_value(resp_rep, FIRMWARE_PROPERTY_PACKAGE_MD5, fmwup_data->package_md5);
+
+       /* platform information */
+       resp_rep->set_str_value(resp_rep, FIRMWARE_PROPERTY_CURRENT_VERSION, fmwup_data->current_version);
+       resp_rep->set_str_value(resp_rep, FIRMWARE_PROPERTY_VENDER, fmwup_data->manufacturer);
+       resp_rep->set_str_value(resp_rep, FIRMWARE_PROPERTY_MODEL, fmwup_data->model_name);
+
+       /* temporary value */
+       resp_rep->set_bool_value(resp_rep, FIRMWARE_PROPERTY_ACTIVE_CHECK, fmwup_data->active_check);
+
+       G_FREE(fmwup_data->update_time);
+       G_FREE(fmwup_data->description);
+       G_FREE(fmwup_data->new_version);
+       G_FREE(fmwup_data->package_uri);
+       G_FREE(fmwup_data->package_md5);
+       G_FREE(fmwup_data->manufacturer);
+       G_FREE(fmwup_data->model_name);
+       G_FREE(fmwup_data->current_version);
+       G_FREE(fmwup_data);
+
+       FN_END;
+       return FMWUP_ERROR_NONE;
+}
+
+
+void _fmwup_set_data(st_things_set_request_message_s *req_msg, st_things_representation_s *resp_rep)
+{
+       FN_CALL;
+       char *new_firmware = NULL;
+       char *package_uri = NULL;
+       char *package_md5 = NULL;
+       int64_t package_size = 0;
+
+       char *update_time = NULL;
+       char *description = NULL;
+       int64_t update;
+
+       char temp[KEY_MANAGER_MAX_DATA_LENGTH] = {0,};
+
+       /* write to non volatile data - package info */
+       if (req_msg->rep->get_str_value(req_msg->rep, FIRMWARE_PROPERTY_NEW_VERSION, &new_firmware)) {
+               DBG("new_firmware: [%s]", new_firmware);
+               if (0 != fmwup_data_set_property(FIRMWARE_PROPERTY_NEW_VERSION, new_firmware)) {
+                       ERR("fmwup_data_set_property [%s] failed", FIRMWARE_PROPERTY_NEW_VERSION);
+               }
+       }
+
+       if (req_msg->rep->get_str_value(req_msg->rep, FIRMWARE_PROPERTY_PACKAGE_URI, &package_uri)) {
+               DBG("package_uri: [%s]", package_uri);
+               if (0 != fmwup_data_set_property(FIRMWARE_PROPERTY_PACKAGE_URI, package_uri)) {
+                       ERR("fmwup_data_set_property [%s] failed", FIRMWARE_PROPERTY_PACKAGE_URI);
+               }
+       }
+
+       if (req_msg->rep->get_int_value(req_msg->rep, FIRMWARE_PROPERTY_PACKAGE_SIZE, &package_size)) {
+               DBG("package_size: [%lld]", package_size);
+               snprintf(temp, sizeof(temp), "%lld", package_size);
+               if (0 != fmwup_data_set_property(FIRMWARE_PROPERTY_PACKAGE_SIZE, temp)) {
+                       ERR("fmwup_data_set_property [%s] failed", FIRMWARE_PROPERTY_PACKAGE_SIZE);
+               }
+       }
+
+       if (req_msg->rep->get_str_value(req_msg->rep, FIRMWARE_PROPERTY_PACKAGE_MD5, &package_md5)) {
+               DBG("package_md5: [%s]", package_md5);
+               if (0 != fmwup_data_set_property(FIRMWARE_PROPERTY_PACKAGE_MD5, package_md5)) {
+                       ERR("fmwup_data_set_property [%s] failed", FIRMWARE_PROPERTY_PACKAGE_MD5);
+               }
+       }
+
+       if (new_firmware && package_uri && g_is_new_cb)
+               g_is_new_cb(true);
+
+
+       /* write to volatile data - update info */
+
+       if (req_msg->rep->get_str_value(req_msg->rep, FIRMWARE_PROPERTY_UPDATE_TIME, &update_time)) {
+               DBG("update_time: [%s]", update_time);
+               if (0 != fmwup_data_set_property(FIRMWARE_PROPERTY_UPDATE_TIME, update_time)) {
+                       ERR("fmwup_data_set_property [%s] failed", FIRMWARE_PROPERTY_UPDATE_TIME);
+               }
+               /* TODO : Check Scheduled update , */
+       }
+
+       if (req_msg->rep->get_str_value(req_msg->rep, FIRMWARE_PROPERTY_DESCRIPTION, &description)) {
+               DBG("description: [%s]", description);
+               if (0 != fmwup_data_set_property(FIRMWARE_PROPERTY_DESCRIPTION, description)) {
+                       ERR("fmwup_data_set_property [%s] failed", FIRMWARE_PROPERTY_DESCRIPTION);
+               }
+       }
+
+       if (req_msg->rep->get_int_value(req_msg->rep, FIRMWARE_PROPERTY_UPDATE, &update)) {
+               DBG("update: [%lld]", update);
+               snprintf(temp, sizeof(temp), "%lld", update);
+               if (0 != fmwup_data_set_property(FIRMWARE_PROPERTY_UPDATE, temp)) {
+                       ERR("fmwup_data_set_property [%s] failed", FIRMWARE_PROPERTY_UPDATE);
+               }
+
+               fmwup_internal_update_command(update);
+       }
+
+       FN_END;
+}
+
+
+int fmwup_handle_get_request(st_things_set_request_message_s *req_msg, st_things_representation_s *resp_rep)
+{
+       FN_CALL;
+       if (!resp_rep) {
+               ERR("Inavlid parameter, response representation is NULL");
+               return FMWUP_ERROR_INVALID_PARAMETER;
+       }
+
+       if (0 == g_strcmp0(req_msg->resource_uri, FIRMWARE_URI)) {
+               _fmwup_get_data(resp_rep);
+       } else {
+               INFO("response [%s] uri not exist", FIRMWARE_URI);
+       }
+
+       FN_END;
+       return FMWUP_ERROR_NONE;
+}
+
+
+
+int fmwup_handle_set_request(st_things_set_request_message_s *req_msg, st_things_representation_s *resp_rep)
+{
+       FN_CALL;
+       if (0 == g_strcmp0(req_msg->resource_uri, FIRMWARE_URI))
+       {
+               _fmwup_set_data(req_msg, resp_rep);
+       } else {
+               INFO("request [%s] uri not exist", FIRMWARE_URI);
+       }
+
+       FN_END;
+       return FMWUP_ERROR_NONE;
+}
+
+
+int fmwup_set_firmware_download_path(const char *download_path)
+{
+       FN_CALL;
+       if (!download_path) {
+               ERR("Inavlid download_path");
+               return FMWUP_ERROR_INVALID_PARAMETER;
+       }
+
+       G_FREE(g_download_path);
+       g_download_path = NULL;
+       g_download_path = g_strdup(download_path);
+       INFO("g_download_path [%s]", g_download_path);
+
+       FN_END;
+       return FMWUP_ERROR_NONE;
+}
+
+
+int fmwup_register_update_changed_cb(fmwup_state_changed_cb state_cb, fmwup_is_new_firmware_cb is_new_firmware_cb )
+{
+       FN_CALL;
+    if (NULL == state_cb) {
+       ERR("State callback is NULL.");
+        return FMWUP_ERROR_INVALID_PARAMETER;
+    }
+
+    if (NULL == is_new_firmware_cb) {
+       ERR("Isnewfirmware callback is NULL.");
+        return FMWUP_ERROR_INVALID_PARAMETER;
+    }
+
+    g_state_changed_cb = state_cb;
+    g_is_new_cb = is_new_firmware_cb;
+
+       FN_END;
+       return FMWUP_ERROR_NONE;
+}
+
+
+int fmwup_get_newest_firmware_from_server(void)
+{
+       FN_CALL;
+       int ret = 0;
+
+       ret = fmwup_data_set_property(FIRMWARE_PROPERTY_ACTIVE_CHECK, "true");
+       if (0 == ret) {
+               ERR("Failed fmwup_set_data [%d]", ret);
+               return FMWUP_ERROR_OPERATION_FAILED;
+       }
+
+       ret = st_things_notify_observers(FIRMWARE_URI);
+       if (0 == ret) {
+               ERR("Failed st_things_notify_observers [%d]", ret);
+               return ret;
+       }
+
+       FN_END;
+       return FMWUP_ERROR_NONE;
+}
+
+
+int fmwup_update(fmwup_update_e command, char *update_time)
+{
+       FN_CALL;
+       int ret = 0;
+
+       if (command == FMWUP_COMMAND_SCHEDULED_UPDATE) {
+               if (!update_time) {
+                       ERR("Invalid parameter when SCHEDULED_UPDATE[%d]", command);
+                       return FMWUP_ERROR_INVALID_PARAMETER;
+               }
+               /* TODO : logic for command */
+       } else if (FMWUP_COMMAND_INIT < command && FMWUP_COMMAND_DOWNLOAD_IMAGE_AND_UPDATE > command) {
+               /* TODO : logic for command */
+               return fmwup_internal_update_command((int64_t)command);
+       } else {
+               ERR("Invalid parameter command[%d]", command);
+               return FMWUP_ERROR_INVALID_PARAMETER;
+       }
+
+       ret = st_things_notify_observers(FIRMWARE_URI);
+       if (0 == ret) {
+               ERR("Failed fmwup_set_data [%d]", ret);
+               return ret;
+       }
+
+       FN_END;
+       return FMWUP_ERROR_NONE;
+}
+
+
+int fmwup_check_firmware_upgraded(void)
+{
+       FN_CALL;
+
+       char *temp_state = fmwup_data_get_property(FIRMWARE_PROPERTY_STATE);
+       int state = FMWUP_STATE_IDLE;
+       if (!state) {
+               ERR("failed to get state property");
+               return FMWUP_ERROR_OPERATION_FAILED;
+       }
+
+       state = atoi(temp_state);
+       G_FREE(temp_state);
+
+       if (state == FMWUP_STATE_UPDATING) {
+               DBG("***Firmware Upgrade Done***");
+
+               // TODO :: It should be checked and set result value according to upgrade result
+               /* Initialize - new platform information - */
+               char *new_version = fmwup_data_get_property(FIRMWARE_PROPERTY_NEW_VERSION);
+               if (new_version) {
+                       fmwup_data_set_property(FIRMWARE_PROPERTY_CURRENT_VERSION, new_version);
+                       G_FREE(new_version);
+               } else {
+                       ERR("failed get new version");
+               }
+
+               /* Initialize - new firmware information - */
+               fmwup_data_set_property(FIRMWARE_PROPERTY_NEW_VERSION, KEY_MANAGER_STR_DEFAULT_DATA);
+               fmwup_data_set_property(FIRMWARE_PROPERTY_PACKAGE_URI, KEY_MANAGER_STR_DEFAULT_DATA);
+               fmwup_data_set_property(FIRMWARE_PROPERTY_PACKAGE_MD5, KEY_MANAGER_STR_DEFAULT_DATA);
+               fmwup_data_set_property(FIRMWARE_PROPERTY_PACKAGE_SIZE, KEY_MANAGER_INT_DEFAULT_DATA);
+
+               fmwup_propagate_firmware_status_resource(FMWUP_STATE_IDLE, FMWUP_RESULT_SUCCESS);
 
-// This is an example of an exported method.
-//bool
-//tizenfmwup_api(void)
-//{
-//     return true;
-//}
+       } else {
+               ERR("is not updating, state[%d]", state);
+               return FMWUP_ERROR_OPERATION_FAILED;
+       }
+       FN_END;
+       return FMWUP_ERROR_NONE;
+}
diff --git a/src/fmwup_util_data.c b/src/fmwup_util_data.c
new file mode 100644 (file)
index 0000000..3897c26
--- /dev/null
@@ -0,0 +1,508 @@
+/*
+ * fmwup_util_data.c
+ *
+ *  Created on: Oct 17, 2017
+ *      Author: hhk86heo
+ */
+
+#include "fmwup_util_data.h"
+
+#include <ckmc/ckmc-manager.h>
+#include <system_info.h>
+#include <stdlib.h>
+
+#include "fmwup_util_log.h"
+
+
+#define KEY_MANAGER_DATA_UNIQUE_NAME           "FMWUP_API_KEY_MANAGER_"
+
+static bool g_active_check = false;
+
+
+int key_manager_set_data(const char *name, char *data)
+{
+       if (!name || !data) {
+               ERR("name or data is NULL");
+               if (name)
+                       ERR("name [%s]", name);
+               if (data)
+                       ERR("data [%s]", data);
+               return -1;
+       }
+
+       DBG("key[%s] data[%s]", name, data);
+
+       int ret = CKMC_ERROR_NONE;
+
+       ckmc_raw_buffer_s ckmc_raw_buffer;
+       ckmc_policy_s ckmc_policy;
+
+       ckmc_raw_buffer.data = (unsigned char *)data;
+       ckmc_raw_buffer.size = strnlen(data, KEY_MANAGER_MAX_DATA_LENGTH);
+
+       if (ckmc_raw_buffer.size == KEY_MANAGER_MAX_DATA_LENGTH) {
+               ERR("ckmc_raw_buffer overflow");
+               return -1;
+       }
+
+       ckmc_policy.password = NULL;
+       ckmc_policy.extractable = true;
+
+       ret = ckmc_remove_alias(name);
+       if (ret != CKMC_ERROR_NONE && ret != CKMC_ERROR_DB_ALIAS_UNKNOWN) {
+               ERR("ckmc_remove_data failed [%x]", ret);
+               return -1;
+       }
+
+       char *key_manager_name = g_strconcat(KEY_MANAGER_DATA_UNIQUE_NAME, name, NULL);
+
+       ret = ckmc_save_data(key_manager_name, ckmc_raw_buffer, ckmc_policy);
+       if (ret != CKMC_ERROR_NONE) {
+               ERR("ckmc_save_data failed [%x]", ret);
+               G_FREE(key_manager_name);
+               return -1;
+       }
+
+       G_FREE(key_manager_name);
+
+       return 0;
+}
+
+
+char *_key_manager_set_default_data(const char *name)
+{
+       if (!name) {
+               ERR("name is NULL");
+               return NULL;
+       }
+       DBG("key [%s]", name);
+
+       char *default_data = NULL;
+
+       if (g_strcmp0(name, FIRMWARE_PROPERTY_UPDATE) == 0) {
+               default_data = g_strdup(KEY_MANAGER_INT_DEFAULT_DATA);
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_UPDATE_TIME) == 0) {
+               default_data = g_strdup(KEY_MANAGER_STR_DEFAULT_DATA);
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_DESCRIPTION) == 0) {
+               default_data = g_strdup(KEY_MANAGER_STR_DEFAULT_DATA);
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_STATE) == 0) {
+               default_data = g_strdup(KEY_MANAGER_STR_DEFAULT_DATA);
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_RESULT) == 0) {
+               default_data = g_strdup(KEY_MANAGER_INT_DEFAULT_DATA);
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_PROGRESS) == 0) {
+               default_data = g_strdup(KEY_MANAGER_INT_DEFAULT_DATA);
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_NEW_VERSION) == 0) {
+               default_data = g_strdup(KEY_MANAGER_STR_DEFAULT_DATA);
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_PACKAGE_URI) == 0) {
+               default_data = g_strdup(KEY_MANAGER_STR_DEFAULT_DATA);
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_PACKAGE_SIZE) == 0) {
+               default_data = g_strdup(KEY_MANAGER_INT_DEFAULT_DATA);
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_PACKAGE_MD5) == 0) {
+               default_data = g_strdup(KEY_MANAGER_STR_DEFAULT_DATA);
+       } else {
+               ERR("Invalid key[%s]", name);
+               return NULL;
+       }
+
+       if (0 != key_manager_set_data(name, default_data))
+               ERR("failed set default data [%s]", name);
+
+       return default_data;
+}
+
+char *key_manager_get_data(const char *name)
+{
+       if (!name) {
+               ERR("name is NULL");
+               return NULL;
+       }
+       DBG("key [%s]", name);
+
+       int ret = CKMC_ERROR_NONE;
+       ckmc_raw_buffer_s *ckmc_raw_buffer = NULL;
+
+       char *key_manager_name = g_strconcat(KEY_MANAGER_DATA_UNIQUE_NAME, name, NULL);
+
+       ret = ckmc_get_data(name, NULL, &ckmc_raw_buffer);
+       if (ret != CKMC_ERROR_NONE) {
+               ERR("ckmc_get_data failed [%x]", ret);
+               G_FREE(key_manager_name);
+
+               if (ret == CKMC_ERROR_DB_ALIAS_UNKNOWN) {
+                       return (_key_manager_set_default_data(name));
+               }
+
+               return NULL;
+       }
+       G_FREE(key_manager_name);
+
+       if (ckmc_raw_buffer == NULL) {
+               ERR("ckmc_raw_buffer is NULL");
+               return NULL;
+       }
+       if (ckmc_raw_buffer->data == NULL || ckmc_raw_buffer->size <= 0) {
+       ckmc_buffer_free(ckmc_raw_buffer);
+               ERR("ckmc_raw_buffer->data is NULL");
+               return NULL;
+       }
+
+       int len = (int)ckmc_raw_buffer->size;
+       char *text_data = g_strndup((char *)ckmc_raw_buffer->data, len);
+       DBG("ckmc_get_data [data: %s][len: %d]", text_data, len);
+
+       ckmc_buffer_free(ckmc_raw_buffer);
+
+       return text_data;
+}
+
+
+int key_manager_remove_data(const char *name)
+{
+       int ret = CKMC_ERROR_NONE;
+       ret = ckmc_remove_alias(name);
+       if (ret != CKMC_ERROR_NONE) {
+               ERR("ckmc_remove_data failed [%x]", ret);
+               return -1;
+       }
+
+       return 0;
+}
+
+
+void key_manager_reset_data()
+{
+       key_manager_remove_data(FIRMWARE_PROPERTY_UPDATE);
+       key_manager_remove_data(FIRMWARE_PROPERTY_UPDATE_TIME);
+       key_manager_remove_data(FIRMWARE_PROPERTY_DESCRIPTION);
+       key_manager_remove_data(FIRMWARE_PROPERTY_STATE);
+       key_manager_remove_data(FIRMWARE_PROPERTY_RESULT);
+       key_manager_remove_data(FIRMWARE_PROPERTY_PROGRESS);
+
+       key_manager_remove_data(FIRMWARE_PROPERTY_NEW_VERSION);
+       key_manager_remove_data(FIRMWARE_PROPERTY_PACKAGE_URI);
+       key_manager_remove_data(FIRMWARE_PROPERTY_PACKAGE_SIZE);
+       key_manager_remove_data(FIRMWARE_PROPERTY_PACKAGE_MD5);
+}
+
+
+int platform_set_data(const char *name, char *data)
+{
+       /* TODO: how to set , platform version  */
+       if (!name || !data) {
+               ERR("name or data is NULL");
+               if (name)
+                       ERR("name [%s]", name);
+               if (data)
+                       ERR("data [%s]", data);
+               return -1;
+       }
+
+       return 0;
+}
+
+
+char *platform_get_data(const char *name)
+{
+       if (!name) {
+               ERR("name is NULL");
+               return NULL;
+       }
+
+       /* TODO: for test - check correct key  */
+       char *temp_char = NULL;
+
+       if (system_info_get_platform_string("http://tizen.org/system/manufacturer", &temp_char)
+               != SYSTEM_INFO_ERROR_NONE) {
+               ERR("system_info_get_platform_string() is failed");
+       } else {
+               INFO("http://tizen.org/system/manufacturer[%s]", temp_char);
+               G_FREE(temp_char);
+       }
+
+       if (system_info_get_platform_string("http://tizen.org/system/model_name", &temp_char)
+               != SYSTEM_INFO_ERROR_NONE) {
+               ERR("system_info_get_platform_string() is failed");
+       } else {
+               INFO("http://tizen.org/system/model_name[%s]", temp_char);
+               G_FREE(temp_char);
+       }
+
+       if (system_info_get_platform_string("http://tizen.org/system/build.version.release", &temp_char)
+               != SYSTEM_INFO_ERROR_NONE) {
+               ERR("system_info_get_platform_string() is failed");
+       } else {
+               INFO("http://tizen.org/system/build.version.release[%s]", temp_char);
+               G_FREE(temp_char);
+       }
+
+       if (system_info_get_platform_string("http://tizen.org/system/platform.name", &temp_char)
+               != SYSTEM_INFO_ERROR_NONE) {
+               ERR("system_info_get_platform_string() is failed");
+       } else {
+               INFO("http://tizen.org/system/platform.name[%s]", temp_char);
+               G_FREE(temp_char);
+       }
+
+       if (system_info_get_platform_string("http://tizen.org/feature/platform.version", &temp_char)
+               != SYSTEM_INFO_ERROR_NONE) {
+               ERR("system_info_get_platform_string() is failed");
+       } else {
+               INFO("http://tizen.org/feature/platform.version[%s]", temp_char);
+               G_FREE(temp_char);
+       }
+
+       if (system_info_get_platform_string("http://tizen.org/feature/platform.version.name", &temp_char)
+               != SYSTEM_INFO_ERROR_NONE) {
+               ERR("system_info_get_platform_string() is failed");
+       } else {
+               INFO("http://tizen.org/feature/platform.version.name[%s]", temp_char);
+               G_FREE(temp_char);
+       }
+
+
+       char *data = NULL;
+       int system_ret = 0;
+
+       if (g_strcmp0(name, FIRMWARE_PROPERTY_CURRENT_VERSION) == 0) {
+               system_ret = system_info_get_platform_string("http://tizen.org/feature/platform.version", &data);
+               if (SYSTEM_INFO_ERROR_NONE != system_ret) {
+                       ERR("system_info_get_platform_string() is failed[%d]", system_ret);
+               }
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_VENDER) == 0) {
+               system_ret = system_info_get_platform_string("http://tizen.org/system/manufacturer", &data);
+               if (SYSTEM_INFO_ERROR_NONE != system_ret) {
+                       ERR("system_info_get_platform_string() is failed[%d]", system_ret);
+               }
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_MODEL) == 0) {
+               system_ret = system_info_get_platform_string("http://tizen.org/system/model_name", &data);
+               if (SYSTEM_INFO_ERROR_NONE != system_ret) {
+                       ERR("system_info_get_platform_string() is failed[%d]", system_ret);
+               }
+       } else {
+               ERR("Invalid parameter[%s]", name);
+       }
+
+       return data;
+}
+
+
+int set_active_check(bool active_check)
+{
+       g_active_check = active_check;
+       return 0;
+}
+
+
+bool get_active_check()
+{
+       return g_active_check;
+}
+
+
+fmwup_data_s *fmwup_data_get_properties()
+{
+       FN_CALL;
+       fmwup_data_s *fmwup_get_data = NULL;
+       fmwup_get_data = (fmwup_data_s *)calloc(1, sizeof(fmwup_data_s));
+
+
+       char *temp = NULL;
+
+       temp = key_manager_get_data(FIRMWARE_PROPERTY_STATE);
+       if (temp) {
+               fmwup_get_data->state = (int64_t)atoi(temp);
+               DBG("%s:%lld", FIRMWARE_PROPERTY_STATE, fmwup_get_data->state);
+               G_FREE(temp);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_STATE);
+       }
+
+       temp = key_manager_get_data(FIRMWARE_PROPERTY_RESULT);
+       if (temp) {
+               fmwup_get_data->result = (int64_t)atoi(temp);
+               DBG("%s:%lld", FIRMWARE_PROPERTY_RESULT, fmwup_get_data->result);
+               G_FREE(temp);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_RESULT);
+       }
+
+       temp = key_manager_get_data(FIRMWARE_PROPERTY_UPDATE);
+       if (temp) {
+               fmwup_get_data->update = (int64_t)atoi(temp);
+               DBG("%s:%lld", FIRMWARE_PROPERTY_UPDATE, fmwup_get_data->update);
+               G_FREE(temp);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_UPDATE);
+       }
+
+       temp = key_manager_get_data(FIRMWARE_PROPERTY_PROGRESS);
+       if (temp) {
+               fmwup_get_data->progress = (int64_t)atoi(temp);
+               DBG("%s:%lld", FIRMWARE_PROPERTY_PROGRESS, fmwup_get_data->progress);
+               G_FREE(temp);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_PROGRESS);
+       }
+
+       fmwup_get_data->update_time = key_manager_get_data(FIRMWARE_PROPERTY_UPDATE_TIME);
+       if (fmwup_get_data->update_time) {
+               DBG("%s:%s", FIRMWARE_PROPERTY_UPDATE_TIME, fmwup_get_data->update_time);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_UPDATE_TIME);
+       }
+
+       fmwup_get_data->description = key_manager_get_data(FIRMWARE_PROPERTY_DESCRIPTION);
+       if (fmwup_get_data->description) {
+               DBG("%s:%s", FIRMWARE_PROPERTY_DESCRIPTION, fmwup_get_data->description);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_DESCRIPTION);
+       }
+
+       fmwup_get_data->new_version = key_manager_get_data(FIRMWARE_PROPERTY_NEW_VERSION);
+       if (fmwup_get_data->new_version) {
+               DBG("%s:%s", FIRMWARE_PROPERTY_NEW_VERSION, fmwup_get_data->new_version);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_NEW_VERSION);
+       }
+
+       fmwup_get_data->package_uri = key_manager_get_data(FIRMWARE_PROPERTY_PACKAGE_URI);
+       if (fmwup_get_data->package_uri) {
+               DBG("%s:%s", FIRMWARE_PROPERTY_PACKAGE_URI, fmwup_get_data->package_uri);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_PACKAGE_URI);
+       }
+
+       fmwup_get_data->package_md5 = key_manager_get_data(FIRMWARE_PROPERTY_PACKAGE_MD5);
+       if (fmwup_get_data->package_md5) {
+               DBG("%s:%s", FIRMWARE_PROPERTY_PACKAGE_MD5, fmwup_get_data->package_md5);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_PACKAGE_MD5);
+       }
+
+       temp = key_manager_get_data(FIRMWARE_PROPERTY_PACKAGE_SIZE);
+       if (temp) {
+               fmwup_get_data->package_size = (int64_t)atoi(temp);
+               DBG("%s:%lld", FIRMWARE_PROPERTY_PACKAGE_SIZE, fmwup_get_data->package_size);
+               G_FREE(temp);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_PACKAGE_SIZE);
+       }
+
+       fmwup_get_data->current_version = platform_get_data(FIRMWARE_PROPERTY_CURRENT_VERSION);
+       if (fmwup_get_data->current_version) {
+               DBG("%s:%s", FIRMWARE_PROPERTY_CURRENT_VERSION, fmwup_get_data->current_version);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_CURRENT_VERSION);
+       }
+
+       fmwup_get_data->manufacturer = platform_get_data(FIRMWARE_PROPERTY_VENDER);
+       if (fmwup_get_data->manufacturer) {
+               DBG("%s:%s", FIRMWARE_PROPERTY_VENDER, fmwup_get_data->manufacturer);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_VENDER);
+       }
+
+       fmwup_get_data->model_name = platform_get_data(FIRMWARE_PROPERTY_MODEL);
+       if (fmwup_get_data->model_name) {
+               DBG("%s:%s", FIRMWARE_PROPERTY_MODEL, fmwup_get_data->model_name);
+       } else {
+               ERR("failed to get data [%s]", FIRMWARE_PROPERTY_MODEL);
+       }
+
+       fmwup_get_data->active_check = get_active_check();
+
+       FN_END;
+       return &fmwup_get_data;
+}
+
+
+int fmwup_data_set_property(const char *name, char *data)
+{
+       if (!name) {
+               ERR("name is NULL");
+               return -1;
+       }
+
+       if (!data) {
+               ERR("data is NULL");
+               return -1;
+       }
+
+       DBG("key [%s]", name, data);
+
+       if (
+                       (g_strcmp0(name, FIRMWARE_PROPERTY_UPDATE) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_UPDATE_TIME) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_DESCRIPTION) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_STATE) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_RESULT) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_PROGRESS) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_NEW_VERSION) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_PACKAGE_URI) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_PACKAGE_SIZE) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_PACKAGE_MD5) == 0)
+                       ) {
+               return key_manager_set_data(name, data);
+       } else if (
+                       (g_strcmp0(name, FIRMWARE_PROPERTY_CURRENT_VERSION) == 0)
+//                     || (g_strcmp0(name, FIRMWARE_PROPERTY_VENDER) == 0) ||
+//                     || (g_strcmp0(name, FIRMWARE_PROPERTY_MODEL) == 0)
+                       ) {
+               //TOOD: how to set current version to platform.
+               return platform_set_data(name, data);
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_ACTIVE_CHECK) == 0) {
+               if (g_strcmp0(name, "true") == 0)
+                       return set_active_check(true);
+               else
+                       return set_active_check(false);
+       } else {
+               ERR("Invalid key[%s]", name);
+               return -1;
+       }
+
+       return 0;
+}
+
+
+char *fmwup_data_get_property(const char *name)
+{
+       if (!name) {
+               ERR("name is NULL");
+               return NULL;
+       }
+
+       DBG("key [%s]", name);
+
+       if (
+                       (g_strcmp0(name, FIRMWARE_PROPERTY_UPDATE) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_UPDATE_TIME) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_DESCRIPTION) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_STATE) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_RESULT) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_PROGRESS) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_NEW_VERSION) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_PACKAGE_URI) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_PACKAGE_SIZE) == 0)
+                       || (g_strcmp0(name, FIRMWARE_PROPERTY_PACKAGE_MD5) == 0)
+                       ) {
+               return key_manager_get_data(name);
+       } else if (
+                       (g_strcmp0(name, FIRMWARE_PROPERTY_CURRENT_VERSION) == 0)
+//                     || (g_strcmp0(name, FIRMWARE_PROPERTY_VENDER) == 0) ||
+//                     || (g_strcmp0(name, FIRMWARE_PROPERTY_MODEL) == 0)
+                       ) {
+               //TOOD: how to set current version to platform.
+               return platform_get_data(name);
+       } else if (g_strcmp0(name, FIRMWARE_PROPERTY_ACTIVE_CHECK) == 0) {
+               if (get_active_check() == true)
+                       return g_strdup("true");
+               else
+                       return g_strdup("false");
+       } else {
+               ERR("Invalid key[%s]", name);
+               return -1;
+       }
+
+       return 0;
+}
+
diff --git a/src/fmwup_util_data.h b/src/fmwup_util_data.h
new file mode 100644 (file)
index 0000000..98157e3
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * fmwup_util_data.h
+ *
+ *  Created on: Oct 17, 2017
+ *      Author: hhk86heo
+ */
+
+#ifndef FMWUP_UTIL_DATA_H_
+#define FMWUP_UTIL_DATA_H_
+
+#include <stdbool.h>
+#include <glib.h>
+
+#define FIRMWARE_URI                                           "/firmware"
+
+/* save to key manager(ckmc) with update */
+#define FIRMWARE_PROPERTY_UPDATE                       "update"
+#define FIRMWARE_PROPERTY_UPDATE_TIME          "updatetime"
+#define FIRMWARE_PROPERTY_DESCRIPTION          "description"
+#define FIRMWARE_PROPERTY_STATE                                "state"
+#define FIRMWARE_PROPERTY_RESULT                       "result"
+#define FIRMWARE_PROPERTY_PROGRESS                     "progress"
+
+/* save to key manager(ckmc) with pacakage */
+#define FIRMWARE_PROPERTY_NEW_VERSION          "newversion"
+#define FIRMWARE_PROPERTY_PACKAGE_URI          "packageuri"
+#define FIRMWARE_PROPERTY_PACKAGE_SIZE         "packagesize"
+#define FIRMWARE_PROPERTY_PACKAGE_MD5          "packagemd5"
+
+/* platform information */
+#define FIRMWARE_PROPERTY_CURRENT_VERSION      "version"
+#define FIRMWARE_PROPERTY_VENDER                       "vender"
+#define FIRMWARE_PROPERTY_MODEL                                "model"
+
+/* temporary value */
+#define FIRMWARE_PROPERTY_ACTIVE_CHECK         "x.com.samsung.update.activecheck"
+
+#define KEY_MANAGER_MAX_DATA_LENGTH                    200
+#define KEY_MANAGER_INT_DEFAULT_DATA           "0"
+#define KEY_MANAGER_STR_DEFAULT_DATA           ""
+#define KEY_MANAGER_BOL_DEFAULT_DATA           "0"
+
+typedef struct {
+       /* Update Property */
+       int64_t state;                                  //[R][M] fmwup_state_e - 0: Idle, 1: Downloading, 2: Downloaded, 3: Updating
+       int64_t result;                                 //[R][M] 0: Initial, 1: Success, 2: Not enough space, 3: Out of ram, 4: Connection lost, 5: Invalid binary, 6: Invalid uri, 7: Update failed, 8: Unsupported protocol
+       int64_t update;                                 //[RW][M] 0: Initial, 1: Download Image, 2: Upgrade Image, 3:Dwonload and Upgrade, 4 Scheduled Upgrade
+       int64_t progress;                                       //[R][O] 0-100 range based progress include downloading state.
+    char *update_time;                 //[RW][O] case of (4 â€“ update) (scheduled)  TODO: ISO 8601
+    char *description;                 //[RW][O] Description
+
+    /* Package Information */
+    char *new_version;                 //[RW][M] New Version of the firmware package
+    char *package_uri;                 //[RW][M] Firmware package URI where the package located
+    int64_t package_size;              //[RW][O] Package Size
+    char *package_md5;                 //[RW][O] base64-encoded 128-bit MD5 digest of the object
+
+    /* Device Information*/
+    char *manufacturer;                        //[R][O] Device vendor identifier
+    char *model_name;                  //[R][O] Device model identifier
+    char *current_version;             //[R][M] Current firmware version
+
+    /* Vender specific - for polling */
+    bool active_check;                 //[R][O] x.com.samsung.update.activecheck
+} fmwup_data_s;
+
+//int key_manager_set_data(const char *name, char *data);
+//char *key_manager_get_data(const char *name);
+//void key_manager_reset_data();
+
+//int platform_set_data(const char *name, char *data); /* for version information */
+//char *platform_get_data(const char *name);                           /* vendor, model */
+
+//int set_active_check(bool active_check);                             /* active check */
+//bool get_active_check();
+
+fmwup_data_s *fmwup_data_get_properties();
+int fmwup_data_set_property(const char *name, char *data);
+char *fmwup_data_get_property(const char *name);
+
+#endif /* FMWUP_UTIL_DATA_H_ */
diff --git a/src/fmwup_util_http.c b/src/fmwup_util_http.c
new file mode 100644 (file)
index 0000000..39a3425
--- /dev/null
@@ -0,0 +1,220 @@
+#include <curl/curl.h>
+#include <glib.h>
+
+#include "fmwup_util_log.h"
+#include "fmwup_util_http.h"
+
+static size_t _gather_data(void *downloaded_data,
+               size_t size,
+               size_t nmemb,
+               void *user_data)
+{
+       size_t total_size = size * nmemb;
+       g_byte_array_append((GByteArray *)user_data, (const unsigned char *) downloaded_data, total_size);
+       return total_size;
+}
+
+
+void _curl_set_response(CURL *curl,
+               GByteArray *response_header,
+               GByteArray *response_body,
+               char **res_header,
+               char **res_body,
+               void *user_data)
+{
+       FN_CALL;
+       CURLcode curl_ret_code = CURLE_OK;
+
+       long response = 0;
+       curl_ret_code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
+       if (CURLE_OK != curl_ret_code) {
+               ERR("curl_easy_perform(): [%s][%d]", curl_easy_strerror(curl_ret_code), curl_ret_code);
+               return;
+       }
+
+       char *tmp_header = g_strndup((const gchar *)response_header->data, response_header->len);
+       char *tmp_body = g_strndup((const gchar *)response_body->data, response_body->len);
+
+       *res_header = tmp_header;
+       *res_body = tmp_body;
+       FN_END;
+}
+
+
+void _curl_set_common_option(CURL *curl,
+               const char *url,
+               GByteArray **response_header_ptr,
+               GByteArray **response_body_ptr)
+{
+       //LOG("_curl_set_common_option()");
+       CURLcode curl_ret_code;
+
+       //LOG("set URL = [%s]", url);
+       curl_ret_code = curl_easy_setopt(curl, CURLOPT_URL, url);
+       if (CURLE_OK != curl_ret_code) {
+               //LOG("curl_easy_setopt: CURLOPT_URL failed!! curl_ret_code[%d]", curl_ret_code);
+       }
+
+       GByteArray *response_header_data = g_byte_array_new();
+       curl_ret_code = curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, _gather_data);
+       if (CURLE_OK != curl_ret_code) {
+               //LOG("curl_easy_setopt: CURLOPT_HEADERFUNCTION failed!! curl_ret_code[%d]", curl_ret_code);
+       }
+
+       curl_ret_code = curl_easy_setopt(curl, CURLOPT_HEADERDATA, response_header_data);
+       if (CURLE_OK != curl_ret_code) {
+               //LOG("curl_easy_setopt: CURLOPT_HEADERDATA failed!! curl_ret_code[%d]", curl_ret_code);
+       }
+
+       GByteArray *response_body_data = g_byte_array_new();
+
+       curl_ret_code = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _gather_data);
+       if (CURLE_OK != curl_ret_code) {
+               //LOG("curl_easy_setopt: CURLOPT_WRITEFUNCTION failed!! curl_ret_code[%d]", curl_ret_code);
+       }
+
+       curl_ret_code = curl_easy_setopt(curl, CURLOPT_WRITEDATA, response_body_data);
+       if (CURLE_OK != curl_ret_code) {
+               //LOG("curl_easy_setopt: CURLOPT_WRITEDATA failed!! curl_ret_code[%d]", curl_ret_code);
+       }
+
+       curl_ret_code = curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
+       if (CURLE_OK != curl_ret_code) {
+               //LOG("curl_easy_setopt: CURLOPT_NOPROGRESS failed!! curl_ret_code[%d]", curl_ret_code);
+       }
+
+       *response_header_ptr = response_header_data;
+       *response_body_ptr = response_body_data;
+
+#if 0
+       curl_ret_code = curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
+       if (CURLE_OK != curl_ret_code) {
+               //LOG("curl_easy_setopt: CURLOPT_VERBOSE failed!! curl_ret_code[%d]", curl_ret_code);
+       }
+
+       curl_ret_code = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
+       if (CURLE_OK != curl_ret_code) {
+               //LOG("curl_easy_setopt: CURLOPT_SSL_VERIFYPEER failed!! curl_ret_code[%d]", curl_ret_code);
+       }
+
+       curl_ret_code = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);
+       if (CURLE_OK != curl_ret_code) {
+               //LOG("curl_easy_setopt: CURLOPT_SSL_VERIFYHOST failed!! curl_ret_code[%d]", curl_ret_code);
+       }
+
+       curl_ret_code = curl_easy_setopt(curl, CURLOPT_CERTINFO, 0L);
+       if (CURLE_OK != curl_ret_code) {
+               //LOG("curl_easy_setopt: CURLOPT_CERTINFO failed!! curl_ret_code[%d]", curl_ret_code);
+       }
+#endif
+}
+
+
+static void _curl_set_request_headers(CURL *curl)
+{
+       struct curl_slist *header = NULL;
+
+       char *tmp_header = NULL;
+
+       tmp_header = g_strconcat("Content-Type: ", "application/json", NULL);
+       //LOG("header=[%s]", tmp_header);
+       header = curl_slist_append(header, tmp_header);
+       g_free(tmp_header);
+
+       curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);
+}
+
+
+int fmwup_http_send_request(fmwup_http_req_e type, char *req_url, char **res_header, char **res_body)
+{
+       FN_CALL;
+
+       CURL *curl;
+       GByteArray *response_header = NULL;
+       GByteArray *response_body= NULL;
+       CURLcode error_code;
+       int ret = 0;
+
+       // Start a libcurl easy session
+       curl = curl_easy_init();
+
+       //LOG("curl_easy_init()");
+
+       _curl_set_request_headers(curl);
+
+       if (type == FMWUP_HTTP_GET) {
+               curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
+       } else if (type == FMWUP_HTTP_POST) {
+               curl_easy_setopt(curl, CURLOPT_HTTPPOST, 1);
+       } else {
+               return -1;
+       }
+
+       _curl_set_common_option(curl, (const char *)req_url, &response_header, &response_body);
+
+       //LOG("Start curl_easy_perform......");
+       error_code = curl_easy_perform(curl);
+       INFO("curl_easy_perform(): [%s][%d]", curl_easy_strerror(error_code), error_code);
+
+       if (error_code == CURLE_ABORTED_BY_CALLBACK) {
+               ret = -1;
+               goto _END_OF_FUNC_;
+       } else if (error_code != CURLE_OK) {
+               ret = -1;
+               goto _END_OF_FUNC_;
+       }
+
+       _curl_set_response(curl, response_header, response_body, res_header, res_body, NULL);
+
+_END_OF_FUNC_:
+
+       if (response_header) {
+               g_byte_array_free(response_header, TRUE);
+       }
+       if (response_body) {
+               g_byte_array_free(response_body, TRUE);
+       }
+
+       curl_easy_cleanup(curl);
+       FN_END;
+       return ret;
+}
+
+
+int fmwup_http_download_file(const char *download_url, const char *download_path)
+{
+       FN_CALL;
+
+       if (!download_url || !download_path) {
+               ERR("Invalid parameter");
+               return -1;
+       }
+
+       int ret = 0;
+       CURL *curl;
+       FILE *fp;
+       CURLcode error_code;
+
+       curl = curl_easy_init();
+       if (curl)
+       {
+               fp = fopen(download_path, "wb");
+               curl_easy_setopt(curl, CURLOPT_URL, download_url);
+               curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
+               curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
+               error_code = curl_easy_perform(curl);
+               INFO("curl_easy_perform() [%s][%d]", curl_easy_strerror(error_code), error_code);
+               curl_easy_cleanup(curl);
+               fclose(fp);
+
+               if (error_code != CURLE_OK) {
+                       remove(download_path);
+                       ret = -1;
+               }
+       } else {
+               ret = -1;
+       }
+
+       FN_END;
+       return ret;
+}
diff --git a/src/fmwup_util_http.h b/src/fmwup_util_http.h
new file mode 100644 (file)
index 0000000..f5e2446
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * fmwup_util_http.h
+ *
+ *  Created on: Oct 13, 2017
+ *      Author: hhk86heo
+ */
+
+#ifndef FMWUP_UTIL_HTTP_H_
+#define FMWUP_UTIL_HTTP_H_
+
+
+typedef enum {
+       FMWUP_HTTP_GET = 0,
+       FMWUP_HTTP_POST,
+       FMWUP_HTTP_PUT,
+       FMWUP_HTTP_DELETE
+}fmwup_http_req_e;
+
+int fmwup_http_send_request(fmwup_http_req_e type, char *req_url, char **res_header, char **res_body);
+
+int fmwup_http_download_file(const char *download_url, const char *download_path);
+
+#endif /* FMWUP_UTIL_HTTP_H_ */
diff --git a/src/fmwup_util_internal.c b/src/fmwup_util_internal.c
new file mode 100644 (file)
index 0000000..92f443b
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * fmwup_util_data.c
+ *
+ *  Created on: Oct 13, 2017
+ *      Author: hhk86heo
+ */
+
+#include "fmwup_util_internal.h"
+
+#include <glib.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "fmwup_util_log.h"
+#include "fmwup_util_http.h"
+#include "fmwup_util_data.h"
+
+#define UPDATE_FILE "/opt/usr/data/fota/tota_init"
+#define FIRMWARE_FILE_NAME "fmwup.zip"
+
+extern char *g_download_path;
+extern fmwup_state_changed_cb g_state_changed_cb;
+
+int _fmwup_propagate_firmware_resource(void)
+{
+       int ret = 0;
+       ret = st_things_notify_observers(FIRMWARE_URI);
+       if (0 == ret) {
+               ERR("Failed st_things_notify_observers [%d]", ret);
+       }
+       return ret;
+}
+
+void fmwup_propagate_firmware_status_resource(fmwup_state_e state, fmwup_result_e result)
+{
+       DBG("Propagate state[%d], result[%d]", state, result);
+
+       int ret = 0;
+
+       char temp_data[KEY_MANAGER_MAX_DATA_LENGTH] = {0,};
+
+       snprintf(temp_data, KEY_MANAGER_MAX_DATA_LENGTH, "%d", state);
+       fmwup_data_set_property(FIRMWARE_PROPERTY_STATE, temp_data);
+
+       snprintf(temp_data, KEY_MANAGER_MAX_DATA_LENGTH, "%d", result);
+       fmwup_data_set_property(FIRMWARE_PROPERTY_RESULT, temp_data);
+
+       ret = _fmwup_propagate_firmware_resource();
+       if (0 == ret) {
+               ERR("Failed propagate [%d]", ret);
+       }
+
+       if (g_state_changed_cb) {
+               g_state_changed_cb(state, result);
+       }
+
+       if (result != FMWUP_RESULT_INIT) {
+               //init state, result in failed case
+               snprintf(temp_data, KEY_MANAGER_MAX_DATA_LENGTH, "%d", FMWUP_STATE_IDLE);
+               fmwup_data_set_property(FIRMWARE_PROPERTY_STATE, temp_data);
+
+               snprintf(temp_data, KEY_MANAGER_MAX_DATA_LENGTH, "%d", FMWUP_RESULT_INIT);
+               fmwup_data_set_property(FIRMWARE_PROPERTY_RESULT, temp_data);
+
+//             ret = _fmwup_propagate_firmware_resource();
+//             if (0 == ret) {
+//                     ERR("Failed propagate [%d]", ret);
+//             }
+       }
+}
+
+static void _exec_update()
+{
+       FILE* fp = fopen(UPDATE_FILE, "w");
+       if(!fp) {
+               ERR("fopen error: %d", errno);
+               return;
+       }
+       fclose(fp);
+}
+
+
+bool _parse_secure_url(char *json, char **url_value)
+{
+       if (!json && *json != '{' && *(json+1) != '\"') {
+
+               return false;
+       }
+
+       char *ret_str;
+       ret_str = strtok(json,"{\"");
+
+       if (ret_str == NULL && g_strcmp0(ret_str, "url") != 0) {
+               ERR("Invalid json [url]");
+               return false;
+       }
+
+       ret_str = strtok(NULL,"\"");
+       if (ret_str == NULL && g_strcmp0(ret_str, ":") != 0) {
+               ERR("Invalid delimeter [:]");
+               return false;
+       }
+
+       ret_str = strtok(NULL,"\"");
+       if (ret_str == NULL)
+               return false;
+
+       *url_value = g_strdup(ret_str);
+
+       return true;
+}
+
+void _fmwup_handle_update_command(int64_t update_type)
+{
+       int result = FMWUP_RESULT_INIT;
+#ifdef _USE_WWST_
+       char *res_header = NULL;
+       char *res_body = NULL;
+       char *request_uri = NULL;
+       char *sec_download_url = NULL;
+       char *download_path = NULL;
+#endif
+
+       char *package_uri = fmwup_data_get_property(FIRMWARE_PROPERTY_PACKAGE_URI);
+       char *new_version = fmwup_data_get_property(FIRMWARE_PROPERTY_NEW_VERSION);
+       char *current_version = fmwup_data_get_property(FIRMWARE_PROPERTY_CURRENT_VERSION);
+       char *temp_state = fmwup_data_get_property(FIRMWARE_PROPERTY_STATE);
+       int state = 0;
+
+       if (!package_uri || !new_version || !current_version || !temp_state) {
+               ERR("failed get property");
+               result = FMWUP_RESULT_UPDATE_FAILED;
+               goto _END_OF_FUNC_;
+       }
+
+       state = atoi(temp_state);
+       if (g_strcmp0(package_uri, "") == 0 ||
+                       g_strcmp0(new_version, "") == 0 ||
+                       g_strcmp0(current_version, new_version) == 0)
+       {
+               ERR("Invalid value, package_uri[%s], new_version[%s], current_version[%s]",
+                               package_uri, new_version, current_version);
+               result = FMWUP_RESULT_UPDATE_FAILED;
+               goto _END_OF_FUNC_;
+       }
+
+       if ((state == FMWUP_STATE_IDLE) &&      (update_type == FMWUP_COMMAND_DOWNLOAD_IMAGE || update_type == FMWUP_COMMAND_DOWNLOAD_IMAGE_AND_UPDATE)) {
+               DBG("***Downloading image from [%s] ***", package_uri);
+               fmwup_propagate_firmware_status_resource(FMWUP_STATE_DOWNLOADING, FMWUP_RESULT_INIT);
+
+#ifdef _USE_WWST_
+
+               request_uri = g_strconcat(package_uri, NULL);
+               download_path = g_strconcat(g_download_path, FIRMWARE_FILE_NAME, NULL);
+
+               INFO("request_uri[%s]", request_uri);
+
+               if (fmwup_http_send_request(FMWUP_HTTP_GET, request_uri, &res_header, &res_body) != 0) {
+                       ERR("cannot get Secure URL");
+                       result = FMWUP_RESULT_INVALID_URI;
+                       goto _END_OF_FUNC_;
+               } else {
+                       //parsing
+                       INFO("res_header[%s]   res_body[%s]",res_header, res_body);
+
+                       if (_parse_secure_url(res_body, &sec_download_url)) {
+                               INFO("download url[%s]  download path[%s]",sec_download_url, download_path);
+
+                               if (fmwup_http_download_file(sec_download_url, (const char *)download_path) != 0) {
+                                       ERR("fmwup_http_download_file failed");
+                                       result = FMWUP_RESULT_INVALID_URI;
+                                       goto _END_OF_FUNC_;
+                               }
+
+                       } else {
+                               ERR("_parse_secure_url failed");
+                               result = FMWUP_RESULT_INVALID_URI;
+                               goto _END_OF_FUNC_;
+                       }
+               }
+
+#else
+               if (fmwup_http_download_file(package_uri, (const char *)g_download_path) != 0) {
+                       ERR("fmwup_http_download_file failed");
+                       result = FMWUP_RESULT_INVALID_URI;
+                       goto _END_OF_FUNC_;
+               }
+#endif
+
+               DBG("*** Firmware image downloaded ***");
+               fmwup_propagate_firmware_status_resource(FMWUP_STATE_DOWNLOADED, FMWUP_RESULT_INIT);
+       }
+
+       if ((state == FMWUP_STATE_DOWNLOADED) &&
+                       (update_type == FMWUP_COMMAND_UPDATE_BY_DOWNLOADED_IMAGE || update_type == FMWUP_COMMAND_DOWNLOAD_IMAGE_AND_UPDATE)) {
+               fmwup_propagate_firmware_status_resource(FMWUP_STATE_UPDATING, FMWUP_RESULT_INIT);
+
+               //TODO: To upgrade using interface of fota-client
+               _exec_update();
+       }
+
+_END_OF_FUNC_:
+       if (result != FMWUP_RESULT_INIT) {
+               INFO("propagate err[%d]", result);
+               fmwup_propagate_firmware_status_resource(FMWUP_STATE_IDLE, result);
+       }
+
+#ifdef _USE_WWST_
+       G_FREE(res_header);
+       G_FREE(res_body);
+       G_FREE(download_path);
+       G_FREE(sec_download_url);
+       G_FREE(request_uri);
+#endif
+
+       return;
+}
+
+void *_fmwup_worker(void *data)
+{
+       int64_t exec_type = *(int64_t *)data;
+       _fmwup_handle_update_command(exec_type);
+       G_FREE(data);
+
+       return NULL;
+}
+
+
+int fmwup_internal_update_command(int64_t update_type)
+{
+       int64_t *update = (int64_t *)calloc(1, sizeof(int64_t));
+       if (!update) {
+               ERR("Memory allocation error!");
+               return FMWUP_ERROR_MEMORY_ERR;
+       }
+
+       *update = update_type;
+
+       pthread_t pThread;
+       pthread_create(&pThread, NULL, _fmwup_worker, update);
+
+       return FMWUP_ERROR_NONE;
+}
+
diff --git a/src/fmwup_util_internal.h b/src/fmwup_util_internal.h
new file mode 100644 (file)
index 0000000..e11d4bb
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * fmwup_util_data.h
+ *
+ *  Created on: Oct 13, 2017
+ *      Author: hhk86heo
+ */
+
+#ifndef FMWUP_UTIL_INTERNAL_H_
+#define FMWUP_UTIL_INTERNAL_H_
+
+#include <glib.h>
+
+#include "fmwup_api.h"
+
+void fmwup_propagate_firmware_status_resource(fmwup_state_e state, fmwup_result_e result);
+int fmwup_internal_update_command(int64_t update_type);
+
+#endif /* FMWUP_UTIL_INTERNAL_H_ */
diff --git a/src/fmwup_util_log.h b/src/fmwup_util_log.h
new file mode 100644 (file)
index 0000000..96fa243
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * fmwup_log.h
+ *
+ *  Created on: Oct 11, 2017
+ *      Author: hhk86heo
+ */
+
+#ifndef FMWUP_UTIL_LOG_H_
+#define FMWUP_UTIL_LOG_H_
+
+#include <dlog.h>
+#include <glib.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "FMWUP-THINGS-SDK-API"
+
+#ifndef __MODULE__
+#define __MODULE__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
+#endif
+
+#define ERR(fmt, args...) dlog_print(DLOG_ERROR, LOG_TAG, "%s: %s(%d): "fmt"\n", __MODULE__, __func__, __LINE__, ##args)
+#define WARN(fmt, args...) dlog_print(DLOG_WARN, LOG_TAG, "%s: %s(%d): "fmt"\n", __MODULE__, __func__, __LINE__,##args)
+#define INFO(fmt, args...)  dlog_print(DLOG_INFO, LOG_TAG, "%s: %s(%d): "fmt"\n", __MODULE__, __func__, __LINE__,##args)
+#define DBG(fmt, args...) dlog_print(DLOG_DEBUG, LOG_TAG, "%s: %s(%d): "fmt"\n", __MODULE__, __func__, __LINE__,##args)
+
+#define FN_CALL DBG("BEGIN")
+#define FN_END DBG("END")
+
+#define G_FREE(p) do { if (p) { g_free(p); p = NULL; } } while (0);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
+#endif /* FMWUP_UTIL_LOG_H_ */