change naming to fmwup (API, enum, file name) 33/145833/3
authorhhk86.heo <hhk86.heo@samsung.com>
Thu, 24 Aug 2017 05:06:03 +0000 (14:06 +0900)
committerhhk86.heo <hhk86.heo@samsung.com>
Thu, 24 Aug 2017 05:13:48 +0000 (14:13 +0900)
Change-Id: I59a26ef97bf23109546a7da4e20915c239a29922

19 files changed:
CMakeLists.txt
README.md
controlee-firmware-resource.pc.in [deleted file]
fmwup-resource.pc.in [new file with mode: 0644]
inc/controlee_firmware_resource.h [deleted file]
inc/controlee_firmware_resource_internal.h [deleted file]
inc/fmwup_resource.h [new file with mode: 0644]
inc/fmwup_resource_internal.h [new file with mode: 0644]
packaging/controlee-firmware-resource.spec [deleted file]
packaging/fmwup-resource.spec [new file with mode: 0644]
src/controlee_firmware_resource.c [deleted file]
src/controlee_firmware_resource_http.c [deleted file]
src/controlee_firmware_resource_internal.c [deleted file]
src/fmwup_resource.c [new file with mode: 0644]
src/fmwup_resource_http.c [new file with mode: 0644]
src/fmwup_resource_internal.c [new file with mode: 0644]
test/CMakeLists.txt
test/controlee_firmware_test.c [deleted file]
test/fmwup_test.c [new file with mode: 0644]

index c894d2ab970e3d1ed91c7a47dbbf70d7b7e40c8b..3f160f2cd5d1d2a0e6bc444b4960f08ee55b2b87 100644 (file)
@@ -1,13 +1,13 @@
 CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
-PROJECT(controlee_firmware_resource)
+PROJECT(fmwup_resource)
 SET(VERSION_MAJOR 0)
 SET(VERSION "${VERSION_MAJOR}.1.0")
 SET(LIBDIR ${LIB_INSTALL_DIR})
 
-SET(CONTROLEE_FIRMWARE_SRCS
-    ${CMAKE_CURRENT_SOURCE_DIR}/src/controlee_firmware_resource.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/src/controlee_firmware_resource_internal.c
-    ${CMAKE_CURRENT_SOURCE_DIR}/src/controlee_firmware_resource_http.c
+SET(FMWUP_SRCS
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/fmwup_resource.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/fmwup_resource_internal.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/src/fmwup_resource_http.c
 )
 
 INCLUDE_DIRECTORIES(
@@ -15,15 +15,15 @@ INCLUDE_DIRECTORIES(
 )
 
 SET(API-HEADERS
-    ${CMAKE_CURRENT_LIST_DIR}/inc/controlee_firmware_resource.h
+    ${CMAKE_CURRENT_LIST_DIR}/inc/fmwup_resource.h
     )
-INSTALL(FILES ${API-HEADERS} DESTINATION include/controlee-firmware-resource)
+INSTALL(FILES ${API-HEADERS} DESTINATION include/fmwup-resource)
 
-CONFIGURE_FILE(controlee-firmware-resource.pc.in controlee-firmware-resource.pc @ONLY)
-INSTALL(FILES ${CMAKE_BINARY_DIR}/controlee-firmware-resource.pc DESTINATION ${LIBDIR}/pkgconfig)
+CONFIGURE_FILE(fmwup-resource.pc.in fmwup-resource.pc @ONLY)
+INSTALL(FILES ${CMAKE_BINARY_DIR}/fmwup-resource.pc DESTINATION ${LIBDIR}/pkgconfig)
 
 INCLUDE(FindPkgConfig)
-PKG_CHECK_MODULES(controlee_fw_pkgs REQUIRED
+PKG_CHECK_MODULES(fmwup_pkgs REQUIRED
        capi-appfw-application
        capi-system-info
        dlog
@@ -33,7 +33,7 @@ PKG_CHECK_MODULES(controlee_fw_pkgs REQUIRED
        vconf
        )
 
-FOREACH(flag ${controlee_fw_pkgs_CFLAGS})
+FOREACH(flag ${fmwup_pkgs_CFLAGS})
     SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
 ENDFOREACH(flag)
 
@@ -41,8 +41,8 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
 SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
 
 FIND_LIBRARY(RD_LIB NAMES resource_directory PATHS /usr/lib)
-ADD_LIBRARY(${PROJECT_NAME} SHARED ${CONTROLEE_FIRMWARE_SRCS})
-TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${controlee_fw_pkgs_LDFLAGS} ${RD_LIB})
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${FMWUP_SRCS})
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${fmwup_pkgs_LDFLAGS} ${RD_LIB})
 SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES VERSION ${VERSION} SOVERSION ${VERSION_MAJOR})
 
 INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${LIBDIR} COMPONENT RuntimeLibraries)
