Example #1
0
static OCEntityHandlerResult process_get_request(things_resource_s *target_resource)
{

	OCEntityHandlerResult eh_result = OC_EH_ERROR;

	char *device_id = NULL;

	device_id = strrchr(target_resource->uri, '/') + 1;
	THINGS_LOG_D(TAG, "Get Device ID in Resources URI = %s", device_id);

	things_representation_s *rep = things_create_representation_inst(NULL);
	target_resource->things_set_representation(target_resource, rep);

	if (strstr(target_resource->uri, URI_SEC) != NULL && strstr(target_resource->uri, URI_PROVINFO) != NULL) {
		// 1. Get request for the Access point list
		eh_result = get_provisioning_info(target_resource);
#ifdef CONFIG_ST_THINGS_FOTA
	} else if (strstr(target_resource->uri, URI_FIRMWARE) != NULL) {
		eh_result = fmwup_get_data(target_resource);
#endif
	} else {
		if (g_handle_request_get_cb != NULL) {
			int ret = g_handle_request_get_cb(target_resource);
			if (1 == ret) {
				eh_result = OC_EH_OK;
			} else {
				THINGS_LOG_E(TAG, "Handled as ERROR from App.");
			}
		} else {
			THINGS_LOG_E(TAG, "g_handle_request_get_cb is not registered");
		}
	}

	return eh_result;
}
Example #2
0
static OCEntityHandlerResult process_post_request(things_resource_s **target_res)
{
	OCEntityHandlerResult eh_result = OC_EH_ERROR;

	things_resource_s *target_resource = *target_res;

	if (strstr(target_resource->uri, URI_SEC) != NULL && strstr(target_resource->uri, URI_PROVINFO) != NULL) {
		// 1. Post request for the Easy-Setup reset
		eh_result = set_provisioning_info(target_resource);
#ifdef CONFIG_ST_THINGS_FOTA
	} else if (strstr(target_resource->uri, URI_FIRMWARE) != NULL) {
		eh_result = fmwup_set_data(target_resource);
#endif
	} else {
		if (g_handle_request_set_cb != NULL) {
			int ret = g_handle_request_set_cb(target_resource);
			if (1 == ret) {
				eh_result = OC_EH_OK;
			} else {
				THINGS_LOG_E(TAG, "Handled as ERROR from App.");
			}
		} else {
			THINGS_LOG_E(TAG, "g_handle_request_set_cb is not registered");
		}
	}

	return eh_result;
}
Example #3
0
int st_things_reset(void)
{
	THINGS_LOG_D(TAG, THINGS_FUNC_ENTRY);

	if (STACK_STARTED != g_stack_status) {
		int ret_val = ST_THINGS_ERROR_OPERATION_FAILED;
		switch (g_stack_status) {
		case STACK_NOT_INITIALIZED:
			THINGS_LOG_E(TAG, "Stack is not initialized. Before reset, stack should be initialized and started.");
			ret_val = ST_THINGS_ERROR_STACK_NOT_INITIALIZED;
			break;
		case STACK_INITIALIZED:
			THINGS_LOG_E(TAG, "Stack is initialized but not started.");
			ret_val = ST_THINGS_ERROR_STACK_NOT_STARTED;
			break;
		default:
			THINGS_LOG_E(TAG, "Invalid stack state: %d.", g_stack_status);
			break;
		}

		THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
		return ret_val;
	}

	int result = 0;
	if (1 != (result = things_reset(NULL, RST_AUTO_RESET))) {
		THINGS_LOG_E(TAG, "things_reset failed (result:%d)", result);
		THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
		return ST_THINGS_ERROR_OPERATION_FAILED;
	}

	THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
	return ST_THINGS_ERROR_NONE;
}
struct things_resource_s *create_resource(struct things_server_builder_s *builder, char *uri, char *type, char *interface, int isDiscoverable, int isObserable, int isSecure)
{
	things_resource_s *res = NULL;
	OCResourceHandle hd = NULL;
	uint8_t rsc_properties = OC_DISCOVERABLE;

	if (builder->handler == NULL) {
		THINGS_LOG_E(TAG, "Handler for serverbuilder is not registered");
		return res;
	}

	if (1 != isDiscoverable) {
		rsc_properties = OC_ACTIVE;
	}

	if (1 == isObserable) {
		rsc_properties |= OC_OBSERVABLE;
	}

	if (1 == isSecure) {
#ifdef __SECURED__
		rsc_properties |= OC_SECURE;
#else
		THINGS_LOG_D(TAG, "Stack is in UNSECURED Mode");
#endif
	}

