Revision: 201031 RCL_3
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 10:16:25 +0300
branchRCL_3
changeset 18 f54bfd820e04
parent 17 654ed625511d
child 19 b5e99d8877c7
Revision: 201031 Kit: 201033
group/bld.inf
realtimenetprots/sipfw/ProfileAgent/AlrMonitor/inc/sipalrmonitor.h
realtimenetprots/sipfw/ProfileAgent/AlrMonitor/inc/sipalrobserver.h
realtimenetprots/sipfw/ProfileAgent/AlrMonitor/inc/sipalrsnapmonitor.h
realtimenetprots/sipfw/ProfileAgent/AlrMonitor/src/sipalrmonitor.cpp
realtimenetprots/sipfw/ProfileAgent/AlrMonitor/src/sipalrsnapmonitor.cpp
realtimenetprots/sipfw/ProfileAgent/Client/Api/sipprofile.h
realtimenetprots/sipfw/ProfileAgent/Client/Src/sipmanagedprofile.cpp
realtimenetprots/sipfw/ProfileAgent/Group/sipprofileserver.mmp
realtimenetprots/sipfw/ProfileAgent/IETF_Agent/src/Sipietfprofilecontext.cpp
realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Src/Sipimsprofilecontext.cpp
realtimenetprots/sipfw/ProfileAgent/Profile/Src/sipconcreteprofile.cpp
realtimenetprots/sipfw/ProfileAgent/Server/Inc/SipProfileCacheItem.h
realtimenetprots/sipfw/ProfileAgent/Server/Inc/SipProfileServerCore.h
realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileCacheItem.cpp
realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileServerCore.cpp
realtimenetprots/sipfw/ProfileAgent/Server/Src/sipalrhandler.cpp
realtimenetprots/sipfw/ProfileAgent/Server/Src/sipalrmigrationcontroller.cpp
realtimenetprots/sipfw/ProfileAgent/Server/Src/sipalrmigrationcontroller.h
realtimenetprots/sipfw/SIP/Codec/src/CSIPAcceptEncodingHeader.cpp
realtimenetprots/sipfw/SIP/ConnectionMgr/src/CTransport.cpp
sipplugins/sippdevmgmtsipadapter/inc/smldmsipadapterconstants.h
sipplugins/sippdevmgmtsipadapter/src/nsmldmsipadapter.cpp
sipplugins/sippsipadapter/inc/CWPSIPItem.h
sipplugins/sippsipadapter/src/CWPSIPAdapter.cpp
sipplugins/sippsipadapter/src/CWPSIPItem.cpp
--- a/group/bld.inf	Thu Jul 15 19:02:22 2010 +0300
+++ b/group/bld.inf	Thu Aug 19 10:16:25 2010 +0300
@@ -20,7 +20,9 @@
 
 #include "../ipappprotocols_plat/group/bld.inf"
 #include "../rtp/group/bld.inf"
+#include "../realtimenetprots/rtp/group/bld.inf"
 #include "../realtimenetprots/sipfw/Group/bld.inf"
 #include "../sipplugins/group/bld.inf"
+#include "../sipproviderplugins/sipprovider/group/bld.inf"
 
 
--- a/realtimenetprots/sipfw/ProfileAgent/AlrMonitor/inc/sipalrmonitor.h	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/AlrMonitor/inc/sipalrmonitor.h	Thu Aug 19 10:16:25 2010 +0300
@@ -64,48 +64,48 @@
         * Starts to monitor IAP availability for the SNAP.
         * The observer will be informed asynchronouysly
         * when any IAP is available for the monitored SNAP. 
-        * @param aSnapId SNAP id
+        * @param aConfigData SNAP Data to identify the correct SNAP Monitor.
         * @param aObserver observer to be informed when an IAP becomes available
         */
-        void MonitorSnapL( TUint32 aSnapId, 
-                           MSipAlrObserver& aObserver );
+        void MonitorSnapL( TSipSNAPConfigurationData & aConfigData, 
+                           MSipAlrObserver& aObserver);
 
 
         /**
         * Refreshes the IAP availability for the SNAP.
         * Scans the available IAPs for the SNAP and informs all the observers 
         * if a better IAP than the current one is available.
-        * @param aSnapId SNAP id
+        * @param aConfigData SNAP Data to identify the correct SNAP Monitor.
         */
-        void RefreshIapAvailabilityL( TUint32 aSnapId );
+        void RefreshIapAvailabilityL( TSipSNAPConfigurationData & aConfigData );
     
         /**
         * Allows migration to a new IAP for the SNAP.
-        * @param aSnapId SNAP id
+        * @param aConfigData SNAP Data to identify the correct SNAP Monitor.
         * @return KErrNone on success, otherwise a system wide error code.
         */    
-        TInt AllowMigration( TUint32 aSnapId );    
+        TInt AllowMigration( TSipSNAPConfigurationData & aConfigData );    
 
         /**
         * Disallows migration to a new IAP for the SNAP.
-        * @param aSnapId SNAP id
+        * @param aConfigData SNAP Data to identify the correct SNAP Monitor.
         * @return KErrNone on success, otherwise a system wide error code.
         */    
-        TInt DisallowMigration( TUint32 aSnapId );
+        TInt DisallowMigration( TSipSNAPConfigurationData & aConfigData );
     
         /**
         * The migration has succeeded and the new IAP has been taken into use.
-        * @param aSnapId SNAP id
+        * @param aConfigData SNAP Data to identify the correct SNAP Monitor.
         * @return KErrNone on success, otherwise a system wide error code.
         */
-        TInt NewIapAccepted( TUint32 aSnapId );    
+        TInt NewIapAccepted( TSipSNAPConfigurationData & aConfigData );    
 
         /**
         * The migration has failed and the new IAP was not taken into use.
-        * @param aSnapId SNAP id
+        * @param aConfigData SNAP Data to identify the correct SNAP Monitor.
         * @return KErrNone on success, otherwise a system wide error code.
         */    
-        TInt NewIapRejected( TUint32 aSnapId );
+        TInt NewIapRejected( TSipSNAPConfigurationData & aConfigData );
 
         /**
         * Frees all the resources reserved for the observer.
@@ -122,8 +122,9 @@
 		
 	private: // New functions
 	
-	    CSipAlrSnapMonitor* FindSnapMonitor( TUint32 aSnapId );
-		
+	    CSipAlrSnapMonitor* FindSnapMonitor( TSipSNAPConfigurationData & aConfigData);
+	    
+	    	
 	private: // Data
 	
 	    // Used for monitoring SNAP availability 
--- a/realtimenetprots/sipfw/ProfileAgent/AlrMonitor/inc/sipalrobserver.h	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/AlrMonitor/inc/sipalrobserver.h	Thu Aug 19 10:16:25 2010 +0300
@@ -82,4 +82,22 @@
 
 	};
 
+// CLASS DECLARATION
+/**
+* This is the class that encapsulates all snap specific data.
+*/
+
+class TSipSNAPConfigurationData  
+    {
+public:
+    
+    TSipSNAPConfigurationData(TUint32 aSnapId , TUint32 aBearerId)
+        {
+        iSnapId = aSnapId;
+        iBearerId = aBearerId;
+        };
+    
+   TUint32 iSnapId;
+   TBool iBearerId;
+    };
 #endif // MSIPALROBSERVER_H
