/*
 * Copyright (C) 2006 Raul Tremsal
 * File  : smpp34_params.c
 * Author: Raul Tremsal <ultraismo@yahoo.com>
 *
 * This file is part of libsmpp34 (c-open-smpp3.4 library).
 *
 * The libsmpp34 library is free software; you can redistribute it and/or 
 * modify it under the terms of the GNU Lesser General Public License as 
 * published by the Free Software Foundation; either version 2.1 of the 
 * License, or (at your option) any later version.
 *
 * This library 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 Lesser General Public 
 * License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License 
 * along with this library; if not, write to the Free Software Foundation, 
 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

#include "smpp34.h"
#include "smpp34_structs.h"
#include "smpp34_heap.h"

int 
build_udad( udad_t **dest, udad_t *source )
{

    /* Build new DAD-Chain ************************************************/
    udad_t *dummy = (udad_t*)smpp34_malloc(sizeof( udad_t ));
    if( dummy == NULL ){
        printf("Error in smpp34_malloc()\n" );
        return( -1 );
    };
    memcpy(dummy, source, sizeof( udad_t ));

    dummy->next = (*dest);
    (*dest) = dummy;

    return( 0 );
};

int
destroy_udad( udad_t *sourceList )
{

    udad_t *i = NULL;
    /* Destroy DAD-Chain **************************************************/
    while( sourceList != NULL ){
        i = sourceList->next;
        smpp34_free((void*)sourceList);
        sourceList = i;
    };

    return( 0 );
};



int 
build_dad( dad_t **dest, dad_t *source )
{

    /* Build new DAD-Chain ************************************************/
    dad_t *dummy = (dad_t*)smpp34_malloc(sizeof( dad_t ));
    if( dummy == NULL ){
        printf("Error in smpp34_malloc()\n" );
        return( -1 );
    };
    memcpy(dummy, source, sizeof( dad_t ));

    dummy->next = (*dest);
    (*dest) = dummy;

    return( 0 );
};

int
destroy_dad( dad_t *sourceList )
{

    dad_t *i = NULL;
    /* Destroy DAD-Chain **************************************************/
    while( sourceList != NULL ){
        i = sourceList->next;
        smpp34_free((void*)sourceList);
        sourceList = i;
    };

    return( 0 );
};


int 
build_tlv( tlv_t **dest, tlv_t *source )
{

    /* Build new TLV-Chain ************************************************/
    tlv_t *dummy = (tlv_t*)smpp34_malloc(sizeof( tlv_t ));
    if( dummy == NULL ){
        printf("Error in smpp34_malloc()\n" );
        return( -1 );
    };
    memcpy(dummy, source, sizeof( tlv_t ));

    dummy->next = (*dest);
    (*dest) = dummy;

    return( 0 );
};

int
destroy_tlv( tlv_t *sourceList )
{

    tlv_t *i = NULL;
    /* Destroy TLV-Chain **************************************************/
    while( sourceList != NULL ){
        i = sourceList->next;
        smpp34_free((void*)sourceList);
        sourceList = i;
    };

    return( 0 );
};


char* str_tlv_id( uint16_t tlv_id, char* buff )
{
    snprintf(buff, SMALL_BUFF, "%s", 
#define OPERACION( p_tlv_id ) (tlv_id == p_tlv_id)?#p_tlv_id:
#include "def_list/tlv_id.list"
            "Reserved"
#undef OPERACION
          );
    return( buff );
};


char* str_command_id( uint32_t command, char* buff )
{
    snprintf(buff, SMALL_BUFF, "%s", 
#define OPERACION( p_command ) (command == p_command)?#p_command:
#include "def_list/command_id.list"
            ""
#undef OPERACION
          );
    return( buff );
};


char* str_addr_ton( uint8_t ton, char* buff )
{
    snprintf(buff, SMALL_BUFF, "%s", 
#define OPERACION( p_command ) (ton == p_command)?#p_command:
#include "def_list/addr_ton.list"
            ""
#undef OPERACION
          );
    return( buff );
};


char* str_addr_npi( uint8_t npi, char* buff )
{
    snprintf(buff, SMALL_BUFF, "%s", 
#define OPERACION( p_command ) (npi == p_command)?#p_command:
#include "def_list/addr_npi.list"
            ""
#undef OPERACION
          );
    return( buff );
};


char* str_command_status( uint32_t command, char* buff )
{
    snprintf(buff, SMALL_BUFF, "%s", 
#define OPERACION( p_command ) (command == p_command)?#p_command:
#include "def_list/command_status.list"
            ""
#undef OPERACION
             );
    return( buff );
};

char *test_interface_version( uint8_t interface_version, char* buff )
{
    snprintf(buff, SMALL_BUFF, "%s", (interface_version==0x34)?"OK":"" );
    return( buff );
};

char *test_dest_flag( uint8_t dest_flag, char* buff )
{
    snprintf(buff, SMALL_BUFF, "%s", 
#define OPERACION( p_command ) (dest_flag == p_command)?#p_command:
#include "def_list/dest_flag.list"
            ""
#undef OPERACION
            );
    return( buff );
};

char *test_sequence_number( uint32_t sequence_number, char* buff )
{
    char numero[20];
    snprintf(numero, sizeof(numero), "%d", sequence_number);
    snprintf(buff, SMALL_BUFF, "%s", (sequence_number>0)?numero:"" );
    return( buff );
};

char *nothing( uint32_t var, char* buff )
{
    snprintf(buff, SMALL_BUFF, "%s", "OK" );
    return( buff );
};

char *valueDec_32( uint32_t var, char *buff )
{
    snprintf(buff, SMALL_BUFF, "%d", var);
    return( buff );
};

char *valueDec_16( uint16_t var, char *buff )
{
    snprintf(buff, SMALL_BUFF, "%d", var);
    return( buff );
};

char *valueDec_08( uint8_t var, char* buff )
{
    snprintf(buff, SMALL_BUFF, "%d", var);
    return( buff );
};