	iotivity_api_lock();
	OCStackResult ret = OCCreateResource(&hd,
										 type,
										 interface,
										 uri,
										 builder->handler,
										 NULL,
										 rsc_properties);
	iotivity_api_unlock();
	if (ret != OC_STACK_OK) {
		THINGS_LOG_V(TAG, "Resource Creation Failed - ret = %d, %s", ret, uri);
		return NULL;
	}

	res = things_create_resource_inst(NULL, hd, NULL, NULL);

	if (NULL == res) {
		THINGS_LOG_E(TAG, "things_create_resource_inst is failed");
		return res;
	}

	res->res_type = things_strdup(type);

	builder->gres_arr[builder->res_num++] = res;

	THINGS_LOG_D(TAG, "Created hd [%x], prop [0x%X] uri : %s", res->resource_handle, rsc_properties, res->uri);
	THINGS_LOG_D(TAG, "DISCOVERABLE : %s", (isDiscoverable == 1 ? "YES" : "NO"));
	THINGS_LOG_D(TAG, "OBSERABLE : %s", (isObserable == 1 ? "YES" : "NO"));
	THINGS_LOG_D(TAG, "SECURE : %s", (isSecure == 1 ? "YES" : "NO"));

	return res;
}
static int handle_post_req_on_single_rsrc(things_resource_s *single_rsrc)
{
	RET_VAL_IF_PARAM_IS_NULL(TAG, single_rsrc, 0);

	// Retrieve the request representation. This representation will hold all the input properties of post request.
	// Payload in this representation will be used to form the request message which will be given to the application.
	struct things_representation_s *req_rep = NULL;
	bool rep_exist = single_rsrc->things_get_representation(single_rsrc, &req_rep);
	if (!rep_exist || NULL == req_rep || NULL == req_rep->payload) {
		THINGS_LOG_E(TAG, "Empty payload in POST request.");
		return 0;				// TODO: When a post request comes with empty payload, how do we handle?
	}
	// Setup the response representation. This representation will be handed over to the underlying stack.
	// The payload which is passed as a parameter will be updated with the common properties.
	things_representation_s *resp_rep = things_create_representation_inst(NULL);
	RET_VAL_IF_NULL(TAG, resp_rep, "Failed to create response representation.", 0);

	if (!OCRepPayloadSetUri(resp_rep->payload, single_rsrc->uri)) {
		THINGS_LOG_E(TAG, "Failed to set the resource uri(%s) in response payload.", single_rsrc->uri);
		things_release_representation_inst(resp_rep);
		return 0;
	}

	THINGS_LOG_D(TAG, "Resource uri(%s) is set in the response payload.", single_rsrc->uri);

	// Get interface type from query parameter
	char *if_type = NULL;
	if (NULL != single_rsrc->query && strlen(single_rsrc->query) > 0) {
		bool found = false;
		bool result = get_query_value_internal(single_rsrc->query, OC_RSRVD_INTERFACE, &if_type, &found);
		if (found && !result) {	// If query is present but API returns false.
			THINGS_LOG_E(TAG, "Failed to get the interface type from query parameter(%s).", single_rsrc->query);
			things_release_representation_inst(resp_rep);
			return 0;
		}
	}
	// Set the common properties in the payload (Only for baseline interface).
	// The payload which is passed as a parameter will be updated with the common properties.
	if (NULL == if_type || !strncmp(if_type, OC_RSRVD_INTERFACE_DEFAULT, strlen(OC_RSRVD_INTERFACE_DEFAULT))) {
		if (!add_common_props(single_rsrc, false, resp_rep->payload)) {
			THINGS_LOG_E(TAG, "Failed to add the common properties in response payload.");
			things_release_representation_inst(resp_rep);
			things_free(if_type);
			return 0;
		}
		THINGS_LOG_D(TAG, "Added common properties in response payload.");
	}
	// Give the request properties to application and get the response back.
	bool res = handle_post_req_helper(single_rsrc->uri, single_rsrc->query, req_rep->payload, resp_rep->payload);
	if (res) {
		// Set the response representation in the resource.
		single_rsrc->things_set_representation(single_rsrc, resp_rep);
	} else {
		things_release_representation_inst(resp_rep);
	}
	things_free(if_type);
	return res ? 1 : 0;
}
Example #6
0
int wget_from_url(char *download_url) 
{
	THINGS_LOG_V(TAG, "download url : %s\n", download_url);

	struct http_client_request_t request;
	struct http_keyvalue_list_t headers;
	struct http_client_response_t response;
	struct http_client_ssl_config_t *ssl_config = NULL;

	int ret;
	ret = -1;

	if (webclient_init_request(download_url, &request) != 0) {
		THINGS_LOG_E(TAG, "webclient_init_request error");
		return NULL;
	}

	ssl_config = g_https ? &g_config : NULL;

	/* before sending request,
	 * must initialize keyvalue list for request headers
	 */
	http_keyvalue_list_init(&headers);
	http_keyvalue_list_add(&headers, headerfield_connect, headerfield_close);
	http_keyvalue_list_add(&headers, headerfield_useragent, headerfield_tinyara);
	request.headers = &headers;

	/* before sending request by sync function,
	 * must initialize response structure
	 */
	if (http_client_send_request_async(&request, ssl_config, (wget_callback_t)callback)) {
		THINGS_LOG_E(TAG, "fail to send request");
		goto release_out;
	}
	/* sleep for end request */
	while (request.async_flag > 0) {
		usleep(100000);
	}

	if (request.async_flag < 0) {
		THINGS_LOG_E(TAG, "fail to send request");
		goto release_out;
	}

	ret = 1;

release_out:
	/* before finish of app,
	 * must release keyvalue list for request headers
	 */
	http_keyvalue_list_release(&headers);
	THINGS_LOG_D(TAG, "end request");

	return ret;
}
static int handle_get_req_on_single_rsrc(things_resource_s *single_rsrc)
{
	RET_VAL_IF_PARAM_IS_NULL(TAG, single_rsrc, 0);

	// Setup the response representation. This representation will be handed over to the underlying stack.
	things_representation_s *resp_rep = things_create_representation_inst(NULL);
	RET_VAL_IF_NULL(TAG, resp_rep, "Failed to create response representation.", 0);

	bool result = OCRepPayloadSetUri(resp_rep->payload, single_rsrc->uri);
	if (!result) {
		THINGS_LOG_E(TAG, "Failed to set the resource uri(%s) in response payload.", single_rsrc->uri);
		things_release_representation_inst(resp_rep);
		return 0;
	}

	THINGS_LOG_D(TAG, "Resource uri(%s) is set in the response payload.", single_rsrc->uri);

	// Set the common properties in the payload (Only for baseline interface).
	char *if_type = NULL;
	if (NULL != single_rsrc->query && strlen(single_rsrc->query) > 0) {
		bool found = false;
		bool result = get_query_value_internal(single_rsrc->query, OC_RSRVD_INTERFACE, &if_type, &found);
		if (found && !result) {	// If query is present but API returns false.
			THINGS_LOG_E(TAG, "Failed to get the interface type from query parameter(%s).", single_rsrc->query);
			things_release_representation_inst(resp_rep);
			return 0;
		}
	}

	if (NULL == if_type || strlen(if_type) < 1 || !strncmp(if_type, OC_RSRVD_INTERFACE_DEFAULT, strlen(OC_RSRVD_INTERFACE_DEFAULT))) {
		if (!add_common_props(single_rsrc, false, resp_rep->payload)) {
			THINGS_LOG_E(TAG, "Failed to add the common properties in response payload.");
			things_release_representation_inst(resp_rep);
			things_free(if_type);
			return 0;
		}
		THINGS_LOG_D(TAG, "Added common properties in response payload.");
	}
	// Get the resource's properties from the application.
	result = handle_get_req_helper(single_rsrc->uri, single_rsrc->query, resp_rep->payload);
	if (!result) {
		things_release_representation_inst(resp_rep);
		things_free(if_type);
		return 0;
	}
	// Set the response representation in the resource.
	single_rsrc->things_set_representation(single_rsrc, resp_rep);

	things_free(if_type);
	return 1;
}
struct things_resource_s *create_collection_resource(struct things_server_builder_s *builder, char *uri, char *type)
{
	things_resource_s *res = NULL;
	OCResourceHandle hd = NULL;
	uint8_t rsc_properties = OC_DISCOVERABLE | OC_OBSERVABLE;

