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(
)
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
vconf
)
-FOREACH(flag ${controlee_fw_pkgs_CFLAGS})
+FOREACH(flag ${fmwup_pkgs_CFLAGS})
SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
ENDFOREACH(flag)
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)
-# controlee-firmware
+# fmwup library
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-#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_
-
+++ /dev/null
-/*
- * 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_ */
--- /dev/null
+#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_
+
--- /dev/null
+/*
+ * 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_ */
+++ /dev/null
-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
--- /dev/null
+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
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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);
-}
-
--- /dev/null
+#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;
+}
--- /dev/null
+#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;
+}
--- /dev/null
+#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);
+}
+
-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)
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/)
+++ /dev/null
-#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;
-}
--- /dev/null
+#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;
+}