Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}