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; }
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; }
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; } }