	if (builder->handler == NULL) {
		THINGS_LOG_E(TAG, "Handler for serverbuilder is not registered");
		return res;
	}
#ifdef __SECURED__

	rsc_properties |= OC_SECURE;

#endif							//#ifdef __SECURED__
	iotivity_api_lock();
	OCStackResult ret = OCCreateResource(&hd,
										 type,
										 OIC_INTERFACE_LINKEDLIST,
										 uri,
										 builder->handler,
										 NULL,
										 rsc_properties);
	if (ret != OC_STACK_OK) {
		THINGS_LOG_V(TAG, "Resource Creation Failed - ret = %d, %s", ret, uri);
		iotivity_api_unlock();
		return NULL;
	}

	OCBindResourceTypeToResource(hd, OIC_RTYPE_COLLECTION_WK);
	OCBindResourceInterfaceToResource(hd, OIC_INTERFACE_BATCH);
	iotivity_api_unlock();

	res = things_create_resource_inst(NULL, hd, NULL, NULL);

	if (NULL == res) {
		THINGS_LOG_E(TAG, "things_create_resource_inst is failed");
		return res;
	}

	res->res_type = things_strdup(type);

	builder->gres_arr[builder->res_num++] = res;

	THINGS_LOG_V(TAG, "Created hd [%x], prop [0x%X] uri : %s", res->resource_handle, rsc_properties, uri);

