/*******************************************************************************
 * Copyright (c) 2017, 2018 IBM Corp.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * and Eclipse Distribution License v1.0 which accompany this distribution.
 *
 * The Eclipse Public License is available at
 *    https://www.eclipse.org/legal/epl-2.0/
 * and the Eclipse Distribution License is available at
 *   http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *    Ian Craggs - initial API and implementation and/or initial documentation
 *******************************************************************************/

#include "MQTTReasonCodes.h"

#include "MQTTPacket.h"
#include "Heap.h"
#include "StackTrace.h"

#include <memory.h>

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))

static struct {
	enum MQTTReasonCodes value;
	const char* name;
} nameToString[] =
{
  {MQTTREASONCODE_SUCCESS, "SUCCESS"},
  {MQTTREASONCODE_NORMAL_DISCONNECTION, "Normal disconnection"},
  {MQTTREASONCODE_GRANTED_QOS_0, "Granted QoS 0"},
  {MQTTREASONCODE_GRANTED_QOS_1, "Granted QoS 1"},
  {MQTTREASONCODE_GRANTED_QOS_2, "Granted QoS 2"},
  {MQTTREASONCODE_DISCONNECT_WITH_WILL_MESSAGE, "Disconnect with Will Message"},
  {MQTTREASONCODE_NO_MATCHING_SUBSCRIBERS, "No matching subscribers"},
  {MQTTREASONCODE_NO_SUBSCRIPTION_FOUND, "No subscription found"},
  {MQTTREASONCODE_CONTINUE_AUTHENTICATION, "Continue authentication"},
  {MQTTREASONCODE_RE_AUTHENTICATE, "Re-authenticate"},
  {MQTTREASONCODE_UNSPECIFIED_ERROR, "Unspecified error"},
  {MQTTREASONCODE_MALFORMED_PACKET, "Malformed Packet"},
  {MQTTREASONCODE_PROTOCOL_ERROR, "Protocol error"},
  {MQTTREASONCODE_IMPLEMENTATION_SPECIFIC_ERROR, "Implementation specific error"},
  {MQTTREASONCODE_UNSUPPORTED_PROTOCOL_VERSION, "Unsupported Protocol Version"},
  {MQTTREASONCODE_CLIENT_IDENTIFIER_NOT_VALID, "Client Identifier not valid"},
  {MQTTREASONCODE_BAD_USER_NAME_OR_PASSWORD, "Bad User Name or Password"},
  {MQTTREASONCODE_NOT_AUTHORIZED, "Not authorized"},
  {MQTTREASONCODE_SERVER_UNAVAILABLE, "Server unavailable"},
  {MQTTREASONCODE_SERVER_BUSY, "Server busy"},
  {MQTTREASONCODE_BANNED, "Banned"},
  {MQTTREASONCODE_SERVER_SHUTTING_DOWN, "Server shutting down"},
  {MQTTREASONCODE_BAD_AUTHENTICATION_METHOD, "Bad authentication method"},
  {MQTTREASONCODE_KEEP_ALIVE_TIMEOUT, "Keep Alive timeout"},
  {MQTTREASONCODE_SESSION_TAKEN_OVER, "Session taken over"},
  {MQTTREASONCODE_TOPIC_FILTER_INVALID, "Topic filter invalid"},
  {MQTTREASONCODE_TOPIC_NAME_INVALID, "Topic name invalid"},
  {MQTTREASONCODE_PACKET_IDENTIFIER_IN_USE, "Packet Identifier in use"},
  {MQTTREASONCODE_PACKET_IDENTIFIER_NOT_FOUND, "Packet Identifier not found"},
  {MQTTREASONCODE_RECEIVE_MAXIMUM_EXCEEDED, "Receive Maximum exceeded"},
  {MQTTREASONCODE_TOPIC_ALIAS_INVALID, "Topic Alias invalid"},
  {MQTTREASONCODE_PACKET_TOO_LARGE, "Packet too large"},
  {MQTTREASONCODE_MESSAGE_RATE_TOO_HIGH, "Message rate too high"},
  {MQTTREASONCODE_QUOTA_EXCEEDED, "Quota exceeded"},
  {MQTTREASONCODE_ADMINISTRATIVE_ACTION, "Administrative action"},
  {MQTTREASONCODE_PAYLOAD_FORMAT_INVALID, "Payload format invalid"},
  {MQTTREASONCODE_RETAIN_NOT_SUPPORTED, "Retain not supported"},
  {MQTTREASONCODE_QOS_NOT_SUPPORTED, "QoS not supported"},
  {MQTTREASONCODE_USE_ANOTHER_SERVER, "Use another server"},
  {MQTTREASONCODE_SERVER_MOVED, "Server moved"},
  {MQTTREASONCODE_SHARED_SUBSCRIPTIONS_NOT_SUPPORTED, "Shared subscriptions not supported"},
  {MQTTREASONCODE_CONNECTION_RATE_EXCEEDED, "Connection rate exceeded"},
  {MQTTREASONCODE_MAXIMUM_CONNECT_TIME, "Maximum connect time"},
  {MQTTREASONCODE_SUBSCRIPTION_IDENTIFIERS_NOT_SUPPORTED, "Subscription Identifiers not supported"},
  {MQTTREASONCODE_WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED, "Wildcard Subscriptions not supported"}
};

const char* MQTTReasonCode_toString(enum MQTTReasonCodes value)
{
  int i = 0;
  const char* result = NULL;

  for (i = 0; i < ARRAY_SIZE(nameToString); ++i)
  {
    if (nameToString[i].value == value)
    {
    	  result = nameToString[i].name;
    	  break;
    }
  }
  return result;
}