--- a/realtimenetprots/sipfw/ProfileAgent/AlrMonitor/inc/sipalrsnapmonitor.h	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/AlrMonitor/inc/sipalrsnapmonitor.h	Thu Aug 19 10:16:25 2010 +0300
@@ -34,6 +34,7 @@
 #include <e32base.h>
 #include <in_sock.h>
 #include <connpref.h>
+#include <extendedconnpref.h>
 
 #ifdef SYMBIAN_NON_SEAMLESS_NETWORK_BEARER_MOBILITY
 #include <comms-infras/es_mobility_apiext.h>
@@ -56,10 +57,10 @@
 	public: // Constructors and destructor
 	    
     	static CSipAlrSnapMonitor* NewLC( 
-            TUint32 aSnapId,
+    	    TSipSNAPConfigurationData aSnapData,
             MSipAlrObserver& aObserver,
             RSocketServ& aSocketServer,
-            CSipSystemStateMonitor& aSystemStateMonitor );
+            CSipSystemStateMonitor& aSystemStateMonitor);
             
     	~CSipAlrSnapMonitor();
     
@@ -108,7 +109,9 @@
 
         void NewIapAccepted();    
    
-        void NewIapRejected();    
+        void NewIapRejected();  
+        
+        TBool BearerId();
         
 	private: // New functions	
 		
@@ -134,9 +137,9 @@
 	private: // Constructors
 	
 		CSipAlrSnapMonitor( 
-		    TUint32 aSnapId,
+		    TSipSNAPConfigurationData aSnapData,
 		    RSocketServ& aSocketServer,
-		    CSipSystemStateMonitor& aSystemStateMonitor );
+		    CSipSystemStateMonitor& aSystemStateMonitor);
 		
     	void ConstructL( 
     	    MSipAlrObserver& aObserver );
@@ -152,7 +155,7 @@
   			
     private: // Data
     
-		TUint32 iSnapId;	
+    	TSipSNAPConfigurationData iSnapData;	
 		RSocketServ& iSocketServer;
         CSipSystemStateMonitor& iSystemStateMonitor;				
 		RConnection iConnection;
@@ -164,6 +167,8 @@
 		TBool iFirstStartHasSucceeded;
 		TBool iConnectionActive;
 		TBool iDying;
+		TConnPrefList  iPrefList;
+	    TExtendedConnPref iExtPrefs;
 		
 	private: // For testing purposes	
 		
@@ -173,4 +178,4 @@
     	#endif
 	};
 
-#endif //CSIPALRSNAPMONITOR_H
\ No newline at end of file
+#endif //CSIPALRSNAPMONITOR_H
--- a/realtimenetprots/sipfw/ProfileAgent/AlrMonitor/src/sipalrmonitor.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/AlrMonitor/src/sipalrmonitor.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -71,12 +71,12 @@
 // CSipAlrMonitor::RefreshIapAvailabilityL
 // -----------------------------------------------------------------------------
 //	
-void CSipAlrMonitor::RefreshIapAvailabilityL ( TUint32 aSnapId )
+void CSipAlrMonitor::RefreshIapAvailabilityL ( TSipSNAPConfigurationData & aConfigData )
 	{
     PROFILE_DEBUG3( "CSipAlrMonitorImplementation::RefreshIapAvailabilityL",
-	                 aSnapId )
+            aConfigData.iSnapId )
     