	return res;
}
things_server_builder_s *get_builder_instance()
{
	if (g_builder == NULL) {
		g_builder = (things_server_builder_s *) things_malloc(sizeof(things_server_builder_s));
		if (g_builder != NULL) {
			g_builder->init_module = &init_builder;
			g_builder->deinit_module = &deinit_builder;
			g_builder->set_device_info = &set_device_info;
			g_builder->set_platform_info = &set_platform_info;
			g_builder->create_resource = &create_resource;
			// g_builder->CreateActiveResource = &CreateActiveResource;
#ifdef CONFIG_ST_THINGS_COLLECTION
			g_builder->create_collection_resource = &create_collection_resource;
#endif
			g_builder->get_resource = &get_resource;
			g_builder->delete_resource = &delete_resource;
			g_builder->add_interface_type = &add_interface_type;
			g_builder->add_resource_type = &add_resource_type;
			g_builder->bind = &things_bind;
			g_builder->bind_all = &bind_all;
			g_builder->res_num = 0;
			g_builder->handler = NULL;

			return g_builder;
		} else {
			THINGS_LOG_E(TAG, "Not enough Memory for Builder Instance");
			return NULL;
		}
	} else {
		THINGS_LOG_D(TAG, "Builder Instance Already Created");
		return g_builder;
	}
}
Example #10
0
bool things_get_string_arrayvalue(struct things_representation_s *mother, char *key, int *length, char ***array)
{
	THINGS_LOG_D(TAG, "There're (%d) Number of children resources in the Payload : %d", mother->num_children);

	bool find_value = false;

	OCRepPayloadValue *payload_value = NULL;

	payload_value = things_rep_payload_find_values((OCRepPayload *)(mother->payload), key);

	if (payload_value != NULL) {
		size_t dimension_size = calcDimTotal(payload_value->arr.dimensions);
		size_t dimensions[3] = { dimension_size, 0, 0 };

		find_value = OCRepPayloadGetStringArray((OCRepPayload *)(mother->payload), key, array, dimensions);
		THINGS_LOG_D(TAG, "Find Value : %d", find_value);
		if (find_value) {

			*length = dimension_size;
		}
	} else {
		THINGS_LOG_E(TAG, "DATA NOT EXIST~!!!!");
	}

	return find_value;
}
Example #11
0
/**
 * This callback will be registered with the DA Stack to get the request for user's confirmation for reset.
 * Application's callback will be invoked to get the user's opinion.
 */
