/*
 * Copyright (C) 2005 Luca Veltri - University of Parma - Italy
 * 
 * This file is part of MjSip (http://www.mjsip.org)
 * 
 * MjSip 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 2 of the License, or
 * (at your option) any later version.
 * 
 * MjSip 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 MjSip; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * 
 * Author(s):
 * Luca Veltri (luca.veltri@unipr.it)
 */

package org.zoolu.sdp;


import java.util.Vector;


/** Class MediaDescriptor handles SDP media descpriptions.
  * <p> A MediaDescriptor can be part of a SessionDescriptor, and contains
  * details that apply onto to a single media stream.
  * <p> A single SessionDescriptor may convey zero or more MediaDescriptors.
  * <p> In the current implementation, the MediaDescriptor consists of
  * the m (media) and c (connection information) fields, followed by zero
  * or more a (attribute) fields.
  * The m field is mandatory for a MediaDescriptor.
  */
public class MediaDescriptor
{
   /** Media field ('m'). */
   MediaField m;
   /** Connection field ('c') */
   ConnectionField c;
   /** Vector of attribute fileds ('a') */
   Vector av;

   /** Creates a new MediaDescriptor.
     * @param md the cloned MediaDescriptor */
   public MediaDescriptor(MediaDescriptor md)
   {  m=new MediaField(md.m);
      if (md.c!=null) c=new ConnectionField(md.c); else c=null;
      av=new Vector();
      for (int i=0; i<md.av.size(); i++) av.addElement(new AttributeField((AttributeField)md.av.elementAt(i)));
   }

   /** Creates a new MediaDescriptor with m <i>media</i> and c <i>connection</i>.
     * No attribute is set by default.
     * @param media the MediaField
     * @param connection the ConnectionField, or null if no ConnectionField
     * is present in the MediaDescriptor */
   public MediaDescriptor(MediaField media, ConnectionField connection)
   {  m=media;
      c=connection;
      av=new Vector();
   }

   /** Creates a new MediaDescriptor with m <i>media</i>, c <i>connection</i>,
     * and a <i>attribute</i>.
     * @param media the MediaField
     * @param connection the ConnectionField, or null if no ConnectionField
     * is present in the MediaDescriptor
     * @param attribute the first AttributeField */
   public MediaDescriptor(MediaField media, ConnectionField connection, AttributeField attribute)
   {  m=media;
      c=connection;
      av=new Vector();
      if (attribute!=null) av.addElement(attribute);
   }   
   
   /** Creates a new MediaDescriptor with m=<i>media</i> and c=<i>connection</i>,
     * with attributes 'a' equals to <i>attributes</i> (Vector of AttributeField).
     * @param media the MediaField
     * @param connection the ConnectionField, or null if no ConnectionField
     * is present in the MediaDescriptor
     * @param attributes the Vector of AttributeField */
   public MediaDescriptor(MediaField media, ConnectionField connection, Vector attributes)
   {  m=media;
      c=connection;
      av=new Vector(attributes.size());
      av.setSize(attributes.size());
      for (int i=0; i<attributes.size(); i++)
         av.setElementAt((AttributeField)attributes.elementAt(i),i);
   }

   /** Creates a new MediaDescriptor with m <i>media</i>, c <i>connection</i>,
     * and a <i>attribute</i>.
     * @param media the media field vaule
     * @param connection the connection field vaule, or null if no connection field
     * is present in the MediaDescriptor
     * @param attribute the first media attribute alue */
   public MediaDescriptor(String media, String connection, String attribute)
   {  m=new MediaField(media);
      if (connection!=null) c=new ConnectionField(connection);
      av=new Vector();
      if (attribute!=null) av.addElement(new AttributeField(attribute));
   }   

   /** Creates a new MediaDescriptor from String <i>str</i>.
     * @param str the media field line */
   /*public MediaDescriptor(String str)
   {  SdpParser par=new SdpParser(str);
      m=par.parseMediaField();
      c=par.parseConnectionField();
      av=new Vector();
      AttributeField a=par.parseAttributeField();
      while (a!=null)
      {  av.addElement(a);
         a=par.parseAttributeField();
      }
   }*/
           
   /** Gets media.
     * @return the MediaField */
   public MediaField getMedia()
   {  return m;
   } 

   /** Gets connection information.
     * @return the ConnectionField */
   public ConnectionField getConnection()
   {  return c;
   } 

   /** Gets a Vector of attribute values.
     * @return a Vector of AttributeField */
   public Vector getAttributes()
   {  Vector v=new Vector(av.size());
      for (int i=0; i<av.size(); i++)
         v.addElement((AttributeField)av.elementAt(i));
      return v;
   } 

   /** Adds a new attribute
     * @param attribute the new AttributeField
     * @return this MediaDescriptor */
   public MediaDescriptor addAttribute(AttributeField attribute)
   {  av.addElement(new AttributeField(attribute));
      return this;
   } 

   /** Whether it has a particular attribute
     * @param a_name the attribute name
     * @return true if found, otherwise returns null */
   public boolean hasAttribute(String a_name)
   {  for (int i=0; i<av.size(); i++)
      {  if (((AttributeField)av.elementAt(i)).getAttributeName().equals(a_name)) return true;
      }
      return false;
   } 
   
   /** Gets a particular attribute
     * @param a_name the attribute name
     * @return the AttributeField, or null if not found */
   public AttributeField getAttribute(String a_name)
   {  for (int i=0; i<av.size(); i++)
      {  AttributeField a=(AttributeField)av.elementAt(i);
         if (a.getAttributeName().equals(a_name)) return a;
      }
      return null;
   } 

   /** Gets a Vector of attribute values of a particular attribute name.
     * @param a_name the attribute name
     * @return a Vector of AttributeFields */
   public Vector getAttributes(String a_name)
   {  Vector v=new Vector(av.size());
      for (int i=0; i<av.size(); i++)
      {  AttributeField a=(AttributeField)av.elementAt(i);
         if (a.getAttributeName().equals(a_name)) v.addElement(a);
      }
      return v;
   } 
   
   /** Gets a String rapresentation of the MediaDescriptor.
     * @return the string representation */
   public String toString()
   {  String str=""; str+=m; if (c!=null) str+=c;
      for (int i=0; i<av.size(); i++) str+=(AttributeField)av.elementAt(i);
      return str;
   }
   
}