-    CSipAlrSnapMonitor* monitor = FindSnapMonitor( aSnapId );
+    CSipAlrSnapMonitor* monitor = FindSnapMonitor( aConfigData );
     if ( monitor )
         {
 		monitor->RefreshL();
@@ -87,11 +87,11 @@
 // CSipAlrMonitor::AllowMigration
 // -----------------------------------------------------------------------------
 //
-TInt CSipAlrMonitor::AllowMigration( TUint32 aSnapId )
+TInt CSipAlrMonitor::AllowMigration( TSipSNAPConfigurationData & aConfigData )
     {
-    PROFILE_DEBUG3("CSipAlrMonitor::AllowMigration, SnapId",aSnapId)
-    
-    CSipAlrSnapMonitor* monitor = FindSnapMonitor( aSnapId );
+    PROFILE_DEBUG3("CSipAlrMonitor::AllowMigration, SnapId",aConfigData.iSnapId)
+    PROFILE_DEBUG3("CSipAlrMonitor::AllowMigration, BearerFiltering",aConfigData.iBearerId)
+    CSipAlrSnapMonitor* monitor = FindSnapMonitor( aConfigData );
     if ( monitor )
         {
         monitor->AllowMigration();     
@@ -103,11 +103,11 @@
 // CSipAlrMonitor::DisallowMigration
 // -----------------------------------------------------------------------------
 //
-TInt CSipAlrMonitor::DisallowMigration( TUint32 aSnapId )
+TInt CSipAlrMonitor::DisallowMigration( TSipSNAPConfigurationData& aConfigData )
     {
-    PROFILE_DEBUG3("CSipAlrMonitor::DisallowMigration, SnapId",aSnapId)
-    
-    CSipAlrSnapMonitor* monitor = FindSnapMonitor( aSnapId );
+    PROFILE_DEBUG3("CSipAlrMonitor::DisallowMigration, SnapId",aConfigData.iSnapId)
+    PROFILE_DEBUG3("CSipAlrMonitor::DisallowMigration, BearerFiltering",aConfigData.iBearerId)
+    CSipAlrSnapMonitor* monitor = FindSnapMonitor( aConfigData );
     if ( monitor )
         {
         monitor->DisallowMigration();     
@@ -120,11 +120,11 @@
 // CSipAlrMonitor::NewIapAccepted
 // -----------------------------------------------------------------------------
 //    
-TInt CSipAlrMonitor::NewIapAccepted( TUint32 aSnapId )  
+TInt CSipAlrMonitor::NewIapAccepted( TSipSNAPConfigurationData & aConfigData)  
     {
-    PROFILE_DEBUG3("CSipAlrMonitor::NewIapAccepted, SnapId",aSnapId)
+    PROFILE_DEBUG3("CSipAlrMonitor::NewIapAccepted, SnapId",aConfigData.iSnapId)
     
-    CSipAlrSnapMonitor* monitor = FindSnapMonitor( aSnapId );
+    CSipAlrSnapMonitor* monitor = FindSnapMonitor( aConfigData );
     if ( monitor )
         {
         monitor->NewIapAccepted();     
@@ -137,11 +137,11 @@
 // CSipAlrMonitor::NewIapRejected
 // -----------------------------------------------------------------------------
 //  
-TInt CSipAlrMonitor::NewIapRejected( TUint32 aSnapId )
+TInt CSipAlrMonitor::NewIapRejected( TSipSNAPConfigurationData & aConfigData )
     {
-    PROFILE_DEBUG3( "CSipAlrMonitor::NewIapRejected, SnapId",aSnapId )
+    PROFILE_DEBUG3( "CSipAlrMonitor::NewIapRejected, SnapId",aConfigData.iSnapId )
     
-    CSipAlrSnapMonitor* monitor = FindSnapMonitor( aSnapId );
+    CSipAlrSnapMonitor* monitor = FindSnapMonitor( aConfigData );
     if ( monitor )
         {
         monitor->NewIapRejected();
@@ -155,13 +155,14 @@
 // -----------------------------------------------------------------------------
 //
 void CSipAlrMonitor::MonitorSnapL( 
-    TUint32 aSnapId,
-    MSipAlrObserver& aObserver )
+    TSipSNAPConfigurationData& aConfigData,
+    MSipAlrObserver& aObserver)
     {
     PROFILE_DEBUG4( "CSipAlrMonitor::MonitorSnapL",
-                    aSnapId, reinterpret_cast< TUint >( &aObserver ) )    
-    
-    CSipAlrSnapMonitor* monitor = FindSnapMonitor( aSnapId );
+            aConfigData.iSnapId, reinterpret_cast< TUint >( &aObserver ) ) 
+                    
+ 
+    CSipAlrSnapMonitor* monitor = FindSnapMonitor( aConfigData);
     if ( monitor )
         {
         // Monitor exists, add observer and get current IAP availability
@@ -173,7 +174,7 @@
     else
         {
     	monitor = CSipAlrSnapMonitor::NewLC( 
-    	    aSnapId, aObserver, iSocketServer, iSystemStateMonitor );
+    	        aConfigData, aObserver, iSocketServer, iSystemStateMonitor);
     	iSnapMonitors.AppendL( monitor );
     	CleanupStack::Pop( monitor );
     	
@@ -203,15 +204,18 @@
 // CSipAlrMonitor::FindSnapMonitor
 // -----------------------------------------------------------------------------
 //
-CSipAlrSnapMonitor* CSipAlrMonitor::FindSnapMonitor( TUint32 aSnapId )
+CSipAlrSnapMonitor* CSipAlrMonitor::FindSnapMonitor( TSipSNAPConfigurationData & aConfigData)
     {
     CSipAlrSnapMonitor* monitor = NULL;
 	for ( TInt i = 0; i < iSnapMonitors.Count() && !monitor; i++ )
 		{
-		if ( iSnapMonitors[i]->SnapId() == aSnapId )
-			{    
-			monitor = iSnapMonitors[i];
+		if ( iSnapMonitors[i]->SnapId() == aConfigData.iSnapId && iSnapMonitors[i]->BearerId() == aConfigData.iBearerId ) //mtr found
+		    {
+		   	monitor = iSnapMonitors[i];
 			}
         }
     return monitor;
     }
+
+
+
--- a/realtimenetprots/sipfw/ProfileAgent/AlrMonitor/src/sipalrsnapmonitor.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/AlrMonitor/src/sipalrsnapmonitor.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -28,14 +28,14 @@
 // -----------------------------------------------------------------------------
 //
 CSipAlrSnapMonitor* CSipAlrSnapMonitor::NewLC(
-    TUint32 aSnapId,
+    TSipSNAPConfigurationData aSnapData,
     MSipAlrObserver& aObserver,
     RSocketServ& aSocketServer,
-    CSipSystemStateMonitor& aSystemStateMonitor )
+    CSipSystemStateMonitor& aSystemStateMonitor)
 	{
   	CSipAlrSnapMonitor* self = 
   	    new ( ELeave ) CSipAlrSnapMonitor( 
-  	        aSnapId, aSocketServer, aSystemStateMonitor );
+  	        aSnapData, aSocketServer, aSystemStateMonitor);
     CleanupStack::PushL( self );
     self->ConstructL( aObserver );
     return self;	
@@ -46,15 +46,15 @@
 // -----------------------------------------------------------------------------
 //	
 CSipAlrSnapMonitor::CSipAlrSnapMonitor( 
-    TUint32 aSnapId,
+    TSipSNAPConfigurationData aSnapData,
     RSocketServ& aSocketServer,
-    CSipSystemStateMonitor& aSystemStateMonitor ) : 
+    CSipSystemStateMonitor& aSystemStateMonitor) : 
     CActive ( CActive::EPriorityStandard ),
-    iSnapId( aSnapId ),
+    iSnapData( aSnapData ),
     iSocketServer( aSocketServer ),
-	iSystemStateMonitor( aSystemStateMonitor )									
+	iSystemStateMonitor( aSystemStateMonitor )
 	{
-	iPrefs.SetSnap( iSnapId );
+	iPrefs.SetSnap( aSnapData.iSnapId );
 	CActiveScheduler::Add( this );
 	}
 
@@ -67,9 +67,16 @@
 	PROFILE_DEBUG1( "CSipAlrSnapMonitor::ConstructL entered" )
 	
 	iSystemStateMonitor.StartMonitoringL( 
-	    CSipSystemStateMonitor::ESnapAvailability, iSnapId, *this );
+	    CSipSystemStateMonitor::ESnapAvailability, SnapId(), *this );
 
   	AddObserverL( aObserver );
+  	
+  	if(IsSnapAvailable())
+  	    {
+        // SNAP is already Available to be started.
+        // No Need to wait for Notification from System State Monitor.
+  	    StartSnap();
+  	    }
 	
 	PROFILE_DEBUG1( "CSipAlrSnapMonitor::ConstructL returns" )
 	}
@@ -91,7 +98,7 @@
 	iObservers.Close();
 	
 	iSystemStateMonitor.StopMonitoring( 
-	    CSipSystemStateMonitor::ESnapAvailability, iSnapId, *this );
+	    CSipSystemStateMonitor::ESnapAvailability, SnapId(), *this );
 	    
 	PROFILE_DEBUG1( "CSipAlrSnapMonitor::~CSipAlrSnapMonitor returns" )
 	}
@@ -129,7 +136,7 @@
 		for ( TInt i = iObservers.Count() - 1; i >= 0; --i )
 			{
 			iObservers[i].iObserver->AlrEvent(
-				MSipAlrObserver::EOfferedIapRejected, iSnapId, KNoIap );
+				MSipAlrObserver::EOfferedIapRejected, SnapId(), KNoIap );
 			}
 		}
     else
@@ -188,7 +195,7 @@
     TAccessPointInfo aNewAP, 
     TBool /*aIsSeamless*/ )
     {
-    PROFILE_DEBUG3( "CSipSnapAlrMonitor::NewCarrierActive", iSnapId )
+    PROFILE_DEBUG3( "CSipSnapAlrMonitor::NewCarrierActive", SnapId() )
     
     NotifyInitializedObservers( aNewAP.AccessPoint(), 
                                 MSipAlrObserver::EIapActive );
@@ -206,7 +213,7 @@
     	PROFILE_DEBUG1( "CSipSnapAlrMonitor::Error iCommsMobilityAO==NULL")
     	return;
     	}
-    if ( aError == KErrNotFound)
+    if ( aError == KErrNotFound && !BearerId())
 	    {
 	    NotifyInitializedObservers( KNoIap,
 	    							MSipAlrObserver::ENoNewIapAvailable );
@@ -217,8 +224,12 @@
     if ( !iDying )
         {
         ResetState();
+        if(!BearerId())
+        {
+        PROFILE_DEBUG3( "CSipSnapAlrMonitor::Error, Start Snap as Bearer Id is ", BearerId() )
         StartSnap();
         }
+        }
     }
 
 // -----------------------------------------------------------------------------
@@ -235,7 +246,7 @@
     
     if ( !IsActive() &&
          aVariable == CSipSystemStateMonitor::ESnapAvailability &&
-         aObjectId == iSnapId )
+         aObjectId == SnapId() )
         {
         if ( aValue == CSipSystemStateMonitor::ESnapAvailable )
             {
@@ -257,7 +268,7 @@
 //		
 TUint32 CSipAlrSnapMonitor::SnapId() const
 	{
-	return iSnapId;
+	return iSnapData.iSnapId;
 	}
 			
 // -----------------------------------------------------------------------------
@@ -324,7 +335,7 @@
 			for ( TInt i = iObservers.Count() - 1; i >= 0; --i )
 				{
 				iObservers[i].iObserver->AlrEvent(
-					MSipAlrObserver::ERefreshError, iSnapId, KNoIap );
+					MSipAlrObserver::ERefreshError, SnapId(), KNoIap );
 				}
 			}
         }
