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 KprCoAPClientEndRequest(KprCoAPClient self, KprCoAPClientRequest request, const char *reason) { FskErr err = kFskErrNone; if (self->callbacks.requestEndCallback) { bailIfError(self->callbacks.requestEndCallback(request->message, reason, self->refcon)); } FskListRemove(&self->requests, request); if (request->message->token) { FskListAppend(&self->recycleTokens, KprRetain(request->message->token)); } bailIfError(KprCoAPClientRequestDispose(request)); bail: return err; }
FskErr KprCoAPClientDispose(KprCoAPClient self) { FskErr err = kFskErrNone; if (self) { KprCoAPClientResolver resolver; KprCoAPClientRequest request; KprCoAPEndpoint endpoint; resolver = self->resolvers; while (resolver) { KprCoAPClientResolver next = resolver->next; KprCoAPClientResolverDispose(resolver); resolver = next; } request = self->requests; while (request) { KprCoAPClientRequest next = request->next; KprCoAPClientRequestDispose(request); request = next; } endpoint = self->endpoints; while (endpoint) { KprCoAPEndpoint next = endpoint->next; KprCoAPEndpointDispose(endpoint); endpoint = next; } KprMemoryBlockDispose(self->recycleTokens); KprCoAPReceiverDispose(self->receiver); FskNetSocketClose(self->socket); KprMemPtrDispose(self); FskDebugStr("CoAP Client disposed: %p", self); } return err; }
FskErr KprCoAPClientRequestNew(KprCoAPClientRequest *it, KprCoAPClient client, KprCoAPMessage message, KprCoAPEndpoint endpoint) { FskErr err = kFskErrNone; KprCoAPClientRequest self = NULL; KprCoAPMessageOptionRecord *option; bailIfError(KprMemPtrNewClear(sizeof(KprCoAPClientRequestRecord), &self)); self->client = client; self->message= KprRetain(message); self->endpoint = KprRetain(endpoint); option = KprCoAPMessageFindOption(message, kKprCoAPMessageOptionObserve); self->observeRequested = (option != NULL && option->value.uint == kKprCoAPMessageObserveRegister); *it = self; FskDebugStr("CoAP ClientRequest created: %x", (int) self); bail: if (err) { KprCoAPClientRequestDispose(self); } return err; }