syncmlfw/dm/provisioningadapter/src/NSmlDmProvisioningAdapter.cpp
changeset 0 b497e44ab2fc
child 19 696f5dd11939
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/dm/provisioningadapter/src/NSmlDmProvisioningAdapter.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,903 @@
+/*
+* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Main class for handling provisioning Provisioning message
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <badesca.h>
+#include <commdb.h>
+#include <cdbcols.h>			 // CommsDB columname defs
+#include <stringresourcereader.h>
+#include <barsread.h>
+#include <NSmlDMProvisioningAdapter.rsg>
+#include <f32file.h>
+#include <bautils.h>
+#include <ApUtils.h>
+#include <utf.h>
+#include <featmgr.h>
+#include <barsc.h> 
+
+#include <nsmldebug.h>
+#include <CWPCharacteristic.h>
+#include <CWPParameter.h>
+#include <CWPEngine.h>
+#include <NSmlPrivateAPI.h>
+#include "NSmlDmProvisioningAdapter.h"
+#include "NSmlTransportHandler.h"
+
+#include <data_caging_path_literals.hrh>
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::CNSmlDmProvisioningAdapter
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+CNSmlDmProvisioningAdapter::CNSmlDmProvisioningAdapter()
+	:CWPAdapter(), iAuthSecretLimitIndicator(0)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+void CNSmlDmProvisioningAdapter::ConstructL()
+	{
+	iSession.OpenL();
+	FeatureManager::InitializeLibL();
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+CNSmlDmProvisioningAdapter* CNSmlDmProvisioningAdapter::NewL()
+	{
+	_DBG_FILE("CNSmlDmProvisioningAdapter::NewL(): begin");
+	CNSmlDmProvisioningAdapter* self = new(ELeave) CNSmlDmProvisioningAdapter; 
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self );
+	_DBG_FILE("CNSmlDmProvisioningAdapter::NewL(): end");
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CNSmlDmProvisioningAdapter::~CNSmlDmProvisioningAdapter()
+	{
+	iProfiles.ResetAndDestroy();
+	iProfiles.Close();
+	
+	delete iTitle;
+	iSession.Close();
+	FeatureManager::UnInitializeLib();
+	}
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CNSmlDmProfileElement::~CNSmlDmProfileElement()
+	{
+	iVisitParameter = 0;
+	
+	delete iServerNonce;
+	delete iHostAddress;
+	delete iPort;
+	delete iHTTPUserName;
+	delete iHTTPPassword;
+	
+	delete iDisplayName;
+	delete iServerId;
+	delete iUsername;
+	delete iPassword;
+	delete iServerPassword;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::CanSetAsDefault
+// -----------------------------------------------------------------------------
+TBool CNSmlDmProvisioningAdapter::CanSetAsDefault(TInt /*aItem*/) const
+	{
+	return EFalse;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::SetAsDefaultL
+// -----------------------------------------------------------------------------
+void CNSmlDmProvisioningAdapter::SetAsDefaultL(TInt /*aItem*/ )
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::ItemCount
+// -----------------------------------------------------------------------------
+TInt CNSmlDmProvisioningAdapter::ItemCount() const
+	{
+	return iProfiles.Count();
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::SummaryTitle
+// -----------------------------------------------------------------------------
+const TDesC16& CNSmlDmProvisioningAdapter::SummaryTitle(TInt /*aIndex*/) const
+	{
+	return *iTitle;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::SummaryText
+// -----------------------------------------------------------------------------
+const TDesC16& CNSmlDmProvisioningAdapter::SummaryText(TInt aIndex) const
+	{
+	return *iProfiles[aIndex]->iDisplayName;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::SaveL
+// -----------------------------------------------------------------------------
+void CNSmlDmProvisioningAdapter::SaveL(TInt aItem)
+	{
+		_DBG_FILE("CNSmlDmProvisioningAdapter::SaveL(): begin");
+	TInt serverID = 0;
+	TInt hostAddress = 0;
+	TInt username = 0;
+
+	if(iProfiles[aItem]->iServerId && iProfiles[aItem]->iHostAddress && 
+	iProfiles[aItem]->iUsername)
+	{
+		TPtrC8 serverPtr = iProfiles[aItem]->iServerId->Des();
+		TPtrC hostAddressPtr = iProfiles[aItem]->iHostAddress->Des();
+		TPtrC8 usernamePtr = iProfiles[aItem]->iUsername->Des();		
+		serverID = serverPtr.Compare(KNSmlDMProvisioningNoVal);
+		hostAddress = hostAddressPtr.Compare(KNSmlDMProvisioningNoVal16);
+		username = usernamePtr.Compare(KNSmlDMProvisioningNoVal);
+	}
+	else
+	{
+		User::Leave(KErrGeneral);
+	}
+
+	if( ( serverID == 0 ) || ( hostAddress == 0 ) || ( username == 0 ))
+	{
+		User::Leave(KErrGeneral);
+	}
+	if (iAuthSecretLimitIndicator)
+	{
+		iAuthSecretLimitIndicator = 0;
+		User::Leave(KErrOverflow);
+	}
+
+	TPckgBuf<TUint32> uid;
+	
+	RSyncMLDevManProfile profile,ProfileToSearch;
+	RArray<TSmlProfileId> arr;
+  iSession.ListProfilesL( arr, ESmlDevMan );
+  TBool ret = EFalse;
+  TInt ProfileId = KErrNotFound;
+  CleanupClosePushL(arr);   	
+	for ( TInt index = 0; index < arr.Count(); index++ )
+		{
+	    TRAPD( error, ProfileToSearch.OpenL(iSession, arr[index], ESmlOpenRead ) );
+	    if ( error == KErrNone )
+	        {	            	            	        
+    	        if ( ( iProfiles[aItem]->iServerId->Des()).Compare(ProfileToSearch.ServerId() ) == 0 )
+    	            {
+    	            
+                    ret = ETrue;                    
+                    ProfileId = (TInt)arr[index];
+                    ProfileToSearch.Close();
+                    break;
+                    }	            		    
+	        }
+	      ProfileToSearch.Close();  
+		}
+    CleanupStack::PopAndDestroy( &arr );
+	
+	if( ret )
+		{
+		profile.OpenL(iSession, ProfileId , ESmlOpenReadWrite );	
+		TInt isprofilelocked=profile.ProfileLocked(EFalse, EFalse);
+		if (isprofilelocked == 1)
+		 {
+		  
+      profile.Close(); 
+      User::Leave(KErrAccessDenied); 	 	
+		 }
+		
+		}
+	else
+		{
+	profile.CreateL( iSession );
+		}
+	CleanupClosePushL( profile );
+	// ui needs this to be set 0
+	profile.SetCreatorId(0);
+	
+	profile.SetSanUserInteractionL( iProfiles[aItem]->iServerAlertedAction );
+	
+	if ( iProfiles[aItem]->iDisplayName )
+	    {	    
+	    profile.SetDisplayNameL( iProfiles[aItem]->iDisplayName->Des() );    
+	    }
+	
+	if ( iProfiles[aItem]->iServerId )
+	    {	    
+	    profile.SetServerIdL( iProfiles[aItem]->iServerId->Des() );    
+	    }
+	
+    if ( iProfiles[aItem]->iServerPassword )
+	    {	    
+	    profile.SetServerPasswordL( iProfiles[aItem]->iServerPassword->Des() );    
+	    }
+		        
+	if ( iProfiles[aItem]->iUsername )   
+	    {	    
+	    profile.SetUserNameL( iProfiles[aItem]->iUsername->Des() );    
+	    }
+	
+	if ( iProfiles[aItem]->iPassword )
+	    {	    
+	    profile.SetPasswordL( iProfiles[aItem]->iPassword->Des() );    
+	    }
+		    
+	// creates profile -> must be done before opening the connection
+	profile.UpdateL();
+	
+	RSyncMLConnection connection;
+	connection.OpenL( profile, KUidNSmlMediumTypeInternet.iUid );
+	CleanupClosePushL( connection );
+		
+	if( iProfiles[aItem]->iVisitParameter && iProfiles[aItem]->iVisitParameter->Data().Length() == uid.MaxLength() )
+		{
+		uid.Copy( iProfiles[aItem]->iVisitParameter->Data() );
+
+		CCommsDatabase* commDb = CCommsDatabase::NewL();
+		CleanupStack::PushL( commDb );
+		CApUtils* aputils = CApUtils::NewLC( *commDb );
+
+		TUint apId = 0;
+		TRAPD( ERROR, apId = aputils->IapIdFromWapIdL( uid() ) );
+		if( ERROR != KErrNone )
+			{
+			apId = GetDefaultIAPL();
+			}
+				
+		HBufC8* iapBuf = HBufC8::NewLC( 8 );
+		TPtr8 ptrBuf = iapBuf->Des();
+		ptrBuf.Num( apId );
+
+		connection.SetPropertyL( KNSmlIAPId, *iapBuf );
+		
+		CleanupStack::PopAndDestroy( 3 ); //commdb, aputils, iapBuf		
+		}
+		
+	if( iProfiles[aItem]->iHostAddress )
+		{
+		// see if address contains also port
+		TBool portFound = EFalse;
+		
+		TInt startPos(0);
+		if(iProfiles[aItem]->iHostAddress->Find(KNSmlDMProvisioningHTTP)==0)
+		    {
+		    startPos=KNSmlDMProvisioningHTTP().Length();		    		    
+		    }
+		else if(iProfiles[aItem]->iHostAddress->Find(KNSmlDMProvisioningHTTPS)==0)
+		    {
+		    startPos=KNSmlDMProvisioningHTTPS().Length();		    		    
+		    }
+		TPtrC uriPtr = iProfiles[aItem]->iHostAddress->Mid(startPos);
+		
+		if(uriPtr.Locate(KNSmlDMColon)!=KErrNotFound)
+		    {
+			portFound = ETrue;
+		    }
+	
+		if( portFound == EFalse )
+			{
+			HBufC *uri = 0;
+			// port not found from URI -> see if it is given separately				
+			if( iProfiles[aItem]->iPort )
+				{
+				// parse address and port into URI				
+				if( CombineURILC( iProfiles[aItem]->iHostAddress->Des(),
+							  iProfiles[aItem]->iPort->Des(), uri ) == KErrNone )
+					{
+					if(iProfiles[aItem]->iHostAddress)
+					{
+						delete iProfiles[aItem]->iHostAddress;
+						iProfiles[aItem]->iHostAddress = NULL;
+					}
+
+					iProfiles[aItem]->iHostAddress = uri->Des().AllocL();
+					}
+				CleanupStack::PopAndDestroy(); // uri		  
+				}
+			else
+				{
+				// use default port
+				if( CombineURILC( iProfiles[aItem]->iHostAddress->Des(),
+							  KNSmlDmDefaultPort(), uri ) == KErrNone )
+					{
+					if(iProfiles[aItem]->iHostAddress)
+					{
+						delete iProfiles[aItem]->iHostAddress;
+						iProfiles[aItem]->iHostAddress = NULL;
+					}
+
+					iProfiles[aItem]->iHostAddress = uri->Des().AllocL();
+					}
+				CleanupStack::PopAndDestroy(); // uri					
+				}
+			}
+		
+
+		connection.SetServerURIL( ConvertTo8LC( iProfiles[aItem]->iHostAddress->Des() ) );
+		CleanupStack::PopAndDestroy(); // ConvertTo8LC
+		}
+			
+	// set authtype, HTTPUserName, HTTPPassword
+	if( iProfiles[aItem]->iHTTPUserName ||
+	    iProfiles[aItem]->iHTTPPassword )
+		{
+		connection.SetPropertyL( KNSmlHTTPAuth, KNSmlTrueVal );
+		
+		if( iProfiles[aItem]->iHTTPUserName )
+			{
+			connection.SetPropertyL( KNSmlHTTPUsername, iProfiles[aItem]->iHTTPUserName->Des() );
+			}
+		if( iProfiles[aItem]->iHTTPPassword )
+			{
+			connection.SetPropertyL( KNSmlHTTPPassword, iProfiles[aItem]->iHTTPPassword->Des() );
+			}
+		}
+	else
+		{
+		connection.SetPropertyL( KNSmlHTTPAuth, KNSmlFalseVal );
+		}
+		
+	connection.UpdateL();
+	CleanupStack::PopAndDestroy(); //connection
+
+	profile.UpdateL();
+
+	if( iProfiles[aItem]->iServerNonce )
+		{
+		RNSmlPrivateAPI privateApi;
+		iProfiles[aItem]->iAuthInfo.iProfileId = profile.Identifier();		
+ 		iProfiles[aItem]->iAuthInfo.iServerNonce = ConvertTo8LC( iProfiles[aItem]->iServerNonce->Des() ).AllocL();
+ 		CleanupStack::PopAndDestroy(); //ConvertTo8LC 
+ 		iProfiles[aItem]->iAuthInfo.iClientNonce = KNullDesC8().AllocL();
+ 		
+ 		privateApi.OpenL();
+ 		CleanupClosePushL( privateApi );
+ 		TInt err( KErrNone );
+ 		TRAP(err, privateApi.SetDMAuthInfoL( iProfiles[aItem]->iAuthInfo ));
+ 		CleanupStack::PopAndDestroy(); // privateApi
+		}
+
+	iProfiles[aItem]->iProfileId = profile.Identifier(); 
+	if(iInitSession&(0x01<<(aItem+1)))
+	    {
+    	_DBG_FILE("CNSmlDmProvisioningAdapter::SaveL(): init session");
+	    TInt serverIdLen = profile.ServerId().Length();
+	    TInt staticPartLen = KNSmlDmStaticAlertMessagePart().Length();
+	    HBufC8* alertMessage = HBufC8::NewLC(staticPartLen+3+serverIdLen);
+	    TPtr8 alertPtr = alertMessage->Des();
+	    TPckgBuf<TUint8> sessionIdLo(1);
+	    TPckgBuf<TUint8> sessionIdHi(0);
+	    TPckgBuf<TUint8> serverIdLenBuf(serverIdLen);
+	    alertPtr.Append(KNSmlDmStaticAlertMessagePart);
+	    alertPtr.Append(sessionIdHi);
+	    alertPtr.Append(sessionIdLo);
+	    alertPtr.Append(serverIdLenBuf);
+	    alertPtr.Append(profile.ServerId());
+		DBG_ARGS8( alertMessage->Ptr());
+	    
+		RNSmlPrivateAPI privateApi;
+		privateApi.OpenL();
+		CleanupClosePushL(privateApi);
+		if(!FeatureManager::FeatureSupported( KFeatureIdSyncMlDm112  ))
+		{
+		privateApi.SendL( alertPtr, ESmlDevMan, ESmlVersion1_2 );	
+		}
+		else
+		{
+		privateApi.SendL( alertPtr, ESmlDevMan, ESmlVersion1_1_2 );	
+		}
+	    CleanupStack::PopAndDestroy(); //privateApi
+	    
+	    CleanupStack::PopAndDestroy(alertMessage);	    
+	    }
+
+	CleanupStack::PopAndDestroy( &profile );
+
+	_DBG_FILE("CNSmlDmProvisioningAdapter::SaveL(): end");
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::Reserved_1
+// -----------------------------------------------------------------------------
+TInt CNSmlDmProvisioningAdapter::Reserved_1()
+	{
+	return KErrNotSupported;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::Reserved_2
+// -----------------------------------------------------------------------------
+TInt CNSmlDmProvisioningAdapter::Reserved_2()
+	{
+	return KErrNotSupported;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::VisitL
+// -----------------------------------------------------------------------------
+void CNSmlDmProvisioningAdapter::VisitL( CWPCharacteristic& aCharacteristic )
+	{
+	_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPCharacteristic): begin");
+	if(aCharacteristic.Type() == KWPApplication)
+		{
+		iState = CNSmlDmProvisioningAdapter::EStateApplication;
+		}
+	else if(aCharacteristic.Type() == KWPAppAuth)
+		{
+		iAuthLevel = CNSmlDmProvisioningAdapter::ENone;
+		if(iState != CNSmlDmProvisioningAdapter::EStateDmSettings)
+			{
+			iState = CNSmlDmProvisioningAdapter::EStateNull;
+			}
+		}
+	else if(aCharacteristic.Type() == KWPAppAddr || aCharacteristic.Type() == KWPResource || aCharacteristic.Type() == KWPPort)
+		{
+		if(iState != CNSmlDmProvisioningAdapter::EStateDmSettings)
+			{
+			iState = CNSmlDmProvisioningAdapter::EStateNull;
+			}
+		}
+	else
+		{
+		iState = CNSmlDmProvisioningAdapter::EStateNull;
+		}
+
+	if(iState!=CNSmlDmProvisioningAdapter::EStateNull)
+		{
+		aCharacteristic.AcceptL( *this );
+		}
+	_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPCharacteristic): end");
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::VisitL
+// -----------------------------------------------------------------------------
+void CNSmlDmProvisioningAdapter::VisitL( CWPParameter& aParameter)
+	{
+	_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): begin");
+	
+	if( iState == CNSmlDmProvisioningAdapter::EStateApplication )
+		{
+		if( aParameter.ID() == EWPParameterAppID && aParameter.Value().Compare( KNSmlDMProvisioningDMAppIdVal ) == 0 )
+			{
+			iState = CNSmlDmProvisioningAdapter::EStateDmSettings;
+	
+			GetTitleL();
+
+			CNSmlDmProfileElement* dmProfileElement = new(ELeave) CNSmlDmProfileElement;
+			CleanupStack::PushL( dmProfileElement );
+			
+			dmProfileElement->iDisplayName = KNSmlDMProvisioningDefName().AllocL();			
+			dmProfileElement->iServerAlertedAction = ESmlConfirmSync;			
+			
+			dmProfileElement->iServerNonce = 0;
+			dmProfileElement->iVisitParameter = 0;			
+
+	 		dmProfileElement->iAuthInfo.iAuthPref = ENoAuth;
+
+			iProfiles.AppendL( dmProfileElement );
+			CleanupStack::Pop( dmProfileElement );
+			}
+		else
+			{
+			iState = CNSmlDmProvisioningAdapter::EStateNull;
+			}
+		}
+	else if( iState == CNSmlDmProvisioningAdapter::EStateDmSettings )
+		{
+		switch ( aParameter.ID() )
+			{
+			case EWPParameterName:
+			case EWPParameterName1: {
+				_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): Name");
+				DBG_ARGS( aParameter.Value().Ptr() );
+				
+				if ( iProfiles[iProfiles.Count()-1]->iDisplayName )
+				    {
+				    delete iProfiles[iProfiles.Count()-1]->iDisplayName;
+				    iProfiles[iProfiles.Count()-1]->iDisplayName = NULL;				        
+				    }
+				    
+				if(aParameter.Value().Length()>KNSmlDmMaxProfileNameLength)
+					{
+						TPtrC ptr2 = aParameter.Value().Left(KNSmlDmMaxProfileNameLength);
+						iProfiles[iProfiles.Count()-1]->iDisplayName = ptr2.AllocL();	
+					}
+				else
+				iProfiles[iProfiles.Count()-1]->iDisplayName = aParameter.Value().AllocL();								
+				/* parameter is NULL set to default value*/	    		
+	    		TInt num = iProfiles[iProfiles.Count()-1]->iDisplayName->Length();
+	    			
+				/*check for white spaces, If all characters are white spaces set to default*/
+				TPtr temp = iProfiles[iProfiles.Count()-1]->iDisplayName->Des();
+				TInt i;
+				for(i=0; i<num; i++)
+	    			{			
+	    				if(temp[i] != ' ')
+	    				break;
+	    			}
+			    TInt flag =0;					
+	    			
+    			if(i == num || num == 0 )
+    			  flag =1;
+    			
+    			if(flag)
+    			{
+    				if ( iProfiles[iProfiles.Count()-1]->iDisplayName )
+			    	{
+			    	delete iProfiles[iProfiles.Count()-1]->iDisplayName;
+			    	iProfiles[iProfiles.Count()-1]->iDisplayName = NULL;
+			    	}
+			    	iProfiles[iProfiles.Count()-1]->iDisplayName = KNSmlDMProvisioningDefName().AllocL();
+    			}
+				break;
+				}
+			case EWPParameterToProxy:	
+				_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): ToProxy");
+			case EWPParameterToNapID:
+			case EWPParameterToNapID1:
+				break;
+
+			case EWPParameterPortNbr:
+			case EWPParameterPortNbr1:
+				_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): PortNbr");
+				DBG_ARGS( aParameter.Value().Ptr() );
+				iProfiles[iProfiles.Count()-1]->iPort = aParameter.Value().AllocL();
+				break;
+
+			case EWPParameterAddr:
+				_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): Addr");
+				DBG_ARGS( aParameter.Value().Ptr() );
+				if(aParameter.Value().Length()<=KNSmlMaxURLLength)
+					{
+					iProfiles[iProfiles.Count()-1]->iHostAddress = aParameter.Value().AllocL();
+					}
+				break;
+
+			case EWPParameterAAuthLevel:
+				_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): AuthLevel");
+
+				if( aParameter.Value().Compare( KNSmlDMProvisioningServerAuth ) == 0 )
+					{
+					iAuthLevel = CNSmlDmProvisioningAdapter::EServer;
+					}
+				else if( aParameter.Value().Compare( KNSmlDMProvisioningClientAuth ) == 0 )
+					{
+					iAuthLevel = CNSmlDmProvisioningAdapter::EClient;
+					}
+				break;
+
+			case EWPParameterAAuthName:
+				_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): AuthName");
+				
+				if(aParameter.Value().Length()<=KNSmlDmMaxUsernameLength)
+				{
+				if(iAuthLevel == CNSmlDmProvisioningAdapter::EClient)
+					{
+					if ( iProfiles[iProfiles.Count()-1]->iServerId == NULL )
+					    {					    
+					    iProfiles[iProfiles.Count()-1]->iServerId = ConvertTo8LC( aParameter.Value() ).AllocL();
+						CleanupStack::PopAndDestroy(); // ConvertTo8LC
+					    }
+                    else if ( ( iProfiles[iProfiles.Count()-1]->iServerId->Compare( KNullDesC8() ) ) == 0 )
+						{
+						delete iProfiles[iProfiles.Count()-1]->iServerId;
+						iProfiles[iProfiles.Count()-1]->iServerId = NULL;
+						
+						iProfiles[iProfiles.Count()-1]->iServerId = ConvertTo8LC( aParameter.Value() ).AllocL();
+						CleanupStack::PopAndDestroy(); // ConvertTo8LC					    
+						}										
+					}
+					
+				else if( iAuthLevel == CNSmlDmProvisioningAdapter::EServer )
+					{
+					iProfiles[iProfiles.Count()-1]->iUsername = ConvertTo8LC( aParameter.Value() ).AllocL();					
+					CleanupStack::PopAndDestroy(); // ConvertTo8LC
+
+					if( iProfiles[iProfiles.Count()-1]->iAuthInfo.iAuthPref == ENoAuth )
+						{
+						iProfiles[iProfiles.Count()-1]->iAuthInfo.iAuthPref = EBasic;
+						}
+					}
+				else if (iAuthLevel == CNSmlDmProvisioningAdapter::EHttp)
+                    {
+			        iProfiles[iProfiles.Count()-1]->iHTTPUserName = ConvertTo8LC( aParameter.Value() ).AllocL();
+			        CleanupStack::PopAndDestroy(); //ConvertTo8LC
+			        }
+				}
+				break;
+
+			case EWPParameterAAuthSecret:
+				_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): AuthSecret");
+				if(aParameter.Value().Length()<=KNSmlDmMaxPasswordLength)
+				{
+				if( iAuthLevel == CNSmlDmProvisioningAdapter::EClient )
+					{
+					iProfiles[iProfiles.Count()-1]->iServerPassword = ConvertTo8LC( aParameter.Value() ).AllocL();					
+					CleanupStack::PopAndDestroy(); // ConvertTo8LC
+					}
+				else if ( iAuthLevel == CNSmlDmProvisioningAdapter::EServer )
+					{
+					iProfiles[iProfiles.Count()-1]->iPassword = ConvertTo8LC( aParameter.Value() ).AllocL();				
+					CleanupStack::PopAndDestroy(); // ConvertTo8LC
+					}
+				else if (iAuthLevel == CNSmlDmProvisioningAdapter::EHttp)
+                    {
+			        iProfiles[iProfiles.Count()-1]->iHTTPPassword = ConvertTo8LC( aParameter.Value() ).AllocL();
+			        CleanupStack::PopAndDestroy(); //ConvertTo8LC
+			        }
+				}
+				else
+				iAuthSecretLimitIndicator = 1;
+				break;
+
+			case EWPParameterAAuthData:
+				_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): AuthData");
+				if( iAuthLevel == CNSmlDmProvisioningAdapter::EServer )
+					{
+					iProfiles[iProfiles.Count()-1]->iAuthInfo.iAuthPref = EMD5;
+					iProfiles[iProfiles.Count()-1]->iServerNonce = aParameter.Value().AllocL();					
+					}
+				break;
+
+			case EWPParameterAAuthType:
+				_DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): AuthType");
+				DBG_ARGS( aParameter.Value().Ptr() );
+				if (( aParameter.Value().Compare( KNSmlDMProvisioningHTTPBasic ) == 0 ) ||
+					( aParameter.Value().Compare( KNSmlDMProvisioningHTTPDigest ) == 0 ))
+					{
+					_DBG_FILE("CNSmlDsProvisioningAdapter::VisitL(CWPParameter): HTTP");
+					iAuthLevel = CNSmlDmProvisioningAdapter::EHttp;
+					} 
+				break;
+				
+			case EWPParameterProviderID:
+				_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): ProviderId");
+				if(aParameter.Value().Length()<=KNSmlDmServerIdMaxLength)
+				{
+				iProfiles[iProfiles.Count()-1]->iServerId = ConvertTo8LC( aParameter.Value() ).AllocL();				
+				CleanupStack::PopAndDestroy(); // ConvertTo8LC
+				}
+				break;
+				
+			case EWPNamedParameter:
+   				_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): Named parameter");
+			    if(aParameter.Name().Compare(KNSmlDMProvisioningINIT)==0)
+			        {
+    				_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL(CWPParameter): Named parameter (INIT)");
+    				iInitSession= iInitSession|(0x01<<iProfiles.Count());
+			        }
+			    break;
+			default:
+				break;
+			}
+		}
+	
+	_DBG_FILE("CNSmlDmProvisioningAdapter::VisitL( CWPParameter ): end");
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::VisitLinkL
+// -----------------------------------------------------------------------------
+void CNSmlDmProvisioningAdapter::VisitLinkL( CWPCharacteristic& aParameter)
+	{
+	_DBG_FILE("CNSmlDmProvisioningAdapter::VisitLinkL(): begin");
+	
+	if( ( ( aParameter.Type()==KWPNapDef ) || ( aParameter.Type()==KWPPxLogical ) ) &&
+		( iState == CNSmlDmProvisioningAdapter::EStateDmSettings ) )
+		{
+		if( iProfiles.Count() > 0 )
+			{
+			iProfiles[iProfiles.Count()-1]->iVisitParameter = &aParameter;
+			}
+		}
+	_DBG_FILE("CNSmlDmProvisioningAdapter::VisitLinkL(): end");
+	}
+
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::ContextExtension
+// -----------------------------------------------------------------------------
+TInt CNSmlDmProvisioningAdapter::ContextExtension( MWPContextExtension*& aContextExtension )
+	{
+	_DBG_FILE("CNSmlDmProvisioningAdapter::ContextExtension(): begin");
+	aContextExtension = this;
+	_DBG_FILE("CNSmlDmProvisioningAdapter::ContextExtension(): end");
+	return KErrNone;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::SaveDataL
+// -----------------------------------------------------------------------------
+const TDesC8& CNSmlDmProvisioningAdapter::SaveDataL( TInt aIndex ) const
+	{
+	return iProfiles[aIndex]->iProfileId;
+	}
+
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::DeleteL
+// -----------------------------------------------------------------------------
+void CNSmlDmProvisioningAdapter::DeleteL( const TDesC8& aSaveData)
+	{
+	_DBG_FILE("CNSmlDmProvisioningAdapter::DeleteL(): begin");
+	TPckgBuf<TInt> uid;
+	uid.Copy( aSaveData );
+	iSession.DeleteProfileL( uid() );
+	_DBG_FILE("CNSmlDmProvisioningAdapter::DeleteL(): end");
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::Uid
+// -----------------------------------------------------------------------------
+TUint32 CNSmlDmProvisioningAdapter::Uid() const
+	{
+	_DBG_FILE("CNSmlDmProvisioningAdapter::Uid(): begin");
+	return KNSmlDmProvisioningAdapterImplUid;
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::DetailsL( )
+// -----------------------------------------------------------------------------
+TInt CNSmlDmProvisioningAdapter::DetailsL( TInt /*aItem*/, MWPPairVisitor& /*aVisitor*/ )
+	{
+	return KErrNotSupported;
+	}
+
+// -------------------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::GetDefaultIAPL()
+// Get the default NAPId 
+// -------------------------------------------------------------------------------------
+TInt CNSmlDmProvisioningAdapter::GetDefaultIAPL()
+	{
+	TInt iapId = KErrNotFound; 
+
+	CCommsDatabase* database = CCommsDatabase::NewL();
+	CleanupStack::PushL( database );
+
+	CCommsDbTableView* tableView = database->OpenTableLC( TPtrC( IAP ) );
+
+	TInt errorCode = tableView->GotoFirstRecord();
+		
+	if ( errorCode == KErrNone ) 
+		{
+		TUint32	value;
+		tableView->ReadUintL( TPtrC( COMMDB_ID ), value );
+		iapId = value;
+		}
+
+	CleanupStack::PopAndDestroy( 2 ); // database, tableView
+
+	return iapId;
+	}
+
+// ---------------------------------------------------------
+// CNSmlDmProvisioningAdapter::GetTitleL
+// ---------------------------------------------------------
+void CNSmlDmProvisioningAdapter::GetTitleL()
+	{
+	if( iTitle == 0 )
+		{
+		RFs	fs;
+		User::LeaveIfError( fs.Connect() );
+		CleanupClosePushL( fs );
+
+		TFileName fileName;
+		TParse parse;
+		parse.Set( KNSmlDmPovisioningDirAndResource, &KDC_RESOURCE_FILES_DIR, NULL );
+		fileName = parse.FullName();
+
+		RResourceFile resourceFile; 
+		BaflUtils::NearestLanguageFile( fs, fileName );
+		resourceFile.OpenL( fs, fileName );
+		CleanupClosePushL( resourceFile );
+
+		HBufC8* dataBuffer = resourceFile.AllocReadLC( R_SYNCMLDM_PROVISIONING_TITLE );
+
+		TResourceReader reader; 
+		reader.SetBuffer( dataBuffer ); 
+		iTitle = reader.ReadHBufC16L(); 
+		CleanupStack::PopAndDestroy( 3 ); //fs, resourcefile, databuffer
+		}
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDmProvisioningAdapter::CombineURILC()
+// Combines address and port to URI 
+// ------------------------------------------------------------------------------------------------
+TInt CNSmlDmProvisioningAdapter::CombineURILC( const TDesC& aAddr, const TDesC& aPort, HBufC*& aRealURI )
+	{
+	TInt offset = 0;
+	TInt i = 0;
+	if( aAddr.Find( KNSmlDMProvisioningHTTP ) == 0 )
+		{
+		offset = KNSmlDMProvisioningHTTP().Length();
+		}
+	else if( aAddr.Find( KNSmlDMProvisioningHTTPS ) == 0 )
+		{
+		offset = KNSmlDMProvisioningHTTPS().Length();
+		}
+		
+	// after skipping double slashes seek next single slash
+	for( i = offset; i < aAddr.Length(); i++ )
+	    {
+	    if ( aAddr[i] == KNSmlDMUriSeparator )
+	        {
+	        break;
+	        }
+	    }
+	
+	aRealURI = HBufC::NewLC( aAddr.Length() + aPort.Length() + 1 );
+	TPtr uriPtr = aRealURI->Des();
+
+	uriPtr.Copy( aAddr.Ptr(), i );
+	uriPtr.Append( KNSmlDMColon );
+	uriPtr.Append( aPort );
+	uriPtr.Append( aAddr.Right( aAddr.Length() - i ) );
+		
+	return KErrNone;
+	}
+// ---------------------------------------------------------
+//		CNSmlDmProvisioningAdapter::ConvertTo8LC()
+//		Converts string value to 8-bit
+// ---------------------------------------------------------
+TDesC8& CNSmlDmProvisioningAdapter::ConvertTo8LC( const TDesC& aSource )
+	{
+	HBufC8* buf = HBufC8::NewLC( aSource.Length()*2 );
+	TPtr8 bufPtr = buf->Des();
+	CnvUtfConverter::ConvertFromUnicodeToUtf8( bufPtr, aSource );
+
+    return *buf;
+	}
+	
+// ---------------------------------------------------------
+//		CNSmlDmProvisioningAdapter::ConvertTo8L()
+//		Converts string value to 8-bit
+// ---------------------------------------------------------
+TDesC8& CNSmlDmProvisioningAdapter::ConvertTo8L( const TDesC& aSource )
+	{
+	HBufC8* buf = HBufC8::NewL( aSource.Length()*2 );
+	TPtr8 bufPtr = buf->Des();
+	CnvUtfConverter::ConvertFromUnicodeToUtf8( bufPtr, aSource );
+
+    return *buf;
+	}
+
+
+//  End of File