@@ -402,7 +413,6 @@
 TInt CSipAlrSnapMonitor::StartSnap()
     {
     PROFILE_DEBUG1( "CSipAlrSnapMonitor::StartSnap entered" )
-
     TInt err = KErrNone;
     if ( !IsActive() && IsSnapAvailable() )
         {
@@ -413,14 +423,40 @@
 
     	if ( err == KErrNone )
     	    {
-        	iConnection.Start( iPrefs, iStatus );
-        	SetActive();
+            if(BearerId())
+                {
+                if(BearerId()== 1)
+                    {
+                    iExtPrefs.SetBearerSet(TExtendedConnPref::EExtendedConnBearerWLAN);
+                    }
+                else if(BearerId() == 2)
+                    {
+                    iExtPrefs.SetBearerSet(TExtendedConnPref::EExtendedConnBearerCellular);
+                    }
+				PROFILE_DEBUG1( "CSipAlrSnapMonitor::Starting Bearer Filtered connection" )
+                iExtPrefs.SetSnapId( SnapId());
+                
+                TRAPD(error, iPrefList.AppendL(&iExtPrefs));
+				if(error)
+				{
+				return error;
+				}
+                // Start connecting
+                iConnection.Start( iPrefList, iStatus );
+                SetActive();
+                }
+            else
+                {
+				PROFILE_DEBUG1( "CSipAlrSnapMonitor::Starting Normal Connection" )
+                iConnection.Start( iPrefs, iStatus );
+                SetActive();
+                }
     	    }
         }
 
 	PROFILE_DEBUG3( "CSipAlrSnapMonitor::StartSnap returns", err )
     return err;
-    }
+   }
 
 // -----------------------------------------------------------------------------
 // CSipAlrSnapMonitor::CreateMobilityAoL
@@ -476,7 +512,7 @@
 void CSipAlrSnapMonitor::NotifyObservers( TUint aIapId )
 	{
 	PROFILE_DEBUG4( "CSipSnapAlrMonitor::NotifyObservers SNAP, IAP",
-	                iSnapId, aIapId )
+	        SnapId(), aIapId )
 
 	NotifyInitializedObservers( aIapId, MSipAlrObserver::EIapAvailable );
 	NotifyNewObservers( aIapId );
@@ -495,9 +531,9 @@
 		if ( iObservers[i].iInitialEventDone )
 			{
 			PROFILE_DEBUG3( "CSipAlrSnapMonitor::NotifyIntitializedObservers",
-			                iSnapId )			
+			                SnapId() )			
 			
-			iObservers[i].iObserver->AlrEvent( aEvent, iSnapId, aIapId );
+			iObservers[i].iObserver->AlrEvent( aEvent, SnapId(), aIapId );
 			}
 		}
 	}
@@ -512,10 +548,10 @@
 		{
 		if ( !iObservers[i].iInitialEventDone )
 			{
-			PROFILE_DEBUG3( "CSipAlrSnapMonitor::NotifyNewObservers", iSnapId )
+			PROFILE_DEBUG3( "CSipAlrSnapMonitor::NotifyNewObservers", SnapId() )
 
 			iObservers[i].iObserver->AlrEvent(
-			    MSipAlrObserver::EIapAvailable, iSnapId, aIapId );
+			    MSipAlrObserver::EIapAvailable, SnapId(), aIapId );
 
 			iObservers[i].iInitialEventDone = ETrue;
 			}
@@ -529,6 +565,15 @@
 TBool CSipAlrSnapMonitor::IsSnapAvailable() const
     {
     return ( iSystemStateMonitor.CurrentValue( 
-	             CSipSystemStateMonitor::ESnapAvailability, iSnapId ) == 
+	             CSipSystemStateMonitor::ESnapAvailability, SnapId() ) == 
 	                 CSipSystemStateMonitor::ESnapAvailable );
     }
+
+// -----------------------------------------------------------------------------
+// CSipAlrSnapMonitor::BearerId
+// -----------------------------------------------------------------------------
+//
+TBool CSipAlrSnapMonitor::BearerId()
+    {
+    return iSnapData.iBearerId;
+    }
--- a/realtimenetprots/sipfw/ProfileAgent/Client/Api/sipprofile.h	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/Client/Api/sipprofile.h	Thu Aug 19 10:16:25 2010 +0300
@@ -195,6 +195,15 @@
 */
 const TUint32 KSecondaryAPN = 21;
 
