char *g_download_path = NULL;
-int controlee_create_firmware_resource(controlee_firmware_h *firmware_res_h)
+int controlee_create_firmware_resource(OCResourceHandle *firmware_res_h)
{
if (!firmware_res_h)
return CONTROLEE_FIRMWARE_NULL_PTR;
tmp_firmware_res->resource_handle = oc_handle;
- *firmware_res_h = (controlee_firmware_h)tmp_firmware_res;
g_firmware_resource = tmp_firmware_res;
+ *firmware_res_h = oc_handle;
return CONTROLEE_FIRMWARE_SUCCESS;
}
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_SUCCESS;
}
+#endif
-
-int controlee_destory_firmware_resource(controlee_firmware_h firmware_res_h, const char *server_url, destroy_finish_cb callback)
+int controlee_destory_firmware_resource(OCResourceHandle firmware_res_h)
{
if (!firmware_res_h)
return CONTROLEE_FIRMWARE_NULL_PTR;
- int err = CONTROLEE_FIRMWARE_SUCCESS;
- controlee_firmware_s *firmware_res = (controlee_firmware_s *)firmware_res_h;
-
- if (firmware_res->resource_handle) {
- OCCallbackData cb_data = {NULL, NULL, NULL};
- cb_data.cb = _handle_rd_delete_callback;
- cb_data.context = (void *)callback;
-
- if (OCRDDelete(server_url, CT_ADAPTER_TCP,
- firmware_res->resource_handle, 1,
- &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
- //LOG("OCRDDelete() is failed");
- }
-
- if (OCDeleteResource(firmware_res->resource_handle) != OC_STACK_OK) {
- err = CONTROLEE_FIRMWARE_OPERATION_FAILED;
+ if (firmware_res_h == g_firmware_resource->resource_handle) {
+ if (OCDeleteResource(g_firmware_resource->resource_handle) != OC_STACK_OK) {
+ printf("OCDeleteResource() failed for firmware_resource\n");
}
- }
- g_free(firmware_res->current_version);
- g_free(firmware_res->new_version);
- g_free(firmware_res->package_uri);
- g_free(firmware_res->manufacturer);
- g_free(firmware_res->model_name);
- g_free(firmware_res);
+ 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;
+ g_firmware_resource = NULL;
+ }
- return err;
+ return CONTROLEE_FIRMWARE_SUCCESS;
}
int controlee_set_firmware_download_path(const char *download_path)
return result;
}
-
-
-
-
-
-
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <glib.h>
+#include <gio/gio.h>
+
+#include <ocstack.h>
+#include <ocpayload.h>
+#include <rd_client.h>
+
+#include <controlee_firmware_resource.h>
+
+
+#define OCF_SERVER_URL ""
+#define DEFAULT_CONTEXT_VALUE 0x99
+
+
+OCResourceHandle aircon_handle = NULL;
+OCResourceHandle binary_switch_handle = NULL;
+OCResourceHandle firmware_handle = 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))))
+ {
+ //LOG("Not supported Interface");
+ return OC_EH_BAD_REQ;
+ }
+
+ return OC_EH_OK;
+}
+
+
+static OCEntityHandlerResult _handle_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 == binary_switch_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");
+ return OC_EH_ERROR;
+ }
+
+ *payload = getResp;
+ ehResult = OC_EH_OK;
+
+ return ehResult;
+}
+
+
+static OCEntityHandlerResult _handle_post_request(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload)
+{
+ //LOG("ProcessPostRequest enter");
+ OCEntityHandlerResult ehResult = OC_EH_ERROR;
+ if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) {
+ //LOG("Incoming payload not a representation");
+ return ehResult;
+ }
+
+ OCRepPayload* input = (OCRepPayload*)(ehRequest->payload);
+ if (!input) {
+ //LOG("Failed to parse");
+ return ehResult;
+ }
+
+ if(ehRequest->resource == binary_switch_handle) {
+ if(_check_request_payload(ehRequest) != OC_EH_OK) {
+ //LOG("Not supported Interface");
+ return OC_EH_BAD_REQ;
+ } else {
+ //_update_firmware_resource(input);
+ }
+ }
+
+ OCRepPayload *getResp = NULL;
+ //getResp = _construct_response_of_firmware();
+
+ if (!getResp) {
+ //LOG("constructResponse failed");
+ return OC_EH_ERROR;
+ }
+
+ *payload = getResp;
+ ehResult = OC_EH_OK;
+
+ return ehResult;
+}
+
+
+OCEntityHandlerResult _handle_oc_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) {
+ //LOG("Received OC_REST_GET request");
+ ehRet = _handle_get_request(entityHandlerRequest, &payload);
+ } else if (OC_REST_PUT == entityHandlerRequest->method) {
+ //LOG("Received OC_REST_PUT request, nothing to do");
+ } else if (OC_REST_POST == entityHandlerRequest->method) {
+ //LOG("Received OC_REST_POST from client");
+ 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 (entityHandlerRequest && (flag & OC_OBSERVE_FLAG)) {
+ //LOG("Flag includes OC_OBSERVE_FLAG");
+ if (OC_OBSERVE_REGISTER == entityHandlerRequest->obsInfo.action) {
+ //LOG ("Received OC_OBSERVE_REGISTER from Mediator");
+ } else if (OC_OBSERVE_DEREGISTER == entityHandlerRequest->obsInfo.action) {
+ //LOG ("Received OC_OBSERVE_DEREGISTER from Mediator");
+ }
+ }
+
+ return ehRet;
+}
+
+
+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;
+}
+
+int _init_default_test_res()
+{
+ if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK) {
+ printf("OCInit() failed\n");
+ return -1;
+ }
+
+ /* Create air conditioner resource handle */
+ if (OCCreateResource(&aircon_handle, "x.com.samsung.da.device",
+ OC_RSRVD_INTERFACE_DEFAULT,
+ "/sec/aircon/0",
+ _handle_oc_entity, NULL,
+ OC_DISCOVERABLE) != OC_STACK_OK) {
+ printf("OCCreateResource() failed\n");
+ return -1;
+ }
+
+ if (OCBindResourceInterfaceToResource(aircon_handle, 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) {
+ 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;
+ }
+
+ OCDeviceInfo devInfoAirConditioner;
+ OCStringLL deviceType;
+
+ deviceType.value = "oic.d.airconditioner";
+ deviceType.next = NULL;
+ devInfoAirConditioner.deviceName = "FAC_2016";
+ devInfoAirConditioner.types = &deviceType;
+ devInfoAirConditioner.specVersion = NULL;
+ devInfoAirConditioner.dataModelVersions = NULL;
+
+ if (OCSetDeviceInfo(devInfoAirConditioner) != OC_STACK_OK) {
+ printf("OCSetDeviceInfo() failed\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int _create_fw_res()
+{
+ controlee_create_firmware_resource(&firmware_handle);
+
+ 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;
+
+ if (OCRDPublish(OCF_SERVER_URL, CT_ADAPTER_TCP,
+ aircon_handle, 3,
+ &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
+ printf("OCRDPublish() failed\n");
+ return -1;
+ }
+
+ 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;
+
+ if (OCRDDelete(OCF_SERVER_URL, CT_ADAPTER_TCP,
+ aircon_handle, 3,
+ &cb_data, OC_LOW_QOS) != OC_STACK_OK) {
+ printf("OCRDDelete() failed\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int _destory_fw_res()
+{
+
+ if (controlee_destory_firmware_resource(firmware_handle) != CONTROLEE_FIRMWARE_SUCCESS) {
+ return -1;
+ }
+
+ return 0;
+}
+
+
+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) {
+ printf("OCDeleteResource() failed for aircon_handle\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+void _show_menu()
+{
+ printf("============================================\n");
+ printf("=== Controlee firmware resource test app ===\n");
+ printf("============================================\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");
+}
+
+gboolean _main_thread(GIOChannel *channel, GIOCondition condition, gpointer data)
+{
+ 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;
+
+ if (str_ret[0] == '\n' || str_ret[0] == '\r') {
+ _show_menu();
+ } else {
+ switch (str_ret[0]) {
+ 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("operation succeeded!\n");
+ else
+ printf("operation failed!\n");
+
+ printf("\n*** Press 'enter' to show menu *** \n");
+ }
+
+ g_free(str_ret);
+
+ return true;
+}
+
+int main(int argc, char *argv[])
+{
+ GMainLoop *mainloop;
+
+#if !GLIB_CHECK_VERSION(2, 36, 0)
+ g_type_init();
+#endif
+
+ mainloop = g_main_loop_new(NULL, false);
+
+ _show_menu();
+ 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);
+ g_main_loop_run(mainloop);
+
+ return 0;
+}