Resource publish 84/140284/2
authorSangkoo Kim <sangkoo.kim@samsung.com>
Mon, 24 Jul 2017 10:04:42 +0000 (19:04 +0900)
committerSangkoo Kim <sangkoo.kim@samsung.com>
Mon, 24 Jul 2017 11:07:22 +0000 (20:07 +0900)
Change-Id: I5f7e6d078368dac2a6fb7412cc8303c546965d22
Signed-off-by: Sangkoo Kim <sangkoo.kim@samsung.com>
CMakeLists.txt
inc/controlee_firmware_resource.h
inc/controlee_firmware_resource_internal.h
packaging/controlee-firmware-resource.spec
src/controlee_firmware_resource.c
src/controlee_firmware_resource_internal.c
test/controlee_firmware_test.c

index f87d5abb0a4690aff056efa66c63a62f7be7e908..c894d2ab970e3d1ed91c7a47dbbf70d7b7e40c8b 100644 (file)
@@ -30,6 +30,7 @@ PKG_CHECK_MODULES(controlee_fw_pkgs REQUIRED
        glib-2.0
        iotivity
        libcurl
+       vconf
        )
 
 FOREACH(flag ${controlee_fw_pkgs_CFLAGS})
index 4cc6c699126f39ce06274ece2682eb82c2bea3ce..7a49ded2ba3541a82a48b7d62a749953869b841c 100644 (file)
@@ -76,10 +76,6 @@ typedef enum {
 } firmware_res_prop_e;
 #endif
 
-typedef void (*publish_finish_cb)(OCStackResult result);
-
-typedef void (*destroy_finish_cb)(OCStackResult result);
-
 typedef void (*state_changed_cb)(controlee_firmware_state_e value);
 
 
@@ -103,6 +99,8 @@ EXPORT_API int controlee_get_firmware_resource_value(controlee_firmware_h firmwa
                                           controlee_firmware_res_type_e res_type,
                                           char **value);
 
+EXPORT_API int controlee_check_firmware_upgraded(void);
+
 
 #ifdef __cplusplus
 }
index ef9804f68600b42dd7770cd0a13355b7dd93b0f3..decd647523639d751c8c0a0a95748470497badaf 100644 (file)
@@ -13,6 +13,8 @@
 #include <octypes.h>
 #include <ocpayload.h>
 #include <system_info.h>
+#include <dlog.h>
+#include <vconf.h>
 
 #include "controlee_firmware_resource.h"
 
 #define OC_RSRVD_FIRMWARE_PACKAGE_URI          "packageuri"
 #define OC_RSRVD_FIRMWARE_UPDATE                       "update"
 
-#define OC_CONTROLEE_DATA_FILE_PATH
+#define VCONF_FIRMWARE_UPDATE_STATE    "db/private/firmware_update/state"
+#define VCONF_FIRMWARE_UPDATE_RESULT   "db/private/firmware_update/result"
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#define LOG_TAG "FIRMWARE_RESOURCE"
+#endif
+
+#define FWR_LOGD(fmt, args...)  LOGD(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 {
     int state;         //controlee_firmware_state_e - 0: Idle, 1: Downloading, 2: Downloaded, 3: Updating
@@ -56,7 +69,7 @@ typedef enum {
        CONTROLEE_HTTP_DELETE
 }controlee_http_req_e;
 
-OCEntityHandlerResult controlee_handle_oc_entity(OCEntityHandlerFlag flag,
+OCEntityHandlerResult controlee_handle_firmware_entity(OCEntityHandlerFlag flag,
                                                                                OCEntityHandlerRequest *entityHandlerRequest,
                                                                                void *callbackParam);
 
@@ -66,7 +79,7 @@ void controlee_get_firmware_info(controlee_firmware_s *firmware_info);
 
 void controlee_create_firmware_info_file(void);
 
-void controlee_check_firmware_upgraded(void);
+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);
 
index c0b012217eb99a4da76383397d16b20acefe253b..dbf0742283134156fda926514571a644db59f7c1 100644 (file)
@@ -16,6 +16,7 @@ BuildRequires: pkgconfig(glib-2.0)
 BuildRequires: pkgconfig(iotivity)
 BuildRequires: pkgconfig(key-manager)
 BuildRequires: pkgconfig(libcurl)
+BuildRequires: pkgconfig(vconf)
 
 %description
 Description: Controlee firmware resource API
@@ -52,6 +53,8 @@ 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
 
 %postun 
 /sbin/ldconfig
@@ -67,5 +70,5 @@ rm -rf %{buildroot}
 %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