+/** 
+* BearerType is of type TUint32.
+* Possible  Values and its purpose.
+* 0 --> Not Specified.
+* 1 --> WLAN Bearer Only.
+* 2 --> Cellular Data Bearer Only.
+**/
+const TUint32 KBearerType = 22;
+
 
 // CLASS DECLARATION
 /**
--- a/realtimenetprots/sipfw/ProfileAgent/Client/Src/sipmanagedprofile.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/Client/Src/sipmanagedprofile.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -185,6 +185,7 @@
 		case KSIPDigestPassword:
 		case KSIPHeaders:
 		case KSIPSoIpTOS:
+		case KBearerType:
 			User::Leave(KErrNotFound);
 		case KSIPContactHeaderUser:
 		    User::Leave(KErrAccessDenied);
@@ -276,6 +277,7 @@
 		case KSIPSnapId:
         case KPrimaryAPN:
         case KSecondaryAPN:
+        case KBearerType:
 			User::Leave(KErrNotFound);			
 		default:
 			iSIPProfile->SetExtensionParameterL(aParam, aVal);
--- a/realtimenetprots/sipfw/ProfileAgent/Group/sipprofileserver.mmp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/Group/sipprofileserver.mmp	Thu Aug 19 10:16:25 2010 +0300
@@ -94,6 +94,8 @@
 LIBRARY           commsdat.lib 
 LIBRARY           featmgr.lib
 LIBRARY 	  commdb.lib
+LIBRARY       extendedconnpref.lib  
+LIBRARY 	  netmeta.lib
 
 VENDORID 0x70000001
 
--- a/realtimenetprots/sipfw/ProfileAgent/IETF_Agent/src/Sipietfprofilecontext.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/IETF_Agent/src/Sipietfprofilecontext.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -442,12 +442,12 @@
 	     CurrentState() == MSIPProfileContext::ERegistered) &&
 		(aError == K408TimeOut ||
 		 aError == K500ServerInternalError ||
-		 aError == KErrSIPOutboundProxyNotResponding || 
+		 aError == KErrTimedOut || 
+		 (( aError == KErrSIPOutboundProxyNotResponding || 
 		 aError == KErrSIPResolvingFailure || 
-		 aError == KErrTimedOut || 
 		 aError == KErrSIPTransportFailure ||
-		 aError == KErrSIPICMPFailure  && 
-		 iConnection.State() != CSIPConnection::ESuspended))		
+		 aError == KErrSIPICMPFailure ) && 
+		 iConnection.State() != CSIPConnection::ESuspended)))		
 	    {
 		if ( iRetryCounterSum + 1 < KMaxRetryForOneAddress &&
 		     iRetryCounter < KMaxRetryForOneAddress )
--- a/realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Src/Sipimsprofilecontext.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Src/Sipimsprofilecontext.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -749,11 +749,11 @@
 			 aError == K500ServerInternalError || 
 			 aError == K504ServerTimeOut || 
 			 aError == KErrTimedOut ||
-			 aError == KErrSIPOutboundProxyNotResponding || 
+			 ((aError == KErrSIPOutboundProxyNotResponding || 
 			 aError == KErrSIPResolvingFailure ||
 			 aError == KErrSIPTransportFailure ||
-			 aError == KErrSIPICMPFailure && 
-			 iConnection.State() != CSIPConnection::ESuspended)
+			 aError == KErrSIPICMPFailure  )&&
+			 iConnection.State() != CSIPConnection::ESuspended))
 			{
 			SetRetryPossible(ETrue);
 			iRetriedRegister = ETrue;
--- a/realtimenetprots/sipfw/ProfileAgent/Profile/Src/sipconcreteprofile.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/Profile/Src/sipconcreteprofile.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -14,7 +14,7 @@
 // Name        : sipconcreteprofile.cpp
 // Part of     : SIP / SIP Profile Agent / SIP Concrete Profile
 // Implementation
-// Version     : %version: 3.1.2 %
+// Version     : %version: 3.1.2.1.2 %
 //
 
 
@@ -2256,5 +2256,12 @@
 		PROFILE_DEBUG3("Exceptional SNAP Entry verifier :", KDefaultSNAPIdentifier)
 		SetExtensionParameterL(KSIPSnapId,KDefaultSNAPIdentifier);
 		}
+	
+if ( ExtensionParameter(KBearerType,iVal) == KErrNotFound)
+	    { 
+PROFILE_DEBUG3("CSIPConcreteProfile::ValidateProfileParamsL.. Setting bearer Id to 0", 0)
+        TUint32 defaultId=0;
+        SetExtensionParameterL(KBearerType,defaultId);
+	    }
 	return res;
 	}
--- a/realtimenetprots/sipfw/ProfileAgent/Server/Inc/SipProfileCacheItem.h	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/Server/Inc/SipProfileCacheItem.h	Thu Aug 19 10:16:25 2010 +0300
@@ -567,7 +567,10 @@
 		*/
 		void HandleProfileError(TInt aError, 
 			CSIPConcreteProfile& aProfile);		
-
+/**
+		* Function returns the Bearer ID for the Profile. 
+		*/
+		TUint32 BearerID();
 	private:
 
 	    /**
--- a/realtimenetprots/sipfw/ProfileAgent/Server/Inc/SipProfileServerCore.h	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/Server/Inc/SipProfileServerCore.h	Thu Aug 19 10:16:25 2010 +0300
@@ -36,6 +36,7 @@
 #include "sipprofileerrorhandler.h"
 #include <sipsystemstateobserver.h>
 #include "sipapnmanager.h"
+#include "sipalrobserver.h"
 #include <e32base.h>
 
 // FORWARD DECLARATIONS
@@ -466,10 +467,10 @@
 		/**
         * Gets the migration controller of the given SNAP id. If a controller
         * does not exists, creates a new one.
-		* @param aSnapId SNAP id
+		* @param aSnapData 
 		* @return Migration controller, ownership is not transferred.
 		*/
-		CSipAlrMigrationController& MigrationControllerL(TUint32 aSnapId);
+		CSipAlrMigrationController& MigrationControllerL(TSipSNAPConfigurationData aSnapData);
 
 		CSIPProfileState& UnregisteredState();
 
--- a/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileCacheItem.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileCacheItem.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -969,9 +969,12 @@
 		StopSnapMonitoring();
 		}
 