int get_reset_confirm_cb(things_reset_result_func_type *func_carrier, things_es_enrollee_reset_e reset_type)
{
	THINGS_LOG_D(TAG, THINGS_FUNC_ENTRY);
	if (NULL == g_handle_reset_confirm_cb) {
		THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
		return 0;
	}

	if (RST_NEED_CONFIRM == reset_type) {
		// Invoke application's callback to get user's confirmation and pass the result to DA Stack.
		bool confirm = g_handle_reset_confirm_cb();
		THINGS_LOG_D(TAG, "User's confirmation for reset : %s", confirm ? "true" : "false");
		if (confirm) {
			things_return_user_opinion_for_reset(1);
		} else {
			things_return_user_opinion_for_reset(0);
		}
	} else if (RST_AUTO_RESET == reset_type) {
		THINGS_LOG_D(TAG, "Reset will start automatically");
		things_return_user_opinion_for_reset(1);
	} else {
		THINGS_LOG_E(TAG, "reset_type(%d) is invalid", reset_type);
		THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
		return 0;
	}

	// Set the callback through this function's value-result paramter with DA Stack to get the result of reset.
	*func_carrier = get_reset_result_cb;

	THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
	return 1;
}
Example #12
0
void /*OCRepPayload */ *get_rep_payload(struct things_resource_s *res)
{
	if (res->rep != NULL) {
		// Create Payload for the mother resource
		// It applies not only single resource but also the collection resource..
		things_resource_s *p_temp;
		OCRepPayload *rep_payload;

		if (NULL != res->things_get_children(res) && (NULL != strstr(res->uri, URI_DEVICE_COL)) && (strstr(res->query, OIC_INTERFACE_BATCH) != NULL)) {
			p_temp = res->next;
			rep_payload = p_temp->things_create_payload(p_temp, p_temp->query);
			p_temp = p_temp->next;
		}

		else {
			rep_payload = res->things_create_payload(res, res->query);
			// Create payload for the children resource(s)
			p_temp = res->things_get_children(res);
		}

		while (NULL != p_temp) {
			if (NULL != p_temp->rep) {
				OCRepPayloadAppend(rep_payload, p_temp->things_create_payload(p_temp, p_temp->query));
			}
			p_temp = p_temp->next;
		}

		return rep_payload;
	} else {
		THINGS_LOG_E(TAG, "ROOT(Parent) Paylaod is NULL.");
		return NULL;
	}
}
Example #13
0
void notify_result_of_reset(things_resource_s *target_resource, bool result)
{
	THINGS_LOG_D(TAG, THINGS_FUNC_ENTRY);

	OCEntityHandlerResult eh_result = OC_EH_ERROR;

	if (target_resource == NULL) {
		THINGS_LOG_D(TAG, "Not exist remote-client.");
		return;
	}

	if (result == true) {		// reset Success.
		OCRepPayload *rep_payload = target_resource->things_get_rep_payload(target_resource);

		eh_result = send_response(target_resource->request_handle,	// reqInfo->reqHandle,
								  target_resource->resource_handle,	// reqInfo->resHandle,
								  target_resource->error, target_resource->uri, rep_payload);

		OCPayloadDestroy((OCPayload *) rep_payload);
		rep_payload = NULL;

	} else {
		THINGS_LOG_E(TAG, "Handing Request Failed, Sending ERROR Response");

		send_response(target_resource->request_handle, target_resource->resource_handle, eh_result, target_resource->uri, NULL);
	}

	things_release_resource_inst(target_resource);

	THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
}
Example #14
0
OCEntityHandlerResult handle_message(things_resource_s *target_resource)
{
	OCEntityHandlerResult eh_result = OC_EH_ERROR;

	if (NULL == target_resource) {
		THINGS_LOG_D(TAG, "Request Item is NULL.");
		return OC_EH_ERROR;
	}

	THINGS_LOG_D(TAG, "Request Handle : %x, Resource Handle : %x", target_resource->request_handle, target_resource->resource_handle);

	if (target_resource->req_type == OC_REST_GET) {
		THINGS_LOG_V(TAG, "\t\tReq. : GET on %s", target_resource->uri);
		THINGS_LOG_V(TAG, "\t\tQuery: %s", target_resource->query);
		eh_result = process_get_request(target_resource);
	} else if (target_resource->req_type == OC_REST_POST) {
		THINGS_LOG_V(TAG, "\t\tReq. : POST on  %s", target_resource->uri);
		THINGS_LOG_V(TAG, "\t\tQuery: %s", target_resource->query);
		eh_result = process_post_request(&target_resource);
	} else {
		THINGS_LOG_E(TAG, " Invalid Request Received : %d", target_resource->req_type);
	}
	THINGS_LOG_D(TAG, " @@@@@ target_resource ->size : %d", target_resource->size);

	if (is_can_not_response_case(target_resource, target_resource->req_type, eh_result) == false) {
		if (eh_result != OC_EH_OK && eh_result != OC_EH_SLOW) {
			THINGS_LOG_E(TAG, "Handing Request Failed, Sending ERROR Response");

			send_response(target_resource->request_handle, target_resource->resource_handle, eh_result, target_resource->uri, NULL);

			eh_result = OC_EH_OK;
		} else {
			OCRepPayload *rep_payload = target_resource->things_get_rep_payload(target_resource);

			eh_result = send_response(target_resource->request_handle,	// reqInfo->reqHandle,
									  target_resource->resource_handle,	// reqInfo->resHandle,
									  target_resource->error, target_resource->uri, rep_payload);

			OCPayloadDestroy((OCPayload *) rep_payload);
			rep_payload = NULL;
		}
	}
	//  Need to design How to release memory allocated for the things_resource_s list.
	things_release_resource_inst(target_resource);

	return eh_result;
}
int register_request_handler_cb(st_things_get_request_cb get_cb, st_things_set_request_cb set_cb)
{
	if (NULL == get_cb) {
		THINGS_LOG_E(TAG, "Request callback for GET is NULL.");
		return ST_THINGS_ERROR_INVALID_PARAMETER;
	}

	if (NULL == set_cb) {
		THINGS_LOG_E(TAG, "Request callback for SET is NULL.");
		return ST_THINGS_ERROR_INVALID_PARAMETER;
	}

	g_handle_get_req_cb = get_cb;
	g_handle_set_req_cb = set_cb;

	return ST_THINGS_ERROR_NONE;
}
void register_req_handler(struct things_server_builder_s *builder, request_handler_cb handler)
{
	if (handler == NULL || builder == NULL) {
		THINGS_LOG_E(TAG, "Invalid Param");
		return;
	}
	builder->handler = handler;
}
Example #17
0
int st_things_initialize(const char *json_path, bool *easysetup_complete)
{
	THINGS_LOG_D(TAG, THINGS_FUNC_ENTRY);

	if (STACK_NOT_INITIALIZED != g_stack_status) {
		int ret_val = ST_THINGS_ERROR_OPERATION_FAILED;
		switch (g_stack_status) {
		case STACK_INITIALIZED:
			THINGS_LOG_E(TAG, "Stack initialized already.");
			ret_val = ST_THINGS_ERROR_STACK_ALREADY_INITIALIZED;
			break;
		case STACK_STARTED:
			THINGS_LOG_E(TAG, "Stack is currently running.");
			ret_val = ST_THINGS_ERROR_STACK_RUNNING;
			break;
		default:
			THINGS_LOG_E(TAG, "Invalid stack state: %d.", g_stack_status);
			break;
		}

		THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
		return ret_val;
	}

	if (NULL == json_path) {
		THINGS_LOG_E(TAG, "Json file path is NULL");
		THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
		return ST_THINGS_ERROR_INVALID_PARAMETER;
	}

	THINGS_LOG_D(TAG, "JSON file path: %s", json_path);

	int result = 0;
	if (1 != (result = things_initialize_stack(json_path, easysetup_complete))) {
		THINGS_LOG_E(TAG, "things_initialize_stack failed (result:%d)", result);
		THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
		return ST_THINGS_ERROR_OPERATION_FAILED;
	}

	g_stack_status = STACK_INITIALIZED;

	THINGS_LOG_D(TAG, "Is EasySetup completed : %s", (*easysetup_complete) ? "true" : "false");
	THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
	return ST_THINGS_ERROR_NONE;
}
Example #18
0
void things_set_int_arrayvalue(struct things_representation_s *mother, char *key, int length, int64_t *array)
{
	if (length < 1) {
		THINGS_LOG_E(TAG, "DATA LENGTH IS ZERO!!!!!!");
		return;
	}
	size_t dimensions[MAX_REP_ARRAY_DEPTH] = { length, 0, 0 };

	OCRepPayloadSetIntArray(mother->payload, key, array, dimensions);
}
Example #19
0
void things_set_byte_value(struct things_representation_s *rep, char *key, uint8_t *value, size_t size)
{
	OCByteString b_val = { value, size };

	if (b_val.len < 1) {
		THINGS_LOG_E(TAG, "No byte value to Set");
	} else {
		OCRepPayloadSetPropByteString(rep->payload, key, b_val);
	}
}
Example #20
0
void things_set_string_arrayvalue(struct things_representation_s *mother, char *key, int length, char **array)
{
	if (length < 1) {
		THINGS_LOG_E(TAG, "DATA LENGTH IS ZERO!!!!!!");
		return;
	}
	size_t dimensions[MAX_REP_ARRAY_DEPTH] = { length, 0, 0 };

	//    This is codesnippet for creating Array type of value inside the payload..
	OCRepPayloadSetStringArray(mother->payload, key, (const char **)array, dimensions);
}
void delete_resource(struct things_server_builder_s *builder)
{
	iotivity_api_lock();
	for (size_t iter = 0; iter < builder->res_num; iter++) {
		OCStackResult ret = OCDeleteResource((OCResourceHandle)(builder->gres_arr[iter]->resource_handle));
		if (ret != OC_STACK_OK) {
			THINGS_LOG_E(TAG, "Failed to delete the resource");
		}
	}
	iotivity_api_unlock();
}
Example #22
0
int st_things_notify_observers(const char *resource_uri)
{
	THINGS_LOG_D(TAG, THINGS_FUNC_ENTRY);

	if (STACK_STARTED != g_stack_status) {
		int ret_val = ST_THINGS_ERROR_OPERATION_FAILED;
		switch (g_stack_status) {
		case STACK_NOT_INITIALIZED:
			THINGS_LOG_E(TAG, "Stack is not initialized. Before notifying observers, stack should be initialized and started.");
			ret_val = ST_THINGS_ERROR_STACK_NOT_INITIALIZED;
			break;
		case STACK_INITIALIZED:
			THINGS_LOG_E(TAG, "Stack is initialized but not started.");
			ret_val = ST_THINGS_ERROR_STACK_NOT_STARTED;
			break;
		default:
			THINGS_LOG_E(TAG, "Invalid stack state: %d.", g_stack_status);
			break;
		}

		THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
		return ret_val;
	}

	if (NULL == resource_uri || 1 > strlen(resource_uri)) {
		THINGS_LOG_E(TAG, "The resource URI is invalid");
		THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
		return ST_THINGS_ERROR_INVALID_PARAMETER;
	}

	int result = 0;
	if (1 != (result = things_notify_observers(resource_uri))) {
		THINGS_LOG_E(TAG, "things_notify_observers failed (result:%d)", result);
		THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
		return ST_THINGS_ERROR_OPERATION_FAILED;
	}

	THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
	return ST_THINGS_ERROR_NONE;
}
static bool get_interface_types(things_resource_s *rsrc, char ***if_types, int *count)
{
	RET_FALSE_IF_PARAM_IS_NULL(TAG, rsrc);
	RET_FALSE_IF_PARAM_IS_NULL(TAG, if_types);
	RET_FALSE_IF_PARAM_IS_NULL(TAG, count);

	int if_count = rsrc->things_get_num_of_inf_types(rsrc);
	THINGS_LOG_D(TAG, "Resource(%s) has %d interface type(s).", rsrc->uri, if_count);
	RET_FALSE_IF_EXPR_IS_TRUE(TAG, if_count < 1, "No interface types in resource.");

	char **types = (char **)things_calloc(if_count, sizeof(char *));
	RET_VAL_IF_NULL(TAG, types, "Failed to allocate memory for inteface types.", false);

	bool result = true;
	const char *if_type = NULL;
	for (int i = 0; i < if_count; i++) {
		if_type = rsrc->things_get_inf_type(rsrc, i);
		if (NULL == if_type || strlen(if_type) < 1) {
			THINGS_LOG_E(TAG, "Interface type at index(%d) is invalid.", i);
			things_free_str_array(types, i);
			result = false;
			break;
		}

		types[i] = things_clone_string(if_type);
		if (NULL == types[i]) {
			THINGS_LOG_E(TAG, "Failed to clone inteface type(%s).", if_type);
			things_free_str_array(types, i);
			result = false;
			break;
		}
	}

	if (result) {
		*count = if_count;
		*if_types = types;
	}

	return result;
}
Example #24
0
int st_things_deinitialize(void)
{
	THINGS_LOG_D(TAG, THINGS_FUNC_ENTRY);

	if (STACK_INITIALIZED != g_stack_status) {
		int ret_val = ST_THINGS_ERROR_OPERATION_FAILED;
		switch (g_stack_status) {
		case STACK_NOT_INITIALIZED:
			THINGS_LOG_E(TAG, "Stack is not initialized.");
			ret_val = ST_THINGS_ERROR_STACK_NOT_INITIALIZED;
			break;
		case STACK_STARTED:
			THINGS_LOG_E(TAG, "Stack is currently running. Stop the stack before deinitializing it.");
			ret_val = ST_THINGS_ERROR_STACK_RUNNING;
			break;
		default:
			THINGS_LOG_E(TAG, "Invalid stack state: %d.", g_stack_status);
			break;
		}

		THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
		return ret_val;
	}

	int result = 0;
	if (1 != (result = things_deinitialize_stack())) {
		THINGS_LOG_E(TAG, "things_deinitialize_stack failed (result:%d)", result);
		THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
		return ST_THINGS_ERROR_OPERATION_FAILED;
	}

	g_stack_status = STACK_NOT_INITIALIZED;

	THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);
	return ST_THINGS_ERROR_NONE;
}
Example #25
0
struct things_request_handler_s *get_handler_instance()
{
	struct things_request_handler_s *handler = (things_request_handler_s *) things_malloc(sizeof(things_request_handler_s));

