void KPR_mqttclient_publish(xsMachine* the) { KPR_MQTTClientRecord *self = xsGetHostData(xsThis); FskErr err = kFskErrNone; char *topic; void *payload = NULL; UInt32 payloadLength = 0; UInt8 qos; Boolean retain; UInt16 token; if (xsToInteger(xsArgc) != 4) xsThrowIfFskErr(kFskErrParameterError); topic = xsToString(xsArg(0)); if (xsTest(xsArg(1))) { if (isArrayBuffer(xsArg(1))) { payload = xsToArrayBuffer(xsArg(1)); payloadLength = xsGetArrayBufferLength(xsArg(1)); } else { payload = xsToString(xsArg(1)); payloadLength = FskStrLen(payload); } } qos = xsToInteger(xsArg(2)); retain = xsToBoolean(xsArg(3)); bailIfError(KprMQTTClientPublish(self->client, topic, payload, payloadLength, qos, retain, &token)); xsResult = xsInteger(token); bail: xsThrowIfFskErr(err); }
void KPR_mqttclient_publish(xsMachine* the) { KPR_MQTTClientRecord *self = xsGetHostData(xsThis); FskErr err = kFskErrNone; xsIntegerValue c = xsToInteger(xsArgc); char *topic = NULL; void *payload = NULL; UInt32 payloadLength = 0; UInt8 qos = 0; Boolean retain = false, hasPayload = false, hasQos = false, hasRetain = false; UInt16 token; /* Case 1. topic, string_or_chunk, qos, retain Case 2 topic, { payload: string_or_chunk}, qos, retain Case 3 topic, { payload: string_or_chunk, qos: 0, retain: true } */ if (c < 1) goto invalidParams; topic = xsToString(xsArg(0)); if (c >= 2) { if (isChunk(xsArg(1))) { payload = xsGetHostData(xsArg(1)); payloadLength = xsToInteger(xsGet(xsArg(1), xsID_length)); } else if (isObject(xsArg(1))) { xsVars(1); xsEnterSandbox(); { hasPayload = xsHas(xsArg(1), xsID("data")); if (hasPayload) xsVar(0) = the->scratch; hasQos = xsHas(xsArg(1), xsID("qos")); if (hasQos) qos = xsToInteger(the->scratch); hasRetain = xsHas(xsArg(1), xsID("retain")); if (hasRetain) retain = xsToInteger(the->scratch); } xsLeaveSandbox(); if (hasPayload) { if (isChunk(xsVar(0))) { payload = xsGetHostData(xsVar(0)); payloadLength = xsToInteger(xsGet(xsVar(0), xsID_length)); } else { payload = xsToString(xsVar(0)); payloadLength = FskStrLen(payload); } } } else { payload = xsToString(xsArg(1)); payloadLength = FskStrLen(payload); } } if (c >= 3 && !hasQos) { qos = xsToInteger(xsArg(2)); } if (c >= 4 && !hasRetain) { retain = xsToBoolean(xsArg(3)); } if (!KprMQTTIsValidTopic(topic, false)) goto badParam; if (qos > 2) goto badParam; bailIfError(KprMQTTClientPublish(self->client, topic, payload, payloadLength, qos, retain, &token)); xsResult = xsInteger(token); goto bail; invalidParams: err = kFskErrInvalidParameter; goto bail; badParam: err = kFskErrBadData; goto bail; bail: xsThrowIfFskErr(err); }