-	if (!iMigrationController)
+	if (!iMigrationController) 
 		{
-		iMigrationController = &iServerCore.MigrationControllerL(aSnapId);
+	    TUint32 bearerId = BearerID();
+	    TSipSNAPConfigurationData aSnapData(aSnapId,bearerId);
+		iMigrationController = &iServerCore.MigrationControllerL(aSnapData);
+		PROFILE_DEBUG3("ProfileCacheItem::BearerFilter value is", bearerId)
 		TUint32 iapId = iMigrationController->AttachProfileL(*this);
 		if (iapId)
 			{
@@ -1403,3 +1406,13 @@
     return iIsOfflineInitiated;
     }
 
+// -----------------------------------------------------------------------------
+// CSIPProfileCacheItem::BearerID
+// This function will return the Bearer ID of the Profile.
+// -----------------------------------------------------------------------------
+//
+TUint32 CSIPProfileCacheItem::BearerID()
+{   TUint32 bearerId(0);
+    LatestProfile().ExtensionParameter(KBearerType , bearerId);
+    return bearerId;
+}
--- a/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileServerCore.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileServerCore.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -507,27 +507,7 @@
                     {
                     ConfirmSystemstateMonitor(CSipSystemStateMonitor::ESystemState);
                     }
-                } //end if Offline
-            
-            //If the System receives Online event
-            if(aValue == CSipSystemStateMonitor::ESystemOnline)
-                {                
-                for (TInt i = 0; i < iProfileCache.Count(); i++)
-                    {
-                    CSIPProfileCacheItem* item = iProfileCache[i];
-                    item->OfflineInitiated(EFalse);                    
-                    CSIPConcreteProfile::TStatus status;
-                    iPluginDirector->State(status, item->UsedProfile());
-                    if (item->IsReferred() && status == CSIPConcreteProfile::EUnregistered)
-                        {
-                        TRAPD(err, item->StartRegisterL(*iWaitForIAP, *iRegInProg, ETrue));
-                        if (err != KErrNone)
-                            {
-                            HandleAsyncError(*item,CSIPConcreteProfile::ERegistrationInProgress,err);
-                            }
-                        }
-                    }
-                } //end if Online           
+                } //end if Offline         
 	    } //end if SystemState    
 	else if(aVariable == CSipSystemStateMonitor::ERfsState)
 	    {
@@ -1906,20 +1886,22 @@
 // -----------------------------------------------------------------------------
 //
 CSipAlrMigrationController&
-CSIPProfileServerCore::MigrationControllerL(TUint32 aSnapId)
+CSIPProfileServerCore::MigrationControllerL(TSipSNAPConfigurationData aSnapData)
 	{
-	RemoveUnusedMigrationControllers(aSnapId);
+	RemoveUnusedMigrationControllers(aSnapData.iSnapId);
 
 	for (TInt i = 0; i < iMigrationControllers.Count(); ++i)
 		{
-		if (iMigrationControllers[i]->SnapId() == aSnapId)
+        // Migration controller is unique based on the SNAP ID and Bearer ID.
+		if (iMigrationControllers[i]->SnapId() == aSnapData.iSnapId 
+		        && iMigrationControllers[i]->BearerId() == aSnapData.iBearerId)
 			{
 			return *iMigrationControllers[i];
 			}
 		}
 
 	CSipAlrMigrationController* ctrl =
-		CSipAlrMigrationController::NewLC(iAlrHandler->AlrMonitorL(), aSnapId);
+		CSipAlrMigrationController::NewLC(iAlrHandler->AlrMonitorL(),aSnapData);
 	iMigrationControllers.AppendL(ctrl);
 	CleanupStack::Pop(ctrl);
 	return *ctrl;
@@ -2210,8 +2192,7 @@
             CSIPConcreteProfile::TStatus status;
             self->iPluginDirector->State( status, self->iProfileCache[i]->UsedProfile() );
             item->OfflineInitiated(EFalse);
-            if (item->IsReferred() && (!self->iApnManager->IsIapGPRSL(item->Profile().IapId())) 
-                    && status == CSIPConcreteProfile::EUnregistered) 
+            if (item->IsReferred() && (status == CSIPConcreteProfile::EUnregistered) ) 
                 {                
                 TRAPD(err, item->StartRegisterL(*(self->iWaitForIAP), *(self->iRegInProg), ETrue));
                 if (err != KErrNone)
--- a/realtimenetprots/sipfw/ProfileAgent/Server/Src/sipalrhandler.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/Server/Src/sipalrhandler.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -134,8 +134,8 @@
     TUint32 snapId(0);
     __ASSERT_ALWAYS(aProfile.IsSNAPConfigured(snapId),
     				User::Leave(KErrArgument));
-
-    AlrMonitorL().RefreshIapAvailabilityL(snapId);
+    TSipSNAPConfigurationData aSnapData(snapId ,aProfile.BearerID());
+    AlrMonitorL().RefreshIapAvailabilityL(aSnapData);
     }
 
 // -----------------------------------------------------------------------------
--- a/realtimenetprots/sipfw/ProfileAgent/Server/Src/sipalrmigrationcontroller.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/Server/Src/sipalrmigrationcontroller.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -30,10 +30,10 @@
 // -----------------------------------------------------------------------------
 //
 CSipAlrMigrationController*
-CSipAlrMigrationController::NewLC(CSipAlrMonitor& aAlrMonitor, TUint32 aSnapId)
+CSipAlrMigrationController::NewLC(CSipAlrMonitor& aAlrMonitor, TSipSNAPConfigurationData aSnapData)
 	{
 	CSipAlrMigrationController* self =
-		new (ELeave) CSipAlrMigrationController(aAlrMonitor, aSnapId);
+		new (ELeave) CSipAlrMigrationController(aAlrMonitor, aSnapData);
     CleanupStack::PushL(self);
     return self;
 	}
@@ -44,9 +44,9 @@
 //
 CSipAlrMigrationController::CSipAlrMigrationController(
 	CSipAlrMonitor& aAlrMonitor,
-	TUint32 aSnapId) :
+	TSipSNAPConfigurationData aSnapData) :
 	iAlrMonitor(aAlrMonitor),
-    iSnapId(aSnapId)
+	iSnapData(aSnapData)
 #ifdef CPPUNIT_TEST
     // Set the array granularity to 1, so it allocates memory in each append
     , iObservers(1)
@@ -125,9 +125,14 @@
 //
 TUint32 CSipAlrMigrationController::SnapId() const
 	{
-	return iSnapId;
+	return iSnapData.iSnapId;
 	}
 
+TUint32 CSipAlrMigrationController::BearerId() const
+    {
+    return iSnapData.iBearerId;
+    }
+
 // -----------------------------------------------------------------------------
 // CSipAlrMigrationController::IsUsed
 // -----------------------------------------------------------------------------
@@ -148,12 +153,13 @@
     {
 	TSipAlrMigrationObserverInfo observerInfo(aObserver);
 	iObservers.AppendL(observerInfo);
-
+    
     const TInt KFirstObserverExists = 1;
     if (iObservers.Count() == KFirstObserverExists)
     	{
-    	PROFILE_DEBUG3("CSipAlrMigrCtrl::AttachProfileL snapId", iSnapId)
-    	iAlrMonitor.MonitorSnapL(iSnapId, *this);
+        PROFILE_DEBUG3("CSipAlrMigrCtrl::AttachProfileL snapId", SnapId())
+        PROFILE_DEBUG3("CSipAlrMigrCtrl::AttachProfileL BearerFiltered.. ", BearerId())
+        iAlrMonitor.MonitorSnapL(iSnapData, *this);
     	return KNoIap;
     	}
 
@@ -251,11 +257,11 @@
 			TInt err(KErrNone);
 			if (iMigrationDisallowed)
 				{
-				err = iAlrMonitor.DisallowMigration(iSnapId);
+			    err = iAlrMonitor.DisallowMigration(iSnapData);
 				}
 			else
 				{
-				err = iAlrMonitor.AllowMigration(iSnapId);
+			    err = iAlrMonitor.AllowMigration(iSnapData);
 				}
 			if (err != KErrNone)
 				{
@@ -274,9 +280,10 @@
 //
 void CSipAlrMigrationController::RefreshIapAvailabilityL(TUint32 aSnapId)
 	{
-	if (!iRefreshIssued && aSnapId == iSnapId)
+	if (!iRefreshIssued && aSnapId == SnapId())
 		{
-		iAlrMonitor.RefreshIapAvailabilityL(aSnapId);
+	    
+		iAlrMonitor.RefreshIapAvailabilityL(iSnapData);
 		iRefreshIssued = ETrue;
 		}
 	}
@@ -293,7 +300,7 @@
 	PROFILE_DEBUG4("CSipAlrMigrCtrl::SetIapAcceptance, iap,works=",
 				   iAllowedIapId,
 				   aIapWorks)
-
+    
 	TInt index = FindIndex(aObserver);
 	if (index != KErrNotFound && iObservers[index].iIsWaitingForAcceptance)
 		{
@@ -306,14 +313,14 @@
 				iObservers[i].iIsWaitingForAcceptance = EFalse;
 				}
 			PROFILE_DEBUG1("CSipAlrMigrCtrl::SetIapAcceptance accepted")
-			return iAlrMonitor.NewIapAccepted(iSnapId);
+			return iAlrMonitor.NewIapAccepted(iSnapData);
 			}
 
 		if (!ObserversWaitingAcceptance())
 			{
 			// Nobody got IAP to work
 			PROFILE_DEBUG1("CSipAlrMigrCtrl::SetIapAcceptance rejected")
-			return iAlrMonitor.NewIapRejected(iSnapId);
+			return iAlrMonitor.NewIapRejected(iSnapData);
 			}
 		}
 	return KErrNone;
--- a/realtimenetprots/sipfw/ProfileAgent/Server/Src/sipalrmigrationcontroller.h	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/ProfileAgent/Server/Src/sipalrmigrationcontroller.h	Thu Aug 19 10:16:25 2010 +0300
@@ -58,7 +58,7 @@
 
 	public:
     	static CSipAlrMigrationController* NewLC(CSipAlrMonitor& aAlrMonitor,
-    											 TUint32 aSnapId);
+                             TSipSNAPConfigurationData aSnapData);
 
     	~CSipAlrMigrationController();
 
