#include "config.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "mosquitto_broker_internal.h"
#include "mqtt_protocol.h"
#include "property_mosq.h"
int property__process_connect(struct mosquitto *context, mosquitto_property **props)
{
	mosquitto_property *p;
	p = *props;
	while(p){
		if(p->identifier == MQTT_PROP_SESSION_EXPIRY_INTERVAL){
			context->session_expiry_interval = p->value.i32;
		}else if(p->identifier == MQTT_PROP_RECEIVE_MAXIMUM){
			if(p->value.i16 == 0){
				return MOSQ_ERR_PROTOCOL;
			}
			context->msgs_out.inflight_maximum = p->value.i16;
			context->msgs_out.inflight_quota = context->msgs_out.inflight_maximum;
		}else if(p->identifier == MQTT_PROP_MAXIMUM_PACKET_SIZE){
			if(p->value.i32 == 0){
				return MOSQ_ERR_PROTOCOL;
			}
			context->maximum_packet_size = p->value.i32;
		}
		p = p->next;
	}
	return MOSQ_ERR_SUCCESS;
}
int property__process_will(struct mosquitto *context, struct mosquitto_message_all *msg, mosquitto_property **props)
{
	mosquitto_property *p, *p_prev;
	mosquitto_property *msg_properties, *msg_properties_last;
	p = *props;
	p_prev = NULL;
	msg_properties = NULL;
	msg_properties_last = NULL;
	while(p){
		switch(p->identifier){
			case MQTT_PROP_CONTENT_TYPE:
			case MQTT_PROP_CORRELATION_DATA:
			case MQTT_PROP_PAYLOAD_FORMAT_INDICATOR:
			case MQTT_PROP_RESPONSE_TOPIC:
			case MQTT_PROP_USER_PROPERTY:
				if(msg_properties){
					msg_properties_last->next = p;
					msg_properties_last = p;
				}else{
					msg_properties = p;
					msg_properties_last = p;
				}
				if(p_prev){
					p_prev->next = p->next;
					p = p_prev->next;
				}else{
					*props = p->next;
					p = *props;
				}
				msg_properties_last->next = NULL;
				break;
			case MQTT_PROP_WILL_DELAY_INTERVAL:
				context->will_delay_interval = p->value.i32;
				p_prev = p;
				p = p->next;
				break;
			case MQTT_PROP_MESSAGE_EXPIRY_INTERVAL:
				msg->expiry_interval = p->value.i32;
				p_prev = p;
				p = p->next;
				break;
			default:
				return MOSQ_ERR_PROTOCOL;
				break;
		}
	}
	msg->properties = msg_properties;
	return MOSQ_ERR_SUCCESS;
}
int property__process_disconnect(struct mosquitto *context, mosquitto_property **props)
{
	mosquitto_property *p;
	p = *props;
	while(p){
		if(p->identifier == MQTT_PROP_SESSION_EXPIRY_INTERVAL){
			if(context->session_expiry_interval == 0 && p->value.i32 != 0){
				return MOSQ_ERR_PROTOCOL;
			}
			context->session_expiry_interval = p->value.i32;
		}
		p = p->next;
	}
	return MOSQ_ERR_SUCCESS;
}