#if HAVE_CRT
#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h>
#endif //HAVE_CRT
///*
//* Copyright (C) 2010-2011 Mamadou Diop.
//*
//* Contact: Mamadou Diop <diopmamadou(at)doubango[dot]org>
//*	
//* This file is part of Open Source Doubango Framework.
//*
//* DOUBANGO is free software: you can redistribute it and/or modify
//* it under the terms of the GNU General Public License as published by
//* the Free Software Foundation, either version 3 of the License, or
//* (at your option) any later version.
//*	
//* DOUBANGO is distributed in the hope that it will be useful,
//* but WITHOUT ANY WARRANTY; without even the implied warranty of
//* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//* GNU General Public License for more details.
//*	
//* You should have received a copy of the GNU General Public License
//* along with DOUBANGO.
//*
//*/
//
///**@file tnet_turn_message.c
// * @brief Traversal Using Relays around NAT (TURN) messages.
// *
// * @author Mamadou Diop <diopmamadou(at)doubango[dot]org>
// *
//
// */
//#include "tnet_turn_message.h"
//
//#include "../tnet_types.h"
//#include "../tnet_endianness.h"
//
//#include "tsk_memory.h"
//
//#include <string.h>
//
//tnet_turn_channel_data_t* tnet_turn_channel_data_create(uint16_t number, uint16_t length, const void* data)
//{
//	return tsk_object_new(tnet_turn_channel_data_def_t, number, length, data);
//}
//
//tnet_turn_channel_data_t* tnet_turn_channel_data_create_null()
//{
//	return tnet_turn_channel_data_create(0, 0, tsk_null);
//}
//
///**@ingroup tnet_turn_group
//*/
//tsk_buffer_t* tnet_turn_channel_data_serialize(const tnet_turn_channel_data_t *message)
//{
//	tsk_buffer_t *output = 0;
//
//	if(!message) goto bail;
//
//	output = tsk_buffer_create_null();
//
//	/*	draft-ietf-behave-turn-16 11.4.  The ChannelData Message
//		0                   1                   2                   3
//		0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
//		+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//		|         Channel Number        |            Length             |
//		+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//		|                                                               |
//		/                       Application Data                        /
//		/                                                               /
//		|                                                               |
//		|                               +-------------------------------+
//		|                               |
//		+-------------------------------+
//	*/
//
//	/* Channel Number
//	*/
//	{
//		uint16_t number = tnet_htons(message->chanel_number);
//		tsk_buffer_append(output, &(number), 2);
//	}
//
//	/* Length
//	*/
//	{
//		uint16_t length = tnet_htons(message->length);
//		tsk_buffer_append(output, &(length), 2);
//	}
//
//	/* Application Data
//	*/
//	{
//		tsk_buffer_append(output, message->data, message->length);
//
//		/*	=== Padding:
//			Over stream transports, the ChannelData message MUST be padded to a
//			multiple of four bytes in order to ensure the alignment of subsequent
//			messages.  The padding is not reflected in the length field of the
//			ChannelData message, so the actual size of a ChannelData message
//			(including padding) is (4 + Length) rounded up to the nearest
//			multiple of 4.  Over UDP, the padding is not required but MAY be included.
//		*/
//		if(message->length%4)
//		{
//			static uint32_t zeros = 0x00000000;
//			tsk_buffer_append(output, &zeros, 4-(message->length%4));
//		}
//	}
//
//bail:
//	return output;
//}
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
////=================================================================================================
////	TURN CHANNEL-DATA message object definition
////
//static tsk_object_t* tnet_turn_channel_data_ctor(tsk_object_t * self, va_list * app)
//{
//	tnet_turn_channel_data_t *message = self;
//	if(message){
//		const void* data;
//		message->chanel_number = tsk_va_arg_u16(*app);
//		message->length = tsk_va_arg_u16(*app);
//		data = va_arg(*app, const void*);
//		if(data && message->length){
#if HAVE_CRT //Debug memory
//			if((message->data = calloc(message->length, sizeof(uint8_t)))){
		
	#else
//			if((message->data = tsk_calloc(message->length, sizeof(uint8_t)))){
		
	#endif //HAVE_CRT
//				memcpy(message->data, data, message->length);
//			}
//		}
//	}
//	return self;
//}
//
//static tsk_object_t* tnet_turn_channel_data_dtor(tsk_object_t * self)
//{ 
//	tnet_turn_channel_data_t *message = self;
//	if(message){
//		TSK_FREE(message->data);
//	}
//	
//	return self;
//}
//
//static const tsk_object_def_t tnet_turn_channel_data_def_s = 
//{
//	sizeof(tnet_turn_channel_data_t),
//	tnet_turn_channel_data_ctor, 
//	tnet_turn_channel_data_dtor,
//	tsk_null, 
//};
//const tsk_object_def_t *tnet_turn_channel_data_def_t = &tnet_turn_channel_data_def_s;