+#%config(noreplace) /opt/usr/data/ua-client/thawte.cert.pem
+#%config(noreplace) /opt/usr/data/ua-client/oic_svr_db_client.dat
index 1dcc0ae48b546c62578875517fb640c47e6382cf..d8132de20b34b1322c9ef38d3e93aacb1487f518 100644 (file)
@@ -20,7 +20,7 @@ int controlee_create_firmware_resource(OCResourceHandle *firmware_res_h)
 
        if (OCCreateResource(&oc_handle, "x.samsung.firmware",
                                                OC_RSRVD_INTERFACE_DEFAULT, "/firmware",  /* OC_RSRVD_INTERFACE_DEFAULT : "oic.if.baseline" */
-                                               controlee_handle_oc_entity, NULL,
+                                               controlee_handle_firmware_entity, NULL,
                                                OC_DISCOVERABLE | OC_OBSERVABLE) != OC_STACK_OK) {
                return CONTROLEE_FIRMWARE_OPERATION_FAILED;
        }
@@ -28,7 +28,6 @@ int controlee_create_firmware_resource(OCResourceHandle *firmware_res_h)
        tmp_firmware_res = (controlee_firmware_s *)calloc(1, sizeof(controlee_firmware_s));
        if (tmp_firmware_res == NULL) return CONTROLEE_FIRMWARE_MEMORY_ERR;
 
-       controlee_create_firmware_info_file();
        controlee_get_firmware_info(tmp_firmware_res);
 
        tmp_firmware_res->resource_handle = oc_handle;
@@ -39,67 +38,6 @@ int controlee_create_firmware_resource(OCResourceHandle *firmware_res_h)
        return CONTROLEE_FIRMWARE_SUCCESS;
 }
 
-OCStackApplicationResult _handle_rd_publish_callback(void *ctx, OCDoHandle handle,
-        OCClientResponse *clientResponse)
-{
-       /* Debug */
-       if (clientResponse) {
-               //LOG("RD resource response received, code: %d", clientResponse->result);
-       }
-
-       publish_finish_cb callback = (publish_finish_cb)ctx;
-       if (callback)  {
-               if (clientResponse)
-                       callback(clientResponse->result);
-               else
-                       callback(OC_STACK_ERROR);
-       }
-
-       controlee_check_firmware_upgraded();
-
-       return OC_STACK_KEEP_TRANSACTION;
-}
-
-OCStackApplicationResult _handle_rd_delete_callback(void *ctx, OCDoHandle handle,
-        OCClientResponse *clientResponse)
-{
-       /* Debug */
-       if (clientResponse) {
-               //LOG("RD resource response received, code: %d", clientResponse->result);
-       }
-
-       publish_finish_cb callback = (destroy_finish_cb)ctx;
-       if (callback)  {
-               if (clientResponse)
-                       callback(clientResponse->result);
-               else
-                       callback(OC_STACK_ERROR);
-       }
-
-       return OC_STACK_KEEP_TRANSACTION;
-}
-
-#if 0
-int controlee_publish_firmware_resource(controlee_firmware_h firmware_res_h, const char *server_url, publish_finish_cb callback)
-{
-       if (!firmware_res_h)
-               return CONTROLEE_FIRMWARE_NULL_PTR;
-
-       OCCallbackData cb_data = {NULL, NULL, NULL};
-       cb_data.cb = _handle_rd_publish_callback;
-       cb_data.context = (void *)callback;
-
-       controlee_firmware_s *firmware_res = (controlee_firmware_s *)firmware_res_h;
-
-       if (OCRDPublish(server_url, CT_ADAPTER_TCP,
-                       firmware_res->resource_handle, 1,
-                       &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
-               return CONTROLEE_FIRMWARE_OPERATION_FAILED;
-       }
-
-       return CONTROLEE_FIRMWARE_SUCCESS;
-}
-#endif
 
 int controlee_destory_firmware_resource(OCResourceHandle firmware_res_h)
 {
@@ -182,8 +120,37 @@ int controlee_get_firmware_resource_value(controlee_firmware_h firmware_res_h,
                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);
+               }
+       }
+
+       return CONTROLEE_FIRMWARE_SUCCESS;
+}
index a365d63918fe15a4e4e34a21208b1b6705a3a08d..bd1458b8acd6e2aa6b8686b744c91a332c091ffb 100644 (file)
@@ -43,7 +43,7 @@ OCEntityHandlerResult _check_request_payload(OCEntityHandlerRequest *ehRequest)
                        (ehRequest->query && (g_strcmp0(ehRequest->query, "") && \
                        !_compare_resource_interface(ehRequest->query, OC_RSRVD_INTERFACE_DEFAULT))))
        {
-               //LOG("Not supported Interface");
+               FWR_LOGD("Not supported Interface");
                return OC_EH_BAD_REQ;
        }
 
@@ -55,53 +55,50 @@ static void _exec_update()
 {
        FILE* fp = fopen(UPDATE_FILE, "w");
        if(!fp) {
-               //LOG("fopen error: %d", errno);
+               FWR_LOGD("fopen error: %d", errno);
                return;
        }
        fclose(fp);
 }
 
 
