basemessage.java

来自「结构非常清晰的SIP协议栈」· Java 代码 · 共 1,256 行 · 第 1/3 页

JAVA
1,256
字号
   protected void addHeaders(String str, boolean top) 
   {  int i,aux;
      if (top)
      {  if (this.hasRequestLine() || this.hasStatusLine())
         {  SipParser par=new SipParser(message);
            par.goToNextHeader();
            i=par.getPos();
         }
         else i=0;   
      }
      else
      {  SipParser par=new SipParser(message);
         // index the end of headers
         i=par.goToEndOfLastHeader().goToNextLine().getPos();         
         par=new SipParser(message);
         // if Content_Length is present, jump before
         aux=par.indexOfHeader(SipHeaders.Content_Length);
         if (aux<i) i=aux;
         // if Content_Type is present, jump before
         aux=par.indexOfHeader(SipHeaders.Content_Type);
         if (aux<i) i=aux; 
      }            
      String head=message.substring(0,i);
      String tail=message.substring(i);
      String new_message=head.concat(str);
      new_message=new_message.concat(tail);
      message=new_message;
   }

   /** Adds Headers on position <i>index</i> within the Message */
   protected void addHeaders(String str, int index) 
   {  if (index>message.length()) index=message.length();
      message=message.substring(0,index)+str+message.substring(index);
   }

   /** Adds Header before the first header <i>refer_header</i>
     * . <p>If there is no header of such type, it is added at top */
   public void addHeaderBefore(Header new_header, String refer_header) 
   {  addHeadersBefore(new_header.toString(),refer_header);
   }

   /** Adds MultipleHeader(s) before the first header <i>refer_header</i>
     * . <p>If there is no header of such type, they are added at top */
   public void addHeadersBefore(MultipleHeader mheader, String refer_header) 
   {  addHeadersBefore(mheader.toString(),refer_header);
   }

   /** Adds Headers before the first header <i>refer_header</i>
     * . <p>If there is no header of such type, they are added at top */
   protected void addHeadersBefore(String str, String refer_header) 
   {  if (!hasHeader(refer_header)) addHeaders(str,true);
      else
      {  SipParser par=new SipParser(message);
         par.goTo(refer_header);
         int here=par.getPos();
         message=message.substring(0,here)+str+message.substring(here);
      }
   }

   /** Adds Header after the first header <i>refer_header</i>
     * . <p>If there is no header of such type, it is added at bottom */
   public void addHeaderAfter(Header new_header, String refer_header) 
   {  addHeadersAfter(new_header.toString(),refer_header);
   }

   /** Adds MultipleHeader(s) after the first header <i>refer_header</i>
     * . <p>If there is no header of such type, they are added at bottom */
   public void addHeadersAfter(MultipleHeader mheader, String refer_header) 
   {  addHeadersAfter(mheader.toString(),refer_header);
   }

   /** Adds Headers after the first header <i>refer_header</i>
     * . <p>If there is no header of such type, they are added at bottom */
   protected void addHeadersAfter(String str, String refer_header) 
   {  if (!hasHeader(refer_header)) addHeaders(str,false);
      else
      {  SipParser par=new SipParser(message);
         par.goTo(refer_header);
         int here=par.indexOfNextHeader();
         message=message.substring(0,here)+str+message.substring(here);
      }
   }

   /** Removes first Header of specified name */
   public void removeHeader(String hname)
   {  removeHeader(hname,true);
   }

   /** Removes first (or last) Header of specified name */
   public void removeHeader(String hname, boolean first)
   {  String[] target={'\n'+hname, '\r'+hname};
      SipParser par=new SipParser(message);
      par.goTo(target);
      if (!par.hasMore()) return;
      if (!first)
         while(true)
         {  int next=par.indexOf(target);
            if (next<0) break;
            par.setPos(next);
         }
      par.skipChar();
      String head=message.substring(0,par.getPos());
      par.goToNextHeader();
      String tail=message.substring(par.getPos());
      message=head.concat(tail);
   }
   
   /** Sets the new Header (removing any previous headers of the same name) */
   /*public void setHeader(Header hd) 
   {  if (hasHeader(hd.getName())) removeAllHeaders(hd.getName());
      addHeader(hd,false);               
   }*/          

   /** Sets the Header <i>hd</i> removing any previous headers of the same type */
   public void setHeader(Header hd) 
   {  String hname=hd.getName();
      if (hasHeader(hname))
      {  int index=(new SipParser(message)).indexOfHeader(hname);
         removeAllHeaders(hname);
         addHeaders(hd.toString(),index);
      }
      else
         addHeader(hd,false);               
   }          

   /** Removes all Headers of specified name */
   public void removeAllHeaders(String hname) 
   {  String[] target={'\n'+hname, '\r'+hname};
      SipParser par=new SipParser(message);
      par.goTo(target);
      while (par.hasMore())
      {  par.skipChar();
         String head=message.substring(0,par.getPos());
         String tail=message.substring(par.indexOfNextHeader());
         message=head.concat(tail);
         par=new SipParser(message,par.getPos()-1);
         par.goTo(target);
      }         
   }
   
   /** Sets MultipleHeader <i>mheader</i> */
   /*public void setHeaders(MultipleHeader mheader) 
   {  if (hasHeader(mheader.getName())) removeAllHeaders(mheader.getName());
      addHeaders(mheader,false);            
   }*/          

   /** Sets MultipleHeader <i>mheader</i> */
   public void setHeaders(MultipleHeader mheader) 
   {  String hname=mheader.getName();
      if (hasHeader(hname))
      {  int index=(new SipParser(message)).indexOfHeader(hname);
         removeAllHeaders(hname);
         addHeaders(mheader.toString(),index);
      }
      else
         addHeaders(mheader,false);            
   }          


   //**************************** Specific Headers ****************************/

   /** Whether Message has MaxForwardsHeader */
   public boolean hasMaxForwardsHeader()
   {  return hasHeader(SipHeaders.Max_Forwards);
   }  
   /** Gets MaxForwardsHeader of Message */
   public MaxForwardsHeader getMaxForwardsHeader()
   {  Header h=getHeader(SipHeaders.Max_Forwards);
      if (h==null) return null;
      else return new MaxForwardsHeader(h);
   } 
   /** Sets MaxForwardsHeader of Message */
   public void setMaxForwardsHeader(MaxForwardsHeader mfh)
   {  setHeader(mfh);
   }  
   /** Removes MaxForwardsHeader from Message */
   public void removeMaxForwardsHeader() 
   {  removeHeader(SipHeaders.Max_Forwards);
   }

     
   /** Whether Message has FromHeader */
   public boolean hasFromHeader()
   {  return hasHeader(SipHeaders.From);
   }  
   /** Gets FromHeader of Message */
   public FromHeader getFromHeader()
   {  Header h=getHeader(SipHeaders.From);
      if (h==null) return null;
      else return new FromHeader(h);
   } 
   /** Sets FromHeader of Message */
   public void setFromHeader(FromHeader fh) 
   {  setHeader(fh);
   }  
   /** Removes FromHeader from Message */
   public void removeFromHeader() 
   {  removeHeader(SipHeaders.From);
   }

   /** Whether Message has ToHeader */
   public boolean hasToHeader()
   {  return hasHeader(SipHeaders.To);
   } 
   /** Gets ToHeader of Message */
   public ToHeader getToHeader()
   {  Header h=getHeader(SipHeaders.To);
      if (h==null) return null;
      else return new ToHeader(h);
   } 
   /** Sets ToHeader of Message */
   public void setToHeader(ToHeader th) 
   {  setHeader(th);
   } 
   /** Removes ToHeader from Message */
   public void removeToHeader() 
   {  removeHeader(SipHeaders.To);
   }

   
   /** Whether Message has ContactHeader */
   public boolean hasContactHeader()
   {  return hasHeader(SipHeaders.Contact);
   }
   /** <b>Deprecated</b>. Gets ContactHeader of Message. Use getContacts instead. */  
   public ContactHeader getContactHeader()
   {  //Header h=getHeader(SipHeaders.Contact);
      //if (h==null) return null; else return new ContactHeader(h);
      MultipleHeader mh=getContacts();
      if (mh==null) return null; return new ContactHeader(mh.getTop());
   } 
   /** Adds ContactHeader */
   public void addContactHeader(ContactHeader ch, boolean top) 
   {  addHeader(ch,top);
   }   
   /** Sets ContactHeader */
   public void setContactHeader(ContactHeader ch) 
   {  if (hasContactHeader()) removeContacts();
      addHeader(ch,false);
   }
   /** Gets a MultipleHeader of Contacts */
   public MultipleHeader getContacts()
   {  Vector v=getHeaders(SipHeaders.Contact);
      if (v.size()>0) return new MultipleHeader(v);
      else return null;
   }   
   /** Adds Contacts */
   public void addContacts(MultipleHeader contacts, boolean top) 
   {  addHeaders(contacts,top);
   }   
   /** Sets Contacts */
   public void setContacts(MultipleHeader contacts) 
   {  if (hasContactHeader()) removeContacts();
      addContacts(contacts,false);
   }    
   /** Removes ContactHeaders from Message */
   public void removeContacts() 
   {  removeAllHeaders(SipHeaders.Contact);
   }
 
   
   /** Whether Message has ViaHeaders */
   public boolean hasViaHeader()
   {  return hasHeader(SipHeaders.Via);
   }      
   /** Adds ViaHeader at the top */
   public void addViaHeader(ViaHeader vh) 
   {  addHeader(vh,true);
   } 
   /** Gets the first ViaHeader */
   public ViaHeader getViaHeader()
   {  //Header h=getHeader(SipHeaders.Via);
      //if (h==null) return null; else return new ViaHeader(h);
      MultipleHeader mh=getVias();
      if (mh==null) return null; return new ViaHeader(mh.getTop());
   } 
   /** Removes the top ViaHeader */
   public void removeViaHeader() 
   {  //removeHeader(SipHeaders.Via);
      MultipleHeader mh=getVias();
      mh.removeTop();
      setVias(mh);
   }  
   /** Gets all Vias */
   public MultipleHeader getVias()
   {  Vector v=getHeaders(SipHeaders.Via);
      if (v.size()>0) return new MultipleHeader(v);
      else return null;
   }
   /** Adds Vias */
   public void addVias(MultipleHeader vias, boolean top) 
   {  addHeaders(vias,top);
   }   
   /** Sets Vias */
   public void setVias(MultipleHeader vias) 
   {  if (hasViaHeader()) removeVias();
      addContacts(vias,true);
   }    
   /** Removes ViaHeaders from Message (if any exists) */
   public void removeVias() 
   {  removeAllHeaders(SipHeaders.Via);
   }
   
      
   /** Whether Message has RouteHeader */
   public boolean hasRouteHeader()
   {  return hasHeader(SipHeaders.Route);
   }      
   /** Adds RouteHeader at the top */
   public void addRouteHeader(RouteHeader h) 
   {  addHeaderAfter(h,SipHeaders.Via);
   } 
   /** Adds multiple Route headers at the top */
   public void addRoutes(MultipleHeader routes) 
   {  addHeadersAfter(routes,SipHeaders.Via);
   } 
   /** Gets the top RouteHeader */
   public RouteHeader getRouteHeader()
   {  //Header h=getHeader(SipHeaders.Route);
      //if (h==null) return null; else return new RouteHeader(h);
      MultipleHeader mh=getRoutes();
      if (mh==null) return null; return new RouteHeader(mh.getTop());
   } 
   /** Gets the whole route */
   public MultipleHeader getRoutes()
   {  Vector v=getHeaders(SipHeaders.Route);
      if (v.size()>0) return new MultipleHeader(v);
      else return null;
   }
   /** Removes the top RouteHeader */
   public void removeRouteHeader() 
   {  //removeHeader(SipHeaders.Route);
      MultipleHeader mh=getRoutes();
      mh.removeTop();
      setRoutes(mh);
   }  
   /** Removes all RouteHeaders from Message (if any exists) */
   public void removeRoutes() 
   {  removeAllHeaders(SipHeaders.Route);
   }
   /** Sets the whole route */
   public void setRoutes(MultipleHeader routes) 
   {  if (hasRouteHeader()) removeRoutes();
      addRoutes(routes);
   }    
   

   /** Whether Message has RecordRouteHeader */
   public boolean hasRecordRouteHeader()
   {  return hasHeader(SipHeaders.Record_Route);
   }      
   /** Adds RecordRouteHeader at the top */
   public void addRecordRouteHeader(RecordRouteHeader rr) 
   {  //addHeaderAfter(rr,SipHeaders.Via);
      addHeaderAfter(rr,SipHeaders.CSeq);
   } 
   /** Adds multiple RecordRoute headers at the top */
   public void addRecordRoutes(MultipleHeader routes) 
   {  //addHeadersAfter(routes,SipHeaders.Via);
      addHeadersAfter(routes,SipHeaders.CSeq);
   } 
   /** Gets the top RecordRouteHeader */
   public RecordRouteHeader getRecordRouteHeader()
   {  //Header h=getHeader(SipHeaders.Record_Route);
      //if (h==null) return null; else return new RecordRouteHeader(h);
      MultipleHeader mh=getRecordRoutes();
      if (mh==null) return null; return new RecordRouteHeader(mh.getTop());
   } 
   /** Gets the whole RecordRoute headers */
   public MultipleHeader getRecordRoutes()
   {  Vector v=getHeaders(SipHeaders.Record_Route);
      if (v.size()>0) return new MultipleHeader(v);
      else return null;
   }
   /** Removes the top RecordRouteHeader */
   public void removeRecordRouteHeader() 
   {  //removeHeader(SipHeaders.Record_Route);
      MultipleHeader mh=getRecordRoutes();
      mh.removeTop();
      setRecordRoutes(mh);
   }  
   /** Removes all RecordRouteHeader from Message (if any exists) */
   public void removeRecordRoutes() 
   {  removeAllHeaders(SipHeaders.Record_Route);
   }
   /** Sets the whole RecordRoute headers */
   public void setRecordRoutes(MultipleHeader routes) 
   {  if (hasRecordRouteHeader()) removeRecordRoutes();
      addRecordRoutes(routes);
   }


   /** Whether Message has CSeqHeader */
   public boolean hasCSeqHeader()
   {  return hasHeader(SipHeaders.CSeq);
   }  
   /** Gets CSeqHeader of Message */
   public CSeqHeader getCSeqHeader()
   {  Header h=getHeader(SipHeaders.CSeq);
      if (h==null) return null;
      else return new CSeqHeader(h);
   } 
   /** Sets CSeqHeader of Message */
   public void setCSeqHeader(CSeqHeader csh) 
   {  setHeader(csh);
   } 
   /** Removes CSeqHeader from Message */
   public void removeCSeqHeader() 
   {  removeHeader(SipHeaders.CSeq);
   }
   
      
   /** Whether has CallIdHeader */
   public boolean hasCallIdHeader()
   {  return hasHeader(SipHeaders.Call_ID);
   }
   /** Sets CallIdHeader of Message */
   public void setCallIdHeader(CallIdHeader cih) 
   {  setHeader(cih);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?