	if (handler == NULL) {
		THINGS_LOG_E(TAG, "Not Enough Memory");
		return NULL;
	} else {
		handler->entity_handler = &entity_handler;
		handler->init_module = &init_handler;
		handler->deinit_module = &deinit_handler;
		handler->notify_things_observers = &notify_things_observers;
		return handler;
	}
}
void init_builder(struct things_server_builder_s *builder, request_handler_cb cb)
{
	OCTransportAdapter m_transport = (OC_ADAPTER_IP | OC_ADAPTER_TCP);
	if (OC_STACK_OK != OCInit2(OC_CLIENT_SERVER, OC_IP_USE_V4, OC_IP_USE_V4, m_transport)) {
		THINGS_LOG_E(TAG, "RESOURCE SERVER START FAILED");
		return;
	}

	THINGS_LOG_V(TAG, "Resource Server IS NOW STARTING...");

	g_quit_flag = 0;

	pthread_create_rtos(&g_thread_id_server, NULL, server_execute_loop, (void *)NULL, THINGS_STACK_SERVEREXCETUE_LOOP_THREAD);

	register_req_handler(builder, cb);
}
Example #27
0
static void callback(struct http_client_response_t *response)
{
	if (response->status != 200) {
		is_link_fail = true;
		THINGS_LOG_E(TAG, "recv callback status %d", response->status);
		return;
	}

	if (download_state == FOTA_DOWNLOAD_STATE_JSON) {
		strncpy(json_str + recv_size, response->entity, response->entity_len);
	} else if (download_state == FOTA_DOWNLOAD_STATE_BINARY) {
		fotahal_write(fotahal_handle, response->entity, response->entity_len);
	}
	recv_size += response->entity_len;
	total_size = response->total_len;
}
Example #28
0
things_representation_s *things_create_representation_inst(void *rep_payload)
{
	things_representation_s *rep = (things_representation_s *) things_malloc(sizeof(things_representation_s));
	if (NULL == rep) {
		THINGS_LOG_E(TAG, THINGS_MEMORY_ERROR);
		return NULL;
	}

	rep->things_set_value = &things_set_value;
	rep->things_set_bool_value = &things_set_bool_value;
	rep->things_set_double_value = &things_set_double_value;
	rep->things_set_int_value = &things_set_int_value;
	rep->things_set_byte_value = &things_set_byte_value;
	rep->things_set_object_value = &things_set_object_value;

	rep->things_set_arrayvalue = &things_set_arrayvalue;
	rep->things_get_arrayvalue = &things_get_arrayvalue;
	rep->things_set_string_arrayvalue = &things_set_string_arrayvalue;
	rep->things_get_string_arrayvalue = &things_get_string_arrayvalue;

	rep->things_set_double_arrayvalue = &things_set_double_arrayvalue;
	rep->things_get_double_arrayvalue = &things_get_double_arrayvalue;
	rep->things_set_int_arrayvalue = &things_set_int_arrayvalue;
	rep->things_get_int_arrayvalue = &things_get_int_arrayvalue;

	rep->things_get_value = &things_get_value;
	rep->things_get_bool_value = &things_get_bool_value;
	rep->things_get_int_value = &things_get_int_value;
	rep->things_get_double_value = &things_get_double_value;
	rep->things_get_byte_value = &things_get_byte_value;
	rep->things_get_object_value = &things_get_object_value;

	rep->payload = NULL;
	rep->children_payload = NULL;
	rep->children = NULL;
	rep->num_children = 0;

	if (rep_payload != NULL) {
		rep->payload = OCRepPayloadClone((OCRepPayload *) rep_payload);
	} else {
		rep->payload = OCRepPayloadCreate();
	}

	return rep;
}
void *server_execute_loop(void *param)
{
	THINGS_LOG_D(TAG, THINGS_FUNC_ENTRY);

	while (!g_quit_flag) {
		iotivity_api_lock();
		if (OCProcess() != OC_STACK_OK) {
			THINGS_LOG_E(TAG, "OCProcess Error");
			//   need to insert error handling logic from here
		}
		iotivity_api_unlock();
		//   The proper time period for looping need to be decided..
		usleep(10 * 1000);
	}
	THINGS_LOG_D(TAG, THINGS_FUNC_EXIT);

	return NULL;
}
void things_bind(struct things_resource_s *res, struct things_resource_s *bind)
{
	if (res == NULL || bind == NULL) {
		THINGS_LOG_E(TAG, "Invalid Resource");
		return;
	}

	if (res->resource_handle == bind->resource_handle) {
		THINGS_LOG_D(TAG, "It's identical resource");
		return;
	}

	iotivity_api_lock();
	OCStackResult ret = OCBindResource((OCResourceHandle)(res->resource_handle),
									   (OCResourceHandle)(bind->resource_handle));
	iotivity_api_unlock();
	if (ret != OC_STACK_OK) {
		THINGS_LOG_V(TAG, "bind Failed ");
	}
}