-void _propagate_firmware_resource(void)
+void controlee_propagate_firmware_resource(void)
 {
        if(OC_STACK_NO_OBSERVERS == OCNotifyAllObservers(g_firmware_resource->resource_handle, OC_HIGH_QOS)) {
-               //LOG("Firmware-Resource doesn't have any observers.");
+               FWR_LOGD("Firmware-Resource doesn't have any observers.");
        }
 }
 
 
 void _handle_update_command(int64_t update_type)
 {
-       char szState[2] = {0,};
-
        if ((g_firmware_resource->state == 0 && update_type == CONTROLEE_FIRMWARE_EXEC_DOWNLOAD) ||
                        (g_firmware_resource->state == 1 && 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)) {
-                       //LOG("***Downloading image from [%s] ***", g_firmware_resource->package_uri);
+                       FWR_LOGD("***Downloading image from [%s] ***", g_firmware_resource->package_uri);
                        g_firmware_resource->state = CONTROLEE_FIRMWARE_STATE_DOWNLOADING;
                        g_firmware_resource->result = 0;
-                       _propagate_firmware_resource();
+                       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;
-                               snprintf(szState, sizeof(szState), "%d", g_firmware_resource->state);
-                               controlee_set_firmware_info("firmware_update_state", szState);
-                               _propagate_firmware_resource();
+                               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;
                        }
 
-                       //LOG("*** Firmware image downloaded ***");
+                       FWR_LOGD("*** Firmware image downloaded ***");
                        g_firmware_resource->state = CONTROLEE_FIRMWARE_STATE_DOWNLOADED;
-                       snprintf(szState, sizeof(szState), "%d", g_firmware_resource->state);
-                       controlee_set_firmware_info("firmware_update_state", szState);
-                       _propagate_firmware_resource();
+                       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);
                        }
@@ -115,9 +112,8 @@ void _handle_update_command(int64_t update_type)
        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;
-                       snprintf(szState, sizeof(szState), "%d", g_firmware_resource->state);
-                       controlee_set_firmware_info("firmware_update_state", szState);
-                       _propagate_firmware_resource();
+                       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);
                        }
@@ -129,27 +125,17 @@ void _handle_update_command(int64_t update_type)
 
 OCRepPayload* _construct_response_of_firmware()
 {
-       //LOG("_construct_response_of_firmware()");
+       FWR_LOGD("_construct_response_of_firmware()");
        OCRepPayload* payload = OCRepPayloadCreate();
        if (!payload) {
-               //LOG("Failed to allocate Payload");
-               return NULL;
-       }
-
-       if(!g_firmware_resource || g_firmware_resource->resource_handle == NULL) {
-               //LOG("Firmware resource is not created");
+               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);
-
        OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_CURRENT_VERSION, g_firmware_resource->current_version);
        OCRepPayloadSetPropString(payload, OC_RSRVD_FIRMWARE_NEW_VERSION, g_firmware_resource->new_version);
-       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_STATE, (int)g_firmware_resource->state);
-       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_RESULT, (int)g_firmware_resource->result);
+       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_STATE, (int64_t)g_firmware_resource->state);
+       OCRepPayloadSetPropInt(payload, OC_RSRVD_FIRMWARE_RESULT, (int64_t)g_firmware_resource->result);
 
        return payload;
 }
@@ -176,7 +162,7 @@ void _update_firmware_resource(OCRepPayload *input)
                        }
                }
                g_free(new_firmware);
-               //LOG("g_firmware_resource->new_version = [%s]", g_firmware_resource->new_version);
+               FWR_LOGD("g_firmware_resource->new_version = [%s]", g_firmware_resource->new_version);
        }
 
        char *package_uri = NULL;
@@ -186,86 +172,57 @@ void _update_firmware_resource(OCRepPayload *input)
                        g_firmware_resource->package_uri = g_strdup(new_firmware);
                }
                g_free(package_uri);
-               //LOG("g_firmware_resource->package_uri = [%s]", g_firmware_resource->package_uri);
+               FWR_LOGD("g_firmware_resource->package_uri = [%s]", g_firmware_resource->package_uri);
        }
 
        int64_t *update = (int64_t *)calloc(1, sizeof(int64_t));
        if (OCRepPayloadGetPropInt(input, OC_RSRVD_FIRMWARE_UPDATE, update)) {
-               //LOG("update command = [%d]", update);
+               FWR_LOGD("update command = [%d]", update);
                pthread_t pThread;
                pthread_create(&pThread, NULL, _worker, update);
        }
 
