/**
  * Creates a SIP request message within a dialog, with a new branch via-parameter.
  *
  * @param dialog the Dialog used to compose the various Message headers
  * @param method the request method
  * @param body the message body
  */
 public static Message createRequest(Dialog dialog, String method, String body) {
   NameAddress to = dialog.getRemoteName();
   NameAddress from = dialog.getLocalName();
   NameAddress target = dialog.getRemoteContact();
   if (target == null) target = to;
   SipURL request_uri = target.getAddress();
   if (request_uri == null) request_uri = dialog.getRemoteName().getAddress();
   SipProvider sip_provider = dialog.getSipProvider();
   String via_addr = sip_provider.getViaAddress();
   int host_port = sip_provider.getPort();
   boolean rport = sip_provider.isRportSet();
   String proto;
   if (target.getAddress().hasTransport()) proto = target.getAddress().getTransport();
   else proto = sip_provider.getDefaultTransport();
   NameAddress contact = dialog.getLocalContact();
   if (contact == null) contact = from;
   // increment the CSeq, if method is not ACK nor CANCEL
   if (!SipMethods.isAck(method) && !SipMethods.isCancel(method)) dialog.incLocalCSeq();
   String call_id = dialog.getCallID();
   long cseq = dialog.getLocalCSeq();
   String local_tag = dialog.getLocalTag();
   String remote_tag = dialog.getRemoteTag();
   // String branch=SipStack.pickBranch();
   Message req =
       createRequest(
           method,
           request_uri,
           to,
           from,
           contact,
           proto,
           via_addr,
           host_port,
           rport,
           call_id,
           cseq,
           local_tag,
           remote_tag,
           null,
           body,
           null,
           null); // modified by mandrajg
   Vector<NameAddress> route = dialog.getRoute();
   if (route != null && route.size() > 0) {
     Vector<String> route_s = new Vector<String>(route.size());
     for (Enumeration<NameAddress> e = route.elements(); e.hasMoreElements(); ) {
       NameAddress elem = e.nextElement();
       route_s.add(elem.toString());
     }
     req.addRoutes(new MultipleHeader(SipHeaders.Route, route_s));
   }
   req.rfc2543RouteAdapt();
   return req;
 }
 /**
  * Creates a new REGISTER request.
  *
  * <p>If contact is null, set contact as star * (register all)
  */
 public static Message createRegisterRequest(
     SipProvider sip_provider,
     NameAddress to,
     NameAddress from,
     NameAddress contact,
     String qvalue,
     String icsi) { // modified by mandrajg
   SipURL to_url = to.getAddress();
   SipURL registrar = new SipURL(to_url.getHost(), to_url.getPort());
   String via_addr = sip_provider.getViaAddress();
   int host_port = sip_provider.getPort();
   boolean rport = sip_provider.isRportSet();
   String proto;
   if (to_url.hasTransport()) proto = to_url.getTransport();
   else proto = sip_provider.getDefaultTransport();
   String call_id = sip_provider.pickCallId();
   int cseq = SipProvider.pickInitialCSeq();
   String local_tag = SipProvider.pickTag();
   // String branch=SipStack.pickBranch();
   Message req =
       createRequest(
           SipMethods.REGISTER,
           registrar,
           to,
           from,
           contact,
           proto,
           via_addr,
           host_port,
           rport,
           call_id,
           cseq,
           local_tag,
           null,
           null,
           null,
           qvalue,
           icsi); // modified by mandrajg
   // if no contact, deregister all
   if (contact == null) {
     ContactHeader star = new ContactHeader(); // contact is *
     req.setContactHeader(star);
     req.setExpiresHeader(new ExpiresHeader(String.valueOf(SipStack.default_expires)));
   }
   return req;
 }
  /**
   * Creates a SIP request message. Where
   *
   * <UL>
   *   <LI>via address and port are taken from SipProvider
   *   <LI>transport protocol is taken from request-uri (if transport parameter is present) or the
   *       default transport for the SipProvider is used.
   * </UL>
   *
   * @param sip_provider the SipProvider used to fill the Via field
   * @see
   *     #createRequest(String,SipURL,NameAddress,NameAddress,NameAddress,String,String,int,String,long,String,String,String,String)
   */
  public static Message createRequest(
      SipProvider sip_provider,
      String method,
      SipURL request_uri,
      NameAddress to,
      NameAddress from,
      NameAddress contact,
      String call_id,
      long cseq,
      String local_tag,
      String remote_tag,
      String branch,
      String body,
      String icsi) { // modified by mandrajg
    String via_addr = sip_provider.getViaAddress();
    int host_port = sip_provider.getPort();
    boolean rport = sip_provider.isRportSet();
    String proto;
    if (request_uri.hasTransport()) proto = request_uri.getTransport();
    else proto = sip_provider.getDefaultTransport();

    return createRequest(
        method,
        request_uri,
        to,
        from,
        contact,
        proto,
        via_addr,
        host_port,
        rport,
        call_id,
        cseq,
        local_tag,
        remote_tag,
        branch,
        body,
        null,
        icsi); // modified by mandrajg
  }
 /** Creates an ACK request for a non-2xx response */
 public static Message createNon2xxAckRequest(
     SipProvider sip_provider, Message method, Message resp) {
   SipURL request_uri = method.getRequestLine().getAddress();
   FromHeader from = method.getFromHeader();
   ToHeader to = resp.getToHeader();
   String via_addr = sip_provider.getViaAddress();
   int host_port = sip_provider.getPort();
   boolean rport = sip_provider.isRportSet();
   String proto;
   if (request_uri.hasTransport()) proto = request_uri.getTransport();
   else proto = sip_provider.getDefaultTransport();
   String branch = method.getViaHeader().getBranch();
   NameAddress contact = null;
   Message ack =
       createRequest(
           SipMethods.ACK,
           request_uri,
           to.getNameAddress(),
           from.getNameAddress(),
           contact,
           proto,
           via_addr,
           host_port,
           rport,
           method.getCallIdHeader().getCallId(),
           method.getCSeqHeader().getSequenceNumber(),
           from.getParameter("tag"),
           to.getParameter("tag"),
           branch,
           null,
           null,
           null); // modified by mandrajg
   ack.removeExpiresHeader();
   if (method.hasRouteHeader()) ack.setRoutes(method.getRoutes());
   return ack;
 }