realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileServerCore.cpp
changeset 33 b8a7e07b2677
parent 22 f1578314b8da
child 37 0295359a7673
--- a/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileServerCore.cpp	Mon Jun 28 19:10:29 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileServerCore.cpp	Fri Jul 09 13:15:39 2010 +0300
@@ -242,6 +242,15 @@
 												  TUint32 aContextId)
     {
     CSIPProfileCacheItem* item = ProfileCacheItem(aProfile.Id());
+    
+    if(aContextId == 0 && item)
+        {
+        if(item->IsApnSwitchEnabled())
+            {
+            UsePrimaryApn(aProfile.IapId());
+            }
+        }
+    
     TRAPD(err, SIPProfileStatusEventL(aProfile.Id(), aContextId));
 
     if (err != KErrNone)
@@ -336,7 +345,20 @@
                         item->IsVpnInUse()))
                 ConfirmSystemstateMonitor(CSipSystemStateMonitor::EVpnState);                
             }       
-        }		
+        
+        if(FeatureManager::FeatureSupported( KFeatureIdFfSipApnSwitching))
+            {
+            if(item && item->IsApnSwitchEnabled() && aContextId)
+                {
+                CSIPConcreteProfile::TStatus status;
+                iPluginDirector->State( status, item->Profile() );
+                if(status == CSIPConcreteProfile::EUnregistered)
+                    {
+                    UseBackupApn(item->Profile().IapId(), EFalse);
+                    }
+                }
+            }
+        }
     CheckServerStatus();
     }
 
@@ -475,11 +497,11 @@
                 TBool waitForDeregistration = EFalse;
                 for (TInt i = 0; i < iProfileCache.Count(); i++)
                     {
-                    iProfileCache[i]->OfflineInitiated(ETrue);
                     CSIPConcreteProfile::TStatus status;
                     iPluginDirector->State(status, iProfileCache[i]->UsedProfile());
                     if(status != CSIPConcreteProfile::EUnregistered)
-                        waitForDeregistration = ETrue;            
+                        waitForDeregistration = ETrue;   
+                    iProfileCache[i]->OfflineInitiated(ETrue);
                     }
                 if(!waitForDeregistration)
                     {
@@ -515,11 +537,11 @@
 	        TBool waitForDeregistration = EFalse;
 	        for (TInt i = 0; i < iProfileCache.Count(); i++)         
 	            {
-	            iProfileCache[i]->RfsInprogress(ETrue);
 	            CSIPConcreteProfile::TStatus status;
 	            iPluginDirector->State(status, iProfileCache[i]->UsedProfile());
 	            if (status != CSIPConcreteProfile::EUnregistered)
 	                waitForDeregistration = ETrue;
+	            iProfileCache[i]->RfsInprogress(ETrue);
 	            }      
 	        if(!waitForDeregistration)
 	            {
@@ -564,12 +586,11 @@
             TBool waitForDeregistration = EFalse;
             for (TInt i = 0; i < iProfileCache.Count(); i++)
                 {
-                iProfileCache[i]->VpnInUse( ETrue );
-                iProfileCache[i]->ShutdownInitiated();
                 CSIPConcreteProfile::TStatus status;
                 iPluginDirector->State(status, iProfileCache[i]->UsedProfile());
                 if (status != CSIPConcreteProfile::EUnregistered)
                     waitForDeregistration = ETrue;
+                iProfileCache[i]->VpnInUse( ETrue );
                 }
             if (!waitForDeregistration)
                 {
@@ -1646,26 +1667,33 @@
 	CSIPConcreteProfile::TStatus aStatus,
     TInt aError)
     {
-    TInt err(aError);
-    if (aStatus == CSIPConcreteProfile::EUnregistrationInProgress)
+    PROFILE_DEBUG3("CSIPProfileServerCore::HandleAsyncError, error", aError)
+    TBool isFatal(EFalse);
+    if(aError != KErrSIPApnSwitchNonFatalFailure)
         {
-        err = KErrNone;
-        }
+        TInt err(aError);
+        if (aStatus == CSIPConcreteProfile::EUnregistrationInProgress)
+            {
+            err = KErrNone;
+            }
 
-    if (HandleProfileError(aItem, err))
-    	{
-	    if (err == KErrTotalLossOfPrecision)
-	        {
-	        TRAP_IGNORE(SendUnregisteredStatusEventL(aItem))
-	        }
-	    else
-	        {
-	        SendErrorEvent(aItem, aStatus, aError);
-	        }
-    	}
+        if (HandleProfileError(aItem, err))
+            {
+            if (err == KErrTotalLossOfPrecision)
+                {
+                TRAP_IGNORE(SendUnregisteredStatusEventL(aItem))
+                }
+            else
+                {
+                SendErrorEvent(aItem, aStatus, aError);
+                isFatal = ETrue;
+                }
+            }
+        }
+    
     if(aItem.IsApnSwitchEnabled())
         {
-        UseBackupApn(aItem.Profile().IapId(), ETrue);
+        UseBackupApn(aItem.Profile().IapId(), isFatal);
         }
     }
 
@@ -2401,7 +2429,7 @@
     {
     PROFILE_DEBUG1("CSIPProfileServerCore::UseBackupApn")
     
-    if ( iApnManager->IsFailed( aIapId ) || aFatalFailure )
+    if ( !iApnManager->IsFailed( aIapId ) || aFatalFailure )
         {
         iApnManager->SetFailed( aIapId, ETrue, aFatalFailure );
         }