FskErr KprCoAPClientStartRequest(KprCoAPClient self, UInt32 ipaddr, UInt16 port, KprCoAPMessage message) { FskErr err = kFskErrNone; KprCoAPClientRequest request = NULL; KprCoAPEndpoint endpoint = NULL; KprMemoryBlock generatedToken = NULL; if (self->autoToken && message->token == NULL) { bailIfError(KprCoAPClientNextAutoToken(self, &generatedToken)); message->token = KprRetain(generatedToken); KprMemoryBlockDispose(generatedToken); } bailIfError(KprCoAPClientGetEndpoint(self, ipaddr, port, &endpoint)); bailIfError(KprCoAPClientRequestNew(&request, self, message, endpoint)); FskListAppend(&self->requests, request); bailIfError(KprCoAPEndpointSendMessage(endpoint, message)); bail: if (err) { FskListRemove(&self->requests, request); KprCoAPClientRequestDispose(request); KprCoAPClientDisposeUnusedEndpoint(self); } return err; }
FskErr KprCoAPServerSessionSendResponse(KprCoAPServerSession self, KprCoAPMessage response) { FskErr err = kFskErrNone; KprCoAPServer server = self->server; if (!server) { return kFskErrBadState; } if (self->responded && !self->observeAccepted) { return kFskErrBadState; } if (self->confiramableRequest) { if (!self->emptyAckSent && !self->responded) { response->messageId = self->request->messageId; response->type = kKprCoAPMessageTypeAcknowledgement; } } if (!response->messageId) { response->messageId = KprCoAPServerGenerateMessageId(server); } if (self->observeAccepted) { bailIfError(KprCoAPMessageAppendUintOption(response, kKprCoAPMessageOptionObserve, self->observeId)); self->observeId += 1; } bailIfError(KprCoAPEndpointSendMessage(self->endpoint, response)); KprCoAPMessageRetain(response); KprCoAPMessageDispose(self->lastResponse); self->lastResponse = response; self->responded = true; if (!self->observeAccepted) { KprCoAPServerFinishSession(server, self); } bail: return err; }
FskErr KprCoAPServerSessionRunAgain(KprCoAPServerSession self) { FskErr err = kFskErrNone; if (self->lastResponse) { if (self->confiramableRequest && self->emptyAckSent) { bailIfError(KprCoAPServerSessionSendAck(self)); } bailIfError(KprCoAPEndpointSendMessage(self->endpoint, self->lastResponse)); } else { if (self->confiramableRequest) { bailIfError(KprCoAPServerSessionSendAck(self)); } } bail: return err; }
FskErr KprCoAPServerSessionSendAck(KprCoAPServerSession self) { FskErr err = kFskErrNone; KprCoAPMessage response; KprCoAPServer server = self->server; if (!server || self->responded || self->emptyAckSent || !self->confiramableRequest) { return kFskErrBadState; } bailIfError(KprCoAPMessageNew(&response)); response->type = kKprCoAPMessageTypeAcknowledgement; response->messageId = self->request->messageId; bailIfError(KprCoAPEndpointSendMessage(self->endpoint, response)); self->emptyAckSent = true; bail: KprCoAPMessageDispose(response); return err; }
FskErr KprCoAPClientHandleResponse(KprCoAPClient self, KprCoAPMessage request, KprCoAPMessage response, KprCoAPEndpoint endpoint) { KprCoAPMessage ack = NULL; FskErr err = kFskErrNone; if (request && response->type == kKprCoAPMessageTypeAcknowledgement) { bailIfError(self->callbacks.acknowledgementCallback(request, self->refcon)); } if (response->code != kKprCoAPMessageCodeEmpty) { bailIfError(self->callbacks.responseCallback(request, response, self->refcon)); if (response->type == kKprCoAPMessageTypeConfirmable) { bailIfError(KprCoAPMessageNew(&ack)); ack->type = kKprCoAPMessageTypeAcknowledgement; ack->messageId = response->messageId; err = KprCoAPEndpointSendMessage(endpoint, ack); } } bail: return err; }
FskErr KprCoAPClientRequestSendMessage(KprCoAPClientRequest self, KprCoAPMessage message) { return KprCoAPEndpointSendMessage(self->endpoint, message); }