-       _propagate_firmware_resource();
+       controlee_propagate_firmware_resource();
 }
 
 
 OCEntityHandlerResult _process_get_request(OCEntityHandlerRequest *ehRequest, OCRepPayload **payload)
 {
-       OCEntityHandlerResult ehResult = OC_EH_ERROR;
-       if (!ehRequest) {
-               //LOG("Request is Null");
-               return ehResult;
-       }
-
-       if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
-               //LOG("Incoming payload not a representation");
-               return ehResult;
-       }
-
-       OCRepPayload *getResp = NULL;
-       *payload = NULL;
-
-       if(ehRequest->resource ==g_firmware_resource->resource_handle) {
-               if(_check_request_payload(ehRequest) != OC_EH_OK) {
-                       //LOG("Not supported Interface");
-                       return OC_EH_BAD_REQ;
-               } else {
-                       getResp = _construct_response_of_firmware();
-               }
-       }
-
-       if (!getResp) {
-               //LOG("constructResponse failed");
+       OCRepPayload *getResp = _construct_response_of_firmware(ehRequest);
+       if (!getResp)
+       {
+               FWR_LOGD("constructResponse failed");
                return OC_EH_ERROR;
        }
 
        *payload = getResp;
-       ehResult = OC_EH_OK;
 
-       return ehResult;
+       return OC_EH_OK;
 }
 
 
 OCEntityHandlerResult _process_post_request(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload)
 {
-       //LOG("ProcessPostRequest enter");
+       FWR_LOGD("ProcessPostRequest enter");
        OCEntityHandlerResult ehResult = OC_EH_ERROR;
        if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
-               //LOG("Incoming payload not a representation");
+               FWR_LOGD("Incoming payload not a representation");
                return ehResult;
        }
 
        OCRepPayload* input = (OCRepPayload*)(ehRequest->payload);
        if (!input) {
-               //LOG("Failed to parse");
+               FWR_LOGD("Failed to parse");
                return ehResult;
        }
 
-       if(ehRequest->resource == g_firmware_resource->resource_handle) {
-               if(_check_request_payload(ehRequest) != OC_EH_OK) {
-                       //LOG("Not supported Interface");
-                       return OC_EH_BAD_REQ;
-               } else {
-                       _update_firmware_resource(input);
-               }
-       }
+       _update_firmware_resource(input);
 
        OCRepPayload *getResp = NULL;
        getResp = _construct_response_of_firmware();
 
        if (!getResp) {
-               //LOG("constructResponse failed");
+               FWR_LOGD("constructResponse failed");
                return OC_EH_ERROR;
        }
 
@@ -276,7 +233,7 @@ OCEntityHandlerResult _process_post_request(OCEntityHandlerRequest *ehRequest, O
 }
 
 
