/**
 * \file XMLProperty.cpp
 * Classe de description d'une propriete XML.
 * 
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "XMLProperty.h"

/**
 * Constructeur pour un nouvel objet XMLProperty.
 *
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
XMLProperty::XMLProperty(void) {
  name = NULL;
  value = NULL;
  ndynamique = 0;
  vdynamique = 0;
}

/**
 * Constructeur pour un nouvel objet XMLProperty.
 *
 * @param name Le nom.
 * @param value La valeur.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
XMLProperty::XMLProperty(char *name,char *value) {
  ndynamique = 1;
  this->name =(char *) calloc(strlen(name)+1,sizeof(char));
  strcpy(this->name,name);
  vdynamique = 1;
  this->value =(char *) calloc(strlen(value)+1,sizeof(char));
  strcpy(this->value,value);
}

/**
 * Destructeur pour un objet XMLProperty.
 *
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
XMLProperty::~XMLProperty() {
  if ( name && ndynamique )
    free(name);
  if ( value && vdynamique )
    free(value);
}

/**
 * Affectation du nom.
 *
 * @param t Le tableau d'ou est extrait le nom.
 * @param p1 L'indice du premier caractere du nom dans le tableau t.
 * @param p2 L'indice du dernier caractere du nom dans le tableau t.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
void XMLProperty::setName(char *t,int p1,int p2) {
  if ( name && ndynamique ) {
    free(name); }
  ndynamique = 1;
  name =(char *) calloc(p2-p1+2,sizeof(char));
  for ( int i = 0 ; i < p2-p1+1 ; i++ )
    name[i] = t[p1+i];
}

/**
 * Affectation de la valeur.
 *
 * @param t Le tableau d'ou est extrait la valeur.
 * @param p1 L'indice du premier caractere de la valeur dans le tableau t.
 * @param p2 L'indice du dernier caractere de la valeur dans le tableau t.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
void XMLProperty::setValue(char *t,int p1,int p2) {
  if ( value && vdynamique ) {
    free(value); }
  vdynamique = 1;
  value =(char *) calloc(p2-p1+2,sizeof(char));
  for ( int i = 0 ; i < p2-p1+1 ; i++ )
    value[i] = t[p1+i];
}

/**
  * Affectation du nom.
  *
  * @param t Le nom.
  * @author Nicolas Janey
  * @author nicolas.janey@univ-fcomte.fr
  * @version 1.0, 01/01/10
  */
void XMLProperty::setName(char *t) {
  if ( name && ndynamique ) {
    free(name); }
  ndynamique = 0;
  name = t;
}

/**
  * Affectation de la valeur.
  *
  * @param t La valeur.
  * @author Nicolas Janey
  * @author nicolas.janey@univ-fcomte.fr
  * @version 1.0, 01/01/10
  */
void XMLProperty::setValue(char *v) {
  if ( value && vdynamique ) {
    free(value); }
  vdynamique = 0;
  this->value = v;
}

///
/// Retour de la quantite de memoire utilisee.
///
/// @return la quantite de memoire.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
size_t XMLProperty::getUsedMemory(void) {
  size_t mem = sizeof(XMLProperty);
  if ( name && ndynamique )
    mem += strlen(name)+1;
  if ( value && vdynamique )
    mem += strlen(value)+1;
  return(mem);
}

///
/// Retour du nombre de handles memoires utilises.
///
/// @return le nombre de handles memoires.
/// @author Nicolas Janey
/// @author nicolas.janey@univ-fcomte.fr
/// @version 1.0, 01/01/10
///
long XMLProperty::getUsedHandles(void) {
  long mem = 1;
  if ( name && ndynamique )
    mem++;
  if ( value && vdynamique )
    mem++;
  return(mem);
}
