Changes to enabled on-line compiler

Revision:
0:082731ede69f
diff -r 000000000000 -r 082731ede69f src/aws_iot_jobs_topics.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/aws_iot_jobs_topics.c	Wed May 30 20:59:51 2018 +0000
@@ -0,0 +1,129 @@
+/*
+* Copyright 2015-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+*
+* Licensed under the Apache License, Version 2.0 (the "License").
+* You may not use this file except in compliance with the License.
+* A copy of the License is located at
+*
+* http://aws.amazon.com/apache2.0
+*
+* or in the "license" file accompanying this file. This file is distributed
+* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+* express or implied. See the License for the specific language governing
+* permissions and limitations under the License.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "aws_iot_jobs_topics.h"
+#include <string.h>
+#include <stdio.h>
+#include <stdbool.h>
+
+#define BASE_THINGS_TOPIC "$aws/things/"
+
+#define NOTIFY_OPERATION "notify"
+#define NOTIFY_NEXT_OPERATION "notify-next"
+#define GET_OPERATION "get"
+#define START_NEXT_OPERATION "start-next"
+#define WILDCARD_OPERATION "+"
+#define UPDATE_OPERATION "update"
+#define ACCEPTED_REPLY "accepted"
+#define REJECTED_REPLY "rejected"
+#define WILDCARD_REPLY "+"
+
+static const char *_get_operation_for_base_topic(AwsIotJobExecutionTopicType topicType) {
+	switch (topicType) {
+	case JOB_UPDATE_TOPIC:
+		return UPDATE_OPERATION;
+	case JOB_NOTIFY_TOPIC:
+		return NOTIFY_OPERATION;
+	case JOB_NOTIFY_NEXT_TOPIC:
+	    return NOTIFY_NEXT_OPERATION;
+	case JOB_GET_PENDING_TOPIC:
+	case JOB_DESCRIBE_TOPIC:
+		return GET_OPERATION;
+	case JOB_START_NEXT_TOPIC:
+	    return START_NEXT_OPERATION;
+	case JOB_WILDCARD_TOPIC:
+		return WILDCARD_OPERATION;
+	case JOB_UNRECOGNIZED_TOPIC:
+	default:
+		return NULL;
+	}
+}
+
+static bool _base_topic_requires_job_id(AwsIotJobExecutionTopicType topicType) {
+	switch (topicType) {
+	case JOB_UPDATE_TOPIC:
+	case JOB_DESCRIBE_TOPIC:
+		return true;
+	case JOB_NOTIFY_TOPIC:
+	case JOB_NOTIFY_NEXT_TOPIC:
+	case JOB_START_NEXT_TOPIC:
+	case JOB_GET_PENDING_TOPIC:
+	case JOB_WILDCARD_TOPIC:
+	case JOB_UNRECOGNIZED_TOPIC:
+	default:
+		return false;
+	}
+}
+
+static const char *_get_suffix_for_topic_type(AwsIotJobExecutionTopicReplyType replyType) {
+	switch (replyType) {
+	case JOB_REQUEST_TYPE:
+		return "";
+//		break;
+	case JOB_ACCEPTED_REPLY_TYPE:
+		return "/" ACCEPTED_REPLY;
+//		break;
+	case JOB_REJECTED_REPLY_TYPE:
+		return "/" REJECTED_REPLY;
+//		break;
+	case JOB_WILDCARD_REPLY_TYPE:
+		return "/" WILDCARD_REPLY;
+//		break;
+	case JOB_UNRECOGNIZED_TOPIC_TYPE:
+	default:
+		return NULL;
+	}
+}
+
+int aws_iot_jobs_get_api_topic(char *buffer, size_t bufferSize,
+		AwsIotJobExecutionTopicType topicType, AwsIotJobExecutionTopicReplyType replyType,
+		const char* thingName, const char* jobId)
+{
+	if (thingName == NULL) {
+		return -1;
+	}
+
+	if ((topicType == JOB_NOTIFY_TOPIC || topicType == JOB_NOTIFY_NEXT_TOPIC) && replyType != JOB_REQUEST_TYPE) {
+		return -1;
+	}
+
+	bool requireJobId = _base_topic_requires_job_id(topicType);
+	if (jobId == NULL && requireJobId) {
+		return -1;
+	}
+
+	const char *operation = _get_operation_for_base_topic(topicType);
+	if (operation == NULL) {
+		return -1;
+	}
+
+	const char *suffix = _get_suffix_for_topic_type(replyType);
+
+	if (requireJobId || (topicType == JOB_WILDCARD_TOPIC && jobId != NULL)) {
+		return snprintf(buffer, bufferSize, BASE_THINGS_TOPIC "%s/jobs/%s/%s%s", thingName, jobId, operation, suffix);
+	} else if (topicType == JOB_WILDCARD_TOPIC) {
+		return snprintf(buffer, bufferSize, BASE_THINGS_TOPIC "%s/jobs/#", thingName);
+	} else {
+		return snprintf(buffer, bufferSize, BASE_THINGS_TOPIC "%s/jobs/%s%s", thingName, operation, suffix);
+	}
+}
+
+#ifdef __cplusplus
+}
+#endif