Exemplo n.º 1
0
static FskErr KprCoAPClientDispatchResponse(KprCoAPClient self, UInt32 ipaddr, UInt16 port, KprCoAPMessage response)
{
	FskErr err = kFskErrNone;
	KprCoAPClientRequest request = self->requests;
	KprCoAPEndpoint endpoint = NULL;

	while (request) {
		if (KprCoAPClientRequestMatchResponse(request, response)) {
			err = KprCoAPClientRequestHandleResponse(request, response);
			if (KPrCoAPClientRequestExpectsMoreResponse(request) == false) {
				KprCoAPClientEndRequest(self, request, kKprCoAPClientRequestEndReasonSuccess);
			}
			return err;
		}

		request = request->next;
	}

	endpoint = KprCoAPClientFindEndpoint(self, ipaddr, port);
	if (endpoint) {
		if (!KprCoAPEndpointHandleMessage(endpoint, response)) goto bail;

		bailIfError(KprCoAPClientHandleResponse(self, NULL, response, endpoint));
	} else {
		// @TODO
	}

bail:
	return err;
}
Exemplo n.º 2
0
FskErr KprCoAPClientRequestHandleResponse(KprCoAPClientRequest self, KprCoAPMessage response)
{
	FskErr err = kFskErrNone;

	if (!KprCoAPEndpointHandleMessage(self->endpoint, response)) goto bail;

	switch (response->type) {
		case kKprCoAPMessageTypeAcknowledgement:
			self->ackReceived = true;
			if (response->code != kKprCoAPMessageCodeEmpty) {
				self->responseReceived = true;
			}
			break;

		case kKprCoAPMessageTypeReset:
			KprCoAPClientEndRequest(self->client, self, kKprCoAPClientRequestEndReasonReset);
			return kFskErrNone;

		default:
			self->responseReceived = true;
			break;
	}

	if (self->observeRequested && !self->observeAccepted) {
		KprCoAPMessageOptionRecord *option = KprCoAPMessageFindOption(response, kKprCoAPMessageOptionObserve);
		self->observeAccepted = (option != NULL && option->value.uint > kKprCoAPMessageObserveDeregister);
	}

	bailIfError(KprCoAPClientHandleResponse(self->client, self->message, response, self->endpoint));

bail:
	return err;
}