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