glib-2.0
iotivity
libcurl
+ vconf
)
FOREACH(flag ${controlee_fw_pkgs_CFLAGS})
} 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);
controlee_firmware_res_type_e res_type,
char **value);
+EXPORT_API int controlee_check_firmware_upgraded(void);
+
#ifdef __cplusplus
}
#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
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);
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);
BuildRequires: pkgconfig(iotivity)
BuildRequires: pkgconfig(key-manager)
BuildRequires: pkgconfig(libcurl)
+BuildRequires: pkgconfig(vconf)
%description
Description: Controlee firmware resource API
%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
%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
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;
}
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;
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)
{
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;
+}
(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;
}
{
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);
}
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);
}
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;
}
}
}
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;
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;
}
}
-OCEntityHandlerResult controlee_handle_oc_entity(OCEntityHandlerFlag flag,
+OCEntityHandlerResult controlee_handle_firmware_entity(OCEntityHandlerFlag flag,
OCEntityHandlerRequest *entityHandlerRequest,
void *callbackParam)
{
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");
}
}
}
-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);
- }
- }
-}
#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;
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;
"2017-07-19T12.00" /* systemTime */
};
+bool switch_power;
+
int _signin();
int _signup();
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;
{
printf("_set_device_info() is called\n");
- OCDeviceInfo devInfoAirConditioner;
- OCStringLL deviceType;
+ OCDeviceInfo devInfoAirConditioner;
+ OCStringLL deviceType;
deviceType.value = "oic.d.airconditioner";
deviceType.next = NULL;
printf("Sign-Out Failed [%d]!!!\n", response->result);
}
+ bSignin = false;
pthread_mutex_lock(&pingcycle_mutex);
is_ping_timer = FALSE;
pthread_mutex_unlock(&pingcycle_mutex);
(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;
}
}
+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;
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;
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");
}
}
{
/* 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;
}
{
/* 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;
}
#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,
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;
}
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;
}
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;
}
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;
}
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;
}