FskErr KprCoAPClientCreateRequestMessage(KprCoAPClient self, const char *uri, KprCoAPRequestMethod method, Boolean confirmable, KprCoAPMessage *requestOut) { FskErr err = kFskErrNone; KprCoAPMessage request = NULL; bailIfError(KprCoAPMessageNew(&request)); bailIfError(KprCoAPMessageParseUri(request, uri)); request->code = KprCoAPMessageCodeWith(0, method); request->messageId = KprCoAPClientGenerateMessageId(self); if (confirmable) { request->type = kKprCoAPMessageTypeConfirmable; } else { request->type = kKprCoAPMessageTypeNonConfirmable; } *requestOut = request; bail: if (err) { KprCoAPMessageDispose(request); } 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; }