@@ -71,6 +71,8 @@
     public: // New functions
 
 		TUint32 SnapId() const;
+		
+		TUint32 BearerId() const;
 
 		/**
         * Check if any profile is using this instance.
@@ -116,11 +118,13 @@
 							  TBool aIapWorks);
 							  
 		void ResetFlags();
+		
+		
 
 	private: // Constructors
 
 	    CSipAlrMigrationController(CSipAlrMonitor& aAlrMonitor,
-	    						   TUint32 aSnapId);
+                                    TSipSNAPConfigurationData aSnapData);
 
     private: // New functions
 
@@ -143,9 +147,6 @@
 
 		RArray<TSipAlrMigrationObserverInfo> iObservers;
 
-		// SNAP id that is monitored. Does not change.
-		const TUint32 iSnapId;
-
 		// The IAP id, that was most recently offered to observers with
 		// MSipAlrMigrationObserver::IapAvailableL.
 		TUint32 iOfferedIapId;
@@ -163,6 +164,9 @@
 		// Will be set to EFalse, when ALR monitor notifies about IAP, using
 		// MSipAlrObserver::IapAvailable.
 		TBool iRefreshIssued;
+		
+		// This contains the SNAP ID and the Bearer ID configured for the SNAP.
+		TSipSNAPConfigurationData iSnapData;
 
     private: // For testing purposes		
 #ifdef CPPUNIT_TEST
--- a/realtimenetprots/sipfw/SIP/Codec/src/CSIPAcceptEncodingHeader.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/SIP/Codec/src/CSIPAcceptEncodingHeader.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -164,7 +164,7 @@
 	tmp->Des().Trim();
 	//Allowing '/' token for interoperability issues
 	RArray<TSIPChar> array;
-	if(CFeatureDiscovery::IsFeatureSupportedL(TUid::Uid(KFeatureIdFfSipApnSwitching)))
+	if(CFeatureDiscovery::IsFeatureSupportedL(TUid::Uid(KFeatureIdFfSipNonstandardInteropfix)))
 	    {
         array.Append('/');
 	    }
--- a/realtimenetprots/sipfw/SIP/ConnectionMgr/src/CTransport.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/realtimenetprots/sipfw/SIP/ConnectionMgr/src/CTransport.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -1489,7 +1489,15 @@
                         {
                         uri.SIPURI()->SetSIPS( EFalse );
                         }
-                    } //end if (aMessage->IsRequest)                
+                    //set the port information as per sip scheme and if there is no
+                    //port information set in the contact header.=
+                    if(uri.SIPURI()->IsSIPSURI() && (0 == uri.SIPURI()->HostPort().Port()))
+                        uri.SIPURI()->HostPort().SetPort(KDefaultSipsPort);
+                    else if ((EFalse == uri.SIPURI()->IsSIPSURI()) && (0 == uri.SIPURI()->HostPort().Port()))
+                        uri.SIPURI()->HostPort().SetPort(KDefaultSipPort);
+					else
+						{}
+                    } //end if (aMessage->IsRequest)				 
 			    } //end if (uri.IsSIPURI())
 			} //end if(sipaddr)
 		} //end while    
--- a/sipplugins/sippdevmgmtsipadapter/inc/smldmsipadapterconstants.h	Thu Jul 15 19:02:22 2010 +0300
+++ b/sipplugins/sippdevmgmtsipadapter/inc/smldmsipadapterconstants.h	Thu Aug 19 10:16:25 2010 +0300
@@ -77,6 +77,8 @@
     "DestinationNetwork" );
 _LIT8( KNSmlDMSIPSigQos,
     "SignalingQoS" );
+_LIT8( KNSmlDMSIPBearerID,
+    "BearerID" );
 
 // Explanations of parameters
 _LIT8( KNSmlDMSIPNodeNameExp,
@@ -127,6 +129,8 @@
     "Reference to Destination Network" );
 _LIT8( KNSmlDMSIPSigQosExp,
     "Signaling QoS" );
+_LIT8( KNSmlDMSIPBearerIDExp,
+    "Bearer ID" );
 
 // For SIP URI.
 // References: OMA DM MO for Nokia SIP and IETF RFC3261.
--- a/sipplugins/sippdevmgmtsipadapter/src/nsmldmsipadapter.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/sipplugins/sippdevmgmtsipadapter/src/nsmldmsipadapter.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -499,6 +499,16 @@
     sigQos.SetDFFormatL( MSmlDmDDFObject::EInt );
     sigQos.AddDFTypeMimeTypeL( KNSmlDMSIPTextPlain );
     sigQos.SetDescriptionL( KNSmlDMSIPSigQosExp );
+    
+    //Bearer ID
+    MSmlDmDDFObject& bearerid = idNode.AddChildObjectL( KNSmlDMSIPBearerID );
+    bearerid.SetAccessTypesL( accessTypesGetReplaceAdd );
+    bearerid.SetOccurenceL( MSmlDmDDFObject::EZeroOrOne );
+    bearerid.SetScopeL( MSmlDmDDFObject::EDynamic );
+    bearerid.SetDFFormatL( MSmlDmDDFObject::EInt );
+    bearerid.AddDFTypeMimeTypeL( KNSmlDMSIPTextPlain );
+    bearerid.SetDescriptionL( KNSmlDMSIPBearerIDExp );
+    
 
     DBG_PRINT("CNSmlDmSIPAdapter::DDFStructureL(): end");
     }
@@ -856,6 +866,22 @@
             }
         }
 
+    // SIP/x/BearerId
+    if ( KNSmlDMSIPBearerID() == lastUriSeg )
+        {
+        TUint32 bearerid = DesToInt( aObject );
+        if ( bearerid )
+            {
+            err = iProfiles->At( profileID )->SetParameter( 
+                    KBearerType, bearerid );
+            }
+        else
+            {
+            status = CSmlDmAdapter::EInvalidObject;
+            }
+        }
+    
+    
     // ==============================
     // OutboundProxy settings node
     // ==============================
@@ -1260,6 +1286,16 @@
         sigQos >>= 2;
         segmentResult.Num( sigQos );
         }
+    
+    // SIP/x/BearerId
+       if ( KNSmlDMSIPBearerID() == lastUriSeg )
+           {
+           TUint32 bearerid;
+           err = iProfiles->At( profileID )->GetParameter(
+                   KBearerType, bearerid );
+           segmentResult.Num( bearerid );
+           }
+    
 
     // Set error if fetch failed.
     if ( -1 > err )
@@ -1520,6 +1556,12 @@
             segmentName );
         currentURISegmentList->InsertL( currentURISegmentList->Size(), 
             KNSmlDMSIPSeparator8 );
+        
+        segmentName.Copy( KNSmlDMSIPBearerID );
+        currentURISegmentList->InsertL( currentURISegmentList->Size(), 
+            segmentName );
+        currentURISegmentList->InsertL( currentURISegmentList->Size(), 
+            KNSmlDMSIPSeparator8 );
         }
 
     // SIP/x/OutboundProxy
@@ -1821,7 +1863,11 @@
                 }
             }
         }
-    return aURI.Left( i );
+		
+	if(i < 0)
+		return aURI.Left(i+1);
+	else	
+		return aURI.Left( i );
     }
 
 // ---------------------------------------------------------------------------
--- a/sipplugins/sippsipadapter/inc/CWPSIPItem.h	Thu Jul 15 19:02:22 2010 +0300
+++ b/sipplugins/sippsipadapter/inc/CWPSIPItem.h	Thu Aug 19 10:16:25 2010 +0300
@@ -488,6 +488,9 @@
          * @param aSigQos Signalling QoS value.
          */
         void SetSigQos( TUint32 aSigQos );