index 094b57681232b8f1c95915f7d5063c601c17ec50..f417d8f18a7478128ff71e6416bc27b660d6c7de 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# controlee-firmware
+# fmwup library
diff --git a/controlee-firmware-resource.pc.in b/controlee-firmware-resource.pc.in
deleted file mode 100644 (file)
index 46512fa..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-prefix=/usr
-libdir=${prefix}/lib
-includedir=${prefix}/include
-
-Name: CONTROLEE-FIRMWARE-RESOURCE
-Version: @VERSION@
-Description: OCF-based firmware resource API for controlee
-Requires: glib-2.0
-Libs: -L${libdir} -lcontrolee_firmware-resource
-Cflags: -I${includedir} -I${includedir}/controlee-firmware-resource
\ No newline at end of file
diff --git a/fmwup-resource.pc.in b/fmwup-resource.pc.in
new file mode 100644 (file)
index 0000000..3b02280
--- /dev/null
@@ -0,0 +1,10 @@
+prefix=/usr
+libdir=${prefix}/lib
+includedir=${prefix}/include
+
+Name: FMWUP-RESOURCE
+Version: @VERSION@
+Description: OCF-based firmware resource API for OCF SERVER
+Requires: glib-2.0
+Libs: -L${libdir} -lfmwup-resource
+Cflags: -I${includedir} -I${includedir}/fmwup-resource
\ No newline at end of file
diff --git a/inc/controlee_firmware_resource.h b/inc/controlee_firmware_resource.h
deleted file mode 100644 (file)
index 218353a..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-#ifndef _CONTROLEE_FIRMWARE_H_
-#define _CONTROLEE_FIRMWARE_H_
-
-/**
- * This header file is included to define _EXPORT_.
- */
-#include <stdbool.h>
-#include <tizen.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <glib.h>
-#include <octypes.h>
-#if 0
-#include <rd_client.h>
-#endif
-
-#ifndef EXPORT_API
-#define EXPORT_API     __attribute__((visibility("default")))
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct opq_controlee_firmware_s *controlee_firmware_h;
-
-typedef enum {
-       CONTROLEE_FIRMWARE_SUCCESS = 0,
-       CONTROLEE_FIRMWARE_INVALID_VALUE,
-       CONTROLEE_FIRMWARE_NULL_PTR,
-       CONTROLEE_FIRMWARE_MEMORY_ERR,
-       CONTROLEE_FIRMWARE_OPERATION_FAILED,
-       CONTROLEE_FIRMWARE_ALREADY_EXIST
-}controlee_firmware_result_e;
-
-
-typedef enum {
-       CONTROLEE_FIRMWARE_RES_UPDATE_STATE = 0,
-       CONTROLEE_FIRMWARE_RES_UPDATE_RESULT,
-       CONTROLEE_FIRMWARE_RES_CURRENT_VERSION,
-       CONTROLEE_FIRMWARE_RES_NEW_VERSION
-}controlee_firmware_res_type_e;
-
-typedef enum {
-       CONTROLEE_FIRMWARE_STATE_IDLE = 0,
-       CONTROLEE_FIRMWARE_STATE_DOWNLOADING,
-       CONTROLEE_FIRMWARE_STATE_DOWNLOADED,
-       CONTROLEE_FIRMWARE_STATE_UPDATING
-}controlee_firmware_state_e;
-
-
-#if 0
-typedef enum {
-    CONTROLEE_FIRMWARE_RES_PROP_NONE = 0,
-    CONTROLEE_FIRMWARE_RES_PROP_DISCOVERABLE = (1<<0),
-    CONTROLEE_FIRMWARE_RES_PROP_OBSERVABLE = (1<<1),
-    CONTROLEE_FIRMWARE_RES_PROP_ACTIVE = (1<<2),
-    CONTROLEE_FIRMWARE_RES_PROP_SLOW = (1<<3),
-#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
-    CONTROLEE_FIRMWARE_RES_PROP_SECURE        = (1 << 4),
-#else
-    CONTROLEE_FIRMWARE_RES_PROP_SECURE        = (0),
-#endif
-    CONTROLEE_FIRMWARE_RES_PROP_EXPLICIT_DISCOVERABLE   = (1 << 5)
-
-#ifdef WITH_MQ
-    /** When this bit is set, the resource is allowed to be published */
-    ,CONTROLEE_FIRMWARE_RES_PROP_MQ_PUBLISHER     = (1 << 6)
-#endif
-
-#ifdef MQ_BROKER
-    /** When this bit is set, the resource is allowed to be notified as MQ broker.*/
-    ,CONTROLEE_FIRMWARE_RES_PROP_MQ_BROKER        = (1 << 7)
-#endif
-} firmware_res_prop_e;
-#endif
-
-typedef void (*state_changed_cb)(controlee_firmware_state_e value);
-
-
-EXPORT_API int controlee_create_firmware_resource(OCResourceHandle *firmware_res_h);
-
-EXPORT_API int controlee_destory_firmware_resource(OCResourceHandle firmware_res_h);
-
-EXPORT_API int controlee_set_firmware_download_path(const char *download_path);
-
-EXPORT_API int controlee_set_state_changed_cb(state_changed_cb callback);
-
-EXPORT_API void controlee_unset_resource_changed_cb(void);
-
-EXPORT_API int controlee_get_newest_firmware_from_server();
-
-EXPORT_API int controlee_get_firmware_resource_value(controlee_firmware_res_type_e res_type, char **value);
-
-EXPORT_API int controlee_check_firmware_upgraded(void);
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif // _CONTROLEE_FIRMWARE_H_
-
diff --git a/inc/controlee_firmware_resource_internal.h b/inc/controlee_firmware_resource_internal.h
deleted file mode 100644 (file)
index fb05011..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * controlee_firmware_internal.h
- *
- *  Created on: Jun 29, 2017
- *      Author: sangkoo
- */
-
-#ifndef CONTROLEE_FIRMWARE_INTERNAL_H_
-#define CONTROLEE_FIRMWARE_INTERNAL_H_
-
-
-#include <ocstack.h>
-#include <octypes.h>
-#include <ocpayload.h>
-#include <system_info.h>
-#include <dlog.h>
-#include <vconf.h>
-
-#include "controlee_firmware_resource.h"
-
-#define OC_RSRVD_CONTROLEE_FIRMWARE_URI                "/firmware"
-#define OC_RSRVD_FIRMWARE_RES_TYPE                     "x.samsung.firmware"
-
-#define OC_RSRVD_FIRMWARE_STATE                                "state"
-#define OC_RSRVD_FIRMWARE_RESULT                       "result"
-#define OC_RSRVD_FIRMWARE_UPDATE                       "update"
-#define OC_RSRVD_FIRMWARE_PROGRESS                     "progress"
-#define OC_RSRVD_FIRMWARE_UPDATE_TIME          "updatetime"
-
-#define OC_RSRVD_FIRMWARE_CURRENT_VERSION      "version"
-#define OC_RSRVD_FIRMWARE_NEW_VERSION          "newversion"
-#define OC_RSRVD_FIRMWARE_PACKAGE_URI          "packageuri"
-#define OC_RSRVD_FIRMWARE_PACKAGE_SIZE         "packagesize"
-#define OC_RSRVD_FIRMWARE_PACKAGE_MD5          "packagemd5"
-
-#define OC_RSRVD_FIRMWARE_VENDER                       "vender"
-#define OC_RSRVD_FIRMWARE_MODEL                                "model"
-
-#define OC_RSRVD_FIRMWARE_ACTIVE_CHECK         "x.com.samsung.update.activecheck"
-
-
-#define VCONF_FIRMWARE_UPDATE_STATE    "db/private/firmware_update/state"
-#define VCONF_FIRMWARE_UPDATE_RESULT   "db/private/firmware_update/result"
-
-#define VCONF_FIRMWARE_UPDATE_PACKAGE_NEW_VERSION      "db/private/firmware_update/package_new_version"
-#define VCONF_FIRMWARE_UPDATE_PACKAGE_URL                              "db/private/firmware_update/package_url"
-#define VCONF_FIRMWARE_UPDATE_PACKAGE_SIZE                     "db/private/firmware_update/package_size"
-#define VCONF_FIRMWARE_UPDATE_PACKAGE_MD5                              "db/private/firmware_update/package_md5"
-#ifdef LOG_TAG
-#undef LOG_TAG
-#define LOG_TAG "FIRMWARE_RESOURCE"
-#endif
-
-#define FWR_LOGD(fmt, args...)  LOGI(fmt, ##args)
-#define FWR_LOGW(fmt, args...)  LOGW(fmt, ##args)
-#define FWR_LOGI(fmt, args...)  LOGI(fmt, ##args)
-#define FWR_LOGE(fmt, args...)  LOGE(fmt, ##args)
-
-typedef struct {
-       /* Update Property */
-    int state;                                 //[R][M] controlee_firmware_state_e - 0: Idle, 1: Downloading, 2: Downloaded, 3: Updating
-    int 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: Unsupport protocol
-    int update;                                        //[RW][M] 0: Initial, 1: Download Image, 2: Upgrade Image, 3:Dwonload and Upgrade, 4 Scheduled Upgrade
-    int progress;                                      //[R][O] 0-100 range based progress include downloading state.
-    int64_t update_time;                       //[RW][O] case of (4 – update) (scheduled)  TODO: ISO 8601
-
-    /* Package Information */
-    char *current_version;             //[R][M] Current firmware version
-    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
-
-    /* Vender specific - for polling */
-    bool active_check;                 //[R][O] x.com.samsung.update.activecheck
-
-    /* Resource Handle */
-    OCResourceHandle *resource_handle;
-} controlee_firmware_s;
-
-
-enum {
-       CONTROLEE_FIRMWARE_EXEC_NONE = 0,
-       CONTROLEE_FIRMWARE_EXEC_DOWNLOAD,
-       CONTROLEE_FIRMWARE_EXEC_UPGRADE,
-       CONTROLEE_FIRMWARE_EXEC_DOWNLOAD_AND_UPGRADE
-};
-
-typedef enum {
-       CONTROLEE_HTTP_GET = 0,
-       CONTROLEE_HTTP_POST,
-       CONTROLEE_HTTP_PUT,
-       CONTROLEE_HTTP_DELETE
-}controlee_http_req_e;
-
-OCEntityHandlerResult controlee_handle_firmware_entity(OCEntityHandlerFlag flag,
-                                                                               OCEntityHandlerRequest *entityHandlerRequest,
-                                                                               void *callbackParam);
-
-void controlee_get_firmware_info(controlee_firmware_s *firmware_info);
-
-void controlee_propagate_firmware_resource(void);
-
-int controlee_http_send_request(controlee_http_req_e type, char *req_url, char **res_header, char **res_body);
-
-int controlee_http_download_file(const char *download_url, const char *download_path);
-
-#endif /* CONTROLEE_FIRMWARE_INTERNAL_H_ */
diff --git a/inc/fmwup_resource.h b/inc/fmwup_resource.h
new file mode 100644 (file)
index 0000000..00b66b3
--- /dev/null
@@ -0,0 +1,103 @@
+#ifndef _FMWUP_H_
+#define _FMWUP_H_
+
+/**
+ * This header file is included to define _EXPORT_.
+ */
+#include <stdbool.h>
+#include <tizen.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <glib.h>
+#include <octypes.h>
+#if 0
+#include <rd_client.h>
+#endif
+
+#ifndef EXPORT_API
+#define EXPORT_API     __attribute__((visibility("default")))
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct opq_fmwup_s *fmwup_h;
+
+typedef enum {
+       FMWUP_SUCCESS = 0,
+       FMWUP_INVALID_VALUE,
+       FMWUP_NULL_PTR,
+       FMWUP_MEMORY_ERR,
+       FMWUP_OPERATION_FAILED,
+       FMWUP_ALREADY_EXIST
+}fmwup_result_e;
+
+
+typedef enum {
+       FMWUP_RES_UPDATE_STATE = 0,
+       FMWUP_RES_UPDATE_RESULT,
+       FMWUP_RES_CURRENT_VERSION,
+       FMWUP_RES_NEW_VERSION
+}fmwup_res_type_e;
+
+typedef enum {
+       FMWUP_STATE_IDLE = 0,
+       FMWUP_STATE_DOWNLOADING,
+       FMWUP_STATE_DOWNLOADED,
+       FMWUP_STATE_UPDATING
+}fmwup_state_e;
+
+
+#if 0
+typedef enum {
+    FMWUP_RES_PROP_NONE = 0,
+    FMWUP_RES_PROP_DISCOVERABLE = (1<<0),
+    FMWUP_RES_PROP_OBSERVABLE = (1<<1),
+    FMWUP_RES_PROP_ACTIVE = (1<<2),
+    FMWUP_RES_PROP_SLOW = (1<<3),
+#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
+    FMWUP_RES_PROP_SECURE        = (1 << 4),
+#else
+    FMWUP_RES_PROP_SECURE        = (0),
+#endif
+    FMWUP_RES_PROP_EXPLICIT_DISCOVERABLE   = (1 << 5)
+
+#ifdef WITH_MQ
+    /** When this bit is set, the resource is allowed to be published */
+    ,FMWUP_RES_PROP_MQ_PUBLISHER     = (1 << 6)
+#endif
+
+#ifdef MQ_BROKER
+    /** When this bit is set, the resource is allowed to be notified as MQ broker.*/
+    ,FMWUP_RES_PROP_MQ_BROKER        = (1 << 7)
+#endif
+} firmware_res_prop_e;
+#endif
+
+typedef void (*state_changed_cb)(fmwup_state_e value);
+
+
+EXPORT_API int fmwup_create_firmware_resource(OCResourceHandle *firmware_res_h);
+
+EXPORT_API int fmwup_destory_firmware_resource(OCResourceHandle firmware_res_h);
+
+EXPORT_API int fmwup_set_firmware_download_path(const char *download_path);
+
+EXPORT_API int fmwup_set_state_changed_cb(state_changed_cb callback);
+
+EXPORT_API void fmwup_unset_resource_changed_cb(void);
+
+EXPORT_API int fmwup_get_newest_firmware_from_server();
+
+EXPORT_API int fmwup_get_firmware_resource_value(fmwup_res_type_e res_type, char **value);
+
+EXPORT_API int fmwup_check_firmware_upgraded(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif // _FMWUP_H_
+
diff --git a/inc/fmwup_resource_internal.h b/inc/fmwup_resource_internal.h
new file mode 100644 (file)
index 0000000..5c31b8e
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * fmwup_internal.h
+ *
+ *  Created on: Jun 29, 2017
+ *      Author: sangkoo
+ */
+
+#ifndef FMWUP_INTERNAL_H_
+#define FMWUP_INTERNAL_H_
+
+
+#include <ocstack.h>
+#include <octypes.h>
+#include <ocpayload.h>
+#include <system_info.h>
+#include <dlog.h>
+#include <vconf.h>
+
+#include "fmwup_resource.h"
+
+#define OC_RSRVD_FIRMWARE_URI          "/firmware"
+#define OC_RSRVD_FIRMWARE_RES_TYPE                     "x.samsung.firmware"
+
+#define OC_RSRVD_FIRMWARE_STATE                                "state"
+#define OC_RSRVD_FIRMWARE_RESULT                       "result"
+#define OC_RSRVD_FIRMWARE_UPDATE                       "update"
+#define OC_RSRVD_FIRMWARE_PROGRESS                     "progress"
+#define OC_RSRVD_FIRMWARE_UPDATE_TIME          "updatetime"
+
+#define OC_RSRVD_FIRMWARE_CURRENT_VERSION      "version"
+#define OC_RSRVD_FIRMWARE_NEW_VERSION          "newversion"
+#define OC_RSRVD_FIRMWARE_PACKAGE_URI          "packageuri"
+#define OC_RSRVD_FIRMWARE_PACKAGE_SIZE         "packagesize"
+#define OC_RSRVD_FIRMWARE_PACKAGE_MD5          "packagemd5"
+
+#define OC_RSRVD_FIRMWARE_VENDER                       "vender"
+#define OC_RSRVD_FIRMWARE_MODEL                                "model"
+
+#define OC_RSRVD_FIRMWARE_ACTIVE_CHECK         "x.com.samsung.update.activecheck"
+
+
+#define VCONF_FIRMWARE_UPDATE_STATE    "db/private/firmware_update/state"
+#define VCONF_FIRMWARE_UPDATE_RESULT   "db/private/firmware_update/result"
+
+#define VCONF_FIRMWARE_UPDATE_PACKAGE_NEW_VERSION      "db/private/firmware_update/package_new_version"
+#define VCONF_FIRMWARE_UPDATE_PACKAGE_URL                              "db/private/firmware_update/package_url"
+#define VCONF_FIRMWARE_UPDATE_PACKAGE_SIZE                     "db/private/firmware_update/package_size"
+#define VCONF_FIRMWARE_UPDATE_PACKAGE_MD5                              "db/private/firmware_update/package_md5"
+#ifdef LOG_TAG
+#undef LOG_TAG
+#define LOG_TAG "FIRMWARE_RESOURCE"
+#endif
+
+#define FWR_LOGD(fmt, args...)  LOGI(fmt, ##args)
+#define FWR_LOGW(fmt, args...)  LOGW(fmt, ##args)
+#define FWR_LOGI(fmt, args...)  LOGI(fmt, ##args)
+#define FWR_LOGE(fmt, args...)  LOGE(fmt, ##args)
+
+typedef struct {
+       /* Update Property */
+    int state;                                 //[R][M] fmwup_state_e - 0: Idle, 1: Downloading, 2: Downloaded, 3: Updating
+    int 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: Unsupport protocol
+    int update;                                        //[RW][M] 0: Initial, 1: Download Image, 2: Upgrade Image, 3:Dwonload and Upgrade, 4 Scheduled Upgrade
+    int progress;                                      //[R][O] 0-100 range based progress include downloading state.
+    int64_t update_time;                       //[RW][O] case of (4 – update) (scheduled)  TODO: ISO 8601
+
+    /* Package Information */
+    char *current_version;             //[R][M] Current firmware version
+    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
+
+    /* Vender specific - for polling */
+    bool active_check;                 //[R][O] x.com.samsung.update.activecheck
+
+    /* Resource Handle */
+    OCResourceHandle *resource_handle;
+} fmwup_s;
+
+
+enum {
+       FMWUP_EXEC_NONE = 0,
+       FMWUP_EXEC_DOWNLOAD,
+       FMWUP_EXEC_UPGRADE,
+       FMWUP_EXEC_DOWNLOAD_AND_UPGRADE
+};
+
+typedef enum {
+       FMWUP_HTTP_GET = 0,
+       FMWUP_HTTP_POST,
+       FMWUP_HTTP_PUT,
+       FMWUP_HTTP_DELETE
+}fmwup_http_req_e;
+
+OCEntityHandlerResult fmwup_handle_firmware_entity(OCEntityHandlerFlag flag,
+                                                                               OCEntityHandlerRequest *entityHandlerRequest,
+                                                                               void *callbackParam);
+
+void fmwup_get_firmware_info(fmwup_s *firmware_info);
+
+void fmwup_propagate_firmware_resource(void);
+
+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_INTERNAL_H_ */
diff --git a/packaging/controlee-firmware-resource.spec b/packaging/controlee-firmware-resource.spec
deleted file mode 100644 (file)
index 39d2534..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-Name:           controlee-firmware-resource
-Version:        0.0.1
-Release:        1
-License:        Apache-2.0
-Summary:        OCF-based firmware resource API for controlee
-Group:          Network & Connectivity/Libraries
-Source0:        %{name}-%{version}.tar.gz
-
-Requires(post): /sbin/ldconfig
-Requires(postun): /sbin/ldconfig
-BuildRequires: cmake
-BuildRequires: pkgconfig(capi-appfw-application)
-BuildRequires: pkgconfig(capi-system-info)
-BuildRequires: pkgconfig(dlog)
-BuildRequires: pkgconfig(glib-2.0)
-BuildRequires: pkgconfig(iotivity)
-BuildRequires: pkgconfig(key-manager)
-BuildRequires: pkgconfig(libcurl)
-BuildRequires: pkgconfig(vconf)
-
-%description
-Description: Controlee firmware resource API
-
-%package devel
-License:               Apache-2.0
-Summary:               OCF-based firmware resource API for controlee (development)
-Group:                 Network & Connectivity/Libraries
-%description devel
-Description:   OCF-based firmware resource API for controlee (development)
-
-%package test
-License:               Apache-2.0
-Summary:               Test app for OCF-based firmware resource API
-Group:                 Network & Connectivity/Testing
-%description test
-Description:   Test program for OCF-based firmware resource API
-
-%prep
-%setup -q
-
-%build
-cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} \
-               -DLIB_INSTALL_DIR=%{_libdir}
-
-make %{?jobs:-j%jobs}
-
-%install
-
-%make_install
-
-%clean
-rm -rf %{buildroot}
-
-%post
-/sbin/ldconfig
-/usr/bin/vconftool set -t int db/private/firmware_update/state 0 -s tizen::vconf::platform::rw
-/usr/bin/vconftool set -t int db/private/firmware_update/result 0 -s tizen::vconf::platform::rw
-/usr/bin/vconftool set -t string db/private/firmware_update/package_new_version "" -s tizen::vconf::platform::rw
-/usr/bin/vconftool set -t string db/private/firmware_update/package_url "" -s tizen::vconf::platform::rw
-/usr/bin/vconftool set -t double db/private/firmware_update/package_size "" -s tizen::vconf::platform::rw
-/usr/bin/vconftool set -t string db/private/firmware_update/package_md5 0 -s tizen::vconf::platform::rw
-mkdir -p /opt/usr/data/ua-client
-
-%postun 
-/sbin/ldconfig
-
-%files
-%{_libdir}/libcontrolee_firmware_resource.so*
-
-%files devel
-%{_libdir}/libcontrolee_firmware_resource.so
-%{_libdir}/pkgconfig/controlee-firmware-resource.pc
-%{_includedir}/controlee-firmware-resource/*
-
-%files test
-%defattr(-,root,root,-)
-%{_bindir}/controlee_firmware_test
-#%config(noreplace) /opt/usr/data/ua-client/thawte.cert.pem
-#%config(noreplace) /opt/usr/data/ua-client/oic_svr_db_client.dat
diff --git a/packaging/fmwup-resource.spec b/packaging/fmwup-resource.spec
new file mode 100644 (file)
index 0000000..0143385
--- /dev/null
@@ -0,0 +1,79 @@
+Name:           fmwup-resource
+Version:        0.0.1
+Release:        1
+License:        Apache-2.0
+Summary:        OCF-based firmware resource API for controlee
+Group:          Network & Connectivity/Libraries
+Source0:        %{name}-%{version}.tar.gz
+
+Requires(post): /sbin/ldconfig
+Requires(postun): /sbin/ldconfig
+BuildRequires: cmake
+BuildRequires: pkgconfig(capi-appfw-application)
+BuildRequires: pkgconfig(capi-system-info)
+BuildRequires: pkgconfig(dlog)
+BuildRequires: pkgconfig(glib-2.0)
+BuildRequires: pkgconfig(iotivity)
+BuildRequires: pkgconfig(key-manager)
+BuildRequires: pkgconfig(libcurl)
+BuildRequires: pkgconfig(vconf)
+
+%description
+Description: Controlee firmware resource API
+
+%package devel
+License:               Apache-2.0
+Summary:               OCF-based firmware resource API for controlee (development)
+Group:                 Network & Connectivity/Libraries
+%description devel
+Description:   OCF-based firmware resource API for controlee (development)
+
+%package test
+License:               Apache-2.0
+Summary:               Test app for OCF-based firmware resource API
+Group:                 Network & Connectivity/Testing
+%description test
+Description:   Test program for OCF-based firmware resource API
+
+%prep
+%setup -q
+
+%build
+cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} \
+               -DLIB_INSTALL_DIR=%{_libdir}
+
+make %{?jobs:-j%jobs}
+
+%install
+
+%make_install
+
+%clean
+rm -rf %{buildroot}
+
+%post
+/sbin/ldconfig
+/usr/bin/vconftool set -t int db/private/firmware_update/state 0 -s tizen::vconf::platform::rw
+/usr/bin/vconftool set -t int db/private/firmware_update/result 0 -s tizen::vconf::platform::rw
+/usr/bin/vconftool set -t string db/private/firmware_update/package_new_version "" -s tizen::vconf::platform::rw
+/usr/bin/vconftool set -t string db/private/firmware_update/package_url "" -s tizen::vconf::platform::rw
+/usr/bin/vconftool set -t double db/private/firmware_update/package_size "" -s tizen::vconf::platform::rw
+/usr/bin/vconftool set -t string db/private/firmware_update/package_md5 0 -s tizen::vconf::platform::rw
+mkdir -p /opt/usr/data/ua-client
+
+%postun 
+/sbin/ldconfig
+
+%files
+%{_libdir}/libfmwup_resource.so*
+
+%files devel
+%{_libdir}/libfmwup_resource.so
+%{_libdir}/pkgconfig/fmwup-resource.pc
+%{_includedir}/fmwup-resource/*
+
+%files test
+%defattr(-,root,root,-)
+%{_bindir}/fmwup_test
+#%config(noreplace) /opt/usr/data/ua-client/thawte.cert.pem
+#%config(noreplace) /opt/usr/data/ua-client/oic_svr_db_client.dat
diff --git a/src/controlee_firmware_resource.c b/src/controlee_firmware_resource.c
deleted file mode 100644 (file)
index 0feb3c1..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-#include "controlee_firmware_resource.h"
-
-#include "controlee_firmware_resource_internal.h"
-
-controlee_firmware_s* g_firmware_resource = NULL;
-state_changed_cb g_state_changed_cb = NULL;
-char *g_download_path = NULL;
-
-
-int controlee_create_firmware_resource(OCResourceHandle *firmware_res_h)
-{
-       if (!firmware_res_h)
-               return CONTROLEE_FIRMWARE_NULL_PTR;
-
-       if (g_firmware_resource)
-               return CONTROLEE_FIRMWARE_ALREADY_EXIST;
-
-       controlee_firmware_s *tmp_firmware_res = NULL;
-       OCResourceHandle oc_handle = NULL;
-
-       if (OCCreateResource(&oc_handle, "x.samsung.firmware",
-                                               OC_RSRVD_INTERFACE_DEFAULT, "/firmware",  /* OC_RSRVD_INTERFACE_DEFAULT : "oic.if.baseline" */
-                                               controlee_handle_firmware_entity, NULL,
-                                               OC_DISCOVERABLE | OC_OBSERVABLE) != OC_STACK_OK) {
-               return CONTROLEE_FIRMWARE_OPERATION_FAILED;
-       }
-
-       tmp_firmware_res = (controlee_firmware_s *)calloc(1, sizeof(controlee_firmware_s));
-       if (tmp_firmware_res == NULL) return CONTROLEE_FIRMWARE_MEMORY_ERR;
-
-       controlee_get_firmware_info(tmp_firmware_res);
-
-       tmp_firmware_res->resource_handle = oc_handle;
-
-       g_firmware_resource = tmp_firmware_res;
-       *firmware_res_h = oc_handle;
-
-       return CONTROLEE_FIRMWARE_SUCCESS;
-}
-
-
-int controlee_destory_firmware_resource(OCResourceHandle firmware_res_h)
-{
-       if (!firmware_res_h)
-               return CONTROLEE_FIRMWARE_NULL_PTR;
-
-       if (firmware_res_h == g_firmware_resource->resource_handle) {
-               if (OCDeleteResource(g_firmware_resource->resource_handle) != OC_STACK_OK) {
-                       FWR_LOGD("OCDeleteResource() failed for firmware_resource");
-               }
-
-               g_free(g_firmware_resource->current_version);
-               g_free(g_firmware_resource->new_version);
-               g_free(g_firmware_resource->package_uri);
-               g_free(g_firmware_resource->manufacturer);
-               g_free(g_firmware_resource->model_name);
-               g_free(g_firmware_resource);
-
-               g_firmware_resource = NULL;
-       }
-
-       return CONTROLEE_FIRMWARE_SUCCESS;
-}
-
-int controlee_set_firmware_download_path(const char *download_path)
-{
-       if (!download_path)
-               return CONTROLEE_FIRMWARE_NULL_PTR;
-
-       g_free(g_download_path);
-       g_download_path = NULL;
-       g_download_path = g_strdup(download_path);
-
-       return CONTROLEE_FIRMWARE_SUCCESS;
-}
-
-
-int controlee_set_state_changed_cb(state_changed_cb callback)
-{
-       if (!callback)
-               return CONTROLEE_FIRMWARE_NULL_PTR;
-
-       g_state_changed_cb = callback;
-
-       return CONTROLEE_FIRMWARE_SUCCESS;
-}
-
-void controlee_unset_resource_changed_cb(void)
-{
-       g_state_changed_cb = NULL;
-}
-
-
-int controlee_get_newest_firmware_from_server()
-{
-       if (!g_firmware_resource) {
-               FWR_LOGD("g_firmware_resource is NULL");
-               return CONTROLEE_FIRMWARE_NULL_PTR;
-       }
-
-       FWR_LOGD("g_firmware_resource  active_check [true]");
-       g_firmware_resource->active_check = true;
-       controlee_propagate_firmware_resource();
-       return CONTROLEE_FIRMWARE_SUCCESS;
-}
-
-
-int controlee_get_firmware_resource_value(controlee_firmware_res_type_e res_type, char **value)
-{
-       if (!g_firmware_resource) {
-               FWR_LOGD("g_firmware_resource is NULL");
-               return CONTROLEE_FIRMWARE_NULL_PTR;
-       }
-
-       int result = CONTROLEE_FIRMWARE_SUCCESS;
-
-       char buf[2] = {0,};
-
-       switch (res_type) {
-       case CONTROLEE_FIRMWARE_RES_UPDATE_STATE:
-               snprintf(buf, sizeof(buf), "%d", g_firmware_resource->state);
-               *value = g_strdup(buf);
-               break;
-       case CONTROLEE_FIRMWARE_RES_UPDATE_RESULT:
-               snprintf(buf, sizeof(buf), "%d", g_firmware_resource->result);
-               *value = g_strdup(buf);
-               break;
-       case CONTROLEE_FIRMWARE_RES_CURRENT_VERSION:
-               *value = g_strdup(g_firmware_resource->current_version);
-               break;
-       case CONTROLEE_FIRMWARE_RES_NEW_VERSION:
-               *value = g_strdup(g_firmware_resource->new_version);
-               break;
-       default :
-               result = CONTROLEE_FIRMWARE_INVALID_VALUE;
-               *value = NULL;
-               break;
-       }
-
-       return result;
-}
-
-
-int controlee_check_firmware_upgraded(void)
-{
-       if (!g_firmware_resource) {
-               FWR_LOGD("g_firmware_resource is NULL");
-               return CONTROLEE_FIRMWARE_NULL_PTR;
-       }
-
-       if (g_firmware_resource->state == CONTROLEE_FIRMWARE_STATE_UPDATING) {
-               FWR_LOGD("***Firmware Upgrade Done***");
-               g_firmware_resource->state = CONTROLEE_FIRMWARE_STATE_IDLE;
-
-               // TODO :: It should be checked and set result value according to upgrade result
-               g_firmware_resource->result = 1;
-
-               vconf_set_int(VCONF_FIRMWARE_UPDATE_STATE, (const int)g_firmware_resource->state);
-               vconf_set_int(VCONF_FIRMWARE_UPDATE_RESULT, (const int)g_firmware_resource->result);
-
-               controlee_propagate_firmware_resource();
-
-               if (g_state_changed_cb) {
-                       g_state_changed_cb(g_firmware_resource->state);
-               }
-       } else {
-
-               return CONTROLEE_FIRMWARE_OPERATION_FAILED;
-       }
-
-       return CONTROLEE_FIRMWARE_SUCCESS;
-}
diff --git a/src/controlee_firmware_resource_http.c b/src/controlee_firmware_resource_http.c
deleted file mode 100644 (file)
index 1592db8..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-#include <curl/curl.h>
-
-#include "controlee_firmware_resource_internal.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)
-{
-       CURLcode curl_ret_code;
-
-       long response = 0;
-       curl_ret_code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
-       if (CURLE_OK != 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;
-}
-
-
-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 controlee_http_send_request(controlee_http_req_e type, char *req_url, char **res_header, char **res_body)
-{
-       //LOG("Enter http_send_request()");
-
-       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 == CONTROLEE_HTTP_GET) {
-               curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
-       } else if (type == CONTROLEE_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);
-       //LOG("curl_easy_perform(curl): %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);
-       return ret;
-}
-
-
-int controlee_http_download_file(const char *download_url, const char *download_path)
-{
-       //LOG("http_download_file() enter");
-
-    if (!download_url)
-        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);
-        //LOG("curl_easy_perform() [%d]", error_code);
-        curl_easy_cleanup(curl);
-        fclose(fp);
-
-        if (error_code != CURLE_OK) {
-               remove(download_path);
-               ret = -1;
-        }
-    } else {
-        ret = -1;
-    }
-
-    return ret;
-}
diff --git a/src/controlee_firmware_resource_internal.c b/src/controlee_firmware_resource_internal.c
deleted file mode 100644 (file)
index a95a3d5..0000000
+++ /dev/null
@@ -1,426 +0,0 @@
-#include "controlee_firmware_resource_internal.h"
-
-#include <app_common.h>
-
-
-extern controlee_firmware_s* g_firmware_resource;
-extern char *g_download_path;
-extern state_changed_cb g_state_changed_cb;
-
-#define UPDATE_FILE "/opt/usr/data/fota/tota_init"
-
-char *g_app_data_path = NULL;
-
-
-bool _compare_resource_interface(char *from, char *iface)
-{
-       char *str = g_strdup(from);
-       char *ptr = strtok(str, ";");
-
-       if(ptr == NULL) {
-               return false;
-       }
-
-       do {
-               if(strstr(ptr, ".if.")) {
-                       char *if_ptr = NULL;
-                       if_ptr = strtok(ptr, "=");
-                       if_ptr = strtok(NULL, "=");
-
-                       if(!g_strcmp0(if_ptr, iface)) {
-                               return true;
-                       }
-               }
-       } while ((ptr = strtok(NULL, ";")));
-
-       return false;
-}
-
-
-OCEntityHandlerResult _check_request_payload(OCEntityHandlerRequest *ehRequest)
-{
-       if( !(ehRequest->query) || \
-                       (ehRequest->query && (g_strcmp0(ehRequest->query, "") && \
-                       !_compare_resource_interface(ehRequest->query, OC_RSRVD_INTERFACE_DEFAULT))))
-       {
-               FWR_LOGD("Not supported Interface");
-               return OC_EH_BAD_REQ;
-       }
-
-       return OC_EH_OK;
-}
-
-
-static void _exec_update()
-{
-       FILE* fp = fopen(UPDATE_FILE, "w");
-       if(!fp) {
-               FWR_LOGD("fopen error: %d", errno);
-               return;
-       }
-       fclose(fp);
-}
-
-
-void controlee_propagate_firmware_resource(void)
-{
-       if(OC_STACK_NO_OBSERVERS == OCNotifyAllObservers(g_firmware_resource->resource_handle, OC_HIGH_QOS)) {
-               FWR_LOGD("Firmware-Resource doesn't have any observers.");
-       }
-}
-
-
-void _handle_update_command(int64_t update_type)
-{
-       if (g_strcmp0(g_firmware_resource->package_uri, "") && (
-                       (g_firmware_resource->state == 0 && update_type == CONTROLEE_FIRMWARE_EXEC_DOWNLOAD) ||
-                       (g_firmware_resource->state == 0 && update_type == CONTROLEE_FIRMWARE_EXEC_DOWNLOAD_AND_UPGRADE))) {
-               if (g_firmware_resource->new_version && \
-                               g_strcmp0(g_firmware_resource->current_version, g_firmware_resource->new_version)) {
-                       FWR_LOGD("***Downloading image from [%s] ***", g_firmware_resource->package_uri);
-                       g_firmware_resource->state = CONTROLEE_FIRMWARE_STATE_DOWNLOADING;
-                       g_firmware_resource->result = 0;
-                       controlee_propagate_firmware_resource();
-                       if (g_state_changed_cb) {
-                               g_state_changed_cb(g_firmware_resource->state);
-                       }
-
-                       if (controlee_http_download_file(g_firmware_resource->package_uri, (const char *)g_download_path) != 0) {
-                               g_firmware_resource->state = CONTROLEE_FIRMWARE_STATE_IDLE;
-                               vconf_set_int(VCONF_FIRMWARE_UPDATE_STATE, g_firmware_resource->state);
-                               controlee_propagate_firmware_resource();
-                               if (g_state_changed_cb) {
-                                       g_state_changed_cb(g_firmware_resource->state);
-                               }
-                               return;
-                       }
-
-                       FWR_LOGD("*** Firmware image downloaded ***");
-                       g_firmware_resource->state = CONTROLEE_FIRMWARE_STATE_DOWNLOADED;
-                       vconf_set_int(VCONF_FIRMWARE_UPDATE_STATE, g_firmware_resource->state);
-
-                       controlee_propagate_firmware_resource();
-                       if (g_state_changed_cb) {
-                               g_state_changed_cb(g_firmware_resource->state);
-                       }
-               } else {
-                       /* LOG("No need to upgrade to new firmware [%s] from [%s]", \
-                               g_firmware_resource->new_version, g_firmware_resource->current_version); */
-                       return;
-               }
-       }
-
-       if (g_firmware_resource->state == CONTROLEE_FIRMWARE_STATE_DOWNLOADED) {
-               if (update_type == CONTROLEE_FIRMWARE_EXEC_UPGRADE || update_type == CONTROLEE_FIRMWARE_EXEC_DOWNLOAD_AND_UPGRADE) {
-                       g_firmware_resource->state = CONTROLEE_FIRMWARE_STATE_UPDATING;
-                       vconf_set_int(VCONF_FIRMWARE_UPDATE_STATE, g_firmware_resource->state);
-                       controlee_propagate_firmware_resource();
-                       if (g_state_changed_cb) {
-                               g_state_changed_cb(g_firmware_resource->state);
-                       }
-
-                       _exec_update();
-               }
-       }
-}
-
-OCRepPayload* _construct_response_of_firmware()
-{
-       FWR_LOGD("_construct_response_of_firmware()");
-       OCRepPayload* payload = OCRepPayloadCreate();
-       if (!payload) {
-               FWR_LOGD("Failed to allocate Payload");
-               return NULL;
-       }
-
-       OCRepPayloadSetUri(payload, OC_RSRVD_CONTROLEE_FIRMWARE_URI);
-
-       OCRepPayloadAddInterface(payload, OC_RSRVD_INTERFACE_DEFAULT);
-       OCRepPayloadAddResourceType(payload, OC_RSRVD_FIRMWARE_RES_TYPE);
-
-       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_STATE, (int64_t)g_firmware_resource->state);
-       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_RESULT, (int64_t)g_firmware_resource->result);
-       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_UPDATE, (int64_t)g_firmware_resource->update);
-       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_PROGRESS, (int64_t)g_firmware_resource->progress);
-       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_UPDATE_TIME, g_firmware_resource->update_time);
-
-       OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_CURRENT_VERSION, g_firmware_resource->current_version);
-       OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_NEW_VERSION, g_firmware_resource->new_version);
-       OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_PACKAGE_URI, g_firmware_resource->package_uri);
-       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_PACKAGE_SIZE, g_firmware_resource->package_size);
-       OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_PACKAGE_MD5, g_firmware_resource->package_md5);
-
-       OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_VENDER, g_firmware_resource->manufacturer);
-       OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_MODEL, g_firmware_resource->model_name);
-
-       OCRepPayloadSetPropBool(payload, OC_RSRVD_FIRMWARE_ACTIVE_CHECK, g_firmware_resource->active_check);
-
-
-       return payload;
-}
-
-void *_worker(void *data)
-{
-       int64_t exec_type = *(int64_t *)data;
-       _handle_update_command(exec_type);
-       g_free(data);
-
-       return NULL;
-}
-
-
-void _update_firmware_resource(OCRepPayload *input)
-{
-       char *new_firmware = NULL;
-       if (OCRepPayloadGetPropString(input, OC_RSRVD_FIRMWARE_NEW_VERSION, &new_firmware)) {
-               if (g_strcmp0(new_firmware, g_firmware_resource->new_version)) {
-                       g_free(g_firmware_resource->new_version);
-                       g_firmware_resource->new_version = g_strdup(new_firmware);
-                       vconf_set_str(VCONF_FIRMWARE_UPDATE_PACKAGE_NEW_VERSION, new_firmware);
-                       if (g_state_changed_cb) {
-                               g_state_changed_cb(g_firmware_resource->state);
-                       }
-               }
-               g_free(new_firmware);
-               FWR_LOGD("g_firmware_resource->new_version = [%s]", g_firmware_resource->new_version);
-       }
-
-       char *package_uri = NULL;
-       if (OCRepPayloadGetPropString(input, OC_RSRVD_FIRMWARE_PACKAGE_URI, &package_uri)) {
-               if (g_strcmp0(package_uri, g_firmware_resource->package_uri)) {
-                       g_free(g_firmware_resource->package_uri);
-                       g_firmware_resource->package_uri = g_strdup(new_firmware);
-                       vconf_set_str(VCONF_FIRMWARE_UPDATE_PACKAGE_URL, new_firmware);
-               }
-               g_free(package_uri);
-               FWR_LOGD("g_firmware_resource->package_uri = [%s]", g_firmware_resource->package_uri);
-       }
-
-       int64_t package_size;
-       if (OCRepPayloadGetPropInt(input, OC_RSRVD_FIRMWARE_PACKAGE_SIZE, &package_size)) {
-               g_firmware_resource->package_size = package_size;
-               vconf_set_dbl(VCONF_FIRMWARE_UPDATE_PACKAGE_SIZE, (double)package_size);
-               FWR_LOGD("g_firmware_resource->package_size = [%lld]", package_size);
-       }
-
-       char *package_md5 = NULL;
-       if (OCRepPayloadGetPropString(input, OC_RSRVD_FIRMWARE_PACKAGE_MD5, &package_md5)) {
-               if (g_strcmp0(package_md5, g_firmware_resource->package_md5)) {
-                       g_free(g_firmware_resource->package_md5);
-                       g_firmware_resource->package_md5 = g_strdup(package_md5);
-                       vconf_set_str(VCONF_FIRMWARE_UPDATE_PACKAGE_MD5, package_md5);
-               }
-               g_free(package_uri);
-               FWR_LOGD("g_firmware_resource->package_md5 = [%s]", g_firmware_resource->package_md5);
-       }
-
-       int64_t update_time;
-       if (OCRepPayloadGetPropInt(input, OC_RSRVD_FIRMWARE_UPDATE_TIME, &update_time)) {
-               g_firmware_resource->update_time = update_time;
-               FWR_LOGD("g_firmware_resource->update_time = [%lld]", update_time);
-               /* TODO : Check Scheduled update , */
-       }
-
-       int64_t *update = (int64_t *)calloc(1, sizeof(int64_t));
-       if (!update) {
-               FWR_LOGD("Memory allocation error!");
-               return;
-       }
-
-       if (OCRepPayloadGetPropInt(input, OC_RSRVD_FIRMWARE_UPDATE, update)) {
-               FWR_LOGD("update command = [%lld]", *update);
-               g_firmware_resource->update = *update;
-               pthread_t pThread;
-               pthread_create(&pThread, NULL, _worker, update);
-       } else {
-               free(update);
-       }
-
-
-       controlee_propagate_firmware_resource();
-}
-
-
-OCEntityHandlerResult _process_get_request(OCEntityHandlerRequest *ehRequest, OCRepPayload **payload)
-{
-       OCRepPayload *getResp = _construct_response_of_firmware(ehRequest);
-       if (!getResp)
-       {
-               FWR_LOGD("constructResponse failed");
-               return OC_EH_ERROR;
-       }
-
-       *payload = getResp;
-
-       return OC_EH_OK;
-}
-
-
-OCEntityHandlerResult _process_post_request(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload)
-{
-       FWR_LOGD("ProcessPostRequest enter");
-       OCEntityHandlerResult ehResult = OC_EH_ERROR;
-       if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
-               FWR_LOGD("Incoming payload not a representation");
-               return ehResult;
-       }
-
-       OCRepPayload* input = (OCRepPayload*)(ehRequest->payload);
-       if (!input) {
-               FWR_LOGD("Failed to parse");
-               return ehResult;
-       }
-
-       _update_firmware_resource(input);
-
-       OCRepPayload *getResp = NULL;
-       getResp = _construct_response_of_firmware();
-
-       if (!getResp) {
-               FWR_LOGD("constructResponse failed");
-               return OC_EH_ERROR;
-       }
-
-       *payload = getResp;
-       ehResult = OC_EH_OK;
-
-       return ehResult;
-}
-
-
-OCEntityHandlerResult controlee_handle_firmware_entity(OCEntityHandlerFlag flag,
-                                                                               OCEntityHandlerRequest *entityHandlerRequest,
-                                                                               void *callbackParam)
-{
-       OCEntityHandlerResult ehRet = OC_EH_OK;
-       OCEntityHandlerResponse response = { 0, 0, OC_EH_ERROR, 0, 0, \
-                                                                               { }, { 0 }, false };
-       OCRepPayload* payload = NULL;
-
-       if (entityHandlerRequest && (flag & OC_REQUEST_FLAG)) {
-               if (OC_REST_GET == entityHandlerRequest->method) {
-                       FWR_LOGD("Received OC_REST_GET request");
-                       ehRet = _process_get_request(entityHandlerRequest, &payload);
-               } else if (OC_REST_PUT == entityHandlerRequest->method) {
-                       FWR_LOGD("Received OC_REST_PUT request, nothing to do");
-               } else if (OC_REST_POST == entityHandlerRequest->method) {
-                       FWR_LOGD("Received OC_REST_POST from client");
-                       ehRet = _process_post_request(entityHandlerRequest, &payload);
-               }
-
-               if (ehRet == OC_EH_OK) {
-                       response.requestHandle = entityHandlerRequest->requestHandle;
-                       response.resourceHandle = entityHandlerRequest->resource;
-                       response.ehResult = ehRet;
-                       response.payload = (OCPayload*)payload;
-                       response.persistentBufferFlag = 0;
-
-                       // Send the response
-                       if (OCDoResponse(&response) != OC_STACK_OK) {
-                               FWR_LOGD("Error sending response");
-                               ehRet = OC_EH_ERROR;
-                       }
-
-                       if (OC_REST_POST == entityHandlerRequest->method || OC_REST_PUT == entityHandlerRequest->method) {
-                               if (OCNotifyAllObservers(g_firmware_resource->resource_handle, OC_NA_QOS) != OC_STACK_OK) {
-                                       printf("Fail to OCNotifyAllObservers()\n");
-                                       ehRet = OC_EH_ERROR;
-                               }
-                       }
-               }
-       }
-
-       if (entityHandlerRequest && (flag & OC_OBSERVE_FLAG)) {
-               FWR_LOGD("Flag includes OC_OBSERVE_FLAG");
-               if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action) {
-                       FWR_LOGD("Received OC_OBSERVE_REGISTER from client");
-               } else if (OC_OBSERVE_DEREGISTER == entityHandlerRequest->obsInfo.action) {
-                       FWR_LOGD("Received OC_OBSERVE_DEREGISTER from client");
-               }
-       }
-
-       return ehRet;
-}
-
-
-void controlee_get_firmware_info(controlee_firmware_s *firmware_info)
-{
-       char *manufacturer = NULL;
-       char *model_name = NULL;
-       char *cur_firmware_ver = NULL;
-       char *new_firmware_ver = NULL;
-       double package_size = 0;
-       char *package_md5 = NULL;
-       char *download_url = NULL;
-       int update_state;
-       int update_result;
-
-#if 1
-    OCGetPropertyValue(PAYLOAD_TYPE_PLATFORM, OC_RSRVD_MFG_NAME, (void **)&manufacturer);
-    OCGetPropertyValue(PAYLOAD_TYPE_PLATFORM, OC_RSRVD_MODEL_NUM, (void **)&model_name);
-    OCGetPropertyValue(PAYLOAD_TYPE_PLATFORM, OC_RSRVD_FIRMWARE_VERSION, (void **)&cur_firmware_ver);
-#else
-       if (system_info_get_platform_string("http://tizen.org/system/manufacturer", &manufacturer)
-               != SYSTEM_INFO_ERROR_NONE) {
-               FWR_LOGD("system_info_get_platform_string() is failed");
-       }
-
-       if (system_info_get_platform_string("http://tizen.org/system/model_name", &model_name)
-               != SYSTEM_INFO_ERROR_NONE) {
-               FWR_LOGD("system_info_get_platform_string() is failed");
-       }
-
-       if (system_info_get_platform_string("http://tizen.org/system/build.version.release", &cur_firmware_ver)
-               != SYSTEM_INFO_ERROR_NONE) {
-               FWR_LOGD("system_info_get_platform_string() is failed");
-       }
-#endif
-
-       if (vconf_get_int(VCONF_FIRMWARE_UPDATE_STATE, &update_state) != 0) {
-               FWR_LOGD("vconf_get_int() is failed");
-       }
-
-       if (vconf_get_int(VCONF_FIRMWARE_UPDATE_RESULT, &update_result) != 0) {
-               FWR_LOGD("vconf_get_int() is failed");
-       }
-
-       if (vconf_get_dbl(VCONF_FIRMWARE_UPDATE_PACKAGE_SIZE, &package_size) != 0) {
-               FWR_LOGD("vconf_get_dbl() is failed");
-       }
-       new_firmware_ver = vconf_get_str(VCONF_FIRMWARE_UPDATE_PACKAGE_NEW_VERSION);
-       package_md5 = vconf_get_str(VCONF_FIRMWARE_UPDATE_PACKAGE_MD5);
-       download_url = vconf_get_str(VCONF_FIRMWARE_UPDATE_PACKAGE_URL);
-
-       FWR_LOGD("manufacturer=[%s]", manufacturer);
-       FWR_LOGD("model_name=[%s]", model_name);
-
-       FWR_LOGD("firmware_ver=[%s]", cur_firmware_ver);
-       FWR_LOGD("firmware_new_ver=[%s]", new_firmware_ver);
-       FWR_LOGD("firmware_package_url=[%s]", download_url);
-       FWR_LOGD("firmware_md5=[%s]", package_md5);
-       FWR_LOGD("firmware_package_size=[%lld]", (int64_t)package_size);
-
-       FWR_LOGD("firmware_update_state=[%d]", update_state);
-       FWR_LOGD("firmware_update_result=[%d]", update_result);
-
-       firmware_info->manufacturer = g_strdup(manufacturer);
-       firmware_info->model_name = g_strdup(model_name);
-
-       firmware_info->current_version = g_strdup(cur_firmware_ver);
-       firmware_info->new_version = g_strdup(new_firmware_ver);
-       firmware_info->package_uri = g_strdup(download_url);
-       firmware_info->package_md5 = g_strdup(package_md5);
-       firmware_info->package_size = (int64_t)package_size;
-
-       firmware_info->state = update_state;
-       firmware_info->result = update_result;
-
-       g_free(manufacturer);
-       g_free(model_name);
-
-       g_free(package_md5);
-       g_free(new_firmware_ver);
-       g_free(cur_firmware_ver);
-       g_free(download_url);
-}
-
diff --git a/src/fmwup_resource.c b/src/fmwup_resource.c
new file mode 100644 (file)
index 0000000..bc8cf9f
--- /dev/null
@@ -0,0 +1,171 @@
+#include <fmwup_resource.h>
+#include <fmwup_resource_internal.h>
+
+fmwup_s* g_firmware_resource = NULL;
+state_changed_cb g_state_changed_cb = NULL;
+char *g_download_path = NULL;
+
+
+int fmwup_create_firmware_resource(OCResourceHandle *firmware_res_h)
+{
+       if (!firmware_res_h)
+               return FMWUP_NULL_PTR;
+
+       if (g_firmware_resource)
+               return FMWUP_ALREADY_EXIST;
+
+       fmwup_s *tmp_firmware_res = NULL;
+       OCResourceHandle oc_handle = NULL;
+
+       if (OCCreateResource(&oc_handle, "x.samsung.firmware",
+                                               OC_RSRVD_INTERFACE_DEFAULT, "/firmware",  /* OC_RSRVD_INTERFACE_DEFAULT : "oic.if.baseline" */
+                                               fmwup_handle_firmware_entity, NULL,
+                                               OC_DISCOVERABLE | OC_OBSERVABLE) != OC_STACK_OK) {
+               return FMWUP_OPERATION_FAILED;
+       }
+
+       tmp_firmware_res = (fmwup_s *)calloc(1, sizeof(fmwup_s));
+       if (tmp_firmware_res == NULL) return FMWUP_MEMORY_ERR;
+
+       fmwup_get_firmware_info(tmp_firmware_res);
+
+       tmp_firmware_res->resource_handle = oc_handle;
+
+       g_firmware_resource = tmp_firmware_res;
+       *firmware_res_h = oc_handle;
+
+       return FMWUP_SUCCESS;
+}
+
+
+int fmwup_destory_firmware_resource(OCResourceHandle firmware_res_h)
+{
+       if (!firmware_res_h)
+               return FMWUP_NULL_PTR;
+
+       if (firmware_res_h == g_firmware_resource->resource_handle) {
+               if (OCDeleteResource(g_firmware_resource->resource_handle) != OC_STACK_OK) {
+                       FWR_LOGD("OCDeleteResource() failed for firmware_resource");
+               }
+
+               g_free(g_firmware_resource->current_version);
+               g_free(g_firmware_resource->new_version);
+               g_free(g_firmware_resource->package_uri);
+               g_free(g_firmware_resource->manufacturer);
+               g_free(g_firmware_resource->model_name);
+               g_free(g_firmware_resource);
+
+               g_firmware_resource = NULL;
+       }
+
+       return FMWUP_SUCCESS;
+}
+
+int fmwup_set_firmware_download_path(const char *download_path)
+{
+       if (!download_path)
+               return FMWUP_NULL_PTR;
+
+       g_free(g_download_path);
+       g_download_path = NULL;
+       g_download_path = g_strdup(download_path);
+
+       return FMWUP_SUCCESS;
+}
+
+
+int fmwup_set_state_changed_cb(state_changed_cb callback)
+{
+       if (!callback)
+               return FMWUP_NULL_PTR;
+
+       g_state_changed_cb = callback;
+
+       return FMWUP_SUCCESS;
+}
+
+void fmwup_unset_resource_changed_cb(void)
+{
+       g_state_changed_cb = NULL;
+}
+
+
+int fmwup_get_newest_firmware_from_server()
+{
+       if (!g_firmware_resource) {
+               FWR_LOGD("g_firmware_resource is NULL");
+               return FMWUP_NULL_PTR;
+       }
+
+       FWR_LOGD("g_firmware_resource  active_check [true]");
+       g_firmware_resource->active_check = true;
+       fmwup_propagate_firmware_resource();
+       return FMWUP_SUCCESS;
+}
+
+
+int fmwup_get_firmware_resource_value(fmwup_res_type_e res_type, char **value)
+{
+       if (!g_firmware_resource) {
+               FWR_LOGD("g_firmware_resource is NULL");
+               return FMWUP_NULL_PTR;
+       }
+
+       int result = FMWUP_SUCCESS;
+
+       char buf[2] = {0,};
+
+       switch (res_type) {
+       case FMWUP_RES_UPDATE_STATE:
+               snprintf(buf, sizeof(buf), "%d", g_firmware_resource->state);
+               *value = g_strdup(buf);
+               break;
+       case FMWUP_RES_UPDATE_RESULT:
+               snprintf(buf, sizeof(buf), "%d", g_firmware_resource->result);
+               *value = g_strdup(buf);
+               break;
+       case FMWUP_RES_CURRENT_VERSION:
+               *value = g_strdup(g_firmware_resource->current_version);
+               break;
+       case FMWUP_RES_NEW_VERSION:
+               *value = g_strdup(g_firmware_resource->new_version);
+               break;
+       default :
+               result = FMWUP_INVALID_VALUE;
+               *value = NULL;
+               break;
+       }
+
+       return result;
+}
+
+
+int fmwup_check_firmware_upgraded(void)
+{
+       if (!g_firmware_resource) {
+               FWR_LOGD("g_firmware_resource is NULL");
+               return FMWUP_NULL_PTR;
+       }
+
+       if (g_firmware_resource->state == FMWUP_STATE_UPDATING) {
+               FWR_LOGD("***Firmware Upgrade Done***");
+               g_firmware_resource->state = FMWUP_STATE_IDLE;
+
+               // TODO :: It should be checked and set result value according to upgrade result
+               g_firmware_resource->result = 1;
+
+               vconf_set_int(VCONF_FIRMWARE_UPDATE_STATE, (const int)g_firmware_resource->state);
+               vconf_set_int(VCONF_FIRMWARE_UPDATE_RESULT, (const int)g_firmware_resource->result);
+
+               fmwup_propagate_firmware_resource();
+
+               if (g_state_changed_cb) {
+                       g_state_changed_cb(g_firmware_resource->state);
+               }
+       } else {
+
+               return FMWUP_OPERATION_FAILED;
+       }
+
+       return FMWUP_SUCCESS;
+}
diff --git a/src/fmwup_resource_http.c b/src/fmwup_resource_http.c
new file mode 100644 (file)
index 0000000..3a743dc
--- /dev/null
@@ -0,0 +1,209 @@
+#include <curl/curl.h>
+
+#include <fmwup_resource_internal.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)
+{
+       CURLcode curl_ret_code;
+
+       long response = 0;
+       curl_ret_code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
+       if (CURLE_OK != 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;
+}
+
+
+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)
+{
+       //LOG("Enter http_send_request()");
+
+       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);
+       //LOG("curl_easy_perform(curl): %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);
+       return ret;
+}
+
+
+int fmwup_http_download_file(const char *download_url, const char *download_path)
+{
+       //LOG("http_download_file() enter");
+
+    if (!download_url)
+        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);
+        //LOG("curl_easy_perform() [%d]", error_code);
+        curl_easy_cleanup(curl);
+        fclose(fp);
+
+        if (error_code != CURLE_OK) {
+               remove(download_path);
+               ret = -1;
+        }
+    } else {
+        ret = -1;
+    }
+
+    return ret;
+}
diff --git a/src/fmwup_resource_internal.c b/src/fmwup_resource_internal.c
new file mode 100644 (file)
index 0000000..352e51e
--- /dev/null
@@ -0,0 +1,425 @@
+#include <app_common.h>
+#include <fmwup_resource_internal.h>
+
+
+extern fmwup_s* g_firmware_resource;
+extern char *g_download_path;
+extern state_changed_cb g_state_changed_cb;
+
+#define UPDATE_FILE "/opt/usr/data/fota/tota_init"
+
+char *g_app_data_path = NULL;
+
+
+bool _compare_resource_interface(char *from, char *iface)
+{
+       char *str = g_strdup(from);
+       char *ptr = strtok(str, ";");
+
+       if(ptr == NULL) {
+               return false;
+       }
+
+       do {
+               if(strstr(ptr, ".if.")) {
+                       char *if_ptr = NULL;
+                       if_ptr = strtok(ptr, "=");
+                       if_ptr = strtok(NULL, "=");
+
+                       if(!g_strcmp0(if_ptr, iface)) {
+                               return true;
+                       }
+               }
+       } while ((ptr = strtok(NULL, ";")));
+
+       return false;
+}
+
+
+OCEntityHandlerResult _check_request_payload(OCEntityHandlerRequest *ehRequest)
+{
+       if( !(ehRequest->query) || \
+                       (ehRequest->query && (g_strcmp0(ehRequest->query, "") && \
+                       !_compare_resource_interface(ehRequest->query, OC_RSRVD_INTERFACE_DEFAULT))))
+       {
+               FWR_LOGD("Not supported Interface");
+               return OC_EH_BAD_REQ;
+       }
+
+       return OC_EH_OK;
+}
+
+
+static void _exec_update()
+{
+       FILE* fp = fopen(UPDATE_FILE, "w");
+       if(!fp) {
+               FWR_LOGD("fopen error: %d", errno);
+               return;
+       }
+       fclose(fp);
+}
+
+
+void fmwup_propagate_firmware_resource(void)
+{
+       if(OC_STACK_NO_OBSERVERS == OCNotifyAllObservers(g_firmware_resource->resource_handle, OC_HIGH_QOS)) {
+               FWR_LOGD("Firmware-Resource doesn't have any observers.");
+       }
+}
+
+
+void _handle_update_command(int64_t update_type)
+{
+       if (g_strcmp0(g_firmware_resource->package_uri, "") && (
+                       (g_firmware_resource->state == 0 && update_type == FMWUP_EXEC_DOWNLOAD) ||
+                       (g_firmware_resource->state == 0 && update_type == FMWUP_EXEC_DOWNLOAD_AND_UPGRADE))) {
+               if (g_firmware_resource->new_version && \
+                               g_strcmp0(g_firmware_resource->current_version, g_firmware_resource->new_version)) {
+                       FWR_LOGD("***Downloading image from [%s] ***", g_firmware_resource->package_uri);
+                       g_firmware_resource->state = FMWUP_STATE_DOWNLOADING;
+                       g_firmware_resource->result = 0;
+                       fmwup_propagate_firmware_resource();
+                       if (g_state_changed_cb) {
+                               g_state_changed_cb(g_firmware_resource->state);
+                       }
+
+                       if (fmwup_http_download_file(g_firmware_resource->package_uri, (const char *)g_download_path) != 0) {
+                               g_firmware_resource->state = FMWUP_STATE_IDLE;
+                               vconf_set_int(VCONF_FIRMWARE_UPDATE_STATE, g_firmware_resource->state);
+                               fmwup_propagate_firmware_resource();
+                               if (g_state_changed_cb) {
+                                       g_state_changed_cb(g_firmware_resource->state);
+                               }
+                               return;
+                       }
+
+                       FWR_LOGD("*** Firmware image downloaded ***");
+                       g_firmware_resource->state = FMWUP_STATE_DOWNLOADED;
+                       vconf_set_int(VCONF_FIRMWARE_UPDATE_STATE, g_firmware_resource->state);
+
+                       fmwup_propagate_firmware_resource();
+                       if (g_state_changed_cb) {
+                               g_state_changed_cb(g_firmware_resource->state);
+                       }
+               } else {
+                       /* LOG("No need to upgrade to new firmware [%s] from [%s]", \
+                               g_firmware_resource->new_version, g_firmware_resource->current_version); */
+                       return;
+               }
+       }
+
+       if (g_firmware_resource->state == FMWUP_STATE_DOWNLOADED) {
+               if (update_type == FMWUP_EXEC_UPGRADE || update_type == FMWUP_EXEC_DOWNLOAD_AND_UPGRADE) {
+                       g_firmware_resource->state = FMWUP_STATE_UPDATING;
+                       vconf_set_int(VCONF_FIRMWARE_UPDATE_STATE, g_firmware_resource->state);
+                       fmwup_propagate_firmware_resource();
+                       if (g_state_changed_cb) {
+                               g_state_changed_cb(g_firmware_resource->state);
+                       }
+
+                       _exec_update();
+               }
+       }
+}
+
+OCRepPayload* _construct_response_of_firmware()
+{
+       FWR_LOGD("_construct_response_of_firmware()");
+       OCRepPayload* payload = OCRepPayloadCreate();
+       if (!payload) {
+               FWR_LOGD("Failed to allocate Payload");
+               return NULL;
+       }
+
+       OCRepPayloadSetUri(payload, OC_RSRVD_FIRMWARE_URI);
+
+       OCRepPayloadAddInterface(payload, OC_RSRVD_INTERFACE_DEFAULT);
+       OCRepPayloadAddResourceType(payload, OC_RSRVD_FIRMWARE_RES_TYPE);
+
+       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_STATE, (int64_t)g_firmware_resource->state);
+       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_RESULT, (int64_t)g_firmware_resource->result);
+       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_UPDATE, (int64_t)g_firmware_resource->update);
+       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_PROGRESS, (int64_t)g_firmware_resource->progress);
+       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_UPDATE_TIME, g_firmware_resource->update_time);
+
+       OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_CURRENT_VERSION, g_firmware_resource->current_version);
+       OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_NEW_VERSION, g_firmware_resource->new_version);
+       OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_PACKAGE_URI, g_firmware_resource->package_uri);
+       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_PACKAGE_SIZE, g_firmware_resource->package_size);
+       OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_PACKAGE_MD5, g_firmware_resource->package_md5);
+
+       OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_VENDER, g_firmware_resource->manufacturer);
+       OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_MODEL, g_firmware_resource->model_name);
+
+       OCRepPayloadSetPropBool(payload, OC_RSRVD_FIRMWARE_ACTIVE_CHECK, g_firmware_resource->active_check);
+
+
+       return payload;
+}
+
+void *_worker(void *data)
+{
+       int64_t exec_type = *(int64_t *)data;
+       _handle_update_command(exec_type);
+       g_free(data);
+
+       return NULL;
+}
+
+
+void _update_firmware_resource(OCRepPayload *input)
+{
+       char *new_firmware = NULL;
+       if (OCRepPayloadGetPropString(input, OC_RSRVD_FIRMWARE_NEW_VERSION, &new_firmware)) {
+               if (g_strcmp0(new_firmware, g_firmware_resource->new_version)) {
+                       g_free(g_firmware_resource->new_version);
+                       g_firmware_resource->new_version = g_strdup(new_firmware);
+                       vconf_set_str(VCONF_FIRMWARE_UPDATE_PACKAGE_NEW_VERSION, new_firmware);
+                       if (g_state_changed_cb) {
+                               g_state_changed_cb(g_firmware_resource->state);
+                       }
+               }
+               g_free(new_firmware);
+               FWR_LOGD("g_firmware_resource->new_version = [%s]", g_firmware_resource->new_version);
+       }
+
+       char *package_uri = NULL;
+       if (OCRepPayloadGetPropString(input, OC_RSRVD_FIRMWARE_PACKAGE_URI, &package_uri)) {
+               if (g_strcmp0(package_uri, g_firmware_resource->package_uri)) {
+                       g_free(g_firmware_resource->package_uri);
+                       g_firmware_resource->package_uri = g_strdup(new_firmware);
+                       vconf_set_str(VCONF_FIRMWARE_UPDATE_PACKAGE_URL, new_firmware);
+               }
+               g_free(package_uri);
+               FWR_LOGD("g_firmware_resource->package_uri = [%s]", g_firmware_resource->package_uri);
+       }
+
+       int64_t package_size;
+       if (OCRepPayloadGetPropInt(input, OC_RSRVD_FIRMWARE_PACKAGE_SIZE, &package_size)) {
+               g_firmware_resource->package_size = package_size;
+               vconf_set_dbl(VCONF_FIRMWARE_UPDATE_PACKAGE_SIZE, (double)package_size);
+               FWR_LOGD("g_firmware_resource->package_size = [%lld]", package_size);
+       }
+
+       char *package_md5 = NULL;
+       if (OCRepPayloadGetPropString(input, OC_RSRVD_FIRMWARE_PACKAGE_MD5, &package_md5)) {
+               if (g_strcmp0(package_md5, g_firmware_resource->package_md5)) {
+                       g_free(g_firmware_resource->package_md5);
+                       g_firmware_resource->package_md5 = g_strdup(package_md5);
+                       vconf_set_str(VCONF_FIRMWARE_UPDATE_PACKAGE_MD5, package_md5);
+               }
+               g_free(package_uri);
+               FWR_LOGD("g_firmware_resource->package_md5 = [%s]", g_firmware_resource->package_md5);
+       }
+
+       int64_t update_time;
+       if (OCRepPayloadGetPropInt(input, OC_RSRVD_FIRMWARE_UPDATE_TIME, &update_time)) {
+               g_firmware_resource->update_time = update_time;
+               FWR_LOGD("g_firmware_resource->update_time = [%lld]", update_time);
+               /* TODO : Check Scheduled update , */
+       }
+
+       int64_t *update = (int64_t *)calloc(1, sizeof(int64_t));
+       if (!update) {
+               FWR_LOGD("Memory allocation error!");
+               return;
+       }
+
+       if (OCRepPayloadGetPropInt(input, OC_RSRVD_FIRMWARE_UPDATE, update)) {
+               FWR_LOGD("update command = [%lld]", *update);
+               g_firmware_resource->update = *update;
+               pthread_t pThread;
+               pthread_create(&pThread, NULL, _worker, update);
+       } else {
+               free(update);
+       }
+
+
+       fmwup_propagate_firmware_resource();
+}
+
+
+OCEntityHandlerResult _process_get_request(OCEntityHandlerRequest *ehRequest, OCRepPayload **payload)
+{
+       OCRepPayload *getResp = _construct_response_of_firmware(ehRequest);
+       if (!getResp)
+       {
+               FWR_LOGD("constructResponse failed");
+               return OC_EH_ERROR;
+       }
+
+       *payload = getResp;
+
+       return OC_EH_OK;
+}
+
+
+OCEntityHandlerResult _process_post_request(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload)
+{
+       FWR_LOGD("ProcessPostRequest enter");
+       OCEntityHandlerResult ehResult = OC_EH_ERROR;
+       if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
+               FWR_LOGD("Incoming payload not a representation");
+               return ehResult;
+       }
+
+       OCRepPayload* input = (OCRepPayload*)(ehRequest->payload);
+       if (!input) {
+               FWR_LOGD("Failed to parse");
+               return ehResult;
+       }
+
+       _update_firmware_resource(input);
+
+       OCRepPayload *getResp = NULL;
+       getResp = _construct_response_of_firmware();
+
+       if (!getResp) {
+               FWR_LOGD("constructResponse failed");
+               return OC_EH_ERROR;
+       }
+
+       *payload = getResp;
+       ehResult = OC_EH_OK;
+
+       return ehResult;
+}
+
+
+OCEntityHandlerResult fmwup_handle_firmware_entity(OCEntityHandlerFlag flag,
+                                                                               OCEntityHandlerRequest *entityHandlerRequest,
+                                                                               void *callbackParam)
+{
+       OCEntityHandlerResult ehRet = OC_EH_OK;
+       OCEntityHandlerResponse response = { 0, 0, OC_EH_ERROR, 0, 0, \
+                                                                               { }, { 0 }, false };
+       OCRepPayload* payload = NULL;
+
+       if (entityHandlerRequest && (flag & OC_REQUEST_FLAG)) {
+               if (OC_REST_GET == entityHandlerRequest->method) {
+                       FWR_LOGD("Received OC_REST_GET request");
+                       ehRet = _process_get_request(entityHandlerRequest, &payload);
+               } else if (OC_REST_PUT == entityHandlerRequest->method) {
+                       FWR_LOGD("Received OC_REST_PUT request, nothing to do");
+               } else if (OC_REST_POST == entityHandlerRequest->method) {
+                       FWR_LOGD("Received OC_REST_POST from client");
+                       ehRet = _process_post_request(entityHandlerRequest, &payload);
+               }
+
+               if (ehRet == OC_EH_OK) {
+                       response.requestHandle = entityHandlerRequest->requestHandle;
+                       response.resourceHandle = entityHandlerRequest->resource;
+                       response.ehResult = ehRet;
+                       response.payload = (OCPayload*)payload;
+                       response.persistentBufferFlag = 0;
+
+                       // Send the response
+                       if (OCDoResponse(&response) != OC_STACK_OK) {
+                               FWR_LOGD("Error sending response");
+                               ehRet = OC_EH_ERROR;
+                       }
+
+                       if (OC_REST_POST == entityHandlerRequest->method || OC_REST_PUT == entityHandlerRequest->method) {
+                               if (OCNotifyAllObservers(g_firmware_resource->resource_handle, OC_NA_QOS) != OC_STACK_OK) {
+                                       printf("Fail to OCNotifyAllObservers()\n");
+                                       ehRet = OC_EH_ERROR;
+                               }
+                       }
+               }
+       }
+
+       if (entityHandlerRequest && (flag & OC_OBSERVE_FLAG)) {
+               FWR_LOGD("Flag includes OC_OBSERVE_FLAG");
+               if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action) {
+                       FWR_LOGD("Received OC_OBSERVE_REGISTER from client");
+               } else if (OC_OBSERVE_DEREGISTER == entityHandlerRequest->obsInfo.action) {
+                       FWR_LOGD("Received OC_OBSERVE_DEREGISTER from client");
+               }
+       }
+
+       return ehRet;
+}
+
+
+void fmwup_get_firmware_info(fmwup_s *firmware_info)
+{
+       char *manufacturer = NULL;
+       char *model_name = NULL;
+       char *cur_firmware_ver = NULL;
+       char *new_firmware_ver = NULL;
+       double package_size = 0;
+       char *package_md5 = NULL;
+       char *download_url = NULL;
+       int update_state;
+       int update_result;
+
+#if 1
+    OCGetPropertyValue(PAYLOAD_TYPE_PLATFORM, OC_RSRVD_MFG_NAME, (void **)&manufacturer);
+    OCGetPropertyValue(PAYLOAD_TYPE_PLATFORM, OC_RSRVD_MODEL_NUM, (void **)&model_name);
+    OCGetPropertyValue(PAYLOAD_TYPE_PLATFORM, OC_RSRVD_FIRMWARE_VERSION, (void **)&cur_firmware_ver);
+#else
+       if (system_info_get_platform_string("http://tizen.org/system/manufacturer", &manufacturer)
+               != SYSTEM_INFO_ERROR_NONE) {
+               FWR_LOGD("system_info_get_platform_string() is failed");
+       }
+
+       if (system_info_get_platform_string("http://tizen.org/system/model_name", &model_name)
+               != SYSTEM_INFO_ERROR_NONE) {
+               FWR_LOGD("system_info_get_platform_string() is failed");
+       }
+
+       if (system_info_get_platform_string("http://tizen.org/system/build.version.release", &cur_firmware_ver)
+               != SYSTEM_INFO_ERROR_NONE) {
+               FWR_LOGD("system_info_get_platform_string() is failed");
+       }
+#endif
+
+       if (vconf_get_int(VCONF_FIRMWARE_UPDATE_STATE, &update_state) != 0) {
+               FWR_LOGD("vconf_get_int() is failed");
+       }
+
+       if (vconf_get_int(VCONF_FIRMWARE_UPDATE_RESULT, &update_result) != 0) {
+               FWR_LOGD("vconf_get_int() is failed");
+       }
+
+       if (vconf_get_dbl(VCONF_FIRMWARE_UPDATE_PACKAGE_SIZE, &package_size) != 0) {
+               FWR_LOGD("vconf_get_dbl() is failed");
+       }
+       new_firmware_ver = vconf_get_str(VCONF_FIRMWARE_UPDATE_PACKAGE_NEW_VERSION);
+       package_md5 = vconf_get_str(VCONF_FIRMWARE_UPDATE_PACKAGE_MD5);
+       download_url = vconf_get_str(VCONF_FIRMWARE_UPDATE_PACKAGE_URL);
+
+       FWR_LOGD("manufacturer=[%s]", manufacturer);
+       FWR_LOGD("model_name=[%s]", model_name);
+
+       FWR_LOGD("firmware_ver=[%s]", cur_firmware_ver);
+       FWR_LOGD("firmware_new_ver=[%s]", new_firmware_ver);
+       FWR_LOGD("firmware_package_url=[%s]", download_url);
+       FWR_LOGD("firmware_md5=[%s]", package_md5);
+       FWR_LOGD("firmware_package_size=[%lld]", (int64_t)package_size);
+
+       FWR_LOGD("firmware_update_state=[%d]", update_state);
+       FWR_LOGD("firmware_update_result=[%d]", update_result);
+
+       firmware_info->manufacturer = g_strdup(manufacturer);
+       firmware_info->model_name = g_strdup(model_name);
+
+       firmware_info->current_version = g_strdup(cur_firmware_ver);
+       firmware_info->new_version = g_strdup(new_firmware_ver);
+       firmware_info->package_uri = g_strdup(download_url);
+       firmware_info->package_md5 = g_strdup(package_md5);
+       firmware_info->package_size = (int64_t)package_size;
+
+       firmware_info->state = update_state;
+       firmware_info->result = update_result;
+
+       g_free(manufacturer);
+       g_free(model_name);
+
+       g_free(package_md5);
+       g_free(new_firmware_ver);
+       g_free(cur_firmware_ver);
+       g_free(download_url);
+}
+
index 3bc4a3939bfc9817c6466144fecda5cbfc6920e6..9223853db0288b7dba410654fe52fe18c0798d7b 100644 (file)
@@ -1,10 +1,10 @@
-set(testapp "controlee_firmware_test")
+set(testapp "fmwup_test")
 
 ADD_DEFINITIONS(-D__WITH_DTLS__ -D__WITH_TLS__ -DRD_CLIENT -D_USE_WWST_)
 #ADD_DEFINITIONS(-DRD_CLIENT)
 