-OCEntityHandlerResult controlee_handle_oc_entity(OCEntityHandlerFlag flag,
+OCEntityHandlerResult controlee_handle_firmware_entity(OCEntityHandlerFlag flag,
                                                                                OCEntityHandlerRequest *entityHandlerRequest,
                                                                                void *callbackParam)
 {
@@ -287,41 +244,43 @@ OCEntityHandlerResult controlee_handle_oc_entity(OCEntityHandlerFlag flag,
 
        if (entityHandlerRequest && (flag & OC_REQUEST_FLAG)) {
                if (OC_REST_GET == entityHandlerRequest->method) {
-                       //LOG("Received OC_REST_GET request");
+                       FWR_LOGD("Received OC_REST_GET request");
                        ehRet = _process_get_request(entityHandlerRequest, &payload);
                } else if (OC_REST_PUT == entityHandlerRequest->method) {
-                       //LOG("Received OC_REST_PUT request, nothing to do");
+                       FWR_LOGD("Received OC_REST_PUT request, nothing to do");
                } else if (OC_REST_POST == entityHandlerRequest->method) {
-                       //LOG("Received OC_REST_POST from client");
+                       FWR_LOGD("Received OC_REST_POST from client");
                        ehRet = _process_post_request(entityHandlerRequest, &payload);
                }
 
-               // Format the response.  Note this requires some info about the request
-               response.requestHandle = entityHandlerRequest->requestHandle;
-               response.resourceHandle = entityHandlerRequest->resource;
-               response.ehResult = ehRet;
-               //response uses OCPaylod while all get,put methodes use OCRepPayload
-               response.payload = (OCPayload*)payload;
-               response.numSendVendorSpecificHeaderOptions = 0;
-               memset(response.sendVendorSpecificHeaderOptions, 0,
-                               sizeof(response.sendVendorSpecificHeaderOptions));
-               memset(response.resourceUri, 0, sizeof(response.resourceUri));
-               // Indicate that response is NOT in a persistent buffer
-               response.persistentBufferFlag = 0;
-
-               // Send the response
-               if (OCDoResponse(&response) != OC_STACK_OK) {
-                       //LOG("Error sending response");
-                       ehRet = OC_EH_ERROR;
+               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)) {
-               //LOG("Flag includes OC_OBSERVE_FLAG");
+               FWR_LOGD("Flag includes OC_OBSERVE_FLAG");
                if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action) {
-                       //LOG ("Received OC_OBSERVE_REGISTER from Mediator");
+                       FWR_LOGD("Received OC_OBSERVE_REGISTER from client");
                } else if (OC_OBSERVE_DEREGISTER == entityHandlerRequest->obsInfo.action) {
-                       //LOG ("Received OC_OBSERVE_DEREGISTER from Mediator");
+                       FWR_LOGD("Received OC_OBSERVE_DEREGISTER from client");
                }
        }
 
@@ -329,143 +288,58 @@ OCEntityHandlerResult controlee_handle_oc_entity(OCEntityHandlerFlag flag,
 }
 
 
-void controlee_create_firmware_info_file(void)
-{
-       FILE *fp;
-       char *file_path= NULL;;
-
-       if (!g_app_data_path) {
-               g_app_data_path = app_get_data_path();
-       }
-
-       file_path = g_strconcat(g_app_data_path, "/firmware_info.ini", NULL);
-
-       if (access(file_path, F_OK) == -1) {
-               fp = fopen(file_path, "wb");
-               fclose(fp);
-               controlee_set_firmware_info("firmware_update_state", "0");
-       }
-
-       g_free(file_path);
-}
-
-
-void controlee_set_firmware_info(const char *key, const char *value)
-{
-       //LOG("_set_device_info() key = %s, value = %s", key, value);
-       GKeyFile *keyfile;
-       GKeyFileFlags flags = G_KEY_FILE_NONE;
-       GError *error = NULL;
-       char *file_path = NULL;
-
-       if (!g_app_data_path) {
-               g_app_data_path = app_get_data_path();
-       }
-
-       keyfile = g_key_file_new();
-
-       file_path = g_strconcat(g_app_data_path, "/firmware_info.ini", NULL);
-
-       if (!g_key_file_load_from_file(keyfile, file_path, flags, &error)) {
-               //LOG("error=[%s]", error->message);
-       } else {
-               g_key_file_set_string(keyfile, "firmware_info", key, value);
-               g_key_file_save_to_file(keyfile, file_path, NULL);
-               g_key_file_unref(keyfile);
-       }
-
-       g_free(file_path);
-}
-
-
 void controlee_get_firmware_info(controlee_firmware_s *firmware_info)
 {
-       GKeyFile *keyfile;
-       GKeyFileFlags flags = G_KEY_FILE_NONE;
-       GError *error = NULL;
-       char *file_path = NULL;
-
-       keyfile = g_key_file_new();
-
-       if (!g_app_data_path) {
-               g_app_data_path = app_get_data_path();
-       }
-
-       file_path = g_strconcat(g_app_data_path, "/firmware_info.ini", NULL);
-
-       // wait for /opt/ mount
-       while (1) {
-               if (g_key_file_load_from_file(keyfile, file_path, flags, &error))
-                       break;
-               else
-                       sleep(5);
-       }
-
-       g_free(file_path);
-
        char *manufacturer = NULL;
        char *model_name = NULL;
        char *cur_firmware_ver = NULL;
-       char *update_state = NULL;
-       char *update_result = NULL;
-
-       update_state = g_key_file_get_string(keyfile, "firmware_info", "firmware_update_state", NULL);
-       g_key_file_unref(keyfile);
-
+       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) {
-               //LOG("system_info_get_platform_string() is failed");
+               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) {
-               //LOG("system_info_get_platform_string() is failed");
+               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) {
-               //LOG("system_info_get_platform_string() is failed");
+               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");
        }
 
-       //LOG("manufacturer=[%s]", manufacturer);
-       //LOG("model_name=[%s]", model_name);
-       //LOG("firmware_ver=[%s]", cur_firmware_ver);
-       //LOG("firmware_update_state=[%s]", update_state);
-       //LOG("firmware_update_result=[%s]", update_result);
+       FWR_LOGD("manufacturer=[%s]", manufacturer);
+       FWR_LOGD("model_name=[%s]", model_name);
+       FWR_LOGD("firmware_ver=[%s]", cur_firmware_ver);
+       FWR_LOGD("firmware_update_state=[%d]", update_state);
+       FWR_LOGD("firmware_update_result=[%d]", update_result);
 
-       firmware_info->current_version = g_strdup(manufacturer);
+       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->state = atoi(update_state);
-       firmware_info->result = atoi(update_result);
+       firmware_info->new_version = g_strdup("");
+       firmware_info->state = update_state;
+       firmware_info->result = update_result;
 
        g_free(manufacturer);
        g_free(model_name);
        g_free(cur_firmware_ver);
-       g_free(update_state);
-       g_free(update_result);
 }
 
-void controlee_check_firmware_upgraded(void)
-{
-       if (!g_firmware_resource) {
-               //LOG("g_firmware_resource is NULL");
-               return;
-       }
-
-       if (g_firmware_resource->state == CONTROLEE_FIRMWARE_STATE_UPDATING) {
-               //LOG("***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;
-
-               controlee_set_firmware_info("firmware_update_state", "0");
-
-               _propagate_firmware_resource();
-
-               if (g_state_changed_cb) {
-                       g_state_changed_cb(g_firmware_resource->state);
-               }
-       }
-}
index ed9ac398168cf6ee2368f341bbdeb82b4bc770e0..3cb04495410179c72f346c1f0c01644883cba8be 100644 (file)
@@ -27,9 +27,7 @@
 #define OC_CONTROLEE_DAT_FILE_PATH             "/opt/usr/data/ua-client/oic_svr_db_client.dat"
 #define CERT_FILE_PATH                                 "/opt/usr/data/ua-client/thawte.cert.pem"
 
-OCResourceHandle aircon_handle = NULL;
-OCResourceHandle binary_switch_handle = NULL;
-OCResourceHandle firmware_handle = NULL;
+OCResourceHandle res_handle[2];
 
 OCPersistentStorage *ps;
 
@@ -73,6 +71,8 @@ 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;
 
 
@@ -90,6 +90,8 @@ OCPlatformInfo g_platform_info = {
                "2017-07-19T12.00"                /* systemTime */
 };
 
+bool switch_power;
+
 
 int _signin();
 int _signup();
@@ -123,6 +125,23 @@ int _set_auth_cert_info()
        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;
@@ -271,8 +290,8 @@ void _set_device_info()
 {
        printf("_set_device_info() is called\n");
 
-       OCDeviceInfo        devInfoAirConditioner;
-       OCStringLL          deviceType;
+       OCDeviceInfo devInfoAirConditioner;
+       OCStringLL deviceType;
 
        deviceType.value = "oic.d.airconditioner";
        deviceType.next = NULL;
@@ -443,6 +462,7 @@ static OCStackApplicationResult _handle_signout_response(void *ctx,
                        printf("Sign-Out Failed [%d]!!!\n", response->result);
        }
 
+       bSignin = false;
        pthread_mutex_lock(&pingcycle_mutex);
        is_ping_timer = FALSE;
        pthread_mutex_unlock(&pingcycle_mutex);
@@ -603,7 +623,7 @@ OCEntityHandlerResult _check_request_payload(OCEntityHandlerRequest *ehRequest)
                        (ehRequest->query && (g_strcmp0(ehRequest->query, "") && \
                        !_compare_resource_interface(ehRequest->query, OC_RSRVD_INTERFACE_DEFAULT))))
        {
-               //LOG("Not supported Interface");
+               printf("Not supported Interface\n");
                return OC_EH_BAD_REQ;
        }
 
@@ -611,37 +631,68 @@ OCEntityHandlerResult _check_request_payload(OCEntityHandlerRequest *ehRequest)
 }
 
 
