Пример #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;
}
Пример #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;
}
Пример #3
0
static void KprCoAPClient_deliveryErrorCallback(KprCoAPEndpoint endpoint, KprCoAPMessage message, KprCoAPEndpointDeliveryFailure failure, void *refcon)
{
	FskErr err = kFskErrNone;
	KprCoAPClient self = (KprCoAPClient) refcon;
	char *reason;
	KprCoAPClientRequest request;

	switch (failure) {
		case kKprCoAPEndpointDeliveryFailureMaxRetry:
			reason = "max retry";
			break;

		case kKprCoAPEndpointDeliveryFailureReset:
			reason = "reset by peer";
			break;

		default:
			reason = "unknown";
			break;

	}

	err = self->callbacks.deliveryFailureCallback(message, reason, self->refcon);

	if (err != kFskErrNone) {
		KprCoAPClientReportError(self, err, "retry delivery error");
	}

	request = self->requests;

	while (request) {
		if (request->message == message) {
			KprCoAPClientEndRequest(self, request, reason);
			break;
		}

		request = request->next;
	}
}