Пример #1
0
smcp_status_t
smcp_observable_update(smcp_observable_t context, uint8_t key) {
	smcp_status_t ret = SMCP_STATUS_OK;
	smcp_t const interface = smcp_get_current_instance();
	int8_t i;

#if !SMCP_EMBEDDED
	context->interface = interface;
#endif

	if(interface->inbound.is_fake || interface->inbound.is_dupe) {
		goto bail;
	}

	for(i = context->first_observer-1; i >= 0; i = observer_table[i].next - 1) {
		if(observer_table[i].key != key)
			continue;
		if(smcp_inbound_is_related_to_async_response(&observer_table[i].async_response))
			break;
	}

	if(interface->inbound.has_observe_option) {
		if(i == -1) {
			i = get_unused_observer_index();
			if(i == -1)
				goto bail;
			if(context->last_observer == 0) {
				context->first_observer = context->last_observer = i + 1;
			} else {
				observer_table[context->last_observer-1].next = i +1;
				context->last_observer = i + 1;
			}
			observer_table[i].key = key;
			observer_table[i].seq = 0;
			observer_table[i].observable = context;
		}

		smcp_start_async_response(&observer_table[i].async_response,SMCP_ASYNC_RESPONSE_FLAG_DONT_ACK);

		ret = smcp_outbound_add_option_uint(COAP_OPTION_OBSERVE,observer_table[i].seq);
	} else if(i != -1) {
		free_observer(&observer_table[i]);
	}

bail:
	return ret;
}
Пример #2
0
cgi_node_request_t
cgi_node_get_associated_request(cgi_node_t node) {
	cgi_node_request_t ret = NULL;
	int i;

	for(i = 0; i < CGI_NODE_MAX_REQUESTS; i++) {
		cgi_node_request_t request = &node->requests[i];

		if (request->state < CGI_NODE_STATE_FINISHED) {
			continue;
		}

		if (!smcp_inbound_is_related_to_async_response(&request->async_response)) {
			syslog(LOG_DEBUG, "cgi_node_get_associated_request: %d: session mismatch", i);
			continue;
		}

		ret = request;
		break;
	}

	return ret;
}