+OCRepPayload * _construct_response_of_device(OCEntityHandlerRequest *ehRequest)
+{
+       OCRepPayload* input = (OCRepPayload*)(ehRequest->payload);
+
+       if (!input) {
+               printf("Failed to parse\n");
+               return NULL;
+       }
+
+       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;
+       }
+
+       OCRepPayloadSetPropBool(payload, "value", switch_power);
+
+       return payload;
+}
+
 static OCEntityHandlerResult _handle_get_request(OCEntityHandlerRequest *ehRequest, OCRepPayload **payload)
 {
        OCEntityHandlerResult ehResult = OC_EH_ERROR;
        if (!ehRequest) {
-               //LOG("Request is Null");
+               printf("Request is Null\n");
                return ehResult;
        }
 
        if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
-               //LOG("Incoming payload not a representation");
+               printf("Incoming payload not a representation\n");
                return ehResult;
        }
 
        OCRepPayload *getResp = NULL;
        *payload = NULL;
 
-       if(ehRequest->resource == binary_switch_handle) {
+       if(ehRequest->resource == res_handle[0]) {
                if(_check_request_payload(ehRequest) != OC_EH_OK) {
-                       //LOG("Not supported Interface");
+                       printf("Not supported Interface\n");
                        return OC_EH_BAD_REQ;
                } else {
-                       //getResp = _construct_response_of_firmware();
+                       getResp = _construct_response_of_device(ehRequest);
                }
        }
 
        if (!getResp) {
-               //LOG("constructResponse failed");
+               printf("constructResponse failed\n");
                return OC_EH_ERROR;
        }
 
        *payload = getResp;
+
        ehResult = OC_EH_OK;
 
        return ehResult;
@@ -650,37 +701,32 @@ static OCEntityHandlerResult _handle_get_request(OCEntityHandlerRequest *ehReque
 
 static OCEntityHandlerResult _handle_post_request(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload)
 {
-       //LOG("ProcessPostRequest enter");
+       printf("ProcessPostRequest enter\n");
        OCEntityHandlerResult ehResult = OC_EH_ERROR;
        if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
-               //LOG("Incoming payload not a representation");
+               printf("Incoming payload not a representation\n");
                return ehResult;
        }
 
-       OCRepPayload* input = (OCRepPayload*)(ehRequest->payload);
-       if (!input) {
-               //LOG("Failed to parse");
-               return ehResult;
-       }
+       OCRepPayload *getResp = NULL;
+       *payload = NULL;
 
-       if(ehRequest->resource == binary_switch_handle) {
+       if(ehRequest->resource == res_handle[0]) {
                if(_check_request_payload(ehRequest) != OC_EH_OK) {
-                       //LOG("Not supported Interface");
+                       printf("Not supported Interface\n");
                        return OC_EH_BAD_REQ;
                } else {
-                       //_update_firmware_resource(input);
+                       getResp = _construct_response_of_device(ehRequest);
                }
        }
 
-       OCRepPayload *getResp = NULL;
-       //getResp = _construct_response_of_firmware();
-
        if (!getResp) {
-               //LOG("constructResponse failed");
+               printf("constructResponse failed\n");
                return OC_EH_ERROR;
        }
 
        *payload = getResp;
+
        ehResult = OC_EH_OK;
 
        return ehResult;
@@ -698,41 +744,43 @@ OCEntityHandlerResult _handle_oc_entity(OCEntityHandlerFlag flag,
 
        if (entityHandlerRequest && (flag & OC_REQUEST_FLAG)) {
                if (OC_REST_GET == entityHandlerRequest->method) {
-                       //LOG("Received OC_REST_GET request");
+                       printf("Received OC_REST_GET request\n");
                        ehRet = _handle_get_request(entityHandlerRequest, &payload);
                } else if (OC_REST_PUT == entityHandlerRequest->method) {
-                       //LOG("Received OC_REST_PUT request, nothing to do");
+                       printf("Received OC_REST_PUT request, nothing to do\n");
                } else if (OC_REST_POST == entityHandlerRequest->method) {
-                       //LOG("Received OC_REST_POST from client");
+                       printf("Received OC_REST_POST from client\n");
                        ehRet = _handle_post_request(entityHandlerRequest, &payload);
                }
 
-               // Format the response.  Note this requires some info about the request
-               response.requestHandle = entityHandlerRequest->requestHandle;
-               response.resourceHandle = entityHandlerRequest->resource;
-               response.ehResult = ehRet;
-               //response uses OCPaylod while all get,put methodes use OCRepPayload
-               response.payload = (OCPayload*)payload;
-               response.numSendVendorSpecificHeaderOptions = 0;
-               memset(response.sendVendorSpecificHeaderOptions, 0,
-                               sizeof(response.sendVendorSpecificHeaderOptions));
-               memset(response.resourceUri, 0, sizeof(response.resourceUri));
-               // Indicate that response is NOT in a persistent buffer
-               response.persistentBufferFlag = 0;
-
-               // Send the response
-               if (OCDoResponse(&response) != OC_STACK_OK) {
-                       //LOG("Error sending response");
-                       ehRet = OC_EH_ERROR;
+               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) {
+                               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)) {
-               //LOG("Flag includes OC_OBSERVE_FLAG");
+               printf("Flag includes OC_OBSERVE_FLAG");
                if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action) {
-                       //LOG ("Received OC_OBSERVE_REGISTER from Mediator");
+                       printf("Received OC_OBSERVE_REGISTER from client");
                } else if (OC_OBSERVE_DEREGISTER == entityHandlerRequest->obsInfo.action) {
-                       //LOG ("Received OC_OBSERVE_DEREGISTER from Mediator");
+                       printf("Received OC_OBSERVE_DEREGISTER from client");
                }
        }
 
@@ -745,18 +793,10 @@ OCStackApplicationResult _handle_rd_publish_callback(void *ctx, OCDoHandle handl
 {
        /* Debug */
        if (clientResponse) {
-               //LOG("RD resource response received, code: %d", clientResponse->result);
+               printf("RD resource response received, code: %d\n", clientResponse->result);
        }
 
-       publish_finish_cb callback = (publish_finish_cb)ctx;
-       if (callback)  {
-               if (clientResponse)
-                       callback(clientResponse->result);
-               else
-                       callback(OC_STACK_ERROR);
-       }
-
-       //controlee_check_firmware_upgraded();
+       _cond_signal();
 
        return OC_STACK_KEEP_TRANSACTION;
 }
@@ -767,16 +807,10 @@ OCStackApplicationResult _handle_rd_delete_callback(void *ctx, OCDoHandle handle
 {
        /* Debug */
        if (clientResponse) {
-               //LOG("RD resource response received, code: %d", clientResponse->result);
+               printf("RD resource response received, code: %d\n", clientResponse->result);
        }
 
-       publish_finish_cb callback = (destroy_finish_cb)ctx;
-       if (callback)  {
-               if (clientResponse)
-                       callback(clientResponse->result);
-               else
-                       callback(OC_STACK_ERROR);
-       }
+       _cond_signal();
 
        return OC_STACK_KEEP_TRANSACTION;
 }
@@ -849,7 +883,7 @@ int  _init_default_test_res()
 #endif
 
        /* Create air conditioner resource handle */
-       if (OCCreateResource(&aircon_handle, "x.com.samsung.da.device",
+       if (OCCreateResource(&res_handle[0], "x.com.samsung.da.device",
                                                OC_RSRVD_INTERFACE_DEFAULT,
                                                "/sec/aircon/0",
                                                _handle_oc_entity, NULL,
@@ -858,29 +892,18 @@ int  _init_default_test_res()
                return -1;
        }
 
-       if (OCBindResourceInterfaceToResource(aircon_handle, OC_RSRVD_INTERFACE_BATCH) != OC_STACK_OK) {
+       if (OCBindResourceInterfaceToResource(res_handle[0], OC_RSRVD_INTERFACE_BATCH) != OC_STACK_OK) {
                printf("OCBindResourceInterfaceToResource() [%s] failed\n", OC_RSRVD_INTERFACE_BATCH);
        }
 
-       if (OCBindResourceInterfaceToResource(aircon_handle, OC_RSRVD_INTERFACE_LL) != OC_STACK_OK) {
+       if (OCBindResourceInterfaceToResource(res_handle[0], OC_RSRVD_INTERFACE_LL) != OC_STACK_OK) {
                printf("OCBindResourceInterfaceToResource() [%s] failed\n", OC_RSRVD_INTERFACE_LL);
        }
 
-       /* Create binary switch resource handle */
-       if (OCCreateResource(&binary_switch_handle, "oic.r.switch.binary",
-                                               OC_RSRVD_INTERFACE_DEFAULT,
-                                               "/power/0",
-                                               _handle_oc_entity, NULL,
-                                               OC_OBSERVABLE) != OC_STACK_OK) {
-               printf("OCCreateResource() failed\n");
-               return -1;
-       }
-
-
-       if (OCBindResource(aircon_handle, binary_switch_handle) != OC_STACK_OK) {
-               printf("OCBindResource() failed\n");
-               return -1;
-       }
+//     if (OCBindResource(aircon_handle, binary_switch_handle) != OC_STACK_OK) {
+//             printf("OCBindResource() failed\n");
+//             return -1;
+//     }
 
    return 0;
 }
@@ -888,12 +911,12 @@ int  _init_default_test_res()
 
 int _create_fw_res()
 {
-       controlee_create_firmware_resource(&firmware_handle);
+       controlee_create_firmware_resource(&res_handle[1]);
 
-       if (OCBindResource(aircon_handle, firmware_handle) != OC_STACK_OK) {
-               printf("OCBindResource() failed\n");
-               return -1;
-       }
+//     if (OCBindResource(aircon_handle, firmware_handle) != OC_STACK_OK) {
+//             printf("OCBindResource() failed\n");
+//             return -1;
+//     }
 
        return 0;
 }
@@ -909,12 +932,25 @@ int _publish_fw_res_to_rd()
        snprintf(uri, MAX_URI_LENGTH, "coaps+tcp://%s", CLOUD_STG_SERVER);
 
        if (OCRDPublish(NULL, uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
-                       aircon_handle, 3,
+                       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;
+       }
+
+       _lock_and_wait();
+
+       controlee_check_firmware_upgraded();
+
        return 0;
 }
 
@@ -929,19 +965,21 @@ int _delete_fw_res_from_rd()
        snprintf(uri, MAX_URI_LENGTH, "coaps+tcp://%s", CLOUD_STG_SERVER);
 
        if (OCRDDelete(NULL, uri, CT_ADAPTER_TCP|CT_IP_USE_V4,
-                       aircon_handle, 3,
+                       res_handle, 2,
                        &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
                printf("OCRDDelete() failed\n");
                return -1;
        }
 
+       _lock_and_wait();
+
        return 0;
 }
 
 
 int _destory_fw_res()
 {
-       if (controlee_destory_firmware_resource(firmware_handle) != CONTROLEE_FIRMWARE_SUCCESS) {
+       if (controlee_destory_firmware_resource(&res_handle[1]) != CONTROLEE_FIRMWARE_SUCCESS) {
                return -1;
        }
 
@@ -951,13 +989,7 @@ int _destory_fw_res()
 
 int _destory_default_res()
 {
-
-       if (OCDeleteResource(binary_switch_handle) != OC_STACK_OK) {
-               printf("OCDeleteResource() failed for binary_switch_handle\n");
-               return -1;
-       }
-
-       if (OCDeleteResource(aircon_handle) != OC_STACK_OK) {
+       if (OCDeleteResource(res_handle[0]) != OC_STACK_OK) {
                printf("OCDeleteResource() failed for aircon_handle\n");
                return -1;
        }