/* * 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.sip.header; import org.zoolu.sip.provider.SipParser; import java.util.Vector; /** MultipleHeader can be used to handle SIP headers that support comma-separated (multiple-header) rapresentation, * as explaned in section 7.3.1 of RFC 3261. */ public class MultipleHeader { /** The header type */ protected String name; /** Vector of header values (as Strings) */ protected Vector values; /** whether to be rapresented with a comma-separated(compact) header line or multiple header lines */ protected boolean compact; protected MultipleHeader() { name=null; values=new Vector(); compact=true; } /** Costructs a MultipleHeader named <i>hname</i> */ public MultipleHeader(String hname) { name=hname; values=new Vector(); compact=true; } /** Costructs a MultipleHeader named <i>hname</i> from a Vector of header values (as Strings). */ public MultipleHeader(String hname, Vector hvalues) { name=hname; values=hvalues; compact=true; } /** Costructs a MultipleHeader from a Vector of Headers. Each Header can be a single header or a multiple-comma-separated header. */ public MultipleHeader(Vector headers) { name=((Header)headers.elementAt(0)).getName(); values=new Vector(headers.size()); for (int i=0; i<headers.size(); i++) { addBottom((Header)headers.elementAt(i)); } compact=false; } /** Costructs a MultipleHeader from a comma-separated header */ public MultipleHeader(Header hd) { name=hd.getName(); values=new Vector(); SipParser par=new SipParser(hd.getValue()); int comma=par.indexOfCommaHeaderSeparator(); while (comma>=0) { values.addElement(par.getString(comma-par.getPos()).trim()); par.skipChar(); //skip comma comma=par.indexOfCommaHeaderSeparator(); } values.addElement(par.getRemainingString().trim()); compact=true; } /** Costructs a MultipleHeader from a MultipleHeader */ public MultipleHeader(MultipleHeader mhd) { name=mhd.getName(); values=mhd.getValues(); compact=mhd.isCommaSeparated(); } /** Checks if Header <i>hd</i> contains comma-separated multi-header */ public static boolean isCommaSeparated(Header hd) { SipParser par=new SipParser(hd.getValue()); return par.indexOfCommaHeaderSeparator()>=0; } /** Sets the MultipleHeader rappresentation as comma-separated or multiple headers */ public void setCommaSeparated(boolean comma_separated) { compact=comma_separated; } /** Whether the MultipleHeader rappresentation is comma-separated or multiple headers */ public boolean isCommaSeparated() { return compact; } /** Gets the size of th MultipleHeader */ public int size() { return values.size(); } /** Whether it is empty */ public boolean isEmpty() { return values.isEmpty(); } /** Creates and returns a copy of Header */ public Object clone() { return new MultipleHeader(getName(),getValues()); } /** Indicates whether some other Object is "equal to" this Header */ public boolean equals(Object obj) { MultipleHeader hd=(MultipleHeader)obj; if (hd.getName().equals(this.getName()) && hd.getValues().equals(this.getValues())) return true; else return false; } /** Gets name of Header */ public String getName() { return name; } /** Gets a vector of header values */ public Vector getValues() { return values; } /** Sets header values */ public void setValues(Vector v) { values=v; } /** Gets a vector of headers */ public Vector getHeaders() { Vector v=new Vector(values.size()); for (int i=0; i<values.size(); i++) { Header h=new Header(name,(String)values.elementAt(i)); v.addElement(h); } return v; } /** Sets header values */ public void setHeaders(Vector hdv) { values=new Vector(hdv.size()); for (int i=0; i<hdv.size(); i++) { values.addElement(((Header)hdv.elementAt(i)).getValue()); } } /** Gets the i-value */ public String getValue(int i) { return (String)values.elementAt(i); } /** Adds top */ //public void addTop(String value) //{ values.insertElementAt(value,0); //} /** Adds top */ public void addTop(Header hd) { values.insertElementAt(hd.getValue(),0); } /** Gets top Header */ public Header getTop() { return new Header(name,(String)values.firstElement()); } /** Removes top Header */ public void removeTop() { values.removeElementAt(0); } /** Adds bottom */ //public void addBottom(String value) //{ values.addElement(value); //} /** Adds bottom */ public void addBottom(Header hd) { if (!MultipleHeader.isCommaSeparated(hd)) values.addElement(hd.getValue()); else addBottom(new MultipleHeader(hd)); } /** Adds other MultipleHeader at bottom */ public void addBottom(MultipleHeader mhd) { for (int i=0; i<mhd.size(); i++) values.addElement(mhd.getValue(i)); } /** Gets bottom Header */ public Header getBottom() { return new Header(name,(String)values.lastElement()); } /** Removes bottom Header */ public void removeBottom() { values.removeElementAt(values.size()-1); } /** Gets an Header containing the comma-separated(compact) representation. */ public Header toHeader() { String str=""; for (int i=0; i<values.size()-1; i++) str+=values.elementAt(i)+", "; if (values.size()>0) str+=values.elementAt(values.size()-1); return new Header(name,str); } /** Gets comma-separated(compact) or multi-headers(extended) representation.<BR> * Note that an empty header is rapresentated as:<BR> * - empty String (i.e. ""), for multi-headers(extended) rapresentation, * - empty-value Header (i.e. "HeaderName: \r\n"), for comma-separated(compact) rapresentation. */ public String toString() { if (compact) { String str=name+": "; for (int i=0; i<values.size()-1; i++) str+=values.elementAt(i)+", "; if (values.size()>0) str+=values.elementAt(values.size()-1); return str+"\r\n"; } else { String str=""; for (int i=0; i<values.size(); i++) str+=name+": "+values.elementAt(i)+"\r\n"; return str; } } }