FskErr KprMQTTClientNew(KprMQTTClient* it, char *clientId, Boolean cleanSession, void *refcon) { FskErr err = kFskErrNone; KprMQTTClient self = NULL; bailIfError(FskMemPtrNewClear(sizeof(KprMQTTClientRecord), &self)); bailIfError(KprMQTTQueueNew(&self->queue, 15, KprMQTTClientSendMessageViaDelivery, self)); FskTimeCallbackNew(&self->pingRequestCallaback); bailIfNULL(self->pingRequestCallaback); FskTimeCallbackNew(&self->pingResponseCallaback); bailIfNULL(self->pingResponseCallaback); self->clientIdentifier = FskStrDoCopy(clientId); bailIfNULL(self->clientIdentifier); self->cleanSession = cleanSession; self->refcon = refcon; self->state = kKprMQTTStateDisconnected; KprMQTTQueueStart(self->queue); *it = self; bail: if (err) KprMQTTClientDispose(self); return err; }
void KPR_MQTTClient(xsMachine* the) { FskErr err; KPR_MQTTClientRecord *self = NULL; xsIntegerValue c = xsToInteger(xsArgc); KprMQTTClient client = NULL; char clientIdentifier[kKprMQTTClientIdentifierMaxLength + 1]; Boolean cleanSession = true; if (c >= 1) { char *arg = xsToString(xsArg(0)); UInt32 len = FskStrLen(arg); if (len < 1 || len > kKprMQTTClientIdentifierMaxLength) xsThrowIfFskErr(kFskErrBadData); FskStrCopy(clientIdentifier, arg); } else { char hex[9]; FskStrNumToHex(FskRandom(), hex, 8); FskStrCopy(clientIdentifier, kKprMQTTClientIdentifierPrefix); FskStrCat(clientIdentifier, hex); } if (c >= 2) { cleanSession = xsToBoolean(xsArg(1)); } bailIfError(FskMemPtrNewClear(sizeof(KPR_MQTTClientRecord), &self)); bailIfError(KprMQTTClientNew(&client, clientIdentifier, cleanSession, self)); client->connectCallback = KPR_mqttclient_onConnect; client->subscribeCallback = KPR_mqttclient_onSubscribe; client->unsubscribeCallback = KPR_mqttclient_onUnsubscribe; client->publishCallback = KPR_mqttclient_onPublish; client->messageCallback = KPR_mqttclient_onMessage; client->disconnectCallback = KPR_mqttclient_onDisconnect; client->errorCallback = KPR_mqttclient_onError; self->client = client; self->the = the; self->slot = xsThis; self->code = the->code; xsSetHostData(self->slot, self); // xsCall1(xsGet(xsGlobal, xsID_Object), xsID_seal, self->slot); xsRemember(self->slot); bail: if (err) { KprMQTTClientDispose(client); FskMemPtrDispose(self); xsThrowIfFskErr(err); } }
void KPR_mqttclient_destructor(void *it) { KPR_MQTTClientRecord *self = it; if (self) { self->client->connectCallback = NULL; self->client->subscribeCallback = NULL; self->client->unsubscribeCallback = NULL; self->client->publishCallback = NULL; self->client->messageCallback = NULL; self->client->disconnectCallback = NULL; self->client->errorCallback = NULL; KprMQTTClientDispose(self->client); FskDeferrerDispose(self->deferrer); FskMemPtrDispose(self); } }
void KPR_MQTTClient(xsMachine* the) { FskErr err; KPR_MQTTClientRecord *self = NULL; KprMQTTClient client = NULL; FskDeferrer deferrer = NULL; char *clientIdentifier; Boolean cleanSession; if (xsToInteger(xsArgc) != 2) xsThrowIfFskErr(kFskErrParameterError); clientIdentifier = xsToString(xsArg(0)); cleanSession = xsToBoolean(xsArg(1)); bailIfError(FskMemPtrNewClear(sizeof(KPR_MQTTClientRecord), &self)); bailIfError(FskDeferrerNew(&deferrer)); bailIfError(KprMQTTClientNew(&client, clientIdentifier, cleanSession, kKprMQTTProtocol311, self)); client->connectCallback = KPR_mqttclient_onConnect; client->subscribeCallback = KPR_mqttclient_onSubscribe; client->unsubscribeCallback = KPR_mqttclient_onUnsubscribe; client->publishCallback = KPR_mqttclient_onPublish; client->messageCallback = KPR_mqttclient_onMessage; client->disconnectCallback = KPR_mqttclient_onDisconnect; client->errorCallback = KPR_mqttclient_onError; self->client = client; self->deferrer = deferrer; self->the = the; self->slot = xsThis; xsSetHostData(self->slot, self); bail: if (err) { KprMQTTClientDispose(client); FskDeferrerDispose(deferrer); FskMemPtrDispose(self); xsThrowIfFskErr(err); } }