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; }
FskErr KprCoAPServerSessionNew(KprCoAPServer server, KprCoAPMessage request, KprCoAPEndpoint endpoint, KprCoAPServerSession *it) { FskErr err = kFskErrNone; KprCoAPServerSession self = NULL; KprCoAPMessageOptionRecord *option; bailIfError(KprMemPtrNewClear(sizeof(KprCoAPServerSessionRecord), &self)); bailIfError(KprRetainableNew(&self->retainable)); self->server = server; self->sessionId = KprCoAPServerNextSessionId(server); self->endpoint = KprRetain(endpoint); self->request = KprRetain(request); self->autoAck = true; self->confiramableRequest = KprCoAPMessageIsConfirmable(request); KprCoAPEndpointGetExpireTime(endpoint, &self->expireAt); option = KprCoAPMessageFindOption(request, kKprCoAPMessageOptionObserve); self->observeRequested = (option != NULL && option->value.uint == kKprCoAPMessageObserveRegister); bailIfError(KprCoAPMessageBuildUri(self->request)); *it = self; bail: if (err) { KprCoAPServerSessionDispose(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; }