syncmlfw/ds/settings/src/NSmlDSSettings.cpp
changeset 0 b497e44ab2fc
child 9 57a65a3a658c
child 22 19fb38abab1d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/ds/settings/src/NSmlDSSettings.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,884 @@
+/*
+* 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:  DS-settings 
+*
+*/
+
+
+#include <NSmlDSProfileRes.rsg>
+
+#include <nsmlconstants.h>
+#include <nsmldsconstants.h>
+#include "nsmldssettings.h"
+#include "NSmlDSResourceProfile.h"
+#include "barsc.h"
+#include "bautils.h"
+#include "nsmlroam.h"
+//XML profiles
+#include "RXMLReader.h"
+#include "NSmlProfileContentHandler.h"
+#include <centralrepository.h> //CRepository
+
+_LIT(Kinfile,"z:\\Private\\101F99FB\\VariantData.xml");
+
+
+//=============================================
+//
+//		CNSmlDSSettings
+//
+//=============================================
+
+//=============================================
+//		CNSmlDSSettings::NewL()
+//		Creates a new instance of CNSmlDSSettings object.
+//=============================================
+
+EXPORT_C CNSmlDSSettings* CNSmlDSSettings::NewL()
+	{
+	CNSmlDSSettings* self = CNSmlDSSettings::NewLC();
+	CleanupStack::Pop();
+	return self;
+	}	
+
+//=============================================
+//		CNSmlDSSettings::NewLC()
+//		Creates a new instance of CNSmlDSSettings object. 
+//		Pushes and leaves new instance into CleanupStack.
+//		Opens/creates settings database.
+//=============================================
+
+EXPORT_C CNSmlDSSettings* CNSmlDSSettings::NewLC()
+	{
+
+	CNSmlDSSettings* self = new( ELeave ) CNSmlDSSettings;
+	CleanupStack::PushL( self );
+	self->ConstructL();
+
+	User::LeaveIfError( self->iFsSession.Connect() );
+	User::LeaveIfError( self->iRdbSession.Connect() );	
+	
+   TParse name;
+    
+#ifdef SYMBIAN_SECURE_DBMS
+	name.Set( KNSmlSettingsDbName(), NULL, NULL );
+#else
+    name.Set( KNSmlSettingsDbName(), KNSmlDatabasesNonSecurePath, NULL );
+#endif
+
+	TInt err = self->iDatabase.Open( self->iRdbSession,
+	                                 name.FullName(),
+	                                 KNSmlDBMSSecureSOSServerID );
+	
+	if ( err == KErrNotFound )
+		{
+		self->CreateDatabaseL( name.FullName() );
+		self->iDatabase.Open( self->iRdbSession,
+		                      name.FullName(),
+		                      KNSmlDBMSSecureSOSServerID );
+		User::LeaveIfError( self->iTableProfiles.Open( self->iDatabase, KNSmlTableProfiles ) );
+		self->iColSet = self->iTableProfiles.ColSetL();
+		}
+	else
+		{
+		if ( (err == KErrEof) || (err == KErrCorrupt) ||
+		     (err == KErrArgument) || (err == KErrNotSupported) )
+			{
+			self->iRdbSession.DeleteDatabase( name.FullName(),
+			                                  KNSmlSOSServerPolicyUID );
+			}
+		User::LeaveIfError( err );
+	User::LeaveIfError( self->iTableProfiles.Open( self->iDatabase, KNSmlTableProfiles ) );
+	self->iColSet = self->iTableProfiles.ColSetL();
+		}
+	return self;
+	}
+
+//=============================================
+//		CNSmlDSSettings::ConstructL()
+//	    2nd phase constructor
+//=============================================
+void CNSmlDSSettings::ConstructL()
+	{
+	iResourceProfileArray = new (ELeave) CArrayPtrFlat<CNSmlDSProfile> (5);
+	}
+
+
+//=============================================
+//		CNSmlDSSettings::~CNSmlDSSettings()
+//		Destructor.
+//=============================================
+
+CNSmlDSSettings::~CNSmlDSSettings()
+	{
+	if(iResourceProfileArray)
+		{
+		iResourceProfileArray->ResetAndDestroy();
+		}
+	delete iResourceProfileArray;
+	
+	iView.Close();
+	delete iColSet;
+	iTableProfiles.Close();
+	iDatabase.Close();
+	iFsSession.Close();
+	iRdbSession.Close();
+	}
+
+//=============================================
+//		CNSmlDSSettings::CreateDatabaseL()
+//		Creates settings database.
+//=============================================
+
+void CNSmlDSSettings::CreateDatabaseL(const TDesC& aFullName)
+	{
+	// 50 is the extra length neede for integer lengths
+	HBufC* createProfileTable = HBufC::NewLC( KDSCreateProfilesTable().Length() + 50);
+	TPtr profileTablePtr = createProfileTable->Des();
+
+	profileTablePtr.Format(KDSCreateProfilesTable,KNSmlMaxProfileNameLength,KNSmlMaxUsernameLength,KNSmlMaxPasswordLength,KNSmlMaxURLLength,KNSmlMaxServerIdLength,KNSmlMaxHttpAuthUsernameLength,KNSmlMaxHttpAuthPasswordLength, KNSmlDSVisibilityArraySize );
+
+	// 25 is the extra length neede for integer lengths
+	HBufC* createAdaptersTable = HBufC::NewLC( KDSCreateAdaptersTable().Length() + 25);
+	TPtr adaptersTablePtr = createAdaptersTable->Des();
+	adaptersTablePtr.Format(KDSCreateAdaptersTable,KNSmlMaxAdapterDisplayNameLength,KNSmlMaxRemoteNameLength, KNSmlMaxLocalNameLength );
+
+    User::LeaveIfError( iDatabase.Create( this->iRdbSession, aFullName, KNSmlDBMSSecureSOSServerID ) );  
+	
+	iDatabase.Begin();
+
+	iDatabase.Execute( *createProfileTable );
+	iDatabase.Execute( *createAdaptersTable );
+
+	CDbColSet* colSet = CDbColSet::NewLC();
+	colSet->AddL(TDbCol(KNSmlVersionColumnMajor(), EDbColUint16));
+	colSet->AddL(TDbCol(KNSmlVersionColumnMinor(), EDbColUint16));
+	User::LeaveIfError(iDatabase.CreateTable(KNSmlTableVersion(), *colSet));
+	CleanupStack::PopAndDestroy(  ); //colset
+
+	RDbTable table;
+	User::LeaveIfError(table.Open(iDatabase, KNSmlTableVersion()));
+	CleanupClosePushL(table);
+	colSet = table.ColSetL();
+	CleanupStack::PushL(colSet);
+	table.InsertL();
+	table.SetColL(colSet->ColNo(KNSmlVersionColumnMajor), KNSmlSettingsCurrentVersionMajor);
+	table.SetColL(colSet->ColNo(KNSmlVersionColumnMinor), KNSmlSettingsCurrentVersionMinor);
+	table.PutL();
+	
+	iDatabase.Commit();
+	
+	CreateHiddenProfilesL();
+
+	TInt keyVal;
+	TRAPD (err ,ReadRepositoryL(KNsmlDsCustomProfiles, keyVal));
+	if (err == KErrNone && keyVal)
+	{
+		TBool aRestore = EFalse;
+		CreateXMLProfilesL(aRestore);
+	}
+	iDatabase.Close();
+	CleanupStack::PopAndDestroy( 4 ); // createAdaptersTable, createProfileTable, colSet, table
+	}
+	
+//=============================================
+//		CNSmlDSSettings::CreateHiddenProfilesL()
+//		Create new profiles reading data from
+//		resource file
+//=============================================
+
+void CNSmlDSSettings::CreateHiddenProfilesL()
+	{
+	TFileName fileName;
+	Dll::FileName( fileName );
+	TParse parse;
+
+	parse.Set( KNSmlDSProfilesRsc, &fileName, NULL );
+	fileName = parse.FullName();
+
+	RResourceFile resourceFile; 
+	BaflUtils::NearestLanguageFile( iFsSession, fileName );
+
+	TRAPD(leavecode,resourceFile.OpenL( iFsSession,fileName));
+	if(leavecode != 0)
+		{
+		return;
+		}
+	CleanupClosePushL(resourceFile);
+	
+	HBufC8* profileRes = resourceFile.AllocReadLC( NSML_DS_PROFILES );
+	TResourceReader reader;
+	reader.SetBuffer( profileRes );
+
+	CNSmlDSResourceProfiles* profileResReader = CNSmlDSResourceProfiles::NewLC( reader, this );
+	profileResReader->SaveProfilesL(iResourceProfileArray);
+	CleanupStack::PopAndDestroy(3); // profileResReader, profileRes, resourceFile
+	}
+	
+	
+//===============================================
+//		CNSmlDSSettings::CreateXMLProfiles()
+//		
+//		
+//===============================================	
+void CNSmlDSSettings::CreateXMLProfilesL(TBool aRestore)
+	{
+	
+	TBool status = TRUE;
+	TInt error = KErrNone;
+		
+	//file server
+	RFs wSession;
+	error = wSession.Connect();
+	if (error != KErrNone)
+	{
+	return;
+	}
+	
+	RXMLReader DSProfileParser;
+	DSProfileParser.CreateL();
+	CArrayPtrFlat<CNSmlDSProfile>* customProfileArray = new (ELeave) CArrayPtrFlat<CNSmlDSProfile> (5);
+	CleanupStack::PushL(customProfileArray);
+	
+	CNSmlProfileContentHandler* cb = CNSmlProfileContentHandler::NewL(this ,customProfileArray);
+	CleanupStack::PushL(cb);
+
+	DSProfileParser.SetContentHandler(cb);
+
+	DSProfileParser.SetFeature(EXMLValidation, ETrue);
+	DSProfileParser.SetFeature(EXMLValidation, EFalse);
+	DSProfileParser.GetFeature(EXMLBinary, status);
+	DSProfileParser.GetFeature(EXMLValidation, status);
+
+	status = TRUE;
+
+	RFile wFile;
+	TInt err =wFile.Open(wSession, Kinfile, EFileRead | EFileShareReadersOnly); 
+	if (err != KErrNone)
+	{
+		CleanupStack::PopAndDestroy(2);	
+		return;	
+	}
+	
+	CleanupClosePushL(wFile);
+	//parse file
+	TRAP(error, DSProfileParser.ParseL(wFile));
+	if (error != KErrNone)
+	{
+	CleanupStack::PopAndDestroy(3);	
+	return;
+	}
+	TInt index;
+	TBuf<150> buf;
+    
+    if(aRestore)
+    {
+    //handling back up-restore for custom profiles
+    CNSmlDSProfileList* profList = new (ELeave) CArrayPtrFlat<CNSmlDSProfileListItem>(1);
+	CleanupStack::PushL(profList);
+    GetAllProfileListL( profList );
+    for( TInt i = 0 ; i < profList->Count() ; i++ )
+     {
+     	TInt id = profList->At(i)->IntValue( EDSProfileId );
+     	CNSmlDSProfile* prof = ProfileL(id);
+     	CleanupStack::PushL( prof );
+     	buf = prof->StrValue(EDSProfileServerId);
+     	
+     	if (buf.Compare(KEmpty) != 0)
+     	{
+     		for (index = 0; index < customProfileArray->Count(); index++ )
+     		{
+     		if (buf.Compare(customProfileArray->At(index)->StrValue(EDSProfileServerId)) == 0)
+     			{
+     			DeleteProfileL(id);
+     			}
+     		}	
+     	}
+     	
+     	else
+     	{
+     		buf = prof->StrValue(EDSProfileServerURL);
+     		for (index = 0; index < customProfileArray->Count(); index++ )
+     		{
+     		if (buf.Compare(customProfileArray->At(index)->StrValue(EDSProfileServerURL)) == 0)
+     			{
+     			DeleteProfileL(id);
+     			}
+     		}	
+     	}
+       	CleanupStack::PopAndDestroy(); // prof
+     }
+    
+    profList->ResetAndDestroy();
+    CleanupStack::PopAndDestroy();
+    }
+    
+    //save profiles
+    TBool defaultprofilefound = EFalse;
+    //Set the ProfileID to default
+    WriteRepositoryL( KCRUidDSDefaultProfileInternalKeys, KNsmlDsDefaultProfile, -1 );
+	for ( index = 0; index < customProfileArray->Count(); index++ )
+		{
+		if (CheckXMLProfileSettings(customProfileArray ,index))
+			{
+			customProfileArray->At(index)->SaveL();
+			if(!defaultprofilefound && customProfileArray->At(index)->IntValue(EDSProfileDefaultProfile))
+			    {
+			    //Set the ProfileID to be used as a Default Profile
+			    WriteRepositoryL( KCRUidDSDefaultProfileInternalKeys, KNsmlDsDefaultProfile, 
+			                      customProfileArray->At(index)->IntValue(EDSProfileId) );
+			    defaultprofilefound = ETrue;
+			    }		
+			}
+		}
+		
+	CleanupStack::PopAndDestroy(); // wFile
+	CleanupStack::PopAndDestroy(); // cb
+	
+	customProfileArray->ResetAndDestroy();
+	CleanupStack::PopAndDestroy(); //customProfileArray
+	
+	
+	}
+
+//===============================================
+//		CNSmlDSSettings::CheckXMLProfileSettings()
+//		
+//		
+//===============================================	
+TBool CNSmlDSSettings::CheckXMLProfileSettings(CNSmlProfileArray* aProfileArray,TInt aIndex)
+	{
+	
+	const TInt KMaxXMLProfileCount = 5;
+	TBuf<160> buf;
+	TInt count = aProfileArray->Count();
+	//max count
+	if (count > KMaxXMLProfileCount)
+		{
+		return EFalse;
+		}
+	
+	//mandatory settings
+	if (aProfileArray->At(aIndex)->StrValue(EDSProfileDisplayName).Compare(KEmpty) == 0
+		||aProfileArray->At(aIndex)->StrValue(EDSProfileServerURL).Compare(KEmpty) == 0
+		)
+		{
+		return EFalse;
+		}
+	
+	//Unique Server Id	
+	buf = aProfileArray->At(aIndex)->StrValue(EDSProfileServerId);
+	if (buf.Compare(KEmpty) != 0)
+		{
+	   	for(TInt i = 0 ; i < iResourceProfileArray->Count() ; i++ )
+	   	    {
+	   		if (iResourceProfileArray->At(i)->StrValue(EDSProfileServerId)
+     						.Compare(buf) == 0)
+     			{
+     	 		return EFalse;	
+     			}
+	   	    }
+     	}
+    
+    if(buf.Compare(KEmpty) != 0)
+		{
+		for (TInt i = 0; i < count ;i++)
+			{
+			if (buf.Compare(aProfileArray->At(i)->StrValue(EDSProfileServerId)) == 0
+					&& i < aIndex)
+					{
+					return EFalse;
+					}
+			}
+		}
+    
+	return ETrue; 
+	}
+
+// -----------------------------------------------------------------------------
+// CNSmlDSSettings::ReadRepositoryL
+//
+// -----------------------------------------------------------------------------
+//
+void CNSmlDSSettings::ReadRepositoryL(TInt aKey, TInt& aValue)
+	{
+	const TUid KRepositoryId = KCRUidDataSyncInternalKeys;
+	
+    CRepository* rep = CRepository::NewLC(KRepositoryId);
+    TInt err = rep->Get(aKey, aValue);
+	User::LeaveIfError(err);
+	CleanupStack::PopAndDestroy(rep);
+    
+	}	
+// -----------------------------------------------------------------------------
+// CNSmlDSSettings::WriteRepositoryL
+//
+// -----------------------------------------------------------------------------
+//
+void CNSmlDSSettings::WriteRepositoryL(TUid aUid, TInt aKey, TInt aValue)
+    {
+    const TUid KRepositoryId = aUid;
+    
+    CRepository* rep = CRepository::NewLC(KRepositoryId);
+    TInt err = rep->Set(aKey, aValue);
+    User::LeaveIfError(err);
+    CleanupStack::PopAndDestroy(rep);
+    
+    }
+//===============================================
+//		CNSmlDSSettings::UpdateHiddenProfilesL()
+//		Updates the profiles with data from 
+//		resource file
+//===============================================
+EXPORT_C void CNSmlDSSettings::UpdateHiddenProfilesL()
+{
+	 
+	CNSmlDSProfileList* profList = new (ELeave) CArrayPtrFlat<CNSmlDSProfileListItem>(1);
+	CleanupStack::PushL(profList);
+    GetAllProfileListL( profList );
+    for( TInt i = 0 ; i < profList->Count() ; i++ )
+    {
+       	TInt id = profList->At(i)->IntValue( EDSProfileId );
+     	CNSmlDSProfile* prof = ProfileL(id);
+     	CleanupStack::PushL( prof );
+     	if(!prof->IntValue(EDSProfileDeleteAllowed))
+     	{
+     		
+     		DeleteProfileL(id);
+     	}
+     	CleanupStack::PopAndDestroy(); // prof
+    }
+     
+    profList->ResetAndDestroy();
+    CleanupStack::PopAndDestroy();
+     
+    CreateHiddenProfilesL();
+     
+    TInt keyVal;
+	TRAPD (err ,ReadRepositoryL(KNsmlDsCustomProfiles, keyVal));
+	if (err == KErrNone && keyVal)
+	{
+	    TInt aRestore = ETrue;
+    	CreateXMLProfilesL(aRestore);
+	}
+}
+//=============================================
+//		CNSmlDSSettings::CreateProfileL()
+//		Returns a pointer to newly created CNSmlDSProfile object.
+//=============================================
+
+EXPORT_C CNSmlDSProfile* CNSmlDSSettings::CreateProfileL()
+	{
+	CNSmlDSProfile* profile = CNSmlDSProfile::NewL( this->Database() );
+
+	profile->SetIntValue( EDSProfileId,					KNSmlNewObject );
+	profile->SetIntValue( EDSProfileTransportId,		KUidNSmlMediumTypeInternet.iUid );
+	profile->SetIntValue( EDSProfileHidden,				EFalse);
+	profile->SetIntValue( EDSProfileDeleteAllowed,		ETrue);
+
+	profile->SetIntValue( EDSProfileServerAlertedAction,ESmlConfirmSync);
+
+	profile->SetIntValue( EDSProfileIAPId,				-2 );
+
+	profile->SetIntValue( EDSProfileHttpAuthUsed,		EFalse);
+	profile->SetIntValue( EDSProfileAutoChangeIAP,		EFalse);
+	
+	profile->SetIntValue( EDSProfileProtocolVersion, 	ESmlVersion1_2 );
+
+	profile->InitVisibilityArray(KNSmlDefaultVisibility);
+
+    return profile;
+	}
+
+//=============================================
+//		CNSmlDSSettings::CreateProfileL()
+//		Copies all profile data with given Id to
+//		a newly created CNSmlDSProfile object.
+//=============================================
+
+EXPORT_C CNSmlDSProfile* CNSmlDSSettings::CreateProfileL( const TInt aId  )
+	{
+	CNSmlDSProfile* profile = ProfileOnlyL( aId);
+	CleanupStack::PushL( profile );
+	if ( profile )
+		{
+		profile->SetIntValue( EDSProfileId,		KNSmlNewObject );
+
+		CNSmlDSProfile* copyProfile = ProfileL( aId);
+		CleanupStack::PushL(copyProfile);
+		if(!copyProfile)
+			{
+			profile = 0;
+			return profile;
+			}
+
+		for ( TInt i = 0; i < copyProfile->iContentTypes->Count(); i++ )
+			{
+			TInt uid = copyProfile->iContentTypes->At( i )->IntValue(EDSAdapterImplementationId);
+			TDesC clientDataSource = copyProfile->iContentTypes->At( i )->StrValue( EDSAdapterClientDataSource );
+			TDesC serverDataSource = copyProfile->iContentTypes->At( i )->StrValue( EDSAdapterServerDataSource );
+			profile->AddContentTypeL( uid, clientDataSource, serverDataSource );
+			CNSmlDSContentType* content = profile->ContentType( uid );
+			content->SetIntValue( EDSAdapterEnabled, copyProfile->iContentTypes->At( i )->IntValue(EDSAdapterEnabled) );
+			content->SetStrValue( EDSAdapterDisplayName, copyProfile->iContentTypes->At( i )->StrValue(EDSAdapterDisplayName) );
+			content->SetIntValue( EDSAdapterSyncType, copyProfile->iContentTypes->At( i )->IntValue(EDSAdapterSyncType) );
+			content->SetIntValue( EDSAdapterFilterMatchType, copyProfile->iContentTypes->At( i )->IntValue(EDSAdapterFilterMatchType) );
+			}
+
+		CleanupStack::PopAndDestroy(); // copyProfile
+		}
+	CleanupStack::Pop(); //profile
+	return profile;
+	}
+
+//=============================================
+//		CNSmlDSSettings::Database()
+//		Returns a reference to settings database object.
+//=============================================
+	
+EXPORT_C RDbNamedDatabase* CNSmlDSSettings::Database()
+	{
+	return &iDatabase;
+	}
+
+//=============================================
+//		CNSmlDSSettings::ProfileIdL()
+//		Returns Profile ID with given AdapterId.
+//		If there's no corresponding Id returns 0.
+//=============================================
+
+EXPORT_C TInt CNSmlDSSettings::ProfileIdL( TInt aId)
+	{
+	TInt profileId = 0;
+
+	HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetProfileId().Length() + KNSmlDsSettingsMaxIntegerLength);
+	TPtr sqlStatementPtr = sqlStatement->Des();
+
+	sqlStatementPtr.Format( KDSSQLGetProfileId, aId );
+
+	PrepareViewL( sqlStatementPtr, iView.EReadOnly );
+	
+	CleanupStack::PopAndDestroy(); // sqlStatement
+
+	if( iView.FirstL() )
+		{
+		iView.GetL();
+
+		profileId =  ViewColUint( KNSmlDSProfileId );
+		}
+	else
+		{
+		//couldn't find
+		profileId = KErrNotFound;
+		}
+
+	return profileId;
+	}
+
+//=============================================
+//		CNSmlDSSettings::ProfileL()
+//		Returns a pointer to CNSmlDSProfile object with given Id.
+//		If there's no corresponding Id in the database, returns NULL.
+//=============================================
+
+EXPORT_C CNSmlDSProfile* CNSmlDSSettings::ProfileL( TInt aId, const TNSmlDSContentTypeGetMode aMode)
+	{
+	HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetProfile().Length() + KNSmlDsSettingsMaxIntegerLength);
+	TPtr sqlStatementPtr = sqlStatement->Des();
+
+	sqlStatementPtr.Format( KDSSQLGetProfile, aId );
+
+	PrepareViewL( sqlStatementPtr, iView.EReadOnly );
+	
+	CleanupStack::PopAndDestroy(); // sqlStatement
+	
+	CNSmlDSProfile* profile = CNSmlDSProfile::NewLC( Database() );
+
+	if( iView.FirstL() )
+		{
+		CNSmlDSCrypt* crypt = new(ELeave) CNSmlDSCrypt;
+		CleanupStack::PushL(crypt);
+		iView.GetL();
+
+		profile->SetIntValue( EDSProfileId, ViewColUint( KNSmlDSProfileId ) );
+		profile->SetStrValue( EDSProfileDisplayName, ViewColDes( KNSmlDSProfileDisplayName ) );
+		profile->SetIntValue( EDSProfileIAPId, ViewColInt( KNSmlDSProfileIAPId ) );
+		profile->SetIntValue( EDSProfileTransportId, ViewColInt( ( KNSmlDSProfileTransportId ) ) );
+		profile->SetStrValue( EDSProfileServerURL, ViewColDes( KNSmlDSProfileServerURL ) );
+		profile->SetStrValue( EDSProfileServerId, ViewColDes( KNSmlDSProfileServerId ) );
+
+		profile->SetStrValue( EDSProfileSyncServerUsername, ViewColDes( KNSmlDSProfileSyncServerUsername ) );
+		profile->SetStrValue( EDSProfileSyncServerPassword,  crypt->DecryptedL(ViewColDes( KNSmlDSProfileSyncServerPassword ) ) );
+		
+		profile->SetIntValue( EDSProfileServerAlertedAction, ViewColInt( KNSmlDSProfileServerAlertedAction ) );
+		profile->SetIntValue( EDSProfileDeleteAllowed, ViewColInt( KNSmlDSProfileDeleteAllowed ) );
+		profile->SetIntValue( EDSProfileHidden, ViewColInt( KNSmlDSProfileHidden ) );
+
+		profile->SetIntValue( EDSProfileHttpAuthUsed, ViewColInt( KNSmlDSProfileHttpAuthUsed ) );
+		profile->SetStrValue( EDSProfileHttpAuthUsername, ViewColDes( KNSmlDSProfileHttpAuthUsername ) );
+		profile->SetStrValue( EDSProfileHttpAuthPassword,  crypt->DecryptedL(ViewColDes( KNSmlDSProfileHttpAuthPassword ) ) );
+		profile->SetIntValue( EDSProfileAutoChangeIAP, ViewColInt( KNSmlDSProfileAutoChangeIAP ) );
+		profile->SetIntValue( EDSProfileCreatorId, ViewColInt( KNSmlDSProfileCreatorID ) );
+		
+		profile->InitVisibilityArray( ViewColDes( KNSmlDSProfileVisibilityStr ) );
+
+		profile->SetIntValue( EDSProfileProtocolVersion, ViewColInt( KNSmlDSProfileProtocolVersion ) );
+
+		CleanupStack::PopAndDestroy(); // crypt
+		}
+	else
+		{
+		delete profile;
+		//couldn't find
+		profile = NULL;
+		}
+//
+//  Get adapters in profile
+//
+	if ( profile )
+		{
+		profile->GetContentTypesL( aMode );
+		}
+
+	CleanupStack::Pop(); // profile
+
+	return profile;
+	}
+
+//=============================================
+//		CNSmlDSSettings::ProfileOnlyL()
+//		Returns a pointer to CNSmlDSProfile object with given Id.
+//		If there's no corresponding Id in the database, returns NULL.
+//=============================================
+
+CNSmlDSProfile* CNSmlDSSettings::ProfileOnlyL( TInt aId )
+	{
+	HBufC* sqlStatement = HBufC::NewLC( KDSSQLGetProfile().Length() + KNSmlDsSettingsMaxIntegerLength);
+	TPtr sqlStatementPtr = sqlStatement->Des();
+
+	sqlStatementPtr.Format( KDSSQLGetProfile, aId );
+
+	PrepareViewL( sqlStatementPtr, iView.EReadOnly );
+	
+	CleanupStack::PopAndDestroy(); // sqlStatement
+	
+	CNSmlDSProfile* profile = CNSmlDSProfile::NewLC( Database() );
+
+	if( iView.FirstL() )
+		{
+		CNSmlDSCrypt* crypt = new(ELeave) CNSmlDSCrypt;
+		CleanupStack::PushL(crypt);
+		iView.GetL();
+
+		profile->SetIntValue( EDSProfileId, ViewColUint( KNSmlDSProfileId ) );
+		profile->SetStrValue( EDSProfileDisplayName, ViewColDes( KNSmlDSProfileDisplayName ) );
+		profile->SetIntValue( EDSProfileIAPId, ViewColInt( KNSmlDSProfileIAPId ) );
+		profile->SetIntValue( EDSProfileTransportId, ViewColInt( KNSmlDSProfileTransportId ) );
+		profile->SetStrValue( EDSProfileServerURL, ViewColDes( KNSmlDSProfileServerURL ) );
+		profile->SetStrValue( EDSProfileServerId, ViewColDes( KNSmlDSProfileServerId ) );
+
+		profile->SetStrValue( EDSProfileSyncServerUsername, ViewColDes( KNSmlDSProfileSyncServerUsername ) );
+		profile->SetStrValue( EDSProfileSyncServerPassword,  crypt->DecryptedL(ViewColDes( KNSmlDSProfileSyncServerPassword ) ) );
+		
+		profile->SetIntValue( EDSProfileServerAlertedAction, ViewColInt( KNSmlDSProfileServerAlertedAction ) );
+		profile->SetIntValue( EDSProfileDeleteAllowed,  ViewColInt( KNSmlDSProfileDeleteAllowed ) );
+		profile->SetIntValue( EDSProfileHidden,  ViewColInt( KNSmlDSProfileHidden ) );
+
+		profile->SetIntValue( EDSProfileHttpAuthUsed, ViewColInt( KNSmlDSProfileHttpAuthUsed ) );
+		profile->SetStrValue( EDSProfileHttpAuthUsername, ViewColDes( KNSmlDSProfileHttpAuthUsername ) );
+		profile->SetStrValue( EDSProfileHttpAuthPassword,  crypt->DecryptedL(ViewColDes( KNSmlDSProfileHttpAuthPassword ) ) );
+		profile->SetIntValue( EDSProfileAutoChangeIAP, ViewColInt( KNSmlDSProfileAutoChangeIAP ) );
+		profile->SetIntValue( EDSProfileCreatorId, ViewColInt( KNSmlDSProfileCreatorID ) );
+
+		profile->InitVisibilityArray( ViewColDes( KNSmlDSProfileVisibilityStr ) );
+
+		profile->SetIntValue( EDSProfileProtocolVersion, ViewColInt( KNSmlDSProfileProtocolVersion ) );
+
+		CleanupStack::PopAndDestroy(); // crypt
+		CleanupStack::Pop(); // profile
+		}
+	else
+		{
+		CleanupStack::PopAndDestroy(profile);
+		//couldn't find
+		profile = NULL;
+		}
+
+	return profile;
+	}
+//=============================================
+//		CNSmlDSSettings::GetProfileListL()
+//		Appends CNSmlDSProfileListItem objects to aProfileList.
+//=============================================
+
+EXPORT_C void CNSmlDSSettings::GetProfileListL( CNSmlDSProfileList* aProfileList )
+	{
+	aProfileList->ResetAndDestroy();
+
+	PrepareViewL( KDSSQLGetProfiles, iView.EUpdatable );
+	
+	if(iView.Unevaluated())
+		{
+		iView.EvaluateAll(); // Needed for order by
+		}	
+	
+	while ( iView.NextL() )
+		{
+		AddToProfileListL( aProfileList );
+		}
+
+	}
+
+//=============================================
+//		CNSmlDSSettings::GetaAllProfileListL()
+//		Appends CNSmlDSProfileListItem objects to aProfileList.
+//=============================================
+
+EXPORT_C void CNSmlDSSettings::GetAllProfileListL( CNSmlDSProfileList* aProfileList )
+	{
+	aProfileList->ResetAndDestroy();
+
+	PrepareViewL( KDSSQLGetAllProfiles, iView.EUpdatable );
+	
+	if(iView.Unevaluated())
+		{
+		iView.EvaluateAll(); // Needed for order by
+		}
+		
+	while ( iView.NextL() )
+		{
+		AddToProfileListL( aProfileList );
+		}
+	}
+
+//=============================================
+//		CNSmlDSSettings::DeleteProfileL()
+//		Permanently deletes profile with given Id.
+//		If delete is successful returns KErrNone,
+//		otherwise returns negative integer 
+//      (defined in EPOC error codes).
+//=============================================
+
+EXPORT_C TInt CNSmlDSSettings::DeleteProfileL( TInt aId )
+	{
+	if ( iDatabase.InTransaction() )
+		{
+		return ( KErrAccessDenied );
+		}
+
+	TBuf<64> sqlStatement;
+	
+	TInt err( KErrNone );
+
+	iDatabase.Begin();
+
+	sqlStatement.Format( KDSSQLDeleteProfile, aId );
+	err = iDatabase.Execute( sqlStatement );
+	if ( err < KErrNone )
+		{
+		iDatabase.Rollback();
+		return err;
+		}
+
+	sqlStatement.Format( KDSSQLDeleteAdapter, aId );
+	err = iDatabase.Execute( sqlStatement );
+	if ( err < KErrNone )
+		{
+		iDatabase.Rollback();
+		return err;
+		}
+
+	// Delete IAP Id's from RoamTable
+	CNSmlRoamTable* roamTable = CNSmlRoamTable::NewL( iDatabase );
+	CleanupStack::PushL( roamTable );
+	TRAPD( errRoam, roamTable->RemoveAllByIdL( aId ) );
+	if ( errRoam < KErrNone ) 
+		{
+		CleanupStack::PopAndDestroy(); // roamTable
+		iDatabase.Rollback();
+		return errRoam;
+		}
+	CleanupStack::PopAndDestroy(); // roamTable
+
+	CommitAndCompact();
+
+	return KErrNone;
+	}
+
+//=============================================
+//		CNSmlDSSettings::PrepareViewL()
+//		Closes and prepares the view
+//		
+//=============================================
+void CNSmlDSSettings::PrepareViewL( const TDesC& aSql, RDbRowSet::TAccess aAccess )
+	{
+	iView.Close();
+	User::LeaveIfError( iView.Prepare( iDatabase, TDbQuery( aSql ), aAccess ) );
+	}
+
+//=============================================
+//		CNSmlDSSettings::CommitAndCompact
+//		Commits update and compacts the database
+//		
+//=============================================
+void CNSmlDSSettings::CommitAndCompact() 
+	{
+	iDatabase.Commit();
+	iDatabase.Compact();
+	}
+
+//=============================================
+//		CNSmlDSSettings::AddToProfileListL
+//		Adds database field to profile list
+//		
+//=============================================
+void CNSmlDSSettings::AddToProfileListL( CNSmlDSProfileList* aProfileList )
+	{
+	iView.GetL();
+
+	aProfileList->AppendL( CNSmlDSProfileListItem::NewLC( iView.ColUint( iColSet->ColNo( KNSmlDSProfileId ) ) ) );
+	CleanupStack::Pop();
+	}
+
+//=============================================
+//		CNSmlDSSettings::ViewColDes
+//	
+//		
+//=============================================
+TPtrC CNSmlDSSettings::ViewColDes( const TDesC& aFieldName )
+	{
+	return iView.ColDes( iColSet->ColNo( aFieldName ) );
+	}
+
+//=============================================
+//		CNSmlDSSettings::ViewColInt
+//	
+//		
+//=============================================
+TInt CNSmlDSSettings::ViewColInt( const TDesC& aFieldName )
+	{
+	return iView.ColInt( iColSet->ColNo( aFieldName ) );
+	}
+
+//=============================================
+//		CNSmlDSSettings::ViewColUint
+//	
+//		
+//=============================================
+TUint CNSmlDSSettings::ViewColUint( const TDesC& aFieldName )
+	{
+	return iView.ColUint( iColSet->ColNo( aFieldName ) );
+	}
+
+
+//  End of File