-SET(CONTROLEE_FIRMWARE_TEST_SRCS
-    ${CMAKE_CURRENT_SOURCE_DIR}/controlee_firmware_test.c
+SET(FMWUP_TEST_SRCS
+    ${CMAKE_CURRENT_SOURCE_DIR}/fmwup_test.c
 )
 
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../inc)
@@ -18,8 +18,8 @@ INCLUDE_DIRECTORIES(${test_pkgs_INCLUDE_DIRS})
 LINK_DIRECTORIES(${test_pkgs_LIBRARY_DIRS})
 
 FIND_LIBRARY(RD_LIB NAMES resource_directory PATHS /usr/lib)
-SET(LIBNAME controlee_firmware_resource)
-ADD_EXECUTABLE(${testapp} ${CONTROLEE_FIRMWARE_TEST_SRCS})
+SET(LIBNAME fmwup_resource)
+ADD_EXECUTABLE(${testapp} ${FMWUP_TEST_SRCS})
 TARGET_LINK_LIBRARIES(${testapp} ${test_pkgs_LIBRARIES} ${LIBNAME} ${RD_LIB} -lpthread)
 
 INSTALL(TARGETS ${testapp} DESTINATION bin/)
diff --git a/test/controlee_firmware_test.c b/test/controlee_firmware_test.c
deleted file mode 100644 (file)
index a7d28ef..0000000
+++ /dev/null
@@ -1,1360 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <glib.h>
-#include <gio/gio.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <pthread.h>
-
-#include <ocstack.h>
-#include <ocpayload.h>
-#include <octypes.h>
-#include <rd_client.h>
-#ifdef _USE_WWST_
-#include <oickeepalive.h>
-#endif
-#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
-#include <ocprovisioningmanager.h>
-#endif
-
-#include <ckmc/ckmc-manager.h>
-
-#include <controlee_firmware_resource.h>
-
-
-#define DEFAULT_CONTEXT_VALUE 0x99
-#define LOGIN_OK 4
-
-#define OC_CONTROLEE_DAT_FILE_PATH             "/opt/usr/data/ua-client/oic_svr_db_client.dat"
-#ifdef _USE_WWST_
-#define OC_SECURITY_SQL_DB_FILE_NAME   "/opt/usr/data/ua-client/PDM.db"
-#define CERT_FILE_PATH                                 "/opt/usr/data/ua-client/thawte.cert.pem"
-#endif
-
-OCResourceHandle res_handle[2];
-
-OCPersistentStorage *ps;
-
-#ifdef _USE_WWST_
-#define CLOUD_STG_SERVER                       "52.202.112.20:443"
-#define CLOUD_DEV_SERVER                       "54.86.109.131:443"
-#define CLOUD_AUTH_PROVIDER            "samsung-us"
-#define CLOUD_DEVICE_TYPE              "device"
-#define CLOUD_PROTOCOL                 "coaps+tcp://"
-#else
-#define CLOUD_STG_SERVER                       "52.78.68.250:5683"
-#define CLOUD_AUTH_PROVIDER            "tdc"
-#define CLOUD_PROTOCOL                 "coap+tcp://"
-#endif
-
-#define DEVICE_ID                      "di"
-#define CLIENT_ID                      "clientid"
-#define AUTH_PROVIDER          "authprovider"
-#define DEVICE_TYPE                    "devicetype"
-#define ACCESS_TOKEN           "accesstoken"
-#define USER_ID                                "uid"
-#define CLOUD_LOGIN                    "login"
-#define AUTH_CODE                      "authcode"
-
-#define CLOUD_ACCOUNT_RES_TYPE         "oic.wk.account"
-#define CLOUD_SESSION_RES_TYPE         "oic.wk.session"
-
-#define MAX_INTERVAL_NUMBER (4)
-
-typedef struct
-{
-       char *deviceId;
-       char *clientId;
-       char *authCode;
-       char *uid;
-       char *accessToken;
-       char *refreshToken;
-       char *codeVerifier;
-
-#ifdef _USE_WWST_
-       uint8_t *certificate;
-       size_t certificateLength;
-       OicEncodingType_t encodingType;
-#endif
-} CloudLoginInfo;
-
-bool g_auto_publish;
-bool bSignin;
-bool isExit;
-uint16_t g_cred_id = 0;
-CloudLoginInfo loginDetails;
-
-static pthread_mutex_t pingcycle_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t _lock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t _cond = PTHREAD_COND_INITIALIZER;
-static bool is_ping_timer = false;
-
-
-OCPlatformInfo g_platform_info = {
-               "1234",                           /* platformID */
-               "Samsung",                        /* manufacturerName */
-               "https://www.example.com",        /* manufacturerUrl */
-               "Tizen2017-AAA",                  /* modelNumber */
-               "2017-07-19",                     /* dateOfManufacture */
-               "AAA",                            /* platformVersion */
-               "4.0",                            /* operatingSystemVersion */
-               "HW-001",                         /* hardwareVersion */
-               "1.0",                            /* firmwareVersion */
-               "https://www.examplesupport.com", /* supportUrl */
-               "2017-07-19T12.00"                /* systemTime */
-};
-
-bool switch_power;
-
-
-int _signin();
-int _signup();
-int _publish_fw_res_to_rd();
-
-int _set_auth_cert_info()
-{
-#ifdef _USE_WWST_
-       char *certFile = CERT_FILE_PATH;
-       ckmc_cert_s* cert = NULL;
-       int ret_cert = ckmc_load_cert_from_file(certFile, &cert);
-       if (CKMC_ERROR_NONE != ret_cert) {
-               printf("ckmc_load_cert_from_file error [%d]\n", ret_cert);
-               return -1;
-       }
-
-       loginDetails.certificate = cert->raw_cert;
-       loginDetails.certificateLength = cert->cert_size;
-       loginDetails.encodingType = OIC_ENCODING_PEM;
-
-       if (loginDetails.certificate) {
-               printf("Save cert file Data\n");
-               if (OCSaveTrustCertChain(loginDetails.certificate, loginDetails.certificateLength, \
-                               loginDetails.encodingType, &g_cred_id) != OC_STACK_OK) {
-                       printf("OCSaveTrustCertChain() failed\n");
-                       return -1;
-               } else {
-                       printf("Cred ID from saveCertFile = [%d]\n", g_cred_id);
-               }
-       }
-#endif
-       return 0;
-}
-
-void _lock_and_wait()
-{
-       pthread_mutex_init(&_lock, NULL);
-       pthread_cond_init(&_cond, NULL);
-
-       pthread_mutex_lock(&_lock);
-       pthread_cond_wait(&_cond, &_lock);
-       pthread_mutex_unlock(&_lock);
-}
-
-void _cond_signal()
-{
-       pthread_mutex_lock(&_lock);
-       pthread_cond_signal(&_cond);
-       pthread_mutex_unlock(&_lock);
-}
-
-static FILE *_client_open(const char *path, const char *mode)
-{
-       (void)path;
-
-       if (!strcmp(mode, "rb"))
-               mode = strdup("r");
-       else if(!strcmp(mode, "wb"))
-               mode = strdup("w");
-
-       printf("path [%s], mode[%s]", path, mode);
-       return fopen(OC_CONTROLEE_DAT_FILE_PATH, mode);
-}
-
-
-static void _parse_payload(OCRepPayload *payload)
-{
-       if (!payload)
-               return;
-
-#ifdef _USE_WWST_
-       char *sid, *certificate;
-       if (!OCRepPayloadGetPropString(payload, "sid", &sid))
-               printf("Can't get 'sid'\n");
-
-       if (!OCRepPayloadGetPropString(payload, "certificate", &certificate))
-               printf("Can't get 'certificate'\n");
-#else
-       if (!OCRepPayloadGetPropString(payload, USER_ID, &loginDetails.uid))
-               printf("Can't get 'uid'\n");
-
-       if (!OCRepPayloadGetPropString(payload, ACCESS_TOKEN, &loginDetails.accessToken))
-               printf("Can't get 'access_token'\n");
-#endif
-
-}
-
-#ifdef _USE_WWST_
-static OCStackApplicationResult _send_keep_alive_cb(void *context, OCDoHandle handle,
-                                                       OCClientResponse * clientResponse)
-{
-       (void)context;
-       (void)handle;
-
-       if (!clientResponse) {
-               printf("clientResponse is NULL!\n");
-               return OC_STACK_DELETE_TRANSACTION;
-       }
-
-       printf("_send_keep_alive_cb() is called, result=[%d]\n", clientResponse->result);
-
-       if(clientResponse->result > OC_STACK_RESOURCE_CHANGED) {
-               pthread_detach(pthread_self());
-               pthread_mutex_lock(&pingcycle_mutex);
-               is_ping_timer = false;
-               pthread_mutex_unlock(&pingcycle_mutex);
-               pthread_exit(NULL);
-       }
-
-       return OC_STACK_DELETE_TRANSACTION;
-}
-
-static void *_send_keep_alive(void *data)
-{
-       OCStackResult ocResult = OC_STACK_ERROR;
-       int i = 0;
-       int timeout = 0;
-       int timer_count = 0;
-
-       int64_t *array = (int64_t *)data;
-
-       while (is_ping_timer) {
-               if(timeout == timer_count) {
-                       timer_count = 0;
-
-                       if(i >= MAX_INTERVAL_NUMBER)
-                               i = MAX_INTERVAL_NUMBER - 1;
-
-                       OCRepPayload *keepAlivePayload = OCRepPayloadCreate();
-                       if (!keepAlivePayload) break;
-
-                       OCRepPayloadSetPropInt(keepAlivePayload, "in", (int64_t)array[i]);
-                       timeout = array[i] * 60;
-                       ++i;
-
-                       char uri[MAX_URI_LENGTH] = { 0 };
-                       snprintf(uri, MAX_URI_LENGTH, "%s%s", CLOUD_PROTOCOL, CLOUD_STG_SERVER);
-
-                       OCCallbackData cbData = {0,};
-                       cbData.cb = _send_keep_alive_cb;
-
-                       ocResult = OCSendKeepAliveRequest(NULL, uri, (OCPayload *)keepAlivePayload, &cbData);
-                       printf("sendKeepAliveRequest() result : %d\n", ocResult);
-                       if (OC_STACK_OK != ocResult) {
-                               pthread_detach(pthread_self());
-                               pthread_mutex_lock(&pingcycle_mutex);
-                               is_ping_timer = false;
-                               pthread_mutex_unlock(&pingcycle_mutex);
-                               pthread_exit(NULL);
-                       }
-               }
-               pthread_mutex_lock(&pingcycle_mutex);
-               ++timer_count;
-               pthread_mutex_unlock(&pingcycle_mutex);
-               sleep(1);
-       }
-
-       return NULL;
-}
-
-static void _keep_alive_cb(OCRepPayload *payload)
-{
-       printf("_keep_alive_cb() is called\n");
-
-       if (!payload)
-               return;
-
-       int64_t *array = NULL;
-       size_t dim[MAX_REP_ARRAY_DEPTH];
-       bool ocBoolResult = false;
-
-       ocBoolResult = OCRepPayloadGetIntArray(payload, "inarray", &array, dim);
-       printf("OCRepPayloadGetStringArray() return = [%d]\n", ocBoolResult);
-
-       if (ocBoolResult == true && array) {
-               pthread_mutex_lock(&pingcycle_mutex);
-               is_ping_timer = true;
-               pthread_mutex_unlock(&pingcycle_mutex);
-
-               pthread_t _keep_alive_thd;
-               pthread_create(&_keep_alive_thd, NULL, _send_keep_alive, (void *)array);
-       } else {
-               pthread_detach(pthread_self());
-               pthread_mutex_lock(&pingcycle_mutex);
-               is_ping_timer = false;
-               pthread_mutex_unlock(&pingcycle_mutex);
-               pthread_exit(NULL);
-       }
-
-       return;
-}
-#endif
-
-void _set_platform_info()
-{
-       printf("_set_platform_info() is called\n");
-
-       if (OCSetPlatformInfo(g_platform_info) == OC_STACK_OK) {
-               printf("Platform Registration is succeeded\n");
-       } else {
-               printf("Platform Registration is failed\n");
-       }
-}
-
-
-void _set_device_info()
-{
-       printf("_set_device_info() is called\n");
-
-       OCDeviceInfo devInfoAirConditioner;
-       OCStringLL deviceType;
-
-#ifdef _USE_WWST_
-       deviceType.value = g_strdup("oic.d.switch");
-#else
-       deviceType.value = g_strdup("oic.d.airconditioner");
-#endif
-
-       deviceType.next = NULL;
-       devInfoAirConditioner.deviceName = g_strdup("FAC_2016");
-       devInfoAirConditioner.types = &deviceType;
-       devInfoAirConditioner.specVersion = NULL;
-       devInfoAirConditioner.dataModelVersions = NULL;
-
-       if (OCSetDeviceInfo(devInfoAirConditioner) != OC_STACK_OK) {
-               printf("OCSetDeviceInfo() failed\n");
-       } else {
-               printf("OCSetDeviceInfo() Success\n");
-       }
-}
-
-void _get_login_info()
-{
-#ifdef _USE_WWST_
-       char tmp[64];
-
-       printf("Enter access_token : ");
-       memset(tmp, 0x00, sizeof(tmp));
-       scanf("%s", tmp);
-       loginDetails.accessToken = g_strdup(tmp);
-       printf("access_token : %s\n", loginDetails.accessToken);
-
-       printf("Enter refresh_token : ");
-       memset(tmp, 0x00, sizeof(tmp));
-       scanf("%s", tmp);
-       loginDetails.refreshToken = g_strdup(tmp);
-       printf("refresh_token : %s\n", loginDetails.refreshToken);
-
-       printf("Enter user_id : ");
-       memset(tmp, 0x00, sizeof(tmp));
-       scanf("%s", tmp);
-       loginDetails.uid = g_strdup(tmp);
-       printf("user_id : %s\n", loginDetails.uid);
-
-       printf("Enter client_id : ");
-       memset(tmp, 0x00, sizeof(tmp));
-       scanf("%s", tmp);
-       loginDetails.clientId = g_strdup(tmp);
-       printf("client_id : %s\n", loginDetails.clientId);
-#endif
-       loginDetails.deviceId = g_strdup(OCGetServerInstanceIDString());
-       printf("Device ID = [%s]\n", loginDetails.deviceId);
-
-}
-
-#ifdef _USE_WWST_
-static OCStackApplicationResult _handle_keepalive_cb(void *context, OCDoHandle handle,
-                                                                       OCClientResponse * clientResponse)
-{
-       (void)context;
-       (void)handle;
-
-       if (!clientResponse) {
-               printf("Received NULL clientResponse\n");
-               return OC_STACK_DELETE_TRANSACTION;
-       }
-
-       if (clientResponse->result == OC_STACK_OK) {
-               _keep_alive_cb((OCRepPayload*)clientResponse->payload);
-       }
-
-       return OC_STACK_KEEP_TRANSACTION;
-}
-
-
-void *_ping_timer(void *timer)
-{
-       OCStackResult ocResult = OC_STACK_ERROR;
-       (void)timer;
-
-       char uri[MAX_URI_LENGTH] = { 0 };
-       snprintf(uri, MAX_URI_LENGTH, "%s%s", CLOUD_PROTOCOL, CLOUD_STG_SERVER);
-
-       OCCallbackData keepAliveCb = {0,};
-       keepAliveCb.cb = _handle_keepalive_cb;
-       ocResult = OCFindKeepAliveResource(NULL, uri, &keepAliveCb);
-       printf("OCFindKeepAliveResource() result : %d\n", ocResult);
-
-       if (OC_STACK_OK != ocResult) {
-               pthread_detach(pthread_self());
-               pthread_mutex_lock(&pingcycle_mutex);
-               is_ping_timer = false;
-               pthread_mutex_unlock(&pingcycle_mutex);
-               pthread_exit(NULL);
-       }
-
-       return NULL;
-}
-#endif
-
-static OCStackApplicationResult _handle_signin_response(void *ctx,
-                                                                         OCDoHandle handle,
-                                                                         OCClientResponse *response)
-{
-       (void)(ctx);
-       (void)(handle);
-
-       if (!response) {
-               printf("Received NULL response\n");
-               return OC_STACK_DELETE_TRANSACTION;
-       }
-
-       if (response->payload) {
-               printf("Payload received\n");
-       }
-
-       if (response->result != LOGIN_OK) {
-               printf("Login error: %d\n", response->result);
-
-               pthread_mutex_lock(&pingcycle_mutex);
-               is_ping_timer = false;
-               pthread_mutex_unlock(&pingcycle_mutex);
-       } else {
-               bSignin = true;
-               printf("Sign-In Success!!!\n");
-
-               sleep(1);
-               if (g_auto_publish) {
-                       if (_publish_fw_res_to_rd() != 0) {
-                               printf("publish failed!!!\n");
-                       }
-               }
-
-#ifdef _USE_WWST_
-               pthread_t pingThread;
-               pthread_mutex_lock(&pingcycle_mutex);
-               is_ping_timer = true;
-               pthread_mutex_unlock(&pingcycle_mutex);
-
-               int ret = pthread_create(&pingThread, NULL, _ping_timer, NULL);
-               if (ret != 0)
-                       printf("ping pthread_create fail!\n");
-#endif
-       }
-
-       return OC_STACK_KEEP_TRANSACTION;
-
-}
-
-static OCStackApplicationResult _handle_signup_response(void *ctx,
-                                                                         OCDoHandle handle,
-                                                                         OCClientResponse *response)
-{
-       (void)(ctx);
-       (void)(handle);
-
-       if (!response) {
-               printf("Received NULL response\n");
-               return OC_STACK_DELETE_TRANSACTION;
-       }
-
-       if (response->result != LOGIN_OK) {
-               printf("Login error: %d\n", response->result);
-       } else {
-               _parse_payload((OCRepPayload*)response->payload);
-               printf("Sign-Up OK!!!\n");
-               sleep(1);
-               _signin();
-       }
-
-       return OC_STACK_KEEP_TRANSACTION;
-}
-
-
-static OCStackApplicationResult _handle_signout_response(void *ctx,
-                                                                         OCDoHandle handle,
-                                                                         OCClientResponse *response)
-{
-       (void)(ctx);
-       (void)(handle);
-
-       if (response) {
-               if (response->result == LOGIN_OK)
-                       printf("Sign-Out Success!!!\n");
-               else
-                       printf("Sign-Out Failed [%d]!!!\n", response->result);
-       }
-
-       bSignin = false;
-       pthread_mutex_lock(&pingcycle_mutex);
-       is_ping_timer = FALSE;
-       pthread_mutex_unlock(&pingcycle_mutex);
-
-       return OC_STACK_DELETE_TRANSACTION;
-}
-
-
-int _signin()
-{
-       char uri[MAX_URI_LENGTH] = { 0 };
-       snprintf(uri, MAX_URI_LENGTH, "%s%s%s?rt=%s;if=%s",
-                       CLOUD_PROTOCOL, CLOUD_STG_SERVER, OC_RSRVD_ACCOUNT_SESSION_URI, CLOUD_SESSION_RES_TYPE, OC_RSRVD_INTERFACE_DEFAULT);
-       printf("server uri=[%s]\n", uri);
-
-       OCCallbackData cbData;
-       memset(&cbData, 0, sizeof(OCCallbackData));
-       cbData.cb = _handle_signin_response;
-       cbData.cd = NULL;
-       cbData.context = (void *) DEFAULT_CONTEXT_VALUE;
-
-       OCRepPayload *payload = OCRepPayloadCreate();
-       if (!payload) return -1;
-
-       OCRepPayloadSetPropString(payload, DEVICE_ID, (const char *)loginDetails.deviceId);
-       OCRepPayloadSetPropString(payload, ACCESS_TOKEN, (const char *)loginDetails.accessToken);
-       OCRepPayloadSetPropString(payload, USER_ID, (const char *)loginDetails.uid);
-       OCRepPayloadSetPropBool(payload, CLOUD_LOGIN, true);
-//     OCRepPayloadAddResourceType(payload, CLOUD_SESSION_RES_TYPE);
-//     OCRepPayloadAddInterface(payload, OC_RSRVD_INTERFACE_DEFAULT);
-
-       int ret;
-       if (OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
-                                       CT_ADAPTER_TCP|CT_IP_USE_V4, OC_LOW_QOS, &cbData, NULL, 0) == OC_STACK_OK) {
-               ret = 0;
-               printf("OCDoResource() is succeeded\n");
-       } else {
-               ret = -1;
-               printf("OCDoResource() is failed\n");
-       }
-
-       return ret;
-}
-
-
-int _signup()
-{
-
-       if (bSignin == true) {
-               printf("Already signed-in!\n");
-               return -1;
-       }
-
-       memset(&loginDetails, 0x00, sizeof(CloudLoginInfo));
-       _get_login_info();
-
-       _set_auth_cert_info();
-
-       char uri[MAX_URI_LENGTH] = { 0 };
-       snprintf(uri, MAX_URI_LENGTH, "%s%s%s?rt=%s;if=%s",
-                       CLOUD_PROTOCOL, CLOUD_STG_SERVER, OC_RSRVD_ACCOUNT_URI, CLOUD_ACCOUNT_RES_TYPE, OC_RSRVD_INTERFACE_DEFAULT);
-       printf("server uri=[%s]\n", uri);
-
-       OCCallbackData cbData;
-       memset(&cbData, 0, sizeof(OCCallbackData));
-       cbData.cb = _handle_signup_response;
-       cbData.cd = NULL;
-       cbData.context = (void *) DEFAULT_CONTEXT_VALUE;
-
-       OCRepPayload *payload = OCRepPayloadCreate();
-       if (!payload) return -1;
-
-       OCRepPayloadSetPropString(payload, AUTH_PROVIDER, CLOUD_AUTH_PROVIDER);
-#ifdef _USE_WWST_
-       OCRepPayloadSetPropString(payload, DEVICE_TYPE, CLOUD_DEVICE_TYPE);
-       OCRepPayloadSetPropString(payload, DEVICE_ID, (const char *)loginDetails.deviceId);
-       OCRepPayloadSetPropString(payload, CLIENT_ID, (const char *)loginDetails.clientId);
-       OCRepPayloadSetPropString(payload, ACCESS_TOKEN, (const char *)loginDetails.accessToken);
-       OCRepPayloadSetPropString(payload, USER_ID, (const char *)loginDetails.uid);
-//     OCRepPayloadAddResourceType(payload, CLOUD_ACCOUNT_RES_TYPE);
-//     OCRepPayloadAddInterface(payload, OC_RSRVD_INTERFACE_DEFAULT);
-#else
-       OCRepPayloadSetPropString(payload, AUTH_CODE, "123123123");
-       OCRepPayloadSetPropString(payload, DEVICE_ID, loginDetails.deviceId);
-#endif
-
-       int ret;
-       if (OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
-                                       CT_ADAPTER_TCP|CT_IP_USE_V4, OC_LOW_QOS, &cbData, NULL, 0) == OC_STACK_OK) {
-               ret = 0;
-               printf("OCDoResource() is succeeded\n");
-       } else {
-               ret = -1;
-               printf("OCDoResource() is failed\n");
-       }
-
-       return ret;
-}
-
-
-int _signout()
-{
-       char uri[MAX_URI_LENGTH] = { 0 };
-       snprintf(uri, MAX_URI_LENGTH, "%s%s%s",
-                       CLOUD_PROTOCOL, CLOUD_STG_SERVER, OC_RSRVD_ACCOUNT_SESSION_URI);
-       printf("server uri=[%s]\n", uri);
-
-       OCCallbackData cbData;
-       memset(&cbData, 0, sizeof(OCCallbackData));
-       cbData.cb = _handle_signout_response;
-       cbData.cd = NULL;
-       cbData.context = (void *) DEFAULT_CONTEXT_VALUE;
-
-       OCRepPayload *payload = OCRepPayloadCreate();
-       if (!payload) return -1;
-
-       OCRepPayloadSetPropString(payload, DEVICE_ID, (const char *)loginDetails.deviceId);
-       OCRepPayloadSetPropString(payload, ACCESS_TOKEN, (const char *)loginDetails.accessToken);
-       OCRepPayloadSetPropString(payload, USER_ID, (const char *)loginDetails.uid);
-       OCRepPayloadSetPropBool(payload, CLOUD_LOGIN, false);
-
-       int ret;
-       if (OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
-                                       CT_ADAPTER_TCP|CT_IP_USE_V4, OC_LOW_QOS, &cbData, NULL, 0) == OC_STACK_OK) {
-               ret = 0;
-               printf("OCDoResource() is succeeded\n");
-       } else {
-               ret = -1;
-               printf("OCDoResource() is failed\n");
-       }
-
-       return ret;
-}
-
-bool _compare_resource_interface(char *from, char *iface)
-{
-       char *str = g_strdup(from);
-       char *ptr = strtok(str, ";");
-
-       if(ptr == NULL) {
-               return false;
-       }
-
-       do {
-               if(strstr(ptr, ".if.")) {
-                       char *if_ptr = NULL;
-                       if_ptr = strtok(ptr, "=");
-                       if_ptr = strtok(NULL, "=");
-
-                       if(!g_strcmp0(if_ptr, iface)) {
-                               return true;
-                       }
-               }
-       } while ((ptr = strtok(NULL, ";")));
-
-       return false;
-}
-
-
-OCEntityHandlerResult _check_request_payload(OCEntityHandlerRequest *ehRequest)
-{
-       if( !(ehRequest->query) || \
-                       (ehRequest->query && (g_strcmp0(ehRequest->query, "") && \
-                       !_compare_resource_interface(ehRequest->query, OC_RSRVD_INTERFACE_DEFAULT))))
-       {
-               printf("Not supported Interface\n");
-               return OC_EH_BAD_REQ;
-       }
-
-       return OC_EH_OK;
-}
-
-
-OCRepPayload * _construct_response_of_device(OCEntityHandlerRequest *ehRequest)
-{
-       OCRepPayload* input = (OCRepPayload*)(ehRequest->payload);
-
-       if (OC_REST_PUT == ehRequest->method || OC_REST_POST == ehRequest->method) {
-               /* Get pointer to query */
-               bool power;
-               if (OCRepPayloadGetPropBool(input, "value", &power)) {
-                       switch_power = power;
-                       printf("Client Set Power : %d\n", power);
-               }
-       }
-
-       OCRepPayload *payload = OCRepPayloadCreate();
-
-       if (!payload) {
-               printf("Failed to allocate Payload\n");
-               return NULL;
-       }
-
-       printf("Client Set payload Power : %d\n", switch_power);
-       OCRepPayloadSetPropBool(payload, "value", switch_power);
-
-       return payload;
-}
-
-static OCEntityHandlerResult _handle_get_request(OCEntityHandlerRequest *ehRequest, OCRepPayload **payload)
-{
-       OCEntityHandlerResult ehResult = OC_EH_ERROR;
-       if (!ehRequest) {
-               printf("Request is Null\n");
-               return ehResult;
-       }
-
-       if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
-               printf("Incoming payload not a representation\n");
-               return ehResult;
-       }
-
-       OCRepPayload *getResp = NULL;
-       *payload = NULL;
-
-       if(ehRequest->resource == res_handle[0]) {
-               if(_check_request_payload(ehRequest) != OC_EH_OK) {
-                       printf("Not supported Interface\n");
-                       return OC_EH_BAD_REQ;
-               } else {
-                       getResp = _construct_response_of_device(ehRequest);
-               }
-       }
-
-       if (!getResp) {
-               printf("constructResponse failed\n");
-               return OC_EH_ERROR;
-       }
-
-       *payload = getResp;
-
-       ehResult = OC_EH_OK;
-
-       return ehResult;
-}
-
-
-static OCEntityHandlerResult _handle_post_request(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload)
-{
-       printf("ProcessPostRequest enter\n");
-       OCEntityHandlerResult ehResult = OC_EH_ERROR;
-       if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
-               printf("Incoming payload not a representation\n");
-               return ehResult;
-       }
-
-       OCRepPayload *getResp = NULL;
-       *payload = NULL;
-
-       if(ehRequest->resource == res_handle[0]) {
-               if(_check_request_payload(ehRequest) != OC_EH_OK) {
-                       printf("Not supported Interface\n");
-                       return OC_EH_BAD_REQ;
-               } else {
-                       getResp = _construct_response_of_device(ehRequest);
-               }
-       }
-
-       if (!getResp) {
-               printf("constructResponse failed\n");
-               return OC_EH_ERROR;
-       }
-
-       *payload = getResp;
-
-       ehResult = OC_EH_OK;
-
-       return ehResult;
-}
-
-
-OCEntityHandlerResult _handle_oc_entity(OCEntityHandlerFlag flag,
-                                                                               OCEntityHandlerRequest *entityHandlerRequest,
-                                                                               void *callbackParam)
-{
-       printf("_handle_oc_entity\n");
-       OCEntityHandlerResult ehRet = OC_EH_OK;
-       OCEntityHandlerResponse response = { 0, 0, OC_EH_ERROR, 0, 0, \
-                                                                               { }, { 0 }, false };
-       OCRepPayload* payload = NULL;
-
-       if (entityHandlerRequest && (flag & OC_REQUEST_FLAG)) {
-               if (OC_REST_GET == entityHandlerRequest->method) {
-                       printf("Received OC_REST_GET request\n");
-                       ehRet = _handle_get_request(entityHandlerRequest, &payload);
-               } else if (OC_REST_PUT == entityHandlerRequest->method) {
-                       printf("Received OC_REST_PUT request, from client\n");
-                       ehRet = _handle_post_request(entityHandlerRequest, &payload);
-               } else if (OC_REST_POST == entityHandlerRequest->method) {
-                       printf("Received OC_REST_POST from client\n");
-                       ehRet = _handle_post_request(entityHandlerRequest, &payload);
-               } else {
-                       //OC_REST_DISCOVER, OC_REST_PRESENCE, OC_REST_OBSERVE_ALL, OC_REST_OBSERVE, OC_REST_DELETE, OC_REST_NOMETHOD
-                       printf("Received unsupported method %d from client\n", entityHandlerRequest->method);
-                       ehRet = OC_EH_ERROR;
-               }
-               if (!((ehRet == OC_EH_ERROR) || (ehRet == OC_EH_FORBIDDEN))) {
-                       response.requestHandle = entityHandlerRequest->requestHandle;
-                       response.resourceHandle = entityHandlerRequest->resource;
-                       response.ehResult = ehRet;
-                       response.payload = (OCPayload*)payload;
-                       response.persistentBufferFlag = 0;
-
-                       response.numSendVendorSpecificHeaderOptions = 0;
-                       memset(response.sendVendorSpecificHeaderOptions, 0,
-                                       sizeof(response.sendVendorSpecificHeaderOptions));
-                       memset(response.resourceUri, 0, sizeof(response.resourceUri));
-
-                       // Send the response
-                       if (OCDoResponse(&response) != OC_STACK_OK) {
-                               printf("Error sending response\n");
-                               ehRet = OC_EH_ERROR;
-                       }
-
-                       if (OC_REST_POST == entityHandlerRequest->method || OC_REST_PUT == entityHandlerRequest->method) {
-                               if (OCNotifyAllObservers(res_handle[0], OC_NA_QOS) != OC_STACK_OK) {
-                                       printf("Fail to OCNotifyAllObservers()\n");
-                                       ehRet = OC_EH_ERROR;
-                               }
-                       }
-               }
-       }
-
-       if (entityHandlerRequest && (flag & OC_OBSERVE_FLAG)) {
-               printf("Flag includes OC_OBSERVE_FLAG\n");
-               if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action) {
-                       printf("Received OC_OBSERVE_REGISTER from client\n");
-               } else if (OC_OBSERVE_DEREGISTER == entityHandlerRequest->obsInfo.action) {
-                       printf("Received OC_OBSERVE_DEREGISTER from client\n");
-               }
-       }
-
-       OCPayloadDestroy(response.payload);
-       return ehRet;
-}
-
-
-OCStackApplicationResult _handle_rd_publish_callback(void *ctx, OCDoHandle handle,
-        OCClientResponse *clientResponse)
-{
-       /* Debug */
-       if (clientResponse) {
-               printf("RD resource response received, code: [%d]\n", clientResponse->result);
-               printf("############## Publish resource response received [%s]\n", clientResponse->resourceUri);
-       }
-
-//     _cond_signal();
-
-       return OC_STACK_KEEP_TRANSACTION;
-}
-
-
-OCStackApplicationResult _handle_rd_delete_callback(void *ctx, OCDoHandle handle,
-        OCClientResponse *clientResponse)
-{
-       /* Debug */
-       if (clientResponse) {
-               printf("RD resource response received, code: %d\n", clientResponse->result);
-               printf("############## Publish resource response received [%s]\n", clientResponse->resourceUri);
-       }
-
-//     _cond_signal();
-
-       return OC_STACK_KEEP_TRANSACTION;
-}
-
-
-void* _oc_process_thd(void * ptr)
-{
-       (void) ptr;
-       while (!isExit) {
-               if (OCProcess() != OC_STACK_OK) {
-                       printf("OCStack process error\n");
-                       return NULL;
-               }
-               sleep(1);
-       }
-
-       return NULL;
-}
-
-
-int _init_oc_stack()
-{
-       ps = (OCPersistentStorage *)calloc(1, sizeof(OCPersistentStorage));
-       if (!ps) return -1;
-
-       ps->open = _client_open;
-       ps->read = fread;
-       ps->write = fwrite;
-       ps->close = fclose;
-       ps->unlink = unlink;
-
-       if (OCRegisterPersistentStorageHandler(ps) == OC_STACK_OK) {
-               printf("OCRegisterPersistentStorageHandler() succeeded\n");
-       } else {
-               printf("OCRegisterPersistentStorageHandler() failed\n");
-               return -1;
-       }
-
-       if (OCInit(NULL, 0, OC_SERVER) == OC_STACK_OK) {
-               printf("OCInit() succeeded\n");
-       } else {
-               printf("OCInit() failed\n");
-               return -1;
-       }
-
-#ifdef _USE_WWST_
-       if (OCInitPM(OC_SECURITY_SQL_DB_FILE_NAME) == OC_STACK_OK) {
-               printf("OCInitPM() is succeeded!\n");
-       } else {
-               printf("OCInitPM() is failed");
-               return -1;
-       }
-#endif
-       _set_platform_info();
-
-       _set_device_info();
-
-       return 0;
-}
-
-
-int  _init_default_test_res()
-{
-#if 0
-       OCUUIdentity deviceId;
-       if (OCGetDeviceId(&deviceId) == OC_STACK_OK) {
-               printf("OCGetDeviceId() is succeeded\n");
-       } else {
-               printf("OCGetDeviceId() is failed\n");
-               return -1;
-       }
-#endif
-
-       /* Create air conditioner resource handle */
-       if (OCCreateResource(&res_handle[0],
-#ifdef _USE_WWST_
-                                               "oic.r.switch.binary",
-                                               "oic.if.baseline",
-                                               "/capability/switch/0",
-                                               _handle_oc_entity, NULL,
-                                               OC_DISCOVERABLE|OC_OBSERVABLE) != OC_STACK_OK) {
-#else
-                                               "x.com.samsung.da.device",
-                                               OC_RSRVD_INTERFACE_DEFAULT,
-                                               "/sec/aircon/0",
-                                               _handle_oc_entity, NULL,
-                                               OC_DISCOVERABLE) != OC_STACK_OK) {
-#endif
-               printf("OCCreateResource() failed\n");
-               return -1;
-       }
-
-/* oic.if.b, oic.if.ll */
-/*
-       if (OCBindResourceInterfaceToResource(res_handle[0], OC_RSRVD_INTERFACE_BATCH) != OC_STACK_OK) {
-               printf("OCBindResourceInterfaceToResource() [%s] failed\n", OC_RSRVD_INTERFACE_BATCH);
-       }
-
-       if (OCBindResourceInterfaceToResource(res_handle[0], OC_RSRVD_INTERFACE_LL) != OC_STACK_OK) {
-               printf("OCBindResourceInterfaceToResource() [%s] failed\n", OC_RSRVD_INTERFACE_LL);
-       }
-*/
-
-//     if (OCBindResource(aircon_handle, binary_switch_handle) != OC_STACK_OK) {
-//             printf("OCBindResource() failed\n");
-//             return -1;
-//     }
-
-   return 0;
-}
-
-
-int _create_fw_res()
-{
-       controlee_create_firmware_resource(&res_handle[1]);
-
-//     if (OCBindResource(aircon_handle, firmware_handle) != OC_STACK_OK) {
-//             printf("OCBindResource() failed\n");
-//             return -1;
-//     }
-
-       return 0;
-}
-
-
-int _publish_fw_res_to_rd()
-{
-       OCCallbackData cb_data = {NULL, NULL, NULL};
-       cb_data.cb = _handle_rd_publish_callback;
-       cb_data.context = (void *)DEFAULT_CONTEXT_VALUE;
-
-       char uri[MAX_URI_LENGTH] = { 0 };
-       snprintf(uri, MAX_URI_LENGTH, "%s%s", CLOUD_PROTOCOL, CLOUD_STG_SERVER);
-
-#ifdef _USE_WWST_
-//     if (OCRDPublish(NULL, uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
-//                     NULL, 0,
-//                     &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
-//             printf("OCRDPublish() failed\n");
-//             return -1;
-//     }
-//
-////   _lock_and_wait();
-//
-//     if (OCRDPublish(NULL, uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
-//                     res_handle, 2,
-//                     &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
-//             printf("OCRDPublish() failed\n");
-//             return -1;
-//     }
-
-       int ocResult = OC_STACK_OK;
-       ocResult = OCRDPublish(NULL, uri, (CT_ADAPTER_TCP | CT_IP_USE_V4), NULL, 0, &cb_data, OC_LOW_QOS);
-       if (ocResult != OC_STACK_OK) {
-               printf("Publish Resource with null handle failed");
-               return -1;
-       }
-
-       ocResult = OCRDPublish(NULL, uri, (CT_ADAPTER_TCP | CT_IP_USE_V4), &res_handle[0], 1, &cb_data, OC_LOW_QOS);
-       if (ocResult != OC_STACK_OK) {
-               printf("Publish Resource failed [%d]", ocResult);
-               return -1;
-       }
-
-       ocResult = OCRDPublish(NULL, uri, (CT_ADAPTER_TCP | CT_IP_USE_V4), &res_handle[1], 1, &cb_data, OC_LOW_QOS);
-       if (ocResult != OC_STACK_OK) {
-               printf("Publish firmware Resource failed [%d]", ocResult);
-               return -1;
-       }
-
-
-#else
-       if (OCRDPublish(uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
-                       NULL, 0,
-                       &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
-               printf("OCRDPublish() failed\n");
-               return -1;
-       }
-
-//     _lock_and_wait();
-
-       if (OCRDPublish(uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
-                       res_handle, 2,
-                       &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
-               printf("OCRDPublish() failed\n");
-               return -1;
-       }
-#endif
-
-//     _lock_and_wait();
-
-       controlee_check_firmware_upgraded();
-
-       return 0;
-}
-
-
-int _delete_fw_res_from_rd()
-{
-       OCCallbackData cb_data = {NULL, NULL, NULL};
-       cb_data.cb = _handle_rd_delete_callback;
-       cb_data.context = (void *)DEFAULT_CONTEXT_VALUE;
-
-       char uri[MAX_URI_LENGTH] = { 0 };
-       snprintf(uri, MAX_URI_LENGTH, "%s%s", CLOUD_PROTOCOL, CLOUD_STG_SERVER);
-
-#ifdef _USE_WWST_
-       if (OCRDDelete(NULL, uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
-                       res_handle, 2,
-                       &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
-               printf("OCRDDelete() failed\n");
-               return -1;
-       }
-#else
-       if (OCRDDelete(uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
-                       res_handle, 2,
-                       &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
-               printf("OCRDDelete() failed\n");
-               return -1;
-       }
-#endif
-
-//     _lock_and_wait();
-
-       return 0;
-}
-
-
-int _destory_fw_res()
-{
-       if (controlee_destory_firmware_resource(&res_handle[1]) != CONTROLEE_FIRMWARE_SUCCESS) {
-               return -1;
-       }
-
-       return 0;
-}
-
-
-int _destory_default_res()
-{
-       if (OCDeleteResource(res_handle[0]) != OC_STACK_OK) {
-               printf("OCDeleteResource() failed for aircon_handle\n");
-               return -1;
-       }
-
-       return 0;
-}
-
-
-static void _state_changed_cb(controlee_firmware_state_e value)
-{
-       printf("state_changed_cb [%d]\n", value);
-}
-
-
-int _set_state_changed_cb()
-{
-       printf("_set_state_changed_cb\n");
-       if (controlee_set_state_changed_cb(_state_changed_cb) != CONTROLEE_FIRMWARE_SUCCESS)
-               return -1;
-
-       return 0;
-}
-
-
-int _unset_state_changed_cb()
-{
-       controlee_unset_resource_changed_cb();
-       return 0;
-}
-
-
-int _set_active_check()
-{
-       if (controlee_get_newest_firmware_from_server() != CONTROLEE_FIRMWARE_SUCCESS)
-               return -1;
-
-       return 0;
-}
-
-
-int _get_fw_res_value()
-{
-       char *temp_value = NULL;
-       if (controlee_get_firmware_resource_value(CONTROLEE_FIRMWARE_RES_UPDATE_STATE, &temp_value) != CONTROLEE_FIRMWARE_SUCCESS) {
-               return -1;
-       } else {
-               printf("RES_UPDATE_STATE [%s]\n", temp_value);
-               g_free(temp_value);
-       }
-
-       if (controlee_get_firmware_resource_value(CONTROLEE_FIRMWARE_RES_UPDATE_RESULT, &temp_value) != CONTROLEE_FIRMWARE_SUCCESS) {
-               return -1;
-       } else {
-               printf("RES_UPDATE_RESULT [%s]\n", temp_value);
-               g_free(temp_value);
-       }
-
-       if (controlee_get_firmware_resource_value(CONTROLEE_FIRMWARE_RES_CURRENT_VERSION, &temp_value) != CONTROLEE_FIRMWARE_SUCCESS) {
-               return -1;
-       } else {
-               printf("RES_CURRENT_VERSION [%s]\n", temp_value);
-               g_free(temp_value);
-       }
-
-       if (controlee_get_firmware_resource_value(CONTROLEE_FIRMWARE_RES_NEW_VERSION, &temp_value) != CONTROLEE_FIRMWARE_SUCCESS) {
-               return -1;
-       } else {
-               printf("RES_NEW_VERSION [%s]\n", temp_value);
-               g_free(temp_value);
-       }
-
-       return 0;
-}
-
-void _show_menu()
-{
-       printf("============================================\n");
-       printf("=== Controlee firmware resource test app ===\n");
-       printf("============================================\n");
-       printf(" [A] Create Resource & Sign Up/In & publish\n");
-       printf(" [C] Sign Up/In\n");
-       printf(" [D] Sign Out\n");
-       printf(" [E] Set Active check\n");
-       printf(" [1] Create default resource\n");
-       printf(" [2] Create firmware resource\n");
-       printf(" [3] Publish resources to RD\n");
-       printf(" [4] Delete resources from RD\n");
-       printf(" [5] Destroy firmware resource\n");
-       printf(" [6] Destroy default resource\n");
-       printf(" [7] Set state changed callback\n");
-       printf(" [8] Unset state changed callback\n");
-       printf(" [9] Get firmware resource value\n");
-       printf(" [0] Exit\n");
-       printf("============================================\n");
-       printf("Input test menu : \n");
-}
-
-#define _G_IO_WATCH_
-
-#ifdef _G_IO_WATCH_
-gboolean _main_thread(GIOChannel *channel, GIOCondition condition, gpointer data)
-#else
-void* _main_thread(void *data)
-#endif
-{
-#ifdef _G_IO_WATCH_
-       if (condition != G_IO_IN)
-               return false;
-
-       int rv = 0;
-       gsize length;
-       gchar *str_ret;
-
-       g_io_channel_read_line(channel, &str_ret, &length, NULL, NULL);
-       if (!str_ret)
-               return false;
-#else
-       (void)data;
-       int rv = 0;
-       char str_ret[10];
-
-       while (true) {
-       memset(str_ret, 0x00, sizeof(str_ret));
-
-       scanf("%s", str_ret);
-
-#endif
-
-       if (str_ret[0] == '\n' || str_ret[0] == '\r') {
-               _show_menu();
-       } else {
-               switch (str_ret[0]) {
-               case 'A' :
-               case 'a' :
-                       rv += _set_state_changed_cb();;
-                       rv += _init_default_test_res();
-                       rv += _create_fw_res();
-                       g_auto_publish = true;
-                       rv += _signup();
-                       break;
-               case 'C' :
-               case 'c' :
-                       g_auto_publish = false;
-                       rv = _signup();
-                       break;
-               case 'D' :
-               case 'd' :
-                       rv = _signout();
-                       break;
-               case 'E' :
-               case 'e' :
-                       rv = _set_active_check();
-                       break;
-               case '1':
-                       rv = _init_default_test_res();
-                       break;
-               case '2':
-                       rv = _create_fw_res();
-                       break;
-               case '3':
-                       rv = _publish_fw_res_to_rd();
-                       break;
-               case '4':
-                       rv = _delete_fw_res_from_rd();
-                       break;
-               case '5':
-                       rv = _destory_fw_res();
-                       break;
-               case '6':
-                       rv = _destory_default_res();
-                       break;
-               case '7':
-                       rv = _set_state_changed_cb();
-                       break;
-               case '8':
-                       rv = _unset_state_changed_cb();
-                       break;
-               case '9':
-                       rv = _get_fw_res_value();
-                       break;
-               case '0' :
-                       printf("Exit from test app!\n");
-                       exit(0);
-                       break;
-               default :
-                       break;
-               }
-
-               if (rv == 0)
-                       printf("[%c]operation succeeded!\n", str_ret[0]);
-               else
-                       printf("[%c]operation failed!\n", str_ret[0]);
-
-               printf("\n*** Press 'enter' to show menu *** \n");
-       }
-
-#ifdef _G_IO_WATCH_
-       g_free(str_ret);
-       return true;
-#else
-
-       }
-
-       return NULL;
-#endif
-}
-
-
-int main(int argc, char *argv[])
-{
-       GMainLoop *mainloop;
-
-#if !GLIB_CHECK_VERSION(2, 36, 0)
-       g_type_init();
-#endif
-
-       bSignin = false;
-       isExit = false;
-       ps = NULL;
-       switch_power = true;
-
-       mainloop = g_main_loop_new(NULL, false);
-
-       if (_init_oc_stack() != 0) {
-               printf("Fail to _init_oc_stack()\n");
-               return -1;
-       }
-
-       pthread_t oc_proc_thd;
-       pthread_create(&oc_proc_thd, NULL, _oc_process_thd, NULL);
-
-       _show_menu();
-
-#ifdef _G_IO_WATCH_
-       GIOChannel *channel = g_io_channel_unix_new(0);
-       g_io_add_watch(channel, (G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL), _main_thread, NULL);
-#else
-       pthread_t test_thd;
-       pthread_create(&test_thd, NULL, _main_thread, NULL);
-#endif
-
-       g_main_loop_run(mainloop);
-
-       if (ps)
-               free(ps);
-
-       return 0;
-}
diff --git a/test/fmwup_test.c b/test/fmwup_test.c
new file mode 100644 (file)
index 0000000..bf9d741
--- /dev/null
@@ -0,0 +1,1360 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <glib.h>
+#include <gio/gio.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <pthread.h>
+
+#include <ocstack.h>
+#include <ocpayload.h>
+#include <octypes.h>
+#include <rd_client.h>
+#ifdef _USE_WWST_
+#include <oickeepalive.h>
+#endif
+#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
+#include <ocprovisioningmanager.h>
+#endif
+
+#include <ckmc/ckmc-manager.h>
+
+#include <fmwup_resource.h>
+
+
+#define DEFAULT_CONTEXT_VALUE 0x99
+#define LOGIN_OK 4
+
+#define OC_FMWUP_DAT_FILE_PATH         "/opt/usr/data/ua-client/oic_svr_db_client.dat"
+#ifdef _USE_WWST_
+#define OC_SECURITY_SQL_DB_FILE_NAME   "/opt/usr/data/ua-client/PDM.db"
+#define CERT_FILE_PATH                                 "/opt/usr/data/ua-client/thawte.cert.pem"
+#endif
+
+OCResourceHandle res_handle[2];
+
+OCPersistentStorage *ps;
+
+#ifdef _USE_WWST_
+#define CLOUD_STG_SERVER                       "52.202.112.20:443"
+#define CLOUD_DEV_SERVER                       "54.86.109.131:443"
+#define CLOUD_AUTH_PROVIDER            "samsung-us"
+#define CLOUD_DEVICE_TYPE              "device"
+#define CLOUD_PROTOCOL                 "coaps+tcp://"
+#else
+#define CLOUD_STG_SERVER                       "52.78.68.250:5683"
+#define CLOUD_AUTH_PROVIDER            "tdc"
+#define CLOUD_PROTOCOL                 "coap+tcp://"
+#endif
+
+#define DEVICE_ID                      "di"
+#define CLIENT_ID                      "clientid"
+#define AUTH_PROVIDER          "authprovider"
+#define DEVICE_TYPE                    "devicetype"
+#define ACCESS_TOKEN           "accesstoken"
+#define USER_ID                                "uid"
+#define CLOUD_LOGIN                    "login"
+#define AUTH_CODE                      "authcode"
+
+#define CLOUD_ACCOUNT_RES_TYPE         "oic.wk.account"
+#define CLOUD_SESSION_RES_TYPE         "oic.wk.session"
+
+#define MAX_INTERVAL_NUMBER (4)
+
+typedef struct
+{
+       char *deviceId;
+       char *clientId;
+       char *authCode;
+       char *uid;
+       char *accessToken;
+       char *refreshToken;
+       char *codeVerifier;
+
+#ifdef _USE_WWST_
+       uint8_t *certificate;
+       size_t certificateLength;
+       OicEncodingType_t encodingType;
+#endif
+} CloudLoginInfo;
+
+bool g_auto_publish;
+bool bSignin;
+bool isExit;
+uint16_t g_cred_id = 0;
+CloudLoginInfo loginDetails;
+
+static pthread_mutex_t pingcycle_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t _lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t _cond = PTHREAD_COND_INITIALIZER;
+static bool is_ping_timer = false;
+
+
+OCPlatformInfo g_platform_info = {
+               "1234",                           /* platformID */
+               "Samsung",                        /* manufacturerName */
+               "https://www.example.com",        /* manufacturerUrl */
+               "Tizen2017-AAA",                  /* modelNumber */
+               "2017-07-19",                     /* dateOfManufacture */
+               "AAA",                            /* platformVersion */
+               "4.0",                            /* operatingSystemVersion */
+               "HW-001",                         /* hardwareVersion */
+               "1.0",                            /* firmwareVersion */
+               "https://www.examplesupport.com", /* supportUrl */
+               "2017-07-19T12.00"                /* systemTime */
+};
+
+bool switch_power;
+
+
+int _signin();
+int _signup();
+int _publish_fw_res_to_rd();
+
+int _set_auth_cert_info()
+{
+#ifdef _USE_WWST_
+       char *certFile = CERT_FILE_PATH;
+       ckmc_cert_s* cert = NULL;
+       int ret_cert = ckmc_load_cert_from_file(certFile, &cert);
+       if (CKMC_ERROR_NONE != ret_cert) {
+               printf("ckmc_load_cert_from_file error [%d]\n", ret_cert);
+               return -1;
+       }
+
+       loginDetails.certificate = cert->raw_cert;
+       loginDetails.certificateLength = cert->cert_size;
+       loginDetails.encodingType = OIC_ENCODING_PEM;
+
+       if (loginDetails.certificate) {
+               printf("Save cert file Data\n");
+               if (OCSaveTrustCertChain(loginDetails.certificate, loginDetails.certificateLength, \
+                               loginDetails.encodingType, &g_cred_id) != OC_STACK_OK) {
+                       printf("OCSaveTrustCertChain() failed\n");
+                       return -1;
+               } else {
+                       printf("Cred ID from saveCertFile = [%d]\n", g_cred_id);
+               }
+       }
+#endif
+       return 0;
+}
+
+void _lock_and_wait()
+{
+       pthread_mutex_init(&_lock, NULL);
+       pthread_cond_init(&_cond, NULL);
+
+       pthread_mutex_lock(&_lock);
+       pthread_cond_wait(&_cond, &_lock);
+       pthread_mutex_unlock(&_lock);
+}
+
+void _cond_signal()
+{
+       pthread_mutex_lock(&_lock);
+       pthread_cond_signal(&_cond);
+       pthread_mutex_unlock(&_lock);
+}
+
+static FILE *_client_open(const char *path, const char *mode)
+{
+       (void)path;
+
+       if (!strcmp(mode, "rb"))
+               mode = strdup("r");
+       else if(!strcmp(mode, "wb"))
+               mode = strdup("w");
+
+       printf("path [%s], mode[%s]", path, mode);
+       return fopen(OC_FMWUP_DAT_FILE_PATH, mode);
+}
+
+
+static void _parse_payload(OCRepPayload *payload)
+{
+       if (!payload)
+               return;
+
+#ifdef _USE_WWST_
+       char *sid, *certificate;
+       if (!OCRepPayloadGetPropString(payload, "sid", &sid))
+               printf("Can't get 'sid'\n");
+
+       if (!OCRepPayloadGetPropString(payload, "certificate", &certificate))
+               printf("Can't get 'certificate'\n");
+#else
+       if (!OCRepPayloadGetPropString(payload, USER_ID, &loginDetails.uid))
+               printf("Can't get 'uid'\n");
+
+       if (!OCRepPayloadGetPropString(payload, ACCESS_TOKEN, &loginDetails.accessToken))
+               printf("Can't get 'access_token'\n");
+#endif
+
+}
+
+#ifdef _USE_WWST_
+static OCStackApplicationResult _send_keep_alive_cb(void *context, OCDoHandle handle,
+                                                       OCClientResponse * clientResponse)
+{
+       (void)context;
+       (void)handle;
+
+       if (!clientResponse) {
+               printf("clientResponse is NULL!\n");
+               return OC_STACK_DELETE_TRANSACTION;
+       }
+
+       printf("_send_keep_alive_cb() is called, result=[%d]\n", clientResponse->result);
+
+       if(clientResponse->result > OC_STACK_RESOURCE_CHANGED) {
+               pthread_detach(pthread_self());
+               pthread_mutex_lock(&pingcycle_mutex);
+               is_ping_timer = false;
+               pthread_mutex_unlock(&pingcycle_mutex);
+               pthread_exit(NULL);
+       }
+
+       return OC_STACK_DELETE_TRANSACTION;
+}
+
+static void *_send_keep_alive(void *data)
+{
+       OCStackResult ocResult = OC_STACK_ERROR;
+       int i = 0;
+       int timeout = 0;
+       int timer_count = 0;
+
+       int64_t *array = (int64_t *)data;
+
+       while (is_ping_timer) {
+               if(timeout == timer_count) {
+                       timer_count = 0;
+
+                       if(i >= MAX_INTERVAL_NUMBER)
+                               i = MAX_INTERVAL_NUMBER - 1;
+
+                       OCRepPayload *keepAlivePayload = OCRepPayloadCreate();
+                       if (!keepAlivePayload) break;
+
+                       OCRepPayloadSetPropInt(keepAlivePayload, "in", (int64_t)array[i]);
+                       timeout = array[i] * 60;
+                       ++i;
+
+                       char uri[MAX_URI_LENGTH] = { 0 };
+                       snprintf(uri, MAX_URI_LENGTH, "%s%s", CLOUD_PROTOCOL, CLOUD_STG_SERVER);
+
+                       OCCallbackData cbData = {0,};
+                       cbData.cb = _send_keep_alive_cb;
+
+                       ocResult = OCSendKeepAliveRequest(NULL, uri, (OCPayload *)keepAlivePayload, &cbData);
+                       printf("sendKeepAliveRequest() result : %d\n", ocResult);
+                       if (OC_STACK_OK != ocResult) {
+                               pthread_detach(pthread_self());
+                               pthread_mutex_lock(&pingcycle_mutex);
+                               is_ping_timer = false;
+                               pthread_mutex_unlock(&pingcycle_mutex);
+                               pthread_exit(NULL);
+                       }
+               }
+               pthread_mutex_lock(&pingcycle_mutex);
+               ++timer_count;
+               pthread_mutex_unlock(&pingcycle_mutex);
+               sleep(1);
+       }
+
+       return NULL;
+}
+
+static void _keep_alive_cb(OCRepPayload *payload)
+{
+       printf("_keep_alive_cb() is called\n");
+
+       if (!payload)
+               return;
+
+       int64_t *array = NULL;
+       size_t dim[MAX_REP_ARRAY_DEPTH];
+       bool ocBoolResult = false;
+
+       ocBoolResult = OCRepPayloadGetIntArray(payload, "inarray", &array, dim);
+       printf("OCRepPayloadGetStringArray() return = [%d]\n", ocBoolResult);
+
+       if (ocBoolResult == true && array) {
+               pthread_mutex_lock(&pingcycle_mutex);
+               is_ping_timer = true;
+               pthread_mutex_unlock(&pingcycle_mutex);
+
+               pthread_t _keep_alive_thd;
+               pthread_create(&_keep_alive_thd, NULL, _send_keep_alive, (void *)array);
+       } else {
+               pthread_detach(pthread_self());
+               pthread_mutex_lock(&pingcycle_mutex);
+               is_ping_timer = false;
+               pthread_mutex_unlock(&pingcycle_mutex);
+               pthread_exit(NULL);
+       }
+
+       return;
+}
+#endif
+
+void _set_platform_info()
+{
+       printf("_set_platform_info() is called\n");
+
+       if (OCSetPlatformInfo(g_platform_info) == OC_STACK_OK) {
+               printf("Platform Registration is succeeded\n");
+       } else {
+               printf("Platform Registration is failed\n");
+       }
+}
+
+
+void _set_device_info()
+{
+       printf("_set_device_info() is called\n");
+
+       OCDeviceInfo devInfoAirConditioner;
+       OCStringLL deviceType;
+
+#ifdef _USE_WWST_
+       deviceType.value = g_strdup("oic.d.switch");
+#else
+       deviceType.value = g_strdup("oic.d.airconditioner");
+#endif
+
+       deviceType.next = NULL;
+       devInfoAirConditioner.deviceName = g_strdup("FAC_2016");
+       devInfoAirConditioner.types = &deviceType;
+       devInfoAirConditioner.specVersion = NULL;
+       devInfoAirConditioner.dataModelVersions = NULL;
+
+       if (OCSetDeviceInfo(devInfoAirConditioner) != OC_STACK_OK) {
+               printf("OCSetDeviceInfo() failed\n");
+       } else {
+               printf("OCSetDeviceInfo() Success\n");
+       }
+}
+
+void _get_login_info()
+{
+#ifdef _USE_WWST_
+       char tmp[64];
+
+       printf("Enter access_token : ");
+       memset(tmp, 0x00, sizeof(tmp));
+       scanf("%s", tmp);
+       loginDetails.accessToken = g_strdup(tmp);
+       printf("access_token : %s\n", loginDetails.accessToken);
+
+       printf("Enter refresh_token : ");
+       memset(tmp, 0x00, sizeof(tmp));
+       scanf("%s", tmp);
+       loginDetails.refreshToken = g_strdup(tmp);
+       printf("refresh_token : %s\n", loginDetails.refreshToken);
+
+       printf("Enter user_id : ");
+       memset(tmp, 0x00, sizeof(tmp));
+       scanf("%s", tmp);
+       loginDetails.uid = g_strdup(tmp);
+       printf("user_id : %s\n", loginDetails.uid);
+
+       printf("Enter client_id : ");
+       memset(tmp, 0x00, sizeof(tmp));
+       scanf("%s", tmp);
+       loginDetails.clientId = g_strdup(tmp);
+       printf("client_id : %s\n", loginDetails.clientId);
+#endif
+       loginDetails.deviceId = g_strdup(OCGetServerInstanceIDString());
+       printf("Device ID = [%s]\n", loginDetails.deviceId);
+
+}
+
+#ifdef _USE_WWST_
+static OCStackApplicationResult _handle_keepalive_cb(void *context, OCDoHandle handle,
+                                                                       OCClientResponse * clientResponse)
+{
+       (void)context;
+       (void)handle;
+
+       if (!clientResponse) {
+               printf("Received NULL clientResponse\n");
+               return OC_STACK_DELETE_TRANSACTION;
+       }
+
+       if (clientResponse->result == OC_STACK_OK) {
+               _keep_alive_cb((OCRepPayload*)clientResponse->payload);
+       }
+
+       return OC_STACK_KEEP_TRANSACTION;
+}
+
+
+void *_ping_timer(void *timer)
+{
+       OCStackResult ocResult = OC_STACK_ERROR;
+       (void)timer;
+
+       char uri[MAX_URI_LENGTH] = { 0 };
+       snprintf(uri, MAX_URI_LENGTH, "%s%s", CLOUD_PROTOCOL, CLOUD_STG_SERVER);
+
+       OCCallbackData keepAliveCb = {0,};
+       keepAliveCb.cb = _handle_keepalive_cb;
+       ocResult = OCFindKeepAliveResource(NULL, uri, &keepAliveCb);
+       printf("OCFindKeepAliveResource() result : %d\n", ocResult);
+
+       if (OC_STACK_OK != ocResult) {
+               pthread_detach(pthread_self());
+               pthread_mutex_lock(&pingcycle_mutex);
+               is_ping_timer = false;
+               pthread_mutex_unlock(&pingcycle_mutex);
+               pthread_exit(NULL);
+       }
+
+       return NULL;
+}
+#endif
+
+static OCStackApplicationResult _handle_signin_response(void *ctx,
+                                                                         OCDoHandle handle,
+                                                                         OCClientResponse *response)
+{
+       (void)(ctx);
+       (void)(handle);
+
+       if (!response) {
+               printf("Received NULL response\n");
+               return OC_STACK_DELETE_TRANSACTION;
+       }
+
+       if (response->payload) {
+               printf("Payload received\n");
+       }
+
+       if (response->result != LOGIN_OK) {
+               printf("Login error: %d\n", response->result);
+
+               pthread_mutex_lock(&pingcycle_mutex);
+               is_ping_timer = false;
+               pthread_mutex_unlock(&pingcycle_mutex);
+       } else {
+               bSignin = true;
+               printf("Sign-In Success!!!\n");
+
+               sleep(1);
+               if (g_auto_publish) {
+                       if (_publish_fw_res_to_rd() != 0) {
+                               printf("publish failed!!!\n");
+                       }
+               }
+
+#ifdef _USE_WWST_
+               pthread_t pingThread;
+               pthread_mutex_lock(&pingcycle_mutex);
+               is_ping_timer = true;
+               pthread_mutex_unlock(&pingcycle_mutex);
+
+               int ret = pthread_create(&pingThread, NULL, _ping_timer, NULL);
+               if (ret != 0)
+                       printf("ping pthread_create fail!\n");
+#endif
+       }
+
+       return OC_STACK_KEEP_TRANSACTION;
+
+}
+
+static OCStackApplicationResult _handle_signup_response(void *ctx,
+                                                                         OCDoHandle handle,
+                                                                         OCClientResponse *response)
+{
+       (void)(ctx);
+       (void)(handle);
+
+       if (!response) {
+               printf("Received NULL response\n");
+               return OC_STACK_DELETE_TRANSACTION;
+       }
+
+       if (response->result != LOGIN_OK) {
+               printf("Login error: %d\n", response->result);
+       } else {
+               _parse_payload((OCRepPayload*)response->payload);
+               printf("Sign-Up OK!!!\n");
+               sleep(1);
+               _signin();
+       }
+
+       return OC_STACK_KEEP_TRANSACTION;
+}
+
+
+static OCStackApplicationResult _handle_signout_response(void *ctx,
+                                                                         OCDoHandle handle,
+                                                                         OCClientResponse *response)
+{
+       (void)(ctx);
+       (void)(handle);
+
+       if (response) {
+               if (response->result == LOGIN_OK)
+                       printf("Sign-Out Success!!!\n");
+               else
+                       printf("Sign-Out Failed [%d]!!!\n", response->result);
+       }
+
+       bSignin = false;
+       pthread_mutex_lock(&pingcycle_mutex);
+       is_ping_timer = FALSE;
+       pthread_mutex_unlock(&pingcycle_mutex);
+
+       return OC_STACK_DELETE_TRANSACTION;
+}
+
+
+int _signin()
+{
+       char uri[MAX_URI_LENGTH] = { 0 };
+       snprintf(uri, MAX_URI_LENGTH, "%s%s%s?rt=%s;if=%s",
+                       CLOUD_PROTOCOL, CLOUD_STG_SERVER, OC_RSRVD_ACCOUNT_SESSION_URI, CLOUD_SESSION_RES_TYPE, OC_RSRVD_INTERFACE_DEFAULT);
+       printf("server uri=[%s]\n", uri);
+
+       OCCallbackData cbData;
+       memset(&cbData, 0, sizeof(OCCallbackData));
+       cbData.cb = _handle_signin_response;
+       cbData.cd = NULL;
+       cbData.context = (void *) DEFAULT_CONTEXT_VALUE;
+
+       OCRepPayload *payload = OCRepPayloadCreate();
+       if (!payload) return -1;
+
+       OCRepPayloadSetPropString(payload, DEVICE_ID, (const char *)loginDetails.deviceId);
+       OCRepPayloadSetPropString(payload, ACCESS_TOKEN, (const char *)loginDetails.accessToken);
+       OCRepPayloadSetPropString(payload, USER_ID, (const char *)loginDetails.uid);
+       OCRepPayloadSetPropBool(payload, CLOUD_LOGIN, true);
+//     OCRepPayloadAddResourceType(payload, CLOUD_SESSION_RES_TYPE);
+//     OCRepPayloadAddInterface(payload, OC_RSRVD_INTERFACE_DEFAULT);
+
+       int ret;
+       if (OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
+                                       CT_ADAPTER_TCP|CT_IP_USE_V4, OC_LOW_QOS, &cbData, NULL, 0) == OC_STACK_OK) {
+               ret = 0;
+               printf("OCDoResource() is succeeded\n");
+       } else {
+               ret = -1;
+               printf("OCDoResource() is failed\n");
+       }
+
+       return ret;
+}
+
+
+int _signup()
+{
+
+       if (bSignin == true) {
+               printf("Already signed-in!\n");
+               return -1;
+       }
+
+       memset(&loginDetails, 0x00, sizeof(CloudLoginInfo));
+       _get_login_info();
+
+       _set_auth_cert_info();
+
+       char uri[MAX_URI_LENGTH] = { 0 };
+       snprintf(uri, MAX_URI_LENGTH, "%s%s%s?rt=%s;if=%s",
+                       CLOUD_PROTOCOL, CLOUD_STG_SERVER, OC_RSRVD_ACCOUNT_URI, CLOUD_ACCOUNT_RES_TYPE, OC_RSRVD_INTERFACE_DEFAULT);
+       printf("server uri=[%s]\n", uri);
+
+       OCCallbackData cbData;
+       memset(&cbData, 0, sizeof(OCCallbackData));
+       cbData.cb = _handle_signup_response;
+       cbData.cd = NULL;
+       cbData.context = (void *) DEFAULT_CONTEXT_VALUE;
+
+       OCRepPayload *payload = OCRepPayloadCreate();
+       if (!payload) return -1;
+
+       OCRepPayloadSetPropString(payload, AUTH_PROVIDER, CLOUD_AUTH_PROVIDER);
+#ifdef _USE_WWST_
+       OCRepPayloadSetPropString(payload, DEVICE_TYPE, CLOUD_DEVICE_TYPE);
+       OCRepPayloadSetPropString(payload, DEVICE_ID, (const char *)loginDetails.deviceId);
+       OCRepPayloadSetPropString(payload, CLIENT_ID, (const char *)loginDetails.clientId);
+       OCRepPayloadSetPropString(payload, ACCESS_TOKEN, (const char *)loginDetails.accessToken);
+       OCRepPayloadSetPropString(payload, USER_ID, (const char *)loginDetails.uid);
+//     OCRepPayloadAddResourceType(payload, CLOUD_ACCOUNT_RES_TYPE);
+//     OCRepPayloadAddInterface(payload, OC_RSRVD_INTERFACE_DEFAULT);
+#else
+       OCRepPayloadSetPropString(payload, AUTH_CODE, "123123123");
+       OCRepPayloadSetPropString(payload, DEVICE_ID, loginDetails.deviceId);
+#endif
+
+       int ret;
+       if (OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
+                                       CT_ADAPTER_TCP|CT_IP_USE_V4, OC_LOW_QOS, &cbData, NULL, 0) == OC_STACK_OK) {
+               ret = 0;
+               printf("OCDoResource() is succeeded\n");
+       } else {
+               ret = -1;
+               printf("OCDoResource() is failed\n");
+       }
+
+       return ret;
+}
+
+
+int _signout()
+{
+       char uri[MAX_URI_LENGTH] = { 0 };
+       snprintf(uri, MAX_URI_LENGTH, "%s%s%s",
+                       CLOUD_PROTOCOL, CLOUD_STG_SERVER, OC_RSRVD_ACCOUNT_SESSION_URI);
+       printf("server uri=[%s]\n", uri);
+
+       OCCallbackData cbData;
+       memset(&cbData, 0, sizeof(OCCallbackData));
+       cbData.cb = _handle_signout_response;
+       cbData.cd = NULL;
+       cbData.context = (void *) DEFAULT_CONTEXT_VALUE;
+
+       OCRepPayload *payload = OCRepPayloadCreate();
+       if (!payload) return -1;
+
+       OCRepPayloadSetPropString(payload, DEVICE_ID, (const char *)loginDetails.deviceId);
+       OCRepPayloadSetPropString(payload, ACCESS_TOKEN, (const char *)loginDetails.accessToken);
+       OCRepPayloadSetPropString(payload, USER_ID, (const char *)loginDetails.uid);
+       OCRepPayloadSetPropBool(payload, CLOUD_LOGIN, false);
+
+       int ret;
+       if (OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
+                                       CT_ADAPTER_TCP|CT_IP_USE_V4, OC_LOW_QOS, &cbData, NULL, 0) == OC_STACK_OK) {
+               ret = 0;
+               printf("OCDoResource() is succeeded\n");
+       } else {
+               ret = -1;
+               printf("OCDoResource() is failed\n");
+       }
+
+       return ret;
+}
+
+bool _compare_resource_interface(char *from, char *iface)
+{
+       char *str = g_strdup(from);
+       char *ptr = strtok(str, ";");
+
+       if(ptr == NULL) {
+               return false;
+       }
+
+       do {
+               if(strstr(ptr, ".if.")) {
+                       char *if_ptr = NULL;
+                       if_ptr = strtok(ptr, "=");
+                       if_ptr = strtok(NULL, "=");
+
+                       if(!g_strcmp0(if_ptr, iface)) {
+                               return true;
+                       }
+               }
+       } while ((ptr = strtok(NULL, ";")));
+
+       return false;
+}
+
+
+OCEntityHandlerResult _check_request_payload(OCEntityHandlerRequest *ehRequest)
+{
+       if( !(ehRequest->query) || \
+                       (ehRequest->query && (g_strcmp0(ehRequest->query, "") && \
+                       !_compare_resource_interface(ehRequest->query, OC_RSRVD_INTERFACE_DEFAULT))))
+       {
+               printf("Not supported Interface\n");
+               return OC_EH_BAD_REQ;
+       }
+
+       return OC_EH_OK;
+}
+
+
+OCRepPayload * _construct_response_of_device(OCEntityHandlerRequest *ehRequest)
+{
+       OCRepPayload* input = (OCRepPayload*)(ehRequest->payload);
+
+       if (OC_REST_PUT == ehRequest->method || OC_REST_POST == ehRequest->method) {
+               /* Get pointer to query */
+               bool power;
+               if (OCRepPayloadGetPropBool(input, "value", &power)) {
+                       switch_power = power;
+                       printf("Client Set Power : %d\n", power);
+               }
+       }
+
+       OCRepPayload *payload = OCRepPayloadCreate();
+
+       if (!payload) {
+               printf("Failed to allocate Payload\n");
+               return NULL;
+       }
+
+       printf("Client Set payload Power : %d\n", switch_power);
+       OCRepPayloadSetPropBool(payload, "value", switch_power);
+
+       return payload;
+}
+
+static OCEntityHandlerResult _handle_get_request(OCEntityHandlerRequest *ehRequest, OCRepPayload **payload)
+{
+       OCEntityHandlerResult ehResult = OC_EH_ERROR;
+       if (!ehRequest) {
+               printf("Request is Null\n");
+               return ehResult;
+       }
+
+       if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
+               printf("Incoming payload not a representation\n");
+               return ehResult;
+       }
+
+       OCRepPayload *getResp = NULL;
+       *payload = NULL;
+
+       if(ehRequest->resource == res_handle[0]) {
+               if(_check_request_payload(ehRequest) != OC_EH_OK) {
+                       printf("Not supported Interface\n");
+                       return OC_EH_BAD_REQ;
+               } else {
+                       getResp = _construct_response_of_device(ehRequest);
+               }
+       }
+
+       if (!getResp) {
+               printf("constructResponse failed\n");
+               return OC_EH_ERROR;
+       }
+
+       *payload = getResp;
+
+       ehResult = OC_EH_OK;
+
+       return ehResult;
+}
+
+
+static OCEntityHandlerResult _handle_post_request(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload)
+{
+       printf("ProcessPostRequest enter\n");
+       OCEntityHandlerResult ehResult = OC_EH_ERROR;
+       if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
+               printf("Incoming payload not a representation\n");
+               return ehResult;
+       }
+
+       OCRepPayload *getResp = NULL;
+       *payload = NULL;
+
+       if(ehRequest->resource == res_handle[0]) {
+               if(_check_request_payload(ehRequest) != OC_EH_OK) {
+                       printf("Not supported Interface\n");
+                       return OC_EH_BAD_REQ;
+               } else {
+                       getResp = _construct_response_of_device(ehRequest);
+               }
+       }
+
+       if (!getResp) {
+               printf("constructResponse failed\n");
+               return OC_EH_ERROR;
+       }
+
+       *payload = getResp;
+
+       ehResult = OC_EH_OK;
+
+       return ehResult;
+}
+
+
+OCEntityHandlerResult _handle_oc_entity(OCEntityHandlerFlag flag,
+                                                                               OCEntityHandlerRequest *entityHandlerRequest,
+                                                                               void *callbackParam)
+{
+       printf("_handle_oc_entity\n");
+       OCEntityHandlerResult ehRet = OC_EH_OK;
+       OCEntityHandlerResponse response = { 0, 0, OC_EH_ERROR, 0, 0, \
+                                                                               { }, { 0 }, false };
+       OCRepPayload* payload = NULL;
+
+       if (entityHandlerRequest && (flag & OC_REQUEST_FLAG)) {
+               if (OC_REST_GET == entityHandlerRequest->method) {
+                       printf("Received OC_REST_GET request\n");
+                       ehRet = _handle_get_request(entityHandlerRequest, &payload);
+               } else if (OC_REST_PUT == entityHandlerRequest->method) {
+                       printf("Received OC_REST_PUT request, from client\n");
+                       ehRet = _handle_post_request(entityHandlerRequest, &payload);
+               } else if (OC_REST_POST == entityHandlerRequest->method) {
+                       printf("Received OC_REST_POST from client\n");
+                       ehRet = _handle_post_request(entityHandlerRequest, &payload);
+               } else {
+                       //OC_REST_DISCOVER, OC_REST_PRESENCE, OC_REST_OBSERVE_ALL, OC_REST_OBSERVE, OC_REST_DELETE, OC_REST_NOMETHOD
+                       printf("Received unsupported method %d from client\n", entityHandlerRequest->method);
+                       ehRet = OC_EH_ERROR;
+               }
+               if (!((ehRet == OC_EH_ERROR) || (ehRet == OC_EH_FORBIDDEN))) {
+                       response.requestHandle = entityHandlerRequest->requestHandle;
+                       response.resourceHandle = entityHandlerRequest->resource;
+                       response.ehResult = ehRet;
+                       response.payload = (OCPayload*)payload;
+                       response.persistentBufferFlag = 0;
+
+                       response.numSendVendorSpecificHeaderOptions = 0;
+                       memset(response.sendVendorSpecificHeaderOptions, 0,
+                                       sizeof(response.sendVendorSpecificHeaderOptions));
+                       memset(response.resourceUri, 0, sizeof(response.resourceUri));
+
+                       // Send the response
+                       if (OCDoResponse(&response) != OC_STACK_OK) {
+                               printf("Error sending response\n");
+                               ehRet = OC_EH_ERROR;
+                       }
+
+                       if (OC_REST_POST == entityHandlerRequest->method || OC_REST_PUT == entityHandlerRequest->method) {
+                               if (OCNotifyAllObservers(res_handle[0], OC_NA_QOS) != OC_STACK_OK) {
+                                       printf("Fail to OCNotifyAllObservers()\n");
+                                       ehRet = OC_EH_ERROR;
+                               }
+                       }
+               }
+       }
+
+       if (entityHandlerRequest && (flag & OC_OBSERVE_FLAG)) {
+               printf("Flag includes OC_OBSERVE_FLAG\n");
+               if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action) {
+                       printf("Received OC_OBSERVE_REGISTER from client\n");
+               } else if (OC_OBSERVE_DEREGISTER == entityHandlerRequest->obsInfo.action) {
+                       printf("Received OC_OBSERVE_DEREGISTER from client\n");
+               }
+       }
+
+       OCPayloadDestroy(response.payload);
+       return ehRet;
+}
+
+
+OCStackApplicationResult _handle_rd_publish_callback(void *ctx, OCDoHandle handle,
+        OCClientResponse *clientResponse)
+{
+       /* Debug */
+       if (clientResponse) {
+               printf("RD resource response received, code: [%d]\n", clientResponse->result);
+               printf("############## Publish resource response received [%s]\n", clientResponse->resourceUri);
+       }
+
+//     _cond_signal();
+
+       return OC_STACK_KEEP_TRANSACTION;
+}
+
+
+OCStackApplicationResult _handle_rd_delete_callback(void *ctx, OCDoHandle handle,
+        OCClientResponse *clientResponse)
+{
+       /* Debug */
+       if (clientResponse) {
+               printf("RD resource response received, code: %d\n", clientResponse->result);
+               printf("############## Publish resource response received [%s]\n", clientResponse->resourceUri);
+       }
+
+//     _cond_signal();
+
+       return OC_STACK_KEEP_TRANSACTION;
+}
+
+
+void* _oc_process_thd(void * ptr)
+{
+       (void) ptr;
+       while (!isExit) {
+               if (OCProcess() != OC_STACK_OK) {
+                       printf("OCStack process error\n");
+                       return NULL;
+               }
+               sleep(1);
+       }
+
+       return NULL;
+}
+
+
+int _init_oc_stack()
+{
+       ps = (OCPersistentStorage *)calloc(1, sizeof(OCPersistentStorage));
+       if (!ps) return -1;
+
+       ps->open = _client_open;
+       ps->read = fread;
+       ps->write = fwrite;
+       ps->close = fclose;
+       ps->unlink = unlink;
+
+       if (OCRegisterPersistentStorageHandler(ps) == OC_STACK_OK) {
+               printf("OCRegisterPersistentStorageHandler() succeeded\n");
+       } else {
+               printf("OCRegisterPersistentStorageHandler() failed\n");
+               return -1;
+       }
+
+       if (OCInit(NULL, 0, OC_SERVER) == OC_STACK_OK) {
+               printf("OCInit() succeeded\n");
+       } else {
+               printf("OCInit() failed\n");
+               return -1;
+       }
+
+#ifdef _USE_WWST_
+       if (OCInitPM(OC_SECURITY_SQL_DB_FILE_NAME) == OC_STACK_OK) {
+               printf("OCInitPM() is succeeded!\n");
+       } else {
+               printf("OCInitPM() is failed");
+               return -1;
+       }
+#endif
+       _set_platform_info();
+
+       _set_device_info();
+
+       return 0;
+}
+
+
+int  _init_default_test_res()
+{
+#if 0
+       OCUUIdentity deviceId;
+       if (OCGetDeviceId(&deviceId) == OC_STACK_OK) {
+               printf("OCGetDeviceId() is succeeded\n");
+       } else {
+               printf("OCGetDeviceId() is failed\n");
+               return -1;
+       }
+#endif
+
+       /* Create air conditioner resource handle */
+       if (OCCreateResource(&res_handle[0],
+#ifdef _USE_WWST_
+                                               "oic.r.switch.binary",
+                                               "oic.if.baseline",
+                                               "/capability/switch/0",
+                                               _handle_oc_entity, NULL,
+                                               OC_DISCOVERABLE|OC_OBSERVABLE) != OC_STACK_OK) {
+#else
+                                               "x.com.samsung.da.device",
+                                               OC_RSRVD_INTERFACE_DEFAULT,
+                                               "/sec/aircon/0",
+                                               _handle_oc_entity, NULL,
+                                               OC_DISCOVERABLE) != OC_STACK_OK) {
+#endif
+               printf("OCCreateResource() failed\n");
+               return -1;
+       }
+
+/* oic.if.b, oic.if.ll */
+/*
+       if (OCBindResourceInterfaceToResource(res_handle[0], OC_RSRVD_INTERFACE_BATCH) != OC_STACK_OK) {
+               printf("OCBindResourceInterfaceToResource() [%s] failed\n", OC_RSRVD_INTERFACE_BATCH);
+       }
+
+       if (OCBindResourceInterfaceToResource(res_handle[0], OC_RSRVD_INTERFACE_LL) != OC_STACK_OK) {
+               printf("OCBindResourceInterfaceToResource() [%s] failed\n", OC_RSRVD_INTERFACE_LL);
+       }
+*/
+
+//     if (OCBindResource(aircon_handle, binary_switch_handle) != OC_STACK_OK) {
+//             printf("OCBindResource() failed\n");
+//             return -1;
+//     }
+
+   return 0;
+}
+
+
+int _create_fw_res()
+{
+       fmwup_create_firmware_resource(&res_handle[1]);
+
+//     if (OCBindResource(aircon_handle, firmware_handle) != OC_STACK_OK) {
+//             printf("OCBindResource() failed\n");
+//             return -1;
+//     }
+
+       return 0;
+}
+
+
+int _publish_fw_res_to_rd()
+{
+       OCCallbackData cb_data = {NULL, NULL, NULL};
+       cb_data.cb = _handle_rd_publish_callback;
+       cb_data.context = (void *)DEFAULT_CONTEXT_VALUE;
+
+       char uri[MAX_URI_LENGTH] = { 0 };
+       snprintf(uri, MAX_URI_LENGTH, "%s%s", CLOUD_PROTOCOL, CLOUD_STG_SERVER);
+
+#ifdef _USE_WWST_
+//     if (OCRDPublish(NULL, uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
+//                     NULL, 0,
+//                     &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
+//             printf("OCRDPublish() failed\n");
+//             return -1;
+//     }
+//
+////   _lock_and_wait();
+//
+//     if (OCRDPublish(NULL, uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
+//                     res_handle, 2,
+//                     &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
+//             printf("OCRDPublish() failed\n");
+//             return -1;
+//     }
+
+       int ocResult = OC_STACK_OK;
+       ocResult = OCRDPublish(NULL, uri, (CT_ADAPTER_TCP | CT_IP_USE_V4), NULL, 0, &cb_data, OC_LOW_QOS);
+       if (ocResult != OC_STACK_OK) {
+               printf("Publish Resource with null handle failed");
+               return -1;
+       }
+
+       ocResult = OCRDPublish(NULL, uri, (CT_ADAPTER_TCP | CT_IP_USE_V4), &res_handle[0], 1, &cb_data, OC_LOW_QOS);
+       if (ocResult != OC_STACK_OK) {
+               printf("Publish Resource failed [%d]", ocResult);
+               return -1;
+       }
+
+       ocResult = OCRDPublish(NULL, uri, (CT_ADAPTER_TCP | CT_IP_USE_V4), &res_handle[1], 1, &cb_data, OC_LOW_QOS);
+       if (ocResult != OC_STACK_OK) {
+               printf("Publish firmware Resource failed [%d]", ocResult);
+               return -1;
+       }
+
+
+#else
+       if (OCRDPublish(uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
+                       NULL, 0,
+                       &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
+               printf("OCRDPublish() failed\n");
+               return -1;
+       }
+
+//     _lock_and_wait();
+
+       if (OCRDPublish(uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
+                       res_handle, 2,
+                       &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
+               printf("OCRDPublish() failed\n");
+               return -1;
+       }
+#endif
+
+//     _lock_and_wait();
+
+       fmwup_check_firmware_upgraded();
+
+       return 0;
+}
+
+
+int _delete_fw_res_from_rd()
+{
+       OCCallbackData cb_data = {NULL, NULL, NULL};
+       cb_data.cb = _handle_rd_delete_callback;
+       cb_data.context = (void *)DEFAULT_CONTEXT_VALUE;
+
+       char uri[MAX_URI_LENGTH] = { 0 };
+       snprintf(uri, MAX_URI_LENGTH, "%s%s", CLOUD_PROTOCOL, CLOUD_STG_SERVER);
+
+#ifdef _USE_WWST_
+       if (OCRDDelete(NULL, uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
+                       res_handle, 2,
+                       &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
+               printf("OCRDDelete() failed\n");
+               return -1;
+       }
+#else
+       if (OCRDDelete(uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
+                       res_handle, 2,
+                       &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
+               printf("OCRDDelete() failed\n");
+               return -1;
+       }
+#endif
+
+//     _lock_and_wait();
+
+       return 0;
+}
+
+
+int _destory_fw_res()
+{
+       if (fmwup_destory_firmware_resource(&res_handle[1]) != FMWUP_SUCCESS) {
+               return -1;
+       }
+
+       return 0;
+}
+
+
+int _destory_default_res()
+{
+       if (OCDeleteResource(res_handle[0]) != OC_STACK_OK) {
+               printf("OCDeleteResource() failed for aircon_handle\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+
+static void _state_changed_cb(fmwup_state_e value)
+{
+       printf("state_changed_cb [%d]\n", value);
+}
+
+
+int _set_state_changed_cb()
+{
+       printf("_set_state_changed_cb\n");
+       if (fmwup_set_state_changed_cb(_state_changed_cb) != FMWUP_SUCCESS)
+               return -1;
+
+       return 0;
+}
+
+
+int _unset_state_changed_cb()
+{
+       fmwup_unset_resource_changed_cb();
+       return 0;
+}
+
+
+int _set_active_check()
+{
+       if (fmwup_get_newest_firmware_from_server() != FMWUP_SUCCESS)
+               return -1;
+
+       return 0;
+}
+
+
+int _get_fw_res_value()
+{
+       char *temp_value = NULL;
+       if (fmwup_get_firmware_resource_value(FMWUP_RES_UPDATE_STATE, &temp_value) != FMWUP_SUCCESS) {
+               return -1;
+       } else {
+               printf("RES_UPDATE_STATE [%s]\n", temp_value);
+               g_free(temp_value);
+       }
+
+       if (fmwup_get_firmware_resource_value(FMWUP_RES_UPDATE_RESULT, &temp_value) != FMWUP_SUCCESS) {
+               return -1;
+       } else {
+               printf("RES_UPDATE_RESULT [%s]\n", temp_value);
+               g_free(temp_value);
+       }
+
+       if (fmwup_get_firmware_resource_value(FMWUP_RES_CURRENT_VERSION, &temp_value) != FMWUP_SUCCESS) {
+               return -1;
+       } else {
+               printf("RES_CURRENT_VERSION [%s]\n", temp_value);
+               g_free(temp_value);
+       }
+
+       if (fmwup_get_firmware_resource_value(FMWUP_RES_NEW_VERSION, &temp_value) != FMWUP_SUCCESS) {
+               return -1;
+       } else {
+               printf("RES_NEW_VERSION [%s]\n", temp_value);
+               g_free(temp_value);
+       }
+
+       return 0;
+}
+
+void _show_menu()
+{
+       printf("============================================\n");
+       printf("=== Controlee firmware resource test app ===\n");
+       printf("============================================\n");
+       printf(" [A] Create Resource & Sign Up/In & publish\n");
+       printf(" [C] Sign Up/In\n");
+       printf(" [D] Sign Out\n");
+       printf(" [E] Set Active check\n");
+       printf(" [1] Create default resource\n");
+       printf(" [2] Create firmware resource\n");
+       printf(" [3] Publish resources to RD\n");
+       printf(" [4] Delete resources from RD\n");
+       printf(" [5] Destroy firmware resource\n");
+       printf(" [6] Destroy default resource\n");
+       printf(" [7] Set state changed callback\n");
+       printf(" [8] Unset state changed callback\n");
+       printf(" [9] Get firmware resource value\n");
+       printf(" [0] Exit\n");
+       printf("============================================\n");
+       printf("Input test menu : \n");
+}
+
+#define _G_IO_WATCH_
+
+#ifdef _G_IO_WATCH_
+gboolean _main_thread(GIOChannel *channel, GIOCondition condition, gpointer data)
+#else
+void* _main_thread(void *data)
+#endif
+{
+#ifdef _G_IO_WATCH_
+       if (condition != G_IO_IN)
+               return false;
+
+       int rv = 0;
+       gsize length;
+       gchar *str_ret;
+
+       g_io_channel_read_line(channel, &str_ret, &length, NULL, NULL);
+       if (!str_ret)
+               return false;
+#else
+       (void)data;
+       int rv = 0;
+       char str_ret[10];
+
+       while (true) {
+       memset(str_ret, 0x00, sizeof(str_ret));
+
+       scanf("%s", str_ret);
+
+#endif
+
+       if (str_ret[0] == '\n' || str_ret[0] == '\r') {
+               _show_menu();
+       } else {
+               switch (str_ret[0]) {
+               case 'A' :
+               case 'a' :
+                       rv += _set_state_changed_cb();;
+                       rv += _init_default_test_res();
+                       rv += _create_fw_res();
+                       g_auto_publish = true;
+                       rv += _signup();
+                       break;
+               case 'C' :
+               case 'c' :
+                       g_auto_publish = false;
+                       rv = _signup();
+                       break;
+               case 'D' :
+               case 'd' :
+                       rv = _signout();
+                       break;
+               case 'E' :
+               case 'e' :
+                       rv = _set_active_check();
+                       break;
+               case '1':
+                       rv = _init_default_test_res();
+                       break;
+               case '2':
+                       rv = _create_fw_res();
+                       break;
+               case '3':
+                       rv = _publish_fw_res_to_rd();
+                       break;
+               case '4':
+                       rv = _delete_fw_res_from_rd();
+                       break;
+               case '5':
+                       rv = _destory_fw_res();
+                       break;
+               case '6':
+                       rv = _destory_default_res();
+                       break;
+               case '7':
+                       rv = _set_state_changed_cb();
+                       break;
+               case '8':
+                       rv = _unset_state_changed_cb();
+                       break;
+               case '9':
+                       rv = _get_fw_res_value();
+                       break;
+               case '0' :
+                       printf("Exit from test app!\n");
+                       exit(0);
+                       break;
+               default :
+                       break;
+               }
+
+               if (rv == 0)
+                       printf("[%c]operation succeeded!\n", str_ret[0]);
+               else
+                       printf("[%c]operation failed!\n", str_ret[0]);
+
+               printf("\n*** Press 'enter' to show menu *** \n");
+       }
+
+#ifdef _G_IO_WATCH_
+       g_free(str_ret);
+       return true;
+#else
+
+       }
+
+       return NULL;
+#endif
+}
+
+
+int main(int argc, char *argv[])
+{
+       GMainLoop *mainloop;
+
+#if !GLIB_CHECK_VERSION(2, 36, 0)
+       g_type_init();
+#endif
+
+       bSignin = false;
+       isExit = false;
+       ps = NULL;
+       switch_power = true;
+
+       mainloop = g_main_loop_new(NULL, false);
+
+       if (_init_oc_stack() != 0) {
+               printf("Fail to _init_oc_stack()\n");
+               return -1;
+       }
+
+       pthread_t oc_proc_thd;
+       pthread_create(&oc_proc_thd, NULL, _oc_process_thd, NULL);
+
+       _show_menu();
+
+#ifdef _G_IO_WATCH_
+       GIOChannel *channel = g_io_channel_unix_new(0);
+       g_io_add_watch(channel, (G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL), _main_thread, NULL);
+#else
+       pthread_t test_thd;
+       pthread_create(&test_thd, NULL, _main_thread, NULL);
+#endif
+
+       g_main_loop_run(mainloop);
+
+       if (ps)
+               free(ps);
+
+       return 0;
+}