+        
+        void SetBearerID(TUint32 aBearerId);
+        TUint32 GetBearerID();
 
     private:
 
@@ -686,6 +689,8 @@
          * Signalling QoS value.
          */
         TUint32 iSigQos;
+        
+        TUint32 iBearerId;
 
     private:
         //friend class UT_CWPSIPItem; // For testing purposes.
--- a/sipplugins/sippsipadapter/src/CWPSIPAdapter.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/sipplugins/sippsipadapter/src/CWPSIPAdapter.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -52,6 +52,7 @@
 _LIT( KParmLOCK,       "LOCK" );
 _LIT( KParmAUTOREG,    "AUTOREG" );
 _LIT( KParmSIGQOS,     "SIGQOS" );
+_LIT( KParmBearerID,   "PBEARERID" );
 
 // For other purposes.
 const TUint32 KNotSet = 0xffffffff;
@@ -501,6 +502,14 @@
                     iCurrentSIPItem->SetSigQos( parmVal );
                     }
                 }
+            
+            else if(aParameter.Name() == KParmBearerID )
+                {
+                TInt bearerid;
+                TLex8 lex( tmpValue->Des() );
+                User::LeaveIfError( lex.Val( bearerid ) );
+                iCurrentSIPItem->SetBearerID((TUint32) bearerid );
+                }
             break;
             }
         case EWPParameterAppRef:
--- a/sipplugins/sippsipadapter/src/CWPSIPItem.cpp	Thu Jul 15 19:02:22 2010 +0300
+++ b/sipplugins/sippsipadapter/src/CWPSIPItem.cpp	Thu Aug 19 10:16:25 2010 +0300
@@ -146,6 +146,7 @@
     iToAppRef                                 = HBufC8::NewL( 0 );
     iNetwork                                  = HBufC::NewL( 0 );
     iSnapId                                   = KErrNotFound;
+    iBearerId                                 = 0;
     SetSigQos( 40 );
     DBG_PRINT( "CWPSIPItem::ConstructL - end" );
     }
@@ -1007,7 +1008,9 @@
 
     // Signalling QoS parameter.
     cSIPManagedProfile->SetParameter( KSIPSoIpTOS, iSigQos );
-
+    
+    cSIPManagedProfile->SetParameter( KBearerType, iBearerId );
+    
     // Stores SIP profile to permanent storage
     cSIPManagedProfileRegistry->SaveL( *cSIPManagedProfile );
 
@@ -1259,4 +1262,14 @@
     iSigQos = tosBits;
     }
 
+
+void CWPSIPItem::SetBearerID(TUint32 aBearerId)
+{
+iBearerId = aBearerId;
+}
+
+TUint32 CWPSIPItem:: GetBearerID()
+{
+return iBearerId; 
+}
 // End of file.