Revision: 92
Author:   [email protected]
Date:     Tue Feb 19 05:56:33 2013
Log:      Code auto-formatted
http://code.google.com/p/red5phone/source/detail?r=92

Modified:
 /branches/red5sip/src/java/org/red5/sip/app/SIPRegisterAgent.java

=======================================
--- /branches/red5sip/src/java/org/red5/sip/app/SIPRegisterAgent.java Sun Feb 17 19:49:41 2013 +++ /branches/red5sip/src/java/org/red5/sip/app/SIPRegisterAgent.java Tue Feb 19 05:56:33 2013
@@ -1,6 +1,5 @@
 package org.red5.sip.app;

-
 import java.util.Vector;

 import local.net.KeepAliveSip;
@@ -28,411 +27,450 @@
 import org.zoolu.sip.transaction.TransactionClient;
 import org.zoolu.sip.transaction.TransactionClientListener;

+/**
+ * Register User Agent. It registers (one time or periodically) a contact
+ * address with a registrar server.
+ */
+public class SIPRegisterAgent implements Runnable, TransactionClientListener { + protected static Logger log = LoggerFactory.getLogger(SIPRegisterAgent.class);
+       /** The CallerID and CSeq that should be used during REGISTER method */
+       private CallIdHeader registerCallID;
+       private int registerCSeq;

-/** Register User Agent.
- * It registers (one time or periodically) a contact address with a registrar server.
-  */
-public class SIPRegisterAgent implements Runnable, TransactionClientListener
-{
- protected static Logger log = LoggerFactory.getLogger(SIPRegisterAgent.class);
-   /** The CallerID and CSeq that should be used during REGISTER method */
-       private CallIdHeader    registerCallID;
-       private int                             registerCSeq;
+       /** Max number of registration attempts. */
+       static final int MAX_ATTEMPTS = 3;

-   /** Max number of registration attempts. */
-   static final int MAX_ATTEMPTS=3;
+       /** RegisterAgent listener */
+       SIPRegisterAgentListener listener;

-   /** RegisterAgent listener */
-   SIPRegisterAgentListener listener;
+       /** SipProvider */
+       SipProvider sip_provider;

-   /** SipProvider */
-   SipProvider sip_provider;
+ /** User's URI with the fully qualified domain name of the registrar server. */
+       NameAddress target;

- /** User's URI with the fully qualified domain name of the registrar server. */
-   NameAddress target;
+       /** User name. */
+       String username;

-   /** User name. */
-   String username;
+       /** User name. */
+       String realm;

-   /** User name. */
-   String realm;
+       /** User's passwd. */
+       String passwd;

-   /** User's passwd. */
-   String passwd;
+       /** Nonce for the next authentication. */
+       String next_nonce;

-   /** Nonce for the next authentication. */
-   String next_nonce;
+       /** Qop for the next authentication. */
+       String qop;

-   /** Qop for the next authentication. */
-   String qop;
+       /** User's contact address. */
+       NameAddress contact;

-   /** User's contact address. */
-   NameAddress contact;
+       /** Expiration time. */
+       int expire_time;

-   /** Expiration time. */
-   int expire_time;
+       /** Renew time. */
+       int renew_time;
+       // change by lior
+       int orig_renew_time;

-   /** Renew time. */
-   int renew_time;
-   //change by lior
-   int orig_renew_time;
+       int minRenewTime = 20;
+       int regFailRetryTime = 15;

-   int minRenewTime=20;
-   int regFailRetryTime=15;
+       /** Whether keep on registering. */
+       boolean loop;
+       // changed by Lior
+       boolean lastRegFailed = false;
+       boolean regInprocess = false;

-   /** Whether keep on registering. */
-   boolean loop;
-   //changed by Lior
-   boolean lastRegFailed=false;
-   boolean regInprocess=false;
+       /** Whether the thread is running. */
+       boolean is_running;

-   /** Whether the thread is running. */
-   boolean is_running;
+       /** Number of registration attempts. */
+       int attempts;

-   /** Number of registration attempts. */
-   int attempts;
+       /** KeepAliveSip daemon. */
+       KeepAliveSip keep_alive;

-   /** KeepAliveSip daemon. */
-   KeepAliveSip keep_alive;
+       /** Creates a new RegisterAgent. */
+       public SIPRegisterAgent(SipProvider sip_provider, String target_url,
+                       String contact_url, SIPRegisterAgentListener listener) {
+               init(sip_provider, target_url, contact_url, listener);
+       }

+       /**
+        * Creates a new RegisterAgent with authentication credentials (i.e.
+        * username, realm, and passwd).
+        */
+       public SIPRegisterAgent(SipProvider sip_provider, String target_url,
+                       String contact_url, String username, String realm, 
String passwd,
+                       SIPRegisterAgentListener listener) {
+               init(sip_provider, target_url, contact_url, listener);
+               // authentication
+               this.username = username;
+               this.realm = realm;
+               this.passwd = passwd;
+       }

-   /** Creates a new RegisterAgent. */
- public SIPRegisterAgent(SipProvider sip_provider, String target_url, String contact_url, SIPRegisterAgentListener listener)
-   {  init(sip_provider,target_url,contact_url,listener);
-   }
+       /** Inits the RegisterAgent. */
+       private void init(SipProvider sip_provider, String target_url,
+                       String contact_url, SIPRegisterAgentListener listener) {
+               this.listener = listener;
+               this.sip_provider = sip_provider;
+               this.target = new NameAddress(target_url);
+               this.contact = new NameAddress(contact_url);
+               // this.expire_time=SipStack.default_expires;
+               this.expire_time = 600;
+               // changed by Lior
+               this.renew_time = 600;
+               this.orig_renew_time = this.renew_time;
+               this.is_running = false;
+               this.keep_alive = null;
+               // authentication
+               this.username = null;
+               this.realm = null;
+               this.passwd = null;
+               this.next_nonce = null;
+               this.qop = null;
+               this.attempts = 0;
+               this.minRenewTime = 20;
+               this.regFailRetryTime = 5;

+               this.registerCallID = null;
+               this.registerCSeq = 0;

- /** Creates a new RegisterAgent with authentication credentials (i.e. username, realm, and passwd). */ - public SIPRegisterAgent(SipProvider sip_provider, String target_url, String contact_url, String username, String realm, String passwd, SIPRegisterAgentListener listener)
-   {  init(sip_provider,target_url,contact_url,listener);
-      // authentication
-      this.username=username;
-      this.realm=realm;
-      this.passwd=passwd;
-   }
+       }

-   /** Inits the RegisterAgent. */
- private void init(SipProvider sip_provider, String target_url, String contact_url, SIPRegisterAgentListener listener)
-   {  this.listener=listener;
-      this.sip_provider=sip_provider;
-      this.target=new NameAddress(target_url);
-      this.contact=new NameAddress(contact_url);
-      //this.expire_time=SipStack.default_expires;
-      this.expire_time=600;
-      // changed by Lior
-      this.renew_time=600;
-      this.orig_renew_time=this.renew_time;
-      this.is_running=false;
-      this.keep_alive=null;
-      // authentication
-      this.username=null;
-      this.realm=null;
-      this.passwd=null;
-      this.next_nonce=null;
-      this.qop=null;
-      this.attempts=0;
-      this.minRenewTime=20;
-      this.regFailRetryTime=5;
+       /** Whether it is periodically registering. */
+       public boolean isRegistering() {
+               return is_running;
+       }

-      this.registerCallID = null;
-      this.registerCSeq = 0;
+       /** Registers with the registrar server. */
+       public void register() {
+               register(expire_time);
+       }

+       /** Registers with the registrar server for <i>expire_time</i> seconds. 
*/
+       public void register(int expire_time) {
+               attempts = 0;
+               lastRegFailed = false;
+               regInprocess = true;
+               if (expire_time > 0) {
+                       this.expire_time = expire_time;
+               }
+               Message req = MessageFactory.createRegisterRequest(sip_provider,
+                               target, target, contact);

-   }
+               /*
+                * MY_FIX: registerCallID contains the CallerID randomly 
generated in
+                * the first REGISTER method. It will be reused for all 
successive
+                * REGISTER invocations
+                */
+               if (this.registerCallID == null) {
+                       this.registerCallID = req.getCallIdHeader();
+               } else {
+                       req.setCallIdHeader(this.registerCallID);
+               }

+               /*
+                * MY_FIX: the registerCSeq must be unique for a given CallerID
+                */
+               this.registerCSeq++;
+ req.setCSeqHeader(new CSeqHeader(this.registerCSeq, SipMethods.REGISTER));

-   /** Whether it is periodically registering. */
-   public boolean isRegistering()
-   {  return is_running;
-   }
+               req.setExpiresHeader(new 
ExpiresHeader(String.valueOf(expire_time)));
+               if (next_nonce != null) {
+                       AuthorizationHeader ah = new 
AuthorizationHeader("Digest");
+                       ah.addUsernameParam(username);
+                       ah.addRealmParam(realm);
+                       ah.addNonceParam(next_nonce);
+                       
ah.addUriParam(req.getRequestLine().getAddress().toString());
+                       ah.addQopParam(qop);
+                       String response = (new 
DigestAuthentication(SipMethods.REGISTER,
+                                       ah, null, passwd)).getResponse();
+                       ah.addResponseParam(response);
+                       req.setAuthorizationHeader(ah);
+               }
+               if (expire_time > 0) {
+                       printLog("Registering contact " + contact + " (it expires in 
"
+                                       + expire_time + " secs)");
+               } else {
+                       printLog("Unregistering contact " + contact);
+               }
+               TransactionClient t = new TransactionClient(sip_provider, req, 
this);
+               t.request();
+       }

+       /** Unregister with the registrar server */
+       public void unregister() {
+               register(0);
+       }

-   /** Registers with the registrar server. */
-   public void register()
-   {  register(expire_time);
-   }
-
-
- /** Registers with the registrar server for <i>expire_time</i> seconds. */
-   public void register(int expire_time)
-   {  attempts=0;
-      lastRegFailed=false;
-      regInprocess=true;
-      if (expire_time>0) this.expire_time=expire_time;
- Message req=MessageFactory.createRegisterRequest(sip_provider,target,target,contact);
-
-      /*
- * MY_FIX: registerCallID contains the CallerID randomly generated in the first REGISTER method.
-                * It will be reused for all successive REGISTER invocations
-               */
-                 if (this.registerCallID == null)
-                         this.registerCallID = req.getCallIdHeader();
-                 else
-                         req.setCallIdHeader(this.registerCallID);
-
-               /*
-                * MY_FIX: the registerCSeq must be unique for a given CallerID
-                */
-               this.registerCSeq++;
- req.setCSeqHeader(new CSeqHeader(this.registerCSeq, SipMethods.REGISTER));
-
-
-      req.setExpiresHeader(new ExpiresHeader(String.valueOf(expire_time)));
-      if (next_nonce!=null)
-      {  AuthorizationHeader ah=new AuthorizationHeader("Digest");
-         ah.addUsernameParam(username);
-         ah.addRealmParam(realm);
-         ah.addNonceParam(next_nonce);
-         ah.addUriParam(req.getRequestLine().getAddress().toString());
-         ah.addQopParam(qop);
- String response=(new DigestAuthentication(SipMethods.REGISTER,ah,null,passwd)).getResponse();
-         ah.addResponseParam(response);
-         req.setAuthorizationHeader(ah);
-      }
- if (expire_time>0) printLog("Registering contact "+contact+" (it expires in "+expire_time+" secs)");
-      else printLog("Unregistering contact "+contact);
-      TransactionClient t=new TransactionClient(sip_provider,req,this);
-      t.request();
-   }
-
-
-   /** Unregister with the registrar server */
-   public void unregister()
-   {  register(0);
-
-   }
-
-
-   /** Unregister all contacts with the registrar server */
-   public void unregisterall()
-   {  attempts=0;
- Message req=MessageFactory.createRegisterRequest(sip_provider,target,target,null);
-      //ContactHeader contact_star=new ContactHeader(); // contact is *
-      //req.setContactHeader(contact_star);
-      req.setExpiresHeader(new ExpiresHeader(String.valueOf(0)));
-      printLog("Unregistering all contacts");
-      TransactionClient t=new TransactionClient(sip_provider,req,this);
-      t.request();
-   }
-
-
-   /** Periodically registers with the registrar server.
-     * @param expire_time expiration time in seconds
-     * @param renew_time renew time in seconds */
-   public void loopRegister(int expire_time, int renew_time)
-   {  this.expire_time=expire_time;
-      this.renew_time=renew_time;
-      loop=true;
- if (!is_running) (new Thread(this,this.getClass().getName())).start();
-   }
-
-
-   /** Periodically registers with the registrar server.
-     * @param expire_time expiration time in seconds
-     * @param renew_time renew time in seconds
- * @param keepalive_time keep-alive packet rate (inter-arrival time) in milliseconds */ - public void loopRegister(int expire_time, int renew_time, long keepalive_time)
-   {  loopRegister(expire_time,renew_time);
-      // keep-alive
-      if (keepalive_time>0)
-      {  SipURL target_url=target.getAddress();
-         String target_host=target_url.getHost();
-         int targe_port=target_url.getPort();
-         if (targe_port<0) targe_port=SipStack.default_port;
- keep_alive = new KeepAliveSip(sip_provider,new SocketAddress(target_host,targe_port),null,keepalive_time);
-      }
-   }
-
-
-   /** Halts the periodic registration. */
-   public void halt()
-   {  if (is_running) loop=false;
-      if (keep_alive!=null) keep_alive.halt();
-   }
-
-
-   // ***************************** run() *****************************
-
-   /** Run method */
-   public void run()
-   {
-      is_running=true;
-      try
-      {  while (loop)
-         {  register();
-           //changed by Lior
-           long waitCnt=0;
-                                   while (regInprocess)
-                                   {
-                                       Thread.sleep(1000);
-                                       waitCnt+=1000;
-                                   }
+       /** Unregister all contacts with the registrar server */
+       public void unregisterall() {
+               attempts = 0;
+               Message req = MessageFactory.createRegisterRequest(sip_provider,
+                               target, target, null);
+               // ContactHeader contact_star=new ContactHeader(); // contact 
is *
+               // req.setContactHeader(contact_star);
+               req.setExpiresHeader(new ExpiresHeader(String.valueOf(0)));
+               printLog("Unregistering all contacts");
+               TransactionClient t = new TransactionClient(sip_provider, req, 
this);
+               t.request();
+       }

-                                   if (lastRegFailed)
-                                   {
-                                       printLog("Failed Registration stop 
try.");
-                                               
//Thread.sleep(regFailRetryTime*1000);
-                                               halt();
-                                   }
-                                   else
-                      Thread.sleep(renew_time*1000-waitCnt);
-         }
-      }
-      catch (Exception e) {  printException(e);  }
-      is_running=false;
-   }
+       /**
+        * Periodically registers with the registrar server.
+        *
+        * @param expire_time
+        *            expiration time in seconds
+        * @param renew_time
+        *            renew time in seconds
+        */
+       public void loopRegister(int expire_time, int renew_time) {
+               this.expire_time = expire_time;
+               this.renew_time = renew_time;
+               loop = true;
+               if (!is_running)
+                       (new Thread(this, this.getClass().getName())).start();
+       }

+       /**
+        * Periodically registers with the registrar server.
+        *
+        * @param expire_time
+        *            expiration time in seconds
+        * @param renew_time
+        *            renew time in seconds
+        * @param keepalive_time
+        *            keep-alive packet rate (inter-arrival time) in 
milliseconds
+        */
+       public void loopRegister(int expire_time, int renew_time,
+                       long keepalive_time) {
+               loopRegister(expire_time, renew_time);
+               // keep-alive
+               if (keepalive_time > 0) {
+                       SipURL target_url = target.getAddress();
+                       String target_host = target_url.getHost();
+                       int targe_port = target_url.getPort();
+                       if (targe_port < 0)
+                               targe_port = SipStack.default_port;
+                       keep_alive = new KeepAliveSip(sip_provider, new 
SocketAddress(
+                                       target_host, targe_port), null, 
keepalive_time);
+               }
+       }

-   // **************** Transaction callback functions *****************
+       /** Halts the periodic registration. */
+       public void halt() {
+               if (is_running)
+                       loop = false;
+               if (keep_alive != null)
+                       keep_alive.halt();
+       }

- /** Callback function called when client sends back a failure response. */
+       // ***************************** run() *****************************

- /** Callback function called when client sends back a provisional response. */ - public void onTransProvisionalResponse(TransactionClient transaction, Message resp)
-   {  // do nothing..
-   }
+       /** Run method */
+       public void run() {
+               is_running = true;
+               try {
+                       while (loop) {
+                               register();
+                               // changed by Lior
+                               long waitCnt = 0;
+                               while (regInprocess) {
+                                       Thread.sleep(1000);
+                                       waitCnt += 1000;
+                               }

- /** Callback function called when client sends back a success response. */ - public void onTransSuccessResponse(TransactionClient transaction, Message resp)
-   {  if (transaction.getTransactionMethod().equals(SipMethods.REGISTER))
-      {  if (resp.hasAuthenticationInfoHeader())
- { next_nonce=resp.getAuthenticationInfoHeader().getNextnonceParam();
-         }
-         StatusLine status=resp.getStatusLine();
-         String result=status.getCode()+" "+status.getReason();
+                               if (lastRegFailed) {
+                                       printLog("Failed Registration stop 
try.");
+                                       // Thread.sleep(regFailRetryTime*1000);
+                                       halt();
+                               } else {
+                                       Thread.sleep(renew_time * 1000 - 
waitCnt);
+                               }
+                       }
+               } catch (Exception e) {
+                       printException(e);
+               }
+               is_running = false;
+       }

-         // update the renew_time
-         //changed by Lior
-         int expires=0;
-         //int newRenew=0;
-         if (resp.hasExpiresHeader())
-           {  expires=resp.getExpiresHeader().getDeltaSeconds();
-         //{
-        //      newRenew=resp.getExpiresHeader().getDeltaSeconds();
-         }
-         else if (resp.hasContactHeader())
-         // look for the max expires - should be the latest
-         {  Vector<Header> contacts=resp.getContacts().getHeaders();
-            for (int i=0; i<contacts.size(); i++)
- { int exp_i=(new ContactHeader((Header)contacts.elementAt(i))).getExpires(); - // if (exp_i>0 && (expires==0 || exp_i<expires)) expires=exp_i;
-            //{
- // newRenew=(new ContactHeader((Header)contacts.elementAt(i))).getExpires();
-             if (exp_i/2>expires)
-                  expires=exp_i/2;
-           }
-         }
-         //if (expires>0 && expires<renew_time) renew_time=expires;
+       // **************** Transaction callback functions *****************

-         //printLog("Registration success: ");
- //if (listener!=null) listener.onUaRegistrationSuccess(this,target,contact,result);
-   //   }
-   //}
-//if (newRenew>0 && newRenew<renew_time)
-        if (expires>0 && expires<renew_time)
-        {
-                renew_time=expires;
-                if (renew_time<minRenewTime)
-                {
- printLog("Attempt to set renew time below min renew. Attempted="+renew_time+" min="+minRenewTime+"\r\nResponse="+resp.toString());
-                        renew_time=minRenewTime;
-                }
-         }
-         else if (expires>orig_renew_time)
-         {
- printLog("Attempt to set renew time above original renew. Attempted="+expires+" origrenew="+orig_renew_time+"\r\nResponse="+resp.toString());
-         }
+       /** Callback function called when client sends back a failure response. 
*/

-         printLog("Registration success: ");
-         regInprocess=false;
- if (listener!=null) listener.onUaRegistrationSuccess(this,target,contact,result); + /** Callback function called when client sends back a provisional response. */
+       public void onTransProvisionalResponse(TransactionClient transaction,
+                       Message resp) { // do nothing..
+       }

+       /** Callback function called when client sends back a success response. 
*/
+       public void onTransSuccessResponse(TransactionClient transaction,
+                       Message resp) {
+               if 
(transaction.getTransactionMethod().equals(SipMethods.REGISTER)) {
+                       if (resp.hasAuthenticationInfoHeader()) {
+                               next_nonce = resp.getAuthenticationInfoHeader()
+                                               .getNextnonceParam();
+                       }
+                       StatusLine status = resp.getStatusLine();
+                       String result = status.getCode() + " " + 
status.getReason();

-      }
-   }
- /** Callback function called when client sends back a failure response. */ - public void onTransFailureResponse(TransactionClient transaction, Message resp)
-   {
-      printLog("onTransFailureResponse start: ");
+                       // update the renew_time
+                       // changed by Lior
+                       int expires = 0;
+                       // int newRenew=0;
+                       if (resp.hasExpiresHeader()) {
+                               expires = 
resp.getExpiresHeader().getDeltaSeconds();
+                               // {
+                               // 
newRenew=resp.getExpiresHeader().getDeltaSeconds();
+                       } else if (resp.hasContactHeader())
+                       // look for the max expires - should be the latest
+                       {
+                               Vector<Header> contacts = 
resp.getContacts().getHeaders();
+                               for (int i = 0; i < contacts.size(); i++) {
+                                       int exp_i = (new ContactHeader(
+                                                       (Header) 
contacts.elementAt(i))).getExpires();
+                                       // if (exp_i>0 && (expires==0 || 
exp_i<expires))
+                                       // expires=exp_i;
+                                       // {
+                                       // newRenew=(new
+                                       // 
ContactHeader((Header)contacts.elementAt(i))).getExpires();
+                                       if (exp_i / 2 > expires)
+                                               expires = exp_i / 2;
+                               }
+                       }
+                       // if (expires>0 && expires<renew_time) 
renew_time=expires;

-         if (transaction.getTransactionMethod().equals(SipMethods.REGISTER))
-      {  StatusLine status=resp.getStatusLine();
-         int code=status.getCode();
- if ((code==401 && attempts<MAX_ATTEMPTS && resp.hasWwwAuthenticateHeader() && resp.getWwwAuthenticateHeader().getRealmParam().equalsIgnoreCase(realm)) - || (code==407 && attempts<MAX_ATTEMPTS && resp.hasProxyAuthenticateHeader() && resp.getProxyAuthenticateHeader().getRealmParam().equalsIgnoreCase(realm)))
+                       // printLog("Registration success: ");
+                       // if (listener!=null)
+                       // 
listener.onUaRegistrationSuccess(this,target,contact,result);
+                       // }
+                       // }
+                       // if (newRenew>0 && newRenew<renew_time)
+                       if (expires > 0 && expires < renew_time) {
+                               renew_time = expires;
+                               if (renew_time < minRenewTime) {
+                                       printLog("Attempt to set renew time below 
min renew. Attempted="
+                                                       + renew_time
+                                                       + " min="
+                                                       + minRenewTime
+                                                       + "\r\nResponse=" + 
resp.toString());
+                                       renew_time = minRenewTime;
+                               }
+                       } else if (expires > orig_renew_time) {
+                               printLog("Attempt to set renew time above original 
renew. Attempted="
+                                               + expires
+                                               + " origrenew="
+                                               + orig_renew_time
+                                               + "\r\nResponse=" + 
resp.toString());
+                       }

-         {
-               printLog("onTransFailureResponse 401 or 407: ");
+                       printLog("Registration success: ");
+                       regInprocess = false;
+                       if (listener != null)
+                               listener.onUaRegistrationSuccess(this, target, 
contact, result);

-                       attempts++;
-            Message req=transaction.getRequestMessage();
-            req.setCSeqHeader(req.getCSeqHeader().incSequenceNumber());
-            // * MY_FIX: registerCSeq counter must incremented
-            this.registerCSeq++;
+               }
+       }

+       /** Callback function called when client sends back a failure response. 
*/
+       public void onTransFailureResponse(TransactionClient transaction,
+                       Message resp) {
+               printLog("onTransFailureResponse start: ");

-               WwwAuthenticateHeader wah;
-               if (code==401) wah=resp.getWwwAuthenticateHeader();
-               else wah=resp.getProxyAuthenticateHeader();
+               if 
(transaction.getTransactionMethod().equals(SipMethods.REGISTER)) {
+                       StatusLine status = resp.getStatusLine();
+                       int code = status.getCode();
+                       if ((code == 401 && attempts < MAX_ATTEMPTS
+                                       && resp.hasWwwAuthenticateHeader() && 
resp
+                                       
.getWwwAuthenticateHeader().getRealmParam()
+                                       .equalsIgnoreCase(realm))
+                                       || (code == 407 && attempts < 
MAX_ATTEMPTS
+                                                       && 
resp.hasProxyAuthenticateHeader() && resp
+                                                       
.getProxyAuthenticateHeader().getRealmParam()
+                                                       
.equalsIgnoreCase(realm)))

-            String qop_options=wah.getQopOptionsParam();
-               //qop=(qop_options!=null)? "auth" : null;
+                       {
+                               printLog("onTransFailureResponse 401 or 407: ");

- // select a new branch - rfc3261 says should be new on each request
-            ViaHeader via=req.getViaHeader();
-            req.removeViaHeader();
-            via.setBranch(SipProvider.pickBranch());
-            req.addViaHeader(via);
-            qop=(qop_options!=null)? "auth" : null;
+                               attempts++;
+                               Message req = transaction.getRequestMessage();
+                               
req.setCSeqHeader(req.getCSeqHeader().incSequenceNumber());
+                               // * MY_FIX: registerCSeq counter must 
incremented
+                               this.registerCSeq++;

- DigestAuthentication digest=new DigestAuthentication(SipMethods.REGISTER,req.getRequestLine().getAddress().toString(),wah,qop,null,username,passwd);
-                       AuthorizationHeader ah;
-                       if (code==401) ah=digest.getAuthorizationHeader();
-                       else ah=digest.getProxyAuthorizationHeader();
+                               WwwAuthenticateHeader wah;
+                               if (code == 401)
+                                       wah = resp.getWwwAuthenticateHeader();
+                               else
+                                       wah = resp.getProxyAuthenticateHeader();

-            req.setAuthorizationHeader(ah);
- TransactionClient t=new TransactionClient(sip_provider,req,this);
-            t.request();
+                               String qop_options = wah.getQopOptionsParam();
+                               // qop=(qop_options!=null)? "auth" : null;

-         }
-         else
-         {  String result=code+" "+status.getReason();
-            lastRegFailed=true;
-            regInprocess=false;
-            if (listener==null)
-            printLog("Registration failure: "+result);
-            else
-             printLog("Registration failure: "+result);
- if (listener!=null) listener.onUaRegistrationFailure(this,target,contact,result);
-         }
-      }
-   }
+                               // select a new branch - rfc3261 says should be 
new on each
+                               // request
+                               ViaHeader via = req.getViaHeader();
+                               req.removeViaHeader();
+                               via.setBranch(SipProvider.pickBranch());
+                               req.addViaHeader(via);
+                               qop = (qop_options != null) ? "auth" : null;

-   /** Callback function called when client expires timeout. */
-   public void onTransTimeout(TransactionClient transaction)
-   {  if (transaction.getTransactionMethod().equals(SipMethods.REGISTER))
-      {
-         if (listener==null)
-         printLog("Registration failure: No response from server.");
-         else
-                printLog("Registration failure: No response from server.");
-                lastRegFailed=true;
-        regInprocess=false;
- if (listener!=null) listener.onUaRegistrationFailure(this,target,contact,"Timeout");
-      }
-   }
+                               DigestAuthentication digest = new 
DigestAuthentication(
+                                               SipMethods.REGISTER, 
req.getRequestLine().getAddress()
+                                                               .toString(), 
wah, qop, null, username, passwd);
+                               AuthorizationHeader ah;
+                               if (code == 401)
+                                       ah = digest.getAuthorizationHeader();
+                               else
+                                       ah = 
digest.getProxyAuthorizationHeader();

+                               req.setAuthorizationHeader(ah);
+                               TransactionClient t = new 
TransactionClient(sip_provider, req,
+                                               this);
+                               t.request();

-   // ****************************** Logs *****************************
+                       } else {
+                               String result = code + " " + status.getReason();
+                               lastRegFailed = true;
+                               regInprocess = false;
+                               if (listener == null)
+                                       printLog("Registration failure: " + 
result);
+                               else
+                                       printLog("Registration failure: " + 
result);
+                               if (listener != null)
+                                       listener.onUaRegistrationFailure(this, 
target, contact,
+                                                       result);
+                       }
+               }
+       }

+       /** Callback function called when client expires timeout. */
+       public void onTransTimeout(TransactionClient transaction) {
+               if 
(transaction.getTransactionMethod().equals(SipMethods.REGISTER)) {
+                       if (listener == null) {
+                               printLog("Registration failure: No response from 
server.");
+                       } else {
+                               printLog("Registration failure: No response from 
server.");
+                       }
+                       lastRegFailed = true;
+                       regInprocess = false;
+                       if (listener != null) {
+                               listener.onUaRegistrationFailure(this, target, contact, 
"Timeout");
+                       }
+               }
+       }

+       // ****************************** Logs *****************************
        void printLog(String str) {
-               log.debug("RegisterAgent: "+str);
+               log.debug(str);
        }

-
-       void printException(Exception e)   {
-               log.error("RegisterAgent Exception: ", e);
+       void printException(Exception e) {
+               log.error("Exception: ", e);
        }
-
 }

Reply via email to